Revision: v2.2.1
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 13:33:44 +0300
changeset 35 85266cc22c7f
parent 26 dc7c549001d5
child 40 c6043ea9b06a
child 44 0105bdca6f9c
child 47 f40128debb5d
child 49 35baca0e7a2e
Revision: v2.2.1 Kit: 2010123
build/Makefile.comp
build/Makefile.project
build/Makefile.subsystem
build/bld.inf
build/buildutils/checkcopyrights.py
build/buildutils/checkfilenames.py
build/buildutils/checkjavapackages.py
build/exports.inf
build/makefile.javaversion
build/sis/java_2_0.pkg
build/sis/java_3_1.pkg
build/sis/java_rnd_tools.pkg
build/symbian_uids.pri
inc/build_defines.hrh
inc/build_defines.pri
inc/java.txt
inc/java_s60_release.hrh
inc/project_defines.hrh
javacommons/comms/ipclib/clientserver/src.s60/commssession.cpp
javacommons/comms/ipclib/clientserver/src.s60/creceiver.cpp
javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java
javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp
javacommons/gcfprotocols/socket/socket/inc/apnsettings.h
javacommons/gcfprotocols/socket/socket/src.s60/apnsettings.cpp
javacommons/jvms/cldc_1.1.1/javasrc/java/util/Timer.java
javacommons/jvms/cldc_1.1.1/javasrc/java/util/TimerTask.java
javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTaskTest.java
javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTest.java
javacommons/jvms/j9/exports.inf
javacommons/jvms/j9/j9.pro
javacommons/security/build/exports.inf
javacommons/security/conf/CI_javasecurity.confml
javacommons/security/data/att_manufacturer.txt
javacommons/security/data/att_operator.txt
javacommons/security/data/att_operatorextra.txt
javacommons/security/data/msa_manufacturer.txt
javacommons/security/data/msa_operator.txt
javacommons/security/data/msa_trustedthirdparty.txt
javacommons/security/data/s60_manufacturer.txt
javacommons/security/data/s60_operator.txt
javacommons/security/data/s60_trustedthirdparty.txt
javacommons/security/inc/securitystoragedatadefs.h
javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java
javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java
javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java
javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java
javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java
javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java
javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java
javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.cpp
javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.h
javacommons/security/tsrc/data/policies/test_manufacturer.txt
javacommons/security/tsrc/data/policies/test_operator.txt
javacommons/security/tsrc/data/policies/test_operatorextra.txt
javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt
javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java
javacommons/utils/inc/javaoslayer.h
javacommons/utils/src.s60/javaoslayer.cpp
javacommons/utils/src.s60/s60commonutils.cpp
javaextensions/sensor/src.s60/cacceleratorsensor.cpp
javaextensions/wma/mms/pushplugin/build/eabi/javammsscpluginu.def
javaextensions/wma/mms/pushplugin/src.s60/s60mmsserverconnection.cpp
javaextensions/wma/sms_cbs/pushplugin/cbs/build/eabi/javacbsscpluginu.def
javaextensions/wma/sms_cbs/pushplugin/cbs/src.s60/cbsserverconnection.cpp
javaextensions/wma/sms_cbs/pushplugin/sms/build/eabi/javasmsscpluginu.def
javaextensions/wma/sms_cbs/pushplugin/sms/src.s60/smsserverconnection.cpp
javamanager/javacaptain/extensionplugins/autostarter/build/bwins/javacaptain_ext_autostarteru.def
javamanager/javacaptain/extensionplugins/autostarter/build/eabi/javacaptain_ext_autostarteru.def
javamanager/javacaptain/extensionplugins/autostarter/build/javacaptain_ext_autostarter.pro
javamanager/javacaptain/extensionplugins/autostarter/inc/autostarter.h
javamanager/javacaptain/extensionplugins/autostarter/src.s60/autostarter.cpp
javamanager/javacaptain/extensionplugins/autostarter/src.s60/lookup.cpp
javamanager/javacaptain/extensionplugins/config/src/configextensionplugin.cpp
javamanager/javacaptain/extensionplugins/preinstallerstarter/build/exports.inf
javamanager/javacaptain/extensionplugins/preinstallerstarter/inc/preinstallerstarter.h
javamanager/javacaptain/extensionplugins/preinstallerstarter/inc/preinstallerstartermessages.h
javamanager/javacaptain/extensionplugins/preinstallerstarter/src.s60/preinstallerstarter.cpp
javamanager/javacaptain/javacaptain.pro
javamanager/javacaptain/subsystem.mk
javamanager/javainstaller/appinstuiplugin/src/javainstalllauncher.cpp
javamanager/javainstaller/installer/build/exports.inf
javamanager/javainstaller/installer/build/javainstaller.pro
javamanager/javainstaller/installer/conf/CI_javainstaller.confml
javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifNotifier.java
javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifRegistrator.java
javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/utils/SysUtil.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/InstallationNotifier.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/Installer.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/DlListener.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/FinalizeInstallation.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/HandleCustomAttributes.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/OcspListener.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/RegisterApplicationToSif.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/StartProgressNotifications.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/uninstall/steps/StartProgressNotifications.java
javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/storagehandler/SuiteInfo.java
javamanager/javainstaller/installer/src.s60/applicationregistrator/applicationregistrator.cpp
javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp
javamanager/javainstaller/installer/src.s60/applicationregistrator/sifregistrator.cpp
javamanager/javainstaller/installer/src.s60/utils/filewriter.cpp
javamanager/javainstaller/installer/src.s60/utils/sysutil.cpp
javamanager/javainstaller/installer/tsrc/build/jiut.bat
javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/InstallerEngineTest.java
javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/ApplicationRegistratorTest.java
javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/SifRegistratorTest.java
javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/utils/SysUtilTest.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallConfirmationView.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiEswt.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiTexts.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/LaunchAppQueryView.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/PermissionConfirmationView.java
javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/ViewBase.java
javamanager/javainstaller/javainstaller.pro
javamanager/javainstaller/javasifplugin/build/javasifplugin.mmp
javamanager/javainstaller/javasifplugin/inc/javasifplugin.h
javamanager/javainstaller/javasifplugin/src/javasifplugin.cpp
javamanager/javainstaller/javasifplugin/src/proxy.cpp
javamanager/javainstaller/javasifplugin/src/resultsserver.cpp
javamanager/javainstaller/subsystem.mk
javamanager/javalauncher/src.s60/javalauncher.cpp
javamanager/javalauncher/tsrc/testmidletstart/build/testmidletstart.pkg
javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.cpp
javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.h
javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.cpp
javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.h
javamanager/javasidchecker/build/javasidchecker.mmp
javamanager/javasidchecker/src/javasidchecker.cpp
javamanager/javaupgradeapp/build/javaupgradeapp.pro
javamanager/javaupgradeapp/sis/java_upgradeapp.pkg
javamanager/javaupgradeapp/src.s60/javaupgradeapp.cpp
javamanager/preinstaller/src.s60/main.cpp
javaruntimes/installer/starterdll/src/main.cpp
javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java
javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/utils/CmdLineArgsPermission.java
javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java
javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp
javaruntimes/starterutils/src.s60/j9starters60.cpp
javatools/javacaptain_app/build/bld.inf
javatools/javacaptain_app/build/javacaptainapp.mmp
javatools/javacaptain_app/src.s60/javacap.cpp
javatools/javacaptain_app/src.s60/javacap.h
javatools/javacaptain_app/src.s60/javacap.hrh
javatools/javacaptain_app/src.s60/javacap.rss
javatools/javacaptain_app/src.s60/javacap_reg.rss
javatools/javacontrolpanel/controlpanel/build/build.xml
javatools/javacontrolpanel/controlpanel/build/bwins/javacontrolpanelu.def
javatools/javacontrolpanel/controlpanel/build/eabi/javacontrolpanelu.def
javatools/javacontrolpanel/controlpanel/build/javacontrolpanel.pro
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaCaptain.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaControlPanel.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaControlPanelUi.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/Redirector.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/SecurityConfig.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/rt/javacontrolpanel/ApplicationInfoImpl.java
javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/rt/javacontrolpanel/ApplicationUtilsImpl.java
javatools/javacontrolpanel/controlpanel/src.s60/logredirector.cpp
javatools/javacontrolpanel/controlpanel/src.s60/logredirector.h
javatools/javacontrolpanel/controlpanel/src.s60/security.cpp
javatools/javacontrolpanel/controlpanel/src.s60/security.h
javatools/javacontrolpanel/controlpanel/src/javacaptain.cpp
javatools/javacontrolpanel/controlpanel/src/redirector.cpp
javatools/javacontrolpanel/controlpanel/src/securityconfig.cpp
javatools/javacontrolpanel/starter/build/javacontrolpanel.pro
javatools/javacontrolpanel/starter/data/javacontrolpanel_reg.rss
javatools/javacontrolpanel/starter/src/main.cpp
javatools/javatools.pro
javatools/subsystem.mk
javauis/eswt_qt/build/build.pro
javauis/eswt_qt/build/build.xml
javauis/eswt_qt/build/bwins/eswtqtu.def
javauis/eswt_qt/build/eabi/eswtqtu.def
javauis/eswt_qt/build/eswtqt.pro
javauis/eswt_qt/build/eswtqt/build.xml
javauis/eswt_qt/build/eswtqt/bwins/eswtqtu.def
javauis/eswt_qt/build/eswtqt/eabi/eswtqtu.def
javauis/eswt_qt/build/eswtqt/eswtqt.pro
javauis/eswt_qt/build/eswtqtwebkit/build.xml
javauis/eswt_qt/build/eswtqtwebkit/bwins/eswtqtwebkitu.def
javauis/eswt_qt/build/eswtqtwebkit/eabi/eswtqtwebkitu.def
javauis/eswt_qt/build/eswtqtwebkit/eswtqtwebkit.pro
javauis/eswt_qt/build/subsystem.mk
javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/ApplicationUI.java
javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/ApplicationUIListener.java
javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/InternalUI.java
javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/NetworkStatus.java
javauis/eswt_qt/com.nokia.swt.extensions/midp/org/eclipse/ercp/swt/midp/UIThreadSupport.java
javauis/eswt_qt/com.nokia.swt.extensions/midp_common/org/eclipse/ercp/swt/midp/UIThreadSupport.java
javauis/eswt_qt/com.nokia.swt.extensions/midp_symbian/org/eclipse/ercp/swt/midp/UIThreadSupport.java
javauis/eswt_qt/eswtuitestutils/.classpath
javauis/eswt_qt/eswtuitestutils/.project
javauis/eswt_qt/eswtuitestutils/build/build.xml
javauis/eswt_qt/eswtuitestutils/build/bwins/eswtuitestutilsu.def
javauis/eswt_qt/eswtuitestutils/build/eabi/eswtuitestutilsu.def
javauis/eswt_qt/eswtuitestutils/build/eswtuitestutils.pro
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/ImageTestUtils.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Key.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/KeyFactory.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Mask.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Matrix.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Modifier.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Point.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Rect.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/RuntimeUtils.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/S60Utils.java
javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/UITestUtils.java
javauis/eswt_qt/eswtuitestutils/src/eswtuitestutils.pri
javauis/eswt_qt/eswtuitestutils/src/s60utils.cpp
javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/.project
javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/Makefile
javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/build.xml
javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.xml
javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.xml
javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/.project
javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/build.xml
javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/.project
javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/build.xml
javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/.project
javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/build.properties
javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/build.xml
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT Browser/qt/org/eclipse/swt/browser/QtWebKit.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Resource.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/CaptionedControl.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/Command.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ConstrainedText.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/DateEditor.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListBox.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListView.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MultiPageDialog.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/SortedList.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/TextExtension.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Color.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Device.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Font.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/GC.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Image.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Button.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Combo.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Composite.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Control.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Decorations.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Display.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Link.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/List.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Menu.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/MenuItem.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/ScrollBar.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Scrollable.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Slider.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Table.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TableItem.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Text.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tray.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TrayItem.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tree.java
javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Widget.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/linux/org/eclipse/swt/internal/qt/midp/UIThreadLauncher.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/linux/org/eclipse/swt/internal/qt/s60/S60CommandPresentationStrategy.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eswt_widgets.pri
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eventcallback.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/gfxos.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.pri
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphicsfactory.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_linux.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_linux.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_symbian.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_symbian.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/listdatamodel.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/os.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.pro
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swterror.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtexport.h
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtmobiledevice.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swts60.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/eswt_webkit.pri
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/os.cpp
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/swt.pro
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/graphics/Internal_GfxPackageSupport.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/ApplicationUIListener.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/BaseCSSEngine.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/CommandArranger.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/OS.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/UIThreadManager.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/GraphicsContext.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/OS.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/Utils.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/widgets/Internal_PackageSupport.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/eswt.odc
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/org/eclipse/swt/internal/qt/midp/UIThreadLauncher.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/org/eclipse/swt/internal/qt/s60/OS.java
javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/webkit/org/eclipse/swt/internal/qt/webkit/OS_webkit.java
javauis/eswt_qt/s60utils/.project
javauis/eswt_qt/s60utils/bwins/s60uitestutilsu.def
javauis/eswt_qt/s60utils/exports.inf
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/ImageTestUtils.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Key.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/KeyFactory.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Mask.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Matrix.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Modifier.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Point.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Rect.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/RuntimeUtils.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/S60Utils.java
javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/UITestUtils.java
javauis/eswt_qt/s60utils/native/native.pro
javauis/eswt_qt/s60utils/native/s60utils.cpp
javauis/eswt_qt/subsystem.mk
javauis/eswt_qt/ui_mts_sis/Makefile
javauis/eswt_qt/ui_mts_sis/java_3_1.pkg
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/ImageTestUtils.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Key.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/KeyFactory.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Mask.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Matrix.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Modifier.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Point.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Rect.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/RuntimeUtils.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/UITestUtils.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibKeys.java
javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibUtils.java
javauis/eswt_qt/xlibutils/native/os.cpp
javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java
javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitObserverNGAExtension.java
javauis/javauis.pro
javauis/lcdui_qt/src/com/nokia/mj/impl/nokialcdui/LCDUIInvoker.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBuffer.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBufferLinux.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBufferSymbian.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItem.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBuffer.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBufferLinux.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBufferSymbian.java
javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemLayouter.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Font.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Form.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Graphics.java
javauis/lcdui_qt/src/javax/microedition/lcdui/Image.java
javauis/lcdui_qt/src/javax/microedition/lcdui/ImageBuffer.java
javauis/lcdui_qt/src/javax/microedition/lcdui/LCDUIInvokerImpl.java
javauis/lcdui_qt/src/javax/microedition/lcdui/List.java
javauis/lcdui_qt/src/javax/microedition/lcdui/StringItem.java
javauis/lcdui_qt/src/javax/microedition/lcdui/TextFieldLayouter.java
javauis/lcdui_qt/src/javax/microedition/lcdui/TextWrapper.java
javauis/lcdui_qt/tsrc/.classpath
javauis/lcdui_qt/tsrc/build/build.xml
javauis/lcdui_qt/tsrc/build/bwins/openlcduitestsu.def
javauis/lcdui_qt/tsrc/build/eabi/openlcduitestsu.def
javauis/lcdui_qt/tsrc/build/openlcduitests.pro
javauis/lcdui_qt/tsrc/junit-3.8.1.1.odc
javauis/m3g_qt/build/build.xml
javauis/m3g_qt/build/bwins/javam3gu.def
javauis/m3g_qt/build/eabi/javam3gu.def
javauis/m3g_qt/build/javam3g.pro
javauis/m3g_qt/inc/CSynchronization.h
javauis/m3g_qt/inc/m3g_jsr184.h
javauis/m3g_qt/javasrc/com/dummy.txt
javauis/m3g_qt/javasrc/javax/microedition/m3g/AnimationController.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/AnimationTrack.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Appearance.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Background.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Camera.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/CompositingMode.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Defs.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Fog.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Graphics3D.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Group.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Image2D.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/IndexBuffer.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Interface.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/KeyframeSequence.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Light.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Loader.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/M3gRunnable.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Material.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Mesh.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/MorphingMesh.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Node.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Object3D.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Platform.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/PolygonMode.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/RayIntersection.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/SkinnedMesh.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Sprite3D.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Texture2D.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Transform.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/Transformable.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/TriangleStripArray.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/VertexArray.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/VertexBuffer.java
javauis/m3g_qt/javasrc/javax/microedition/m3g/World.java
javauis/m3g_qt/src/CSynchronization.cpp
javauis/m3g_qt/src/jni/animationController.inl
javauis/m3g_qt/src/jni/animationTrack.inl
javauis/m3g_qt/src/jni/appearance.inl
javauis/m3g_qt/src/jni/background.inl
javauis/m3g_qt/src/jni/camera.inl
javauis/m3g_qt/src/jni/compositingMode.inl
javauis/m3g_qt/src/jni/fog.inl
javauis/m3g_qt/src/jni/graphics3d.inl
javauis/m3g_qt/src/jni/group.inl
javauis/m3g_qt/src/jni/image2d.inl
javauis/m3g_qt/src/jni/interface.inl
javauis/m3g_qt/src/jni/keyframeSequence.inl
javauis/m3g_qt/src/jni/light.inl
javauis/m3g_qt/src/jni/loader.inl
javauis/m3g_qt/src/jni/material.inl
javauis/m3g_qt/src/jni/mesh.inl
javauis/m3g_qt/src/jni/morphingMesh.inl
javauis/m3g_qt/src/jni/node.inl
javauis/m3g_qt/src/jni/object3d.inl
javauis/m3g_qt/src/jni/platform.inl
javauis/m3g_qt/src/jni/polygonMode.inl
javauis/m3g_qt/src/jni/skinnedMesh.inl
javauis/m3g_qt/src/jni/sprite3d.inl
javauis/m3g_qt/src/jni/texture2d.inl
javauis/m3g_qt/src/jni/transform.inl
javauis/m3g_qt/src/jni/transformable.inl
javauis/m3g_qt/src/jni/triangleStripArray.inl
javauis/m3g_qt/src/jni/vertexArray.inl
javauis/m3g_qt/src/jni/vertexBuffer.inl
javauis/m3g_qt/src/jni/world.inl
javauis/m3g_qt/src/m3g_jsr184.inl
javauis/m3g_qt/src/m3g_kvm_api.inl
javauis/m3g_qt/src/m3g_symbian_java_api.cpp
javauis/mmapi_qt/baseline/javasrc.emc/com/nokia/microedition/media/ManagerImpl.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayer.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayerFactory.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/FramePositioningControl.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/RateControl.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/StopTimeControl.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoControl.java
javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoItem.java
javauis/mmapi_qt/baseline/src/cmmacameraplayer.cpp
javauis/mmapi_qt/src_drmv2/src/cmmadrmplayerfactory.cpp
javauis/nokiasound/build/build.xml
javauis/nokiasound/build/bwins/javanokiasoundu.def
javauis/nokiasound/build/eabi/javanokiasoundu.def
javauis/nokiasound/build/javanokiasound.pro
javauis/nokiasound/inc/CMIDClip.h
javauis/nokiasound/inc/CMIDSound.h
javauis/nokiasound/inc/CMIDSoundEvent.h
javauis/nokiasound/inc/CMIDSoundImpl.h
javauis/nokiasound/inc/CMIDTone.h
javauis/nokiasound/inc/MMIDEventSender.h
javauis/nokiasound/javasrc/com/nokia/mid/sound/Sound.java
javauis/nokiasound/javasrc/com/nokia/mid/sound/SoundListener.java
javauis/nokiasound/src/CMIDSoundImpl.cpp
javauis/nokiasound/src/cmidclip.cpp
javauis/nokiasound/src/cmidsound.cpp
javauis/nokiasound/src/cmidtone.cpp
javauis/nokiasound/src/sound.cpp
javauis/subsystem.mk
javauis/subsystem_akn.mk
javauis/subsystem_qt.mk
javauis/tsrc/fute/lcdui/Midp_Form_01/build.xml
javauis/tsrc/fute/lcdui/Midp_Form_01/src/FormMethodsTests.java
javauis/tsrc/fute/lcdui/Midp_General/build.xml
javauis/tsrc/fute/lcdui/Midp_General/res/small.png
javauis/tsrc/fute/lcdui/Midp_General/src/EmptyForm.java
javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_01.java
javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_02.java
javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_03.java
javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_04.java
javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_05.java
javauis/tsrc/fute/lcdui/Midp_General_02/build.xml
javauis/tsrc/fute/lcdui/Midp_General_02/src/Midp_General_02.java
javauis/tsrc/fute/lcdui/Midp_General_04/build.xml
javauis/tsrc/fute/lcdui/Midp_General_04/src/Midp_General_04.java
javauis/tsrc/fute/lcdui/Midp_General_05/build.xml
javauis/tsrc/fute/lcdui/Midp_General_05/src/Midp_General_05.java
rom/java_2_1.iby
rom/java_3_1.iby
rom/javacontrolpanelodclist
rom/javacontrolpanelodclist30
rom/javatest.iby
rom/midpodclist30
--- a/build/Makefile.comp	Thu May 27 12:49:31 2010 +0300
+++ b/build/Makefile.comp	Fri Jun 11 13:33:44 2010 +0300
@@ -179,11 +179,11 @@
 
 build_native:
 	$(PHASEINFO)
-	$(SBS) -c $(PLATFORM)_$(CFG) BUILD
+	$(SBS) -c $(PLATFORM)_$(CFG)
 
-fastbuild: export java
+fastbuild: java
 	$(PHASEINFO)
-	$(SBS) -c $(PLATFORM)_$(CFG) TARGET
+	$(SBS) -c $(PLATFORM)_$(CFG)
 
 build_clean_native:
 	$(PHASEINFO)
--- a/build/Makefile.project	Thu May 27 12:49:31 2010 +0300
+++ b/build/Makefile.project	Fri Jun 11 13:33:44 2010 +0300
@@ -180,7 +180,7 @@
   # Following flag enables application notifications to AppArc.
   PROJECT_DEFINES += RD_JAVA_USIF_NOTIFY_APP_ARC
   # Following flag enables installation progress notifications through USIF.
-  #PROJECT_DEFINES += RD_JAVA_USIF_NOTIFY_PROGRESS
+  PROJECT_DEFINES += RD_JAVA_USIF_NOTIFY_PROGRESS
 endif
 
 # Java proximity Listener support exsist in 9.2 only(can not be used if 5.0 untill IAD dependecy mentioned)
--- a/build/Makefile.subsystem	Thu May 27 12:49:31 2010 +0300
+++ b/build/Makefile.subsystem	Fri Jun 11 13:33:44 2010 +0300
@@ -206,7 +206,7 @@
 	$(SBS) -c $(PLATFORM)_$(CFG)
 
 fastbuild: export java
-	$(SBS) -c $(PLATFORM)_$(CFG) TARGET
+	$(SBS) -c $(PLATFORM)_$(CFG)
 
 clean_native:
 	$(PHASEINFO)
--- a/build/bld.inf	Thu May 27 12:49:31 2010 +0300
+++ b/build/bld.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -42,6 +42,10 @@
 ../rom/tckrunnerodclist30 /epoc32/release/winscw/urel/z/resource/java/tckrunnerodclist
 ../rom/tckrunnerodclist30 /epoc32/data/z/resource/java/tckrunnerodclist
 
+../rom/javacontrolpanelodclist30 /epoc32/release/winscw/udeb/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist30 /epoc32/release/winscw/urel/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist30 /epoc32/data/z/resource/java/javacontrolpanelodclist
+
 ../rom/javalocalization_3_1.iby        LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(javalocalization.iby)
 
 #else // RD_JAVA_UI_QT
@@ -61,6 +65,10 @@
 ../rom/tckrunnerodclist /epoc32/release/winscw/urel/z/resource/java/tckrunnerodclist
 ../rom/tckrunnerodclist /epoc32/data/z/resource/java/tckrunnerodclist
 
+../rom/javacontrolpanelodclist /epoc32/release/winscw/udeb/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist /epoc32/release/winscw/urel/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist /epoc32/data/z/resource/java/javacontrolpanelodclist
+
 ../rom/javalocalization_2_1.iby        LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(javalocalization.iby)
 
 #endif // RD_JAVA_UI_QT
--- a/build/buildutils/checkcopyrights.py	Thu May 27 12:49:31 2010 +0300
+++ b/build/buildutils/checkcopyrights.py	Fri Jun 11 13:33:44 2010 +0300
@@ -13,48 +13,54 @@
 # Contributors:
 #
 # Description:
-#   Checks that all the source files have a proper copyright header. 
+#   Checks that all the source files have a proper EPL copyright header.
 #   Ignores number of known 3rd party source files and directories.
 #
-#    Run this script on a clean workarea in order to avoid warnings
-#    about exported files and qmake generated files.
+#   Run this script on a clean workarea in order to avoid warnings
+#   about exported files and qmake generated files.
 #
-#    The excluded directories should be checked every now and then
-#    so that there won't be other problems (like files without any
-#    header).
+#   The excluded directories should be checked every now and then
+#   so that there won't be other problems (like files without any header).
 
 import sys, os, re
 
 # Specify here the file types to be checked
 checkedFileTypes = [".cpp", ".h", ".java", ".py", ".mk"]
 
-# Include here the directories to be ignored
-ignoredDirectories = [
-    "javaextensions\\bluetooth\\bluecove",  # Bluecove
-    "javacommons\\jvms\\j9\\s60\\inc",      # IBM J9
-    "javauis\\eswt_akn",                    # eSWT checked separately
-    "javauis\\eswt_qt",                     # eSWT checked separately
-    "javauis\\tsrc\\fute\\eswt\\",          # eSWT checked separately
-    "javaextensions\\webservices",          # Webservices not delivered
-    "jrt\\tools",                           # Tools not delivered
-    "\\internal"                            # Internal directories not delivered
-    ]
 
-# Include here any individual files to be ignored
-ignoredFiles = [
-    "javacommons\\jvms\\cldc_1.1.1\\javasrc\\java\\util\\Timer.java",       # Apache license
-    "javacommons\\jvms\\cldc_1.1.1\\javasrc\\java\\util\\TimerTask.java",   # Apache license
-    "javacommons\\jvms\\cldc_1.1.1\\tsrc\\javasrc\\com\\nokia\\mj\\test\\java\\util\\TimerTaskTest.java",   # Apache license
-    "javacommons\\jvms\\cldc_1.1.1\\tsrc\\javasrc\\com\\nokia\\mj\\test\\java\\util\\TimerTest.java",       # Apache license
-    "javacommons\\utils\\inc\\convertutf.h",                                # Unicode Inc.
-    "javacommons\\utils\\src\\convertutf.cpp"                               # Unicode Inc.
-]
-
-# The copyright text to be checked
-copyrightText = "Nokia Corporation and/or its subsidiary(-ies)"
+# The copyright texts to be searched for
+copyrightText1 = "Nokia Corporation and/or its subsidiary(-ies)"
+copyrightText2 = "Eclipse Public License v1.0"
 
 
 def main():
+
+    root = sys.argv[1]
+    if root[-1] != '\\':
+        root = root + '\\'
+
+    # Include here the directories to be ignored
+    ignoredDirectories = [
+        root + "javaextensions\\bluetooth\\bluecove",  # Bluecove
+        root + "javacommons\\jvms\\j9\\s60\\inc",      # IBM J9
+        root + "javauis\\eswt_akn",                    # eSWT checked separately
+        root + "javauis\\eswt_qt",                     # eSWT checked separately
+        root + "javauis\\tsrc\\fute\\eswt\\",          # eSWT checked separately
+        root + "javaextensions\\webservices",          # Webservices not delivered
+        root + "tools",                                # Tools not delivered
+        "\\internal"                                   # Internal directories not delivered
+        ]
+     
+    # Include here any individual files to be ignored
+    ignoredFiles = [
+        root + "javacommons\\jvms\\cldc_1.1.1\\javasrc\\java\\util\\Timer.java",       # Apache license
+        root + "javacommons\\jvms\\cldc_1.1.1\\javasrc\\java\\util\\TimerTask.java",   # Apache license
+        root + "javacommons\\jvms\\cldc_1.1.1\\tsrc\\javasrc\\com\\nokia\\mj\\test\\java\\util\\TimerTaskTest.java",   # Apache license
+        root + "javacommons\\jvms\\cldc_1.1.1\\tsrc\\javasrc\\com\\nokia\\mj\\test\\java\\util\\TimerTest.java",       # Apache license
+        root + "javacommons\\utils\\inc\\convertutf.h",                                # Unicode Inc.
+        root + "javacommons\\utils\\src\\convertutf.cpp"                               # Unicode Inc.
+    ]
+
     
     def visitFun(arg, dirname, names):
 
@@ -94,16 +100,29 @@
                 # print "Ignoring file", f
                 continue
 
-            # Check if the file contains the copyright text
+            # Check if the file contains the copyright texts
             try:                       
                 file = open(fname)
+                
+                # Search for the first text
                 found = False
                 line = file.readline()
                 while line != "":
-                    if copyrightText in line:
+                    if copyrightText1 in line:
                         found = True
                         break;
-                    line = file.readline()                
+                    line = file.readline()
+                
+                # Search the second copyright text as well
+                if found:
+                    found = False
+                    line = file.readline()
+                    while line != "":
+                        if copyrightText2 in line:
+                            found = True
+                            break;
+                        line = file.readline()
+
                 file.close()
                                     
             except IOError:
@@ -112,8 +131,8 @@
             if not found:
                 print fname
                 continue
-                
-    os.path.walk(sys.argv[1], visitFun, None)
+    
+    os.path.walk(root, visitFun, None)
 
 
 if __name__ == "__main__":
--- a/build/buildutils/checkfilenames.py	Thu May 27 12:49:31 2010 +0300
+++ b/build/buildutils/checkfilenames.py	Fri Jun 11 13:33:44 2010 +0300
@@ -42,7 +42,7 @@
     ".cvsignore", ".dat", ".dcf", ".def", ".defs", ".dll", ".der", ".doc",
     ".dr", ".dso", ".dsp", ".dsw", ".dtd",
     ".emx", ".exe", ".flm", ".gcfml", ".gif",
-    ".h", ".hrh", ".html", ".iby", ".inf", ".ini", ".inl",
+    ".h", ".hrh", ".htm", ".html", ".iby", ".inf", ".ini", ".inl",
     ".jad", ".jar", ".java", ".javaversion", ".jpeg", ".jpg", ".js", ".jsp", ".jupiter",
     ".key", ".ks", ".launch", ".lib", ".loc", ".log",
     ".mak", ".make", "makefile", "makefile_akn", "makefile_qt",  "manifest", ".mbm", ".mdl",
@@ -64,6 +64,7 @@
 # Other peculiar filenames:
     "installerodclist", "installerodclist30", "midpodclist", "midpodclist30",
     "notice", "package-list", "tckrunnerodclist", "tckrunnerodclist30", "unknowncert","midprootslist",
+    "javacontrolpanelodclist", "javacontrolpanelodclist30",
 ]
 
 # Command line options.
--- a/build/buildutils/checkjavapackages.py	Thu May 27 12:49:31 2010 +0300
+++ b/build/buildutils/checkjavapackages.py	Fri Jun 11 13:33:44 2010 +0300
@@ -16,13 +16,17 @@
 #   Checks that all the java source files declare a package and that 
 #   the directory within a java source file is located corresponds
 #   properly to the package.
+#
+#   Ignores tsrc directories unless the option -all is given.
 
 import sys, os, re
 
 
 def main():
 
-    files = []
+    root = sys.argv[1]
+    all = len(sys.argv) > 2 and sys.argv[2] == '-all'
+    
     
     # Create a reg exp matching to "package x.y.z;" with whitespace ignored
     regex = re.compile("\\s*package\\s*([\\w.]*);.*", re.IGNORECASE)
@@ -31,8 +35,12 @@
 
         # Skip SVN directories
         if dirname.find("\\.svn") != -1:
-            return names
+            return
             
+        # Skip tsrc
+        if not all and dirname.find("\\tsrc") != -1:
+            return
+                    
         for f in names:
             if not f.endswith(".java"):
                 continue
@@ -63,7 +71,7 @@
             except IOError:
                 print "Error reading the file " + fname
                 
-    os.path.walk(sys.argv[1], visitFun, files)
+    os.path.walk(sys.argv[1], visitFun, None)
 
 
 if __name__ == "__main__":
--- a/build/exports.inf	Thu May 27 12:49:31 2010 +0300
+++ b/build/exports.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -40,6 +40,10 @@
 ../rom/tckrunnerodclist30 /epoc32/release/winscw/urel/z/resource/java/tckrunnerodclist
 ../rom/tckrunnerodclist30 /epoc32/data/z/resource/java/tckrunnerodclist
 
+../rom/javacontrolpanelodclist30 /epoc32/release/winscw/udeb/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist30 /epoc32/release/winscw/urel/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist30 /epoc32/data/z/resource/java/javacontrolpanelodclist
+
 ../rom/javalocalization_3_1.iby        LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(javalocalization.iby)
 
 #else // RD_JAVA_UI_QT
@@ -59,6 +63,10 @@
 ../rom/tckrunnerodclist /epoc32/release/winscw/urel/z/resource/java/tckrunnerodclist
 ../rom/tckrunnerodclist /epoc32/data/z/resource/java/tckrunnerodclist
 
+../rom/javacontrolpanelodclist /epoc32/release/winscw/udeb/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist /epoc32/release/winscw/urel/z/resource/java/javacontrolpanelodclist
+../rom/javacontrolpanelodclist /epoc32/data/z/resource/java/javacontrolpanelodclist
+
 ../rom/javalocalization_2_1.iby        LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(javalocalization.iby)
 
 #endif // RD_JAVA_UI_QT
--- a/build/makefile.javaversion	Thu May 27 12:49:31 2010 +0300
+++ b/build/makefile.javaversion	Fri Jun 11 13:33:44 2010 +0300
@@ -1,6 +1,2 @@
 # Set Java version (must be dot separated, without spaces)
-ifdef RD_JAVA_S60_RELEASE_5_0_IAD
-  JAVA_VERSION = 2.1.26
-else 
-  JAVA_VERSION = 2.1.26
-endif
+JAVA_VERSION = 2.2.1
--- a/build/sis/java_2_0.pkg	Thu May 27 12:49:31 2010 +0300
+++ b/build/sis/java_2_0.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -102,6 +102,7 @@
 "\epoc32\data\z\resource\java\midpodclist"-"c:\resource\java\midpodclist"
 "\epoc32\data\z\resource\java\tckrunnerodclist"-"c:\resource\java\tckrunnerodclist"
 "\epoc32\data\z\resource\java\installerodclist"-"c:\resource\java\installerodclist"
+"\epoc32\data\z\resource\java\javacontrolpanelodclist"-"c:\resource\java\javacontrolpanelodclist"
 
 
 
@@ -378,7 +379,7 @@
 "\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javawmamms.odc"-"c:\resource\java\jvm\lib\jrt\javawmamms.odc"
 
 "\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\tckrunner.odc"-"c:\resource\java\jvm\lib\jrt\tckrunner.odc"
-
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javacontrolpanel.odc"-"c:\resource\java\jvm\lib\jrt\javacontrolpanel.odc"
 
 
 ; Misc dlls
@@ -491,6 +492,7 @@
 "\epoc32\release\armv5\urel\javacaptain_ext_pushregistryplugin.dll"     -"c:\sys\bin\javacaptain_ext_pushregistryplugin.dll"
 "\epoc32\release\armv5\urel\javacaptain_ext_storageserverplugin.dll"    -"c:\sys\bin\javacaptain_ext_storageserverplugin.dll"
 "\epoc32\release\armv5\urel\javacaptain_ext_btdeviceclassmanager.dll"   -"c:\sys\bin\javacaptain_ext_btdeviceclassmanager.dll"
+"\epoc32\release\armv5\urel\javacaptain_ext_autostarter.dll"            -"c:\sys\bin\javacaptain_ext_autostarter.dll"
 ; PLUGIN_ID_JAVA_CERT_STORE_EXTENSION_C = 7
 "\epoc32\release\armv5\urel\javacaptain_ext_ondemand_7.dll"             -"c:\sys\bin\javacaptain_ext_ondemand_7.dll"
 #ifdef RD_JAVA_MIDPRMS_DB
@@ -663,6 +665,7 @@
 "\epoc32\data\z\resource\plugins\LCDC64K.rsc"-"c:\resource\plugins\LCDC64K.rsc"
 "\epoc32\release\armv5\urel\lcdgdrv.dll"-"c:\sys\bin\lcdgdrv.dll"
 "\epoc32\release\armv5\urel\lcdgdrvi.dll"-"c:\sys\bin\lcdgdrvi.dll"
+"\epoc32\release\armv5\urel\lcduiphysicswrap.dll"-"c:\sys\bin\lcduiphysicswrap.dll"
 #ifdef RD_JAVA_S60_RELEASE_5_0_IAD
 "\epoc32\release\armv5\urel\midp2permissiondb.dll"-"c:\sys\bin\midp2permissiondb.dll"
 "\epoc32\release\armv5\urel\midp2userpreferences.dll"-"c:\sys\bin\midp2userpreferences.dll"
--- a/build/sis/java_3_1.pkg	Thu May 27 12:49:31 2010 +0300
+++ b/build/sis/java_3_1.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -55,7 +55,7 @@
 "\epoc32\data\z\resource\java\midpodclist"-"c:\resource\java\midpodclist"
 "\epoc32\data\z\resource\java\tckrunnerodclist"-"c:\resource\java\tckrunnerodclist"
 "\epoc32\data\z\resource\java\installerodclist"-"c:\resource\java\installerodclist"
-
+"\epoc32\data\z\resource\java\javacontrolpanelodclist"-"c:\resource\java\javacontrolpanelodclist"
 
 ; Dlls containing java byte code and their odc files
 "\epoc32\release\armv5\urel\javabluecove.dll"-"c:\sys\bin\javabluecove.dll"
@@ -158,12 +158,12 @@
 "\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javawmamms.odc"-"c:\resource\java\jvm\lib\jrt\javawmamms.odc"
 
 "\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\tckrunner.odc"-"c:\resource\java\jvm\lib\jrt\tckrunner.odc"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javacontrolpanel.odc"-"c:\resource\java\jvm\lib\jrt\javacontrolpanel.odc"
 
 
 
 ; Misc dlls
 
-"\epoc32\release\armv5\urel\ifeui.dll"-"c:\sys\bin\ifeui.dll"
 "\epoc32\release\armv5\urel\javaappschemeplugin.dll"-"c:\sys\bin\javaappschemeplugin.dll"
 "\epoc32\release\armv5\urel\javabtl2capscplugin.dll"-"c:\sys\bin\javabtl2capscplugin.dll"
 "\epoc32\release\armv5\urel\javabtsppscplugin.dll"-"c:\sys\bin\javabtsppscplugin.dll"
@@ -203,6 +203,7 @@
 "\epoc32\release\armv5\urel\javacaptain_ext_pushregistryplugin.dll"     -"c:\sys\bin\javacaptain_ext_pushregistryplugin.dll"
 "\epoc32\release\armv5\urel\javacaptain_ext_storageserverplugin.dll"    -"c:\sys\bin\javacaptain_ext_storageserverplugin.dll"
 "\epoc32\release\armv5\urel\javacaptain_ext_btdeviceclassmanager.dll"   -"c:\sys\bin\javacaptain_ext_btdeviceclassmanager.dll"
+"\epoc32\release\armv5\urel\javacaptain_ext_autostarter.dll"            -"c:\sys\bin\javacaptain_ext_autostarter.dll"
 ; PLUGIN_ID_JAVA_CERT_STORE_EXTENSION_C = 7
 "\epoc32\release\armv5\urel\javacaptain_ext_ondemand_7.dll"             -"c:\sys\bin\javacaptain_ext_ondemand_7.dll"
 #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
@@ -213,7 +214,6 @@
 #endif
 
 ; resources
-"\epoc32\data\z\resource\plugins\ifeui.rsc"                   -"c:\resource\plugins\ifeui.rsc"
 "\epoc32\data\z\resource\plugins\javaappschemeplugin.rsc"     -"c:\resource\plugins\javaappschemeplugin.rsc"
 "\epoc32\winscw\c\private\102033E6\installer\inst_plugins.cfg"-"c:\private\102033E6\installer\inst_plugins.cfg"
 "\epoc32\data\Z\Resource\versions\java.txt"-"c:\resource\versions\java.txt"
@@ -332,8 +332,8 @@
 ;"\epoc32\release\armv5\urel\javam3g.dll"-"c:\sys\bin\javam3g.dll"
 ;"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javam3g.odc"-"c:\resource\java\jvm\lib\jrt\javam3g.odc"
 
-;"\epoc32\release\armv5\urel\javanokiasound.dll"-"c:\sys\bin\javanokiasound.dll"
-;"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javanokiasound.odc"-"c:\resource\java\jvm\lib\jrt\javanokiasound.odc"
+"\epoc32\release\armv5\urel\javanokiasound.dll"-"c:\sys\bin\javanokiasound.dll"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javanokiasound.odc"-"c:\resource\java\jvm\lib\jrt\javanokiasound.odc"
 
 ;"\epoc32\release\armv5\urel\javasoftnotification.dll"-"c:\sys\bin\javasoftnotification.dll"
 ;"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\javasoftnotification.odc"-"c:\resource\java\jvm\lib\jrt\javasoftnotification.odc"
--- a/build/sis/java_rnd_tools.pkg	Thu May 27 12:49:31 2010 +0300
+++ b/build/sis/java_rnd_tools.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -31,10 +31,6 @@
 ;to be installed on Series 60 v5.0 platforms
 [0x1028315F], 0, 0, 0, {"Series60ProductID"}
 
-"\epoc32\release\armv5\urel\JavaCap.exe"-"c:\sys\bin\JavaCap.exe"
-"\epoc32\data\z\private\10003a3f\apps\JavaCap_reg.rsc"-"c:\private\10003a3f\import\apps\JavaCap_reg.rsc"
-"\epoc32\data\z\resource\apps\JavaCap.rsc"            -"c:\resource\apps\JavaCap.rsc"
-
 ;j9dmp23.dll is a J9 VM plugin that provides the thread dump utility.
 "\epoc32\release\armv5\urel\j9dmp23.dll"-"c:\sys\bin\j9dmp23.dll"
 ;javathreaddumper.dll provides the thread dump agent.
@@ -46,3 +42,8 @@
 
 ; javainstaller.exe is a command line tool for starting javainstaller for RnD purposes only
 "\epoc32\release\armv5\urel\javainstaller.exe"-"c:\sys\bin\javainst.exe"
+
+
+"\epoc32\release\armv5\urel\javacontrolpanel.dll"-"c:\sys\bin\javacontrolpanel.dll"
+"\epoc32\release\armv5\urel\javacontrolpanel.exe"-"c:\sys\bin\javacontrolpanel.exe"
+"\epoc32\data\z\private\10003a3f\apps\javacontrolpanel_reg.rsc" -"c:\private\10003a3f\import\apps\javacontrolpanel_reg.rsc"
--- a/build/symbian_uids.pri	Thu May 27 12:49:31 2010 +0300
+++ b/build/symbian_uids.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -119,6 +119,9 @@
 contains(TARGET, javacaptain_ext_scrupdater): TARGET.UID3 = 0x2002DD10
 contains(TARGET, javacaptain_ext_ondemand_2): TARGET.UID3 = 0x2002DD01
 contains(TARGET, javanokiaui): TARGET.UID3 = 0x2002E697
+contains(TARGET, javacaptain_ext_autostarter): TARGET.UID3 = 0x2002EA7E
+contains(TARGET, javacontrolpanel): TARGET.UID3 = 0x2002FF62
+contains(TARGET, eswtqtwebkit): TARGET.UID3 = 0x2002FFA9
 
 isEmpty(TARGET.UID3): error($${TEMPLATE} $${TARGET} : UID3 not defined. Please allocate UID3 and configure it either on $${TARGET}.pro file or in command symbian_uids.pri)
 
--- a/inc/build_defines.hrh	Thu May 27 12:49:31 2010 +0300
+++ b/inc/build_defines.hrh	Fri Jun 11 13:33:44 2010 +0300
@@ -15,7 +15,7 @@
 *
 */
 
-#define RD_JAVA_VERSION 2,1,26 
+#define RD_JAVA_VERSION 2,2,1 
 #define RD_JAVA_SYMBIAN_TARGET 
 #define RD_JAVA_S60_RELEASE_10_1 
 #define RD_JAVA_S60_RELEASE_10_1_ONWARDS 
@@ -29,6 +29,7 @@
 #define SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK 
 #define RD_JAVA_USIF_APP_REG 
 #define RD_JAVA_USIF_NOTIFY_APP_ARC 
+#define RD_JAVA_USIF_NOTIFY_PROGRESS 
 #define RD_JAVA_PROXIMITY_LISTENER_ENABLED 
 #define RD_JAVA_OPENC_BETA_PATCH 
 #define OPENLCDUI_ENABLED 
--- a/inc/build_defines.pri	Thu May 27 12:49:31 2010 +0300
+++ b/inc/build_defines.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -13,4 +13,4 @@
 #
 # Description: Generated file - do not edit manually
 #
-PROJECT_DEFINES *= RD_JAVA_SYMBIAN_TARGET RD_JAVA_S60_RELEASE_10_1 RD_JAVA_S60_RELEASE_10_1_ONWARDS RD_JAVA_S60_RELEASE_9_2_ONWARDS RD_JAVA_S60_RELEASE_5_0_ONWARDS RD_JAVA_UI_QT RD_JAVA_STDCPPV5 RD_JAVA_EPOCALLOWDLLDATA_FIX RD_JAVA_HTTP_EMC_ENABLED RD_JAVA_NGA_ENABLED SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK RD_JAVA_USIF_APP_REG RD_JAVA_USIF_NOTIFY_APP_ARC RD_JAVA_PROXIMITY_LISTENER_ENABLED RD_JAVA_OPENC_BETA_PATCH OPENLCDUI_ENABLED RD_JAVA_OPENLCDUI_ENABLED RD_JAVA_INSTALLERUI_ENABLED RD_JAVA_PREWARM RD_JAVA_ADVANCED_TACTILE_FEEDBACK RD_JAVA_APPLICATION_SETTINGS_QT RD_JAVA_MIDPRMS_DB 
+PROJECT_DEFINES *= RD_JAVA_SYMBIAN_TARGET RD_JAVA_S60_RELEASE_10_1 RD_JAVA_S60_RELEASE_10_1_ONWARDS RD_JAVA_S60_RELEASE_9_2_ONWARDS RD_JAVA_S60_RELEASE_5_0_ONWARDS RD_JAVA_UI_QT RD_JAVA_STDCPPV5 RD_JAVA_EPOCALLOWDLLDATA_FIX RD_JAVA_HTTP_EMC_ENABLED RD_JAVA_NGA_ENABLED SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK RD_JAVA_USIF_APP_REG RD_JAVA_USIF_NOTIFY_APP_ARC RD_JAVA_USIF_NOTIFY_PROGRESS RD_JAVA_PROXIMITY_LISTENER_ENABLED RD_JAVA_OPENC_BETA_PATCH OPENLCDUI_ENABLED RD_JAVA_OPENLCDUI_ENABLED RD_JAVA_INSTALLERUI_ENABLED RD_JAVA_PREWARM RD_JAVA_ADVANCED_TACTILE_FEEDBACK RD_JAVA_APPLICATION_SETTINGS_QT RD_JAVA_MIDPRMS_DB 
--- a/inc/java.txt	Thu May 27 12:49:31 2010 +0300
+++ b/inc/java.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -1,1 +1,1 @@
-2.1.26
+2.2.1
--- a/inc/java_s60_release.hrh	Thu May 27 12:49:31 2010 +0300
+++ b/inc/java_s60_release.hrh	Fri Jun 11 13:33:44 2010 +0300
@@ -1,18 +1,1 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
 RD_JAVA_S60_RELEASE=10.1
--- a/inc/project_defines.hrh	Thu May 27 12:49:31 2010 +0300
+++ b/inc/project_defines.hrh	Fri Jun 11 13:33:44 2010 +0300
@@ -28,6 +28,7 @@
 MACRO SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK 
 MACRO RD_JAVA_USIF_APP_REG 
 MACRO RD_JAVA_USIF_NOTIFY_APP_ARC 
+MACRO RD_JAVA_USIF_NOTIFY_PROGRESS 
 MACRO RD_JAVA_PROXIMITY_LISTENER_ENABLED 
 MACRO RD_JAVA_OPENC_BETA_PATCH 
 MACRO OPENLCDUI_ENABLED 
--- a/javacommons/comms/ipclib/clientserver/src.s60/commssession.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/comms/ipclib/clientserver/src.s60/commssession.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -87,7 +87,10 @@
         }
         else
         {
-            WLOG2(EJavaComms, "%s failed, err = %d", __PRETTY_FUNCTION__, rc);
+            if (rc != KErrOverflow)
+            {
+                WLOG2(EJavaComms, "%s failed, err = %d", __PRETTY_FUNCTION__, rc);
+            }
         }
     }
     return 0;
@@ -151,7 +154,10 @@
         }
         else
         {
-            WLOG2(EJavaComms, "%s failed, err = %d", __PRETTY_FUNCTION__, rc);
+            if (rc != KErrOverflow)
+            {
+                WLOG2(EJavaComms, "%s failed, err = %d", __PRETTY_FUNCTION__, rc);
+            }
         }
     }
 }
@@ -193,7 +199,7 @@
     else
     {
         rc = KErrOverflow;
-        WLOG3(EJavaComms, "%s: allocated length for message is too small (required size=%d, allocated size=%d)",
+        LOG3(EJavaComms, EInfo, "%s: allocated length for message is too small (required size=%d, allocated size=%d)",
               __PRETTY_FUNCTION__, neededLength, allocatedLength);
     }
 
--- a/javacommons/comms/ipclib/clientserver/src.s60/creceiver.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/comms/ipclib/clientserver/src.s60/creceiver.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -66,7 +66,7 @@
         // buffer was not big enough for the message so reallocate buffer with correct size
         mBuffer.Close();
         mBuffer.ReAllocL(mRequiredLength());
-        WLOG2(EJavaComms, "%s: increasing buffer size to %d", __PRETTY_FUNCTION__, mRequiredLength());
+        LOG2(EJavaComms, EInfo, "%s: increasing buffer size to %d", __PRETTY_FUNCTION__, mRequiredLength());
         Receive();
     }
     break;
--- a/javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java	Fri Jun 11 13:33:44 2010 +0300
@@ -45,7 +45,7 @@
         String urls = null;
         int apnid = -1;
         int index = -1;
-        int responsetimeout = -1;
+        int responsetimeout = 180;  // default timeout of 3 minutes
         ConnectionManager cminstance = null;
         AccessPoint apn = null;
         iFullUrl = "http:" + aUri;
--- a/javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -626,6 +626,14 @@
             iStatus = CHttpTransactionClient::ERequestNextBodayData;
             break;
         }
+        
+        case THTTPEvent::EReceiveTimeOut:
+        {
+        	  ELOG(ESOCKET,"MHFRunL EReceiveTimeOut");
+        	  NotifyErrorL(KErrTimedOut);  // send timeout error to java
+        	  break;
+        	
+        }        
         /*
         * -j2me expects the http stack to be able to post body data with no content type
         *   the native stack default validation filter does not allow this.
@@ -694,7 +702,6 @@
         iTransaction.Cancel();
         iHttpSession.RestartConnection();
 
-
     }
     if (iJavaWaitingOnCallBack)
     {
@@ -707,7 +714,7 @@
         LOG(ESOCKET,EInfo,"Notifiy Read EOF / Cancel");
         iJavaWaitingOnCallBack=EFalse;
         //Notify Java of error if it is waiting for a read
-        iObserver->DataReadyForRead(-1);
+        iObserver->DataReadyForRead(aErrorCode);
     }
 
 }
--- a/javacommons/gcfprotocols/socket/socket/inc/apnsettings.h	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/gcfprotocols/socket/socket/inc/apnsettings.h	Fri Jun 11 13:33:44 2010 +0300
@@ -27,7 +27,7 @@
 
 public :
     static int setDefaultApn(int aType, int aApn);
-    static void removeDefaultApn();
+   
 };
 
 
--- a/javacommons/gcfprotocols/socket/socket/src.s60/apnsettings.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/gcfprotocols/socket/socket/src.s60/apnsettings.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -66,11 +66,4 @@
     return def;
 }
 
-void ApnSettings::removeDefaultApn()
-{ 
-    #ifdef RD_JAVA_OPENC_BETA_PATCH
-        setdefaultif(NULL);
-        ILOG(ESOCKET, "sedefaultif called");
-        ILOG1(ESOCKET, "remove default apn returned %d",setdefaultif(NULL));
-    #endif  
-}
+
--- a/javacommons/jvms/cldc_1.1.1/javasrc/java/util/Timer.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/jvms/cldc_1.1.1/javasrc/java/util/Timer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
--- a/javacommons/jvms/cldc_1.1.1/javasrc/java/util/TimerTask.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/jvms/cldc_1.1.1/javasrc/java/util/TimerTask.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
--- a/javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTaskTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTaskTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
--- a/javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/jvms/cldc_1.1.1/tsrc/javasrc/com/nokia/mj/test/java/util/TimerTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one or more
  *  contributor license agreements.  See the NOTICE file distributed with
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/jvms/j9/exports.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* 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: 
+*
+*/
+
+PRJ_PLATFORMS
+default
+
+#ifndef RD_JAVA_SF_BUILD
+#include "s60/exports.inf"
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/jvms/j9/j9.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,23 @@
+#
+# 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: 
+#
+
+TEMPLATE = subdirs
+
+# Export J9 only when available here (not available here in SF builds)
+# (use indirection through ./exports.inf for pregenerated bld.inf variation)
+exists($${_PRO_FILE_PWD_}/s60/exports.inf): {
+  BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"exports.inf\"" \
+}
--- a/javacommons/security/build/exports.inf	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/build/exports.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -27,9 +27,12 @@
 
 #include <platform_paths.hrh>
 
+// Configuration interface for javasecurity
 #ifdef RD_JAVA_S60_RELEASE_10_1_ONWARDS 
+// Public configuration interface is named as CI_javasecurity.confml
+// and it is located outside of jrt package. The name of private
+// configuration interface is javasecurity2.confml.
 ../conf/javasecurity2.confml        APP_LAYER_CONFML(javasecurity.confml)
-../conf/CI_javasecurity.confml      APP_LAYER_CONFML(CI_javasecurity.confml)
 #else
 ../conf/javasecurity.confml         APP_LAYER_CONFML(javasecurity.confml)
 #endif /* RD_JAVA_S60_RELEASE_10_1_ONWARDS */
Binary file javacommons/security/conf/CI_javasecurity.confml has changed
--- a/javacommons/security/data/att_manufacturer.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/att_manufacturer.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/att_operator.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/att_operator.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -48,8 +48,16 @@
     permission javax.microedition.io.PushRegistryPermission "*" "staticregistration,dynamicregistration,autoinvocation";
 }
 
+grant user "Url start" blanket,session,oneshot,no {
+    permission javax.microedition.midlet.CmdLineArgsPermission;
+}
+
 grant allowed {
     permission javax.microedition.io.Connector.sms "sms://*" "open,receive";
     permission javax.microedition.io.Connector.mms "mms://*" "open,receive";
     permission javax.microedition.io.Connector.cbs "cbs://*" "open,receive";
 }
+
+grant assigned {
+    permission javax.microedition.midlet.AutoStartPermission;
+}
--- a/javacommons/security/data/att_operatorextra.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/att_operatorextra.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/msa_manufacturer.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/msa_manufacturer.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/msa_operator.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/msa_operator.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/msa_trustedthirdparty.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/msa_trustedthirdparty.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -62,6 +62,10 @@
     permission javax.microedition.apdu.aid "apdu://*" "aid";
 }
 
+grant user "Url start" session,oneshot,no {
+    permission javax.microedition.midlet.CmdLineArgsPermission;
+}
+
 grant allowed {
     permission javax.microedition.io.Connector.sms "sms://*" "open,receive";
     permission javax.microedition.io.Connector.mms "mms://*" "open,receive";
--- a/javacommons/security/data/s60_manufacturer.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/s60_manufacturer.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/s60_operator.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/s60_operator.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 
 grant assigned {
--- a/javacommons/security/data/s60_trustedthirdparty.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/data/s60_trustedthirdparty.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -63,6 +63,10 @@
     permission javax.microedition.securityservice.CMSMessageSignatureService "pki://*" "authenticate";
 }
 
+grant user "Url start" session,oneshot,no {
+    permission javax.microedition.midlet.CmdLineArgsPermission;
+}
+
 grant allowed {
     permission javax.microedition.io.Connector.sms "sms://*" "open,receive";
     permission javax.microedition.io.Connector.mms "mms://*" "open,receive";
--- a/javacommons/security/inc/securitystoragedatadefs.h	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/inc/securitystoragedatadefs.h	Fri Jun 11 13:33:44 2010 +0300
@@ -42,6 +42,7 @@
 const wchar_t* const AUTHENTICATION_SETTINGS = L"Authentication";
 const wchar_t* const BROADCAST_SETTINGS = L"Broadcast";
 const wchar_t* const NFC_WRITE_ACCESS_SETTINGS = L"NFC Write Access";
+const wchar_t* const URL_START_SETTINGS = L"Url start";
 
 // interaction modes values
 const wchar_t* const ONESHOT_INTERACTION_MODE = L"1";
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-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"
@@ -318,8 +318,9 @@
             {
                 Calendar cal = Calendar.getInstance();
                 cal.set(Calendar.YEAR, Integer.parseInt(str.substring(0,4)));
-                cal.set(Calendar.MONTH, Integer.parseInt(str.substring(4,6)));
-                cal.set(Calendar.DAY_OF_WEEK, Integer.parseInt(str.substring(6,8)));
+                // Calendar.MONTH begins from 0 (0=January, 1=Februrary, ...)
+                cal.set(Calendar.MONTH, Integer.parseInt(str.substring(4,6)) - 1);
+                cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(str.substring(6,8)));
                 cal.set(Calendar.HOUR, Integer.parseInt(str.substring(8,10)));
                 cal.set(Calendar.MINUTE, Integer.parseInt(str.substring(10,12)));
                 cal.set(Calendar.SECOND, Integer.parseInt(str.substring(12,14)));
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -61,7 +61,7 @@
      *                        which the AccessControllerImpl instance
      *                        is retrieved
      */
-    public static AccessControllerImpl getAccessController(StorageSession aStorageSession,
+    public synchronized static AccessControllerImpl getAccessController(StorageSession aStorageSession,
             Uid aAppSuiteUid,
             String aAppName)
     {
@@ -69,7 +69,6 @@
         {
             return null;
         }
-        // Synchronization missing
         AccessControllerImpl instance = (AccessControllerImpl)instances.get(
                                             aAppSuiteUid);
 
@@ -82,14 +81,13 @@
         return instance;
     }
 
-    public static void destroyAccessController(Uid appUID)
+    public synchronized static void destroyAccessController(Uid appUID)
     {
         if (appUID == null)
         {
             return;
         }
         // This is to be called when a MIDlet suite is stoped
-        // Synchronization missing
         // Remove the instance or mark it as inactive?
         AccessControllerImpl ac = (AccessControllerImpl)instances
                                   .remove(appUID);
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java	Fri Jun 11 13:33:44 2010 +0300
@@ -81,7 +81,7 @@
         }
     }
 
-    public UserSecuritySettings handleUserPermission(
+    public synchronized UserSecuritySettings handleUserPermission(
         UserPermission userPermission, boolean blanketPromptShown)
     {
         UserSecuritySettings settings = userPermission
@@ -219,7 +219,7 @@
             }
             else
             {
-                RuntimeUi ui = getUiInstance();
+                getUiInstance();
                 boolean responseAvailable = ui.confirm(
                                                 appName,
                                                 cData);
@@ -329,13 +329,12 @@
         }
     }
 
-    private RuntimeUi getUiInstance()
+    private void getUiInstance()
     {
         if (ui == null)
         {
             ui = RuntimeUiFactory.getRuntimeUi();
         }
-        return ui;
     }
 
     private UserSecuritySettings handleDenyAnswer(UserSecuritySettings settings)
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java	Fri Jun 11 13:33:44 2010 +0300
@@ -228,6 +228,12 @@
        PERMISSION_MAPPING_TABLE.put(
             "javax.microedition.midlet.AutoStartPermission", new MIDPPermission(
                 "com.nokia.mj.impl.installer.utils.AutoStartPermission", null));
+       PERMISSION_MAPPING_TABLE.put(
+            "javax.microedition.midlet.CmdLineArgsPermission", new MIDPPermission(
+                "com.nokia.mj.impl.rt.utils.CmdLineArgsPermission", null));
+       PERMISSION_MAPPING_TABLE.put(
+            "com.nokia.webstart", new MIDPPermission(
+                "com.nokia.mj.impl.rt.utils.CmdLineArgsPermission", null));
     }
 
     /**
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java	Fri Jun 11 13:33:44 2010 +0300
@@ -48,6 +48,7 @@
     public static final String AUTHENTICATION_SETTINGS = "Authentication";
     public static final String BROADCAST_SETTINGS = "Broadcast";
     public static final String NFC_WRITE_ACCESS_SETTINGS = "NFC Write Access";
+    public static final String URL_START_SETTINGS = "Url start";
 
     // security warnings modes
     public static final String SECURITY_WARNINGS_USER_DEFINED_MODE = "1";
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -51,6 +51,7 @@
     private static final String AUTHENTICATION_ID = "setting_auth";
     private static final String BROADCAST_ID = "setting_broadcast";
     private static final String NFC_WRITE_ACCESS_ID = "setting_nfc_write_access";
+    private static final String URL_START_ID = "setting_url_start";
 
     public UserSecuritySettingsImpl(
         String name,
@@ -159,6 +160,10 @@
         {
             id = BROADCAST_ID;
         }
+        else if (URL_START_SETTINGS.equalsIgnoreCase(aSettingName))
+        {
+            id = URL_START_ID;
+        }
         return resLoader.format(id, null /*aTextParameters*/);
     }
 
--- a/javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java	Fri Jun 11 13:33:44 2010 +0300
@@ -79,6 +79,7 @@
     public static final String QUESTION_ID_PUSH_DYNAMIC_REGISTRATION = "push_registration_dynamic";
     public static final String QUESTION_ID_AUTO_INVOCATION = "auto_invocation";
     public static final String QUESTION_ID_NDEF_TAG_WRITE = "nfc_ndef_tag_write";
+    public static final String QUESTION_ID_APP_AUTO_LAUNCH = "url_start";
 
     // identifiers for the security prompt answer options
     public static final String ANSWER_ID_ALLOW = "prompt_allow";
--- a/javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -75,7 +75,6 @@
         Cancel();
     }
 
-    mComms.unregisterListener(PLUGIN_ID_JAVA_CERT_STORE_ECOM_C,this);
     mComms.unregisterDefaultListener(this);
     mComms.disconnect();
     mCertsData.ResetAndDestroy();
@@ -388,7 +387,7 @@
     TBool validRequest = validateCertAttrFilter(aFilter);
     if (!validRequest)
     {
-        ELOG(EJavaSecurity,"No certificates matching the filter supplied");
+        LOG(EJavaSecurity, EInfo, "No certificates matching the filter supplied");
         User::RequestComplete(pRequestStatus,KErrNone);
         return;
     }
--- a/javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.h	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/javaunicertstoreplugin/src.s60/javacertstoreimpl.h	Fri Jun 11 13:33:44 2010 +0300
@@ -68,8 +68,7 @@
 };
 
 class CJavaCertStoreImpl: public CActive, public MCTWritableCertStore,
-        public java::comms::CommsListener,
-        public java::comms::CommsClientEndpoint
+        public java::comms::CommsListener
 {
 public:
 
--- a/javacommons/security/tsrc/data/policies/test_manufacturer.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/tsrc/data/policies/test_manufacturer.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 grant assigned {
     permission javax.microedition.PropertyPermission "mobinfo.msisdn" "read";
--- a/javacommons/security/tsrc/data/policies/test_operator.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/tsrc/data/policies/test_operator.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -30,6 +30,7 @@
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
     permission javax.microedition.PropertyPermission "mobinfo.imsi" "read";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
 grant assigned {
     permission javax.microedition.PropertyPermission "mobinfo.msisdn" "read";
--- a/javacommons/security/tsrc/data/policies/test_operatorextra.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/tsrc/data/policies/test_operatorextra.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -29,4 +29,5 @@
     permission javax.microedition.media.control.RecordControl "*" "record";
     permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot";
     permission javax.microedition.io.Connector.rtsp "*";
+    permission javax.microedition.midlet.CmdLineArgsPermission;
 }
--- a/javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt	Fri Jun 11 13:33:44 2010 +0300
@@ -63,6 +63,10 @@
     permission javax.microedition.securityservice.CMSMessageSignatureService "pki://*" "authenticate";
 }
 
+grant user "Url start" session,oneshot,no {
+    permission javax.microedition.midlet.CmdLineArgsPermission;
+}
+
 grant allowed {
     permission javax.microedition.io.Connector.sms "sms://*" "open,receive";
     permission javax.microedition.io.Connector.mms "mms://*" "open,receive";
--- a/javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java	Fri Jun 11 13:33:44 2010 +0300
@@ -89,6 +89,7 @@
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.AutoStartPermission"),null,null,null),
+        new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null,null,null),
     };
     static final SecurityPolicyPermission[] OPERATOR_PERMS =
     {
@@ -142,6 +143,7 @@
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.AutoStartPermission"),null,null,null),
+        new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null,null,null),
     };
     static final SecurityPolicyPermission[] IDENTIFIED_THIRD_PARTY_PERMS =
     {
@@ -265,6 +267,9 @@
                                                                           new int[]{UserSecuritySettings.BLANKET_INTERACTION_MODE,UserSecuritySettings.ONESHOT_INTERACTION_MODE,UserSecuritySettings.NO_INTERACTION_MODE,UserSecuritySettings.SESSION_INTERACTION_MODE})),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null),
         new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null),
+        new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null, null,
+                                     new SecurityPolicyPermissionSettings("Url start",UserSecuritySettings.SESSION_INTERACTION_MODE,
+                                                                          new int[]{UserSecuritySettings.ONESHOT_INTERACTION_MODE,UserSecuritySettings.NO_INTERACTION_MODE,UserSecuritySettings.SESSION_INTERACTION_MODE})),
     };
     static final SecurityPolicyPermission[] UNIDENTIFIED_THIRD_PARTY_PERMS =
     {
--- a/javacommons/utils/inc/javaoslayer.h	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/utils/inc/javaoslayer.h	Fri Jun 11 13:33:44 2010 +0300
@@ -33,6 +33,7 @@
 const int BOOT_CLASSPATH_MIDP = 1;
 const int BOOT_CLASSPATH_INSTALLER = 2;
 const int BOOT_CLASSPATH_TCKRUNNER = 3;
+const int BOOT_CLASSPATH_JAVACONTROLPANEL = 4;
 
 class DriveId;
 
--- a/javacommons/utils/src.s60/javaoslayer.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/utils/src.s60/javaoslayer.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -39,6 +39,7 @@
 const char * const BOOT_CLASSPATH_MIDP_FILE = "midpodclist";
 const char * const BOOT_CLASSPATH_INSTALLER_FILE = "installerodclist";
 const char * const BOOT_CLASSPATH_TCKRUNNER_FILE = "tckrunnerodclist";
+const char * const BOOT_CLASSPATH_JAVACONTROLPANEL_FILE = "javacontrolpanelodclist";
 
 _LIT(KStartUpTraceDir, "java\\full");
 _LIT(KStartUpTraceFile, "startup.txt");
@@ -303,6 +304,10 @@
     {
         path.append(BOOT_CLASSPATH_TCKRUNNER_FILE);
     }
+    else if (BOOT_CLASSPATH_JAVACONTROLPANEL == pathType)
+    {
+        path.append(BOOT_CLASSPATH_JAVACONTROLPANEL_FILE);
+    }
     else
     {
         path.append(BOOT_CLASSPATH_MIDP_FILE);
--- a/javacommons/utils/src.s60/s60commonutils.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javacommons/utils/src.s60/s60commonutils.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -118,6 +118,12 @@
 
     for (int i = 0; i< count; i++)
     {
+         if( !aNativeArray[ i ] )
+         {
+             // Skip null elements since already initialized
+             continue;
+         }
+    	
         //TPtr16 temp =  aNativeArray[i]->Des();
         jstring javaString = S60CommonUtils::NativeToJavaString(aJni, *aNativeArray[i]);
         if (javaString == NULL)
--- a/javaextensions/sensor/src.s60/cacceleratorsensor.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/sensor/src.s60/cacceleratorsensor.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -297,7 +297,6 @@
 
 void CAcceleratorSensor::OpenChannelL()
 {
-    TInt err;
     JELOG2(ESensor);
     LOG(ESensor,EInfo,"Creating Open Channel");
     iChannel->OpenChannelL();
@@ -306,9 +305,9 @@
     iScaleFactor = 1;
     TInt format(ESensrvChannelDataFormatAbsolute);
     TSensrvProperty property;
-    TRAP(err,iChannel->GetPropertyL(KSensrvPropIdChannelDataFormat, KSensrvItemIndexNone,
-                                      property););
-    LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::GetPropertyL() One = %d",err);
+    iChannel->GetPropertyL(KSensrvPropIdChannelDataFormat, KSensrvItemIndexNone,
+                                      property);
+    
 
     if (property.PropertyType() == ESensrvIntProperty)
     {
@@ -328,19 +327,17 @@
         // Scaled value maximum
         TSensrvProperty property_scaled;
         TInt maxScaled(0);
-        TRAP(err,iChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone,
-                                          property_scaled););
-        LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::GetPropertyL() Two = %d",err);
+       iChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone,
+                                          property_scaled);
+        
 
         if (property_scaled.GetArrayIndex() == ESensrvArrayPropertyInfo)
         {
             LOG(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::If");
             //for 2G Accelerometer Sensor index value is 0.
             TInt rangeIndex(0);
-            TRAP(err,iChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone,
-                                              rangeIndex, property_scaled););
-            LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::GetPropertyL() Three = %d",err);
-
+            iChannel->GetPropertyL(KSensrvPropIdScaledRange, KSensrvItemIndexNone,
+                                              rangeIndex, property_scaled);
             property_scaled.GetMaxValue(maxScaled);
 
             LOG1(ESensor,EInfo,"property_scaled::maxValue = %d",maxScaled);
@@ -353,36 +350,32 @@
         }
         // MeasureRange can be an array property
         TReal maxMeasure;
-        TInt err1;
+        
         TSensrvProperty property_Measured;
-        TRAP(err1,iChannel->GetPropertyL(KSensrvPropIdMeasureRange, KSensrvItemIndexNone,
-                                          property_Measured););
-        LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::GetPropertyL() Four = %d",err1);
+        iChannel->GetPropertyL(KSensrvPropIdMeasureRange, KSensrvItemIndexNone,
+                                          property_Measured);
+             
+        TInt arrayIndex = property_Measured.GetArrayIndex();
+        LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::KSensrvPropIdMeasureRange::arrayIndex = %d",arrayIndex);
 
-        if (err1 == KErrNone)
+        if (property_Measured.GetArrayIndex() == ESensrvArrayPropertyInfo)
         {
-            TInt arrayIndex = property_Measured.GetArrayIndex();
-            LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::KSensrvPropIdMeasureRange::arrayIndex = %d",arrayIndex);
-
-            if (property_Measured.GetArrayIndex() == ESensrvArrayPropertyInfo)
-            {
-                LOG(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::If");
+            LOG(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::If");
 
-                TInt index2g = 0;
-                LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::Getting RangeIndex = %f",index2g);
-                //We need to TypeCast variable rangeIndex to TInt for
-                TRAP(err,iChannel->GetPropertyL(KSensrvPropIdMeasureRange, KSensrvItemIndexNone,
-                                                  index2g, property_Measured););
-                LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::GetPropertyL() Five = %d",err);
-                property_Measured.GetMaxValue(maxMeasure);
-            }
-            else
-            {
-                LOG(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::else");
-                property_Measured.GetMaxValue(maxMeasure);
-            }
+            TInt index2g = 0;
+            LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::Getting RangeIndex = %f",index2g);
+            //We need to TypeCast variable rangeIndex to TInt for
+            iChannel->GetPropertyL(KSensrvPropIdMeasureRange, KSensrvItemIndexNone,
+                                              index2g, property_Measured);
+            property_Measured.GetMaxValue(maxMeasure);
+        }
+        else
+        {
+            LOG(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::else");
+            property_Measured.GetMaxValue(maxMeasure);
+        }
 
-        }
+        
         iScaleFactor = maxMeasure / maxScaled ;
         LOG1(ESensor,EInfo,"CAcceleratorSensor::OpenChannelL()::iScaleFactor = %f",iScaleFactor);
     }
--- a/javaextensions/wma/mms/pushplugin/build/eabi/javammsscpluginu.def	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/mms/pushplugin/build/eabi/javammsscpluginu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -24,4 +24,6 @@
 	_ZThn28_N4java3wma22S60MmsServerConnection9setFilterERKSbIwSt11char_traitsIwESaIwEE @ 23 NONAME ; #<thunk>#
 	_ZThn28_NK4java3wma22S60MmsServerConnection6getUriEv @ 24 NONAME ; #<thunk>#
 	_ZThn28_NK4java3wma22S60MmsServerConnection9getFilterEv @ 25 NONAME ; #<thunk>#
+	_ZN4java3wma22S60MmsServerConnection5closeEv @ 26 NONAME
+	_ZThn28_N4java3wma22S60MmsServerConnection5closeEv @ 27 NONAME
 
--- a/javaextensions/wma/mms/pushplugin/src.s60/s60mmsserverconnection.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/mms/pushplugin/src.s60/s60mmsserverconnection.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -270,7 +270,7 @@
     return mFilter;
 }
 
-void S60MmsServerConnection::close()
+OS_EXPORT void S60MmsServerConnection::close()
 {
     JELOG2(EWMA);
     // the close and RunL are synchronized to make it SMP safe.
--- a/javaextensions/wma/sms_cbs/pushplugin/cbs/build/eabi/javacbsscpluginu.def	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/sms_cbs/pushplugin/cbs/build/eabi/javacbsscpluginu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -24,4 +24,16 @@
 	_ZTVN4java3wma19CbsServerConnectionE @ 23 NONAME ; #<VT>#
 	_ZTVN4java3wma20ServerConnectionBaseE @ 24 NONAME ; #<VT>#
 	_ZThn28_N4java3wma19CbsServerConnection4openEPNS_4push18ConnectionListenerE @ 25 NONAME ; #<thunk>#
+	_ZN4java3wma19CbsServerConnection15retrieveMessageER8TPckgBufI22TJavaMessageParametersE @ 26 NONAME
+	_ZN4java3wma19CbsServerConnection4openEPNS_4push18ConnectionListenerEb @ 27 NONAME
+	_ZN4java3wma19CbsServerConnection5closeEv @ 28 NONAME
+	_ZN4java3wma19CbsServerConnectionD0Ev @ 29 NONAME
+	_ZN4java3wma19CbsServerConnectionD1Ev @ 30 NONAME
+	_ZN4java3wma19CbsServerConnectionD2Ev @ 31 NONAME
+	_ZThn28_N4java3wma19CbsServerConnection15retrieveMessageER8TPckgBufI22TJavaMessageParametersE @ 32 NONAME
+	_ZThn28_N4java3wma19CbsServerConnection4openEPNS_4push18ConnectionListenerEb @ 33 NONAME
+	_ZThn28_N4java3wma19CbsServerConnection5closeEv @ 34 NONAME
+	_ZThn28_N4java3wma19CbsServerConnectionD0Ev @ 35 NONAME
+	_ZThn28_N4java3wma19CbsServerConnectionD1Ev @ 36 NONAME
 
+
--- a/javaextensions/wma/sms_cbs/pushplugin/cbs/src.s60/cbsserverconnection.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/sms_cbs/pushplugin/cbs/src.s60/cbsserverconnection.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -58,7 +58,7 @@
     return cbsConn;
 }
 
-CbsServerConnection::~CbsServerConnection()
+OS_EXPORT CbsServerConnection::~CbsServerConnection()
 {
     JELOG2(EWMA);
     removeDir(mMessageStoreDirName);
@@ -128,7 +128,7 @@
     }
 }
 
-void CbsServerConnection::open(ConnectionListener* aListener,
+OS_EXPORT void CbsServerConnection::open(ConnectionListener* aListener,
                                bool aIsAppLaunched)
 {
     JELOG2(EWMA);
@@ -282,7 +282,7 @@
     }
 }
 
-int CbsServerConnection::retrieveMessage(TJavaMessageParametersBuf& aCbsBuf)
+OS_EXPORT int CbsServerConnection::retrieveMessage(TJavaMessageParametersBuf& aCbsBuf)
 {
     JELOG2(EWMA);
     TCBSParametersBuf cbsParametersBuf;
@@ -328,7 +328,7 @@
 }
 
 
-void CbsServerConnection::close()
+OS_EXPORT void CbsServerConnection::close()
 {
     JELOG2(EWMA);
     // the close and RunL are synchronized to make it SMP safe.
--- a/javaextensions/wma/sms_cbs/pushplugin/sms/build/eabi/javasmsscpluginu.def	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/sms_cbs/pushplugin/sms/build/eabi/javasmsscpluginu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -10,23 +10,28 @@
 	_ZN26SmsServerConnectionFactoryD2Ev @ 9 NONAME
 	_ZN4java3wma19SmsServerConnection15retrieveMessageER8TPckgBufI22TJavaMessageParametersE @ 10 NONAME
 	_ZN4java3wma19SmsServerConnection4openEPNS_4push18ConnectionListenerE @ 11 NONAME
-	_ZN4java3wma19SmsServerConnectionC1ERKSbIwSt11char_traitsIwESaIwEES7_ @ 12 NONAME
-	_ZN4java3wma19SmsServerConnectionC2ERKSbIwSt11char_traitsIwESaIwEES7_ @ 13 NONAME
-	_ZN4java3wma19SmsServerConnectionD0Ev @ 14 NONAME
-	_ZN4java3wma19SmsServerConnectionD1Ev @ 15 NONAME
-	_ZN4java3wma19SmsServerConnectionD2Ev @ 16 NONAME
-	_ZN4java3wma20ServerConnectionBase9setFilterERKSbIwSt11char_traitsIwESaIwEE @ 17 NONAME
-	_ZNK4java3wma20ServerConnectionBase18getMessagesOnStoreEv @ 18 NONAME
-	_ZNK4java3wma20ServerConnectionBase6getUriEv @ 19 NONAME
-	_ZNK4java3wma20ServerConnectionBase9getFilterEv @ 20 NONAME
-	_ZTI26SmsServerConnectionFactory @ 21 NONAME ; #<TI>#
-	_ZTIN4java3wma19SmsServerConnectionE @ 22 NONAME ; #<TI>#
-	_ZTIN4java3wma20ServerConnectionBaseE @ 23 NONAME ; #<TI>#
-	_ZTV26SmsServerConnectionFactory @ 24 NONAME ; #<VT>#
-	_ZTVN4java3wma19SmsServerConnectionE @ 25 NONAME ; #<VT>#
-	_ZTVN4java3wma20ServerConnectionBaseE @ 26 NONAME ; #<VT>#
-	_ZThn28_N4java3wma19SmsServerConnection15retrieveMessageER8TPckgBufI22TJavaMessageParametersE @ 27 NONAME ; #<thunk>#
-	_ZThn28_N4java3wma19SmsServerConnection4openEPNS_4push18ConnectionListenerE @ 28 NONAME ; #<thunk>#
-	_ZThn28_N4java3wma19SmsServerConnectionD0Ev @ 29 NONAME ; #<thunk>#
-	_ZThn28_N4java3wma19SmsServerConnectionD1Ev @ 30 NONAME ; #<thunk>#
+	_ZN4java3wma19SmsServerConnection4openEPNS_4push18ConnectionListenerEb @ 12 NONAME
+	_ZN4java3wma19SmsServerConnection5closeEv @ 13 NONAME
+	_ZN4java3wma19SmsServerConnectionC1ERKSbIwSt11char_traitsIwESaIwEES7_ @ 14 NONAME
+	_ZN4java3wma19SmsServerConnectionC2ERKSbIwSt11char_traitsIwESaIwEES7_ @ 15 NONAME
+	_ZN4java3wma19SmsServerConnectionD0Ev @ 16 NONAME
+	_ZN4java3wma19SmsServerConnectionD1Ev @ 17 NONAME
+	_ZN4java3wma19SmsServerConnectionD2Ev @ 18 NONAME
+	_ZN4java3wma20ServerConnectionBase9setFilterERKSbIwSt11char_traitsIwESaIwEE @ 19 NONAME
+	_ZNK4java3wma20ServerConnectionBase18getMessagesOnStoreEv @ 20 NONAME
+	_ZNK4java3wma20ServerConnectionBase6getUriEv @ 21 NONAME
+	_ZNK4java3wma20ServerConnectionBase9getFilterEv @ 22 NONAME
+	_ZTI26SmsServerConnectionFactory @ 23 NONAME
+	_ZTIN4java3wma19SmsServerConnectionE @ 24 NONAME
+	_ZTIN4java3wma20ServerConnectionBaseE @ 25 NONAME
+	_ZTV26SmsServerConnectionFactory @ 26 NONAME
+	_ZTVN4java3wma19SmsServerConnectionE @ 27 NONAME
+	_ZTVN4java3wma20ServerConnectionBaseE @ 28 NONAME
+	_ZThn28_N4java3wma19SmsServerConnection15retrieveMessageER8TPckgBufI22TJavaMessageParametersE @ 29 NONAME
+	_ZThn28_N4java3wma19SmsServerConnection4openEPNS_4push18ConnectionListenerE @ 30 NONAME
+	_ZThn28_N4java3wma19SmsServerConnection4openEPNS_4push18ConnectionListenerEb @ 31 NONAME
+	_ZThn28_N4java3wma19SmsServerConnection5closeEv @ 32 NONAME
+	_ZThn28_N4java3wma19SmsServerConnectionD0Ev @ 33 NONAME
+	_ZThn28_N4java3wma19SmsServerConnectionD1Ev @ 34 NONAME
 
+
--- a/javaextensions/wma/sms_cbs/pushplugin/sms/src.s60/smsserverconnection.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaextensions/wma/sms_cbs/pushplugin/sms/src.s60/smsserverconnection.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -72,7 +72,7 @@
     delete mOpenMonitor;
 }
 
-void SmsServerConnection::open(ConnectionListener* aListener,
+OS_EXPORT void SmsServerConnection::open(ConnectionListener* aListener,
                                bool aIsAppLaunched)
 {
     JELOG2(EWMA);
@@ -299,7 +299,7 @@
 }
 
 
-void SmsServerConnection::close()
+OS_EXPORT void SmsServerConnection::close()
 {
     JELOG2(EWMA);
     // the close and RunL are synchronized to make it SMP safe.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/build/bwins/javacaptain_ext_autostarteru.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?findDllMethod@@YAP6APAXXZPBD@Z @ 1 NONAME ; void * (*)(void) findDllMethod(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/build/eabi/javacaptain_ext_autostarteru.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z13findDllMethodPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/build/javacaptain_ext_autostarter.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,26 @@
+#
+# 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: autostarter is plugin for Java Captain that starts auto start
+#   MIDlets
+#
+
+TEMPLATE=lib
+TARGET=javacaptain_ext_autostarter
+CONFIG += omj stl
+CONFIG -= qt
+
+
+LIBS += -ljavacomms -ljavastorage
+
+include(../../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/inc/autostarter.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:  autostarter is Java Captain Symbian plugin that starts
+*               auto start Java applications after they have been installed
+*               and when the device boots.
+*
+*/
+
+#ifndef AUTOSTARTER_H
+#define AUTOSTARTER_H
+
+#include "javaosheaders.h"
+
+#include "eventconsumerinterface.h"
+#include "extensionplugininterface.h"
+
+namespace java
+{
+
+namespace captain
+{
+
+class CoreInterface;
+
+OS_NONSHARABLE_CLASS(AutoStarter) :  public EventConsumerInterface,
+        public ExtensionPluginInterface
+{
+public:
+    AutoStarter();
+    virtual ~AutoStarter();
+
+    // PluginInterface
+    virtual void startPlugin(CoreInterface* aCore);
+    virtual void stopPlugin();
+
+    // EventConsumerInterface
+    virtual void event(const std::string& eventProvider,
+                       java::comms::CommsMessage& aMsg);
+
+    // ExtensionPluginInterface methods
+    virtual EventConsumerInterface* getEventConsumer();
+
+private:
+    bool startMIDletL(const std::wstring& aUid);
+    void checkMIDletsToBeStartedL();
+
+    CoreInterface* mCore;
+};
+
+} // namespace captain
+} // namespace java
+
+#endif // AUTOSTARTER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/src.s60/autostarter.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,263 @@
+/*
+* 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:  autostarter is Java Captain Symbian plugin that starts
+*               auto start Java applications after they have been installed
+*               and when the device boots.
+*
+*/
+
+#include <e32base.h>
+#include <f32file.h>
+#include <javastorage.h>
+#include <javastorageentry.h>
+#include <javastoragenames.h>
+#include <memory>
+
+#include "commsendpoint.h"
+#include "coreinterface.h"
+#include "javaprocessconstants.h"
+#include "javasymbianoslayer.h"
+#include "javauids.h"
+#include "logger.h"
+#include "preinstallerstartermessages.h"
+#include "rtcinterface.h"
+#include "rtcmessages.h"
+
+#include "autostarter.h"
+
+
+using namespace java::storage;
+using namespace java::util;
+
+
+/**
+ * Return pointer to ExtensionPluginInterface implementation for this
+ * extension dll
+ */
+java::captain::ExtensionPluginInterface* getExtensionPlugin()
+{
+    return new java::captain::AutoStarter();
+}
+
+namespace java
+{
+namespace captain
+{
+
+/**
+ * Empty contructor
+ */
+AutoStarter::AutoStarter() : mCore(0)
+{
+}
+
+/**
+ * Empty destructor
+ */
+AutoStarter::~AutoStarter()
+{
+}
+
+/**
+ * Implement PluginInterface method
+ */
+void AutoStarter::startPlugin(CoreInterface* core)
+{
+    LOG(EJavaCaptain, EInfo, "AutoStarter plugin started");
+
+    mCore = core;
+}
+
+/**
+ * Implement PluginInterface method
+ */
+void AutoStarter::stopPlugin()
+{
+    mCore = 0;
+}
+
+/**
+ * Implement ExtensionPluginInterface method
+ */
+EventConsumerInterface* AutoStarter::getEventConsumer()
+{
+    return this;
+}
+
+/**
+ * Handle Java Captain events sent by Boot event provider or
+ * preinstaller starter
+ *
+ * Implement EventConsumerInterface method
+ */
+void AutoStarter::event(const std::string& eventProvider,
+                       java::comms::CommsMessage& aMsg)
+{
+    LOG1(EJavaCaptain, EInfo, "AutoStarter::event received, id %d", aMsg.getMessageId());
+
+    if (eventProvider == PREINSTALLER_EVENT_PROVIDER)
+    {
+        int exitStatus = 0;
+        getPreinstallerExitedMessageParams(aMsg, exitStatus);
+        LOG1(
+            EJavaCaptain,
+            EInfo,
+            "AutoStarter::event() preinstaller exited event received (status=%d)",
+            exitStatus);
+
+            // Start auto-start MIDlets
+            TRAPD(err, checkMIDletsToBeStartedL())
+            if (KErrNone != err)
+            {
+                ELOG1(EJavaCaptain, "AutoStarter::checkMIDletsToBeStartedL: leaved (%d)", err);
+            }
+    }
+/*
+    else if ( MESSAGE TELLS THAT NEW MIDLET HAS BEEN INSTALLED )
+    {
+        // Auto-start the new MIDlet if it is auto-start MIDlet
+    }
+*/
+
+}
+
+/**
+ *
+ *
+ */
+void AutoStarter::checkMIDletsToBeStartedL()
+{
+
+
+    // Find all MIDlets with Nokia-MIDlet-auto-start
+    // APPLICATION_TABLE, if (AUTORUN == AUTOSTART_TRUE) || (AUTORUN == AUTOSTART_ONCE),
+    // call startMIDletL(ID)
+
+    LOG(EJavaCaptain, EInfo, "AutoStarter::checkMIDletsToBeStartedL called");
+
+    std::auto_ptr<JavaStorage> js(JavaStorage::createInstance());    
+    try
+    {
+        js->open(JAVA_DATABASE_NAME);
+
+        // In Java Storage there is 'APPLICATION_TABLE' table that contains
+        // the Uid of the application in ID column. The value in column AUTORUN is
+        // one of the following AUTOSTART_FALSE (0), AUTOSTART_TRUE (1) or
+        // AUTOSTART_ONCE (2)
+
+        JavaStorageEntry attribute;
+        JavaStorageApplicationEntry_t findPattern;
+        JavaStorageApplicationList_t  foundEntries;
+
+        // Get all IDs from APPLICATION_TABLE where AUTORUN is AUTOSTART_TRUE
+        attribute.setEntry(AUTORUN, L"1");
+        findPattern.insert(attribute);
+        attribute.setEntry(ID, L"");
+        findPattern.insert(attribute);
+
+        js->search(APPLICATION_TABLE, findPattern, foundEntries);
+        findPattern.clear();
+
+        // Iterate through all found applications
+        JavaStorageApplicationList_t::const_iterator appIterator;
+        for (appIterator = foundEntries.begin(); appIterator != foundEntries.end(); ++appIterator)
+        {
+            std::wstring applicationId = appIterator->begin()->entryValue();
+
+            LOG1WSTR(EJavaCaptain, EInfo,
+                "AutoStarter::checkMIDletsToBeStartedL : going to start MIDlet, uid is %s",
+                applicationId);
+
+            startMIDletL(applicationId);
+        }
+        foundEntries.clear();
+
+
+        // Get all IDs from APPLICATION_TABLE where AUTORUN is AUTOSTART_ONCE
+        attribute.setEntry(AUTORUN, L"2");
+        findPattern.insert(attribute);
+        attribute.setEntry(ID, L"");
+        findPattern.insert(attribute);
+
+        js->search(APPLICATION_TABLE, findPattern, foundEntries);
+        findPattern.clear();
+
+        // Iterate through all found applications
+        for (appIterator = foundEntries.begin(); appIterator != foundEntries.end(); ++appIterator)
+        {
+            std::wstring applicationId = appIterator->begin()->entryValue();
+
+            LOG1WSTR(EJavaCaptain, EInfo,
+                "AutoStarter::checkMIDletsToBeStartedL : going to start MIDlet (once), uid is %s",
+                applicationId);
+
+            if (startMIDletL(applicationId))
+            {
+                // after starting MIDlet must set AUTORUN value to AUTOSTART_FALSE
+                JavaStorageApplicationEntry_t matchEntries;
+
+                JavaStorageApplicationEntry_t updateEntries;
+                JavaStorageEntry attribute;
+
+                attribute.setEntry(ID, applicationId);
+                matchEntries.insert(attribute);
+
+                attribute.setEntry(AUTORUN, L"0");
+                updateEntries.insert(attribute);
+
+                js->update(APPLICATION_TABLE, updateEntries, matchEntries);
+            }
+        }
+        foundEntries.clear();
+    }
+    catch (JavaStorageException& e)
+    {
+        ELOG1(EJavaCaptain,
+            "AutoStarter::checkMIDletsToBeStartedL: Java Storage exception %s", e.what());
+    }
+
+    try
+    {
+        js->close();
+    }
+    catch (JavaStorageException& e2)
+    {
+        WLOG1(EJavaCaptain,
+            "AutoStarter::checkMIDletsToBeStartedL: Java Storage exception "
+            "when closing storage %s", e2.what());
+    }
+}
+
+
+/**
+ *
+ *  @return true if launch succeeded, false is starting failed
+ */
+bool AutoStarter::startMIDletL(const std::wstring& aUid)
+{
+    // start MIDlet
+    rtcLaunchInfo launchInfo(aUid);
+
+    bool launchSuccess = mCore->getRtc()->launch(launchInfo);
+    if (!launchSuccess)
+    {
+        ELOG(EJavaCaptain, "AutoStarter::startMIDletL: launching MIDlet failed");
+    }
+
+    return launchSuccess;
+}
+
+
+} // namespace captain
+} // namespace java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/autostarter/src.s60/lookup.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,45 @@
+/*
+* 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:  lookup
+*
+*/
+
+#include <string> //For strcmp
+
+#include "javasymbianoslayer.h"
+#include "logger.h"
+
+#include "extensionplugininterface.h"
+
+using namespace java::captain;
+
+ExtensionPluginInterface* getExtensionPlugin();
+
+EXPORT_C FuncPtr findDllMethod(const char* funcName)
+{
+    FuncPtr ptr = 0;
+    if (funcName)
+    {
+        if (strcmp(funcName, "getExtensionPlugin") == 0)
+        {
+            ptr = (FuncPtr)getExtensionPlugin;
+        }
+    }
+    else
+    {
+        ELOG(EJavaCaptain,
+             "scrupdater extensionplugin findDllMethod() funcName == null");
+    }
+    return ptr;
+}
--- a/javamanager/javacaptain/extensionplugins/config/src/configextensionplugin.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javacaptain/extensionplugins/config/src/configextensionplugin.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -74,6 +74,9 @@
 #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
     mCore->loadExtensionPlugin("scrupdater");
 #endif // SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+    // This plugin implements support for auto-starting 
+    // Java applications
+    mCore->loadExtensionPlugin("autostarter");
 #endif // __SYMBIAN32__
     mCore->loadExtensionPlugin("boot");
     mCore->loadExtensionPlugin("mmc");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/preinstallerstarter/build/exports.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* 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: 
+*
+*/
+
+PRJ_EXPORTS
+../inc/preinstallerstartermessages.h    |../../../../../inc/preinstallerstartermessages.h
--- a/javamanager/javacaptain/extensionplugins/preinstallerstarter/inc/preinstallerstarter.h	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javacaptain/extensionplugins/preinstallerstarter/inc/preinstallerstarter.h	Fri Jun 11 13:33:44 2010 +0300
@@ -33,7 +33,8 @@
 
 class CoreInterface;
 
-OS_NONSHARABLE_CLASS(PreinstallerStarter) :  public EventConsumerInterface,
+OS_NONSHARABLE_CLASS(PreinstallerStarter) :  public CActive,
+        public EventConsumerInterface,
         public ExtensionPluginInterface
 {
 public:
@@ -51,11 +52,17 @@
     // ExtensionPluginInterface methods
     virtual EventConsumerInterface* getEventConsumer();
 
+protected:
+    // CActive
+    virtual void RunL();
+    virtual void DoCancel();
+
 private:
     void startPreinstaller(TBool aIadBoot);
     void registerMidletApplicationTypeHandler();
 
     CoreInterface* mCore;
+    RProcess*      mPreinstaller;
 };
 
 } // namespace captain
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/extensionplugins/preinstallerstarter/inc/preinstallerstartermessages.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:  PreinstallerStarterMessages
+*
+*/
+
+#ifndef PREINSTALLERSTARTERMESSAGES_H
+#define PREINSTALLERSTARTERMESSAGES_H
+
+#include "logger.h"
+#include "commsmessage.h"
+
+namespace java
+{
+namespace captain
+{
+
+using namespace java::util;
+using namespace java::comms;
+
+// This event is sent when preinstaller process has exited
+const int PREINSTALLER_EVENT_MESSAGE_ID_EXITED_C = 30;
+
+const char PREINSTALLER_EVENT_PROVIDER[] = "preinstaller";
+
+
+inline void setPreinstallerExitedMessageParams(CommsMessage& aMessage, const int& aExitStatus)
+{
+    aMessage.setMessageId(PREINSTALLER_EVENT_MESSAGE_ID_EXITED_C);
+    aMessage << aExitStatus;
+}
+
+inline void getPreinstallerExitedMessageParams(CommsMessage& aMessage, int& aExitStatus)
+{
+    if (aMessage.getMessageId() == PREINSTALLER_EVENT_MESSAGE_ID_EXITED_C)
+    {
+        aMessage >> aExitStatus;
+    }
+    else
+    {
+        ELOG2(EJavaCaptain, "wrong MessageId!: %d should be %d",
+              aMessage.getMessageId(), PREINSTALLER_EVENT_MESSAGE_ID_EXITED_C);
+        aExitStatus = 0;
+    }
+}
+
+
+} // namespace captain
+} // namespace java
+
+#endif // PREINSTALLERSTARTERMESSAGES_H
--- a/javamanager/javacaptain/extensionplugins/preinstallerstarter/src.s60/preinstallerstarter.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javacaptain/extensionplugins/preinstallerstarter/src.s60/preinstallerstarter.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008 - 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"
@@ -31,6 +31,7 @@
 #include "coreinterface.h"
 #include "booteventprovidermessages.h"
 #include "mmceventprovidermessages.h"
+#include "preinstallerstartermessages.h"
 
 #include "preinstallerstarter.h"
 
@@ -52,19 +53,19 @@
 using java::fileutils::DriveListenerInterface;
 
 /**
- * Empty contructor
+ * Initialize member varaibles in constructor
  */
-PreinstallerStarter::PreinstallerStarter() : mCore(0)
+PreinstallerStarter::PreinstallerStarter() :
+    CActive(EPriorityStandard), mCore(0), mPreinstaller(0)
 {
-    JELOG2(EJavaCaptain);
 }
 
 /**
- * Empty destructor
+ * Destructor
  */
 PreinstallerStarter::~PreinstallerStarter()
 {
-    JELOG2(EJavaCaptain);
+    DoCancel();
 }
 
 /**
@@ -72,8 +73,8 @@
  */
 void PreinstallerStarter::startPlugin(CoreInterface* core)
 {
-    JELOG2(EJavaCaptain);
     mCore = core;
+    CActiveScheduler::Add(this);
 }
 
 /**
@@ -81,7 +82,6 @@
  */
 void PreinstallerStarter::stopPlugin()
 {
-    JELOG2(EJavaCaptain);
     mCore = 0;
 }
 
@@ -90,7 +90,6 @@
  */
 EventConsumerInterface* PreinstallerStarter::getEventConsumer()
 {
-    JELOG2(EJavaCaptain);
     return this;
 }
 
@@ -106,7 +105,6 @@
 void PreinstallerStarter::event(const std::string& eventProvider,
                                 java::comms::CommsMessage& aMsg)
 {
-    JELOG2(EJavaCaptain);
     if (eventProvider == BOOT_EVENT_PROVIDER)
     {
         int bootType = NORMAL_BOOT_C;
@@ -133,7 +131,9 @@
         case FIRST_DEVICE_BOOT_C:
         case NORMAL_BOOT_C:
         {
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
             registerMidletApplicationTypeHandler();
+#endif
 
             // Start preinstaller normally (without 'iad' option).
             startPreinstaller(EFalse);
@@ -183,8 +183,6 @@
  */
 void PreinstallerStarter::startPreinstaller(TBool aIadBoot)
 {
-    JELOG2(EJavaCaptain);
-
     // Check that the device has enough free memory (800kB) to start preinstaller process
     // and (if needed) also java installer
     TInt freeMemory = 0;
@@ -276,17 +274,21 @@
         }
 
         // start preinstaller
-        RProcess preinstaller;
+        mPreinstaller = new RProcess();
         TBuf<64> preinstallerProcess;  // Actual len of the process name is 9
         len = strlen(java::runtime::JAVA_PROCESS);
         TPtr8 ptr8Process((TUint8 *)java::runtime::JAVA_PROCESS, len, len);
         preinstallerProcess.Copy(ptr8Process);
-        TInt err = preinstaller.Create(preinstallerProcess, commandLine);
+        TInt err = mPreinstaller->Create(preinstallerProcess, commandLine);
         if (KErrNone == err)
         {
-            // process has been created, allow it to run
-            preinstaller.Resume();
-            preinstaller.Close();
+            // Process has been created.
+
+            // This active object will be activated when preinstaller process exits
+            mPreinstaller->Logon(iStatus);
+
+            // Allow the process to run
+            mPreinstaller->Resume();
             if (aIadBoot)
             {
                 LOG(
@@ -298,9 +300,14 @@
             {
                 LOG(EJavaCaptain, EInfo, "PreinstallerStarter: started preinstaller");
             }
+
+            SetActive();
         }
         else
         {
+            delete mPreinstaller;
+            mPreinstaller = 0;
+
             ELOG1(
                 EJavaCaptain,
                 "PreinstallerStarter: starting preinstaller failed, err %d",
@@ -375,5 +382,35 @@
     }
 }
 
+void PreinstallerStarter::RunL()
+{
+    LOG(EJavaCaptain, EInfo, "PreinstallerStarter::RunL started");
+
+    // Send event to AutoStarter plugin, done only once
+    CommsMessage eventMsg;
+    setPreinstallerExitedMessageParams(eventMsg, iStatus.Int());
+    mCore->getEventDispatcher()->event(PREINSTALLER_EVENT_PROVIDER, eventMsg);
+
+    // process handle is no longer needed
+    mPreinstaller->Close();
+    delete mPreinstaller;
+    mPreinstaller = 0;
+}
+
+
+void PreinstallerStarter::DoCancel()
+{
+    if (mPreinstaller)
+    {
+        mPreinstaller->LogonCancel(iStatus);
+        // Because exit notification request has been canceled,
+        // there is no reason to keep the process handle open.
+        mPreinstaller->Close();
+        delete mPreinstaller;
+        mPreinstaller = 0;
+    }
+}
+
+
 } // namespace captain
 } // namespace java
--- a/javamanager/javacaptain/javacaptain.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javacaptain/javacaptain.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -19,5 +19,6 @@
 SUBDIRS += extensionplugins/javacertstore/build/javacaptain_ext_javacertstore.pro 
 SUBDIRS += extensionplugins/storageserver/build/javacaptain_ext_storageserverplugin.pro 
 SUBDIRS += extensionplugins/preinstallerstarter/build/javacaptain_ext_preinstallerstarter.pro 
+SUBDIRS += extensionplugins/autostarter/build/javacaptain_ext_autostarter.pro 
 SUBDIRS += extensionplugins/scrupdater/build/javacaptain_ext_scrupdater.pro 
 BLD_INF_RULES.prj_extensions += "prj_extensions" 
--- a/javamanager/javacaptain/subsystem.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javacaptain/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -35,6 +35,7 @@
 endif
 
 COMPONENTS += extensionplugins/preinstallerstarter/build
+COMPONENTS += extensionplugins/autostarter/build
 ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 COMPONENTS += extensionplugins/scrupdater/build
 endif
--- a/javamanager/javainstaller/appinstuiplugin/src/javainstalllauncher.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/appinstuiplugin/src/javainstalllauncher.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -619,7 +619,7 @@
     // Open UI env and resource file.
     if (!iEik)
     {
-        iEik = CEikonEnv::Static();
+        iEik = CEikonEnv::Static();  // codescanner::eikonenvstatic
     }
     if (!iEik)
     {
--- a/javamanager/javainstaller/installer/build/exports.inf	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/build/exports.inf	Fri Jun 11 13:33:44 2010 +0300
@@ -27,11 +27,12 @@
 ../data/inst_plugins.cfg   /epoc32/data/z/private/102033E6/installer/inst_plugins.cfg
 
 
-// Generic configuration interface for javainstaller cenrep settings
-// javainstaller_102824CE implementation specifics for cenrep data
+// Configuration interface for javainstaller 
 #ifdef RD_JAVA_S60_RELEASE_10_1_ONWARDS 
+// Public configuration interface is named as CI_javainstaller.confml
+// and it is located outside of jrt package. The name of private
+// configuration interface is javainstaller2.confml.
 ../conf/javainstaller2.confml         APP_LAYER_CONFML(javainstaller.confml)
-../conf/CI_javainstaller.confml       APP_LAYER_CONFML(CI_javainstaller.confml)
 #else
 ../conf/javainstaller.confml          APP_LAYER_CONFML(javainstaller.confml)
 #endif /* RD_JAVA_S60_RELEASE_10_1_ONWARDS */
--- a/javamanager/javainstaller/installer/build/javainstaller.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/build/javainstaller.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -60,7 +60,8 @@
     }
 
     contains(PROJECT_DEFINES,RD_JAVA_S60_RELEASE_10_1_ONWARDS) {
-        LIBS += -lQtServiceFramework
+        CONFIG += hb
+        LIBS += -lxqservice
     }
 
     contains(PROJECT_DEFINES,RD_JAVA_USIF_NOTIFY_PROGRESS) {
Binary file javamanager/javainstaller/installer/conf/CI_javainstaller.confml has changed
--- a/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifNotifier.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifNotifier.java	Fri Jun 11 13:33:44 2010 +0300
@@ -41,6 +41,8 @@
     public static final int SUB_OP_OCSP = 2;
     /** Download phase during installation. */
     public static final int SUB_OP_DOWNLOAD = 3;
+    /** Maximum progress notification value. */
+    private static final int MAX_PROGRESS = 100;
 
     /** Operation being notified. */
     private int iOperation = 0;
@@ -62,6 +64,8 @@
     /** Sending progress notifications is only allowed between start
      *  and end notifications. */
     private boolean iNotifyProgressAllowed = false;
+    /** Value of the last progress notification that has been sent. */
+    private int iLastProgressSent = 0;
 
     /** Native object handle. */
     private int iHandle = 0;
@@ -119,6 +123,10 @@
             InstallerException.internalError(
                 "Notifying SIF start failed with code " + ret);
         }
+        else
+        {
+            Log.log("SifNotifier.notifyStart: " + getInfoString());
+        }
         iNotifyProgressAllowed = true;
     }
 
@@ -135,21 +143,34 @@
             InstallerException.internalError(
                 "SifNotifier.notifyEnd: notifier has not been initialized");
         }
+        if (aErrCategory == 0 && iLastProgressSent < MAX_PROGRESS)
+        {
+            // Before sending end notification, update progress to max if
+            // operation was successful and max progress notification has
+            // not yet been sent.
+            notifyProgress(SUB_OP_NO, MAX_PROGRESS, MAX_PROGRESS);
+        }
+        // No more progress notifications allowed.
         iNotifyProgressAllowed = false;
         int ret = _notifyEnd(
                       iHandle, iGlobalComponentId, aErrCategory, aErrCode,
                       aErrMsg, aErrMsgDetails);
+        String logMsg =
+            "ErrCategory: " + aErrCategory +
+            ", ErrCode: " + aErrCode +
+            ", ErrMsg: " + aErrMsg +
+            ", ErrMsgDetails: " + aErrMsgDetails;
         if (ret < 0)
         {
             Log.logError("Notifying SIF end failed with code " + ret +
-                         ", " + getInfoString() +
-                         ", ErrCategory: " + aErrCategory +
-                         ", ErrCode: " + aErrCode +
-                         ", ErrMsg: " + aErrMsg +
-                         ", ErrMsgDetails: " + aErrMsgDetails);
+                         ", " + getInfoString() + ", " + logMsg);
             InstallerException.internalError(
                 "Notifying SIF end failed with code " + ret);
         }
+        else
+        {
+            Log.log("SifNotifier.notifyEnd: " + logMsg);
+        }
     }
 
     /**
@@ -168,19 +189,28 @@
             InstallerException.internalError(
                 "SifNotifier.notifyProgress: notifier has not been initialized");
         }
+        if (aSubOperation == SUB_OP_NO)
+        {
+            iLastProgressSent = aCurrent;
+        }
         int ret = _notifyProgress(
                       iHandle, iGlobalComponentId, iOperation, aSubOperation,
                       aCurrent, aTotal);
+        String logMsg =
+            "SubOp: " + aSubOperation +
+            ", Current: " + aCurrent +
+            ", Total: " + aTotal;
         if (ret < 0)
         {
             Log.logError("Notifying SIF progress failed with code " + ret +
-                         ", " + getInfoString() +
-                         ", SubOp: " + aSubOperation +
-                         ", Current: " + aCurrent +
-                         ", Total: " + aTotal);
+                         ", " + getInfoString() + ", " + logMsg);
             InstallerException.internalError(
                 "Notifying SIF progress failed with code " + ret);
         }
+        else
+        {
+            Log.log("SifNotifier.notifyProgress: " + logMsg);
+        }
     }
 
     /**
@@ -202,6 +232,10 @@
             InstallerException.internalError(
                 "Destroying SIF notifier failed with code " + ret);
         }
+        else
+        {
+            Log.log("SifNotifier destroyed");
+        }
         iHandle = 0;
     }
 
@@ -221,6 +255,10 @@
             InstallerException.internalError(
                 "Initializing SifNotifier failed with code " + ret);
         }
+        else
+        {
+            Log.log("SifNotifier created");
+        }
         iHandle = ret;
     }
 
@@ -235,11 +273,31 @@
         buf.append("Operation: ").append(iOperation);
         buf.append(", GlobalComponentId: ").append(iGlobalComponentId);
         buf.append(", ComponentName: ").append(iComponentName);
-        for (int i = 0; i < iApplicationNames.length; i++)
+        if (iApplicationNames != null)
         {
-            buf.append(", ApplicationName: ").append(iApplicationNames[i]);
+            for (int i = 0; i < iApplicationNames.length; i++)
+            {
+                buf.append(", ApplicationName[").append(i).append("]: ")
+                    .append(iApplicationNames[i]);
+            }
+        }
+        if (iApplicationIcons != null)
+        {
+            for (int i = 0; i < iApplicationIcons.length; i++)
+            {
+                buf.append(", ApplicationIcon[").append(i).append("]: ")
+                    .append(iApplicationIcons[i]);
+            }
         }
         buf.append(", ComponentSize: ").append(iComponentSize);
+        if (iIconDir != null)
+        {
+            buf.append(", IconDir: ").append(iIconDir);
+        }
+        if (iComponentIcon != null)
+        {
+            buf.append(", ComponentIcon: ").append(iComponentIcon);
+        }
         return buf.toString();
     }
 
--- a/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifRegistrator.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/applicationregistrator/SifRegistrator.java	Fri Jun 11 13:33:44 2010 +0300
@@ -25,7 +25,6 @@
 import com.nokia.mj.impl.installer.utils.FileUtils;
 import com.nokia.mj.impl.installer.utils.Log;
 import com.nokia.mj.impl.installer.utils.PlatformUid;
-import com.nokia.mj.impl.rt.installer.ApplicationInfoImpl;
 import com.nokia.mj.impl.utils.Attribute;
 import com.nokia.mj.impl.utils.Uid;
 
@@ -129,27 +128,6 @@
     }
 
     /**
-     * Registers or unregisters Java software type to software
-     * installation framework.
-     *
-     * @param aRegister true for registration, false for unregistration
-     */
-    public static void registerJavaSoftwareType(boolean aRegister)
-    {
-        String op = (aRegister? "Register": "Unregister");
-        int err = _registerJavaSoftwareType(aRegister);
-        if (err < 0)
-        {
-            InstallerException.internalError(
-                op + " Java software type failed with code " + err);
-        }
-        else
-        {
-            Log.log("SifRegistrator " + op + "ed Java software type");
-        }
-    }
-
-    /**
      * Starts application registration session.
      * The registrations and unregistrations are done only
      * when commitSession is called.
@@ -690,15 +668,20 @@
     private static String[] getComponentFiles(SuiteInfo aSuite)
     {
         Vector componentFiles = new Vector();
-        String path = aSuite.getJadPath();
-        if (path != null)
+        if (!aSuite.isPreinstalled())
         {
-            componentFiles.addElement(getScrString(path));
-        }
-        path = aSuite.getJarPath();
-        if (path != null)
-        {
-            componentFiles.addElement(getScrString(path));
+            // Add component jad and jar files only when the
+            // application is not preinstalled.
+            String path = aSuite.getJadPath();
+            if (path != null)
+            {
+                componentFiles.addElement(getScrString(path));
+            }
+            path = aSuite.getJarPath();
+            if (path != null)
+            {
+                componentFiles.addElement(getScrString(path));
+            }
         }
         boolean addRootPath = true;
         int rootDrive = FileUtils.getDrive(aSuite.getRootDir());
@@ -716,10 +699,15 @@
         }
         if (addRootPath)
         {
-            componentFiles.addElement(getScrString(aSuite.getRootDir()));
+            componentFiles.addElement(
+                getScrString(aSuite.getRootDir() + "nofile.txt"));
         }
         String[] result = new String[componentFiles.size()];
         componentFiles.copyInto(result);
+        for (int i = 0; i < result.length; i++)
+        {
+            Log.log("SifRegistrator componentFiles[" + i + "]: " + result[i]);
+        }
         return result;
     }
 
@@ -826,21 +814,58 @@
         }
 
         // Register Domain-Category property.
-        ApplicationInfoImpl appInfoImpl = (ApplicationInfoImpl)
-                                          com.nokia.mj.impl.rt.support.ApplicationInfo.getInstance();
-        String domainCategory = appInfoImpl.getProtectionDomain();
-        err = _setLocalizedComponentProperty(
-                  iSessionHandle, cid, "Domain-Category",
-                  domainCategory, UNSPECIFIED_LOCALE);
-        if (err < 0)
+        String protectionDomainProperty = "Domain-Category";
+        String protectionDomainName = aSuite.getProtectionDomainName();
+        if (protectionDomainName != null)
+        {
+            err = _setLocalizedComponentProperty(
+                iSessionHandle, cid, protectionDomainProperty,
+                getProtectionDomainPropertyValue(protectionDomainName),
+                UNSPECIFIED_LOCALE);
+            if (err < 0)
+            {
+                InstallerException.internalError(
+                    "Adding property " + protectionDomainProperty +
+                    " value " + protectionDomainName + " for component " +
+                    cid + " failed with code " + err);
+            }
+        }
+        else
         {
-            InstallerException.internalError(
-                "Adding property Domain-Category value " + domainCategory +
-                " for component " + cid + " failed with code " + err);
+            Log.logWarning(
+                "SifRegistrator.registerLocalizedProperties: " +
+                protectionDomainProperty + " not set");
         }
     }
 
     /**
+     * Returns the "Domain-Category" property value which contains
+     * the text id and text file name for the localized domain category
+     * text.
+     */
+    private String getProtectionDomainPropertyValue(String aProtectionDomain)
+    {
+        String textId = null;
+        if (aProtectionDomain.equals("Manufacturer"))
+        {
+            textId = "txt_java_inst_setlabel_cert_domain_val_manufacturer";
+        }
+        else if (aProtectionDomain.equals("Operator"))
+        {
+            textId = "txt_java_inst_setlabel_cert_domain_val_operator";
+        }
+        else if (aProtectionDomain.equals("IdentifiedThirdParty"))
+        {
+            textId = "txt_java_inst_setlabel_cert_domain_val_trusted_third_party";
+        }
+        else if (aProtectionDomain.equals("UnidentifiedThirdParty"))
+        {
+            textId = "txt_java_inst_setlabel_cert_domain_val_untrusted_third_party";
+        }
+        return textId + ",javaapplicationinstaller";
+    }
+
+    /**
      * Returns array of localized names from the specified
      * attributes of given suite. Assumes that aAttrPrefix
      * is an attribute name prefix that is followed by locale.
@@ -949,14 +974,6 @@
     private static native int _launchAppView();
 
     /**
-     * Registers Java software type to software installation framework.
-     *
-     * @param aRegister true for registration, false for unregistration
-     * @return 0 or Symbian error code (negative number)
-     */
-    private static native int _registerJavaSoftwareType(boolean aRegister);
-
-    /**
      * Starts native application registration session.
      *
      * @param aTransaction true if also transaction for this session should
--- a/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/utils/SysUtil.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc.s60/com/nokia/mj/impl/installer/utils/SysUtil.java	Fri Jun 11 13:33:44 2010 +0300
@@ -441,6 +441,44 @@
         return ret;
     }
 
+    /**
+     * Maps given ISO language/country code to Symbian TLanguage.
+     *
+     * @param aLocale ISO language/country code
+     * @return Symbian TLanguage value, or -1 if no matching language is found.
+     */
+    public static int isoToLang(String aLocale)
+    {
+        // Replace possible dash with underscore.
+        aLocale = aLocale.replace('-', '_');
+        // Get language and country parts.
+        String lang = aLocale.toLowerCase();
+        String country = null;
+        int sepIndex = aLocale.indexOf("_");
+        if (sepIndex >= 0)
+        {
+            lang = aLocale.substring(0, sepIndex).toLowerCase();
+            country = aLocale.substring(sepIndex + 1).toUpperCase();
+        }
+        // Map locale to Symbian TLanguage using native service.
+        int result = -1;
+        if (country == null)
+        {
+            result = _isoToLang(lang);
+        }
+        else
+        {
+            result = _isoToLang(lang + "_" + country);
+            if (result == -1)
+            {
+                // No result for language and country, try using language only.
+                result = _isoToLang(lang);
+            }
+        }
+        //Log.log("SysUtil.isoToLang: " + aLocale + " ==> " + result);
+        return result;
+    }
+
     /*** ---------------------------- PROTECTED --------------------------- */
     /*** ----------------------------- PACKAGE ---------------------------- */
     /*** ----------------------------- PRIVATE ---------------------------- */
@@ -648,6 +686,14 @@
     private static native int _getScreenHeight();
 
     /**
+     * Maps given ISO language/country code to Symbian TLanguage.
+     *
+     * @param aLocale ISO language/country code
+     * @return Symbian TLanguage value, or -1 if no matching language is found.
+     */
+    private static native int _isoToLang(String aLocale);
+
+    /**
      * Class for holding return value from native side.
      */
     private static class IntValue
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/InstallationNotifier.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/InstallationNotifier.java	Fri Jun 11 13:33:44 2010 +0300
@@ -278,8 +278,6 @@
             }
             if (iSifNotifier != null)
             {
-                Log.log("InstallationNotifier.set: update SifNotifier to " +
-                        currentPercentage);
                 try
                 {
                     iSifNotifier.notifyProgress(
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/Installer.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/Installer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -336,7 +336,7 @@
 
         if (iThreadDumper != null)
         {
-            iThreadDumper.startTimer(10*60*1000); // 10 mins
+            iThreadDumper.startTimer(5*60*1000); // 5 mins
         }
 
         try
@@ -538,9 +538,9 @@
         table.add(new com.nokia.mj.impl.installer.midp2.install.steps.
                   GetFromStorage());
         table.add(new com.nokia.mj.impl.installer.midp2.install.steps.
-                  StartProgressNotifications());
+                  SelectUids()); // Select suite uid and application uids.
         table.add(new com.nokia.mj.impl.installer.midp2.install.steps.
-                  SelectUids()); // Select suite uid and application uids.
+                  StartProgressNotifications());
         table.add(new com.nokia.mj.impl.installer.midp2.install.steps.
                   AuthenticateJad()); // This must be the first security
         // related step.
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/DlListener.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/DlListener.java	Fri Jun 11 13:33:44 2010 +0300
@@ -81,8 +81,6 @@
         }
         if (iBall.iSifNotifier != null)
         {
-            Log.log("DlListener.set: update SifNotifier to " +
-                    aDlInfo.getCurrentSize() + " / " + aDlInfo.getTotalSize());
             try
             {
                 iBall.iSifNotifier.notifyProgress(
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/FinalizeInstallation.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/FinalizeInstallation.java	Fri Jun 11 13:33:44 2010 +0300
@@ -302,11 +302,11 @@
                     }
                 }
 
-                //if (ball.iSifRegistrator.getSifMode() > 0 && launchApp)
-                //{
-                //    ball.iSifRegistrator.launchAppView();
-                //}
-                //else
+                if (ball.iSifRegistrator.getSifMode() > 0 && launchApp)
+                {
+                    ball.iSifRegistrator.launchAppView();
+                }
+                else
                 if (ball.iCaptainMsgs && launchApp &&
                         launchAppInfo.getApplications() != null &&
                         launchAppInfo.getApplications().length > 0)
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/HandleCustomAttributes.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/HandleCustomAttributes.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-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"
@@ -23,10 +23,13 @@
 import com.nokia.mj.impl.installer.storagehandler.ApplicationInfo;
 import com.nokia.mj.impl.installer.storagehandler.SuiteInfo;
 import com.nokia.mj.impl.installer.utils.Log;
+import com.nokia.mj.impl.installer.utils.AutoStartPermission;
 import com.nokia.mj.impl.utils.InstallerDetailedErrorMessage;
 import com.nokia.mj.impl.utils.InstallerErrorMessage;
 import com.nokia.mj.impl.utils.OtaStatusCode;
 import com.nokia.mj.impl.utils.exception.InvalidAttributeException;
+import com.nokia.mj.impl.security.midp.authorization.AccessControllerFactoryImpl;
+import com.nokia.mj.impl.security.midp.authorization.AccessControllerImpl;
 
 import java.util.Vector;
 
@@ -98,18 +101,52 @@
         {
             String attrName = "Nokia-MIDlet-Auto-Start-" + i;
             String attrValue = aBall.getAttributeValue(attrName);
+
+            if (attrValue == null)
+            {
+                // Allow also this form of the name to be compatible with
+                // an existing implementation
+                attrName = "Nokia-MIDlet-auto-start-" + i;
+                attrValue = aBall.getAttributeValue(attrName);
+
+                if ((attrValue == null) && (i == 1))
+                {
+                    // Allow even this S40 format
+                    attrName = "Nokia-MIDlet-auto-start";
+                    attrValue = aBall.getAttributeValue(attrName);
+                }
+            }
+
             if (attrValue != null)
             {
                 if (apps.size() < i)
                 {
                     break;
                 }
-                if (attrValue.equalsIgnoreCase("false"))
+
+                // Check if MIDlet has permission for Auto-start
+                AccessControllerImpl accessControllerImpl =
+                    AccessControllerFactoryImpl.
+                    getAccessController(aBall.iStorageHandler.getSession(),
+                                        aBall.iSuite.getUid(),
+                                        aBall.iSuite.getName());
+                AutoStartPermission autoStartPermission = new AutoStartPermission();
+                if (!accessControllerImpl.isPermissionAllowed(
+                    autoStartPermission.toString()))
+                {
+                    Log.logWarning("Attribute " + attrName +
+                        " ignored due to insufficient permissions");
+                    break;
+                }
+
+                if (attrValue.equalsIgnoreCase("false") ||
+                    attrValue.equalsIgnoreCase("no"))
                 {
                     ((ApplicationInfo)apps.elementAt(i-1)).
                     setAutoStart(ApplicationInfo.AUTOSTART_FALSE);
                 }
-                else if (attrValue.equalsIgnoreCase("true"))
+                else if (attrValue.equalsIgnoreCase("true") ||
+                        attrValue.equalsIgnoreCase("yes"))
                 {
                     ((ApplicationInfo)apps.elementAt(i-1)).
                     setAutoStart(ApplicationInfo.AUTOSTART_TRUE);
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/OcspListener.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/OcspListener.java	Fri Jun 11 13:33:44 2010 +0300
@@ -78,7 +78,6 @@
             }
             if (iBall.iSifNotifier != null)
             {
-                Log.log("OcspListener.ocspEvent: update SifNotifier to 0 / 0");
                 try
                 {
                     iBall.iSifNotifier.notifyProgress(
@@ -109,7 +108,6 @@
                 }
                 if (iBall.iSifNotifier != null)
                 {
-                    Log.log("OcspListener.ocspEvent: update SifNotifier to 100 / 100");
                     try
                     {
                         iBall.iSifNotifier.notifyProgress(
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/RegisterApplicationToSif.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/RegisterApplicationToSif.java	Fri Jun 11 13:33:44 2010 +0300
@@ -40,11 +40,11 @@
             Log.log("Old suite unregistered from SIF");
         }
 
-        if (ball.iSourceUrl != null)
+        if (ball.iAuthenticationCredentials != null)
         {
-            // Save source URL to suite as jad URL which is
-            // registered to SIF as download URL.
-            ball.iSuite.setJadUrl(ball.iSourceUrl);
+            // Set protection domain name.
+            ball.iSuite.setProtectionDomainName(
+                ball.iAuthenticationCredentials[0].getProtectionDomainName());
         }
 
         // Initialize application installation group to SuiteInfo.
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/StartProgressNotifications.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/install/steps/StartProgressNotifications.java	Fri Jun 11 13:33:44 2010 +0300
@@ -100,8 +100,16 @@
         catch (Throwable t)
         {
             Log.logError("StartProgressNotifications: SifNotifier.notifyStart failed", t);
+            try
+            {
+                ball.iSifNotifier.destroy();
+            }
+            catch (Throwable t2)
+            {
+                Log.logError("StartProgressNotifications: SifNotifier.destroy failed", t2);
+            }
+            ball.iSifNotifier = null;
         }
-
         // Set SifNotifier for the listeners that should use it.
         ball.iInstallationNotifier.setSifNotifier(ball.iSifNotifier);
     }
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/uninstall/steps/StartProgressNotifications.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/midp2/uninstall/steps/StartProgressNotifications.java	Fri Jun 11 13:33:44 2010 +0300
@@ -91,8 +91,16 @@
         catch (Throwable t)
         {
             Log.logError("StartProgressNotifications: SifNotifier.notifyStart failed", t);
+            try
+            {
+                ball.iSifNotifier.destroy();
+            }
+            catch (Throwable t2)
+            {
+                Log.logError("StartProgressNotifications: SifNotifier.destroy failed", t2);
+            }
+            ball.iSifNotifier = null;
         }
-
         // Set SifNotifier for the listeners that should use it.
         ball.iInstallationNotifier.setSifNotifier(ball.iSifNotifier);
     }
--- a/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/storagehandler/SuiteInfo.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/storagehandler/SuiteInfo.java	Fri Jun 11 13:33:44 2010 +0300
@@ -80,6 +80,8 @@
     private String iConvertedIconPath = null;
     /** Application installation group. This member is not saved into storage. */
     private String iInstallationGroup = null;
+    /** Protection domain name. This member is not saved into storage. */
+    private String iProtectionDomainName = null;
 
     /**
      * Combined Jad and Manifest attributes. Key is attribute name,
@@ -521,6 +523,22 @@
     }
 
     /**
+     * Get protection domain name.
+     */
+    public String getProtectionDomainName()
+    {
+        return iProtectionDomainName;
+    }
+
+    /**
+     * Set protection domain name.
+     */
+    public void setProtectionDomainName(String aProtectionDomainName)
+    {
+        iProtectionDomainName = aProtectionDomainName;
+    }
+
+    /**
      * Set suite uid.
      *
      * @param aUid suite uid
@@ -740,6 +758,14 @@
     }
 
     /**
+     * Returns true if this application suite is preinstalled, false otherwise.
+     */
+    public boolean isPreinstalled()
+    {
+        return (iPreinstallState == STATE_PREINSTALLED);
+    }
+
+    /**
      * Set flag telling if application suite is preinstalled.
      *
      * @param aTrusted true if suite is preinstalled, false otherwise
@@ -842,6 +868,7 @@
         buf.append("  OnScreenKeypad: ").append(getOnScreenKeypad()).append("\n");
         buf.append("  ConvertedIcon: ").append(getConvertedIconPath()).append("\n");
         buf.append("  Group: ").append(getInstallationGroup()).append("\n");
+        buf.append("  Protection domain: ").append(getProtectionDomainName()).append("\n");
         if (iApplications != null)
         {
             buf.append("Applications:\n");
--- a/javamanager/javainstaller/installer/src.s60/applicationregistrator/applicationregistrator.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/applicationregistrator/applicationregistrator.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -129,7 +129,6 @@
         return err;
     }
 
-//#if 1
 #ifndef RD_JAVA_USIF_APP_REG
     // Delete any pending (un)registrations (possible if
     // e.g. device rebooted before commit).
@@ -169,7 +168,6 @@
  * @param[in] aBackground
  * @return 0 if registration succeeded or Symbian error code
  */
-//#if 0
 #ifdef RD_JAVA_USIF_APP_REG
 JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_ApplicationRegistrator__1registerApplication
 (JNIEnv */*aEnv*/, jclass /*aClass*/, jint /*aSessionHandle*/, jint /*aUid*/, jstring /*aGroupName*/,
@@ -486,7 +484,6 @@
  * @param[in] aUid The Uid of the application to be unregistered..
  * @return 0 if unregistration succeeded or Symbian error code
  */
-//#if 0
 #ifdef RD_JAVA_USIF_APP_REG
 JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_ApplicationRegistrator__1unregisterApplication
 (JNIEnv *, jclass, jint /*aSessionHandle*/, jint /*aUid*/)
@@ -527,7 +524,6 @@
 
     TInt err = KErrNone;
 
-//#if 1
 #ifndef RD_JAVA_USIF_APP_REG
     if (aSynchronous)
     {
@@ -586,7 +582,6 @@
         reinterpret_cast<RApaLsSession*>(aSessionHandle<<2);
 
     TInt err = KErrNone;
-//#if 1
 #ifndef RD_JAVA_USIF_APP_REG
     err = pApaSession->RollbackNonNativeApplicationsUpdates();
 #endif // RD_JAVA_USIF_APP_REG
--- a/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -161,7 +161,7 @@
     jstring aGlobalComponentId, jint aErrCategory, jint aErrCode,
     jstring aErrMsg, jstring aErrMsgDetails)
 {
-    __UHEAP_MARK;
+    //__UHEAP_MARK;
     HBufC *globalComponentId = CreateHBufCFromJavaStringLC(aEnv, aGlobalComponentId);
     HBufC *errMsg = NULL;
     if (NULL != aErrMsg)
@@ -174,24 +174,29 @@
         errMsgDetails = CreateHBufCFromJavaStringLC(aEnv, aErrMsgDetails);
     }
 
-    CSifOperationEndData *endData = CSifOperationEndData::NewLC(
-                                        *globalComponentId, (TErrorCategory)aErrCategory, aErrCode,
-                                        *errMsg, *errMsgDetails);
+    CSifOperationEndData *endData =
+        CSifOperationEndData::NewLC(
+            *globalComponentId, (TErrorCategory)aErrCategory, aErrCode,
+            (NULL != errMsg? *errMsg: KNullDesC()),
+            (NULL != errMsgDetails? *errMsgDetails: KNullDesC()));
 
+    // Do not use UHEAP macros around PublishCompletionL() because it
+    // creates a timer object which gets deleted only when the notifier
+    // object is deleted.
     aNotifier->PublishCompletionL(*endData);
 
     CleanupStack::PopAndDestroy(endData);
 
-    if (NULL != aErrMsg)
+    if (NULL != errMsgDetails)
+    {
+        CleanupStack::PopAndDestroy(errMsgDetails);
+    }
+    if (NULL != errMsg)
     {
         CleanupStack::PopAndDestroy(errMsg);
     }
-    if (NULL != aErrMsgDetails)
-    {
-        CleanupStack::PopAndDestroy(errMsgDetails);
-    }
     CleanupStack::PopAndDestroy(globalComponentId);
-    __UHEAP_MARKEND;
+    //__UHEAP_MARKEND;
 }
 
 /*
@@ -203,10 +208,25 @@
 (JNIEnv *aEnv, jclass, jint aHandle, jstring aGlobalComponentId,
  jint aErrCategory, jint aErrCode, jstring aErrMsg, jstring aErrMsgDetails)
 {
+    CActiveScheduler* newScheduler = 0;
+    if (0 == CActiveScheduler::Current())
+    {
+        // Create ActiveScheduler as it does not yet exist.
+        newScheduler = new CActiveScheduler;
+        CActiveScheduler::Install(newScheduler);
+    }
+
     CPublishSifOperationInfo *pNotifier =
         reinterpret_cast<CPublishSifOperationInfo*>(aHandle<<2);
     TRAPD(err, NotifyEndL(aEnv, pNotifier, aGlobalComponentId,
                           aErrCategory, aErrCode, aErrMsg, aErrMsgDetails));
+
+    if (newScheduler)
+    {
+        delete newScheduler;
+        newScheduler = 0;
+    }
+
     return err;
 }
 
--- a/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifregistrator.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifregistrator.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -31,13 +31,12 @@
 // SCR usage is enabled if this macro has been defined.
 #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 
-#include <qservicemanager.h>
-#include <qurl.h>
 #include <usif/scr/scr.h>
 #include <usif/scr/screntries.h>
 #ifdef RD_JAVA_USIF_APP_REG
 #include <usif/scr/appreginfo.h>
 #endif // RD_JAVA_USIF_APP_REG
+#include <xqappmgr.h>
 
 // Helper macro for logging a TDesC.
 #define LOG_TDESC_L(compIdParam, logLevelParam, msgParam, tdescParam) \
@@ -50,18 +49,11 @@
     }
 
 // NAMESPACE DECLARATION
-QTM_USE_NAMESPACE
 using namespace java;
 using namespace Usif;
 
 IMPORT_C HBufC* CreateHBufCFromJavaStringLC(JNIEnv* aEnv, jstring aString);
 
-// Java MIME types.
-_LIT(KMimeTypeAppDescriptor, "text/vnd.sun.j2me.app-descriptor");
-_LIT(KMimeTypeJava, "application/java");
-_LIT(KMimeTypeJavaArchive, "application/java-archive");
-_LIT(KMimeTypeXJavaArchive, "application/x-java-archive");
-
 // Properties registered to SCR.
 _LIT(KMIDletName, "MIDlet-Name");
 _LIT(KUid, "Uid");
@@ -254,86 +246,40 @@
 {
     TInt err = KErrNone;
 
-    QServiceManager serviceManager;
-    QObject* activityManager =
-        serviceManager.loadInterface("com.nokia.qt.activities.ActivityManager");
-    if (!activityManager)
+    CActiveScheduler* newScheduler = 0;
+    if (0 == CActiveScheduler::Current())
     {
-        err = serviceManager.error();
-        ELOG1(EJavaInstaller,
-              "launchAppView: loading ActivityManager failed, error %d", err);
-        return KErrCouldNotConnect;
-    }
-    // URL for launching AppLib.
-    QUrl url(QString("appto://20022F35?activityname=AppLibRecentView"));
-    QMetaObject::invokeMethod(activityManager, "launchActivity",
-                              Q_ARG(QString, url.toString()));
-    err = serviceManager.error();
-    delete activityManager;
-    if (QServiceManager::NoError != err)
-    {
-        ELOG1(EJavaInstaller,
-              "launchAppView: launching AppLib activity failed, error %d",
-              err);
-        return KErrCouldNotConnect;
+        // Create ActiveScheduler as it does not yet exist.
+        newScheduler = new CActiveScheduler;
+        CActiveScheduler::Install(newScheduler);
     }
 
-    // Start AppLib and bring it to foreground.
-    const TUid KAppLibUid = { 0x20022F35 };
-    TRAP(err, StartAppL(KAppLibUid));
-    return err;
-}
+    QUrl openRecentView("appto://20022F35?activityname=AppLibRecentView");
+    XQApplicationManager applicationManager;
+    XQAiwRequest *request = applicationManager.create(openRecentView);
+    if (request) {
+        bool result = request->send();
+        if (!result) {
+            int error = request->lastError();
+            ELOG1(EJavaInstaller,
+                  "launchAppView: launching AppLib failed, error %d", error);
+            err = KErrGeneral;
+        }
+        delete request;
+    }
 
-/**
- * See JNI method __1registerJavaSoftwareType.
- * This method makes calls that may leave (the actual registering).
- */
-void RegisterJavaSoftwareTypeL(RSoftwareComponentRegistry *aScr, TBool aRegister = ETrue)
-{
-    RPointerArray<HBufC> javaMimeTypes;
-    CleanupResetAndDestroyPushL(javaMimeTypes);
-    javaMimeTypes.AppendL(KMimeTypeAppDescriptor().AllocL());
-    javaMimeTypes.AppendL(KMimeTypeJava().AllocL());
-    javaMimeTypes.AppendL(KMimeTypeJavaArchive().AllocL());
-    javaMimeTypes.AppendL(KMimeTypeXJavaArchive().AllocL());
-    if (aRegister)
-    {
-        TUid javaSifPluginUid = TUid::Uid(0x2002bc70);
-        _LIT_SECURE_ID(KJavaInstallerSid, 0x102033E6);
-        aScr->AddSoftwareTypeL(
-            Usif::KSoftwareTypeJava, javaSifPluginUid,
-            KJavaInstallerSid, KJavaInstallerSid, javaMimeTypes);
-    }
-    else
+    if (newScheduler)
     {
-        aScr->DeleteSoftwareTypeL(Usif::KSoftwareTypeJava, javaMimeTypes);
+        delete newScheduler;
+        newScheduler = 0;
     }
-    CleanupStack::PopAndDestroy(&javaMimeTypes);
-}
 
-/*
- * Class:     com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator
- * Method:    _registerJavaSoftwareType
- * Signature: (Z)I
- */
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator__1registerJavaSoftwareType
-(JNIEnv *, jclass, jboolean aRegister)
-{
-    RSoftwareComponentRegistry *pScr = NULL;
-    TRAPD(err, pScr = CreateScrL());
-    if (KErrNone != err)
+    if (KErrNone == err)
     {
-        return err;
+        // Start AppLib and bring it to foreground.
+        const TUid KAppLibUid = { 0x20022F35 };
+        TRAP(err, StartAppL(KAppLibUid));
     }
-    TRAP(err, RegisterJavaSoftwareTypeL(pScr, aRegister));
-    if (KErrNone != err)
-    {
-        ELOG1(EJavaInstaller,
-              "registerJavaSoftwareType: registration failed, error %d",
-              err);
-    }
-    pScr->Close();
-    delete pScr;
     return err;
 }
 
@@ -538,7 +484,7 @@
  jint aMediaId, jstring aMidletInfoUrl, jstring aMidletDescription,
  jstring aDownloadUrl, jobject aComponentId)
 {
-    //__UHEAP_MARK;
+    __UHEAP_MARK;
     RSoftwareComponentRegistry *pScr =
         reinterpret_cast<RSoftwareComponentRegistry*>(aSessionHandle<<2);
     TComponentId componentId = -1;
@@ -547,7 +493,7 @@
                                  aComponentFiles, aComponentSize, aIsRemovable,
                                  aIsDrmProtected, aIsOriginVerified, aIsUpdate, aMediaId,
                                  aMidletInfoUrl, aMidletDescription, aDownloadUrl));
-    //__UHEAP_MARKEND;
+    __UHEAP_MARKEND;
     if (KErrNone == err)
     {
         jclass clazz = aEnv->GetObjectClass(aComponentId);
@@ -565,7 +511,7 @@
 JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator__1unregisterComponent
 (JNIEnv *, jclass, jint aSessionHandle, jint aComponentId)
 {
-    //__UHEAP_MARK;
+    __UHEAP_MARK;
     RSoftwareComponentRegistry *pScr =
         reinterpret_cast<RSoftwareComponentRegistry*>(aSessionHandle<<2);
     TInt err = KErrNone;
@@ -576,7 +522,7 @@
     {
         TRAP(err, pScr->DeleteComponentL(aComponentId));
     }
-    //__UHEAP_MARKEND;
+    __UHEAP_MARKEND;
     return err;
 }
 
@@ -1085,11 +1031,11 @@
 JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator__1logComponent
 (JNIEnv *aEnv, jclass, jint aSessionHandle, jstring aGlobalId)
 {
-    __UHEAP_MARK;
+    //__UHEAP_MARK;
     RSoftwareComponentRegistry *pScr =
         reinterpret_cast<RSoftwareComponentRegistry*>(aSessionHandle<<2);
     TRAPD(err, LogComponentL(aEnv, pScr, aGlobalId));
-    __UHEAP_MARKEND;
+    //__UHEAP_MARKEND;
     return err;
 }
 
@@ -1134,17 +1080,6 @@
 
 /*
  * Class:     com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator
- * Method:    _registerJavaSoftwareType
- * Signature: (Z)I
- */
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator__1registerJavaSoftwareType
-(JNIEnv *, jclass, jboolean)
-{
-    return KErrNone;
-}
-
-/*
- * Class:     com_nokia_mj_impl_installer_applicationregistrator_SifRegistrator
  * Method:    _startSession
  * Signature: ()I
  */
--- a/javamanager/javainstaller/installer/src.s60/utils/filewriter.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/utils/filewriter.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -26,6 +26,7 @@
 #ifdef RD_JAVA_S60_RELEASE_5_0
 #include <middleware/Oma2Agent.h>
 #else
+#include <caf/cafplatform.h>
 #include <mw/Oma2Agent.h>
 #endif // RD_JAVA_S60_RELEASE_5_0
 
--- a/javamanager/javainstaller/installer/src.s60/utils/sysutil.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/utils/sysutil.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -25,13 +25,20 @@
 #include <sysutil.h>
 #include <driveinfo.h>
 
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include "hbextendedlocale.h"
+#endif // SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+
 #include "com_nokia_mj_impl_installer_utils_SysUtil.h"
+#include "javajniutils.h"
 #include "logger.h"
 
 #ifndef KPSUidJavaLatestInstallation
 #define KPSUidJavaLatestInstallation 0x10282567
 #endif
 
+using namespace java::util;
+
 /**
  * Helper method for creating HBufC from jstring.
  */
@@ -720,3 +727,21 @@
     }
     return value;
 }
+
+/*
+ * Class:     com_nokia_mj_impl_installer_utils_SysUtil
+ * Method:    _isoToLang
+ * Signature: ()[Ljava/lang/String;
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_utils_SysUtil__1isoToLang
+(JNIEnv *aEnv, jclass, jstring aLocale)
+{
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+    return HbExtendedLocale::ISOToSymbianLang(
+        QString::fromStdWString(JniUtils::jstringToWstring(aEnv, aLocale)));
+#else // SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+    (void)aEnv; // suppress compilation warning about unused argument
+    (void)aLocale; // suppress compilation warning about unused argument
+    return -1;
+#endif // SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+}
--- a/javamanager/javainstaller/installer/tsrc/build/jiut.bat	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/tsrc/build/jiut.bat	Fri Jun 11 13:33:44 2010 +0300
@@ -14,6 +14,8 @@
 @rem Description: 
 @rem
 rem Script for running JavaInstaller unit tests from S60 eshell
+rem Start SifServer before running any tests
+sifserver
 rem javainstaller test -mainclass=com.nokia.mj.impl.installer.downloader.NotificationPosterTest
 rem javainstaller test -mainclass=com.nokia.mj.impl.installer.downloader.DownloaderTest
 javainstaller test -mainclass=com.nokia.mj.impl.installer.storagehandler.OtaStatusHandlerTest
--- a/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/InstallerEngineTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/InstallerEngineTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -64,6 +64,7 @@
             }));
         }
 
+        // Run 1
         suite.addTest(new InstallerEngineTest("testMidletMessageOk", new TestMethod()
         {
             public void run(TestCase tc)
@@ -112,6 +113,7 @@
             }
         }));
 
+        // Run 2
         suite.addTest(new InstallerEngineTest("testDownloadJarOk", new TestMethod()
         {
             public void run(TestCase tc)
@@ -240,6 +242,7 @@
             }
         }));
 
+        // Run 3
         suite.addTest(new InstallerEngineTest("testInstallOptions", new TestMethod()
         {
             public void run(TestCase tc)
@@ -985,7 +988,7 @@
         callInstallerOk(new String[] { "list", "-systemproperties" });
         callInstallerOk(new String[] { "launch", "-nouid" });
         callInstallerOk(new String[] { "launch", "-uid=invaliduid" });
-        callInstallerOk(new String[] { "uninstallall" });
+        callInstallerOk(new String[] { "uninstallall", "-silent" });
         callInstallerOk(new String[] { "unregister" });
         callInstallerOk(new String[] { "test", "-nomainclass" });
     }
--- a/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/ApplicationRegistratorTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/ApplicationRegistratorTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -374,12 +374,32 @@
 
             appReg.startSession();
             groupName = appReg.getGroupName(uid);
-            assertTrue(
-                "The group name was not VeryVeryLongGrou, it was " + groupName,
-                "VeryVeryLongGrou".equals(groupName));
+            if (SifRegistrator.getSifMode() > 0)
+            {
+                // When USIF is in use ApplicationRegistrator should not
+                // have registered anything.
+                assertTrue(
+                    "The group name was not empty, it was " + groupName,
+                    "".equals(groupName));
+            }
+            else
+            {
+                assertTrue(
+                    "The group name was not VeryVeryLongGrou, it was " + groupName,
+                    "VeryVeryLongGrou".equals(groupName));
+            }
 
             uidInUse = appReg.uidInUse(uid);
-            assertTrue("uidInUse returned false value", true == uidInUse);
+            if (SifRegistrator.getSifMode() > 0)
+            {
+                // When USIF is in use ApplicationRegistrator should not
+                // have registered anything.
+                assertTrue("uidInUse returned true value", false == uidInUse);
+            }
+            else
+            {
+                assertTrue("uidInUse returned false value", true == uidInUse);
+            }
 
             appReg.closeSession();
         }
@@ -582,7 +602,16 @@
                 "".equals(groupName));
 
             uidInUse = appReg.uidInUse(uid);
-            assertTrue("uidInUse returned false value", true == uidInUse);
+            if (SifRegistrator.getSifMode() > 0)
+            {
+                // When USIF is in use ApplicationRegistrator should not
+                // have registered anything.
+                assertTrue("uidInUse returned true value", false == uidInUse);
+            }
+            else
+            {
+                assertTrue("uidInUse returned false value", true == uidInUse);
+            }
 
             appReg.closeSession();
         }
@@ -703,12 +732,32 @@
 
             appReg.startSession();
             groupName = appReg.getGroupName(uid);
-            assertTrue(
-                "The group name was not Suite, it was " + groupName,
-                "Suite".equals(groupName));
+            if (SifRegistrator.getSifMode() > 0)
+            {
+                // When USIF is in use ApplicationRegistrator should not
+                // have registered anything.
+                assertTrue(
+                    "The group name was not empty, it was " + groupName,
+                    "".equals(groupName));
+            }
+            else
+            {
+                assertTrue(
+                    "The group name was not Suite, it was " + groupName,
+                    "Suite".equals(groupName));
+            }
 
             uidInUse = appReg.uidInUse(uid);
-            assertTrue("uidInUse returned false value", true == uidInUse);
+            if (SifRegistrator.getSifMode() > 0)
+            {
+                // When USIF is in use ApplicationRegistrator should not
+                // have registered anything.
+                assertTrue("uidInUse returned true value", false == uidInUse);
+            }
+            else
+            {
+                assertTrue("uidInUse returned false value", true == uidInUse);
+            }
 
             appReg.closeSession();
         }
--- a/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/SifRegistratorTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/applicationregistrator/SifRegistratorTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -203,21 +203,22 @@
         {
             SuiteInfo si = getTestSuite();
             ComponentId cid = getComponentId(si.getGlobalId());
-            Uid uid = null;
-            //Uid uid = sifReg.getUid(cid.getId());
-            //assertTrue("Suite uid " + si.getUid() + " does not match" +
-            //           " to uid " + uid + " from SCR",
-            //           si.getUid().equals(uid));
-            Vector apps = si.getApplications();
-            for (int i = 0; i < apps.size(); i++)
-            {
-                cid = getComponentId(si.getGlobalId(i));
-                uid = sifReg.getUid(cid.getId());
-                assertTrue("Application uid " +
-                           ((ApplicationInfo)apps.elementAt(i)).getUid() +
-                           " does not match to uid " + uid + " from SCR",
-                           ((ApplicationInfo)apps.elementAt(i)).getUid().equals(uid));
-            }
+            // Check for USIF Phase 2 registration.
+            Uid uid = sifReg.getUid(cid.getId());
+            assertTrue("Suite uid " + si.getUid() + " does not match" +
+                       " to uid " + uid + " from SCR",
+                       si.getUid().equals(uid));
+            // Check for USIF Phase 1 registration.
+            //Vector apps = si.getApplications();
+            //for (int i = 0; i < apps.size(); i++)
+            //{
+            //    cid = getComponentId(si.getGlobalId(i));
+            //    uid = sifReg.getUid(cid.getId());
+            //    assertTrue("Application uid " +
+            //               ((ApplicationInfo)apps.elementAt(i)).getUid() +
+            //               " does not match to uid " + uid + " from SCR",
+            //               ((ApplicationInfo)apps.elementAt(i)).getUid().equals(uid));
+            //}
             sifReg.closeSession();
         }
         catch (InstallerException ie)
@@ -324,16 +325,18 @@
     private void assertSuiteExists(SuiteInfo aSuite, boolean aExists)
     {
         String not = (aExists? " not": "");
+        // Check for USIF Phase 2 registration.
         ComponentId cid = getComponentId(aSuite.getGlobalId());
-        //assertTrue("Suite " + aSuite.getGlobalId() + not +
-        //           " found from SCR", (aExists? cid != null: cid == null));
-        Vector apps = aSuite.getApplications();
-        for (int i = 0; i < apps.size(); i++)
-        {
-            cid = getComponentId(aSuite.getGlobalId(i));
-            assertTrue("Application " + aSuite.getGlobalId(i) + not +
-                       " found from SCR", (aExists? cid != null: cid == null));
-        }
+        assertTrue("Suite " + aSuite.getGlobalId() + not +
+                   " found from SCR", (aExists? cid != null: cid == null));
+        // Check for USIF Phase 1 registration.
+        //Vector apps = aSuite.getApplications();
+        //for (int i = 0; i < apps.size(); i++)
+        //{
+        //    cid = getComponentId(aSuite.getGlobalId(i));
+        //    assertTrue("Application " + aSuite.getGlobalId(i) + not +
+        //               " found from SCR", (aExists? cid != null: cid == null));
+        //}
     }
 
     private void logSuite(SuiteInfo aSuite)
--- a/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/utils/SysUtilTest.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/utils/SysUtilTest.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-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"
@@ -375,8 +375,8 @@
             Uid uid = SysUtil.REPO_ID_JAVA_INST_VARIATION;
             long key = SysUtil.REPO_KEY_JAVA_INST_SHELL_FOLDER_VALUE;
             String value = SysUtil.getRepositoryStringValue(uid, key);
-            //assertTrue("Unexpected value: " + value, "Games,Applications".equals(value));
-            assertTrue("Unexpected value: " + value, "".equals(value));
+            assertTrue("Unexpected value: " + value, "Games,Applications".equals(value));
+            //assertTrue("Unexpected value: " + value, "".equals(value));
         }
         catch (InstallerException ie)
         {
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallConfirmationView.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallConfirmationView.java	Fri Jun 11 13:33:44 2010 +0300
@@ -33,7 +33,6 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiEswt.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiEswt.java	Fri Jun 11 13:33:44 2010 +0300
@@ -463,6 +463,7 @@
     public void updateProgress(int aProgress)
     {
         super.updateProgress(aProgress);
+        if (true) return; // Disable UI temporarily.
         if (!isUiReady())
         {
             return;
@@ -509,6 +510,7 @@
     public void ended()
     {
         super.ended();
+        if (true) return; // Disable UI temporarily.
         if (!isUiReady())
         {
             return;
@@ -553,6 +555,7 @@
     public void started(DownloadInfo aDownloadInfo)
     {
         super.started(aDownloadInfo);
+        if (true) return; // Disable UI temporarily.
         if (!isUiReady())
         {
             return;
@@ -579,6 +582,7 @@
     public void updateProgress(DownloadInfo aDownloadInfo)
     {
         super.updateProgress(aDownloadInfo);
+        if (true) return; // Disable UI temporarily.
         if (!isUiReady())
         {
             return;
@@ -628,6 +632,7 @@
     public void ended(DownloadInfo aDownloadInfo)
     {
         super.ended(aDownloadInfo);
+        if (true) return; // Disable UI temporarily.
         if (!isUiReady())
         {
             return;
@@ -654,6 +659,7 @@
     public void setOcspIndicator(boolean aOn)
     {
         super.setOcspIndicator(aOn);
+        if (true) return; // Disable UI temporarily.
         waitForUi();
         if (!isUiReady())
         {
@@ -754,6 +760,7 @@
     public void error(InstallerExceptionBase aInstallerException)
     {
         super.error(aInstallerException);
+        if (true) return; // Disable UI temporarily.
 
         waitForUi();
         if (!isUiReady()) {
@@ -850,6 +857,7 @@
      */
     public boolean confirm(String aAppName, ConfirmData aConfirmData)
     {
+        if (true) return true; // Disable UI temporarily.
         waitForUi();
         if (!isUiReady()) {
             return true;
@@ -888,6 +896,7 @@
      */
     public String[] getUsernamePassword(String aUrl)
     {
+        if (true) return new String[] { "", "" }; // Disable UI temporarily.
         waitForUi();
         if (!isUiReady())
         {
@@ -943,6 +952,7 @@
      */
     public boolean launchAppQuery(LaunchAppInfo aLaunchAppInfo)
     {
+        if (true) return false; // Disable UI temporarily.
         waitForUi();
         if (!isUiReady() || iConfirmationsCanceled || getInstallInfo() == null)
         {
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiTexts.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/InstallerUiTexts.java	Fri Jun 11 13:33:44 2010 +0300
@@ -88,7 +88,7 @@
     public static final String DRIVE_TYPE_INTERNAL_MASS_STORAGE_MB = "%U: Internal Mass Storage (%N MB)";
     public static final String DRIVE_TYPE_INTERNAL_MASS_STORAGE_GB = "%U: Internal Mass Storage (%N GB)";
     // Texts for permission confirmation view.
-    public static final String PERM_QUERY = "Application %U asks permissions to access protected device functionality.";
+    public static final String PERM_QUERY = "Access for protected functionality needed.";
     public static final String PERM_VIEW_DETAILS = "Details";
     public static final String PERM_ALLOW_ALWAYS = "Allow always";
     public static final String PERM_ASK_ME_LATER = "Ask me later";
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/LaunchAppQueryView.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/LaunchAppQueryView.java	Fri Jun 11 13:33:44 2010 +0300
@@ -46,7 +46,7 @@
     {
         super(aInstallerUi, aParent, 8);
         setTitle(InstallerUiTexts.get(InstallerUiTexts.INSTALLATION_COMPLETE));
-        setCommands("Show", //InstallerUiTexts.get(InstallerUiTexts.SHOW),
+        setCommands(InstallerUiTexts.get(InstallerUiTexts.SHOW),
                     InstallerUiTexts.get(InstallerUiTexts.CLOSE));
     }
 
@@ -68,8 +68,8 @@
     protected void createView()
     {
         // Add header.
-        String title = "Installed";
-        addHeader(title, iInstallerUi.getInstallInfo(), null);
+        addHeader(InstallerUiTexts.get(InstallerUiTexts.INSTALLATION_COMPLETE),
+                  iInstallerUi.getInstallInfo(), null);
         // Add content to the application info Composite.
         addAppInfo(iInstallerUi.getInstallInfo(), true);
     }
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/PermissionConfirmationView.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/PermissionConfirmationView.java	Fri Jun 11 13:33:44 2010 +0300
@@ -35,7 +35,6 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 
@@ -106,10 +105,11 @@
         addHeader(title, iInstallInfo, null);
 
         GridData gridData = null;
-        int horizontalSpan = getColumns();
         int labelStyle = SWT.WRAP;
 
         // Add permission query label.
+        int detailsColumns = 2;
+        int horizontalSpan = getColumns() - detailsColumns;
         Label domainLabel = createLabel(
             InstallerUiTexts.get(InstallerUiTexts.PERM_QUERY,
                                  new String[] { appName }),
@@ -120,12 +120,11 @@
                 iPermissionInfo.getPermissionNames() != null &&
                 iPermissionInfo.getPermissionNames().length > 0)
         {
-            Link detailsLink = new Link(getComposite(), SWT.NONE);
-            detailsLink.setText(
-                "<a>" +
-                InstallerUiTexts.get(InstallerUiTexts.PERM_VIEW_DETAILS) +
-                "</a>");
-            detailsLink.addListener(SWT.Selection, new Listener()
+            horizontalSpan = detailsColumns;
+            Button detailsButton = new Button(getComposite(), SWT.NONE);
+            detailsButton.setText(
+                InstallerUiTexts.get(InstallerUiTexts.PERM_VIEW_DETAILS));
+            detailsButton.addListener(SWT.Selection, new Listener()
             {
                 public void handleEvent(Event aEvent)
                 {
@@ -134,10 +133,12 @@
             });
             gridData = new GridData(GridData.FILL_HORIZONTAL);
             gridData.horizontalSpan = horizontalSpan;
-            detailsLink.setLayoutData(gridData);
-            addSoftKeyListenerFor(detailsLink);
+            detailsButton.setLayoutData(gridData);
+            addSoftKeyListenerFor(detailsButton);
         }
 
+        horizontalSpan = getColumns();
+
         // Number of pixels on top of the buttons.
         int verticalIndent = 5;
 
@@ -235,6 +236,10 @@
         gridData.verticalIndent = verticalIndent;
         iCancelButton.setLayoutData(gridData);
         addSoftKeyListenerFor(iCancelButton);
+
+        // After other widgets have been added, add content to
+        // application info Composite.
+        addAppInfo(iInstallInfo, false);
     }
 
     /**
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/ViewBase.java	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt2/ViewBase.java	Fri Jun 11 13:33:44 2010 +0300
@@ -50,6 +50,8 @@
 {
     /** Maximum view height in percentage from display client area height. */
     protected static final int MAX_VIEW_HEIGHT = 80;
+    /** Maximum view width in percentage from display client area width. */
+    protected static final int MAX_VIEW_WIDTH = 90;
     /** Parent shell for this view. */
     protected Shell iParent = null;
     /** Container for the contents of the view */
@@ -341,12 +343,12 @@
                     SWT.DEFAULT, SWT.DEFAULT));
         }
 
-        int contentWidth = iDefaultContentSize.x;
+        int contentWidth = iDefaultContentSize.x * MAX_VIEW_WIDTH / 100;
         if (aVerticalScrollBarVisible)
         {
             int verticalScrollBarWidth =
                 getScrolledComposite().getVerticalBar().getSize().x;
-            contentWidth = iDefaultContentSize.x - verticalScrollBarWidth;
+            contentWidth -= verticalScrollBarWidth;
         }
 
         // Recalculate the size of the content.
@@ -355,7 +357,7 @@
         Point cmdContentSize = cmdComp.computeSize(iDefaultContentSize.x, SWT.DEFAULT);
         cmdComp.setSize(cmdContentSize);
 
-        // Adjust Shell height. The Shell never changes the x position, nor the width.
+        // Adjust Shell height and width.
         Rectangle dispRect = shell.getDisplay().getClientArea();
         int offset = iDefaultContentSize.y - contentSize.y - cmdContentSize.y;
 
@@ -368,18 +370,20 @@
             offset -= maxHeight - newHeight;
             newHeight = maxHeight;
         }
+        int newWidth = defShellBounds.width;
+        int maxWidth = dispRect.width * MAX_VIEW_WIDTH / 100;
+        if (newWidth > maxWidth)
+        {
+            newWidth = maxWidth;
+        }
 
+        // Always center horizontally and vertically.
         Rectangle dispBounds = shell.getDisplay().getBounds();
+        int x = dispBounds.width - newWidth;
         int y = dispBounds.height - newHeight;
-        // Always center vertically.
+        x /= 2;
         y /= 2;
-        // For landscape orientation center vertically
-        //if (dispRect.width > dispRect.height)
-        //{
-        //    y /= 2;
-        //}
-        // Set bounds when command Buttons are in use.
-        shell.setBounds(defShellBounds.x, y, defShellBounds.width, newHeight);
+        shell.setBounds(x, y, newWidth, newHeight);
         Rectangle clientArea = shell.getClientArea();
         iContainer.setSize(clientArea.width, clientArea.height);
         iContainer.layout(true);
@@ -558,10 +562,20 @@
         }
         if (size > 0)
         {
-            createAppInfoLabel(
-                InstallerUiTexts.get(
-                    InstallerUiTexts.SIZE_KB,
-                    new String[] { Long.toString(1 + size/1024) }));
+            if (size > 1024*1024)
+            {
+                createAppInfoLabel(
+                    InstallerUiTexts.get(
+                        InstallerUiTexts.SIZE_MB,
+                        new String[] { Long.toString(1 + size/(1024*1024)) }));
+            }
+            else
+            {
+                createAppInfoLabel(
+                    InstallerUiTexts.get(
+                        InstallerUiTexts.SIZE_KB,
+                        new String[] { Long.toString(1 + size/1024) }));
+            }
         }
         if (aFull)
         {
--- a/javamanager/javainstaller/javainstaller.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javainstaller.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -16,6 +16,5 @@
 TEMPLATE = subdirs
 SUBDIRS += installerui/build/javainstallerui.pro 
 SUBDIRS += installer/build/javainstaller.pro 
-BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"appinstuiplugin/build/bld.inf\""  
 BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"javasifplugin/build/bld.inf\""  
 BLD_INF_RULES.prj_extensions += "prj_extensions" 
--- a/javamanager/javainstaller/javasifplugin/build/javasifplugin.mmp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javasifplugin/build/javasifplugin.mmp	Fri Jun 11 13:33:44 2010 +0300
@@ -53,6 +53,7 @@
 USERINCLUDE     ../../../../inc
 
 SYSTEMINCLUDE   ../../../../inc
+SYSTEMINCLUDE   /epoc32/include/mw/usif
 
 // Libraries
 LIBRARY         apgrfx.lib
--- a/javamanager/javainstaller/javasifplugin/inc/javasifplugin.h	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javasifplugin/inc/javasifplugin.h	Fri Jun 11 13:33:44 2010 +0300
@@ -221,6 +221,24 @@
      */
     void CopyFilesIfNeededL(TFileName &aFileName);
 
+    /**
+     * If Java Installer is already running, set error category EInstallerBusy etc
+     * to aResults, set aStatus to KErrAlreadyExists and return ETrue
+     * @param[in][out] aResults
+     * @param[in][out] aStatus
+     * @return ETrue if Java Installer is running
+     */
+    TBool ExitIfJavaInstallerRunning(
+        COpaqueNamedParams& aResults,
+        TRequestStatus& aStatus);
+
+    /**
+     * If Java Installer is already running,
+     * set aStatus to KErrAlreadyExists and return ETrue
+     * @param[in][out] aStatus
+     * @return ETrue if Java Installer is running
+     */
+    TBool ExitIfJavaInstallerRunning(TRequestStatus& aStatus);
 
 private: //  Data
 
--- a/javamanager/javainstaller/javasifplugin/src/javasifplugin.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javasifplugin/src/javasifplugin.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009 - 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"
@@ -24,6 +24,7 @@
 #include <e32property.h>
 #include <charconv.h>
 #include <data_caging_path_literals.hrh>
+#include <usiferror.h>
 
 #include "comms.h"
 #include "commsmessage.h"
@@ -43,10 +44,15 @@
 
 _LIT(KPrivateDataCage, "\\private\\");
 _LIT(KInboxDataCage, "\\private\\1000484b\\");
+_LIT(KJavaInstallerProcess, "Installer");
 _LIT(KJavaInstallerDataCage, "\\private\\102033e6\\");
 _LIT(KJavaInstallerTmp, "\\private\\102033E6\\installer\\tmp\\");
 _LIT(KAnyExtension, ".*");
 
+// Java Installer is executed with same Uid as Java Runtime
+_LIT_SECURE_ID(KJavaInstallerSecureID, KJavaMidpSecureId);
+
+
 
 // ============================ MEMBER FUNCTIONS ===============================
 
@@ -122,6 +128,11 @@
     CComponentInfo& aComponentInfo,
     TRequestStatus& aStatus)
 {
+    if (ExitIfJavaInstallerRunning(aStatus))
+    {
+        return;
+    }
+
     RProcess rJavaInstaller;
     TFileName fileName;
     TBuf<1536> commandLine;
@@ -273,6 +284,11 @@
     COpaqueNamedParams& aResults,
     TRequestStatus& aStatus)
 {
+    if (ExitIfJavaInstallerRunning(aResults, aStatus))
+    {
+        return;
+    }
+
     RProcess rJavaInstaller;
     TFileName fileName;
     // Max two path names and some options -> 1536 is enough
@@ -371,6 +387,26 @@
         // AskUser is not supported
     }
 
+
+    // TODO: activate this code block when KSifInParam_UpgradeData has been
+    // defined in sifcommon.h
+/*
+    // KSifInParam_UpgradeData Yes/No/AskUser -> -upgrade_data=yes|no
+    TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_UpgradeData, intValue));
+    if (paramFound)
+    {
+        if (intValue == 0) // Yes
+        {
+            commandLine.Append(_L(" -upgrade_data=yes"));
+        }
+        else if (intValue == 1) // No
+        {
+            commandLine.Append(_L(" -upgrade_data=no"));
+        }
+        // AskUser is not supported
+    }
+*/
+
     // KSifInParam_AllowUntrusted Yes/No/AskUser -> -untrusted=yes|no
     TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_AllowUntrusted, intValue));
     if (paramFound)
@@ -571,9 +607,14 @@
     TComponentId aComponentId,
     const TSecurityContext& aSecurityContext,
     const COpaqueNamedParams& aArguments,
-    COpaqueNamedParams& /* aResults */,
+    COpaqueNamedParams& aResults,
     TRequestStatus& aStatus)
 {
+    if (ExitIfJavaInstallerRunning(aResults, aStatus))
+    {
+        return;
+    }
+
     RProcess rJavaInstaller;
     TFileName fileName;
     // Max one uid and some options -> 256 is enough
@@ -795,4 +836,105 @@
     return;
 }
 
+TBool CJavaSifPlugin::ExitIfJavaInstallerRunning(
+    COpaqueNamedParams& aResults,
+    TRequestStatus& aStatus)
+{
+    // If Java Installer is already running, set error category EInstallerBusy etc
+    // to aResults and return
+
+    TInt err(KErrNone);
+    RProcess proc;
+    TFindProcess finder(KJavaInstallerProcess);
+    TFullName procName;
+
+    // Java Installer process SID is 0x102033E6 and name is "Installer"
+    while (finder.Next(procName) == KErrNone)
+    {
+        if (proc.Open(finder) != KErrNone)
+        {
+            continue;
+        }
+        if (proc.SecureId() == KJavaInstallerSecureID)
+        {
+            if (proc.ExitType() == EExitPending)
+            {
+                // Java Installer process is already running
+                proc.Close();
+
+                // return error information
+                TRAP(err, aResults.AddIntL(KSifOutParam_ErrCategory, EInstallerBusy));
+                if (KErrNone != err)
+                {
+                    ELOG1(EJavaInstaller,
+                        "CJavaSifPlugin::ExitIfJavaInstallerRunning aResults.AddIntL "
+                        "ErrCategory err %d", err);
+                }
+
+                TRAP(err, aResults.AddIntL(KSifOutParam_ErrCode, KErrInUse));
+                if (KErrNone != err)
+                {
+                    ELOG1(EJavaInstaller,
+                        "CJavaSifPlugin::ExitIfJavaInstallerRunning aResults.AddIntL "
+                        "ErrCode err %d", err);
+                }
+
+                TRAP(err, aResults.AddIntL(KSifOutParam_ExtendedErrCode, 0));
+                if (KErrNone != err)
+                {
+                    ELOG1(EJavaInstaller,
+                        "CJavaSifPlugin::ExitIfJavaInstallerRunning aResults.AddIntL "
+                        "ExtendedErrCode err %d", err);
+                }
+
+                // TODO: return also localized error message from usif
+                // common localization file after the localized strings are available
+
+                TRequestStatus *statusPtr(&aStatus);
+                User::RequestComplete(statusPtr, KErrInUse);
+                return ETrue;
+            }
+       }
+       proc.Close();
+    }
+
+    return EFalse;
+}
+
+
+TBool CJavaSifPlugin::ExitIfJavaInstallerRunning(TRequestStatus& aStatus)
+{
+    // If Java Installer is already running, set aStatus to KErrInUse
+    // and return ETrue
+
+    RProcess proc;
+    TFindProcess finder(KJavaInstallerProcess);
+    TFullName procName;
+
+    // Java Installer process SID is 0x102033E6 and name is "Installer"
+    while (finder.Next(procName) == KErrNone)
+    {
+        if (proc.Open(finder) != KErrNone)
+        {
+            continue;
+        }
+        if (proc.SecureId() == KJavaInstallerSecureID)
+        {
+            if (proc.ExitType() == EExitPending)
+            {
+                // Java Installer process is already running
+                proc.Close();
+
+                // return error information
+                TRequestStatus *statusPtr(&aStatus);
+                User::RequestComplete(statusPtr, KErrInUse);
+                return ETrue;
+            }
+       }
+       proc.Close();
+    }
+
+    return EFalse;
+}
+
 //  End of File
--- a/javamanager/javainstaller/javasifplugin/src/proxy.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javasifplugin/src/proxy.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009 - 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"
--- a/javamanager/javainstaller/javasifplugin/src/resultsserver.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/javasifplugin/src/resultsserver.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -19,6 +19,7 @@
 
 #include <iostream>
 #include <unistd.h>
+#include <usiferror.h>
 
 #include "comms.h"
 #include "javasymbianoslayer.h"
@@ -44,6 +45,33 @@
 
 int ResultsServer::start()
 {
+    // Write reasonable error codes to iResults that can be used if
+    // Java Installer never returns InstallerResultMessage.
+    // If InstallerResultMessage is received the values will be overwritten.
+    TRAPD(err, iResults.AddIntL(KSifOutParam_ErrCategory, EUnexpectedError));
+    if (KErrNone != err)
+    {
+        ELOG1(EJavaInstaller,
+            "ResultsServer::start iResults.AddIntL ErrCategory err %d", err);
+    }
+
+    TRAP(err, iResults.AddIntL(KSifOutParam_ErrCode, KErrUnknown));
+    if (KErrNone != err)
+    {
+        ELOG1(EJavaInstaller,
+            "ResultsServer::start iResults.AddIntL ErrCode err %d", err);
+    }
+
+    TRAP(err, iResults.AddIntL(KSifOutParam_ExtendedErrCode, 0));
+    if (KErrNone != err)
+    {
+        ELOG1(EJavaInstaller,
+            "ResultsServer::start iResults.AddIntL ExtendedErrCode err %d", err);
+    }
+
+    // TODO: return also localized error message from usif
+    // common localization file after the localized strings are available
+
     iRunning = 1;
     iComms.registerDefaultListener(this);
     return iComms.start(IPC_ADDRESS_JAVA_SIF_PLUGIN_C);
@@ -118,14 +146,6 @@
             if (KErrNone != result)
             {
                 // return common error information
-                TRAP(err, iResults.AddIntL(KSifOutParam_ExtendedErrCode, result));
-                if (KErrNone != err)
-                {
-                    ELOG1(EJavaInstaller,
-                        "ResultsServer::processMessage iResults.AddIntL ExtendedErrCode err %d",
-                        err);
-                }
-
                 TRAP(err, iResults.AddIntL(KSifOutParam_ErrCode, result));
                 if (KErrNone != err)
                 {
@@ -197,7 +217,24 @@
             }
             else
             {
-                // operation succeeded
+                // Operation succeeded
+
+                // Overwrite (reset) the default error values set for the case where no
+                // InstallerResultMessage is never received
+                TRAPD(err, iResults.AddIntL(KSifOutParam_ErrCategory, 0));
+                if (KErrNone != err)
+                {
+                    ELOG1(EJavaInstaller,
+                        "ResultsServer::processMessage iResults.AddIntL ErrCategory err %d", err);
+                }
+
+                TRAP(err, iResults.AddIntL(KSifOutParam_ErrCode, 0));
+                if (KErrNone != err)
+                {
+                    ELOG1(EJavaInstaller,
+                        "ResultsServer::processMessage iResults.AddIntL ErrCode err %d", err);
+                }
+
 
                 if (INSTALL_OPERATION == operation)
                 {
--- a/javamanager/javainstaller/subsystem.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -20,17 +20,14 @@
 	installerui/build \
 	installer/build \
 
-NONQTSUBSYSTEMS = \
-	appinstuiplugin/build
-
-SYMBIAN_ONLY = \
-	appinstuiplugin/build
+ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+    NONQTSUBSYSTEMS = javasifplugin/build
+    SYMBIAN_ONLY = javasifplugin/build
+else
+    NONQTSUBSYSTEMS = appinstuiplugin/build
+    SYMBIAN_ONLY = appinstuiplugin/build
+endif
 
-ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK    
-    NONQTSUBSYSTEMS += javasifplugin/build
-    SYMBIAN_ONLY += javasifplugin/build
-endif
-    
 LINUX_ONLY =
 
 include ${JAVA_SRC_ROOT}/build/Makefile.subsystem
--- a/javamanager/javalauncher/src.s60/javalauncher.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javalauncher/src.s60/javalauncher.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -672,8 +672,8 @@
         LOG(EJavaCaptain, EInfo, "javalauncher: startJavaCaptain javacaptain.exe was started ok");
 #endif
 
-        // Wait 3 seconds so that Java Captain has time to start
-        User::After(3000000);
+        // Wait 3 seconds so that Java Captain has time to start and get read to answer Comms
+        User::After(3000000); // codescanner::userafter
     }
     else
     {
--- a/javamanager/javalauncher/tsrc/testmidletstart/build/testmidletstart.pkg	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javalauncher/tsrc/testmidletstart/build/testmidletstart.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -1,18 +1,3 @@
-;
-; Copyright (c) 2009 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: 
-;
 
 ; Language
 &EN
--- a/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -16,61 +16,65 @@
 */
 #include "javaapplicationsettings.h"
 
-JavaApplicationSettings::JavaApplicationSettings()
+JavaApplicationSettings::JavaApplicationSettings():
+    iName(QString("")), 
+    iValues(QStringList()), 
+    iId(0), iCurrentValue(0), 
+    iColumnName(L""), 
+    iTableName(""), 
+    iStorageValuesFilter(L""), 
+    iValuesColumnName(L""), 
+    iFilterColumnName(L""), 
+    iFilterColumnValue(L""), 
+    connectedToUi(false)
 {
-    iId = 0;
-    iName = "";
-    iCurrentValue = 0;
-    iColumnName = L"";
-    iTableName = "";
-    iFilterColumnName = L"";
-    iFilterColumnValue = L"";
-    iStorageValuesFilter = L"";
-    iValuesColumnName = L"";
 }
 
 JavaApplicationSettings::JavaApplicationSettings(const QString& aName, const QStringList& aValues):
-        iValues(aValues)
+        iName(aName), 
+        iValues(aValues),
+        iId(0), 
+        iCurrentValue(0), 
+        iColumnName(L""), 
+        iTableName(""), 
+        iStorageValuesFilter(L""), 
+        iValuesColumnName(L""), 
+        iFilterColumnName(L""), 
+        iFilterColumnValue(L""), 
+        connectedToUi(false)
 {
-    iName = aName;
-    iId = 0;
-    iCurrentValue = 0;
-    iColumnName = L"";
-    iTableName = "";
-    iFilterColumnName = L"";
-    iFilterColumnValue = L"";
-    iStorageValuesFilter = L"";
-    iValuesColumnName = L"";
 }
 
 JavaApplicationSettings::JavaApplicationSettings(const QString& aName, const QStringList& aValues, const std::wstring& aColumnName, const std::string& aTableName, const std::vector<std::wstring>& aStorageValues):
-        iValues(aValues)
+        iName(aName), 
+        iValues(aValues), 
+        iId(0), 
+        iCurrentValue(0), 
+        iColumnName(aColumnName), 
+        iTableName(aTableName), 
+        iStorageValues(aStorageValues), 
+        iStorageValuesFilter(L""), 
+        iValuesColumnName(L""), 
+        iFilterColumnName(L""), 
+        iFilterColumnValue(L""), 
+        connectedToUi(false)
 {
-    iName = aName;
-    iId = 0;
-    iCurrentValue = 0;
-    iColumnName = aColumnName;
-    iTableName = aTableName;
-    iStorageValues = aStorageValues;
-    iFilterColumnName = L"";
-    iFilterColumnValue = L"";
-    iStorageValuesFilter = L"";
-    iValuesColumnName = L"";
 }
 
 JavaApplicationSettings::JavaApplicationSettings(const QString& aName, const QStringList& aValues, const std::wstring& aColumnName, const std::string& aTableName, const std::vector<std::wstring>& aStorageValues, const std::wstring& aFilterColumnName, const std::wstring& aFilterColumnValue,  const std::wstring& aValuesColumnName):
-        iValues(aValues)
+        iName(aName), 
+        iValues(aValues), 
+        iId(0), 
+        iCurrentValue(0), 
+        iColumnName(aColumnName), 
+        iTableName(aTableName), 
+        iStorageValues(aStorageValues), 
+        iStorageValuesFilter(L""), 
+        iValuesColumnName(aValuesColumnName), 
+        iFilterColumnName(aFilterColumnName), 
+        iFilterColumnValue(aFilterColumnValue), 
+        connectedToUi(false)
 {
-    iName = aName;
-    iId = 0;
-    iCurrentValue = 0;
-    iColumnName = aColumnName;
-    iTableName = aTableName;
-    iStorageValues = aStorageValues;
-    iFilterColumnName = aFilterColumnName;
-    iFilterColumnValue = aFilterColumnValue;
-    iStorageValuesFilter = L"";
-    iValuesColumnName = aValuesColumnName;
 }
 
 void JavaApplicationSettings::setCurrentValue(int aCurrentValue)
@@ -78,6 +82,21 @@
     iCurrentValue = aCurrentValue;
 }
 
+void JavaApplicationSettings::connectToUi()
+{
+    connectedToUi = true;
+}
+
+void JavaApplicationSettings::disconnectFromUi()
+{
+    connectedToUi = false;
+}
+
+bool JavaApplicationSettings::isConnectedToUi()
+{
+    return connectedToUi;
+}
+
 int JavaApplicationSettings::getCurrentValue()
 {
     return iCurrentValue;
--- a/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.h	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettings.h	Fri Jun 11 13:33:44 2010 +0300
@@ -22,6 +22,7 @@
 #include <QString>
 #include <QStringList>
 #include <hbdataformmodelitem.h>
+#include <cmapplsettingsui.h>
 
 class JavaApplicationSettings
 {
@@ -31,6 +32,7 @@
         {
         QString name;
         uint id;
+        CmApplSettingsUi::SelectionType type;
         };
         
     JavaApplicationSettings(const QString&,
@@ -71,6 +73,10 @@
     const std::vector<std::wstring>& getStorageValues();
     void setStorageValuesFilter(const std::wstring&);
     const std::wstring& getStorageValuesFilter();
+    void connectToUi();
+    void disconnectFromUi();
+    bool isConnectedToUi();
+        
 private:
     QString iName;
     QStringList iValues;
@@ -85,6 +91,7 @@
     std::wstring iValuesColumnName;
     std::wstring iFilterColumnName;
     std::wstring iFilterColumnValue;
+    bool connectedToUi;
 };
 
 #endif // JAVAAPPLICATIONSETTINGS_H
--- a/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -27,6 +27,7 @@
 #include <QTranslator>
 #include <qnetworkconfigmanager.h>
 #include <qnetworkconfiguration.h>
+#include <algorithm>
 
 #include "javaapplicationsettings.h"
 #include "javaapplicationsettingsview.h"
@@ -48,11 +49,8 @@
 const wchar_t ON_SCREEN_KEYPAD_VALUE_NAVIGATION[] = L"2";
 
 JavaApplicationSettingsViewPrivate::JavaApplicationSettingsViewPrivate(const QString& aJavaAppUid):
-        mainForm(0), model(0), generalSettingsGroup(0), securitySettingsGroup(0)
+        mainForm(0), model(0), generalSettingsGroup(0), securitySettingsGroup(0), netConnSettingsUi(0), asyncToSyncCallEventLoop(0), secWarningAccepted(false), defaultConnId(0)
 {
-    // init access point settings ui
-    netConnSettingsUi = new CmApplSettingsUi(this);
-    
     // init storage
     iStorage.reset(JavaStorage::createInstance());
     try
@@ -61,91 +59,104 @@
     }
     catch (JavaStorageException& aJse) {}
     
-    // init the suite UID from the application UID
-    readSuiteUid(aJavaAppUid);
-    if (iSuiteUid.size() <= 0)
-    {
-        // TODO: display a no settings available message
-        return;
-    }
     QTranslator translator;
     // load the correct translation of the localized strings for the cmmanager. 
     // Load this one first since it contains the smallest amount of strings 
     // (so it's ok to be searched last)
-    if (translator.load("z:/resource/qt/translations/cmapplsettingsui_" + QLocale::system().name()))
-    {
-        qApp->installTranslator(&translator);
-    }
-    if (translator.load("z:/resource/qt/translations/cmmanager_" + QLocale::system().name()))
-    {
-        qApp->installTranslator(&translator);
-    }
+    installTranslator("cmapplsettingsui");
+    installTranslator("cmmanager");
     // load the correct translation of the localized strings for the java settings
     // Current solution reads it from Z only (this does not work with IAD)
     // -> check if translator can handle path without drive letter (e.g. the resource
     // is loaded from the same drive where the DLL is loaded)
-    if (translator.load("z:/resource/qt/translations/javaruntimeapplicationsettings_" + QLocale::system().name()))
-    {
-        qApp->installTranslator(&translator);
-    }
+    installTranslator("javaruntimeapplicationsettings");
     // init strings
-    BLANKET = hbTrId("txt_java_sett_setlabel_permission_val_blanket");
-    SESSION = hbTrId("txt_java_sett_setlabel_permission_val_session");
-    ONESHOT = hbTrId("txt_java_sett_setlabel_permission_val_oneshot");
-    DENIED = hbTrId("txt_java_sett_setlabel_permission_val_no");
-    SECURITY_LEVEL = hbTrId("txt_java_sett_setlabel_security_level");
-    USER_DEFINED = hbTrId("txt_java_sett_setlabel_security_level_val_user_defined");
-    SENSITIVE_SETTINGS = hbTrId("txt_java_sett_info_query_perm_sec");
-    SENSITIVE_SETTINGS_NET_USAGE = hbTrId("txt_java_sett_info_query_perm_net");
-    MUTUALLY_EXCLUSIVE_SETTINGS = hbTrId("txt_java_sett_info_query_perm_warn");
-    OK = hbTrId("txt_java_sett_button_settings_ok");
-    CANCEL = hbTrId("txt_java_sett_button_settings_cancel");
-    SECURITY_WARNING_TITLE = hbTrId("txt_java_sett_title_note_security_warn");
-    NET_ACCESS = hbTrId("txt_java_sett_setlabel_net_access");
-    LOW_LEVEL_NET_ACCESS = hbTrId("txt_java_sett_setlabel_low_level_net_access");
-    NETWORK_CONNECTION = hbTrId("txt_occ_title_network_connection");
+    BLANKET = QString(hbTrId("txt_java_sett_setlabel_permission_val_blanket"));
+    SESSION = QString(hbTrId("txt_java_sett_setlabel_permission_val_session"));
+    ONESHOT = QString(hbTrId("txt_java_sett_setlabel_permission_val_oneshot"));
+    DENIED = QString(hbTrId("txt_java_sett_setlabel_permission_val_no"));
+    SECURITY_LEVEL = QString(hbTrId("txt_java_sett_setlabel_security_level"));
+    USER_DEFINED = QString(hbTrId("txt_java_sett_setlabel_security_level_val_user_defined"));
+    SENSITIVE_SETTINGS = QString(hbTrId("txt_java_sett_info_query_perm_sec"));
+    SENSITIVE_SETTINGS_NET_USAGE = QString(hbTrId("txt_java_sett_info_query_perm_net"));
+    MUTUALLY_EXCLUSIVE_SETTINGS = QString(hbTrId("txt_java_sett_info_query_perm_warn"));
+    OK = QString(hbTrId("txt_java_sett_button_settings_ok"));
+    CANCEL = QString(hbTrId("txt_java_sett_button_settings_cancel"));
+    SECURITY_WARNING_TITLE = QString(hbTrId("txt_java_sett_title_note_security_warn"));
+    NET_ACCESS = QString(hbTrId("txt_java_sett_setlabel_net_access"));
+    LOW_LEVEL_NET_ACCESS = QString(hbTrId("txt_java_sett_setlabel_low_level_net_access"));
+    NETWORK_CONNECTION = QString(hbTrId("txt_occ_title_network_connection"));
+    SETTINGS_TITLE = QString(hbTrId("txt_java_sett_title_settings"));
+    SETTINGS_NOT_AVAILABLE = QString(hbTrId("txt_java_sett_info_settings_not_available"));
 
+    // init the suite UID from the application UID
+    readSuiteUid(aJavaAppUid);
+    if (iSuiteUid.size() <= 0)
+    {
+        return;
+    }
+    
+    // init access point settings ui
+    netConnSettingsUi = new CmApplSettingsUi(this);
+    asyncToSyncCallEventLoop = new QEventLoop();
+    
     // read all settings
     readAllSettings();
 
     // init form
     mainForm = new HbDataForm();
-    mainForm->setHeading(hbTrId("txt_java_sett_title_settings"));
+    mainForm->setHeading(QString::fromStdWString(readFromStorage(PACKAGE_NAME, L"", L"", APPLICATION_PACKAGE_TABLE)));
     model = new HbDataFormModel();
 
     // init settings
     generalSettingsGroup = model->appendDataFormGroup(
-                               hbTrId("txt_java_sett_subtitle_general"), model->invisibleRootItem());
+        QString(hbTrId("txt_java_sett_subtitle_general")), model->invisibleRootItem());
     initSettings(generalSettings, generalSettingsGroup);
-    securitySettingsGroup = model->appendDataFormGroup(
-                                hbTrId("txt_java_sett_subtitle_security"), model->invisibleRootItem());
-    initSettings(securitySettings, securitySettingsGroup);
+    // append the security settings only if there are any user settings
+    if (extraSettings.size() > 0)
+    {
+        securitySettingsGroup = model->appendDataFormGroup(
+            QString(hbTrId("txt_java_sett_subtitle_security")), model->invisibleRootItem());
+        initSettings(securitySettings, securitySettingsGroup);
 
-    // if security warnings is user defined -> add the extra settings, expand
-    if (securitySettings[0].getCurrentValue() == 1)
-    {
-        securityWarningsChanged(USER_DEFINED);
+        // if security warnings is user defined -> add the extra settings, expand
+        if (securitySettings[0].getCurrentValue() == 1)
+        {
+            securityWarningsChanged(USER_DEFINED);
+        }
     }
 
     // link form and model
     mainForm->setModel(model);
     mainForm->setExpanded(model->indexFromItem(generalSettingsGroup), true);
-    mainForm->setExpanded(model->indexFromItem(securitySettingsGroup), (securitySettings[0].getCurrentValue() == 1));
+    if (extraSettings.size() > 0)
+    {
+        mainForm->setExpanded(model->indexFromItem(securitySettingsGroup), (securitySettings[0].getCurrentValue() == 1));
+    }
 }
 
 void JavaApplicationSettingsViewPrivate::init(JavaApplicationSettingsView* aPublicView)
 {
     iPublicView = aPublicView;
 
-    // do the connect for the main form
-    iPublicView->connect(mainForm, SIGNAL(activated(const QModelIndex)),
-                         iPublicView, SLOT(_q_dataItemDisplayed(const QModelIndex)));
-
-    // set the form as view's widget
-    iPublicView->setWidget(mainForm);
+    if (mainForm)
+    {        
+        // do the connect for the main form
+        iPublicView->connect(mainForm, SIGNAL(activated(const QModelIndex)),
+                             iPublicView, SLOT(_q_dataItemDisplayed(const QModelIndex)));
+    
+        // set the form as view's widget
+        iPublicView->setWidget(mainForm);
+    }
+    else
+    {
+        // no settings available
+        HbLabel* label = new HbLabel(SETTINGS_NOT_AVAILABLE, iPublicView);
+        label->setAlignment(Qt::AlignVCenter);
+    }        
 
     // set title
-    iPublicView->setTitle(QString::fromStdWString(readFromStorage(PACKAGE_NAME, L"", L"", APPLICATION_PACKAGE_TABLE)));
+    iPublicView->setTitle(SETTINGS_TITLE);
 }
 
 JavaApplicationSettingsViewPrivate::~JavaApplicationSettingsViewPrivate()
@@ -153,6 +164,12 @@
     delete mainForm;
     delete model;
     delete netConnSettingsUi;
+    delete asyncToSyncCallEventLoop;
+    foreach (QTranslator *translator, translators) {
+        qApp->removeTranslator(translator);
+    }    
+    qDeleteAll(translators);
+    translators.clear();
 }
 
 void JavaApplicationSettingsViewPrivate::readAllSettings()
@@ -165,16 +182,15 @@
         // if the on screen keypad is predefined, it should not be changable by user
         // -> right now it is not added to settings list. It should be changed so that
         // the setting should not be editable by user
-        settingsValues<<hbTrId("txt_java_sett_setlabel_osk_val_no")<<hbTrId("txt_java_sett_setlabel_osk_val_game")<<hbTrId("txt_java_sett_setlabel_osk_val_navigation");
+        settingsValues<<QString(hbTrId("txt_java_sett_setlabel_osk_val_no"))<<QString(hbTrId("txt_java_sett_setlabel_osk_val_game"))<<QString(hbTrId("txt_java_sett_setlabel_osk_val_navigation"));
         storageValues.push_back(ON_SCREEN_KEYPAD_VALUE_NO);
         storageValues.push_back(ON_SCREEN_KEYPAD_VALUE_GAMEACTIONS);
         storageValues.push_back(ON_SCREEN_KEYPAD_VALUE_NAVIGATION);
-        generalSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_osk"), settingsValues, ON_SCREEN_KEYPAD, MIDP_PACKAGE_TABLE, storageValues));
+        generalSettings.append(JavaApplicationSettings(QString(hbTrId("txt_java_sett_setlabel_osk")), settingsValues, ON_SCREEN_KEYPAD, MIDP_PACKAGE_TABLE, storageValues));
         readFromStorage(generalSettings[0]);
     }
     settingsValues = QStringList();
-    netConn.id = ConnectionManager::getDestinationNetworkIdL(iSuiteUid);
-    readNetworkConnectionName();
+    initNetworkConnection();
     settingsValues<<netConn.name;
     generalSettings.append(JavaApplicationSettings(NETWORK_CONNECTION, settingsValues));
     netSettIndex = generalSettings.size() - 1;
@@ -182,14 +198,13 @@
     // security settings
     settingsValues = QStringList();
     storageValues.clear();
-    settingsValues<<hbTrId("txt_java_sett_setlabel_security_level_val_default")<<USER_DEFINED;
+    settingsValues<<QString(hbTrId("txt_java_sett_setlabel_security_level_val_default"))<<USER_DEFINED;
     storageValues.push_back(SECURITY_WARNINGS_DEFAULT_MODE);
     storageValues.push_back(SECURITY_WARNINGS_USER_DEFINED_MODE);
     securitySettings.append(JavaApplicationSettings(SECURITY_LEVEL, settingsValues, SECURITY_WARNINGS, MIDP_PACKAGE_TABLE, storageValues));
     readFromStorage(securitySettings[0]);
 
     // extra settings
-    int i=0;
     settingsValues = QStringList();
     storageValues.clear();
     settingsValues<<ONESHOT<<SESSION<<BLANKET<<DENIED;
@@ -197,92 +212,98 @@
     storageValues.push_back(SESSION_INTERACTION_MODE);
     storageValues.push_back(BLANKET_INTERACTION_MODE);
     storageValues.push_back(DENIED_INTERACTION_MODE);
-    extraSettings.append(JavaApplicationSettings(NET_ACCESS, settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, NET_ACCESS_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(LOW_LEVEL_NET_ACCESS, settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, LOW_LEVEL_NET_ACCESS_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_messaging"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, MESSAGING_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_restricted_messaging"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, RESTRICTED_MESSAGING_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_call_control"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, CALL_CONTROL_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_local_conn"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, LOCAL_CONNECTIVITY_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_mm_record"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, MULTIMEDIA_RECORDING_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_write_data"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, WRITE_USER_DATA_ACCESS_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_read_data"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, READ_USER_DATA_ACCESS_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_location"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, LOCATION_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_landmarks"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, LANDMARK_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_auth"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, AUTHENTICATION_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_smartcard"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, SMART_CARD_COMMUNICATION_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_app_auto_invoc"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, APPLICATION_AUTO_INVOCATION_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_broadcast"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, BROADCAST_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
-    extraSettings.append(JavaApplicationSettings(hbTrId("txt_java_sett_setlabel_nfc_write_access"), settingsValues, CURRENT_SETTING, MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, NFC_WRITE_ACCESS_SETTINGS, ALLOWED_SETTINGS));
-    readFromStorage(extraSettings[i]);
-    i++;
+    // init the known localized settings names
+    QHash<QString, QString> localizedSettingsNames;
+    localizedSettingsNames[QString::fromStdWString(NET_ACCESS_SETTINGS)] = NET_ACCESS; 
+    localizedSettingsNames[QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS)] = LOW_LEVEL_NET_ACCESS;
+    localizedSettingsNames[QString::fromStdWString(MESSAGING_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_messaging"));
+    localizedSettingsNames[QString::fromStdWString(RESTRICTED_MESSAGING_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_restricted_messaging"));
+    localizedSettingsNames[QString::fromStdWString(CALL_CONTROL_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_call_control"));
+    localizedSettingsNames[QString::fromStdWString(LOCAL_CONNECTIVITY_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_local_conn"));
+    localizedSettingsNames[QString::fromStdWString(MULTIMEDIA_RECORDING_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_mm_record"));
+    localizedSettingsNames[QString::fromStdWString(WRITE_USER_DATA_ACCESS_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_write_data"));
+    localizedSettingsNames[QString::fromStdWString(READ_USER_DATA_ACCESS_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_read_data"));
+    localizedSettingsNames[QString::fromStdWString(LOCATION_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_location"));
+    localizedSettingsNames[QString::fromStdWString(LANDMARK_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_landmarks"));
+    localizedSettingsNames[QString::fromStdWString(AUTHENTICATION_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_auth"));
+    localizedSettingsNames[QString::fromStdWString(SMART_CARD_COMMUNICATION_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_smartcard"));
+    localizedSettingsNames[QString::fromStdWString(APPLICATION_AUTO_INVOCATION_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_app_auto_invoc"));
+    localizedSettingsNames[QString::fromStdWString(BROADCAST_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_broadcast"));
+    localizedSettingsNames[QString::fromStdWString(NFC_WRITE_ACCESS_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_nfc_write_access"));
+    localizedSettingsNames[QString::fromStdWString(URL_START_SETTINGS)] = QString(hbTrId("txt_java_sett_setlabel_url_start"));
+    vector<IndexedSettingsName> allSecuritySettings = readFromStorage(FUNCTION_GROUP, MIDP_FUNC_GRP_SETTINGS_TABLE);
+    // sort the security settings according to how they should be displayed
+    std::sort(allSecuritySettings.begin(), allSecuritySettings.end(), AscendingSort());
+    QHash<QString, int> settingsIndexes;
+    for(int i=0; i<allSecuritySettings.size(); i++)
+    {
+        QString rawSettingsName = QString::fromStdWString(allSecuritySettings[i].name);
+        QString localizedSettingsName = rawSettingsName;
+        if (localizedSettingsNames.contains(rawSettingsName))
+            localizedSettingsName = localizedSettingsNames.value(rawSettingsName);
+        extraSettings.append(JavaApplicationSettings(
+            localizedSettingsName, settingsValues, CURRENT_SETTING, 
+            MIDP_FUNC_GRP_SETTINGS_TABLE, storageValues, FUNCTION_GROUP, 
+            allSecuritySettings[i].name, ALLOWED_SETTINGS));
+        readFromStorage(extraSettings[i]);
+        settingsIndexes[rawSettingsName] = i;
+    }
 
     // configure the high risk lists
     QList<JavaApplicationSettings*> highRiskList;
+    QStringList highRiskSettingsNames;
+    highRiskSettingsNames
+        <<QString::fromStdWString(MULTIMEDIA_RECORDING_SETTINGS)
+        <<QString::fromStdWString(READ_USER_DATA_ACCESS_SETTINGS);
+    configureList(highRiskList, highRiskSettingsNames, settingsIndexes);
     // net access with multimedia and read user data
-    highRiskList << &(extraSettings[6]) << &(extraSettings[8]);
-    extraSettings[0].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(NET_ACCESS_SETTINGS),highRiskList, settingsIndexes);
     // low level net access with multimedia and read user data
-    extraSettings[1].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS),highRiskList, settingsIndexes);
     // messaging with multimedia and read user data
-    extraSettings[2].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(MESSAGING_SETTINGS),highRiskList, settingsIndexes);
     // restricted messaging with multimedia and read user data
-    extraSettings[3].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(RESTRICTED_MESSAGING_SETTINGS),highRiskList, settingsIndexes);
     // call control with multimedia and read user data
-    extraSettings[4].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(CALL_CONTROL_SETTINGS),highRiskList, settingsIndexes);
     // local connectivity with multimedia and read user data
-    extraSettings[5].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(LOCAL_CONNECTIVITY_SETTINGS),highRiskList, settingsIndexes);
     // multimedia with net access, low level net access, messaging,
     // restricted messaging, call control and local connectivity
     highRiskList.clear();
-    highRiskList << &(extraSettings[0]) << &(extraSettings[1])
-    << &(extraSettings[2]) << &(extraSettings[3])
-    << &(extraSettings[4]) << &(extraSettings[5]);
-    extraSettings[6].setHighRiskList(highRiskList);
+    highRiskSettingsNames.clear();
+    highRiskSettingsNames
+        <<QString::fromStdWString(NET_ACCESS_SETTINGS)
+        <<QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS)
+        <<QString::fromStdWString(MESSAGING_SETTINGS)
+        <<QString::fromStdWString(RESTRICTED_MESSAGING_SETTINGS)
+        <<QString::fromStdWString(CALL_CONTROL_SETTINGS)
+        <<QString::fromStdWString(LOCAL_CONNECTIVITY_SETTINGS)
+        <<QString::fromStdWString(MULTIMEDIA_RECORDING_SETTINGS);
+    configureList(highRiskList, highRiskSettingsNames, settingsIndexes);
+    attachList(QString::fromStdWString(MULTIMEDIA_RECORDING_SETTINGS),highRiskList, settingsIndexes);
     // read user data with net access, low level net access, messaging,
     // restricted messaging, call control and local connectivity
-    extraSettings[8].setHighRiskList(highRiskList);
+    attachList(QString::fromStdWString(READ_USER_DATA_ACCESS_SETTINGS),highRiskList, settingsIndexes);
 
     // configure the mutually exclusive list
     QList<JavaApplicationSettings*> mutuallyExclusiveList;
+    QStringList mutuallyExclusiveSettingsNames;
+    mutuallyExclusiveSettingsNames
+        <<QString::fromStdWString(APPLICATION_AUTO_INVOCATION_SETTINGS);
+    configureList(mutuallyExclusiveList, mutuallyExclusiveSettingsNames, settingsIndexes);
     //net access with application auto invocation
-    mutuallyExclusiveList << &(extraSettings[13]);
-    extraSettings[0].setMutuallyExclusiveList(mutuallyExclusiveList);
+    attachList(QString::fromStdWString(NET_ACCESS_SETTINGS),mutuallyExclusiveList, settingsIndexes, false /* is high risk list */);
     //low level net access with application auto invocation
-    extraSettings[1].setMutuallyExclusiveList(mutuallyExclusiveList);
+    attachList(QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS),mutuallyExclusiveList, settingsIndexes, false /* is high risk list */);
     //application auto invocation with net access and low level net access
     mutuallyExclusiveList.clear();
-    mutuallyExclusiveList << &(extraSettings[0]) << &(extraSettings[1]);
-    extraSettings[13].setMutuallyExclusiveList(mutuallyExclusiveList);
+    mutuallyExclusiveSettingsNames.clear();
+    mutuallyExclusiveSettingsNames
+        <<QString::fromStdWString(NET_ACCESS_SETTINGS)
+        <<QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS);
+    configureList(mutuallyExclusiveList, mutuallyExclusiveSettingsNames, settingsIndexes);
+    attachList(QString::fromStdWString(APPLICATION_AUTO_INVOCATION_SETTINGS),mutuallyExclusiveList, settingsIndexes, false /* is high risk list */);
 }
 
 void JavaApplicationSettingsViewPrivate::initSettings(QVector<JavaApplicationSettings>& settings, HbDataFormModelItem * parent)
@@ -290,8 +311,7 @@
     for (int i=0; i<settings.size(); i++)
     {
         HbDataFormModelItem * appSettings = NULL;
-        int storageValue = 0;
-        int currentValue = 0;        
+        int currentValue = 0;  
         switch(settings[i].getValues().size())
         {
             case 1:
@@ -305,13 +325,13 @@
                 appSettings  = model->appendDataFormItem(
                         HbDataFormModelItem::ToggleValueItem,
                         settings[i].getName(), parent);
-                storageValue = readFromStorage(settings[i]);
-                if (storageValue >= 0)
+                currentValue = settings[i].getCurrentValue();
+                if (currentValue < 0)
                 {
-                    currentValue = storageValue;
+                    currentValue = 0;
                 }
                 // make it a toogle button (-> get rid of the "pressed" ui effect)
-                appSettings->setContentWidgetData(QString("text"), settings[i].getValues()[settings[i].getCurrentValue()]);
+                appSettings->setContentWidgetData(QString("text"), settings[i].getValues()[currentValue]);
                 appSettings->setContentWidgetData(QString("additionalText"),settings[i].getValues()[1 - currentValue]);
                 break;
             default:
@@ -516,6 +536,7 @@
                     iPublicView->disconnect(extraSettingsId, 0, 0, 0);
                     model->removeItem(model->indexFromItem(extraSettings[i].getId()));
                     extraSettings[i].setId(0);
+                    extraSettings[i].disconnectFromUi();
                 }
             }
         }
@@ -532,7 +553,7 @@
     // empty filter -> all bearer types included
     QSet<CmApplSettingsUi::BearerTypeFilter> filter;
     // reset the result
-    netConnSelection.result = CmApplSettingsUi::SelectionTypeDestination;       
+    netConnSelection.result = netConn.type;       
     netConnSelection.id = netConn.id;
     // init settings ui with destinations, filter and initial selection
     netConnSettingsUi->setOptions(listItems, filter);
@@ -549,22 +570,26 @@
                                     mainForm->model())->itemFromIndex(dataItemIndex);
     int itemType = item->data(HbDataFormModelItem::ItemTypeRole).toInt();
     HbComboBox * comboBox = NULL;
-    HbPushButton * pushButton = NULL;    
+    HbPushButton * pushButton = NULL;
+    HbWidget * widget = (qobject_cast<HbDataFormViewItem *> 
+        (mainForm->itemByIndex(dataItemIndex)))->dataItemContentWidget();
+    JavaApplicationSettings* settings = findSettings(widget);
+    if (settings == NULL || settings->isConnectedToUi())
+    {
+        return;
+    }
+    settings->connectToUi();
     switch(HbDataFormModelItem::DataItemType(itemType))
     {
         case HbDataFormModelItem::ComboBoxItem:
-            comboBox = static_cast<HbComboBox*>(
-                (qobject_cast<HbDataFormViewItem *> 
-                (mainForm->itemByIndex(dataItemIndex)))->dataItemContentWidget());
+            comboBox = static_cast<HbComboBox*>(widget);
             iPublicView->connect(comboBox,
                                  SIGNAL(currentIndexChanged(const QString &)),
                                  iPublicView, SLOT(_q_settingsChanged(const QString &)),
                                  Qt::UniqueConnection);
             break;
         case HbDataFormModelItem::ToggleValueItem:
-            pushButton = static_cast< HbPushButton*>(
-                (qobject_cast<HbDataFormViewItem *> 
-                (mainForm->itemByIndex(dataItemIndex)))->dataItemContentWidget());
+            pushButton = static_cast< HbPushButton*>(widget);
             iPublicView->connect(pushButton,
                                  SIGNAL(clicked(bool)),
                                  iPublicView, SLOT(_q_settingsChanged(bool)),
@@ -579,34 +604,70 @@
     {    
         netConnSelection = netConnSettingsUi->selection();
         // store the selection
-        if (netConnSelection.id != netConn.id)
+        if (netConnSelection.id != netConn.id 
+            && netConnSelection.id != defaultConnId)
         {
-            ConnectionManager::setDestinationNetworkIdL(iSuiteUid, netConnSelection.id);
-            netConn.id = netConnSelection.id;
-            readNetworkConnectionName();
-            generalSettings[netSettIndex].getId()->setContentWidgetData(QString("text"), netConn.name);
-            generalSettings[netSettIndex].getId()->setContentWidgetData(QString("additionalText"), netConn.name);
+            TRAPD(err, 
+                switch(netConnSelection.result)
+                {
+                    case CmApplSettingsUi::SelectionTypeDestination:
+                        ConnectionManager::setDestinationNetworkIdL(iSuiteUid, netConnSelection.id);
+                        break;
+                    case CmApplSettingsUi::SelectionTypeConnectionMethod:
+                        ConnectionManager::setApnIdL(iSuiteUid, netConnSelection.id);
+                        break;
+                }                
+            );
+            if (err == KErrNone)
+            {
+                netConn.id = netConnSelection.id;
+                netConn.type = netConnSelection.result;
+                readNetworkConnectionName();
+                generalSettings[netSettIndex].getId()->setContentWidgetData(QString("text"), netConn.name);
+                generalSettings[netSettIndex].getId()->setContentWidgetData(QString("additionalText"), netConn.name);
+            }
         }
     }
 }
 
+void JavaApplicationSettingsViewPrivate::securityWarningDismissed(HbAction* action)
+{
+    HbMessageBox *dlg = static_cast<HbMessageBox*>(sender());
+    secWarningAccepted = (action == dlg->actions().at(0));
+    asyncToSyncCallEventLoop->exit();
+}
+
+void JavaApplicationSettingsViewPrivate::initNetworkConnection()
+{
+    TRAP_IGNORE(
+        netConn.id = ConnectionManager::getDestinationNetworkIdL(iSuiteUid);
+        if (netConn.id == (uint)KJavaNetworkAccessNotSpecified)
+        {
+            netConn.id = ConnectionManager::getApnIdL(iSuiteUid);
+        }
+    );
+    QNetworkConfigurationManager manager;
+    QNetworkConfiguration defaultCfg = manager.defaultConfiguration();
+    defaultConnId = defaultCfg.identifier().toInt();
+    QNetworkConfiguration cfg = manager.configurationFromIdentifier(
+        QString::number(netConn.id));
+    if (!cfg.isValid())
+    {
+        cfg = defaultCfg;
+    }
+    netConn.name = QString(hbTrId(cfg.name().toUtf8()));
+}
+
 void JavaApplicationSettingsViewPrivate::readNetworkConnectionName()
 {
     QNetworkConfigurationManager manager;
-    QNetworkConfiguration cfg;    
-    if (netConn.id == 0)
+    QNetworkConfiguration cfg = manager.configurationFromIdentifier(
+        QString::number(netConn.id));
+    if (!cfg.isValid())
     {
-        // figure out the default configuration
         cfg = manager.defaultConfiguration();
     }
-    else
-    {
-        cfg = manager.configurationFromIdentifier(QString::number(netConn.id));
-    }
-    if (cfg.isValid())
-    {
-        netConn.name = hbTrId(cfg.name().toUtf8());
-    }
+    netConn.name = QString(hbTrId(cfg.name().toUtf8()));
 }
 
 JavaApplicationSettings* JavaApplicationSettingsViewPrivate::findSettings(HbWidget* id)
@@ -648,8 +709,7 @@
 
 bool JavaApplicationSettingsViewPrivate::securityWarningAccepted(const QString& text, const QString& acceptActionLabel, const QString& rejectActionLabel, const QString& headingText)
 {
-    return true;
-/*    HbMessageBox securityWarning(HbMessageBox::MessageTypeQuestion);
+    HbMessageBox securityWarning(HbMessageBox::MessageTypeQuestion);
     securityWarning.setDismissPolicy(HbDialog::NoDismiss);
     securityWarning.setTimeout(HbDialog::NoTimeout);
     securityWarning.setIconVisible(false);
@@ -657,15 +717,62 @@
     securityWarning.addAction(new HbAction(
             acceptActionLabel, &securityWarning));
     securityWarning.addAction(new HbAction(
-           rejectActionLabel, &securityWarning));
-   securityWarning.setHeadingWidget(new HbLabel(headingText));
-   HbAction *selected = securityWarning.exec();
-   return (selected == securityWarning.primaryAction());*/
+            rejectActionLabel, &securityWarning));
+    securityWarning.setHeadingWidget(new HbLabel(headingText));
+    securityWarning.open(this, SLOT(securityWarningDismissed(HbAction*)));
+    asyncToSyncCallEventLoop->exec();
+    return secWarningAccepted;
+}
+
+void JavaApplicationSettingsViewPrivate::configureList(QList<JavaApplicationSettings*>& list, const QStringList& settingsNames,  const QHash<QString, int>& settingsIndexes)
+{
+    for(int i=0; i<settingsNames.size(); i++)
+    {
+        if (settingsIndexes.contains(settingsNames[i]))
+        {
+            list << &(extraSettings[settingsIndexes.value(settingsNames[i])]);
+        }
+    }
 }
 
-int JavaApplicationSettingsViewPrivate::readFromStorage(JavaApplicationSettings& settings)
+void JavaApplicationSettingsViewPrivate::attachList(const QString& settingsName, const QList<JavaApplicationSettings*>& list, const QHash<QString, int>& settingsIndexes, bool isHighRiskList)
+{
+    if (settingsIndexes.contains(settingsName))
+    {
+        if (isHighRiskList)
+        {
+            extraSettings[settingsIndexes.value(settingsName)].setHighRiskList(list);
+        }
+        else
+        {
+            extraSettings[settingsIndexes.value(settingsName)].setMutuallyExclusiveList(list);
+        }
+    }
+}
+
+void JavaApplicationSettingsViewPrivate::installTranslator(const QString& translationFileName)
 {
-    int currentValue = -1;
+    QTranslator* translator = new QTranslator;
+
+    // load the correct translation of the localized strings for the java settings
+    // Current solution reads it from Z only (this does not work with IAD)
+    // -> check if translator can handle path without drive letter (e.g. the resource
+    // is loaded from the same drive where the DLL is loaded)
+    if (translator->load("z:/resource/qt/translations/" 
+        + translationFileName + "_" + QLocale::system().name()))
+    {
+        translators.append(translator); 
+        qApp->installTranslator(translator);
+    } 
+    else 
+    {
+        delete translator; 
+        translator = NULL;
+    }
+}
+
+void JavaApplicationSettingsViewPrivate::readFromStorage(JavaApplicationSettings& settings)
+{
     if (settings.getColumnName().size() > 0 
             && settings.getTableName().size() > 0)
     {
@@ -718,15 +825,12 @@
             {
                 if (storageValues[i] == value)
                 {
-                    currentValue = i;
+                    settings.setCurrentValue(i);
                     break;
                 }
             }
         }
     }
-
-    settings.setCurrentValue(currentValue);
-    return currentValue;
 }
 
 void JavaApplicationSettingsViewPrivate::filterSecuritySettings(JavaApplicationSettings& settings)
@@ -861,6 +965,79 @@
     return value;
 }
 
+vector<IndexedSettingsName> JavaApplicationSettingsViewPrivate::readFromStorage(const std::wstring& aColumnName, const std::string& aTableName)
+{
+    vector<IndexedSettingsName> values;
+    
+    // hash for associating settings names with display indexes: 
+    // a settings with lower index is shown before a settings 
+    // with a higher index
+    QHash<QString, int> settingsNamesIndexes;
+    settingsNamesIndexes[QString::fromStdWString(NET_ACCESS_SETTINGS)] = 0; 
+    settingsNamesIndexes[QString::fromStdWString(LOW_LEVEL_NET_ACCESS_SETTINGS)] = 1;
+    settingsNamesIndexes[QString::fromStdWString(MESSAGING_SETTINGS)] = 2;
+    settingsNamesIndexes[QString::fromStdWString(RESTRICTED_MESSAGING_SETTINGS)] = 3;
+    settingsNamesIndexes[QString::fromStdWString(CALL_CONTROL_SETTINGS)] = 4;
+    settingsNamesIndexes[QString::fromStdWString(LOCAL_CONNECTIVITY_SETTINGS)] = 5;
+    settingsNamesIndexes[QString::fromStdWString(MULTIMEDIA_RECORDING_SETTINGS)] = 6;
+    settingsNamesIndexes[QString::fromStdWString(WRITE_USER_DATA_ACCESS_SETTINGS)] = 7;
+    settingsNamesIndexes[QString::fromStdWString(READ_USER_DATA_ACCESS_SETTINGS)] = 8;
+    settingsNamesIndexes[QString::fromStdWString(LOCATION_SETTINGS)] = 9;
+    settingsNamesIndexes[QString::fromStdWString(LANDMARK_SETTINGS)] = 10;
+    settingsNamesIndexes[QString::fromStdWString(AUTHENTICATION_SETTINGS)] = 11;
+    settingsNamesIndexes[QString::fromStdWString(SMART_CARD_COMMUNICATION_SETTINGS)] = 12;
+    settingsNamesIndexes[QString::fromStdWString(APPLICATION_AUTO_INVOCATION_SETTINGS)] = 13;
+    settingsNamesIndexes[QString::fromStdWString(BROADCAST_SETTINGS)] = 14;
+    settingsNamesIndexes[QString::fromStdWString(NFC_WRITE_ACCESS_SETTINGS)] = 15;
+    settingsNamesIndexes[QString::fromStdWString(URL_START_SETTINGS)] = 16;
+    int last_index = 16;
+
+    JavaStorageApplicationEntry_t query;
+    JavaStorageApplicationList_t queryResult;
+    JavaStorageEntry attr;
+    attr.setEntry(ID, iSuiteUid);
+    query.insert(attr);
+    attr.setEntry(aColumnName, L"");
+    query.insert(attr);
+
+    try
+    {
+        iStorage->search(aTableName, query, queryResult);
+        JavaStorageApplicationList_t::const_iterator iterator;
+        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+        {
+            std::wstring name = L"";
+            JavaStorageApplicationEntry_t entry = (*iterator);
+            JavaStorageEntry findPattern;
+            findPattern.setEntry(aColumnName, L"");
+            JavaStorageApplicationEntry_t::const_iterator findIterator =
+                entry.find(findPattern);
+            if (findIterator != entry.end())
+            {
+                name = findIterator->entryValue();
+            }
+            
+            if (name.size() > 0)
+            {
+                IndexedSettingsName value;
+                value.name = name;
+                value.index = last_index + 1;
+                if (settingsNamesIndexes.contains(QString::fromStdWString(name)))
+                {
+                    value.index = settingsNamesIndexes.value(QString::fromStdWString(name));
+                }
+                values.push_back(value);
+            }
+        }
+    }
+    catch (JavaStorageException& aJse)
+    {
+        // Don't leave. Set defaults.
+    }
+
+    return values;
+}
+
 void JavaApplicationSettingsViewPrivate::readSuiteUid(const QString& aAppUid)
 {
     iSuiteUid = L"";
--- a/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.h	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasettings/appsettingsview_qt/src/javaapplicationsettingsview_p.h	Fri Jun 11 13:33:44 2010 +0300
@@ -18,7 +18,10 @@
 #define JAVAAPPLICATIONSETTINGSVIEW_P_H
 
 #include <QVector>
+#include <QList>
+#include <QTranslator>
 #include <QModelIndex>
+#include <QEventLoop>
 #include <memory>
 #include <cmapplsettingsui.h>
 #include "javaapplicationsettings.h"
@@ -30,6 +33,21 @@
 class HbDataFormModel;
 class HbDataFormModelItem;
 class JavaApplicationSettingsView;
+class HbAction;
+
+struct IndexedSettingsName
+{
+    std::wstring name;
+    int index;
+};
+
+struct AscendingSort
+{
+    bool operator()(const IndexedSettingsName& i1, const IndexedSettingsName& i2)
+    {
+        return i1.index < i2.index;
+    }
+};
 
 class JavaApplicationSettingsViewPrivate: public QObject
 {
@@ -47,6 +65,7 @@
 
 private slots:
     void netConnSelected(uint netConnSelectionStatus);
+    void securityWarningDismissed(HbAction*);
 
 private:
     void readAllSettings();
@@ -57,16 +76,22 @@
     HbWidget * itemToWidget(const HbDataFormModelItem *);
     JavaApplicationSettings* findSettings(HbWidget* id);
     JavaApplicationSettings* findSettings(HbWidget* id, QVector<JavaApplicationSettings>& settings);
-    int readFromStorage(JavaApplicationSettings& settings);
+    void readFromStorage(JavaApplicationSettings& settings);
     void writeToStorage(JavaApplicationSettings& settings);
     bool findFromStorage(const std::wstring&, const std::wstring&, const std::wstring&, const std::string&);
     std::wstring readFromStorage(const std::wstring&, const std::wstring&, const std::wstring&, const std::string&);
+    std::vector<IndexedSettingsName> readFromStorage(const std::wstring& aColumnName, const std::string& aTableName);
     void filterSecuritySettings(JavaApplicationSettings& settings);
     void findEntry(const java::storage::JavaStorageApplicationList_t&, const std::wstring&, std::wstring& eValue);
     void readSuiteUid(const QString& aAppUid);
     bool securityWarningAccepted(const QString& text, const QString& acceptActionLabel, const QString& rejectActionLabel, const QString& headingText);
     void handleNetworkSettings();
     void readNetworkConnectionName();
+    void initNetworkConnection();
+    void configureList(QList<JavaApplicationSettings*>&, const QStringList&, const QHash<QString, int>&);
+    void attachList(const QString& settingsName, const QList<JavaApplicationSettings*>&, const QHash<QString, int>&, bool isHighRiskList = true);
+    void installTranslator(const QString& translationFileName);
+    
 private:
     HbDataForm * mainForm;
     HbDataFormModel *model;
@@ -78,11 +103,15 @@
     JavaApplicationSettingsView* iPublicView;
     std::auto_ptr<java::storage::JavaStorage> iStorage;
     std::wstring iSuiteUid;
-    QString BLANKET,SESSION,ONESHOT,DENIED,SECURITY_LEVEL,USER_DEFINED,SENSITIVE_SETTINGS,SENSITIVE_SETTINGS_NET_USAGE,MUTUALLY_EXCLUSIVE_SETTINGS,OK,CANCEL,SECURITY_WARNING_TITLE,NET_ACCESS,LOW_LEVEL_NET_ACCESS,NETWORK_CONNECTION,NETWORK_CONNECTION_CHANGE;
+    QString BLANKET,SESSION,ONESHOT,DENIED,SECURITY_LEVEL,USER_DEFINED,SENSITIVE_SETTINGS,SENSITIVE_SETTINGS_NET_USAGE,MUTUALLY_EXCLUSIVE_SETTINGS,OK,CANCEL,SECURITY_WARNING_TITLE,NET_ACCESS,LOW_LEVEL_NET_ACCESS,NETWORK_CONNECTION,NETWORK_CONNECTION_CHANGE,SETTINGS_TITLE,SETTINGS_NOT_AVAILABLE;
     CmApplSettingsUi* netConnSettingsUi;
     CmApplSettingsUi::SettingSelection netConnSelection;
     JavaApplicationSettings::NetworkConnection netConn;
     int netSettIndex;
+    QEventLoop* asyncToSyncCallEventLoop;
+    bool secWarningAccepted;
+    int defaultConnId;
+    QList<QTranslator *> translators;
 };
 
 
--- a/javamanager/javasidchecker/build/javasidchecker.mmp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasidchecker/build/javasidchecker.mmp	Fri Jun 11 13:33:44 2010 +0300
@@ -39,8 +39,7 @@
 // Includes
 USERINCLUDE     .
 USERINCLUDE     ../inc
-
-SYSTEMINCLUDE ../../../inc /epoc32/include/ecom /epoc32/include/swi
+USERINCLUDE     ../../../inc
 
 // Sources
 SOURCEPATH    ../src
--- a/javamanager/javasidchecker/src/javasidchecker.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javasidchecker/src/javasidchecker.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -21,7 +21,7 @@
 
 
 #include <e32std.h>
-#include <implementationproxy.h>
+#include <ecom/implementationproxy.h>
 #include <appversion.h>
 
 #include "javauids.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javaupgradeapp/build/javaupgradeapp.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,31 @@
+#
+# 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: Helper application for uninstalling a java application and 
+#    then installing new application (java or native)
+#
+# 
+
+TEMPLATE=app
+TARGET=javaupgradeapp
+CONFIG += omj no_icon stl
+CONFIG -= qt
+
+symbian {
+    TARGET.UID2          = 0x2000CFEC
+    TARGET.UID3          = 0x2002FF64
+    TARGET.CAPABILITY = TrustedUI 
+    LIBS +=  -lestor -lapparc -lapgrfx
+}
+
+include(../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javaupgradeapp/sis/java_upgradeapp.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,37 @@
+;
+; 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: Helper application for uninstalling a java application and
+;    then installing new application (any installation package file)
+;
+;Languages
+&EN
+
+
+#{"javaupgradeapp"},(0x2002FF64),1,1,0, TYPE=SA,RU
+
+;Localised Vendor name
+%{"Nokia"}
+
+;Unique Vendor name
+:"Nokia"
+
+;Supports Series 60 v 5.0
+;This line indicates that this installation is for the Series 60 platform v3.0
+;This line must appear _exactly_ as shown below in the sis file
+;If this line is missing or incorrect, the sis file will not be able
+;to be installed on Series 60 v5.0 platforms
+[0x1028315F], 0, 0, 0, {"Series60ProductID"}
+
+;
+"\epoc32\release\armv5\urel\javaupgradeapp.exe"-"c:\sys\bin\javaupgradeapp.exe"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javaupgradeapp/src.s60/javaupgradeapp.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,407 @@
+/*
+* 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:  Helper application for uninstalling a java application and
+*    then installing new application (java or native)
+*
+*/
+
+#include <apgcli.h>
+#include <apacmdln.h>
+#include <apmstd.h>
+#include <bacline.h>
+#include <e32cmn.h>
+#include <s32mem.h>
+#include <unistd.h>
+
+#include "exceptionbase.h"
+#include "javaoslayer.h"
+#include "javaprocessconstants.h"
+#include "javasymbianoslayer.h"
+#include "javauids.h"
+#include "logger.h"
+
+
+using namespace java::util;
+
+
+_LIT(KHexValueStart, "0x");
+_LIT(KSemiColon, ";");
+_LIT(KUidArg, "uid=");
+_LIT(KFileArg, "file=");
+
+const TInt KExtraLenForLogging = 2;
+const TInt KArgumentValueMaxLen = 1568;
+// Wait for 0.5 sec if ArcApp has not yet initialized
+const TInt KDelayWhenWaitingAppArc = 500000;
+
+
+/**
+ * Set the value of the argument specified by aArgName to aArgValue
+ *
+ * @param aCmdLine command line to be parsed
+ * @param aArgName the name of the argument
+ * @param aArgValue the value parsed from command line will be returned here
+ */
+static void getArgValueL(const TPtrC &aCmdLine, const TDesC &aArgName, HBufC **aArgValue)
+{
+    TBuf<KArgumentValueMaxLen> valueBuf;
+    TInt argPos = aCmdLine.FindF(aArgName);
+    if (argPos >= 0)
+    {
+        TInt semicolonPos = aCmdLine.Mid(argPos).Find(KSemiColon);
+        if (KErrNotFound == semicolonPos)
+        {
+            semicolonPos = aCmdLine.Mid(argPos).Length();
+        }
+        TInt argLen = semicolonPos - aArgName.Length();
+        if (argLen >= KArgumentValueMaxLen)
+        {
+            // Protect from buffer overflow.
+            WLOG2(EUtils,
+                  "javaupgradeapp: argument value len too long (%d), cutting it to %d",
+                  argLen, (KArgumentValueMaxLen - 1));
+            argLen = KArgumentValueMaxLen - 1;
+        }
+        else if (argLen == 0)
+        {
+            User::Leave(KErrArgument);
+        }
+
+        valueBuf = aCmdLine.Mid(argPos + aArgName.Length(),  argLen);
+    }
+
+    // Allocate new HBufC and return it
+    HBufC *pBufValue = HBufC::NewL(valueBuf.Length() + 2);
+    *pBufValue = valueBuf;
+    *aArgValue = pBufValue;
+}
+
+
+/**
+ * Parse the name from the value of 'file' parameter in
+ * command line given in aCmdLine
+ *
+ * @param aCmdLine  command line to be parsed, the format is
+ *  <other_args>;file=YYY;<other_args>
+ * @param aFileName will contain the name parsed from command line
+ */
+static void getNameFromCommandLineL(const TPtrC &aCmdLine, HBufC **aFileName)
+{
+    TInt err = aCmdLine.FindF(KFileArg);
+    User::LeaveIfError(err);
+
+    getArgValueL(aCmdLine, KFileArg, aFileName);
+}
+
+
+/**
+ * Parse the Uid from the value of 'uid' parameter in
+ * command line given in aCmdLine
+ *
+ * @param aCmdLine  command line to be parsed, the format is
+ *  uid=YYY;<other_args>
+ * @param aUid will contain the Uid parsed from command line
+ */
+static void getUidFromCommandLineL(const TPtrC &aCmdLine, TInt32 &aUid)
+{
+    TInt err(KErrNone);
+    TInt argPos = aCmdLine.FindF(KUidArg);
+    if (KErrNotFound != argPos)
+    {
+        TPtrC uidToParse = aCmdLine.Mid(argPos + KUidArg.iTypeLength);
+        TLex parseUid(uidToParse);
+        if (uidToParse.FindF(KHexValueStart) == 0)
+        {
+            parseUid.Inc(2); // skip hex prefix
+            TUint32 tmpValue;
+            err = parseUid.Val(tmpValue, EHex);
+            aUid = tmpValue;
+        }
+        else
+        {
+            err = parseUid.Val(aUid);
+        }
+
+        if (KErrNone != err)
+        {
+            ELOG1(EUtils,
+                  "javaupgradeapp failed parsing app Uid from cmdline uid param. Error %d",
+                  err);
+        }
+    }
+    else
+    {
+        ELOG(EUtils,
+             "javaupgradeapp cannot uninstall app because uid parameter is not given");
+    }
+
+    User::LeaveIfError(err);
+}
+
+
+/**
+ * Parse the process command line.
+ * Determine the uid of the Java application to be uninstalled and
+ * the name of the application package to be installed.
+ * Leaves if argument 'file' exist but file name cannot be found,
+ * leaves if argument 'uid' exist but uid cannot be parsed from command line,
+ * does NOT leave if only one of the arguments is present
+ *
+ * @param aFileName returns value of argument 'file'
+ * @param aUid returns Uid of the Java application to be uninstalled
+ */
+void getFileAndUidL(HBufC **aFileName, TInt32 *aUid)
+{
+    HBufC *pBufCmdLine =
+        HBufC::NewLC(User::CommandLineLength() + KExtraLenForLogging);
+    TPtr cmdLineBuf = pBufCmdLine->Des();
+    User::CommandLine(cmdLineBuf);
+
+    if (cmdLineBuf.Length() > 0)
+    {
+        LOG1WSTR(EUtils, EInfo,
+                 "javaupgradeapp: full java application cmd line is : %s",
+                 (wchar_t *)(cmdLineBuf.PtrZ()));
+
+        // Get the midlet uid from the commandline
+        TRAPD(err, getUidFromCommandLineL(cmdLineBuf, *aUid));
+        // It is enough that either midlet uid OR installation package name
+        // have been given in commandline
+        if ((err != KErrNone) && (err != KErrNotFound))
+        {
+            User::Leave(err);
+        }
+
+        // Get the name of the installation package from the commandline
+        TRAPD(err2, getNameFromCommandLineL(cmdLineBuf, aFileName))
+        if (err2 != KErrNone)
+        {
+            if (err2 == KErrNotFound)
+            {
+                if (err == KErrNotFound)
+                {
+                    // Both arguments missing
+                    User::Leave(KErrArgument);
+                }
+            }
+            else
+            {
+                User::Leave(err2);
+            }
+        }
+    }
+    else
+    {
+        ELOG(EUtils, "javaupgradeapp: empty command line");
+        User::Leave(KErrArgument);
+    }
+
+    CleanupStack::PopAndDestroy(pBufCmdLine);
+}
+
+
+/**
+ * Uninstall the java application specified by aUid parameter.
+ *
+ * @param aUid the Uid of the java application to be uninstalled
+ */
+void uninstallJavaAppL(TInt32 aUid)
+{
+    RProcess rJavaInstaller;
+    TFileName fileName;
+    // Max one path name and some options -> 1536 is enough
+    TBuf<1536> commandLine;
+
+    // Build command line used to pass all necessary info to Java Installer
+    TInt len = strlen(java::runtime::JAVA_INSTALLER_STARTER_DLL);
+    TPtr8 ptr8InstallerDll((TUint8 *)java::runtime::JAVA_INSTALLER_STARTER_DLL, len, len);
+    commandLine.Copy(ptr8InstallerDll);
+
+    // Use command line options that make sure that uninstallation is done
+    // always, silently and so that the uninstalled java application will
+    // be preinstalled again if the user uninstalls it
+    commandLine.Append(_L(" uninstall -uid="));
+    commandLine.AppendNum(aUid);
+    commandLine.Append(_L(" -forceuninstall -silent -preinstall_always"));
+
+    LOG1WSTR(EUtils, EInfo,
+        "javaupgradeapp:uninstallJavaAppL Java Installer command line is %s",
+        (wchar_t *)(commandLine.PtrZ()));
+
+    // start JavaInstaller
+    TBuf<64> installerProcess;  // Actual len of the process name is 9
+    len = strlen(java::runtime::JAVA_PROCESS);
+    TPtr8 ptr8Process((TUint8 *)java::runtime::JAVA_PROCESS, len, len);
+    installerProcess.Copy(ptr8Process);
+
+    TRequestStatus status;
+    TInt err = rJavaInstaller.Create(installerProcess, commandLine);
+    if (KErrNone == err)
+    {
+        LOG(EUtils, EInfo, "javaupgradeapp:uninstallJavaAppL calling Logon");
+        // Get notification when Java Installer exits (or panics)
+        rJavaInstaller.Logon(status);
+
+        LOG(EUtils, EInfo, "javaupgradeapp:uninstallJavaAppL calling Resume");
+        rJavaInstaller.Resume();
+    }
+    else
+    {
+        ELOG1(EUtils,
+              "javaupgradeapp:uninstallJavaAppL Cannot start Java Installer, error %d",
+              err);
+        User::Leave(err);
+    }
+
+    // now wait until Java Installer exits
+    User::WaitForRequest(status);
+
+    LOG(EUtils, EInfo, "javaupgradeapp:uninstallJavaAppL calling RProcess::Close");
+    // free resources before returning
+    rJavaInstaller.Close();
+}
+
+
+/**
+ *
+ *
+ *
+ */
+void installAppPackageL(HBufC *aBufFileName)
+{
+    // Open file using default handler,
+    // if the file is an installation package, it will be installed
+    RApaLsSession apaSession;
+    TInt err = apaSession.Connect();
+    if (KErrNone != err)
+    {
+        ELOG(EUtils,
+             "javaupgradeapp:installAppPackageL: Cannot connect to AppArc server");
+        User::Leave(err);
+    }
+    CleanupClosePushL(apaSession);
+
+    TInt      retryCounter(10);
+    TThreadId handlerTreadId;
+    do
+    {
+        err = apaSession.StartDocument(*aBufFileName, handlerTreadId);
+        if (RApaLsSession::EAppListInvalid == err)
+        {
+            // Application list has not yet been populated,
+            // try again after a short delay
+            retryCounter--;
+            if (retryCounter > 0)
+            {
+                User::After(KDelayWhenWaitingAppArc);
+                continue;
+            }
+            else
+            {
+                ELOG(EUtils,
+                     "javaupgradeapp:installAppPackageL: RApaLsSession "
+                     "StartDocument returned EAppListInvalid for 10 times, exiting");
+                User::Leave(err);
+            }
+        }
+        else if (KErrNone != err)
+        {
+            ELOG1(EUtils,
+                "javaupgradeapp:installAppPackageL: RApaLsSession "
+                     "StartDocument returned error %d", err);
+            User::Leave(err);
+        }
+
+    } while (RApaLsSession::EAppListInvalid == err);
+
+    CleanupStack::PopAndDestroy(); // apaSession
+}
+
+
+/**
+ * Get the uid of the Java application to be uninstaller and
+ * start Java Installer to uninstall the application.
+ * Then install the new application package given in cmdline
+ *
+ */
+void handleUpgradeL(void)
+{
+    HBufC *pBufFileName = NULL;
+    TInt32 uid(0);
+
+    getFileAndUidL(&pBufFileName, &uid);
+
+    if (uid != 0)
+    {
+        LOG1(
+            EUtils,
+            EInfo,
+            "javaupgradeapp uninstalling app uid %d", uid);
+        uninstallJavaAppL(uid);
+    }
+
+    if (pBufFileName != NULL)
+    {
+        LOG1WSTR(EUtils, EInfo,
+            "javaupgradeapp: installing new app package %s",
+            (wchar_t *)(pBufFileName->Des().PtrZ()));
+        installAppPackageL(pBufFileName);
+
+        delete pBufFileName;
+    }
+}
+
+
+/**
+ * Main function of executable javaupgradeapp.exe.
+ * "installer app" created by Services team starts this executable when
+ * the "installer app" must be replaced with the real application (java/native or wrt)
+ *
+ * The command line format is
+ * uid=<Uid>;file=<full_path_to_installation_file>
+ * for example
+ * uid=0x10137c4d;file=D:\\temp\\upgrade\\package.sis
+ *
+ * Sample code for starting this application from the "installer app" MIDlet
+ * @code
+
+    MIDlet.platformRequest(
+        “nativeapp://application-exe=javaupgradeapp.exe;application-args=uid=0x10137c4d;file=D:\\temp\\upgrade\\package.sis”);
+
+ * @endcode
+ *
+ */
+TInt E32Main(void)
+{
+    // TODO: check that only MIDP runtime process can start this in final version
+    // that goes to ROM
+
+
+    CTrapCleanup *pCleanupStack = CTrapCleanup::New();
+    if (NULL == pCleanupStack)
+    {
+        ELOG(EUtils, "Cannot create CleanupStack in javaupgradeapp.exe main()");
+        return KErrNoMemory;
+    }
+
+    TRAPD(err, handleUpgradeL());
+    if (KErrNone != err)
+    {
+        ELOG1(EUtils, "javaupgradeapp.exe: handleUpgradeL leaved with err %d", err);
+    }
+
+    delete pCleanupStack;
+    return err;
+}
+
--- a/javamanager/preinstaller/src.s60/main.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/preinstaller/src.s60/main.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -119,7 +119,7 @@
 
     // Start active scheduler. Preinstallation starts.
     LOG(EJavaPreinstaller, EInfo, "startPreinstallationL: Starting CActiveScheduler");
-    CActiveScheduler::Start();
+    CActiveScheduler::Start(); // codescanner::activestart
 
     // Now preinstallation has been done
     LOG(EJavaPreinstaller, EInfo, "startPreinstallationL: Cleaning up");
--- a/javaruntimes/installer/starterdll/src/main.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaruntimes/installer/starterdll/src/main.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -212,7 +212,7 @@
 #endif
 
         // Wait 3 seconds so that Java Captain has time to start
-        User::After(3000000);
+        User::After(3000000); // codescanner::userafter
     }
     else
     {
--- a/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java	Thu May 27 12:49:31 2010 +0300
+++ b/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java	Fri Jun 11 13:33:44 2010 +0300
@@ -25,16 +25,18 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
+import java.security.AccessControlException;
+
 import com.nokia.mj.impl.rt.utils.ExtensionUtil;
+import com.nokia.mj.impl.rt.utils.CmdLineArgsPermission;
 
 import com.nokia.mj.impl.rt.support.Jvm;
 import com.nokia.mj.impl.rt.support.JvmInternal;
 import com.nokia.mj.impl.rt.support.ThreadEventListener;
+import com.nokia.mj.impl.rt.support.ApplicationUtils;
 
 import com.nokia.mj.impl.rt.legacy.LegacySupport;
 
-import com.nokia.mj.impl.gcf.PushSecurityUtils;
-
 import com.nokia.mj.impl.security.packageprotection.PackageProtector;
 import com.nokia.mj.impl.security.common.RuntimeSecurityException;
 import com.nokia.mj.impl.security.midp.authentication.AuthenticationModule;
@@ -620,7 +622,7 @@
     {
         if (Log.mOn) Log.logI("MidletLifeCycle.handleStartRequest(), subTask: "
                                   + subTask);
-        if ((mState == POST_INIT_DONE && subTask != LifeCycleTask.PRE_WARM_START) || 
+        if ((mState == POST_INIT_DONE && subTask != LifeCycleTask.PRE_WARM_START) ||
             (mState == PRE_INIT_DONE && subTask == LifeCycleTask.PRE_WARM_START))
         {
             if (subTask == LifeCycleTask.NORMAL_START)
@@ -879,7 +881,7 @@
             t = encodedArgs.charAt(idx);
             if (t < 'a')
             {
-                if (idx + 4 >= len)
+                if (idx + 3 >= len)
                     break;
                 // decode one 16-bit char
                 char a = (char)(t - 'A');
@@ -892,7 +894,7 @@
             }
             else
             {
-                if (idx + 2 >= len)
+                if (idx + 1 >= len)
                     break;
                 // decode one 8-bit char
                 char a = (char)(t - 'a');
@@ -960,7 +962,7 @@
         // If system property com.nokia.mid.cmdline has value, it contains
         // the arguments for the current MIDlet.
         setMidletArguments();
-    
+
         if (mPrewarmStart)
         {
             // Get the recorded heap size from previous run.
@@ -995,23 +997,23 @@
         if ((mMainArgs.findArgument("-autoinvocation") != null) ||
                 mAutoinvocationFromUrl)
         {
+            if (Log.mOn) Log.logI("Ensuring autoinvocation.");
+            String pushAdditionalInfo =
+                mMainArgs.findArgument("-autoInvocationAdditional");
+            if (Log.mOn) Log.logI("  addInfo: '" + pushAdditionalInfo + "'");
+
+            // ensure security
             try
             {
-                if (Log.mOn) Log.logI("Ensuring autoinvocation.");
-                String pushAdditionalInfo =
-                    mMainArgs.findArgument("-autoInvocationAdditional");
-                if (Log.mOn) Log.logI("  addInfo: '" + pushAdditionalInfo + "'");
-                PushSecurityUtils.ensurePermission("autoinvocation",
-                                                   pushAdditionalInfo);
-
+                ApplicationUtils appUtils = ApplicationUtils.getInstance();
+                CmdLineArgsPermission cmdLineArgsPermission = 
+                    new CmdLineArgsPermission();
+                appUtils.checkPermission(cmdLineArgsPermission);
                 if (Log.mOn) Log.logI("Autoinvocation allowed.");
-            }
-            catch (SecurityException se)
+            }catch(AccessControlException e)
             {
-                // The user didn't allow starting. Throw StartupException and
-                // mark it as non fatal.
-                if (Log.mOn) Log.logI("Autoinvocation NOT allowed.");
-                throw new StartupException("Auto invocation not allowed.",
+                if (Log.mOn) Log.logI("Autoinvocation NOT allowed.");                
+                throw new StartupException(e.toString(),
                                            false);
             }
         }
@@ -1169,7 +1171,7 @@
             if (mAcceptedUserProperties == null)
             {
                 // Doing intialization only once.
-                String launchParams = 
+                String launchParams =
                   ApplicationInfoImpl.getMidletInfo().getAttribute("Nokia-MIDlet-Launch-Params");
                 mAcceptedUserProperties = split(launchParams, ",");
             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/utils/CmdLineArgsPermission.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* 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: Permission object for managing access to command line API feature
+*
+*/
+
+
+
+package com.nokia.mj.impl.rt.utils;
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import com.nokia.mj.impl.security.common.PermissionBase;
+import com.nokia.mj.impl.security.utils.SecurityPromptMessage;
+
+/**
+ * Permission class representing the token access to command line API feature.
+ *
+ */
+public class CmdLineArgsPermission extends PermissionBase
+{
+    /**
+     * Constructor
+     *
+     */
+    public CmdLineArgsPermission()
+    {
+        super(null);
+    }
+
+    /**
+     * Returns the question (as localized text) associated with the security
+     * prompt
+     *
+     * @return the localized text associated with the security prompt
+     */
+    public String getSecurityPromptQuestion(int aInteractionMode)
+    {
+        return (SecurityPromptMessage.getInstance()).getText(
+            SecurityPromptMessage.QUESTION_ID_APP_AUTO_LAUNCH,
+            null);
+    }
+
+    /**
+     * Only implies permission objects of same instance
+     */
+    public boolean implies(Permission p)
+    {
+        if (p instanceof CmdLineArgsPermission)
+        {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * String representation of the permission
+     */
+    public String toString()
+    {
+        return "com.nokia.webstart";
+    }
+    
+    /**
+     * Don't allow cloning
+     */
+    public boolean equals(Object obj)
+    {
+        return (obj.hashCode() == hashCode());
+    }
+
+    /**
+     * Not supported
+     */
+    public int hashCode()
+    {
+        return 0;
+    }
+
+    /**
+     * Actions are not supported
+     */
+    public String getActions()
+    {
+        return null;
+    }
+
+    /**
+     * Permission collections not supported
+     */
+    public PermissionCollection newPermissionCollection()
+    {
+        return null;
+    }
+}
\ No newline at end of file
--- a/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java	Thu May 27 12:49:31 2010 +0300
+++ b/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java	Fri Jun 11 13:33:44 2010 +0300
@@ -312,6 +312,8 @@
             mNetworkPromptSchemes = new Hashtable();
             mNetworkPromptSchemes.put("http:","javax.microedition.io.Connector.http");
             mNetworkPromptSchemes.put("https:","javax.microedition.io.Connector.https");
+            mNetworkPromptSchemes.put("rtsp:","javax.microedition.io.Connector.rtsp");
+            mNetworkPromptSchemes.put("mms:","javax.microedition.io.Connector.rtsp");
         }
         if (mNoPromptSchemes == null)
         {
@@ -320,9 +322,7 @@
             mNoPromptSchemes = new Hashtable();
             mNoPromptSchemes.put("cti:","");
             mNoPromptSchemes.put("mailto:","");
-            mNoPromptSchemes.put("mms:","");
             mNoPromptSchemes.put("mmsto:","");
-            mNoPromptSchemes.put("rtsp:","");
             mNoPromptSchemes.put("sms:","");
             mNoPromptSchemes.put("tel:","");
         }
--- a/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -165,6 +165,14 @@
 
         // Starting with lower old space in pre warm case.
         jvm->overrideOldHeapSize(36);
+
+        // In the pre-warm start we need to add something into class path.
+        // Otherwise the VM puts class path to point MIDP private data cage.
+#ifdef RD_JAVA_SYMBIAN_TARGET
+        jvm->appendClassPath(L"z:/private/ignore.jar");
+#else // RD_JAVA_SYMBIAN_TARGET
+        jvm->appendClassPath(L"./ignore.jar");
+#endif // RD_JAVA_SYMBIAN_TARGET
     }
 
     // If the requested to go to back ground, pass the info to Java peer.
--- a/javaruntimes/starterutils/src.s60/j9starters60.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javaruntimes/starterutils/src.s60/j9starters60.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -205,6 +205,10 @@
     {
         pathType = BOOT_CLASSPATH_TCKRUNNER;
     }
+    else if (mIdentifier == L"JavaControlPanel")
+    {
+        pathType = BOOT_CLASSPATH_JAVACONTROLPANEL;
+    }
 
     std::list<std::wstring> odcFiles;
     std::list<std::wstring> bcpEntities;
--- a/javatools/javacaptain_app/build/bld.inf	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
-PRJ_PLATFORMS
-default
-
-PRJ_MMPFILES
-javacaptainapp.mmp
\ No newline at end of file
--- a/javatools/javacaptain_app/build/javacaptainapp.mmp	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-#include <bldvariant.hrh>
-#include <data_caging_paths.hrh>
-#include <platform_paths.hrh>
-#include <../../../inc/java_stdcpp_support_for_exe.hrh>
-#include <../../../inc/project_defines.hrh>
-
-TARGET          JavaCap.exe
-TARGETTYPE      exe
-UID             0x100039CE 0x20022D3C
-CAPABILITY      AllFiles WriteDeviceData PowerMgmt NetworkControl
-
-SOURCEPATH      ../src.s60
-SOURCE          javacap.cpp
-
-PAGED
-
-USERINCLUDE ../../../inc
-
-START RESOURCE  javacap.rss
-HEADER
-TARGETPATH      APP_RESOURCE_DIR
-LANG            SC
-END  // RESOURCE
-
-START RESOURCE  javacap_reg.rss
-// Do not change the UID below.
-TARGETPATH      /private/10003a3f/apps
-END
-
-LIBRARY         apparc.lib
-LIBRARY         cone.lib
-LIBRARY         eikcore.lib
-LIBRARY         eikcoctl.lib
-LIBRARY         avkon.lib
-LIBRARY         bafl.lib
-LIBRARY         egul.lib
-LIBRARY         ws32.lib
-LIBRARY         flogger.lib
-LIBRARY         efsrv.lib
-LIBRARY         centralrepository.lib
-
-LIBRARY javacomms.lib
-LIBRARY javaipc.lib
-LIBRARY javastorage.lib
-LIBRARY javadebugapi.lib
-  
-// End of file
--- a/javatools/javacaptain_app/src.s60/javacap.cpp	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,685 +0,0 @@
-/*
-* Copyright (c) 2008 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:  JavaCap
-*
-*/
-
-
-#include "comms.h"
-#include "rtcmessages.h"
-#include "coremessages.h"
-
-#include "logger.h"
-
-#include "javacap.h"
-#include "javacap.hrh"
-
-#include "javainifileutils.h"
-
-#include <centralrepository.h>
-#include <SWInstallerInternalCRKeys.h>
-
-#include "javastoragenames.h"                   // Storage constants.
-#include "securitystoragedatadefs.h"
-
-#include <javacap.rsg>
-
-_LIT(KJavaCapYes, "Yes");
-_LIT(KJavaCapNo,  "No");
-_LIT(KUserSecurityMode,  "User");
-_LIT(KNormalSecurityMode,  "Default");
-_LIT(KS60SecurityPolicyName,  "S60");
-_LIT(KMSASecurityPolicyName,  "MSA");
-_LIT(KATTSecurityPolicyName,  "AT&T");
-_LIT(KS60SecurityPolicy,  "s60");
-_LIT(KMSASecurityPolicy,  "msa");
-_LIT(KATTSecurityPolicy,  "att");
-// Java Security Policy Central Repository UID
-static const TUid KCRUidJavaSecurity = { 0x2001B289 };
-// IDs for security folder and file keys
-static const TUint32 KPolicy = 0x03;
-static const TUint32 KSecurityWarnings = 0x04;
-const int KS60SecurityPolicyId = 1;
-const int KMSASecurityPolicyId = 2;
-const int KATTSecurityPolicyId = 3;
-
-using namespace java::storage;
-using namespace std;
-using namespace java::util;
-using namespace java::comms;
-using namespace java::captain;
-
-void CJavaCaptainContainer::ConstructL(const TRect& aRect)
-{
-    JELOG2(EJavaCaptain);
-    mCaptainRunning = true;
-    mPrewarmEnabled = false;
-#if defined(RD_JAVA_PREWARM) && !defined (__WINS__)
-    mPrewarmEnabled = true;
-#endif // RD_JAVA_PREWARM
-    mPrewarmUiEnabled = false;
-    mDebugEnabled = false;
-    mRedirectEnabled = false;
-    iStorage.reset(JavaStorage::createInstance());
-    try
-    {
-        iStorage->open();
-    }
-    catch (JavaStorageException& aJse)
-    {
-        User::Leave(aJse.mStatus);
-    }
-    mUserSecurityModeEnabled = (GetSecurityWarningsMode() == SECURITY_WARNINGS_USER_DEFINED_MODE);
-    mSecurityPolicyId = GetSecurityPolicy();
-    mHeader = _L("Java states:");
-    updateStates();
-    CreateWindowL();
-    SetRect(aRect);
-    ActivateL();
-    mRedirector.reset(new LogRedirector());
-}
-
-CJavaCaptainContainer::~CJavaCaptainContainer()
-{
-    JELOG2(EJavaCaptain);
-}
-
-void CJavaCaptainContainer::Draw(const TRect& /*aRect*/) const
-{
-    JELOG2(EJavaCaptain);
-    CWindowGc& gc = SystemGc();
-    gc.Clear();
-
-    const CFont* usedFont = CEikonEnv::Static()->NormalFont();
-    gc.UseFont(usedFont);
-
-    gc.DrawText(mHeader,TPoint(10,20));
-    int pos = 50;
-    gc.DrawText(mCaptainState,TPoint(20,pos));
-    int gap = 25;
-    pos += gap;
-    gc.DrawText(mPrewarmState,TPoint(20,pos));
-    pos += gap;
-    gc.DrawText(mPrewarmUiState,TPoint(20,pos));
-    pos += gap;
-    gc.DrawText(mDebugState,TPoint(20,pos));
-    pos += gap;
-    gc.DrawText(mSecurityMode,TPoint(20,pos));
-    pos += gap;
-    gc.DrawText(mSecurityPolicy,TPoint(20,pos));
-    pos += gap;
-    gc.DrawText(mRedirectState,TPoint(20,pos));
-
-    gc.DiscardFont();
-}
-
-void CJavaCaptainContainer::updateStates()
-{
-
-    int propertyVal = java::util::JavaIniFileUtils::getProperty(java::util::UI_PREWARM);
-    if (propertyVal != -1)
-    {
-        mPrewarmUiEnabled = propertyVal;
-    }
-
-    mCaptainState = _L("Captain running:               ");
-    if (mCaptainRunning)
-    {
-        mCaptainState.Append(KJavaCapYes);
-    }
-    else
-    {
-        mCaptainState.Append(KJavaCapNo);
-    }
-
-    mPrewarmState = _L("Prewarm enabled:           ");
-    if (mPrewarmEnabled)
-    {
-        mPrewarmState.Append(KJavaCapYes);
-    }
-    else
-    {
-        mPrewarmState.Append(KJavaCapNo);
-    }
-
-    mPrewarmUiState = _L("Prewarm UI enabled:      ");
-    if (mPrewarmUiEnabled)
-    {
-        mPrewarmUiState.Append(KJavaCapYes);
-    }
-    else
-    {
-        mPrewarmUiState.Append(KJavaCapNo);
-    }
-
-    mDebugState = _L("Java Debug enabled:      ");
-    if (mDebugEnabled)
-    {
-        mDebugState.Append(KJavaCapYes);
-    }
-    else
-    {
-        mDebugState.Append(KJavaCapNo);
-    }
-
-    mSecurityMode = _L("Security warnings:      ");
-    if (mUserSecurityModeEnabled)
-    {
-        mSecurityMode.Append(KUserSecurityMode);
-    }
-    else
-    {
-        mSecurityMode.Append(KNormalSecurityMode);
-    }
-
-    mSecurityPolicy = _L("Security policy:      ");
-    switch (mSecurityPolicyId)
-    {
-    case KS60SecurityPolicyId:
-        mSecurityPolicy.Append(KS60SecurityPolicyName);
-        break;
-    case KMSASecurityPolicyId:
-        mSecurityPolicy.Append(KMSASecurityPolicyName);
-        break;
-    case KATTSecurityPolicyId:
-        mSecurityPolicy.Append(KATTSecurityPolicyName);
-        break;
-    default:
-        mSecurityPolicy.Append(KS60SecurityPolicyName);
-    }
-
-    mRedirectState = _L("Redirect logs:                   ");
-    if (mRedirectEnabled)
-    {
-        mRedirectState.Append(KJavaCapYes);
-    }
-    else
-    {
-        mRedirectState.Append(KJavaCapNo);
-    }
-
-    DrawDeferred();
-}
-
-void CJavaCaptainContainer::setCaptainState(bool running)
-{
-    mCaptainRunning = running;
-    updateStates();
-}
-
-
-
-#include "commsmessage.h"
-#include "commsclientendpoint.h"
-
-void CJavaCaptainContainer::handleStateChangeCmd(int cmd)
-{
-    switch (cmd)
-    {
-
-    case ETogglePrewarmEnable:
-    {
-        mPrewarmEnabled = !mPrewarmEnabled;
-        CommsMessage message;
-        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
-        if (mPrewarmEnabled)
-        {
-            message.setMessageId(CORE_MSG_ID_START_PREWARM);
-        }
-        else
-        {
-            message.setMessageId(CORE_MSG_ID_STOP_PREWARM);
-        }
-        CommsClientEndpoint comms;
-        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
-        comms.send(message);
-        comms.disconnect();
-        break;
-    }
-    case ETogglePrewarmUiEnable:
-        mPrewarmUiEnabled = !mPrewarmUiEnabled;
-        java::util::JavaIniFileUtils::setProperty(java::util::UI_PREWARM, mPrewarmUiEnabled);
-        break;
-
-    case EDebugMode:
-    {
-        mDebugEnabled = !mDebugEnabled;
-
-        CommsMessage message;
-        std::wstring vmArgs = L"";
-        if (mDebugEnabled)
-        {
-            vmArgs = L"-Xrunjdwp:server=y,address=localhost:8000";
-        }
-        setSetExtraArguments(message, vmArgs, L"");
-
-        CommsClientEndpoint comms;
-        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
-        comms.send(message);
-        comms.disconnect();
-    }
-    break;
-
-    case ESecurityMode:
-    {
-        mUserSecurityModeEnabled = !mUserSecurityModeEnabled;
-
-        if (mUserSecurityModeEnabled)
-        {
-            SetSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
-        }
-        else
-        {
-            SetSecurityWarningsMode(SECURITY_WARNINGS_DEFAULT_MODE);
-        }
-    }
-    break;
-    case ES60SecurityPolicy:
-        mSecurityPolicyId = KS60SecurityPolicyId;
-        SetSecurityPolicy(mSecurityPolicyId);
-        break;
-    case EMSASecurityPolicy:
-        mSecurityPolicyId = KMSASecurityPolicyId;
-        SetSecurityPolicy(mSecurityPolicyId);
-        break;
-    case EATTSecurityPolicy:
-        mSecurityPolicyId = KATTSecurityPolicyId;
-        SetSecurityPolicy(mSecurityPolicyId);
-        break;
-
-    case ERedirectMode:
-        mRedirectEnabled = !mRedirectEnabled;
-        if (mRedirectEnabled)
-        {
-            mRedirector->start();
-        }
-        else
-        {
-            mRedirector->stop();
-        }
-        break;
-
-    default:
-        break;
-    }
-    updateStates();
-}
-
-std::wstring CJavaCaptainContainer::GetSecurityWarningsMode()
-{
-    try
-    {
-        JavaStorageApplicationEntry_t query;
-        JavaStorageApplicationList_t queryResult;
-        JavaStorageEntry attr;
-        attr.setEntry(ID, L"");
-        query.insert(attr);
-        attr.setEntry(SECURITY_WARNINGS, L"");
-        query.insert(attr);
-        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
-        JavaStorageApplicationList_t::const_iterator iterator;
-        JavaStorageApplicationList_t domainQueryResult;
-        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
-        {
-            std::wstring securityWarnings = L"";
-            JavaStorageApplicationEntry_t entry = (*iterator);
-            findColumn(entry, SECURITY_WARNINGS, securityWarnings);
-            if (securityWarnings == SECURITY_WARNINGS_USER_DEFINED_MODE)
-            {
-                // make them all USER
-                SetSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
-                return SECURITY_WARNINGS_USER_DEFINED_MODE;
-            }
-        }
-    }
-    catch (JavaStorageException& aJse)
-    {
-    }
-    // one mroe check: central repository
-    std::wstring securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
-    TRAP_IGNORE(
-        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
-        TInt warningsMode;
-        User::LeaveIfError(repository->Get(KSecurityWarnings, warningsMode));
-        switch (warningsMode)
-{
-case 1:
-    securityWarningsMode = SECURITY_WARNINGS_USER_DEFINED_MODE;
-    break;
-case 2:
-    securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
-    break;
-}
-CleanupStack::PopAndDestroy(repository););
-    return securityWarningsMode;
-}
-
-void CJavaCaptainContainer::SetSecurityWarningsMode(const std::wstring& aSecurityWarningsMode)
-{
-    try
-    {
-        JavaStorageApplicationEntry_t query;
-        JavaStorageApplicationList_t queryResult;
-        JavaStorageEntry attr;
-        attr.setEntry(ID, L"");
-        query.insert(attr);
-        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
-        JavaStorageApplicationList_t::const_iterator iterator;
-        JavaStorageApplicationList_t domainQueryResult;
-        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
-        {
-            std::wstring uid = L"";
-            JavaStorageApplicationEntry_t entry = (*iterator);
-            findColumn(entry, ID, uid);
-            JavaStorageApplicationEntry_t oldEntry;
-            JavaStorageEntry oldAttr;
-            oldAttr.setEntry(ID, uid);
-            oldEntry.insert(oldAttr);
-            attr.setEntry(SECURITY_WARNINGS, aSecurityWarningsMode);
-            entry.clear();
-            entry.insert(attr);
-            iStorage->update(MIDP_PACKAGE_TABLE, entry, oldEntry);
-        }
-    }
-    catch (JavaStorageException& aJse)
-    {
-    }
-    // set the cenRep key as well
-    TRAP_IGNORE(
-        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
-        if (aSecurityWarningsMode == SECURITY_WARNINGS_USER_DEFINED_MODE)
-{
-    repository->Set(KSecurityWarnings, 1);
-    }
-    else
-    {
-        repository->Set(KSecurityWarnings, 2);
-    }
-    CleanupStack::PopAndDestroy(repository);
-    );
-}
-
-void  CJavaCaptainContainer::findColumn(const JavaStorageApplicationEntry_t& aEntry,
-                                        const wstring& aColName, wstring& aColValue)
-{
-    JavaStorageEntry findPattern;
-    findPattern.setEntry(aColName, L"");
-    JavaStorageApplicationEntry_t::const_iterator findIterator =
-        aEntry.find(findPattern);
-    if (findIterator != aEntry.end())
-    {
-        aColValue = findIterator->entryValue();
-    }
-}
-
-
-int CJavaCaptainContainer::GetSecurityPolicy()
-{
-    int securityPolicyId =KS60SecurityPolicyId;
-    TRAP_IGNORE(
-        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
-        HBufC* buf = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
-        TPtr policy(buf->Des());
-        User::LeaveIfError(repository->Get(KPolicy, policy));
-        if (policy.Compare(KS60SecurityPolicy) == 0)
-{
-    securityPolicyId = KS60SecurityPolicyId;
-}
-else if (policy.Compare(KMSASecurityPolicy) == 0)
-{
-    securityPolicyId = KMSASecurityPolicyId;
-}
-else if (policy.Compare(KATTSecurityPolicy) == 0)
-{
-    securityPolicyId = KATTSecurityPolicyId;
-}
-CleanupStack::PopAndDestroy(buf);
-CleanupStack::PopAndDestroy(repository););
-    return securityPolicyId;
-}
-
-void CJavaCaptainContainer::SetSecurityPolicy(int aSecurityPolicyId)
-{
-    TRAP_IGNORE(
-        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
-        switch (aSecurityPolicyId)
-{
-case KS60SecurityPolicyId:
-    User::LeaveIfError(repository->Set(KPolicy, KS60SecurityPolicy));
-        break;
-    case KMSASecurityPolicyId:
-        User::LeaveIfError(repository->Set(KPolicy, KMSASecurityPolicy));
-        break;
-    case KATTSecurityPolicyId:
-        User::LeaveIfError(repository->Set(KPolicy, KATTSecurityPolicy));
-        break;
-    }
-    CleanupStack::PopAndDestroy(repository););
-}
-
-//
-// CJavaCaptainAppUi
-//
-CJavaCaptainAppUi::~CJavaCaptainAppUi()
-{
-    JELOG2(EJavaCaptain);
-    RemoveFromStack(iAppView);
-    delete iAppView;
-    delete mPeriodic;
-}
-
-void CJavaCaptainAppUi::ConstructL()
-{
-    JELOG2(EJavaCaptain);
-    BaseConstructL();
-    iAppView=new(ELeave) CJavaCaptainContainer;
-    iAppView->SetMopParent(this);
-    iAppView->ConstructL(ClientRect());
-
-    iCoeEnv->RootWin().EnableFocusChangeEvents();
-    mPeriodic=CPeriodic::NewL(CActive::EPriorityStandard);
-
-    AddToStackL(iAppView);
-
-}
-
-_LIT(KExecutableName, "javacaptain.exe");
-
-void senMsgToSplash(int id)
-{
-    CommsMessage message;
-    message.setModuleId(1);
-    message.setMessageId(id);
-    CommsClientEndpoint comms;
-    comms.connect(10900);
-    comms.send(message);
-    comms.disconnect();
-}
-
-TInt CJavaCaptainAppUi::tick(TAny* appUi)
-{
-    CJavaCaptainAppUi* app = static_cast<CJavaCaptainAppUi*>(appUi);
-//    ELOG1(EJavaCaptain,"mActive: %d", app->mActive);
-    if (app->mActive)
-    {
-        senMsgToSplash(1);
-    }
-    else
-    {
-        senMsgToSplash(2);
-    }
-    app->mActive = !app->mActive;
-    return 0;
-}
-
-void CJavaCaptainAppUi::HandleCommandL(TInt aCommand)
-{
-    JELOG2(EJavaCaptain);
-
-    switch (aCommand)
-    {
-    case EAknSoftkeyExit:
-    case EEikCmdExit:
-        Exit();
-        break;
-    case ECaptainStart:
-    {
-        RProcess proc;
-        int st = proc.Create(KExecutableName, KExecutableName);
-        if (st == KErrNone)
-        {
-            proc.Resume();
-            iAppView->setCaptainState(true);
-        }
-        proc.Close();
-    }
-    break;
-
-    case ECaptainStop:
-    {
-        CommsMessage message;
-        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
-        message.setMessageId(CORE_MSG_ID_STOP_JAVACAPTAIN);
-        CommsClientEndpoint comms;
-        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
-        comms.send(message);
-        comms.disconnect();
-        iAppView->setCaptainState(false);
-    }
-    break;
-
-    case EThreadDump:
-    {
-        CommsMessage message;
-        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
-        message.setMessageId(CORE_MSG_ID_DO_THREAD_DUMP);
-        CommsClientEndpoint comms;
-        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
-        comms.send(message);
-        comms.disconnect();
-    }
-    break;
-
-    case ETogglePrewarmEnable:
-    case ETogglePrewarmUiEnable:
-    case EDebugMode:
-    case ESecurityMode:
-    case ES60SecurityPolicy:
-    case EMSASecurityPolicy:
-    case EATTSecurityPolicy:
-    case ERedirectMode:
-        iAppView->handleStateChangeCmd(aCommand);
-        break;
-
-    default:
-        Exit();
-        break;
-    }
-}
-
-CEikAppUi* CJavaCaptainEikDocument::CreateAppUiL()
-{
-    JELOG2(EJavaCaptain);
-    return(new(ELeave) CJavaCaptainAppUi);
-}
-
-void CJavaCaptainEikDocument::ConstructL()
-{
-    JELOG2(EJavaCaptain);
-}
-
-TUid CJavaCaptainApplication::AppDllUid() const
-{
-    JELOG2(EJavaCaptain);
-    return KUidJavaCaptain;
-}
-
-CApaDocument* CJavaCaptainApplication::CreateDocumentL()
-{
-    JELOG2(EJavaCaptain);
-    CJavaCaptainEikDocument* document=new(ELeave) CJavaCaptainEikDocument(*this);
-    CleanupStack::PushL(document);
-    document->ConstructL();
-    CleanupStack::Pop();
-    return(document);
-}
-
-#include <eikstart.h>
-
-LOCAL_C CApaApplication* NewApplication()
-{
-    JELOG2(EJavaCaptain);
-    return new CJavaCaptainApplication;
-}
-
-
-GLDEF_C TInt E32Main()
-{
-    JELOG2(EJavaCaptain);
-    return EikStart::RunApplication(NewApplication);
-}
-
-
-#include <fcntl.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-LogRedirector::LogRedirector() : mFd(-1)
-{
-    iJavaDiagnostic.reset(JavaDiagnostic::createInstance());
-}
-
-LogRedirector::~LogRedirector()
-{
-}
-
-void LogRedirector::start()
-{
-    iJavaDiagnostic->setDiagnosticListener(*this);
-    mFd = open("c:\\data\\javaredirect.log", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
-}
-
-void LogRedirector::stop()
-{
-    iJavaDiagnostic->removeDiagnosticListener();
-    close(mFd);
-    mFd = -1;
-}
-
-void LogRedirector::systemOut(const TDesC8& aData)
-{
-    write(aData);
-}
-
-void LogRedirector::systemErr(const TDesC8& aData)
-{
-    write(aData);
-}
-
-void LogRedirector::log(const TDesC8& aData)
-{
-    write(aData);
-}
-
-void LogRedirector::write(const TDesC8& aData)
-{
-    if (mFd > 0)
-    {
-        ::write(mFd, (const char*)aData.Ptr(), aData.Size());
-    }
-};
-
-
-
-// End of File
--- a/javatools/javacaptain_app/src.s60/javacap.h	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/*
-* Copyright (c) 2008 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:  JavaCap
-*
-*/
-
-#ifndef JAVACAP_H
-#define JAVACAP_H
-
-#include <aknapp.h>
-#include <aknappui.h>
-#include <AknDoc.h>
-#include <memory>
-#include <f32file.h>
-#include "javastorage.h"
-#include "javadiagnostic.h"
-using namespace java::debug;
-
-const TUid KUidJavaCaptain={ 0x20022D3C };
-class LogRedirector;
-
-class CJavaCaptainContainer : public CCoeControl
-{
-public:
-    void ConstructL(const TRect& aRect);
-    ~CJavaCaptainContainer();
-    static void ThreadMain(CJavaCaptainContainer*);
-    void updateStates();
-    void setCaptainState(bool running);
-    void handleStateChangeCmd(int cmd);
-
-private:
-    void StartCaptain();
-    void Draw(const TRect& aRect) const;
-    std::wstring GetSecurityWarningsMode();
-    void SetSecurityWarningsMode(const std::wstring& aSecurityWarningsMode);
-    int GetSecurityPolicy();
-    void SetSecurityPolicy(int);
-    void findColumn(const java::storage::JavaStorageApplicationEntry_t& aEntry, const std::wstring& aColName, std::wstring& aColValue);
-
-
-private:
-    TBuf<20>        mHeader;
-    TBuf<40>        mCaptainState;
-    TBuf<40>        mPrewarmState;
-    TBuf<40>        mPrewarmUiState;
-    TBuf<40>        mDebugState;
-    TBuf<40>        mSecurityMode;
-    TBuf<40>        mSecurityPolicy;
-    TBuf<40>        mRedirectState;
-
-    bool            mCaptainRunning;
-    bool            mPrewarmEnabled;
-    bool            mPrewarmUiEnabled;
-    bool            mDebugEnabled;
-    bool            mUserSecurityModeEnabled;
-    int             mSecurityPolicyId;
-    bool            mRedirectEnabled;
-
-    std::auto_ptr<java::storage::JavaStorage> iStorage;
-    std::auto_ptr<LogRedirector> mRedirector;
-};
-
-class CJavaCaptainEikDocument : public CAknDocument
-{
-public:
-    void ConstructL();
-    CJavaCaptainEikDocument(CEikApplication& aApp): CAknDocument(aApp) { }
-    ~CJavaCaptainEikDocument() {}
-private:
-    // from CAknDocument
-    CEikAppUi* CreateAppUiL();
-};
-
-class CJavaCaptainAppUi : public CAknAppUi
-{
-public:
-    void ConstructL();
-    ~CJavaCaptainAppUi();
-
-public:
-    static TInt tick(TAny* splash);
-
-private:
-    void HandleCommandL(TInt aCommand);
-    CJavaCaptainContainer* iAppView;
-    bool                   mActive;
-    CPeriodic*             mPeriodic;
-};
-
-class CJavaCaptainApplication : public CAknApplication
-{
-private:
-    // from CApaApplication
-    CApaDocument* CreateDocumentL();
-    TUid AppDllUid() const;
-};
-
-class LogRedirector : public DiagnosticListener
-{
-public:
-    LogRedirector();
-    ~LogRedirector();
-
-    void start();
-    void stop();
-
-    // DiagnosticListener methods
-    virtual void systemOut(const TDesC8& aData);
-    virtual void systemErr(const TDesC8& aData);
-    virtual void log(const TDesC8& aData);
-
-private:
-    void write(const TDesC8& aData);
-    std::auto_ptr<java::debug::JavaDiagnostic> iJavaDiagnostic;
-
-    int mFd;
-};
-
-#endif // JAVACAP_H
-
--- a/javatools/javacaptain_app/src.s60/javacap.hrh	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
-#ifndef _JAVACAP_HRH
-#define _JAVACAP_HRH
-
-enum JavaCapCommandIds
-{
-    ECaptainCtl = 1,
-    EPrewarmCtl,
-    ECaptainStart,
-    ECaptainStop,
-    ETogglePrewarmEnable,
-    ETogglePrewarmUiEnable,
-    EThreadDump,
-    EDebugMode,
-    ESecurityMode,
-    ESecurityPolicy,
-    ES60SecurityPolicy,
-    EMSASecurityPolicy,
-    EATTSecurityPolicy,
-    ERedirectMode
-};
-#endif
--- a/javatools/javacaptain_app/src.s60/javacap.rss	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-NAME JACA
-
-#include <eikon.rh>
-#include <avkon.rh>
-#include <avkon.rsg>
-#include <avkon.hrh>
-
-#ifdef RD_SCALABLE_UI
-#include <appinfo.rh>
-#endif
-
-#include "javacap.hrh"
-
-#include <data_caging_paths_strings.hrh>
-
-RESOURCE RSS_SIGNATURE { }
-
-RESOURCE TBUF { buf="javacap"; }
-
-RESOURCE EIK_APP_INFO
-    {
-    menubar = r_javacap_menubar;
-    cba=R_AVKON_SOFTKEYS_OPTIONS_EXIT;
-    }
-
-#ifdef RD_SCALABLE_UI
-RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
-{
-    short_caption = "JavaCap";
-    caption_and_icon = CAPTION_AND_ICON_INFO
-    {
-        caption = "JavaCap";
-    };
-}
-#endif
-
-//----------------------------------------------------
-//   
-//    r_javacap_menubar
-//
-//----------------------------------------------------
-//
-RESOURCE MENU_BAR r_javacap_menubar
-    {
-    titles =
-        {
-        MENU_TITLE { menu_pane = r_javacap_menu; txt = "Menu"; }
-        };
-    }
-
-//----------------------------------------------------
-//   
-//    r_askello_menu
-//
-//----------------------------------------------------
-//
-RESOURCE MENU_PANE r_javacap_menu
-{
-    items =
-    {
-        MENU_ITEM { command = ECaptainCtl; txt = "JavaCaptain"; cascade = r_javacap_sub_menu;},
-        MENU_ITEM { command = EPrewarmCtl; txt = "Prewarm"; cascade = r_javacap_prewarm_menu; },
-        MENU_ITEM { command = EThreadDump; txt = "Thread dump";},
-        MENU_ITEM { command = EDebugMode; txt = "Change debug mode";},
-        MENU_ITEM { command = ESecurityMode; txt = "Change security warnings";},
-        MENU_ITEM { command = ESecurityPolicy; txt = "SecurityPolicy"; cascade = r_javacap_secpolicy_sub_menu;},
-        MENU_ITEM { command = ERedirectMode; txt = "Change redirect mode";}
-    };
-}
-
-RESOURCE MENU_PANE r_javacap_sub_menu
-{
-    items =
-    {
-        MENU_ITEM { command = ECaptainStart; txt = "Start Captain"; },
-        MENU_ITEM { command = ECaptainStop; txt = "Stop Captain"; }
-    };
-}
-
-RESOURCE MENU_PANE r_javacap_secpolicy_sub_menu
-{
-    items =
-    {
-        MENU_ITEM { command = ES60SecurityPolicy; txt = "S60"; },
-        MENU_ITEM { command = EMSASecurityPolicy; txt = "MSA"; },
-        MENU_ITEM { command = EATTSecurityPolicy; txt = "AT&T"; }
-    };
-}
-
-RESOURCE MENU_PANE r_javacap_prewarm_menu
-{
-    items =
-    {
-        MENU_ITEM { command = ETogglePrewarmEnable; txt = "Prewarm (on/off)"; },
-        MENU_ITEM { command = ETogglePrewarmUiEnable; txt = "Prewarm UI (on/off)"; }
-    };
-}
-
--- a/javatools/javacaptain_app/src.s60/javacap_reg.rss	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-#include <appinfo.rh>
-
-UID2 KUidAppRegistrationResourceFile
-UID3 0x20022D3C
-
-RESOURCE APP_REGISTRATION_INFO
-{
-    app_file = "JavaCap";
-    embeddability = KAppNotEmbeddable;
-    newfile=KAppDoesNotSupportNewFile;
-}
-
-// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/build/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,30 @@
+<!--
+#
+# 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: 
+#
+-->
+
+<project name="javacontrolpanel" basedir="." default="deploy">
+
+  <import file="../../../../build/utilities.xml"/>
+
+  <property name="bootclasspath" value="${bootclasspath.cldc}"/>
+
+  <property name="javah.classnames" 
+            value="com.nokia.mj.impl.javacontrolpanel.JavaCaptain,
+                   com.nokia.mj.impl.javacontrolpanel.Redirector,
+                   com.nokia.mj.impl.javacontrolpanel.SecurityConfig"/>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/build/bwins/javacontrolpanelu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/build/eabi/javacontrolpanelu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/build/javacontrolpanel.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,29 @@
+#
+# 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:
+#
+
+TARGET=javacontrolpanel
+TEMPLATE=lib
+
+CONFIG += omj java stl
+CONFIG -= qt
+
+LIBS += -ljavastorage
+
+symbian {
+    LIBS += -ljavadebugapi -lcentralrepository
+}
+
+include(../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaCaptain.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,206 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.javacontrolpanel;
+
+import com.nokia.mj.impl.utils.Logger;
+import com.nokia.mj.impl.comms.*;
+import com.nokia.mj.impl.comms.exception.*;
+
+
+class JavaCaptain
+{
+    private final static int PLUGIN_ID_JAVACAPTAIN_CORE_C = 13;
+    private final static int CORE_MSG_ID_STOP_JAVACAPTAIN = 130;
+    private final static int CORE_MSG_ID_DO_THREAD_DUMP = 131;
+    private final static int CORE_MSG_ID_START_PREWARM = 132;
+    private final static int CORE_MSG_ID_STOP_PREWARM = 133;
+    private final static int CORE_MSG_ID_GET_PREWARM = 134;
+
+    private final static int PLUGIN_ID_RTC_C = 1;
+    private final static int RTC_MSG_ID_SET_EXTRA_ARGUMENTS = 150;
+    private final static int RTC_MSG_ID_GET_EXTRA_ARGUMENTS = 151;
+
+    private final static String JVM_DEBUG_ARGS = "-Xrunjdwp:server=y,address=localhost:8000";
+
+    public JavaCaptain()
+    {
+    }
+
+    public boolean isRunning()
+    {
+        CommsEndpoint comms = new CommsEndpoint();
+        boolean isRunning = false;
+        try
+        {
+            comms.connect(CommsEndpoint.JAVA_CAPTAIN);
+            comms.disconnect();
+            isRunning = true;
+        }
+        catch (CommsException e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            comms.destroy();
+        }
+        return isRunning;
+    }
+
+    public void start()
+    {
+        _start();
+        // wait until JC message loop is up
+        for(int i = 0; i < 5; i++)
+        {
+            try
+            {
+                Thread.sleep(30);
+            }
+            catch(InterruptedException e) {}
+            if (isRunning())
+            {
+                break;
+            }
+        }
+    }
+
+    public void stop()
+    {
+        CommsMessage message = createMessage();
+        message.setMessageId(CORE_MSG_ID_STOP_JAVACAPTAIN);
+        // waits until JC message loop is down
+        sendReceive(message);
+    }
+
+    public boolean isPrewarmEnabled()
+    {
+        CommsMessage message = createMessage();
+        message.setMessageId(CORE_MSG_ID_GET_PREWARM);
+        CommsMessage reply = sendReceive(message);
+        int enabled = reply.readInt();
+        return enabled == 1 ? true : false;
+    }
+
+    public void enablePrewarm(boolean aEnable)
+    {
+        CommsMessage message = createMessage();
+        if (aEnable)
+        {
+            message.setMessageId(CORE_MSG_ID_START_PREWARM);
+        }
+        else
+        {
+            message.setMessageId(CORE_MSG_ID_STOP_PREWARM);
+        }
+        send(message);
+    }
+
+    public void doThreadDump()
+    {
+        CommsMessage message = createMessage();
+        message.setMessageId(CORE_MSG_ID_DO_THREAD_DUMP);
+        send(message);
+    }
+
+    public boolean isDebugEnabled()
+    {
+        CommsMessage message = createDebugMessage();
+        message.setMessageId(RTC_MSG_ID_GET_EXTRA_ARGUMENTS);
+        CommsMessage receivedMessage = sendReceive(message);
+        String vmArgs = receivedMessage.readString();
+        boolean enabled = false;
+        if(vmArgs.compareTo(JVM_DEBUG_ARGS) == 0)
+        {
+            enabled = true;
+        }
+        return enabled;
+    }
+
+    public void enableDebug(boolean aEnable)
+    {
+        String vmArgs = "";
+        if (aEnable)
+        {
+            vmArgs = JVM_DEBUG_ARGS;
+        }
+
+        CommsMessage message = createDebugMessage();
+        message.setMessageId(RTC_MSG_ID_SET_EXTRA_ARGUMENTS);
+        message.write(vmArgs);
+        message.write(""); // appArgs
+        send(message);
+    }
+
+    private void send(CommsMessage aMessage)
+    {
+        CommsEndpoint comms = new CommsEndpoint();
+        try
+        {
+            comms.connect(CommsEndpoint.JAVA_CAPTAIN);
+            comms.send(aMessage);
+            comms.disconnect();
+        }
+        catch (CommsException e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            comms.destroy();
+        }
+    }
+
+    private CommsMessage sendReceive(CommsMessage aMessage)
+    {
+        CommsEndpoint comms = new CommsEndpoint();
+        CommsMessage receivedMessage = new CommsMessage();
+        try
+        {
+            comms.connect(CommsEndpoint.JAVA_CAPTAIN);
+            receivedMessage = comms.sendReceive(aMessage, CommsEndpoint.WAIT_FOR_EVER);
+            comms.disconnect();
+        }
+        catch (CommsException e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            comms.destroy();
+        }
+        return receivedMessage;
+    }
+
+    private CommsMessage createMessage()
+    {
+        CommsMessage message = new CommsMessage();
+        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
+        return message;
+    }
+
+    private CommsMessage createDebugMessage()
+    {
+        CommsMessage message = new CommsMessage();
+        message.setModuleId(PLUGIN_ID_RTC_C);
+        return message;
+    }
+
+    private native void _start();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaControlPanel.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.javacontrolpanel;
+
+import com.nokia.mj.impl.utils.Logger;
+import com.nokia.mj.impl.rt.support.JvmInternal;
+import com.nokia.mj.impl.rt.support.ThreadEventListener;
+
+class JavaControlPanel
+{
+    /**
+     * JavaControlPanel main program.
+     *
+     * @param aArgs command line arguments
+     */
+    public static void main(String[] aArgs)
+    {
+        Logger.ILOG(Logger.EUtils, "JavaControlPanel.main starts");
+        int exitCode = 0;
+
+        try
+        {
+            JvmInternal.setThreadEventListener(new ThreadEventListener()
+            {
+                public void threadStarting(Thread newThread, Thread parentThread) {}
+                public void threadDied(Thread thread) {}
+                public void uncaughtException(Thread thread, Throwable throwable)
+                {
+                    String threadName = null;
+                    if (thread != null)
+                    {
+                        threadName = thread.getName();
+                    }
+                    Logger.ELOG(Logger.EUtils, "Unhandled exception in " +
+                                threadName, throwable);
+                }
+            });
+            exitCode = mainWithResult(aArgs);
+        }
+        catch (Throwable t)
+        {
+            Logger.ELOG(Logger.EUtils, "Unhandled exception in main", t);
+            exitCode = -1;
+        }
+
+        Logger.ILOG(Logger.EUtils, "JavaControlPanel.main exits with code " + exitCode);
+        System.exit(exitCode);
+    }
+
+    /**
+     * JavaControlPanel main program which returns error code indicating
+     * operation result.
+     *
+     * @param aArgs command line arguments
+     * @return error code indicating operation result
+     */
+    public static int mainWithResult(String[] aArgs)
+    {
+        if (aArgs.length == 0)
+        {
+            JavaControlPanelUi ui = new JavaControlPanelUi();
+            ui.show();
+        }
+        else
+        {
+            Logger.WLOG(Logger.EUtils, "JavaControlPanel making thread dump and exiting");
+            new JavaCaptain().doThreadDump();
+        }
+        return 0;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/JavaControlPanelUi.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,434 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.javacontrolpanel;
+
+import com.nokia.mj.impl.rt.support.Jvm;
+import org.eclipse.swt.layout.*;
+import org.eclipse.ercp.swt.mobile.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.graphics.*;
+
+import com.nokia.mj.impl.utils.Logger;
+
+class JavaControlPanelUi
+{
+    private JavaCaptain iCaptain;
+    private Redirector iRedirector;
+    private SecurityConfig iSecurity;
+
+    private Shell iShell;
+    private Button iJavaCaptain;
+    private Button iPrewarm;
+    private Button iThreadDump;
+    private Button iJavaDebug;
+    private Button iRedirect;
+    private Combo iSecurityWarnings;
+    private Combo iSecurityPolicy;
+
+    static
+    {
+        Jvm.loadSystemLibrary("javacontrolpanel");
+    }
+
+    public JavaControlPanelUi()
+    {
+        iCaptain = new JavaCaptain();
+        iRedirector = new Redirector();
+        iSecurity = new SecurityConfig();
+    }
+
+    public void show()
+    {
+        Display display = new Display();
+        iShell = new Shell(display);
+
+        createUi();
+        iShell.pack();
+        iShell.open();
+        handleOrientationChange();
+
+        while (!iShell.isDisposed())
+        {
+            if (!display.readAndDispatch())
+            {
+                display.sleep();
+            }
+        }
+        display.dispose();
+    }
+
+    private void exitEventLoop()
+    {
+        iRedirector.stop();
+        iShell.dispose();
+    }
+
+    private void createUi()
+    {
+        try
+        {
+            setLayout();
+            createJavaCaptainUi();
+            createPrewarmUi();
+            createThreadDumpUi();
+            createJavaDebugUi();
+            createSecurityWarningsUi();
+            createSecurityPolicyUi();
+            createRedirectLogsUi();
+            createCommands();
+            platformAdaptation();
+        }
+        catch (Throwable e)
+        {
+            Logger.ELOG(Logger.EUtils, "createUi failed", e);
+            exitEventLoop();
+        }
+    }
+
+    private void setLayout()
+    {
+        iShell.setText("Java Control Panel");
+        iShell.setLayout(new GridLayout(2, false));
+    }
+
+    private void createJavaCaptainUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Java Captain");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iJavaCaptain = new Button(iShell, SWT.TOGGLE);
+        iJavaCaptain.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iJavaCaptain.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                javaCaptainPressed();
+            }
+        });
+        toggleJavaCaptain(iCaptain.isRunning());
+    }
+
+    private void createPrewarmUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Prewarm");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iPrewarm = new Button(iShell, SWT.TOGGLE);
+        iPrewarm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iPrewarm.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                prewarmPressed();
+            }
+        });
+        togglePrewarm(iCaptain.isPrewarmEnabled());
+    }
+
+    private void createThreadDumpUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Thread Dump");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iThreadDump = new Button(iShell, SWT.PUSH);
+        iThreadDump.setText("Dump");
+        iThreadDump.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iThreadDump.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                threadDumpPressed();
+            }
+        });
+    }
+
+    private void createJavaDebugUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Java Debug");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iJavaDebug = new Button(iShell, SWT.TOGGLE);
+        iJavaDebug.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iJavaDebug.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                javaDebugPressed();
+            }
+        });
+        toggleJavaDebug(iCaptain.isDebugEnabled());
+    }
+
+    private void createSecurityWarningsUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Security Warnings");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iSecurityWarnings = new Combo(iShell, SWT.DROP_DOWN | SWT.READ_ONLY);
+        for(int i = 0; i < SecurityConfig.MODES.length; i++)
+        {
+            iSecurityWarnings.add(SecurityConfig.MODES[i]);
+        }
+        iSecurityWarnings.select(iSecurity.getWarningsMode());
+        iSecurityWarnings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iSecurityWarnings.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                securityWarningsSelected();
+            }
+        });
+    }
+
+    private void createSecurityPolicyUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Security Policy");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iSecurityPolicy = new Combo(iShell, SWT.DROP_DOWN | SWT.READ_ONLY);
+        for(int i = 0; i < SecurityConfig.POLICIES.length; i++)
+        {
+            iSecurityPolicy.add(SecurityConfig.POLICIES[i]);
+        }
+        iSecurityPolicy.select(iSecurity.getSecurityPolicy());
+        iSecurityPolicy.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iSecurityPolicy.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                securityPolicySelected();
+            }
+        });
+    }
+
+    private void createRedirectLogsUi()
+    {
+        Label label = new Label(iShell, SWT.NONE);
+        label.setText("Redirect Logs");
+        label.setLayoutData(new GridData(SWT.CENTER));
+
+        iRedirect = new Button(iShell, SWT.TOGGLE);
+        iRedirect.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        iRedirect.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent event)
+            {
+                redirectPressed();
+            }
+        });
+        toggleRedirect(iRedirector.isRedirecting());
+    }
+
+    private void createCommands()
+    {
+        Command exit = new Command(iShell, Command.EXIT, 0);
+        exit.setText("Exit");
+        exit.addSelectionListener(new SelectionListener()
+        {
+            public void widgetDefaultSelected(SelectionEvent aEvent)
+            {
+                widgetSelected(aEvent);
+            }
+            public void widgetSelected(SelectionEvent aEvent)
+            {
+                exitEventLoop();
+            }
+        });
+    }
+
+    private void platformAdaptation()
+    {
+        if (isLinux())
+        {
+            configureUi();
+        }
+    }
+
+    private void configureUi()
+    {
+        // add second dummy command so that menu bar is visible
+        new Command(iShell, Command.GENERAL, 0).setText("");
+
+        // disable not supported services
+        iRedirect.setEnabled(false);
+        iSecurityPolicy.setEnabled(false);
+        iSecurityWarnings.setEnabled(false);
+    }
+
+    private void handleOrientationChange()
+    {
+        iShell.addControlListener(new ControlListener()
+        {
+            private boolean handleEvent = false;
+            public void controlMoved(ControlEvent e)
+            {
+            }
+            public void controlResized(ControlEvent e)
+            {
+                // ignore first event that comes during startup
+                if (handleEvent)
+                {
+                    // avoid flickering during orientation change
+                    iShell.setVisible(false);
+                    iShell.layout();
+                    iShell.setVisible(true);
+                }
+                handleEvent = true;
+            }
+        });
+    }
+
+
+    private void javaCaptainPressed()
+    {
+        if (iJavaCaptain.getSelection())
+        {
+            iCaptain.start();
+            javaCaptainStarted();
+        }
+        else
+        {
+            iCaptain.stop();
+        }
+        toggleJavaCaptain(iJavaCaptain.getSelection());
+    }
+
+    private void toggleJavaCaptain(boolean aSelected)
+    {
+        iJavaCaptain.setText( aSelected ? "Running" : "Stopped");
+        iJavaCaptain.setSelection(aSelected);
+    }
+
+    private void prewarmPressed()
+    {
+        iCaptain.enablePrewarm(iPrewarm.getSelection());
+        togglePrewarm(iPrewarm.getSelection());
+    }
+
+    private void togglePrewarm(boolean aSelected)
+    {
+        iPrewarm.setText( aSelected ? "Enabled" : "Disabled");
+        iPrewarm.setSelection(aSelected);
+    }
+
+    private void threadDumpPressed()
+    {
+        iCaptain.doThreadDump();
+    }
+
+    private void javaDebugPressed()
+    {
+        iCaptain.enableDebug(iJavaDebug.getSelection());
+        toggleJavaDebug(iJavaDebug.getSelection());
+    }
+
+    private void toggleJavaDebug(boolean aSelected)
+    {
+        iJavaDebug.setText( aSelected ? "Enabled" : "Disabled");
+        iJavaDebug.setSelection(aSelected);
+    }
+
+    private void securityWarningsSelected()
+    {
+        iSecurity.setWarningsMode(iSecurityWarnings.getSelectionIndex());
+    }
+
+    private void securityPolicySelected()
+    {
+        iSecurity.setSecurityPolicy(iSecurityPolicy.getSelectionIndex());
+    }
+
+    private void redirectPressed()
+    {
+        if (iRedirect.getSelection())
+        {
+            iRedirector.start();
+        }
+        else
+        {
+            iRedirector.stop();
+        }
+        toggleRedirect(iRedirect.getSelection());
+    }
+
+    private void toggleRedirect(boolean aSelected)
+    {
+        iRedirect.setText( aSelected ? "Yes" : "No");
+        iRedirect.setSelection(aSelected);
+    }
+
+    private void javaCaptainStarted()
+    {
+        // some JavaCaptain services return to default settings
+        // when JC is restarted so refresh states
+        togglePrewarm(iCaptain.isPrewarmEnabled());
+        toggleJavaDebug(iCaptain.isDebugEnabled());
+    }
+
+    private boolean isLinux()
+    {
+        String platform = System.getProperty("os.name");
+        if (platform != null && platform.equalsIgnoreCase("linux"))
+        {
+            return true;
+        }
+        return false;
+    }
+
+}
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/Redirector.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,58 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.javacontrolpanel;
+
+class Redirector
+{
+    private int iHandle;
+
+    public Redirector()
+    {
+    }
+
+    public void start()
+    {
+        stop();
+        iHandle = _start();
+    }
+
+    public void stop()
+    {
+        if (isRedirecting())
+        {
+            _stop(iHandle);
+            iHandle = 0;
+        }
+    }
+
+    public boolean isRedirecting()
+    {
+        if (iHandle != 0)
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    private native int _start();
+    private native void _stop(int aHandle);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/javacontrolpanel/SecurityConfig.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,79 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.javacontrolpanel;
+
+import com.nokia.mj.impl.utils.Logger;
+
+
+class SecurityConfig
+{
+    private static final String SECURITY_WARNINGS_USER_DEFINED_MODE = "1";
+    private static final String SECURITY_WARNINGS_DEFAULT_MODE = "2";
+
+    private static final int S60_SECURITY_POLICY_ID = 1;
+    private static final int MSA_SECURITY_POLICY_ID = 2;
+    private static final int ATT_SECURITY_POLICY_ID = 3;
+
+    public static final String MODES[] = { "Default", "User"};
+    public static final String POLICIES[] = { "S60", "MSA", "AT&T"};
+
+    public SecurityConfig()
+    {
+    }
+
+    public int getSecurityPolicy()
+    {
+        int index = _getSecurityPolicy() - 1;
+        return index;
+    }
+
+    public void setSecurityPolicy(int aPolicyIndex)
+    {
+        int id = aPolicyIndex + 1;
+        _setSecurityPolicy(id);
+    }
+
+    public int getWarningsMode()
+    {
+        String mode = _getSecurityWarningsMode();
+        int index = 0;
+        if (mode.compareTo(SECURITY_WARNINGS_USER_DEFINED_MODE) == 0 )
+        {
+            index = 1;
+        }
+        return index;
+    }
+
+    public void setWarningsMode(int aModeIndex)
+    {
+        if (aModeIndex == 0)
+        {
+            _setSecurityWarningsMode(SECURITY_WARNINGS_DEFAULT_MODE);
+        }
+        else
+        {
+            _setSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
+        }
+    }
+
+    private native String _getSecurityWarningsMode();
+    private native void _setSecurityWarningsMode(String aMode);
+    private native int _getSecurityPolicy();
+    private native void _setSecurityPolicy(int aPolicyId);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/rt/javacontrolpanel/ApplicationInfoImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,112 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.rt.javacontrolpanel;
+
+import com.nokia.mj.impl.rt.support.ApplicationInfo;
+import com.nokia.mj.impl.utils.Uid;
+
+/**
+ * @author Nokia Corporation
+ * @version 1.0
+ */
+
+public class ApplicationInfoImpl extends ApplicationInfo
+{
+    private String iProtectionDomain = null;
+
+    /**
+     */
+    public String getRuntimeType()
+    {
+        // See runtime types defined in ApplicationInfo class.
+        return "JavaControlPanel";
+    }
+
+    /**
+     */
+    public String getProtectionDomain()
+    {
+        return MANUFACTURER_DOMAIN;
+    }
+
+    /**
+     */
+    public Uid getUid()
+    {
+        return Uid.createUid("[2002FF61]");
+    }
+
+    /**
+     */
+    public Uid getSuiteUid()
+    {
+        throw new RuntimeException
+        ("Get suite uid is not applicable for JavaControlPanel");
+    }
+
+    /**
+     */
+    public String getSuiteName()
+    {
+        return getName();
+    }
+
+    /**
+     */
+    public String getName()
+    {
+        return "JavaControlPanel";
+    }
+
+    /**
+     */
+    public String getVendor()
+    {
+        return "Nokia";
+    }
+
+    /**
+     */
+    public String getVersion()
+    {
+        return "1.0.0";
+    }
+
+    /**
+     */
+    public String getRootPath()
+    {
+        throw new RuntimeException
+        ("getRootPath is not applicable for JavaControlPanel");
+    }
+
+    /**
+     */
+    public String getMainClass()
+    {
+        throw new RuntimeException
+        ("Get main class is not applicable for JavaControlPanel");
+    }
+
+    /**
+     */
+    public String getAttribute(String key)
+    {
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/javasrc/com/nokia/mj/impl/rt/javacontrolpanel/ApplicationUtilsImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+*/
+
+package com.nokia.mj.impl.rt.javacontrolpanel;
+
+import com.nokia.mj.impl.rt.support.ApplicationInfo;
+import com.nokia.mj.impl.rt.support.ApplicationUtils;
+import com.nokia.mj.impl.utils.Uid;
+
+import java.security.Permission;
+import java.security.AccessControlException;
+
+/**
+ * @author Nokia Corporation
+ * @version 1.0
+ */
+public class ApplicationUtilsImpl extends ApplicationUtils
+{
+    public static void doShutdownImpl()
+    {
+        // Send shutdown notification to all registered listeners.
+        ((ApplicationUtilsImpl)sInstance).doShutdown();
+    }
+
+
+    public void notifyExitCmd()
+    {
+    }
+
+    public void checkPermission(Permission aPermission)
+    throws AccessControlException, NullPointerException
+    {
+        checkPermission(null, aPermission);
+    }
+
+    public void checkPermission(Uid aAppUid, Permission aPermission)
+    throws AccessControlException, NullPointerException
+    {
+        return;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src.s60/logredirector.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,68 @@
+/*
+* 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: 
+*
+*/
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include "logredirector.h"
+
+LogRedirector::LogRedirector() : mFd(-1)
+{
+    iJavaDiagnostic.reset(JavaDiagnostic::createInstance());
+}
+
+LogRedirector::~LogRedirector()
+{
+}
+
+void LogRedirector::start()
+{
+    iJavaDiagnostic->setDiagnosticListener(*this);
+    mFd = open("c:\\data\\javaredirect.log", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
+}
+
+void LogRedirector::stop()
+{
+    iJavaDiagnostic->removeDiagnosticListener();
+    close(mFd);
+    mFd = -1;
+}
+
+void LogRedirector::systemOut(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::systemErr(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::log(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::write(const TDesC8& aData)
+{
+    if (mFd > 0)
+    {
+        ::write(mFd, (const char*)aData.Ptr(), aData.Size());
+    }
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src.s60/logredirector.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* 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:
+*
+*/
+
+#ifndef LOGREDIRECTOR_H
+#define LOGREDIRECTOR_H
+
+#include <memory>
+#include "javadiagnostic.h"
+using namespace java::debug;
+
+class LogRedirector : public DiagnosticListener
+{
+public:
+    LogRedirector();
+    ~LogRedirector();
+
+    void start();
+    void stop();
+
+    // DiagnosticListener methods
+    virtual void systemOut(const TDesC8& aData);
+    virtual void systemErr(const TDesC8& aData);
+    virtual void log(const TDesC8& aData);
+
+private:
+    void write(const TDesC8& aData);
+    std::auto_ptr<JavaDiagnostic> iJavaDiagnostic;
+    int mFd;
+};
+
+#endif // LOGREDIRECTOR_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src.s60/security.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,220 @@
+/*
+* 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:
+*
+*/
+
+
+#include <centralrepository.h>
+#include <SWInstallerInternalCRKeys.h>
+
+#include "security.h"
+#include "logger.h"
+#include "javastoragenames.h"
+#include "securitystoragedatadefs.h"
+
+using namespace java::storage;
+using namespace std;
+
+_LIT(KS60SecurityPolicy,  "s60");
+_LIT(KMSASecurityPolicy,  "msa");
+_LIT(KATTSecurityPolicy,  "att");
+// Java Security Policy Central Repository UID
+static const TUid KCRUidJavaSecurity = { 0x2001B289 };
+// IDs for security folder and file keys
+static const TUint32 KPolicy = 0x03;
+static const TUint32 KSecurityWarnings = 0x04;
+
+const int S60_SECURITY_POLICY_ID = 1;
+const int MSA_SECURITY_POLICY_ID = 2;
+const int ATT_SECURITY_POLICY_ID = 3;
+
+
+Security::Security()
+{
+    try
+    {
+        iStorage.reset(JavaStorage::createInstance());
+        iStorage->open();
+    }
+    catch (JavaStorageException& e)
+    {
+        ELOG1(EUtils, "open storage connection failed, %s",  e.toString().c_str());
+    }
+}
+
+Security::~Security()
+{
+}
+
+std::wstring Security::getSecurityWarningsMode()
+{
+    try
+    {
+        JavaStorageApplicationEntry_t query;
+        JavaStorageApplicationList_t queryResult;
+        JavaStorageEntry attr;
+        attr.setEntry(ID, L"");
+        query.insert(attr);
+        attr.setEntry(SECURITY_WARNINGS, L"");
+        query.insert(attr);
+        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+        JavaStorageApplicationList_t::const_iterator iterator;
+        JavaStorageApplicationList_t domainQueryResult;
+        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+        {
+            std::wstring securityWarnings = L"";
+            JavaStorageApplicationEntry_t entry = (*iterator);
+            findColumn(entry, SECURITY_WARNINGS, securityWarnings);
+            if (securityWarnings == SECURITY_WARNINGS_USER_DEFINED_MODE)
+            {
+                // make them all USER
+                setSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
+                return SECURITY_WARNINGS_USER_DEFINED_MODE;
+            }
+        }
+    }
+    catch (JavaStorageException& aJse)
+    {
+    }
+    // one more check: central repository
+    std::wstring securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
+    TRAP_IGNORE
+    (
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        TInt warningsMode;
+        User::LeaveIfError(repository->Get(KSecurityWarnings, warningsMode));
+        switch (warningsMode)
+        {
+        case 1:
+            securityWarningsMode = SECURITY_WARNINGS_USER_DEFINED_MODE;
+            break;
+        case 2:
+            securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
+            break;
+        }
+        CleanupStack::PopAndDestroy(repository);
+    );
+    return securityWarningsMode;
+}
+
+void Security::setSecurityWarningsMode(const std::wstring& aSecurityWarningsMode)
+{
+    try
+    {
+        JavaStorageApplicationEntry_t query;
+        JavaStorageApplicationList_t queryResult;
+        JavaStorageEntry attr;
+        attr.setEntry(ID, L"");
+        query.insert(attr);
+        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+        JavaStorageApplicationList_t::const_iterator iterator;
+        JavaStorageApplicationList_t domainQueryResult;
+        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+        {
+            std::wstring uid = L"";
+            JavaStorageApplicationEntry_t entry = (*iterator);
+            findColumn(entry, ID, uid);
+            JavaStorageApplicationEntry_t oldEntry;
+            JavaStorageEntry oldAttr;
+            oldAttr.setEntry(ID, uid);
+            oldEntry.insert(oldAttr);
+            attr.setEntry(SECURITY_WARNINGS, aSecurityWarningsMode);
+            entry.clear();
+            entry.insert(attr);
+            iStorage->update(MIDP_PACKAGE_TABLE, entry, oldEntry);
+        }
+    }
+    catch (JavaStorageException& aJse)
+    {
+    }
+    // set the cenRep key as well
+    TRAP_IGNORE
+    (
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        if (aSecurityWarningsMode == SECURITY_WARNINGS_USER_DEFINED_MODE)
+        {
+            repository->Set(KSecurityWarnings, 1);
+        }
+        else
+        {
+            repository->Set(KSecurityWarnings, 2);
+        }
+        CleanupStack::PopAndDestroy(repository);
+    );
+}
+
+void Security::findColumn(const JavaStorageApplicationEntry_t& aEntry,
+                           const wstring& aColName, wstring& aColValue)
+{
+    JavaStorageEntry findPattern;
+    findPattern.setEntry(aColName, L"");
+    JavaStorageApplicationEntry_t::const_iterator findIterator =
+        aEntry.find(findPattern);
+    if (findIterator != aEntry.end())
+    {
+        aColValue = findIterator->entryValue();
+    }
+}
+
+int Security::getSecurityPolicy()
+{
+    int securityPolicyId = S60_SECURITY_POLICY_ID;
+    TRAP_IGNORE
+    (
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        HBufC* buf = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+        TPtr policy(buf->Des());
+        User::LeaveIfError(repository->Get(KPolicy, policy));
+        if (policy.Compare(KS60SecurityPolicy) == 0)
+        {
+            securityPolicyId = S60_SECURITY_POLICY_ID;
+        }
+        else if (policy.Compare(KMSASecurityPolicy) == 0)
+        {
+            securityPolicyId = MSA_SECURITY_POLICY_ID;
+        }
+        else if (policy.Compare(KATTSecurityPolicy) == 0)
+        {
+            securityPolicyId = ATT_SECURITY_POLICY_ID;
+        }
+        CleanupStack::PopAndDestroy(buf);
+        CleanupStack::PopAndDestroy(repository);
+    );
+    return securityPolicyId;
+
+}
+
+void Security::setSecurityPolicy(int aSecurityPolicyId)
+{
+    TRAP_IGNORE
+    (
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        switch (aSecurityPolicyId)
+        {
+        case S60_SECURITY_POLICY_ID:
+            User::LeaveIfError(repository->Set(KPolicy, KS60SecurityPolicy));
+            break;
+        case MSA_SECURITY_POLICY_ID:
+            User::LeaveIfError(repository->Set(KPolicy, KMSASecurityPolicy));
+            break;
+        case ATT_SECURITY_POLICY_ID:
+            User::LeaveIfError(repository->Set(KPolicy, KATTSecurityPolicy));
+            break;
+        }
+    CleanupStack::PopAndDestroy(repository);
+    );
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src.s60/security.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+*/
+
+#ifndef SECURITY_H
+#define SECURITY_H
+
+#include <string>
+#include <memory>
+#include "javastorage.h"
+
+class Security
+{
+public:
+    Security();
+    ~Security();
+
+    std::wstring getSecurityWarningsMode();
+    void setSecurityWarningsMode(const std::wstring& aMode);
+    int getSecurityPolicy();
+    void setSecurityPolicy(int aPolicyId);
+
+private:
+    void findColumn(const java::storage::JavaStorageApplicationEntry_t& aEntry,
+                    const std::wstring& aColName, std::wstring& aColValue);
+
+    std::auto_ptr<java::storage::JavaStorage> iStorage;
+};
+
+#endif // SECURITY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src/javacaptain.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:  JavaCaptain
+*
+*/
+
+
+#include "com_nokia_mj_impl_javacontrolpanel_JavaCaptain.h"
+
+#ifdef __SYMBIAN32__
+#include <spawn.h>
+#else
+#include <stdio.h>
+#endif
+
+#include <errno.h>
+#include "logger.h"
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_JavaCaptain
+ * Method:    _start
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_javacontrolpanel_JavaCaptain__1start
+  (JNIEnv *, jobject)
+{
+    int rc = 0;
+    int pid = 0;
+    char* av[2];
+    int index = 0;
+    av[index++] = "javacaptain";
+    av[index] = NULL;
+
+#ifdef __SYMBIAN32__
+    rc = posix_spawn(&pid, "javacaptain", NULL, NULL, av, NULL);
+#else
+    if (!(pid = fork()))
+    {
+        rc = execvp("javacaptain", av);
+        if (rc == -1)
+        {
+            rc = errno;
+        }
+    }
+#endif // __SYMBIAN32__
+
+    if (rc)
+    {
+        ELOG3(EUtils,"%s failed, %s - errno=%d", __PRETTY_FUNCTION__, strerror(rc), rc);
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src/redirector.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+*/
+
+
+#include "com_nokia_mj_impl_javacontrolpanel_Redirector.h"
+#include "logger.h"
+#ifdef __SYMBIAN32__
+#include "logredirector.h"
+#endif
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_Redirector
+ * Method:    _start
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_javacontrolpanel_Redirector__1start
+  (JNIEnv *, jobject)
+{
+#ifdef __SYMBIAN32__
+    LogRedirector* redirector = new LogRedirector();
+    redirector->start();
+    return (jint)redirector;
+#else
+    return 0;
+#endif
+}
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_Redirector
+ * Method:    _stop
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_javacontrolpanel_Redirector__1stop
+  (JNIEnv *, jobject, jint aHandle)
+{
+#ifdef __SYMBIAN32__
+    LogRedirector* redirector = reinterpret_cast<LogRedirector*>(aHandle);
+    redirector->stop();
+    delete redirector;
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/controlpanel/src/securityconfig.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* 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:
+*
+*/
+
+#include <string>
+#include "com_nokia_mj_impl_javacontrolpanel_SecurityConfig.h"
+#include "javajniutils.h"
+
+#ifdef __SYMBIAN32__
+#include "security.h"
+#endif
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_SecurityConfig
+ * Method:    _getSecurityWarningsMode
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_javacontrolpanel_SecurityConfig__1getSecurityWarningsMode
+  (JNIEnv* aEnv, jobject)
+{
+#ifdef __SYMBIAN32__
+    Security security;
+    std::wstring mode = security.getSecurityWarningsMode();
+    return java::util::JniUtils::wstringToJstring(aEnv, mode);
+#else
+    return java::util::JniUtils::wstringToJstring(aEnv, L"2");;
+#endif
+}
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_SecurityConfig
+ * Method:    _setSecurityWarningsMode
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_javacontrolpanel_SecurityConfig__1setSecurityWarningsMode
+  (JNIEnv* aEnv, jobject, jstring aMode)
+{
+#ifdef __SYMBIAN32__
+    Security security;
+    std::wstring mode = java::util::JniUtils::jstringToWstring(aEnv, aMode);
+    security.setSecurityWarningsMode(mode);
+#endif
+}
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_SecurityConfig
+ * Method:    _getSecurityPolicy
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_javacontrolpanel_SecurityConfig__1getSecurityPolicy
+  (JNIEnv *, jobject)
+{
+#ifdef __SYMBIAN32__
+    Security security;
+    return security.getSecurityPolicy();
+#else
+    return 1;
+#endif
+}
+
+/*
+ * Class:     com_nokia_mj_impl_javacontrolpanel_SecurityConfig
+ * Method:    _setSecurityPolicy
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_javacontrolpanel_SecurityConfig__1setSecurityPolicy
+  (JNIEnv *, jobject, jint aPolicyId)
+{
+#ifdef __SYMBIAN32__
+    Security security;
+    security.setSecurityPolicy(aPolicyId);
+#endif
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/starter/build/javacontrolpanel.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,39 @@
+#
+# 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:
+#
+
+TEMPLATE=app
+TARGET=javacontrolpanel
+CONFIG += omj no_icon stl
+CONFIG -= qt
+
+INCLUDEPATH += ../../../../javaruntimes/inc
+LIBS += -ljavacomms -ljavaruntimestarterutils
+
+symbian {
+    TARGET.EPOCHEAPSIZE  = 0x020000 0x800000
+    TARGET.EPOCSTACKSIZE = 0x14000
+    TARGET.UID2 = 0x20004c45
+    TARGET.UID3 = 0x2002FF61
+    TARGET.SID = 0x2002FF61
+
+    TARGET.CAPABILITY = AllFiles WriteDeviceData PowerMgmt NetworkControl
+
+    MMP_RULES += "START RESOURCE ../data/javacontrolpanel_reg.rss"
+    MMP_RULES += "TARGETPATH /private/10003a3f/apps"
+    MMP_RULES += "END"
+}
+
+include(../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/starter/data/javacontrolpanel_reg.rss	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* 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: javacontrolpanel_reg.rss
+*
+*/
+
+
+#include <appinfo.rh>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0x2002FF61
+
+RESOURCE APP_REGISTRATION_INFO
+{
+    app_file = "JavaControlPanel";
+    embeddability = KAppEmbeddable;
+    newfile = KAppDoesNotSupportNewFile;
+}
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacontrolpanel/starter/src/main.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* 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:  Main program for the Java Manager process
+*
+*/
+
+#include <memory>
+#include <unistd.h>
+
+#include "logger.h"
+#include "exceptionbase.h"
+#include "runtimeexception.h"
+#include "javacommonutils.h"
+#include "runtimestarterutils.h"
+#include "jvmstarter.h"
+
+using namespace java::runtime;
+using namespace java::util;
+
+int startJvm(int argc, char *argv[]);
+const wchar_t* const JavaControlPanel_MAIN_CLASS = L"com.nokia.mj.impl.javacontrolpanel.JavaControlPanel";
+
+int main(int argc, char *argv[])
+{
+    LOG(EUtils, EInfo, "JavaControlPanel main()");
+    int result = -1;
+    try
+    {
+        result = startJvm(argc, argv);
+    }
+    catch (RuntimeException& e)
+    {
+        ELOG1(EUtils, "JavaControlPanel main() RuntimeException caught: %s ",
+              e.toString().c_str());
+    }
+
+    catch (ExceptionBase& e)
+    {
+        ELOG1(EUtils, "JavaControlPanel main() ExceptionBase caught: %s ",
+              e.toString().c_str());
+    }
+
+    catch (std::exception& e)
+    {
+        ELOG1(EUtils, "JavaControlPanel main() Exception %s caught", e.what());
+    }
+
+    LOG1(EUtils, EInfo, "JavaControlPanel EXIT = %d", result);
+    return result;
+}
+
+int startJvm(int argc, char *argv[])
+{
+    JELOG2(EUtils);
+
+    // Create instance of RuntimeStarterUtils for thread supervisioning.
+    std::auto_ptr<RuntimeStarterUtils> starterUtils(new RuntimeStarterUtils());
+    starterUtils->startThreadSupervisor();
+
+    // Create starter for starting the JVM
+    std::auto_ptr<JvmStarter>
+    jvm(JvmStarter::getJvmStarterInstance(JvmStarter::CLDC,
+                                          L"JavaControlPanel"));
+
+    // Set the debugging features available provided by the captain.
+    // starterUtils->enableDevelopmentFeatures(*jvm.get());
+    // jvm->enableThreadDumping();
+
+    jvm->appendSystemProperty(L"-Dcom.nokia.rt.port=javacontrolpanel");
+    jvm->setMainClass(JavaControlPanel_MAIN_CLASS);
+
+    for (int i = 1; i < argc; ++i)
+    {
+        jvm->appendApplicationArgument(
+            JavaCommonUtils::utf8ToWstring(argv[i]));
+    }
+
+    // Start the JVM.
+    return jvm->startJvm();
+}
--- a/javatools/javatools.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javatools/javatools.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -16,7 +16,8 @@
 TEMPLATE = subdirs
 SUBDIRS += tckrunner/starter/build/tckrunner.pro 
 SUBDIRS += tckrunner/runner/build/tckrunner.pro 
+SUBDIRS += javacontrolpanel/starter/build/javacontrolpanel.pro 
+SUBDIRS += javacontrolpanel/controlpanel/build/javacontrolpanel.pro 
 SUBDIRS += javasecuritycustomization/build/javasecuritycustomization.pro 
-BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"javacaptain_app/build/bld.inf\""  
 BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"testcerts/bld.inf\""  
 BLD_INF_RULES.prj_extensions += "prj_extensions" 
--- a/javatools/subsystem.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javatools/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -19,7 +19,9 @@
 # Common
 COMPONENTS = \
 	tckrunner/starter/build \
-	tckrunner/runner/build
+	tckrunner/runner/build \
+	javacontrolpanel/starter/build \
+	javacontrolpanel/controlpanel/build \
 
 # Platform specific
 ifeq ($(BUILDENV),symbian)
@@ -43,7 +45,6 @@
 endif
 
 NONQTSUBSYSTEMS += \
-	javacaptain_app/build \
 	testcerts
 
 endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/build.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 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: Generated file - do not edit manually
+#
+TEMPLATE = subdirs
+SUBDIRS += eswtqt/eswtqt.pro 
+SUBDIRS += eswtqtwebkit/eswtqtwebkit.pro 
+BLD_INF_RULES.prj_extensions += "prj_extensions" 
--- a/javauis/eswt_qt/build/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-<!--
-#
-# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "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: 
-#
--->
-
-<project name="eswtqt" default="deploy" basedir=".">
-
-    <description>
-        Builds eSWT on Qt
-    </description>
-
-    <import file="../../../build/utilities.xml"/>
-
-    <!-- Needed by the utilities.xml. See the description form the utilities.xml
-         file -->
-
-    <property name="java.src.paths" value="../org.eclipse.swt/Eclipse_SWT_PI/s60:../org.eclipse.swt/Eclipse_SWT_PI/qt:../org.eclipse.swt/Eclipse_SWT_PI/common_j2me:../org.eclipse.swt/Eclipse SWT/qt:../org.eclipse.swt/Eclipse SWT/common_j2me:../org.eclipse.swt/Eclipse SWT/common:../org.eclipse.swt/Eclipse SWT Drag and Drop/qt:../org.eclipse.swt/Eclipse SWT Browser/qt:../org.eclipse.swt/Eclipse SWT Browser/common:../com.nokia.swt.extensions/extensions:../com.nokia.swt.extensions/midp_common:../org.eclipse.swt/Eclipse SWT Custom Widgets/common"/>
-
-    <target name="compile">
-        <omj.javac classpath="${impl.cldc.jar}" excludes="**/CDCCompatibilityDelegate.java"/>
-    </target>
-
-    <property name="javah.classnames" value="org.eclipse.swt.internal.qt.OS,
-                                             org.eclipse.swt.internal.qt.graphics.OS,
-                                             org.eclipse.swt.internal.qt.s60.OS,
-                                             org.eclipse.swt.internal.extension.OS"/>
-
-    <!-- This property gets added to eswtqt.odc created by the build system -->
-    <target name="system.properties">
-      <properties>
-          org.eclipse.ercp.swt.defaultOrientation=system
-      </properties>
-    </target>
-
-    <target name="create.public.api.jar">
-        <omj.public.apis/>
-    </target>
-
-</project>
--- a/javauis/eswt_qt/build/bwins/eswtqtu.def	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXPORTS
-	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
-
--- a/javauis/eswt_qt/build/eabi/eswtqtu.def	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-EXPORTS
-	_Z10jni_lookupPKc @ 1 NONAME
--- a/javauis/eswt_qt/build/eswtqt.pro	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "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: 
-#
-
-TEMPLATE=lib
-TARGET=eswtqt
-CONFIG += omj java
-
-QT += core \
-      gui \
-      webkit
-
-symbian: LIBS += -lhal -lws32 -lgdi
-
-include(../org.eclipse.swt/Eclipse_SWT_PI/qt/library/eswt_widgets.pri)
-include(../org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.pri)
-          
-include(../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqt/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,63 @@
+<!--
+#
+# Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+-->
+
+<project name="eswtqt" default="deploy" basedir=".">
+
+    <description>
+        Builds eSWT on Qt
+    </description>
+
+    <import file="../../../../build/utilities.xml"/>
+    
+    <target name="init.component.properties">
+        <!-- Symbian MIDP specific properties-->
+        <condition property="java.src.paths" value="../../org.eclipse.swt/Eclipse_SWT_PI/s60:../../org.eclipse.swt/Eclipse_SWT_PI/qt:../../org.eclipse.swt/Eclipse_SWT_PI/webkit:../../org.eclipse.swt/Eclipse_SWT_PI/common_j2me:../../org.eclipse.swt/Eclipse SWT/qt:../../org.eclipse.swt/Eclipse SWT/common_j2me:../../org.eclipse.swt/Eclipse SWT/common:../../org.eclipse.swt/Eclipse SWT Drag and Drop/qt:../../org.eclipse.swt/Eclipse SWT Browser/qt:../../org.eclipse.swt/Eclipse SWT Browser/common:../../com.nokia.swt.extensions/extensions:../../com.nokia.swt.extensions/midp:../../org.eclipse.swt/Eclipse SWT Custom Widgets/common">
+            <isset property="target.s60" />
+        </condition> 
+        <condition property="javah.classnames" value="org.eclipse.swt.internal.qt.OS,org.eclipse.swt.internal.qt.graphics.OS,org.eclipse.swt.internal.qt.s60.OS,org.eclipse.swt.internal.extension.OS">
+            <isset property="target.s60" />
+        </condition>
+    
+        <!-- Linux MIDP specific properties-->
+        <condition property="java.src.paths" value="../../org.eclipse.swt/Eclipse_SWT_PI/linux:../../org.eclipse.swt/Eclipse_SWT_PI/qt:../../org.eclipse.swt/Eclipse_SWT_PI/webkit:../../org.eclipse.swt/Eclipse_SWT_PI/common_j2me:../../org.eclipse.swt/Eclipse SWT/qt:../../org.eclipse.swt/Eclipse SWT/common_j2me:../../org.eclipse.swt/Eclipse SWT/common:../../org.eclipse.swt/Eclipse SWT Drag and Drop/qt:../../org.eclipse.swt/Eclipse SWT Browser/qt:../../org.eclipse.swt/Eclipse SWT Browser/common:../../com.nokia.swt.extensions/extensions:../../com.nokia.swt.extensions/midp:../../org.eclipse.swt/Eclipse SWT Custom Widgets/common">
+            <isset property="target.linux" />
+        </condition>
+        <condition property="javah.classnames" value="org.eclipse.swt.internal.qt.OS,org.eclipse.swt.internal.qt.graphics.OS,org.eclipse.swt.internal.extension.OS">
+            <isset property="target.linux" />
+        </condition>
+
+        <echo message="java.src.paths = ${java.src.paths}"/>
+        <echo message="javah.classnames = ${javah.classnames}"/>
+    </target>
+
+    <!-- This property gets added to eswtqt.odc created by the build system -->
+    <target name="system.properties">
+      <properties>
+          org.eclipse.ercp.swt.defaultOrientation=system
+      </properties>
+    </target>
+
+    <target name="compile">
+        <omj.javac classpath="${impl.cldc.jar}" excludes="**/CDCCompatibilityDelegate.java"/>
+    </target>
+
+    <target name="create.public.api.jar">
+        <omj.public.apis/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqt/bwins/eswtqtu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,6 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+	?Throw@JniUtils@eSWT@Java@@QAEXPAUJNIEnv_@@ABH@Z @ 2 NONAME ; void Java::eSWT::JniUtils::Throw(struct JNIEnv_ *, int const &)
+	?JavaStringToQString@JniUtils@eSWT@Java@@QAE?AVQString@@PAUJNIEnv_@@PAV_jstring@@@Z @ 3 NONAME ; class QString Java::eSWT::JniUtils::JavaStringToQString(struct JNIEnv_ *, class _jstring *)
+	?QStringToJavaString@JniUtils@eSWT@Java@@QAEPAV_jstring@@PAUJNIEnv_@@ABVQString@@@Z @ 4 NONAME ; class _jstring * Java::eSWT::JniUtils::QStringToJavaString(struct JNIEnv_ *, class QString const &)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqt/eabi/eswtqtu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,6 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+	_ZN4Java4eSWT8JniUtils19JavaStringToQStringEP7JNIEnv_P8_jstring @ 2 NONAME
+	_ZN4Java4eSWT8JniUtils19QStringToJavaStringEP7JNIEnv_RK7QString @ 3 NONAME
+	_ZN4Java4eSWT8JniUtils5ThrowEP7JNIEnv_RKi @ 4 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqt/eswtqt.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+
+TEMPLATE=lib
+TARGET=eswtqt
+CONFIG += omj java
+
+include(../../org.eclipse.swt/Eclipse_SWT_PI/qt/library/eswt_widgets.pri)
+include(../../org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.pri)
+          
+include(../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqtwebkit/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,38 @@
+<!--
+#
+# Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+-->
+
+<project name="eswtqtwebkit" default="deploy" basedir=".">
+
+    <description>
+        Builds the Webkit JNI library for eSWT on Qt
+    </description>
+
+    <import file="../../../../build/utilities.xml"/>
+
+    <target name="init.component.properties">
+        <property name="java.src.paths" value="../../org.eclipse.swt/Eclipse_SWT_PI/webkit"/>
+        <property name="javah.classnames" value="org.eclipse.swt.internal.qt.webkit.OS_webkit"/>
+        <echo message="java.src.paths = ${java.src.paths}"/>
+        <echo message="javah.classnames = ${javah.classnames}"/>
+    </target>
+
+    <target name="create.public.api.jar">
+        <omj.public.apis/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqtwebkit/bwins/eswtqtwebkitu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqtwebkit/eabi/eswtqtwebkitu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/eswtqtwebkit/eswtqtwebkit.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+
+TEMPLATE=lib
+TARGET=eswtqtwebkit
+CONFIG += omj java
+
+include(../../org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/eswt_webkit.pri)
+include(../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/build/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,26 @@
+#
+# 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: 
+#
+
+include $(JAVA_SRC_ROOT)/build/Makefile.defs
+
+COMPONENTS = \
+        eswtqt \
+        eswtqtwebkit
+
+include ${JAVA_SRC_ROOT}/build/Makefile.subsystem
+
+# Build order dependency
+eswtqtwebkit: eswtqt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/ApplicationUI.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.swt.internal.extension;
+
+import org.eclipse.swt.internal.qt.UIThreadManager;
+
+/**
+ * A class that provides services for transferring the control over the
+ * execution of the UI thread to the application, and services for obtaining
+ * notifications of the state of the UI until the UI thread will return back to the
+ * caller.
+ * 
+ * @see InternalUI
+ * @see ApplicationUIListener
+ */
+public final class ApplicationUI {
+	
+	/**
+	 * Hand over the execution of the UI thread to the application. If the
+	 * application has not yet requested the UI thread then it will be waiting
+	 * until that happens. The waiting can be aborted by calling
+	 * <code>abortWait()</code>.
+	 * 
+	 * The control of the thread will be passed to the application. If the
+	 * application allows the UI thread to return then this method will also
+	 * return.
+	 * 
+	 * After calling this method and before the method has returned the state of
+	 * the UI thread can be tracked by setting an
+	 * <code>ApplicationUIListener</code>.
+	 */
+	public static void run() {
+		UIThreadManager.runApplicationUI();
+	}
+	
+	/**
+	 * Aborts waiting the application to request the UI thread. This waiting can
+	 * occur after <code>run()</code> has been called if the application has not
+	 * yet at that point requested the UI thread and thus has not provided the
+	 * Runnable to call back. Aborting the waiting will cause the UI thread to
+	 * return from <code>run()</code>. If the application already obtained the
+	 * control of the UI thread then this method does nothing. 
+	 */
+	public static void abortWait() {
+		UIThreadManager.abortWait();
+	}
+	
+	/**
+	 * Sets the listener that will be notified of the state of the UI during its
+	 * life-cycle under the application's control. 
+	 * 
+	 * @param listener The listener, or null to disable the notifications
+	 */	
+	public static void setListener(ApplicationUIListener listener) {
+		final ApplicationUIListener applicationUIListener = listener;
+		org.eclipse.swt.internal.qt.ApplicationUIListener internalListener; 
+		if(listener != null) {
+			internalListener = new org.eclipse.swt.internal.qt.ApplicationUIListener() {
+				public void applicationUIThreadRequest() {
+					applicationUIListener.applicationUIThreadRequest();
+				}
+			};
+		} else {
+			internalListener = null;
+		}
+		UIThreadManager.setApplicationUIListener(internalListener);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/ApplicationUIListener.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.extension;
+
+/**
+ * An interface for providing notifications about the state of the UI during the
+ * life-time of the application.
+ */
+public interface ApplicationUIListener {
+	/**
+	 * Called when the application requests the UI thread to call back a
+	 * Runnable that the application provided.
+	 */
+	public void applicationUIThreadRequest();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/InternalUI.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.swt.internal.extension;
+
+import org.eclipse.swt.internal.qt.midp.UIThreadLauncher;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+
+/**
+ * A class that encapsulates services that enable the use of eSWT UI before the
+ * application has initialized its UI. This is achieved by utilizing an
+ * 'internal' instance of the Display class. I.e. an instance that is not
+ * revealed to the application but is only used internally within the API
+ * implementation.
+ * 
+ * The same rules apply to the internal Display instance that apply to the
+ * Display normally. When the Display is created then the creating thread
+ * becomes the UI thread of the process. The application needs to be able to
+ * obtain control of the UI thread. The services for interfacing with the
+ * application are provided by the class ApplicationUI.
+ * 
+ * @see ApplicationUI
+ */
+public final class InternalUI {
+	/**
+	 * Obtains the platform specific UI thread where SWT UI APIs can be accessed
+	 * in and calls the provided Runnable in it. This method instantly returns
+	 * leaving two threads running concurrently: the calling thread and the UI
+	 * thread. Only one UI thread can exist per process and this method can be
+	 * called only once to obtain it. Subsequent calls will result in an
+	 * exception being thrown. This method can be called by any thread.
+	 * 
+	 * @param runnable
+	 *            A Runnable to call back in the UI thread.
+	 * @exception RuntimeException
+	 *                If starting the UI thread fails
+	 */
+	public static void startInUIThread(Runnable runnable) {
+		if(!UIThreadLauncher.startInUIThread(runnable)) {
+			throw new RuntimeException("Failed to start the UI thread");
+		}
+	}
+	
+	/**
+	 * Creates the internal instance of Display. Must be called only once.
+	 * 
+	 * This means that the native resources required by the eSWT UI will be
+	 * initialized and a Display instance is returned that can be used to access
+	 * them normally via the public eSWT APIs. 
+	 * 
+	 * @return The internal Display instance
+	 * @see getInternalDisplayInstance
+	 */
+	public synchronized static Display createInternalDisplay() {
+		if(getInternalDisplayInstance() != null) {
+			throw new RuntimeException("Display already exists");
+		}
+		return Internal_PackageSupport.internalInstance();
+	}
+	
+	/**
+	 * Returns the internal Display instance or null if it doesn't exist. 
+	 * @return The internal Display instance or null
+	 */
+	public synchronized static Display getInternalDisplayInstance() {
+		return Internal_PackageSupport.getInternalDisplayInstance();
+	}
+}
--- a/javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/NetworkStatus.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/com.nokia.swt.extensions/extensions/org/eclipse/swt/internal/extension/NetworkStatus.java	Fri Jun 11 13:33:44 2010 +0300
@@ -109,19 +109,27 @@
 		handleCallInformationChanged();
 	}
 	
+	private static Display getDisplay() {
+		Display display;
+		display = Internal_PackageSupport.getInternalDisplayInstance();
+		if(display == null) {
+			display = Internal_PackageSupport.getDisplayInstance();
+		}
+		return display;
+	}
+	
 	private static void addDisposeListener() {
-		Display display = Internal_PackageSupport.getDisplayInstance();
 		disposeListener = new Listener() {
 			public void handleEvent(Event event) {
 				destroy();
 			}
 		};
-		display.addListener(SWT.Dispose, disposeListener);
+		getDisplay().addListener(SWT.Dispose, disposeListener);
 	}
 	
 	private static void removeDisposeListener() {
 		if(disposeListener != null) {
-			Display display = Internal_PackageSupport.getDisplayInstance();
+			Display display = getDisplay();
 			if(display != null && !display.isDisposed()) {
 				display.removeListener(SWT.Dispose, disposeListener);
 				disposeListener = null;
@@ -130,7 +138,7 @@
 	}
 	
 	private static void checkThread() {
-		Display display = Internal_PackageSupport.getDisplayInstance();
+		Display display = getDisplay();
 		if(display == null) {
 			throw new RuntimeException("Display doesn't exist");
 		}
@@ -207,7 +215,7 @@
     	if(notifiedStates != 0) {
     	    final NetworkStatusListener asyncNofityListener = listener; 
     	    final int asyncNotifyStates = notifiedStates;
-    		Internal_PackageSupport.getDisplayInstance().asyncExec(new Runnable() {
+    	    getDisplay().asyncExec(new Runnable() {
 				public void run() {
 					asyncNofityListener.stateChanged(asyncNotifyStates);
 				}
@@ -255,7 +263,7 @@
 	private void hookEvents() {
 		// Packet data connections
 		if(qNetworkConfigurationManagerHandle != 0) {
-	        int signalProxy = org.eclipse.swt.internal.qt.OS.SignalHandler_new(
+	        int signalProxy = org.eclipse.swt.internal.qt.OS.SignalForwarder_new(
 	        		qNetworkConfigurationManagerHandle, this, OS.QSIGNAL_NETWORKCONFIGURATIONCHANGED);
 	        org.eclipse.swt.internal.qt.OS.QObject_connectOrThrow(
 	        		qNetworkConfigurationManagerHandle, 
@@ -276,7 +284,7 @@
 		
         // Voice calls
         if(xqCallInfoHandle != 0) {
-	        int signalProxy = org.eclipse.swt.internal.qt.OS.SignalHandler_new(
+	        int signalProxy = org.eclipse.swt.internal.qt.OS.SignalForwarder_new(
 	        		xqCallInfoHandle, this, OS.QSIGNAL_CALLINFORMATIONCHANGED);
 	        org.eclipse.swt.internal.qt.OS.QObject_connectOrThrow(
 	        		xqCallInfoHandle, 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/com.nokia.swt.extensions/midp/org/eclipse/ercp/swt/midp/UIThreadSupport.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Nokia Corporation - initial implementation 
+ *******************************************************************************/
+package org.eclipse.ercp.swt.midp;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.internal.qt.UIThreadManager;
+
+/**
+ * <p>
+ * To use eSWT API a MIDlet needs to dedicate a thread as the UI thread for
+ * running the event loop. This can't happen in the MIDlet.startApp() because
+ * it's required by the MIDP specification that the call to startApp() returns
+ * quickly. Additionally, many native UI toolkits have restrictions for the
+ * thread that can be used as the UI thread. Thus, a random Java thread can't be
+ * used either.
+ * </p>
+ * <p>
+ * This class provides means to obtain a thread that can be used as the UI
+ * thread on the platform. All MIDlets must use this class to obtain the UI
+ * thread. If a MIDlet uses some other thread as the UI thread then the behavior
+ * is undefined.
+ * </p>
+ * 
+ * @see MIDlet
+ * @see MIDlet#startApp
+ */
+public class UIThreadSupport {
+
+private static boolean started;
+
+/**
+ * <p>
+ * Calls back the given Runnable in a thread that can be used as the UI thread.
+ * The method must not be called more than once as there might be only one
+ * thread in the process capable of being used as the UI thread.
+ * </p>
+ * 
+ * An example: <code><pre>
+ * ...
+ * class MyMIDlet extends javax.microedition.midlet.MIDlet {
+ *     ...
+ *     public void startApp() {
+ *         UIThreadSupport.startInUIThread(new Runnable() {
+ *             public void run() {
+ *                 Display display = new Display();
+ *                 ...
+ *             }
+ *          });
+ *     }
+ *     ...
+ * }
+ * </pre></code>
+ * 
+ * @param runnable The Runnable object to call back
+ * @exception SWTError <ul>
+ *                <li>ERROR_NULL_ARGUMENT if the runnable is null</li>
+ * @exception SWTError <ul>
+ *                <li>ERROR_NO_HANDLES if a handle could not be obtained for
+ *                thread creation</li>
+ * @exception SWTError <ul>
+ *                <li>ERROR_FAILED_EXEC if called more than once</li>
+ * @see MIDlet
+ * @see MIDlet#startApp
+ */
+public static void startInUIThread(Runnable runnable) {
+	if(runnable == null) {
+		SWT.error(SWT.ERROR_NULL_ARGUMENT);
+	}
+    synchronized(UIThreadSupport.class) {
+        if(started) {
+            SWT.error(SWT.ERROR_FAILED_EXEC);
+        }
+        started = true;
+    }
+    if(!UIThreadManager.startInUIThread(runnable)) {
+        SWT.error(SWT.ERROR_NO_HANDLES);
+    }
+}
+
+}
--- a/javauis/eswt_qt/com.nokia.swt.extensions/midp_common/org/eclipse/ercp/swt/midp/UIThreadSupport.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Nokia Corporation - initial implementation 
- *******************************************************************************/
-package org.eclipse.ercp.swt.midp;
-
-import org.eclipse.swt.SWT;
-
-/**
- * <p>
- * To use eSWT API a MIDlet needs to dedicate a thread as the UI thread for
- * running the event loop. This can't happen in the MIDlet.startApp() because
- * it's required by the MIDP specification that the call to startApp() returns
- * quickly. Additionally, many native UI toolkits have restrictions for the
- * thread that can be used as the UI thread. Thus, a random Java thread can't be
- * used either.
- * </p>
- * <p>
- * This class provides means to obtain a thread that can be used as the UI
- * thread on the platform. All MIDlets must use this class to obtain the UI
- * thread. If a MIDlet uses some other thread as the UI thread then the behavior
- * is undefined.
- * </p>
- * 
- * @see MIDlet
- * @see MIDlet#startApp
- */
-public class UIThreadSupport {
-
-private static boolean started;
-
-/**
- * <p>
- * Calls back the given Runnable in a thread that can be used as the UI thread.
- * The method must not be called more than once as there might be only one
- * thread in the process capable of being used as the UI thread.
- * </p>
- * 
- * An example: <code><pre>
- * ...
- * class MyMIDlet extends javax.microedition.midlet.MIDlet {
- *     ...
- *     public void startApp() {
- *         UIThreadSupport.startInUIThread(new Runnable() {
- *             public void run() {
- *                 Display display = new Display();
- *                 ...
- *             }
- *          });
- *     }
- *     ...
- * }
- * </pre></code>
- * 
- * @param runnable The Runnable object to call back
- * @exception SWTError <ul>
- *                <li>ERROR_NO_HANDLES if a handle could not be obtained for
- *                thread creation</li>
- * @exception SWTError <ul>
- *                <li>ERROR_FAILED_EXEC if called more than once</li>
- * @see MIDlet
- * @see MIDlet#startApp
- */
-public static void startInUIThread(Runnable runnable) {
-    synchronized(UIThreadSupport.class) {
-        if(started) {
-            SWT.error(SWT.ERROR_FAILED_EXEC);
-        }
-        started = true;
-    }
-    try {
-        new Thread(runnable).start();
-    } catch(Exception e) {
-        SWT.error(SWT.ERROR_NO_HANDLES);
-    }
-}
-
-}
--- a/javauis/eswt_qt/com.nokia.swt.extensions/midp_symbian/org/eclipse/ercp/swt/midp/UIThreadSupport.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Nokia Corporation - initial implementation 
- *******************************************************************************/
-package org.eclipse.ercp.swt.midp;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.internal.qt.s60.OS;
-
-/**
- * <p>
- * To use eSWT API a MIDlet needs to dedicate a thread as the UI thread for
- * running the event loop. This can't happen in the MIDlet.startApp() because
- * it's required by the MIDP specification that the call to startApp() returns
- * quickly. Additionally, many native UI toolkits have restrictions for the
- * thread that can be used as the UI thread. Thus, a random Java thread can't be
- * used either.
- * </p>
- * <p>
- * This class provides means to obtain a thread that can be used as the UI
- * thread on the platform. All MIDlets must use this class to obtain the UI
- * thread. If a MIDlet uses some other thread as the UI thread then the behavior
- * is undefined.
- * </p>
- * 
- * @see MIDlet
- * @see MIDlet#startApp
- */
-public class UIThreadSupport {
-
-private static boolean started;
-
-/**
- * <p>
- * Calls back the given Runnable in a thread that can be used as the UI thread.
- * The method must not be called more than once as there might be only one
- * thread in the process capable of being used as the UI thread.
- * </p>
- * 
- * An example: <code><pre>
- * ...
- * class MyMIDlet extends javax.microedition.midlet.MIDlet {
- *     ...
- *     public void startApp() {
- *         UIThreadSupport.startInUIThread(new Runnable() {
- *             public void run() {
- *                 Display display = new Display();
- *                 ...
- *             }
- *          });
- *     }
- *     ...
- * }
- * </pre></code>
- * 
- * @param runnable The Runnable object to call back
- * @exception SWTError <ul>
- *                <li>ERROR_NO_HANDLES if a handle could not be obtained for
- *                thread creation</li>
- * @exception SWTError <ul>
- *                <li>ERROR_FAILED_EXEC if called more than once</li>
- * @see MIDlet
- * @see MIDlet#startApp
- */
-public static void startInUIThread(Runnable runnable) {
-    synchronized(UIThreadSupport.class) {
-        if(started) {
-            SWT.error(SWT.ERROR_FAILED_EXEC);
-        }
-        started = true;
-    }
-    int status = OS.startUI(runnable);
-    if(status != 0) {
-        SWT.error(SWT.ERROR_NO_HANDLES);
-    }
-}
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/.classpath	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="javasrc"/>
+	<classpathentry kind="var" path="CLDC_JAR"/>
+	<classpathentry kind="var" path="CDC_CLASSES"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/.project	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>eswtuitestutils</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/build/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,62 @@
+<!--
+#
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+-->
+
+<project name="eswtuitestutils" default="createJars" basedir=".">
+
+    <description>
+        Builds eswtuitestutils on Qt
+    </description>
+
+    <import file="../../../../build/utilities.xml"/>
+
+    <!-- Needed by the utilities.xml. See the description form the utilities.xml
+         file -->
+
+    <target name="compile">
+        <omj.javac classpath="${bootclasspath.cdc}:${impl.cldc.jar}"/>
+    </target>
+
+    <property name="javah.classnames" value="com.nokia.mj.impl.uitestutils.S60Utils"/>
+    
+    <!-- This empty call is needed to avoid OMJ tool to add this component class to cldc jar -->
+    <target name="add.classes.to.collection.jar"/>
+
+	<target name="createJars" depends="deploy"> 
+		<copy file="${compile.result.root}/eswtuitestutils/release_japted.jar" todir="${bcp.dest.directory}" failonerror="true"/>
+		<move file="${bcp.dest.directory}/release_japted.jar"  tofile="${bcp.dest.directory}/eswtuitestutils.jar" failonerror="true"/>
+		<antcall target="appendODC"/>
+	</target>	
+   
+	<target name="appendODC" >
+		<!-- Appends eswtuitestutils.odc if not present in installerodclist30 file  -->
+		<loadfile srcFile="${epocroot}epoc32/data/z/resource/java/installerodclist" property="uitestutils">
+			<filterchain>
+				<linecontains>
+					<contains value="${component.dir}.odc"/>
+				</linecontains>
+			</filterchain>
+		</loadfile>
+		<antcall target="appendUITestUtils"/>
+	</target>
+
+	<target name="appendUITestUtils" unless="uitestutils">
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">${component.dir}.odc${line.separator}</concat>
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">${component.dir}.jar${line.separator}</concat>
+	</target>
+	
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/build/bwins/eswtuitestutilsu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/build/eabi/eswtuitestutilsu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/build/eswtuitestutils.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+
+TEMPLATE=lib
+TARGET=eswtuitestutils
+CONFIG += omj java
+
+
+symbian {
+    
+	TARGET.UID3 = 0x2002E699
+
+  include(../src/eswtuitestutils.pri)
+ 
+	LIBS += -llibc
+	LIBS += -leuser
+	LIBS += -llibstdcpp
+	LIBS += -ljavautils
+	LIBS += -leikcore
+}
+
+include(../../../../build/omj.pri)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/ImageTestUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,639 @@
+package com.nokia.mj.impl.uitestutils;
+
+import org.eclipse.swt.internal.qt.graphics.Image;
+import java.util.Arrays;
+
+/**
+ * Image utils for verifying image pixels against mask
+ * plus some other helpers for verifying image properties. 
+ * 
+ * NOTE. Currently only CGFX images are supported however eSWT images 
+ * can be verified by using org.eclipse.swt.internal.qt.graphics.Image internal_getImage()
+ * to obtain wrapped CGFX image.
+ * 
+ * Usage example
+ * 
+ * create a mask from mask data and then mask by giving data and scanlenght.
+ * <code>
+ * int[] maskData = {
+ *   	0,0,0,0,0,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,0,0,0,0,0
+ * };
+ * 
+ * Mask mask = new Mask(maskData, 9);
+ * </code>
+ * 
+ * Then image pixels can be validated with ImageTestUtils. That is where there is 1 in mask it is
+ * compared against maskArgb and all where there is 0 in mask it is compared against bgArgb.
+ * <code>
+ * ImageTestUtils.validatePixels(imageToValidate, mask, maskArgb, bgArgb); 
+ * </code>
+ * 
+ * @author sampkaar
+ *
+ */
+public class ImageTestUtils {
+
+	/** 
+	 * This pixel is rendering target image background color.
+	 */
+	public static final int IMAGE_BACKGROUND_COLOR = 0;
+
+	/** 
+	 * This pixel is foreground color set to GC.
+	 */
+	public static final int GC_FOREGROUND_COLOR = 1;
+
+	/**
+	 * This pixel is either foreground or image background color.
+	 * Used for example in drawRoundRect and drawEllipse tests.
+	 */
+	public static final int FOREGROUND_OR_IMAGE_BACKGROUND_COLOR = 2;
+	
+	/** 
+	 * This pixel is background color set to GC.
+	 * Used for example in fillGradientRect test.
+	 */
+	public static final int GC_BACKGROUND_COLOR = 3;
+
+	/**
+	 * This pixel is neither foreground nor gc background color. 
+	 * Used for example in fillGradientRect test. 
+	 */
+	public static final int NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR = 4;
+
+	/** 
+	 * This pixel can be ignored.
+	 * Used for example in fillGradientRect test.
+	 */
+	public static final int IGNORE_COLOR = 5;
+	
+	/**
+	 * Validates image dimensions against reference width and height.
+	 * Prints possible problems to System.out.
+	 * 
+	 * @param img - The image to check
+	 * @param refWidth - The reference width
+	 * @param refHeight - The reference height
+	 */
+	public static final boolean validateImageDimensions(Image img, int refWidth, int refHeight) {
+		if ((refWidth != img.getWidth()) || (refHeight != img.getHeight())) {
+			System.out.println("Image size should be ("+refWidth+","+refHeight+"), "+
+							   "but is ("+img.getWidth()+","+img.getHeight()+")");
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * Validates image pixels which are outside specified rectangle ingoreRect against given reference color.
+	 * 
+	 * @param ignoreRect The area that is to be ingnored
+	 * @param img Image to validate
+	 * @param argb The reference color
+	 * @return true if all pixels outside ingoreRect have reference color orherwise false 
+	 */
+	public static final boolean validatePixels(Rect ignoreRect, Image img, int argb) {
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  width * height;
+		final int scanlength = img.getWidth();
+		
+		// data array for image data
+		int[] imageData = new int[pixels];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+
+		// calculate start index
+		int start = scanlength*ignoreRect.y();
+		for(int y = 0; y<ignoreRect.height();y++) {
+			Arrays.fill(imageData, start+ignoreRect.x(), start+ignoreRect.width()+ignoreRect.x(), argb);
+			// move start to next line
+			start += scanlength;
+		}
+		
+		// validate array
+		for(int i=0; i < pixels; i++) {
+			if(!(imageData[i] == argb)) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Validates that there is at least one pixel with foreground color inside the specified rectangle
+	 * and that image pixels which are outside specified rectangle has background color.
+	 * 
+	 * @param rect The area that is to be checked
+	 * @param img Image to validate
+	 * @param fgColor The color that must exist inside the rect
+	 * @param bgColor The color which must be outside the rect
+	 * @return true if all pixels outside rect have background color and at least one pixel inside the rect has foreground color 
+	 *         orherwise false 
+	 */
+	public static final boolean validatePixels(Rect rect, Image img, int fgColor, int bgColor) {
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  width * height;
+		final int scanlength = img.getWidth();
+		boolean foundFgColor = false;
+				
+		// data array for image data
+		int[] imageData = new int[pixels];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+
+		Rect imageRect = new Rect(0,0,width, height);
+		rect = rect.intersection(imageRect);
+
+		// Check that foreground color was found inside the rect
+		foundFgColor = isAtleastOnePixelWithRefColor(img, rect, fgColor);		
+		if(!foundFgColor){
+			return false;
+		}
+		
+		int start = scanlength*rect.y();
+		// Fill the rect with background color
+		for(int y = 0; y<rect.height();y++) {
+			Arrays.fill(imageData, start+rect.x(), start+rect.width()+rect.x(), bgColor);
+			// move start to next line
+			start += scanlength;
+		}
+		
+		// validate array, now all pixels should have background color
+		for(int i=0; i < pixels; i++) {
+			if(!(imageData[i] == bgColor)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Validates that there is at least one pixel with foreground color inside the specified rectangle
+	 * and that image pixels which are outside specified rectangle has background color.
+	 * 
+	 * @param rect The area that is to be checked
+	 * @param img Image to validate
+	 * @param fgColor The color that must exist inside the rect
+	 * @param textRectColor The background color of the rect 
+	 * @param bgColor The color which must be outside the rect
+	 * @param textRectColorOn true if textRectColor must exist inside the rect, false if textRectColor shouldn't be found inside the rect 
+	 * @return true if all pixels outside rect have background color and at least one pixel inside the rect has foreground color 
+	 *         orherwise false 
+	 */
+	public static final boolean validatePixels(Rect rect, Image img, int fgColor, int textRectColor, int bgColor, boolean textRectColorOn) {
+
+		if(textRectColorOn){
+			// Check that text background color was found inside the rect
+			if(!isAtleastOnePixelWithRefColor(img, rect, textRectColor)){
+				return false;
+			}
+		} else {
+			// Check that text background color is not found inside the rect		
+			if(isAtleastOnePixelWithRefColor(img, rect, textRectColor)){
+				return false;
+			}
+		}
+		
+		return validatePixels(rect, img, fgColor, bgColor);
+	}
+
+	/**
+	 * Validates that there is at least one pixel with foreground color inside the specified rectangles
+	 * and that image pixels which are outside specified rectangles has background color.
+	 * 
+	 * @param rects The areas that is to be checked
+	 * @param img Image to validate
+	 * @param fgColor The color that must exist inside the rects
+	 * @param bgColor The color which must be outside the rects
+	 * @return true if all pixels outside rects have background color and at least one pixel inside the rects has foreground color 
+	 *         orherwise false 
+	 */
+	public static final boolean validatePixels(Rect[] rects, Image img, int fgColor, int bgColor) {
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  width * height;
+		final int scanlength = img.getWidth();
+		boolean foundFgColor = false;
+		final int rectCount = rects.length;
+
+		Rect imageRect = new Rect(0,0,width, height);
+		// Check that foreground color is found inside each rect
+		for(int i=0; i<rectCount; i++){
+			rects[i] = rects[i].intersection(imageRect);
+			foundFgColor = isAtleastOnePixelWithRefColor(img, rects[i], fgColor);		
+			if(!foundFgColor){
+				return false;
+			}
+		}
+		
+		// Check that background color is found outside the rects
+
+		// data array for image data
+		int[] imageData = new int[pixels];
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+
+		int start;
+		// Fill the rects with background color
+		for(int i=0; i<rectCount; i++){
+			start = scanlength*rects[i].y();
+			for(int y = 0; y<rects[i].height();y++) {
+				Arrays.fill(imageData, start+rects[i].x(), start+rects[i].width()+rects[i].x(), bgColor);
+				// move start to next line
+				start += scanlength;
+			}
+		}
+		
+		// validate array, now all pixels should have background color
+		for(int i=0; i < pixels; i++) {
+			if(!(imageData[i] == bgColor)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Checks is there at least one pixel with reference color inside the specified rectangle in Image.
+	 * 
+	 * @param rect The area that is to be checked
+	 * @param refColor The color that must exist inside the rect
+	 * @return true if at least one pixel inside the rect has reference color orherwise false 
+	 */
+	public static final boolean isAtleastOnePixelWithRefColor(Image img, Rect rect, int refColor) {
+		
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  width * height;
+		final int scanlength = img.getWidth();
+
+		// data array for image data
+		int[] imageData = new int[pixels];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+
+		// calculate start index
+		int start = scanlength*rect.y();
+
+		// Check that is at least one pixel has foreground color inside the rect
+		for(int y = 0; y<rect.height();y++) {
+			for(int i=start+rect.x(); i < start+rect.width()+rect.x(); i++) {			
+				if((imageData[i] == refColor)) {
+					return true;
+				}
+			}
+			// move start to next line
+			start += scanlength;
+		}	
+		return false;
+	}
+	
+	/**
+	 * Validates that every pixel in given image has
+	 * given referense color value argb. 
+	 * 
+	 * @param img - The image to check
+	 * @param argb - The referece color to compare
+	 */
+	public static final boolean validatePixels(Image img, int argb) {
+		
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  width * height;
+		
+		// get color components from reference
+		final int refAlpha 	= (argb >> 24) 	& 0xff;
+		final int refRed   	= (argb >> 16) 	& 0xff;
+		final int refGreen 	= (argb >> 8) 	& 0xff;
+		final int refBlue 	= (argb) 		& 0xff;
+		
+		// data array for image data
+		int[] imageData = new int[pixels];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+	
+		// check each pixel in image, break if pixel does not match
+		for(int i=0; i < pixels; i++) {
+			if (refAlpha != ((imageData[i] >> 24) & 0xff)) return false;
+			if (refRed 	 != ((imageData[i] >> 16) & 0xff)) return false; 
+			if (refGreen != ((imageData[i] >> 8 ) & 0xff)) return false;
+			if (refBlue  != ( imageData[i]        & 0xff)) return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * Validates that given pixels are equal to 
+	 * reference pixel color (argb) and background color in given rgb data
+	 * 
+	 * @param rgbdata - The image data to be checked
+	 * @param mask - the reference mask
+	 * @param maskArgb - The reference color for pixels with value 1 in mask
+	 * @param bgArgb - The reference color for pixels with value 0 in mask
+	 * 
+	 */
+	public static final boolean validatePixels(int[] rgbdata, Mask mask, int maskArgb, int bgArgb) {
+		return doCheckPixels(rgbdata, mask, maskArgb, bgArgb, 0, false);
+	}
+	
+	/**
+	 * Validates that given pixels are equal to 
+	 * reference pixel color (argb) and background color in given rgb data
+	 * 
+	 * @param rgbdata - The image data to be checked
+	 * @param dataOffset The offset from beginning of rgbdata where image data starts
+	 * @param dataLength The lenght of image data after offset
+	 * @param mask - the reference mask
+	 * @param maskArgb - The reference color for pixels with value 1 in mask
+	 * @param bgArgb - The reference color for pixels with value 0 in mask
+	 * 
+	 */
+	public static final boolean validatePixels(int[] rgbdata, int dataOffset, int dataLength, Mask mask, int maskArgb, int bgArgb) {
+		
+		// create array for data 
+		int[] data = new int[dataLength];
+		
+		// copy from rgbdata to data
+		for(int i=dataOffset; i < rgbdata.length; i++) {
+			data[i-dataOffset] = rgbdata[i];
+		}
+		
+		//System.out.println("\n mask size: " + mask.getData().length+", dataSize: " + rgbdata.length);
+		return doCheckPixels(data, mask, maskArgb, bgArgb, 0, false);
+	}
+	
+	/**
+	 * Validates that given pixels are equal to 
+	 * reference pixel color (argb) and background color in image
+	 * 
+	 * @param img - The image to check
+	 * @param mask - the reference mask
+	 * @param maskArgb - The reference color for pixels with value 1 in mask
+	 * @param bgArgb - The reference color for pixels with value 0 in mask
+	 * 
+	 */
+	public static final boolean validatePixels(Image img, Mask mask, int maskArgb, int bgArgb) {
+		
+		// data array for image data
+		int[] imageData = new int[img.getWidth()*img.getHeight()];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
+		
+		// check pixels
+		return doCheckPixels(imageData, mask, maskArgb, bgArgb, 0, false);
+	}
+	
+	/**
+	 * Validates that given pixels are equal to 
+	 * reference pixel color (argb) and background color in image
+	 * 
+	 * @param img - The image to check
+	 * @param mask - the reference mask
+	 * @param maskArgb - The reference color for pixels with value 1 in mask
+	 * @param bgArgb - The reference color for pixels with value 0 in mask
+	 * @param ingoreAlpha If true alpha value is not validated
+	 * @return true if mask and image match otherwise false
+	 */
+	public static final boolean validatePixels(Image img, Mask mask, int maskArgb, int bgArgb, boolean ignoreAlpha) {
+		
+		// data array for image data
+		int[] imageData = new int[img.getWidth()*img.getHeight()];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
+		
+		// check pixels
+		return doCheckPixels(imageData, mask, maskArgb, bgArgb, 0, ignoreAlpha);
+	}
+
+	/**
+	 * Validates that given pixels are equal to 
+	 * foreground color (argb), image background color and gc background color in image
+	 * 
+	 * @param img - The image to check
+	 * @param mask - the reference mask
+	 * @param fgArgb - The reference color for pixels with value 1 GC_FOREGROUND_COLOR in mask
+	 * @param gcBgArgb - The reference color for pixels with value 3 GC_BACKGROUND_COLOR in mask
+	 * @param imgBgArgb - The reference color for pixels with value 0 IMAGE_BACKGROUND_COLOR in mask
+	 * @param ingoreAlpha If true alpha value is not validated
+	 * @return true if mask and image match otherwise false
+	 */
+	public static final boolean validatePixels(Image img, Mask mask, int fgArgb, int gcBgArgb, int imgBgArgb, boolean ignoreAlpha) {
+		
+		// data array for image data
+		int[] imageData = new int[img.getWidth()*img.getHeight()];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
+		
+		// check pixels
+		return doCheckPixels(imageData, mask, fgArgb, imgBgArgb, gcBgArgb, ignoreAlpha);
+	}
+
+	/*
+	 * method for checking pixels against mask
+	 * The imageData and the data in mask must be same size.  
+	 */
+	private static final boolean doCheckPixels(int[] imageData, Mask mask, int fgColorArgb, int imgBgColorArgb, int gcBgColorArgb, boolean ignoreAlpha ) {
+		
+		// get color components for GC foreground color
+		final int fgAlpha 	= (fgColorArgb >> 24) 	& 0xff;
+		final int fgRed   	= (fgColorArgb >> 16) 	& 0xff;
+		final int fgGreen 	= (fgColorArgb >> 8) 	& 0xff;
+		final int fgBlue 	= (fgColorArgb) 		& 0xff;
+		
+		// get color components for image background color
+		final int imgBgAlpha 	= (imgBgColorArgb  >> 24) 	& 0xff;
+		final int imgBgRed   	= (imgBgColorArgb  >> 16) 	& 0xff;
+		final int imgBgGreen 	= (imgBgColorArgb  >> 8) 	& 0xff;
+		final int imgBgBlue 	= (imgBgColorArgb) 			& 0xff;
+		
+		// get color components for GC background color
+		int gcBgAlpha 	= 0;
+		int gcBgRed   	= 0;
+		int gcBgGreen 	= 0;
+		int gcBgBlue 	= 0;
+		if (gcBgColorArgb != 0){ // GC Background color is defined
+			gcBgAlpha 	= (gcBgColorArgb  >> 24) 	& 0xff;
+			gcBgRed   	= (gcBgColorArgb  >> 16) 	& 0xff;
+			gcBgGreen 	= (gcBgColorArgb  >> 8) 	& 0xff;
+			gcBgBlue 	= (gcBgColorArgb) 			& 0xff;
+		}
+		
+		// get mask data
+		int[] maskdata = mask.getData();
+		
+		// verify background & pixels
+		for(int i=0; i < imageData.length; i++) {
+
+			// if mask pixel is GC_FOREGROUND_COLOR (1), check against fgArgb
+			if(maskdata[i] == GC_FOREGROUND_COLOR) {	
+				if (!ignoreAlpha) {
+				    if (fgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
+				}
+				if (fgRed	!= ((imageData[i] >> 16) & 0xff)) return false; 
+				if (fgGreen != ((imageData[i] >> 8 ) & 0xff)) return false;
+				if (fgBlue  != ( imageData[i]        & 0xff)) return false;
+			} 
+			// if mask pixel is FOREGROUND_OR_IMAGE_BACKGROUND_COLOR (2), this pixel is either 
+			// foreground or image background color. 
+			// Used for example in drawRoundRect and drawEllipse tests.
+			else if(maskdata[i] == FOREGROUND_OR_IMAGE_BACKGROUND_COLOR) {	
+				if (!ignoreAlpha) {
+					if (fgAlpha 	!= ((imageData[i] >> 24) & 0xff) && 
+						imgBgAlpha 	!= ((imageData[i] >> 24) & 0xff)) return false;
+				}				
+				if (fgRed 	 	!= ((imageData[i] >> 16) & 0xff) && 
+					imgBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
+
+				if (fgGreen 	!= ((imageData[i] >> 8 ) & 0xff) && 
+					imgBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
+	
+				if (fgBlue  	!= ( imageData[i]        & 0xff) && 
+					imgBgBlue	!= ( imageData[i]         & 0xff)) return false;
+			} 
+			// if mask pixel is GC_BACKGROUND_COLOR (3), this pixel is background color set to GC. 
+			// Used for example in fillGradientRect test.
+			else if(maskdata[i] == GC_BACKGROUND_COLOR) {	
+				if (!ignoreAlpha) {
+					if (gcBgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
+				}
+				if (gcBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
+				if (gcBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
+				if (gcBgBlue  	!= ( imageData[i]        & 0xff)) return false;
+			} 
+			// if mask pixel is NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR (4), this pixel is neither 
+			// foreground nor gc background color. 
+			// Used for example in fillGradientRect test.
+			else if(maskdata[i] == NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR) {	
+				if (!ignoreAlpha) {
+					if (fgAlpha != gcBgAlpha){
+						if (fgAlpha 	== ((imageData[i] >> 24) & 0xff) || 
+							gcBgAlpha 	== ((imageData[i] >> 24) & 0xff)) return false;
+					}
+				}
+				
+				if (fgRed != gcBgRed){
+					if (fgRed 	 	== ((imageData[i] >> 16) & 0xff) || 
+						gcBgRed  	== ((imageData[i] >> 16) & 0xff)) return false; 
+				}
+				if (fgGreen != gcBgGreen){
+					if (fgGreen 	== ((imageData[i] >> 8 ) & 0xff) || 
+						gcBgGreen	== ((imageData[i] >> 8 ) & 0xff)) return false;
+				}
+				if (fgBlue != gcBgBlue){
+					if (fgBlue  	== ( imageData[i]        & 0xff) || 
+						gcBgBlue 	== ( imageData[i]         & 0xff)) return false;
+				}
+			} 
+			else if(maskdata[i] == IGNORE_COLOR) {	
+				// skip the pixel
+			} 
+			// if mask pixel is IMAGE_BACKGROUND_COLOR (1), check against imgBg
+			else  if(maskdata[i] == IMAGE_BACKGROUND_COLOR) {
+				if (!ignoreAlpha) {
+				    if (imgBgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
+				}
+				if (imgBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
+				if (imgBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
+				if (imgBgBlue 	!= ( imageData[i]         & 0xff)) return false;
+			}
+			// If mask pixel is something else that's error
+			else {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * prints black & white image to console.
+	 * black is printed as 1 and white as 0.
+	 */
+	public static final void print(Image img) {
+
+		final int width = img.getWidth();
+		final int height = img.getHeight();
+		final int pixels =  img.getWidth() * img.getHeight();
+		
+		// data array for image data
+		int[] imageData = new int[pixels];
+		
+		// get data for whole image
+		img.getRGB(imageData, 0, width, 0, 0, width, height);
+		
+		String output = "Image("+img.getWidth()+","+img.getHeight()+"):\n";
+		int y = 0;
+		for(int i = 0; i < imageData.length; i++) {
+			
+			int a = ((imageData[i] >> 24) & 0xff);
+			int r = ((imageData[i] >> 16) & 0xff); 
+			int b = ((imageData[i] >> 8 ) & 0xff);
+			int g = ( imageData[i] & 0xff);
+			
+			if (a == 255 && r == 0 && g == 0 && b == 0) {
+				output += "1,";
+			} else if (a == 255 && r == 255 && g == 255 && b == 255) {
+				output += "0,";
+			}
+			else {
+				output += "("+a+","+r+","+b+","+g+")";
+			}
+			
+			if(i==((y*width) + (width-1))) {
+				output += "\n";
+				y++;
+			}
+		}
+		System.out.println(output);
+	}
+	
+	public static final void print(int[] array, int scanlength) {
+		final int width = scanlength;
+		String output = "";
+		
+		int y = 0;
+		for(int i = 0; i < array.length; i++) {
+			
+			int a = ((array[i] >> 24) & 0xff);
+			int r = ((array[i] >> 16) & 0xff); 
+			int b = ((array[i] >> 8 ) & 0xff);
+			int g = ( array[i] & 0xff);
+			
+			if (a == 255 && r == 0 && g == 0 && b == 0) {
+				output += "1,";
+			} else if (a == 255 && r == 255 && g == 255 && b == 255) {
+				output += "0,";
+			}
+			else {
+				output += "x,";
+			}
+			
+			if(i==((y*width) + (width-1))) {
+				output += "\n";
+				y++;
+			}
+		}
+		System.out.println(output);
+	}
+
+	private int getIndexForPoint(int scanlength, int x, int y) {
+		return y*scanlength+x;
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Key.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,532 @@
+//Key.java
+//
+//
+//
+
+package com.nokia.mj.impl.uitestutils;
+
+public class Key {
+
+    //
+    // NON UNICODE LOGICAL KEY CODES
+    // pass them to class c.tor to generate symbian symbian scan and key codes
+    // (for unicode keys use unicode char)
+    //
+
+    //non unicode MIDP key codes
+    public static final  int UpArrow                     = -1;
+    public static final  int DownArrow                   = -2;
+    public static final  int LeftArrow                   = -3;
+    public static final  int RightArrow                  = -4;
+    public static final  int Clear                       = -5;  // Clear key
+    public static final  int Select                      = -6;  // Selection key
+    public static final  int Edit                        = -7; // Edit Key
+    public static final  int Send                        = -8; // Send Key
+    public static final  int CBA1                        = -9;  // Left CBA
+    public static final  int CBA2                        = -10;  // Right CBA
+    public static final  int End                         = -11; // End key
+    public static final  int Applications                = -12; // Applications key
+    public static final  int Voice                       = -13; // Voice key
+
+    //non unicode non MIDP key codes
+    public static final  int  Power      = -14;
+    public static final  int  Backspace  = -15;
+    public static final  int  GripOpen   = -16;
+    public static final  int  GripClose  = -17;
+    public static final  int  Camera     = -18;
+    public static final  int  VolumeUp   = -19;
+    public static final  int  VolumeDown = -20;
+    public static final  int  PlayPause = -21; //Media key
+    public static final  int  Stop = -22; //Media Key
+    public static final  int  NextFF = -23; //Media key
+    public static final  int  PreviousRew = -24; //Media key
+
+    public static final  int  PageUp                     = -25;
+    public static final  int  PageDown                   = -26;
+    public static final  int  HomeKey                    = -27;
+    public static final  int  EndKey                     = -28;
+    // Activate key represents a key that will cause a "default selection" of an item. On Linux
+    // this is Enter, but on S60 it may be the same key as Select.
+    public static final  int  Activate                   = -29;
+    public static final  int  InsertKey                  = -30;
+    public static final  int  ReturnKey                  = -31;
+    public static final  int  DeleteKey                  = -32;
+    public static final  int  Escape                     = -33;
+
+
+
+    //
+    // SYMBIAN SCAN CODES - copied from e32keys.h
+    //
+
+    public static final int EStdKeyNull=0x00;                     /**< No key present. */
+    public static final int EStdKeyBackspace=0x01;                /**< Scan code for Backspace key.*/
+    public static final int EStdKeyTab=0x02;                      /**< Scan code for Tab key. */
+    public static final int EStdKeyEnter=0x03;                    /**< Scan code for Enter key.*/
+    public static final int EStdKeyEscape=0x04;                   /**< Scan code for Escape (Esc) key.*/
+    public static final int EStdKeySpace=0x05;                    /**< Scan code for Space key.*/
+    public static final int EStdKeyPrintScreen=0x06;              /**< Scan code for Print Screen key.*/
+    public static final int EStdKeyPause=0x07;                    /**< Scan code for Pause key.*/
+    public static final int EStdKeyHome=0x08;                     /**< Scan code for Home key.*/
+    public static final int EStdKeyEnd=0x09;                      /**< Scan code for End key.*/
+    public static final int EStdKeyPageUp=0x0a;                   /**< Scan code for Page Up key.*/
+    public static final int EStdKeyPageDown=0x0b;                 /**< Scan code for Page Down key.*/
+    public static final int EStdKeyInsert=0x0c;                   /**< Scan code for Insert key.*/
+    public static final int EStdKeyDelete=0x0d;                   /**< Scan code for Delete (Del) key.*/
+    public static final int EStdKeyLeftArrow=0x0e;                /**< Scan code for Left arrow key.*/
+    public static final int EStdKeyRightArrow=0x0f;               /**< Scan code for Right arrow key.*/
+    public static final int EStdKeyUpArrow=0x10;                  /**< Scan code for Up arrow key.*/
+    public static final int EStdKeyDownArrow=0x11;                /**< Scan code for Down arrow key.*/
+    public static final int EStdKeyLeftShift=0x12;                /**< Scan code for left Shift key.*/
+    public static final int EStdKeyRightShift=0x13;               /**< Scan code for right Shift key.*/
+    public static final int EStdKeyLeftAlt=0x14;                  /**< Scan code for left Alt key.*/
+    public static final int EStdKeyRightAlt=0x15;                 /**< Scan code for right Alt key.*/
+    public static final int EStdKeyLeftCtrl=0x16;                 /**< Scan code for left Control (Ctrl) key.*/
+    public static final int EStdKeyRightCtrl=0x17;                /**< Scan code for right Control (Ctrl) key.*/
+    public static final int EStdKeyLeftFunc=0x18;                 /**< Scan code for left Fn key.*/
+    public static final int EStdKeyRightFunc=0x19;                /**< Scan code for right Fn key.*/
+    public static final int EStdKeyCapsLock=0x1a;                 /**< Scan code for Caps lock key.*/
+    public static final int EStdKeyNumLock=0x1b;                  /**< Scan code for Num lock key.*/
+    public static final int EStdKeyScrollLock=0x1c;               /**< Scan code for Scroll lock key.*/
+    public static final int EStdKeyF1=0x60;                       /**< Scan code for function key F1.*/
+    public static final int EStdKeyF2=0x61;                       /**< Scan code for function key F2.*/
+    public static final int EStdKeyF3=0x62;                       /**< Scan code for function key F3.*/
+    public static final int EStdKeyF4=0x63;                       /**< Scan code for function key F4.*/
+    public static final int EStdKeyF5=0x64;                       /**< Scan code for function key F5*/
+    public static final int EStdKeyF6=0x65;                       /**< Scan code for function key F6*/
+    public static final int EStdKeyF7=0x66;                       /**< Scan code for function key F7*/
+    public static final int EStdKeyF8=0x67;                       /**< Scan code for function key F8*/
+    public static final int EStdKeyF9=0x68;                       /**< Scan code for function key F9*/
+    public static final int EStdKeyF10=0x69;                      /**< Scan code for function key F10*/
+    public static final int EStdKeyF11=0x6a;                      /**< Scan code for function key F11*/
+    public static final int EStdKeyF12=0x6b;                      /**< Scan code for function key F12*/
+    public static final int EStdKeyF13=0x6c;                      /**< Scan code for function key F13*/
+    public static final int EStdKeyF14=0x6d;                      /**< Scan code for function key F14*/
+    public static final int EStdKeyF15=0x6e;                      /**< Scan code for function key F15*/
+    public static final int EStdKeyF16=0x6f;                      /**< Scan code for function key F16*/
+    public static final int EStdKeyF17=0x70;                      /**< Scan code for function key F17*/
+    public static final int EStdKeyF18=0x71;                      /**< Scan code for function key F18*/
+    public static final int EStdKeyF19=0x72;                      /**< Scan code for function key F19*/
+    public static final int EStdKeyF20=0x73;                      /**< Scan code for function key F20*/
+    public static final int EStdKeyF21=0x74;                      /**< Scan code for function key F21*/
+    public static final int EStdKeyF22=0x75;                      /**< Scan code for function key F22.*/
+    public static final int EStdKeyF23=0x76;                      /**< Scan code for function key F23.*/
+    public static final int EStdKeyF24=0x77;                      /**< Scan code for function key F24.*/
+    public static final int EStdKeyXXX=0x78;                      /**< Scan code for the key to the left of the 1 key on a standard keyboard.*/
+    public static final int EStdKeyComma=0x79;                    /**< Scan code for Comma (,) key.*/
+    public static final int EStdKeyFullStop=0x7a;                 /**< Scan code for Full stop (.) key.*/
+    public static final int EStdKeyForwardSlash=0x7b;             /**< Scan code for Forward slash (/) key.*/
+    public static final int EStdKeyBackSlash=0x7c;                /**< Scan code for Back slash (\) key.*/
+    public static final int EStdKeySemiColon=0x7d;                /**< Scan code for Semi colon (;) key.*/
+    public static final int EStdKeySingleQuote=0x7e;              /**< Scan code for Single quote (') key.*/
+    public static final int EStdKeyHash=0x7f;                     /**< Scan code for Hash key (#) key.*/
+    public static final int EStdKeySquareBracketLeft=0x80;        /**< Scan code for left Square bracket ([) key.*/
+    public static final int EStdKeySquareBracketRight=0x81;       /**< Scan code for right Square bracket (]) key.*/
+    public static final int EStdKeyMinus=0x82;                    /**< Scan code for Minus key (-) key.*/
+    public static final int EStdKeyEquals=0x83;                   /**< Scan code for Equals key (=) key.*/
+    public static final int EStdKeyNkpForwardSlash=0x84;          /**< Scan code for forward slash (/) key on the Numeric keypad.*/
+    public static final int EStdKeyNkpAsterisk=0x85;              /**< Scan code for Asterisk (*) key on the Numeric keypad.*/
+    public static final int EStdKeyNkpMinus=0x86;                 /**< Scan code for Minus (-) key on the Numeric keypad.*/
+    public static final int EStdKeyNkpPlus=0x87;                  /**< Scan code for Plus (+) key on the Numeric keypad.*/
+    public static final int EStdKeyNkpEnter=0x88;                 /**< Scan code for Enter key on the Numeric keypad.*/
+    public static final int EStdKeyNkp1=0x89;                     /**< Scan code for the 1 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp2=0x8a;                     /**< Scan code for the 2 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp3=0x8b;                     /**< Scan code for the 3 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp4=0x8c;                     /**< Scan code for the 4 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp5=0x8d;                     /**< Scan code for the 5 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp6=0x8e;                     /**< Scan code for the 6 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp7=0x8f;                     /**< Scan code for the 7 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp8=0x90;                     /**< Scan code for the 8 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp9=0x91;                     /**< Scan code for the 9 key on the Numeric keypad.*/
+    public static final int EStdKeyNkp0=0x92;                     /**< Scan code for the 0 key on the Numeric keypad.*/
+    public static final int EStdKeyNkpFullStop=0x93;              /**< Scan code for Full stop (.) key on the Numeric keypad.*/
+    public static final int EStdKeyMenu=0x94;                     /**< Scan code for Menu key.*/
+    public static final int EStdKeyBacklightOn=0x95;              /**< Scan code for Backlight on key.*/
+    public static final int EStdKeyBacklightOff=0x96;             /**< Scan code for Backlight off key.*/
+    public static final int EStdKeyBacklightToggle=0x97;          /**< Scan code for Backlight toggle key.*/
+    public static final int EStdKeyIncContrast=0x98;              /**< Scan code for Increase contrast key.*/
+    public static final int EStdKeyDecContrast=0x99;              /**< Scan code for Decrease contrast key.*/
+    public static final int EStdKeySliderDown=0x9a;               /**< Scan code for Slider down key.*/
+    public static final int EStdKeySliderUp=0x9b;                 /**< Scan code for Slider up key.*/
+    public static final int EStdKeyDictaphonePlay=0x9c;           /**< Scan code for Dictaphone play key.*/
+    public static final int EStdKeyDictaphoneStop=0x9d;           /**< Scan code for Dictaphone stop key.*/
+    public static final int EStdKeyDictaphoneRecord=0x9e;         /**< Scan code for Dictaphone record key.*/
+    public static final int EStdKeyHelp=0x9f;                     /**< Scan code for Help key */
+    public static final int EStdKeyOff=0xa0;                      /**< Scan code for Off key.*/
+    public static final int EStdKeyDial=0xa1;                     /**< Scan code for Dial key.*/
+    public static final int EStdKeyIncVolume=0xa2;                /**< Scan code for Increase volume key.*/
+    public static final int EStdKeyDecVolume=0xa3;                /**< Scan code for Decrease volume key.*/
+    public static final int EStdKeyDevice0=0xa4;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice1=0xa5;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice2=0xa6;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice3=0xa7;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice4=0xa8;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice5=0xa9;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice6=0xaa;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice7=0xab;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice8=0xac;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDevice9=0xad;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceA=0xae;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceB=0xaf;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceC=0xb0;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceD=0xb1;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceE=0xb2;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyDeviceF=0xb3;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    public static final int EStdKeyApplication0=0xb4;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication1=0xb5;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication2=0xb6;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication3=0xb7;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication4=0xb8;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication5=0xb9;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication6=0xba;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication7=0xbb;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication8=0xbc;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplication9=0xbd;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationA=0xbe;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationB=0xbf;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationC=0xc0;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationD=0xc1;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationE=0xc2;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyApplicationF=0xc3;             /**< Scan code for device-specific application launcher key.*/
+    public static final int EStdKeyYes=0xc4;                      /**< Scan code for Yes key.*/
+    public static final int EStdKeyNo=0xc5;                       /**< Scan code for No key.*/
+    public static final int EStdKeyIncBrightness=0xc6;            /**< Scan code for Increase brightness key.*/
+    public static final int EStdKeyDecBrightness=0xc7;            /**< Scan code for Decrease brightness key.*/
+    public static final int EStdKeyKeyboardExtend=0xc8;           /**< Scan code for flip actuated when keypad extends to full keyboard.*/
+	public static final int EStdKeyDevice10 = 0xc9;               /**< Diagonal LeftUpArrow.*/
+	public static final int EStdKeyDevice11 = 0xca;               /**< Diagonal RightUpArrow.*/
+	public static final int EStdKeyDevice12 = 0xcb;               /**< Diagonal RightDownArrow.*/
+	public static final int EStdKeyDevice13 = 0xcc;               /**< Diagonal LeftDownArrow.*/
+
+    //
+    // SYMBIAN KEY CODES
+    //
+
+    public static final int ENonCharacterKeyBase = 0xf800;
+
+    public static final int EKeyNull=0x0000;                     /**< Code for the Null key. */
+    public static final int EKeyBell=0x0007;                     /**< Code for the Bell key*/
+    public static final int EKeyBackspace=0x0008;                /**< Code for the Backspace key */
+    public static final int EKeyTab=0x0009;                      /**< Code for the Tab key*/
+    public static final int EKeyLineFeed=0x000a;                 /**< Code for the Linefeed key*/
+    public static final int EKeyVerticalTab=0x000b;              /**< Code for the Vertical tab key*/
+    public static final int EKeyFormFeed=0x000c;                 /**< Code for the Form feed key*/
+    public static final int EKeyEnter=0x000d;                    /**< Code for the Enter key */
+    public static final int EKeyEscape=0x001b;                   /**< Code for the Escape key */
+    public static final int EKeySpace=0x0020;                    /**< Code for the Space key*/
+    public static final int EKeyDelete=0x007f;                   /**< Code for the Delete (Del) key*/
+    public static final int EKeyPrintScreen = ENonCharacterKeyBase;/**< Code for the Print screen key */
+    public static final int EKeyPause = ENonCharacterKeyBase + 1;     /**< Code for the Pause key*/
+    public static final int EKeyHome = ENonCharacterKeyBase + 2;                            /**< Code for the Home key*/
+    public static final int EKeyEnd = ENonCharacterKeyBase + 3;                             /**< Code for the End key*/
+    public static final int EKeyPageUp = ENonCharacterKeyBase + 4;                          /**< Code for the Page up key*/
+    public static final int EKeyPageDown = ENonCharacterKeyBase + 5;                        /**< Code for the Page down key*/
+    public static final int EKeyInsert = ENonCharacterKeyBase + 6;                          /**< Code for the Insert key*/
+    public static final int EKeyLeftArrow = ENonCharacterKeyBase + 7;                       /**< Code for the Left arrow key*/
+    public static final int EKeyRightArrow = ENonCharacterKeyBase + 8;                      /**< Code for the Right arrow key*/
+    public static final int EKeyUpArrow = ENonCharacterKeyBase + 9;                         /**< Code for the Up arrow key*/
+    public static final int EKeyDownArrow = ENonCharacterKeyBase + 10;                       /**< Code for the Down arrow key*/
+    public static final int EKeyLeftShift = ENonCharacterKeyBase + 11;                       /**< Code for the left Shift key*/
+    public static final int EKeyRightShift = ENonCharacterKeyBase + 12;                      /**< Code for the right Shift key*/
+    public static final int EKeyLeftAlt = ENonCharacterKeyBase + 13;                         /**< Code for the left Alt key*/
+    public static final int EKeyRightAlt = ENonCharacterKeyBase + 14;                        /**< Code for the right Alt key*/
+    public static final int EKeyLeftCtrl = ENonCharacterKeyBase + 15;                        /**< Code for the left Control (Ctrl) key*/
+    public static final int EKeyRightCtrl = ENonCharacterKeyBase + 16;                       /**< Code for the right Control (Ctrl) key.*/
+    public static final int EKeyLeftFunc = ENonCharacterKeyBase + 17;                        /**< Code for the left Fn key.*/
+    public static final int EKeyRightFunc = ENonCharacterKeyBase + 18;                       /**< Code for the right Fn key.*/
+    public static final int EKeyCapsLock = ENonCharacterKeyBase + 19;                        /**< Code for the Caps lock key.*/
+    public static final int EKeyNumLock = ENonCharacterKeyBase + 20;                         /**< Code for the Num lock key.*/
+    public static final int EKeyScrollLock = ENonCharacterKeyBase + 21;                      /**< Code for the Scroll lock key.*/
+    public static final int EKeyF1 = ENonCharacterKeyBase + 22;                              /**< Code for the F1 function key.*/
+    public static final int EKeyF2 = ENonCharacterKeyBase + 23;                              /**< Code for the F2 function key.*/
+    public static final int EKeyF3 = ENonCharacterKeyBase + 24;                              /**< Code for the F3 function key.*/
+    public static final int EKeyF4 = ENonCharacterKeyBase + 25;                              /**< Code for the F4 function key.*/
+    public static final int EKeyF5 = ENonCharacterKeyBase + 26;                              /**< Code for the F5 function key.*/
+    public static final int EKeyF6 = ENonCharacterKeyBase + 27;                              /**< Code for the F6 function key.*/
+    public static final int EKeyF7 = ENonCharacterKeyBase + 28;                              /**< Code for the F7 function key.*/
+    public static final int EKeyF8 = ENonCharacterKeyBase + 29;                              /**< Code for the F8 function key.*/
+    public static final int EKeyF9 = ENonCharacterKeyBase + 30;                              /**< Code for the F9 function key.*/
+    public static final int EKeyF10 = ENonCharacterKeyBase + 31;                             /**< Code for the F10 function key.*/
+    public static final int EKeyF11 = ENonCharacterKeyBase + 21;                             /**< Code for the F11 function key.*/
+    public static final int EKeyF12 = ENonCharacterKeyBase + 33;                             /**< Code for the F12 function key.*/
+    public static final int EKeyF13 = ENonCharacterKeyBase + 34;                             /**< Code for the F13 function key.*/
+    public static final int EKeyF14 = ENonCharacterKeyBase + 35;                             /**< Code for the F14 function key.*/
+    public static final int EKeyF15 = ENonCharacterKeyBase + 36;                             /**< Code for the F15 function key.*/
+    public static final int EKeyF16 = ENonCharacterKeyBase + 37;                             /**< Code for the F16 function key.*/
+    public static final int EKeyF17 = ENonCharacterKeyBase + 38;                             /**< Code for the F17 function key.*/
+    public static final int EKeyF18 = ENonCharacterKeyBase + 39;                             /**< Code for the F18 function key.*/
+    public static final int EKeyF19 = ENonCharacterKeyBase + 40;                             /**< Code for the F19 function key.*/
+    public static final int EKeyF20 = ENonCharacterKeyBase + 41;                             /**< Code for the F20 function key.*/
+    public static final int EKeyF21 = ENonCharacterKeyBase + 42;                             /**< Code for the F21 function key.*/
+    public static final int EKeyF22 = ENonCharacterKeyBase + 43;                             /**< Code for the F22 function key.*/
+    public static final int EKeyF23 = ENonCharacterKeyBase + 44;                             /**< Code for the F23 function key.*/
+    public static final int EKeyF24 = ENonCharacterKeyBase + 45;                             /**< Code for the F24 function key.*/
+    public static final int EKeyOff = ENonCharacterKeyBase + 46;                             /**< Code for the Off key.*/
+    public static final int EKeyIncContrast = ENonCharacterKeyBase + 47;                     /**< Code for the Increase contrast key.*/
+    public static final int EKeyDecContrast = ENonCharacterKeyBase + 48;                     /**< Code for the Decrease contrast key.*/
+    public static final int EKeyBacklightOn = ENonCharacterKeyBase + 49;                     /**< Code for the Backlight on key.*/
+    public static final int EKeyBacklightOff = ENonCharacterKeyBase + 50;                    /**< Code for the Backlight off key.*/
+    public static final int EKeyBacklightToggle = ENonCharacterKeyBase + 51;                 /**< Code for the Backlight toggle key.*/
+    public static final int EKeySliderDown = ENonCharacterKeyBase + 52;                      /**< Code for the Slider down key.*/
+    public static final int EKeySliderUp = ENonCharacterKeyBase + 53;                        /**< Code for the Slider up key.*/
+    public static final int EKeyMenu = ENonCharacterKeyBase + 54;                            /**< Code for the Menu key.*/
+    public static final int EKeyDictaphonePlay = ENonCharacterKeyBase + 55;                  /**< Code for the Dictaphone play key.*/
+    public static final int EKeyDictaphoneStop = ENonCharacterKeyBase + 56;                  /**< Code for the Dictaphone stop key.*/
+    public static final int EKeyDictaphoneRecord = ENonCharacterKeyBase + 57;                /**< Code for the Dictaphone record key.*/
+    public static final int EKeyHelp = ENonCharacterKeyBase + 58;                            /**< Code for the Help key.*/
+    public static final int EKeyDial = ENonCharacterKeyBase + 59;                            /**< Code for the Dial key.*/
+    public static final int EKeyScreenDimension0 = ENonCharacterKeyBase + 60;                /**< Code for the first Screen dimension change key.*/
+    public static final int EKeyScreenDimension1 = ENonCharacterKeyBase + 61;                /**< Code for the second Screen dimension change key.*/
+    public static final int EKeyScreenDimension2 = ENonCharacterKeyBase + 62;                /**< Code for the third Screen dimension change key.*/
+    public static final int EKeyScreenDimension3 = ENonCharacterKeyBase + 63;                /**< Code for the fourth Screen dimension change key.*/
+    public static final int EKeyIncVolume = ENonCharacterKeyBase + 64;                       /**< Code for the increase colume key.*/
+    public static final int EKeyDecVolume = ENonCharacterKeyBase + 65;                       /**< Code for the decrease volume key.*/
+    public static final int EKeyDevice0 = ENonCharacterKeyBase + 66;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice1 = ENonCharacterKeyBase + 67;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice2 = ENonCharacterKeyBase + 68;                         /**< Code for a device specific key. */
+    public static final int EKeyDevice3 = ENonCharacterKeyBase + 69;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice4 = ENonCharacterKeyBase + 70;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice5 = ENonCharacterKeyBase + 71;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice6 = ENonCharacterKeyBase + 72;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice7 = ENonCharacterKeyBase + 73;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice8 = ENonCharacterKeyBase + 74;                         /**< Code for a device specific key.*/
+    public static final int EKeyDevice9 = ENonCharacterKeyBase + 75;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceA = ENonCharacterKeyBase + 76;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceB = ENonCharacterKeyBase + 77;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceC = ENonCharacterKeyBase + 78;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceD = ENonCharacterKeyBase + 79;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceE = ENonCharacterKeyBase + 80;                         /**< Code for a device specific key.*/
+    public static final int EKeyDeviceF = ENonCharacterKeyBase + 81;                         /**< Code for a device specific key.*/
+    public static final int EKeyApplication0 = ENonCharacterKeyBase + 82;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication1 = ENonCharacterKeyBase + 83;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication2 = ENonCharacterKeyBase + 84;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication3 = ENonCharacterKeyBase + 85;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication4 = ENonCharacterKeyBase + 86;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication5 = ENonCharacterKeyBase + 87;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication6 = ENonCharacterKeyBase + 88;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication7 = ENonCharacterKeyBase + 89;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication8 = ENonCharacterKeyBase + 90;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplication9 = ENonCharacterKeyBase + 91;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationA = ENonCharacterKeyBase + 92;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationB = ENonCharacterKeyBase + 93;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationC = ENonCharacterKeyBase + 94;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationD = ENonCharacterKeyBase + 95;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationE = ENonCharacterKeyBase + 96;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyApplicationF = ENonCharacterKeyBase + 97;                    /**< Code for an Application launcher key.*/
+    public static final int EKeyYes = ENonCharacterKeyBase + 98;                             /**< Code for the Yes key.*/
+    public static final int EKeyNo = ENonCharacterKeyBase + 99;                              /**< Code for the No key.*/
+    public static final int EKeyIncBrightness = ENonCharacterKeyBase + 100;                   /**< Code for the increase brightness key.*/
+    public static final int EKeyDecBrightness = ENonCharacterKeyBase + 101;                   /**< Code for the decrease brightness key. */
+    public static final int EKeyKeyboardExtend = ENonCharacterKeyBase + 102;                  /**< Code for flip actuated when keypad extends to full keyboard.*/
+	public static final int EKeyDevice10 = ENonCharacterKeyBase + 103;                         /**< Diagonal LeftUpArrow.*/
+	public static final int EKeyDevice11 = ENonCharacterKeyBase + 104;                         /**< Diagonal RightUpArrow.*/
+	public static final int EKeyDevice12 = ENonCharacterKeyBase + 105;                         /**< Diagonal RightDownArrow.*/
+	public static final int EKeyDevice13 = ENonCharacterKeyBase + 106;                         /**< Diagonal LeftDownArrow.*/
+
+    /** map from logical key codes to symbian key codes
+     *  (index is logical key codes above with opposite sign)
+     * */
+    private int logicalKeyCodes[] = {
+            EKeyUpArrow, //UpArrow
+            EKeyDownArrow,//DownArrow
+            EKeyLeftArrow,//LeftArrow
+            EKeyRightArrow,//RightArrow
+            EStdKeyDelete, //Clear
+            EKeyDevice3, //Select
+            EKeyRightShift, //Edit
+            EKeyYes, //Send
+            EKeyDevice0, //CBA1
+            EKeyDevice1, //CBA2
+            EKeyNo, //End
+            EKeyApplication0, //Applications
+            EKeyDevice6, //Voice
+            EKeyDevice7, //Power
+            EKeyDelete, //Backspace
+            EKeySliderDown, //GripOpen
+            EKeySliderUp,   //GripClose
+            EKeyDevice7, //Camera
+            EKeyIncVolume, //VolumeUp
+            EKeyDecVolume, //VolumeDown
+            EKeyApplication2, //PlayPause
+            EKeyApplication3, //Stop
+            EKeyApplication4, //NextFF
+            EKeyApplication5, //PreviousRew
+            EKeyPageUp, // PageUp
+            EKeyPageDown, // PageDown
+            EKeyHome, // HomeKey
+            EKeyEnd, // EndKey
+            EKeyDevice3, // Activate
+            EKeyInsert, // InsertKey
+            EKeyEnter, // ReturnKey
+            EKeyDelete, // DeleteKey
+            EKeyEscape, // Escape
+			EKeyDevice10, //Diagonal LeftUpArrow
+			EKeyDevice11, //Diagonal RightUpArrow
+			EKeyDevice12, //Diagonal RightDownArrow
+			EKeyDevice13 //Diagonal LeftDownArrow
+    };
+
+    /** map from logical key codes to symbian scan codes
+     * (index is logical key codes above with opposite sign)
+     * */
+    private int logicalScanCodes[] = {
+            EStdKeyUpArrow, //UpArrow
+            EStdKeyDownArrow, //DownArrow
+            EStdKeyLeftArrow, //LeftArrow
+            EStdKeyRightArrow, //RightArrow
+            EStdKeyBackspace, //Clear
+            EStdKeyDevice3, //Select
+            EStdKeyRightShift, //Edit
+            EStdKeyYes, //Send
+            EStdKeyDevice0, //CBA1
+            EStdKeyDevice1, //CBA2
+            EStdKeyNo, //End
+            EStdKeyApplication0, //Applications
+            EStdKeyDevice6, //Voice
+            EStdKeyDevice2, //Power
+            EStdKeyBackspace, //Backspace
+            EStdKeyNull, //GripOpen  //TODO
+            EStdKeyNull, //GripClose    //TODO
+            EStdKeyDevice7, //Camera
+            EStdKeyIncVolume, //VolumeUp
+            EStdKeyDecVolume, //VolumeDown
+            EStdKeyApplication2, //PlayPause
+            EStdKeyApplication3, //Stop
+            EStdKeyApplication4, //NextFF
+            EStdKeyApplication5, //PreviousRew
+            EStdKeyPageUp,// PageUp
+            EStdKeyPageDown,// PageDown
+            EStdKeyHome,// HomeKey
+            EStdKeyEnd,// EndKey
+            EStdKeyDevice3,// Activate
+            EStdKeyInsert,// InsertKey
+            EStdKeyEnter,// ReturnKey
+            EStdKeyDelete,// DeleteKey
+            EStdKeyEscape,// Escape
+			EStdKeyDevice10, //Diagonal LeftUpArrow
+			EStdKeyDevice11, //Diagonal RightUpArrow
+			EStdKeyDevice12, //Diagonal RightDownArrow
+			EStdKeyDevice13 //Diagonal LeftDownArrow
+
+
+    };
+
+    /** Default constructor */
+    public Key() {
+        this.keyCode = 0;
+        this.scanCode = 0;
+    }
+
+    /** Constructor accepting symbian key and scan codes defined above */
+    public Key(int keyCode, int scanCode) {
+        this.keyCode = keyCode;
+        this.scanCode = scanCode;
+    }
+
+    /** Constructor accepting unicode or logical key codes defined above */
+    public Key(int keyCode) {
+    //JDEBUG("Key: Converting logical code " + keyCode);
+
+        if (keyCode < 0) {
+            this.keyCode = logicalKeyCodes[-keyCode -1];
+            this.scanCode = logicalScanCodes[-keyCode -1];
+        } else if (keyCode >= 'a' && keyCode <= 'z') {
+            this.keyCode = keyCode;
+            this.scanCode = keyCode - 'a' + 'A';
+        } else if (keyCode == '*') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyNkpAsterisk;
+
+        } else if (keyCode == '#') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyHash;
+        }  else if (keyCode == '/' || keyCode == '?') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyForwardSlash;
+        }
+        else if (keyCode == EKeyBackspace) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyBackspace;
+        }
+        else if (keyCode == EKeyEnter) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyEnter;
+        }
+        else if (keyCode == EKeyEscape) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyEscape;
+        }
+        else if (keyCode == EKeyDelete) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyDelete;
+        }
+        else if (keyCode == EKeyTab) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyTab;
+        }
+        else if (keyCode == '-' || keyCode == '_') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyMinus;
+        }
+        else if (keyCode == '=') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyEquals;
+        }
+        else if (keyCode == '+') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyNkpPlus;
+        }
+        else if (keyCode == ';' || keyCode == ':') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeySemiColon;
+        }
+        else if (keyCode == '\'' || keyCode == '\"' ) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeySingleQuote;
+        }
+        else if (keyCode >= '0' && keyCode <= '9') {
+            this.keyCode = keyCode;
+            this.scanCode = keyCode;
+        }
+        else if (keyCode == EKeySpace) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeySpace;
+        }
+        else if (keyCode == DownArrow) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyDownArrow;
+        }
+        else if (keyCode == UpArrow) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyUpArrow;
+        }
+        else if (keyCode == LeftArrow) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyLeftArrow;
+        }
+        else if (keyCode == RightArrow) {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyRightArrow;
+        }
+        else if (keyCode == ',') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyComma;
+        }
+        else if (keyCode == '.') {
+            this.keyCode = keyCode;
+            this.scanCode = EStdKeyFullStop;
+        } else {
+            this.keyCode = keyCode;
+            this.scanCode = keyCode;
+        }
+    }
+
+    /** The symbian key code */
+    public int keyCode;
+
+    /** The symbian scan code */
+    public int scanCode;
+
+    /** Modifiers, for compatibility with XlibUtils **/
+    public int modifiers;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/KeyFactory.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,75 @@
+package com.nokia.mj.impl.uitestutils;
+
+public class KeyFactory
+{
+
+    public static Key RIGHT_ARROW = new Key(Key.RightArrow);
+    public static Key LEFT_ARROW = new Key(Key.LeftArrow);
+    public static Key UP_ARROW = new Key(Key.UpArrow);
+    public static Key DOWN_ARROW = new Key(Key.DownArrow);
+    public static Key LEFTUP_ARROW = new Key(Key.EStdKeyDevice10);
+    public static Key RIGHTUP_ARROW = new Key(Key.EStdKeyDevice11);
+    public static Key RIGHTDOWN_ARROW = new Key(Key.EStdKeyDevice12);
+    public static Key LEFTDOWN_ARROW = new Key(Key.EStdKeyDevice13);
+    
+    public static Key SELECT_KEY = new Key(Key.Select);
+    public static Key SK1 = new Key(Key.CBA1);
+    public static Key SK2 = new Key(Key.CBA2);
+
+    public static Key KEYPAD_0 = new Key(Key.EStdKeyNkp0);
+    public static Key KEYPAD_1 = new Key(Key.EStdKeyNkp1);
+    public static Key KEYPAD_2 = new Key(Key.EStdKeyNkp2);
+    public static Key KEYPAD_3 = new Key(Key.EStdKeyNkp3);
+    public static Key KEYPAD_4 = new Key(Key.EStdKeyNkp4);
+    public static Key KEYPAD_5 = new Key(Key.EStdKeyNkp5);
+    public static Key KEYPAD_6 = new Key(Key.EStdKeyNkp6);
+    public static Key KEYPAD_7 = new Key(Key.EStdKeyNkp7);
+    public static Key KEYPAD_8 = new Key(Key.EStdKeyNkp8);
+    public static Key KEYPAD_9 = new Key(Key.EStdKeyNkp9);
+
+    public static Key F1 = new Key(Key.EKeyF1);
+    public static Key F2 = new Key(Key.EKeyF2);
+    public static Key F3 = new Key(Key.EKeyF3);
+    public static Key F4 = new Key(Key.EKeyF4);
+    public static Key F5 = new Key(Key.EKeyF5);
+    public static Key F6 = new Key(Key.EKeyF6);
+    public static Key F7 = new Key(Key.EKeyF7);
+    public static Key F8 = new Key(Key.EKeyF8);
+    public static Key F9 = new Key(Key.EKeyF9);
+    public static Key F10 = new Key(Key.EKeyF10);
+    public static Key F11 = new Key(Key.EKeyF11);
+    public static Key F12 = new Key(Key.EKeyF12);
+    public static Key F13 = new Key(Key.EKeyF13);
+    public static Key F14 = new Key(Key.EKeyF14);
+    public static Key F15 = new Key(Key.EKeyF15);
+
+    public static Key BACKSPACE = new Key(Key.Backspace);
+    public static Key ENTER = new Key(Key.EKeyEnter);
+    public static Key ESCAPE = new Key(Key.EKeyEscape);
+    public static Key TAB = new Key(Key.EKeyTab);
+    public static Key CTRL_RIGHT = new Key(Key.EStdKeyRightCtrl);
+    public static Key CTRL_LEFT = new Key(Key.EStdKeyLeftCtrl);
+    public static Key SHIFT_RIGHT = new Key(Key.EStdKeyRightShift);
+    public static Key SHIFT_LEFT = new Key(Key.EStdKeyLeftShift);
+    public static Key SPACE = new Key(Key.EStdKeySpace);
+    public static Key DEL = new Key(Key.EKeyDelete);
+
+    public static Key STAR = new Key('*');
+    public static Key DIVIDE = new Key(Key.EStdKeyNkpForwardSlash);
+    public static Key ADD = new Key(Key.EStdKeyNkpPlus);
+    public static Key SUBTRACT = new Key(Key.EStdKeyNkpMinus);
+    public static Key HASH = new Key('#');
+    public static Key CLEAR = new Key(Key.EStdKeyBackspace);
+    public static Key EDIT = new Key(Key.EStdKeyRightShift);
+    public static Key SEND = new Key(Key.EStdKeyYes);
+    public static Key END = new Key(Key.EStdKeyNo);
+    public static Key APPLICATIONS = new Key(Key.EStdKeyApplication0);
+    public static Key VOICE = new Key(Key.EStdKeyDevice6);
+    public static Key SOFTKEY_1 = new Key(Key.EStdKeyDevice0);
+    public static Key SOFTKEY_2 = new Key(Key.EStdKeyDevice1);
+
+    public static Key key(int keyCode)
+    {
+        return new Key(keyCode);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Mask.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,275 @@
+package com.nokia.mj.impl.uitestutils;
+
+/**
+ * Mask implementation for storing and manipulating reference mask 
+ * for pixel checking. Mask can be mirrored, rotated, restored etc.
+ * 
+ * A new mask can be created from int[] array which holds indexes for 
+ * refrence colors, e.g. value 1 can stand for red and 0 for white.
+ * 
+ * example:
+ * <code>
+ * int[] maskData  = {
+ * 		0,0,0,0,0,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,1,0,0,0,0,
+ * 		0,0,0,0,0,0,0,0,0
+ * };
+ * </code>
+ * 
+ * ImageUtils can validate image pixels against mask indexes and given index colors.
+ * 
+ * @author sampkaar
+ */
+
+
+public class Mask {
+	
+	int[] iMask = null;
+	int[] iOrigMask = null;
+	int iScanlength = 0;
+	int iWidth = 0;
+	int iHeight = 0;
+	Point iCenter;
+	
+	/**
+	 * Creates instance of Mask.
+	 * 
+	 * @param mask - int array for mask to be created, values should be 0 or 1
+	 * @param scanlength - length of line in mask
+	 * 
+	 * @throws IllegalArgumentException - if mask is null
+	 * @throws IllegalArgumentException - if remainder or mask.length/scanlength is not zero
+	 */
+	public Mask(int[] mask, int scanlength) {
+		if(mask == null) {
+			throw new IllegalArgumentException("mask is null");
+		}
+		if((mask.length % scanlength) != 0) {
+			throw new IllegalArgumentException("Illegal scanlength");
+		}
+		iMask = mask;
+		iOrigMask = mask;
+		iScanlength = scanlength;
+		iCenter = new Point(scanlength/2, (iMask.length/scanlength)/2);
+		iWidth = scanlength;
+		iHeight = iMask.length/scanlength;
+	}
+	
+	/**
+	 * Returns mask's data array. 
+	 */
+	public int[] getData() {
+			return iMask;
+	}
+	
+	/**
+	 * gets subarea (rect) of mask specified by given arguments.
+	 * 
+	 * @param x The x-coordinate of ractangle
+	 * @param y The y-coordinate of ractangle
+	 * @param width The width of ractangle
+	 * @param height The height of ractangle
+	 */
+	public int[] getData(int x, int y, int width, int height) {
+		// specified area cannot exceed mask bounds
+		if((x+width > iWidth) || (y+height > iHeight)) {
+			throw new IllegalArgumentException("Area to be retrieved exceeds mask bounds");
+		}
+		
+		// create new array 
+		int[] result = new int[width*height];
+		final int h = y+height;
+		final int w = x+width;
+		
+		// populate array
+		int resultIndex = 0;
+		for(int i = y; i < h ; i++) {
+			for(int j=x; j<w ; j++) {
+				result[resultIndex] = iMask[(i*iWidth)+j];
+				resultIndex++;
+			}
+		}
+		return result;
+	}
+	
+	
+	/**
+	 * gets the width of mask.
+	 */
+	public int getWidth() {
+		return iWidth;
+	}
+	
+	/**
+	 * gets the height of mask.
+	 */
+	public int getHeight() {
+		return iHeight;
+	}
+	
+	/**
+	 * Mirrors mask around its center point.
+	 * 
+	 * @param vertical if true mirror is done along y-axis otherwise along x-axis
+	 */
+	public void mirror(boolean vertical) {
+		int[] resultMask = new int[iMask.length];
+		int y = 0; // linecounter
+		
+		// along y-axis
+		if(vertical) {
+			// start at end for first scanline
+			int sourceIndex = iScanlength-1; 
+			for(int i=0; i<iMask.length; i++) {
+				resultMask[i] = iMask[sourceIndex];
+				sourceIndex--;
+				
+				// move to next line
+				if(i==((y*iScanlength) + (iScanlength-1))) {
+					y++;
+					sourceIndex = (y*iScanlength)+(iScanlength-1); 
+				} 
+			}
+		}
+		// along x-axis
+		else {
+			int dstIndex = 0;
+			for(int srcIndex = (iMask.length-iScanlength); srcIndex >= 0; srcIndex -= iScanlength) {
+				System.arraycopy(iMask, srcIndex, resultMask, dstIndex, iScanlength);
+				dstIndex += iScanlength;
+			}
+		}
+		// save result mask
+		iMask = resultMask;	
+	}
+	
+	/**
+	 * Prints mask contents to console
+	 */
+	public void print() {
+		String output = "\n Mask("+iScanlength+","+iMask.length/iScanlength+"):\n";
+		int y = 0;
+		for(int i = 0; i < iMask.length; i++) {
+			output += iMask[i]+",";
+			if(i==((y*iScanlength) + (iScanlength-1))) {
+				output += "\n";
+				y++;
+			}
+		}
+		System.out.println(output);
+	}
+	
+	/**
+	 * prints given mask data
+	 * 
+	 * @param maskData The data of mask to be printed
+	 * @param scanlengt The scanlength of one line in maskData
+	 */
+	public void print(int[] maskData, int scanlength) {
+		
+		final int width = scanlength;
+		final int height = maskData.length / width;
+		
+		String output = "\n Mask("+width+","+height+"):\n";
+		
+		int y = 0;
+		for(int i = 0; i < maskData.length; i++) {
+			output += maskData[i]+",";
+			if(i==((y*width) + (width-1))) {
+				output += "\n";
+				y++;
+			}
+		}
+		System.out.println(output);
+	}
+	
+	/**
+	 * Resets mask to original mask given in constructor.
+	 */
+	public void resetOriginal() {
+		iMask = iOrigMask;
+	}
+	
+	/**
+	 * Rotates mask.
+	 * Positive angle rotates clockwise 
+	 * Negative angle rotates counterclockwise
+	 * 
+	 * NOTE output is 100% correct only if width/height of mask is not even, i.e.
+	 * 21 is ok, but 20 not. This is because currently the rotation is done after 
+	 * translating origin to the center of the mask and if width is 20 there no clear 
+	 * center...
+	 * 
+	 * @param angel - The rotation angel
+	 * @throws IllegalArgumentException - if remainder of angle / 90 is not zero
+	 */
+	public void rotate(float angle) {
+		if((angle % 90) != 0) {
+			throw new IllegalArgumentException("do not use other than 90 degree rotations");
+		}
+		Matrix m = new Matrix();
+		m.translate(iCenter.x, iCenter.y);
+		m.rotate(angle);
+		m.translate(-iCenter.x, -iCenter.y);
+		transform(m);
+	}
+	
+	/**
+	 * Transforms mask based on given transform matrix.
+	 * Note e.g. 45 degree rotation will fail as it needs bigger
+	 * buffer, which is not supported.
+	 * 
+	 * @param m - The trasformation matrix
+	 * @throws IllegalArgumentException - if matrix m is null
+	 * 
+	 */
+	private void transform(Matrix m) {
+		if(m == null) {
+			throw new IllegalArgumentException("Matrix m is null");
+		}
+		
+		int[] resultMask = new int[iMask.length];
+		int y = 0; // line in source mask
+		int targetIndex = 0; // result mask index
+		
+		// points for source and target
+		Point sourcePoint;
+		Point targetPoint;
+		
+		for(int i=0; i< iMask.length ; i++){
+			sourcePoint = new Point((i-(y*iScanlength)), y);
+			targetPoint = m.transform(sourcePoint);
+			targetIndex = (round(targetPoint.y)*iScanlength)+round(targetPoint.x);
+			resultMask[targetIndex] = iMask[i];
+			
+			if(i==((y*iScanlength) + (iScanlength-1))) {
+				y++;
+			}                   
+		}
+		iMask = resultMask;
+	}
+	
+	/**
+	 * Rounds given float to closest int value, e.g.
+	 * If value >= 0.5 result is 1 
+	 * if value <= 0.49 result is 0
+	 * 
+	 * @param value - The value to be rounded
+	 */
+	private int round(float value) {
+		int result = 0;
+		float temp = (int)value;  
+		
+		if((temp+0.5 <= value))  {
+			result = (int)value+1;
+		} else {
+			result = (int)value;
+		}
+		return result;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Matrix.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,258 @@
+package com.nokia.mj.impl.uitestutils;
+
+/**
+ * Matrix calculation implementation.
+ * 
+ */
+public class Matrix {
+
+    static final int ARRAY_SIZE = 6;
+    // Array index
+    static private final int M00 = 0; 
+    static private final int M10 = 1; 
+    static private final int M01 = 2; 
+    static private final int M11 = 3; 
+    static private final int M02 = 4; 
+    static private final int M12 = 5; 
+	
+    private float iComponents[];
+
+    /**
+     * Construct a matrix with the following components:
+     * <pre>
+     * [1 0 0]
+     * [0 1 0]
+     * </pre>
+     */
+    public Matrix() {
+        iComponents = new float[ARRAY_SIZE];
+        identity();
+    }
+    
+    /**
+     * Construct a matrix with the following components:
+     * <pre>
+     * [aM00 aM01 aM02]
+     * [aM10 aM11 aM12]
+     * </pre>
+     * @param aM00 the x scaling component
+     * @param aM10 the y shearing component
+     * @param aM01 the x shearing component
+     * @param aM11 the y scaling component
+     * @param aM02 the x translation component
+     * @param aM12 the y translation component
+     */
+    public Matrix(float aM00, float aM10, float aM01, 
+    		     float aM11, float aM02, float aM12) {
+        iComponents = new float[ARRAY_SIZE];
+        iComponents[M00] = aM00; iComponents[M01] = aM01; iComponents[M02] = aM02; 
+        iComponents[M10] = aM10; iComponents[M11] = aM11; iComponents[M12] = aM12;	
+    }
+
+    /**
+     * Constructor
+     * Create a new matrix by coping the given one.
+     * @param aMatrix the matrix to copy
+     */ 
+    public Matrix(Matrix aMatrix) {
+        iComponents = new float[aMatrix.iComponents.length];
+        for(int index = 0; index < iComponents.length; index++) {
+            iComponents[index] = aMatrix.iComponents[index];
+        }
+    }
+    
+    /**
+     * 
+     */
+    public float getComponent(int index) {
+        return iComponents[index];
+    }
+
+    /**
+     * Set matrix components:
+     * <pre>
+     * [1 0 0]
+     * [0 1 0]
+     * </pre>
+     * 
+     */
+    public void identity()
+    {
+        iComponents[M00] = 1; iComponents[M01] = 0; iComponents[M02] = 0; 
+        iComponents[M10] = 0; iComponents[M11] = 1; iComponents[M12] = 0; 
+    }
+
+    /**
+     * Return transformed <code>Point</code> instance
+     *
+     * The transformation can be represented using matrix math on a 3x3 array.
+     * Given (x,y), the transformation (x',y') can be found by:
+     * [ x']   [ m00 m01 m02 ] [ x ]   [ m00*x + m01*y + m02 ]
+     * [ y'] = [ m10 m11 m12 ] [ y ] = [ m10*x + m11*y + m12 ]
+     * [ 1 ]   [  0   0   1  ] [ 1 ]   [          1          ]
+     *
+     * The bottom row of the matrix is constant, so a transform can be uniquely
+     * represented by "[[m00, m01, m02], [m10, m11, m12]]".
+     * @param p the source point
+     * @return new point instance
+     */
+    public Point transform(final Point p)
+    {
+        return new Point(
+            iComponents[M00] * p.x + iComponents[M01] * p.y + iComponents[M02],
+            iComponents[M10] * p.x + iComponents[M11] * p.y + iComponents[M12]);
+    }
+    
+    /**
+     * Return the matrix of components used in this transform. The resulting
+     * values are:
+     * <pre>
+     * [array[0] array[2] array[4]]
+     * [array[1] array[3] array[5]]
+     * </pre>
+     * @return array that contains the matrix components.
+     */
+    float[] getComponents() {
+	return iComponents;
+    }
+
+    
+    /**
+     * Return the determinant of this transform matrix. If the determinant is
+     * non-zero, the transform is invertible.
+     * The determinant is calculated as:
+     * <pre>
+     * [m00 m01 m02] 
+     * [m10 m11 m12] = m00 * m11 - m01 * m10
+     * [ 0   0   1 ]
+     * </pre>
+     * @return the determinant
+     */
+    public float determinant() {
+        return ((iComponents[M00] * iComponents[M11]) - 
+		        (iComponents[M01] * iComponents[M10]));
+    }
+        
+    /**
+     * The inverse is calculated as:
+     * <pre>
+     *     [m00 m01 m02]
+     *  M= [m10 m11 m12]
+     *     [ 0   0   1 ] 
+     *
+     *              1                 [ m11/det  -m01/det   (m01*m12-m02*m11)/det]     
+     * inverse(M)= --- x adjoint(M) = [-m10/det   m00/det   (m10*m02-m00*m12)/det] 
+     *             det                [    0         0               1           ]  
+     * </pre>
+     */
+    public Matrix inverse() {
+    	// The inversion is useful for undoing transformations.
+    	float det = determinant();
+        if (det == 0) 
+        { 
+            throw new RuntimeException("Invalid determinant");
+        }
+        return new Matrix(
+            iComponents[M11] / det, // iMtx[M00]
+            (-iComponents[M10]) / det, // iMtx[M10]
+            (-iComponents[M01]) / det, // iMtx[M01]
+            iComponents[M00] / det, // iMtx[M11]
+            ((iComponents[M01] * iComponents[M12]) - (iComponents[M02] * iComponents[M11])) / det, 
+            ((iComponents[M10] * iComponents[M02]) - (iComponents[M00] * iComponents[M12])) / det); 
+    }
+
+    /**
+     * The multiply is calculated as:
+     * <pre>
+     *       [a00 a01 a02]   [b00 b01 b02]
+     *  this=[a10 a11 a12] B=[b10 b11 b12] 
+     *       [ 0   0   1 ]   [ 0   0   1 ]
+     *
+     *                       [(a00*b00+a01*b10) (a00*b01+a01*b11) (a00*b02+a01*b12+a02)]   
+	 * [this] = [this]x[B] = [(a10*b00+a11*b10) (a10*b01+a11*b11) (a10*b02+a11*b12+a12)]
+     *                       [       0                   0                     1       ]
+     * </pre>
+     */
+    public Matrix multiply(Matrix b) {
+    	if(b == null) 
+    	{
+            throw new NullPointerException();
+    	}
+        float a00 = iComponents[M00]; // a
+        float a10 = iComponents[M10]; // b
+        float a01 = iComponents[M01]; // c
+        float a11 = iComponents[M11]; // d
+        float a02 = iComponents[M02]; // e
+        float a12 = iComponents[M12]; // f
+        iComponents[M00] = (a00 * b.iComponents[M00]) + (a01 * b.iComponents[M10]); // a
+        iComponents[M10] = (a10 * b.iComponents[M00]) + (a11 * b.iComponents[M10]); // b
+        iComponents[M01] = (a00 * b.iComponents[M01]) + (a01 * b.iComponents[M11]); // c
+        iComponents[M11] = (a10 * b.iComponents[M01]) + (a11 * b.iComponents[M11]); // d
+        iComponents[M02] = (a00 * b.iComponents[M02]) + (a01 * b.iComponents[M12]) + a02; // e
+        iComponents[M12] = (a10 * b.iComponents[M02]) + (a11 * b.iComponents[M12]) + a12; // f
+	return this;
+    }
+    
+    /**
+     * The rotation is calculated as:
+     * <pre>
+     *          [ cos(angle) -sin(angle) 0 ]
+     * [this] x [ sin(angle)  cos(angle) 0 ]
+     *          [     0           0      1 ]
+     * </pre>
+     */
+    public Matrix rotate(float angle) {
+	if (angle % 360 == 0) { 
+            return this; 
+	}
+	// Must convert degrees to radians since java.lang.Math expects radians
+	angle = angle * (float)Math.PI / 180.0f;
+	float c = (float)Math.cos(angle);
+	float s = (float)Math.sin(angle);
+        float m00 = iComponents[M00];
+        float m10 = iComponents[M10];
+        float m01 = iComponents[M01];
+        float m11 = iComponents[M11];
+	iComponents[M00] = m00 * c + m01 * s;
+	iComponents[M10] = m10 * c + m11 * s;
+	iComponents[M01] = m01 * c - m00 * s;
+	iComponents[M11] = m11 * c - m10 * s;
+	return this;
+    }
+
+    /**
+     * The multiply is calculated as:
+     * <pre>
+     *       [m00 m01 m02]   [scaleFactor      0      0]
+     *  this=[m10 m11 m12] B=[    0       scaleFactor 0] 
+     *       [ 0   0   1 ]   [    0            0      1]
+     *
+     *                       [(a00*scaleFactor) (a01*scaleFactor) a02]   
+     * [this] = [this]x[B] = [(a10*scaleFactor) (a11*scaleFactor) a12]
+     *                       [       0                   0         1 ]
+     * </pre>
+     * @see org.w3c.dom.svg.SVGMatrix#mScale()
+     */
+    public Matrix scale(float scaleFactor) {
+    	if(scaleFactor == 1) { 
+    		return this; 
+    	}
+        iComponents[M00] *= scaleFactor;  
+        iComponents[M01] *= scaleFactor; 
+        iComponents[M10] *= scaleFactor;  
+        iComponents[M11] *= scaleFactor;
+        return this;
+    }
+
+    /**
+     * 
+     */
+    public Matrix translate(float x, float y) {
+    	if(x == 0 && y == 0) { 
+    		return this; 
+    	}
+	iComponents[M02] += (iComponents[M00] * x) + (iComponents[M01] * y);
+	iComponents[M12] += (iComponents[M10] * x) + (iComponents[M11] * y); 
+    	return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Modifier.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,14 @@
+package com.nokia.mj.impl.uitestutils;
+
+public final class Modifier {
+
+    // Bitmask for sending modifiers 
+    // Values taken from /usr/include/X11/X.h
+    public static final int Shift                           = (1<<0);
+    public static final int CapsLock                        = (1<<1);
+    public static final int Control                         = (1<<2);
+    public static final int Alt                             = (1<<3);
+    public static final int NumLock                         = (1<<4);
+    public static final int ScrllLock                       = (1<<4);
+    public static final int AltGr                           = (1<<7);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Point.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,32 @@
+
+package com.nokia.mj.impl.uitestutils;
+
+/**
+ * Class for storing point, i.e. x and y values.
+ * This is used in matric calculations.
+ *
+ * @author ktuokkol
+ */
+public class Point {
+    public float x;
+    public float y;
+    
+    /**
+     * Ctor
+     */
+    public Point() {
+        x = 0f;
+        y = 0f;
+    }
+
+    /**
+     * Ctor
+     * @param x
+     * @param y
+     */
+    public Point(float x, float y) {
+        this.x = x;
+        this.y = y;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/Rect.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,100 @@
+package com.nokia.mj.impl.uitestutils;
+
+/**
+ * Simple rect container
+ * @author sampkaar
+ *
+ */
+public class Rect {
+	
+	private int x;
+	private int y;
+	private int width;
+	private int height;
+	
+	public Rect(int x, int y, int width, int height) {
+		this.x = x;
+		this.y = y;
+		this.width = width;
+		this.height = height;
+	}
+	
+	public int x() {
+		return this.x;
+	}
+	
+	public int y() {
+		return this.y;
+	}
+	
+	public int width() {
+		return this.width;
+	}
+	
+	public int height() {
+		return this.height;
+	}
+
+	public Rect intersection(Rect aRect){
+
+		if( aRect.x < this.x && aRect.x+aRect.width < this.x ||
+            aRect.x > this.x+this.width && aRect.x+aRect.width > this.x+this.width)
+        { // no intersection
+        	return new Rect(0,0,0,0);
+        } 
+        if( aRect.y < this.y && aRect.y+aRect.height < this.y ||
+            aRect.y > this.y+this.height && aRect.y+aRect.height > this.y+this.height)
+        { // no intersection
+            return new Rect(0,0,0,0);
+        }
+        int x = 0;
+        int y = 0;
+        int w = 0;
+        int h = 0;
+        
+        if(aRect.x < this.x)
+        {
+        	x = this.x;
+        	if (this.x + this.width < aRect.x + aRect.width)
+        	{
+        		w = this.width;
+        	}else
+        	{
+        		w = aRect.x + aRect.width - this.x;        		
+        	}
+        } else
+        { // aRect.x >= this.x
+        	x = aRect.x;        	
+        	if (aRect.x + aRect.width < this.x + this.width)
+        	{
+        		w = aRect.width;
+        	}else
+        	{
+        		w = this.x + this.width - aRect.x;
+        	}
+        }
+        if(aRect.y < this.y)
+        {
+        	y = this.y;
+        	if (this.y + this.height < aRect.y + aRect.height)
+        	{
+        		h = this.height;
+        	}else
+        	{
+        		h = aRect.y + aRect.height - this.y;
+        	}
+        } else
+        { // aRect.y >= this.y
+        	y = aRect.y;        	
+        	if (aRect.y + aRect.height < this.y + this.height)
+        	{
+        		h = aRect.height;
+        	}else
+        	{
+        		h = this.y + this.height - aRect.y;        		
+        	}
+        }
+		return new Rect(x, y, w, h);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/RuntimeUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,23 @@
+package com.nokia.mj.impl.uitestutils;
+
+import org.eclipse.ercp.swt.midp.UIThreadSupport;
+
+public class RuntimeUtils {
+
+    public static final int S60 = 1;
+    public static final int X11 = 2;
+    
+    public static int getPlatform() {
+        return S60;
+    }
+
+    public synchronized static final int startUI(
+            final Runnable callback) {
+        UIThreadSupport.startInUIThread(new Runnable() {
+            public void run() {
+                callback.run();
+            }
+        });
+        return 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/S60Utils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,112 @@
+package com.nokia.mj.impl.uitestutils;
+
+
+final class S60Utils {
+
+	static {
+		// Should use vmport, this is CDC/J2SE API
+		//System.loadLibrary("s60uitestutils");
+		org.eclipse.swt.internal.Library.loadLibrary("s60uitestutils");
+	}
+
+    /**
+     * Constant for key press event. 
+     */
+    static final int PRESS = 0;
+    
+    /**
+     * Constant for key release event. 
+     */
+    static final int RELEASE = 1;
+    
+    /**
+     * Button constants. 
+     */
+    static final int BUTTON1 = 1;
+    static final int BUTTON2 = 2;
+    static final int BUTTON3 = 3;
+
+
+	/**
+	 * Sends a key event to the window which has the keyboard focus. Get the keycode of 
+	 * the desired symbol using XKeysymToKeycode and pass that here. Or if the desired 
+	 * keycode is known it can be passed directly. 
+	 * @param keycode The keycode of the key to send. 
+	 * @param modifiers The modifiers to send. 
+     * @param pressOrRelease Either PRESS or RELEASE must be passed here.  
+	 * @return 0 if successful, otherwise a non-zero error code
+     * @see XlibKeys
+	 */
+    static final native int S60SendKeyToFocusWindow(int keycode, int modifiers, int pressOrRelease);
+	
+	/**
+	 * Returns the keycode of the given symbol (keysym) in the currently active
+	 * keyboard layout. Keysym constants are defined in XlibKeys. 
+	 * @param keysym
+	 * @return The keycode or zero in case of an error
+	 * @see XlibKeys
+	 */
+	static final native int S60KeysymToKeycode(int keysym);
+
+    /**
+     * Sends a pointer press or release event. 
+     * @param x X-coordinate to send, relative to X root window (i.e. screen). 
+     * @param y Y-coordinate to send, relative to X root window (i.e. screen). 
+     * @param modifiers The modifiers to send. 
+     * @param button The button that's pressed or released. 
+     * @param pressOrRelease Either PRESS or RELEASE must be passed here.  
+     * @return 0 if successful, otherwise a non-zero error code
+     */
+    static final native int S60SendPointerEvent(int x, int y, int button, int pressOrRelease);
+
+    /**
+     * Sends a pointer move event. 
+     * @param x X-coordinate to send, relative to X root window (i.e. screen). 
+     * @param y Y-coordinate to send, relative to X root window (i.e. screen).
+     * @param button The button that's held pressed during the move. 
+     * @return 0 if successful, otherwise a non-zero error code
+     */
+    static final native int S60SendPointerMoveEvent(int x, int y, int button);
+
+    /**
+     * Disables the screensaver. 
+     */
+    static final native void S60DisableScreensaver();
+
+    /**
+     * Sets the doubleclick interval. Set to 0 to disable doubleclicks. 
+     * @param interval New doubleclick interval
+     */
+    static final native void S60SetDoubleclickInterval(int interval);
+
+	/*static final native int _create(int toolkitHandle, UITestUtils testUtils); 
+	static final native void _dispose(int toolkitHandle, UITestUtils testUtils, int testUtilsHandle);
+
+	static final native void _startTest(int toolkitHandle, int handle, String screenShotDir); 	
+	static final native void _endTest(int toolkitHandle, int handle, boolean passed, String msg);
+
+	static final native void _log(int toolkitHandle, int handle, String msg); 	
+	static final native void _logResult(int toolkitHandle, int handle, boolean passed, String msgPassed, String msgFailed);
+
+	static final native void _triggerKeyPressEvent(int toolkitHandle, int handle, int keyCode, int scanCode); 	
+	static final native int _triggerKeyRepeatEvents(int toolkitHandle, int handle, int keyCode, int scanCode, int count); 	
+	static final native int _triggerMediaKeyRepeatEvents(int toolkitHandle, int handle, int keyCode, int scanCode, int pressedTimeInMillis); 	
+	
+	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName);
+	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName, 
+	                                      int areaToCompare, int displayableType);
+	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName, 
+	                                      int topLeftX, int topLeftY, int bottomRightX, int bottomRightY);
+	
+	static final native void _triggerPointerDownEvent(int toolkitHandle, int handle, int x, int y); 	
+	static final native void _triggerPointerUpEvent(int toolkitHandle, int handle, int x, int y); 	
+	static final native void _triggerPointerDragEvent(int toolkitHandle, int handle, int x, int y); 	
+
+	static final native void _changeQwertyInput(int toolkitHandle, int handle, boolean aOn); 	
+	static final native int _switchResolution(int toolkitHandle, int handle, int numTimes, int delayMillis); 
+
+    static final native void _getBoundsOf(int toolkitHandle, int handle, int type, int[] coordinates);	
+    
+    static final native void _allowScreenSaver(int toolkitHandle, int handle, int allow);*/
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/javasrc/com/nokia/mj/impl/uitestutils/UITestUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,187 @@
+// UITestUtils.java // // //
+
+package com.nokia.mj.impl.uitestutils;
+
+import java.lang.String;
+import org.eclipse.swt.internal.qt.OS;
+
+public class UITestUtils {
+
+    private static final int RES_CHANGE_DEFAULT_DELAY = 5000;
+
+    public UITestUtils() {
+        // Always disable screensaver when running tests.
+        S60Utils.S60DisableScreensaver(); 	
+    }
+
+    /** Init test and s. shot directory, make sure you use slashes to start and
+    end it dir name */
+    public void startTest(String screenShotDir) {
+    }
+
+    /** Ends the test, prints a summary, etc */
+    public void endTest(boolean passed, String msg) {
+    }
+
+    /** Log a message */
+    public void log(String msg) {
+    }
+
+    /** Logs one of the two messages and either PASSED or FAILED according to
+    value of    passed parameter */
+    public void log(boolean passed, String msgPassed, String msgFailed) {
+    }
+
+    /** Sends a key event to the midlet using the specified key and scan code */
+    public void triggerKeyPressEvent(Key key) {
+        int keycode = key.scanCode;
+        int modifiers = key.modifiers;
+        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.PRESS) != 0)
+            throw new RuntimeException("Emulating key press failed");
+        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.RELEASE) != 0)
+            throw new RuntimeException("Emulating key release failed");
+    }
+
+    /** Sends a key down event to the application using the specified key */
+    public void triggerKeyDownEvent(Key key) {
+        int keycode = key.scanCode;
+        int modifiers = key.modifiers;
+        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.PRESS) != 0)
+            throw new RuntimeException("Emulating key press failed");
+    }
+
+    /** Sends a key up event to the application using the specified key */
+    public void triggerKeyUpEvent(Key key) {
+        int keycode = key.scanCode;
+        int modifiers = key.modifiers;
+        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.RELEASE) != 0)
+            throw new RuntimeException("Emulating key release failed");
+    }
+
+
+    /** Triggers key repeat events using the specified key and scan code.
+        Calling this method will trigger the following events to Canvas/CustomItem:
+            1. keyPressed event
+            2. keyRepeated events, the number of events is indicated by count parameter
+            3. keyReleased events
+
+        NOTE 1: This method returns right after triggering the keyPressed event. There should be enough delay
+        after calling this so that all repeat events can be handled before the test result is checked.
+        The delay before triggering first repeat event is 0.6 seconds and between sequential repeat
+        events 0.2 seconds.
+
+        NOTE 2: For triggering media key repeat events triggerMediaKeyRepeatEvents()
+        must be used.
+    */
+    public int triggerKeyRepeatEvents(Key key, int count) {
+        return 0;
+    }
+
+    /** This method must be used when triggering repeat events for media keys.
+        pressedTimeInMillis defines how long a key is kept pressed down.
+
+        NOTE 1: This method returns right after triggering the keyDown event. There should be enough delay
+         (> pressedTimeInMillis) after calling this so that all repeat events and key up can be handled before
+         the test result is checked.
+    */
+    public int triggerMediaKeyRepeatEvents(Key key, int pressedTimeInMillis) {
+        return 0;
+    }
+
+    /** Sends pointer down event to the midlet */
+    public void triggerPointerDownEvent(int x, int y) {
+        // Setting double click interval to 0 disables double clicks, making it possible
+        // to click around in the test cases quickly without causing unwanted double click
+        // events 
+        OS.QApplication_setDoubleClickInterval(0); 	
+        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON1, S60Utils.PRESS) != 0)
+            throw new RuntimeException("Emulating pointer down failed");
+    }
+
+    /** Sends pointer up event to the midlet */
+    public void triggerPointerUpEvent(int x, int y) {
+        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON1, S60Utils.RELEASE) != 0)
+            throw new RuntimeException("Emulating pointer up failed");
+    }
+
+    /** Sends pointer drag event to the midlet */
+    public void triggerPointerDragEvent(int x, int y) {
+        if(S60Utils.S60SendPointerMoveEvent(x, y, S60Utils.BUTTON1) != 0 ) {
+            throw new RuntimeException("Emulating pointer move failed");
+        }
+    }
+
+    /**
+     * Sends a pointer event to open up a context menu. E.g. long-press, right-click
+     * or such depending on the platform.
+     */
+    public void triggerContextPointerEvent(int x, int y) {
+        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON3, S60Utils.PRESS) != 0)
+            throw new RuntimeException("Emulating pointer down failed");
+        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON3, S60Utils.RELEASE) != 0)
+            throw new RuntimeException("Emulating pointer up failed");
+    }
+
+    /** Takes a screen shot and saves it into a .png file. Returns true if
+    reference screen shot exists and is identical to the new screen shot*/
+    public boolean getScreenShot(String screenShotName) {
+        return true;
+    }
+
+    /** Takes a screen shot and saves it into a .png file. Returns true if
+    reference screen shot exists and compared area is identical in the reference and new screen shot.
+    areaToCompare and displayableType define the area that is compared. See also SpedeRunner.java.*/
+    public boolean getScreenShot(String screenShotName, int areaToCompare, int displayableType) {
+        return true;
+    }
+
+    /** Takes a screen shot and saves it into a .png file. Returns true if
+    reference screen shot exists and compared area is identical in the reference and new screen shot.
+    Four integer parameters define the rectangle area for screen shot comparison. */
+    public boolean getScreenShot(String screenShotName, int topLeftX, int topLeftY,
+                                                        int bottomRightX, int bottomRightY) {
+        return true;
+    }
+
+    public void dispose() {
+    }
+
+    /** Enable or disable QWERTY input */
+    public void changeQwertyInput(boolean aOn) {
+    }
+
+    public int switchResolution() {
+        return switchResolution(1);
+    }
+
+    /** Change the screen resolution - works only on the emulator */
+    public int switchResolution(int numTimes) {
+        return 0;
+    }
+
+    /** Change the screen resolution - works only on the emulator */
+    public int switchResolutionWithDelay(int delayMillis) {
+        return 0;
+    }
+
+    /**
+     * Get the top left and bottom right coordinates of main pane, form rect, etc.
+     *
+     * @param coordinates   The coordinates are returned in this array
+     * @param type          Defines for which area the coordinates are fetched
+     */
+    public void getBoundsOf(int type, int[] coordinates) {
+    }
+
+    /**
+     * Disable screen saver
+     */
+    public void disableScreenSaver() {
+    }
+
+    /**
+     * Enable screen saver
+     */
+    public void enableScreenSaver() {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/src/eswtuitestutils.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,15 @@
+#*******************************************************************************
+# Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     Nokia Corporation - initial implementation
+#*******************************************************************************
+
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+
+SOURCES += s60utils.cpp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/eswtuitestutils/src/s60utils.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,146 @@
+#include <e32debug.h>
+#include <e32base.h>
+#include <e32event.h>
+#include <eikenv.h>
+#include <coemain.h>
+#include <e32property.h>
+//#include <screensaverinternalpskeys.h>
+#include <e32keys.h>
+
+//#include <QApplication>
+
+#include "com_nokia_mj_impl_uitestutils_S60Utils.h"
+// Note following modifilers are from X11 instead of Symbian
+static const TInt Shift                           = (1<<0);
+static const TInt CapsLock                        = (1<<1);
+static const TInt Control                         = (1<<2);
+static const TInt Alt                             = (1<<3);
+static const TInt NumLock                         = (1<<4);
+static const TInt ScrllLock                       = (1<<4);
+static const TInt AltGr                           = (1<<7);
+
+
+static TInt symbianKeyCode(TInt aX11Modifier)
+    {
+    TInt keyCode(0);
+    if( (aX11Modifier & Shift) > 0 )
+        {
+        keyCode = EStdKeyLeftShift;
+        }
+    else if( (aX11Modifier & CapsLock) > 0 )
+        {
+        keyCode = EStdKeyCapsLock;
+        }
+    else if( (aX11Modifier & Control) > 0 )
+        {
+        keyCode = EStdKeyLeftCtrl;
+        }
+    else if( (aX11Modifier & Alt) > 0 )
+        {
+        keyCode = EStdKeyLeftAlt;
+        }
+    else if( (aX11Modifier & NumLock) > 0 )
+        {
+        keyCode = EStdKeyNumLock;
+        }
+    else if( (aX11Modifier & ScrllLock) > 0 )
+        {
+        keyCode = EStdKeyScrollLock;
+        }
+    else if( (aX11Modifier & AltGr) > 0 )
+        {
+        keyCode = EStdKeyRightAlt;
+        }
+    return keyCode;
+    }
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendKeyToFocusWindow
+  (JNIEnv *, jclass, jint aKeyCode, jint aModifier, jint aPressOrRelease)
+    {
+    RDebug::Print(_L("S60UITestUtils : S60SendKeyToFocusWindow, keycode=%d"), aKeyCode);
+    
+    User::ResetInactivityTime();// Reset user inactivity timers
+
+    if(aModifier > 0 && aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS)
+        {
+        TRawEvent mevent;
+        TInt keyCode = symbianKeyCode( aModifier);
+        mevent.Set(TRawEvent::EKeyDown, keyCode);
+        UserSvr::AddEvent(mevent);
+        User::After(100000);
+        }
+    
+	TRawEvent event;
+	
+	if (aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS)
+	    {
+	    event.Set(TRawEvent::EKeyDown, aKeyCode);
+	    }
+	else
+	    {
+	    event.Set(TRawEvent::EKeyUp, aKeyCode);
+	    }
+	
+	UserSvr::AddEvent(event);
+    User::After(100000);
+    if(aModifier > 0 && aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_RELEASE)
+        {
+        TRawEvent mevent;
+        TInt keyCode = symbianKeyCode(aModifier);
+        mevent.Set(TRawEvent::EKeyUp, keyCode);
+        UserSvr::AddEvent(mevent);
+        User::After(100000);
+        }
+
+	return 0;
+    }
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60KeysymToKeycode
+  (JNIEnv *, jclass, jint)
+    {
+    return 0;
+    }
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendPointerEvent
+  (JNIEnv *, jclass, jint aX, jint aY, jint /*aButton*/, jint aPressOrRelease)
+    {
+    User::ResetInactivityTime();// Reset user inactivity timers
+	
+	TRawEvent event;
+	
+	if (aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS) {
+	    event.Set(TRawEvent::EButton1Down, aX, aY);
+	} else {
+	    event.Set(TRawEvent::EButton1Up, aX, aY);
+    }   
+	UserSvr::AddEvent(event);
+	return 0;
+    }
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendPointerMoveEvent
+  (JNIEnv *, jclass, jint aX, jint aY, jint)
+    {
+    User::ResetInactivityTime();// Reset user inactivity timers
+	TRawEvent event;
+	event.Set(TRawEvent::EPointerMove, aX, aY);
+	UserSvr::AddEvent(event);
+    return 0;
+    }
+
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60DisableScreensaver
+  (JNIEnv *, jclass)
+    {
+    //RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 1 );
+    }
+    
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SetDoubleclickInterval
+  (JNIEnv *, jclass, jint aInterval)
+    {
+    // Commented out for now. This can be taken into use once Qt doesn't need WSD to be allowed
+    /*QApplication* app = static_cast<QApplication*>(QCoreApplication::instance());
+    if ( app )
+        {
+        app->setDoubleClickInterval( aInterval );
+        }*/
+    }
+    
\ No newline at end of file
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/.project	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.qt.linux.arm.se</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-</projectDescription>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/Makefile	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-# Scratchbox paths. Not the same as Linux host paths!
-LIB_PATH:=/home/pmotresc/org.eclipse.swt/Eclipse_SWT_PI/qt/library
-LIB_PATH_GFX:=/home/pmotresc/org.eclipse.swt/Eclipse_SWT_PI/qt/graphics_library
-
-debug:
-	cd $(LIB_PATH) && qmake -spec linux-g++ -unix CONFIG+=debug DESTDIR=debug OBJECTS_DIR=debug/linux-g++/build -o Makefile.maemo.debug swt.pro
-	cd $(LIB_PATH) && make -f Makefile.maemo.debug
-	cd $(LIB_PATH_GFX) && qmake -spec linux-g++ -unix CONFIG+=debug DESTDIR=debug OBJECTS_DIR=debug/linux-g++/build -o Makefile.maemo.debug graphics.pro
-	cd $(LIB_PATH_GFX) && make -f Makefile.maemo.debug
-	echo Done building debug
-
-release:
-	cd $(LIB_PATH) && qmake -spec linux-g++ -unix CONFIG+=release DESTDIR=release OBJECTS_DIR=release/linux-g++/build -o Makefile.maemo.release swt.pro
-	cd $(LIB_PATH) && make -f Makefile.maemo.release
-	cd $(LIB_PATH_GFX) && qmake -spec linux-g++ -unix CONFIG+=release DESTDIR=release OBJECTS_DIR=release/linux-g++/build -o Makefile.maemo.release graphics.pro
-	cd $(LIB_PATH_GFX) && make -f Makefile.maemo.release
-	echo Done building release
-
-clean:
-	-cd $(LIB_PATH)
-	-make -f Makefile.maemo.debug clean
-	-rm -f $(LIB_PATH)/Makefile.maemo.debug
-	-rm -f -r $(LIB_PATH)/debug
-	-cd $(LIB_PATH_GFX)
-	-make -f Makefile.maemo.debug clean
-	-rm -f $(LIB_PATH_GFX)/Makefile.maemo.debug
-	-rm -f -r $(LIB_PATH_GFX)/debug
-	-@echo Done cleaning debug
-	-cd $(LIB_PATH)
-	-make -f Makefile.maemo.release clean
-	-rm -f $(LIB_PATH)/Makefile.maemo.release
-	-rm -f -r $(LIB_PATH)/release
-	-cd $(LIB_PATH_GFX)
-	-make -f Makefile.maemo.release clean
-	-rm -f $(LIB_PATH_GFX)/Makefile.maemo.release
-	-rm -f -r $(LIB_PATH_GFX)/release
-	-@echo Done cleaning release
-
-all: debug, release
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/build.properties	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-custom = true
-ws = qt
-os = linux
-arch=arm
-java.edition= se
-fragment=org.eclipse.swt.qt.linux.arm.se
-version.suffix=3.5.0
-plugin.dir=../org.eclipse.swt
-tests.junit.dir=../eclipsetests
-tests.mt.dir=../nokiatests
-tests.utils.dir=../s60utils
-javac.source=1.3
-javac.target=1.3
-javac.debug=false
-lib.filename = libeswtqt.so
-lib.makefile = Makefile.linux
-lib.spec=linux-g++
-jar.filename=eswt-qt.jar
-generated.native.dir = generated
\ No newline at end of file
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.arm.se/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,333 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.swt.qt.linux.arm" default="build" basedir=".">
-
-    <target name="help">
-        <echo level="info">
-Usage: ant [one of the following:]
-build              : Build debug + release
-build.jar          : Build all jars
-build.debug        : Build all debug binaries
-build.release      : Build all release binaries
-build.lib          : Build all native libraries
-build.lib.debug    : Build debug native libraries
-build.lib.release  : Build release native libraries
-build.tests        : Build JUnit and MT tests
-clean              : Clean everything
-clean.jar          : Clean all jars
-clean.lib          : Clean native libraries and object files
-clean.lib.debug    : Clean debug native libraries and object files
-clean.lib.release  : Clean release native libraries and object files
-export             : Export everything
-export.jar         : Export Java classes packed as jar
-export.debug       : Export all debug binaries
-export.release     : Export all release binaries
-export.lib         : Export native libraries
-export.lib.debug   : Export debug native libraries
-export.lib.release : Export release native libraries
-run.tests		   : Run JUnit and MT tests
-        </echo>
-    </target>
-
-    <target name="init" depends="init.env, init.export.path">
-        <property file="./build.properties"></property>
-        <property name="full.name" value="${fragment}_${version.suffix}"/>
-        <property name="temp.dir" value="${basedir}/temp"/>
-        <property name="plugin.destination" value="${basedir}"/>
-        <property name="build.result.dir" value="${basedir}"/>
-        <property name="download.destination" value="${basedir}"/>
-        <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
-        <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
-        <mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
-   </target>
-
-    <target name="init.env">
-        <property environment = "env"/>
-        <fail message="USERNAME system variable not defined">
-            <condition>
-                <not>
-                    <isset property="env.USERNAME"/>
-                </not>
-            </condition>
-        </fail>
-    </target>
-
-    <target name="init.export.path" if="env.JAVA_BIN_ROOT">
-        <property name="export.jar.debug.path" value = "${env.JAVA_BIN_ROOT}/jsr/classes"/>
-        <property name="export.jar.release.path" value = "${env.JAVA_BIN_ROOT}/jsr/classes"/>
-        <property name="export.lib.debug.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
-        <property name="export.lib.release.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
-    </target>
-	
-    <target name="download" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}/swtdownload/"/>
-        <antcall target="build.jar"/>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${basedir}/release/" 
-        	update="true" includes="eswt*.dll,libeswt*.so"/>
-        <copy file="${build.result.dir}/${jar.filename}" todir="${temp.dir}/swtdownload"/>
-        <antcall target="src.zip"/>
-        <copy file="${build.result.dir}/src.zip" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.project" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.classpath" todir="${temp.dir}/swtdownload"/>
-        <copy todir="${temp.dir}/swtdownload">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-        <zip zipfile="${download.destination}/eswt-${ws}-${os}-${arch}-${jsdk}.zip">
-            <zipfileset dir="${temp.dir}/swtdownload/"/>
-        </zip>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="src.zip" depends="init">
-        <mkdir dir="${build.result.dir}/"/>
-        <zip zipfile="${build.result.dir}/src.zip">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Nokia SWT/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-            <fileset dir="${basedir}" includes="about.html,about_files/" excludes=""/>
-        </zip>
-    </target>
-	
-    <target name="gather.sources" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy file="${build.result.dir}/src.zip" todir="${destination.temp.folder}/${full.name}/"/>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-    </target>
-
-    <target name="gather.individual.sources" depends="init">
-        <copy todir="${destination.temp.folder}/" failonerror="true" overwrite="true">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Nokia SWT/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-        </copy>
-    </target>
-
-    <target name="gather.bin.parts" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy todir="${destination.temp.folder}/${full.name}" failonerror="true">
-            <fileset dir="${plugin.dir}/bin" includes="*"/>
-        </copy>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="eswt*.dll,libeswt*.so,META-INF/"/>
-        </copy>
-        <chmod perm="755" dir="${destination.temp.folder}/${full.name}" includes="eswt*.dll,libeswt*.so" />
-        <eclipse.versionReplacer path="${destination.temp.folder}/${full.name}" version="${version.suffix}"/>
-    </target>
-	
-    <target name="jar.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <jar jarfile="${plugin.destination}/${full.name}.jar" 
-        	basedir="${temp.dir}/${full.name}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-    	
-    <target name="zip.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="src.zip"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <antcall target="gather.sources">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <zip zipfile="${plugin.destination}/${full.name}.zip" 
-        	basedir="${temp.dir}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="build">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-	
-    <target name="build.jar" depends="init" description="Produces eswt-qt.jar">
-    	<mkdir dir="${plugin.dir}/bin"/>
-        <javac destdir="${plugin.dir}/bin" source="${javac.source}" target="${javac.target}"
-            debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-            <src path="${plugin.dir}/Eclipse SWT/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse SWT/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
-            <src path="${plugin.dir}/Nokia SWT/extensions/"/>
-        </javac>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${plugin.dir}/bin"/>
-    </target>
-
-    <target name="build.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="build.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="build.lib">
-        <antcall target="build.lib.debug"/>
-        <antcall target="build.lib.release"/>
-    </target>
-
-    <target name="build.lib.debug" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.release" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.common" depends="init" description="params: config">
-        <javah outputfile="${lib.path}/${generated.native.dir}/os.h" classpath="${plugin.dir}/bin" verbose="yes">
-            <class name="org.eclipse.swt.internal.qt.OS"/>
-            <class name="org.eclipse.swt.internal.qt.graphics.OS"/>
-            <class name="org.eclipse.swt.internal.extension.OS"/>
-        </javah>
-        <antcall target="make">
-            <param name="make.target" value="${build.lib.common.config}"/>
-        </antcall>
-        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
-        <copy file="${lib.path}/${build.lib.common.config}/${lib.filename}" 
-            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="clean">
-        <antcall target="clean.jar"/>
-        <antcall target="clean.lib"/>
-    </target>
-	
-    <target name="clean.jar" depends="init" description="">
-        <delete dir="${plugin.dir}/bin"/>
-        <delete file="${build.result.dir}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.debug.path}/${jar.filename}" verbose="true"/>
-    	<delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
-    </target>
-
-    <target name="clean.lib">
-        <antcall target="clean.lib.debug"/>
-        <antcall target="clean.lib.release"/>
-    </target>
-
-    <target name="clean.lib.debug" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.release" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.common" depends="init" description="params: config">
-        <antcall target="make">
-            <param name="make.target" value="clean"/>
-            <param name="fail" value="false"/>
-        </antcall>
-        <delete file="${lib.path}/${lib.makefile}.${clean.lib.common.config}" verbose="true"/>
-        <delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-    	<delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
-        <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
-        <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${clean.lib.common.config}" arg2="debug"/>
-        </condition>
-        <delete file="${clean.lib.common.export.path}/${lib.filename}" verbose="true"/>
-    </target>
-
-    <target name="export">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-
-    <target name="export.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="export.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-	<target name="export.jar">
-		<antcall target="export.jar.debug"/>
-		<antcall target="export.jar.release"/>
-	</target>
-
-	<target name="export.jar.debug" depends="build.jar" if="export.jar.debug.path">
-		<mkdir dir="${export.jar.debug.path}"/>
-		<copy file="${build.result.dir}/${jar.filename}" 
-            tofile="${export.jar.debug.path}/${jar.filename}" overwrite="true" verbose="true"/>
-	</target>
-
-	<target name="export.jar.release" depends="build.jar" if="export.jar.release.path">
-		<mkdir dir="${export.jar.release.path}"/>
-		<copy file="${build.result.dir}/${jar.filename}"
-            tofile="${export.jar.release.path}/${jar.filename}" overwrite="true" verbose="true"/>
-	</target>
-
-    <target name="export.lib">
-        <antcall target="export.lib.debug"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="export.lib.debug" depends="build.lib.debug" if="export.lib.debug.path">
-        <mkdir dir="${export.lib.debug.path}"/>
-        <copy file="${lib.path}/debug/${lib.filename}" 
-            tofile="${export.lib.debug.path}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="export.lib.release" depends="build.lib.release" if="export.lib.release.path">
-        <mkdir dir="${export.lib.release.path}"/>
-        <copy file="${lib.path}/release/${lib.filename}"
-            tofile="${export.lib.release.path}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="make" description="params: target">
-        <exec executable="${scratchbox.dir}/login" failonerror="true">
-            <arg line="-d ${fragment.scratchbox.dir}"/>
-            <arg line="make --always-make ${make.target}"/>
-        </exec>
-    </target>
-
-
-</project>
-
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.properties	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.properties	Fri Jun 11 13:33:44 2010 +0300
@@ -23,7 +23,9 @@
 javac.target=1.3
 javac.debug=false
 lib.filename = libeswtqt.so
+lib.filename.webkit = libeswtqtwebkit.so
 lib.makefile = Makefile.linux
 lib.spec=linux-g++
 jar.filename=eswtqt.jar
-generated.native.dir = generated
\ No newline at end of file
+generated.native.dir = generated/eswtqt
+generated.native.dir.webkit = generated/eswtqtwebkit
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.xml	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.me/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -24,7 +24,7 @@
 export.lib         : Export native libraries
 export.lib.debug   : Export debug native libraries
 export.lib.release : Export release native libraries
-run.tests		   : Run JUnit and MT tests
+run.tests          : Run JUnit and MT tests
         </echo>
     </target>
 
@@ -38,8 +38,8 @@
         <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
         <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
         <property name="odc.location" value = "${plugin.dir}/Eclipse_SWT_PI/s60"/>
-    	<mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
+        <mkdir dir="${lib.path}/${generated.native.dir}"/>
+        <mkdir dir="${lib.path}/${generated.native.dir.webkit}"/>
    </target>
 
     <target name="init.env">
@@ -66,13 +66,13 @@
         <property name="export.lib.debug.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
         <property name="export.lib.release.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
     </target>
-	
+
     <target name="download" depends="init">
         <delete dir="${temp.dir}"/>
         <mkdir dir="${temp.dir}/swtdownload/"/>
         <antcall target="build.jar"/>
         <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${basedir}/release/" 
-        	update="true" includes="eswt*.dll,libeswt*.so"/>
+        update="true" includes="eswt*.dll,libeswt*.so"/>
         <copy file="${build.result.dir}/${jar.filename}" todir="${temp.dir}/swtdownload"/>
         <antcall target="src.zip"/>
         <copy file="${build.result.dir}/src.zip" todir="${temp.dir}/swtdownload"/>
@@ -100,6 +100,8 @@
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/linux/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/webkit/" includes="**/*.java" excludes=""/>
         	<fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
@@ -125,6 +127,8 @@
             <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/linux/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/webkit/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
             <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
@@ -189,11 +193,11 @@
             <src path="${plugin.dir}/Eclipse SWT Browser/qt/"/>
             <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
             <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
-            <!-- Use S60 CommandPresentationStrategy also for Linux J2ME target -->
-            <src path="${plugin.dir}/Eclipse_SWT_PI/s60/"/>
             <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
+            <src path="${plugin.dir}/Eclipse_SWT_PI/linux/"/>
+            <src path="${plugin.dir}/Eclipse_SWT_PI/webkit/"/>
             <src path="${plugin.dir}/../com.nokia.swt.extensions/extensions/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp_common/"/>
+            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp/"/>
             <classpath>
                 <pathelement location="./java_signature_test.jar"/>
                 <pathelement location="${plugin.dir}/extra_jars/cdc-compilation-support.jar"/>
@@ -221,12 +225,18 @@
         <antcall target="build.lib.common">
             <param name="build.lib.common.config" value="debug"/>
         </antcall>
+        <antcall target="build.lib.common.webkit">
+            <param name="build.lib.common.config" value="debug"/>
+        </antcall>
     </target>
 
     <target name="build.lib.release" depends="init">
         <antcall target="build.lib.common">
             <param name="build.lib.common.config" value="release"/>
         </antcall>
+        <antcall target="build.lib.common.webkit">
+            <param name="build.lib.common.config" value="release"/>
+        </antcall>
     </target>
 
     <target name="build.lib.common" depends="init" description="params: config">
@@ -251,16 +261,36 @@
             tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
     </target>
 
+    <target name="build.lib.common.webkit" depends="init" description="params: config">
+        <javah destdir="${lib.path}/${generated.native.dir.webkit}/" classpath="${plugin.dir}/bin" verbose="yes">
+            <class name="org.eclipse.swt.internal.qt.webkit.OS_webkit"/>
+        </javah>
+        <antcall target="qmake">
+            <param name="qmake.dir" value="${lib.path}/webkit"/>
+            <param name="qmake.target" value="${build.lib.common.config}"/>
+            <param name="qmake.spec" value="${lib.spec}"/>
+            <param name="qmake.file" value="${lib.makefile}.${build.lib.common.config}"/>
+        </antcall>
+        <antcall target="make">
+            <param name="make.dir" value="${lib.path}/webkit"/>
+            <param name="make.file" value="${lib.makefile}.${build.lib.common.config}"/>
+            <param name="make.target" value="all"/>
+        </antcall>
+        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
+        <copy file="${lib.path}/webkit/${build.lib.common.config}/${lib.filename.webkit}" 
+            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename.webkit}" overwrite="true" verbose="true"/>
+    </target>
+
     <target name="clean">
         <antcall target="clean.jar"/>
         <antcall target="clean.lib"/>
     </target>
-	
+        
     <target name="clean.jar" depends="init" description="">
         <delete dir="${plugin.dir}/bin"/>
         <delete file="${build.result.dir}/${jar.filename}" verbose="true"/>
         <delete file="${export.jar.debug.path}/${jar.filename}" verbose="true"/>
-    	<delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
+        <delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
     </target>
 
     <target name="clean.lib">
@@ -289,7 +319,8 @@
         </antcall>
         <delete file="${lib.path}/${lib.makefile}.${clean.lib.common.config}" verbose="true"/>
         <delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-    	<delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
+        <delete dir="${lib.path}/${generated.native.dir.webkit}" verbose="true"/>
+        <delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
         <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
         <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
             <equals arg1="${clean.lib.common.config}" arg2="debug"/>
@@ -364,20 +395,21 @@
             <arg value="OBJECTS_DIR=${qmake.target}/${qmake.spec}/build"/>
         </exec>
     </target>
-	
+
     <target name="build.tests" depends="init,build.release">
-    	<mkdir dir="${tests.utils.dir}/java/bin"/>
-    	<mkdir dir="${tests.junit.dir}/bin"/>
-    	<mkdir dir="${tests.mt.dir}/bin"/>
+        <mkdir dir="${tests.utils.dir}/java/bin"/>
+        <mkdir dir="${tests.junit.dir}/bin"/>
+        <mkdir dir="${tests.mt.dir}/bin"/>
+        
         <javac destdir="${tests.utils.dir}/java/bin" source="${javac.source}" target="${javac.target}" 
-        	debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-        	<src path="${tests.utils.dir}/java/src/"/>
-	        <classpath>
-            	<pathelement path="${plugin.dir}/bin/"/>
-	        </classpath>
+                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
+                <src path="${tests.utils.dir}/java/src/"/>
+            <classpath>
+                <pathelement path="${plugin.dir}/bin/"/>
+            </classpath>
         </javac>
         
-		<javah outputfile="${tests.utils.dir}/native/os.h" classpath="${tests.utils.dir}/java/bin" verbose="yes">
+        <javah outputfile="${tests.utils.dir}/native/os.h" classpath="${tests.utils.dir}/java/bin" verbose="yes">
             <class name="com.nokia.mj.impl.uitestutils.XlibUtils"/>
         </javah>
         <antcall target="qmake">
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.properties	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.properties	Fri Jun 11 13:33:44 2010 +0300
@@ -24,7 +24,9 @@
 javac.target=1.3
 javac.debug=false
 lib.filename = libeswtqt.so
+lib.filename.webkit = libeswtqtwebkit.so
 lib.makefile = Makefile.linux
 lib.spec=linux-g++
-jar.filename=eswt-qt.jar
-generated.native.dir = generated
\ No newline at end of file
+jar.filename=eswtqt.jar
+generated.native.dir = generated/eswtqt
+generated.native.dir.webkit = generated/eswtqtwebkit
--- a/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.xml	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt.qt.linux.x86.se/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -38,7 +38,7 @@
         <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
         <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
         <mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
+        <mkdir dir="${lib.path}/${generated.native.dir.webkit}"/>
    </target>
 
     <target name="init.env">
@@ -51,7 +51,7 @@
         <property name="export.lib.debug.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
         <property name="export.lib.release.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
     </target>
-        
+
     <target name="download" depends="init">
         <delete dir="${temp.dir}"/>
         <mkdir dir="${temp.dir}/swtdownload/"/>
@@ -85,6 +85,8 @@
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/linux/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/webkit/" includes="**/*.java" excludes=""/>
         	<fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
@@ -110,6 +112,8 @@
             <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/linux/" includes="**/*.java" excludes=""/>
+            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/webkit/" includes="**/*.java" excludes=""/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
             <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
             <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
@@ -175,8 +179,10 @@
             <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
             <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
             <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
+            <src path="${plugin.dir}/Eclipse_SWT_PI/linux/"/>
+            <src path="${plugin.dir}/Eclipse_SWT_PI/webkit/"/>
             <src path="${plugin.dir}/../com.nokia.swt.extensions/extensions/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp_common/"/>
+            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp/"/>
         </javac>
         <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${plugin.dir}/bin"/>
     </target>
@@ -200,12 +206,18 @@
         <antcall target="build.lib.common">
             <param name="build.lib.common.config" value="debug"/>
         </antcall>
+        <antcall target="build.lib.common.webkit">
+            <param name="build.lib.common.config" value="debug"/>
+        </antcall>
     </target>
 
     <target name="build.lib.release" depends="init">
         <antcall target="build.lib.common">
             <param name="build.lib.common.config" value="release"/>
         </antcall>
+        <antcall target="build.lib.common.webkit">
+            <param name="build.lib.common.config" value="release"/>
+        </antcall>
     </target>
 
     <target name="build.lib.common" depends="init" description="params: config">
@@ -230,6 +242,26 @@
             tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
     </target>
 
+    <target name="build.lib.common.webkit" depends="init" description="params: config">
+        <javah destdir="${lib.path}/${generated.native.dir.webkit}/" classpath="${plugin.dir}/bin" verbose="yes">
+            <class name="org.eclipse.swt.internal.qt.webkit.OS_webkit"/>
+        </javah>
+        <antcall target="qmake">
+            <param name="qmake.dir" value="${lib.path}/webkit"/>
+            <param name="qmake.target" value="${build.lib.common.config}"/>
+            <param name="qmake.spec" value="${lib.spec}"/>
+            <param name="qmake.file" value="${lib.makefile}.${build.lib.common.config}"/>
+        </antcall>
+        <antcall target="make">
+            <param name="make.dir" value="${lib.path}/webkit"/>
+            <param name="make.file" value="${lib.makefile}.${build.lib.common.config}"/>
+            <param name="make.target" value="all"/>
+        </antcall>
+        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
+        <copy file="${lib.path}/webkit/${build.lib.common.config}/${lib.filename.webkit}" 
+            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename.webkit}" overwrite="true" verbose="true"/>
+    </target>
+
     <target name="clean">
         <antcall target="clean.jar"/>
         <antcall target="clean.lib"/>
@@ -268,7 +300,8 @@
         </antcall>
         <delete file="${lib.path}/${lib.makefile}.${clean.lib.common.config}" verbose="true"/>
         <delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-    	<delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
+        <delete dir="${lib.path}/${generated.native.dir.webkit}" verbose="true"/>
+        <delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
         <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
         <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
             <equals arg1="${clean.lib.common.config}" arg2="debug"/>
@@ -353,6 +386,7 @@
                 <pathelement path="${plugin.dir}/bin/"/>
             </classpath>
         </javac>
+        
         <javah outputfile="${tests.utils.dir}/native/os.h" classpath="${tests.utils.dir}/java/bin" verbose="yes">
             <class name="com.nokia.mj.impl.uitestutils.XlibUtils"/>
         </javah>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/.project	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.qt.s60.armv5</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-</projectDescription>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/build.properties	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-custom = true
-ws = qt
-os = symbian
-arch=x86
-java.edition=me
-fragment=org.eclipse.swt.qt.s60.armv5
-version.suffix=3.5.0
-plugin.dir=../org.eclipse.swt
-tests.junit.dir=../eclipsetests
-tests.mt.dir=../nokiatests
-tests.utils.dir=../s60utils
-javac.source=1.3
-javac.target=1.3
-javac.debug=false
-lib.filename = eswtqt.dll
-lib.makefile = bld.inf
-lib.spec=symbian-abld
-jar.filename=eswt.jar
-generated.native.dir = generated
-loc.jar=resources.jar
-loc.qt.jar=resources_qt.jar
\ No newline at end of file
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.armv5/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,560 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.swt.qt.s60.armv5" default="build" basedir=".">
-
-    <target name="help">
-        <echo level="info">
-Usage: ant [one of the following:]
-build              : Build debug + release
-build.jar          : Build all jars
-build.debug        : Build all debug binaries
-build.release      : Build all release binaries
-build.lib          : Build all native libraries
-build.lib.debug    : Build debug native libraries
-build.lib.release  : Build release native libraries
-build.tests        : Build JUnit and MT tests
-clean              : Clean everything
-clean.jar          : Clean all jars
-clean.lib          : Clean native libraries and object files
-clean.lib.debug    : Clean debug native libraries and object files
-clean.lib.release  : Clean release native libraries and object files
-export             : Export everything
-export.jar         : Export Java classes packed as jar
-export.debug       : Export all debug binaries
-export.release     : Export all release binaries
-export.lib         : Export native libraries
-export.lib.debug   : Export debug native libraries
-export.lib.release : Export release native libraries
-run.tests          : Run JUnit and MT tests
-make.sis           : Create OMJ SIS package
-        </echo>
-    </target>
-
-    <target name="init" depends="init.env, init.export.path">
-        <property file="./build.properties"></property>
-        <property name="full.name" value="${fragment}_${version.suffix}"/>
-        <property name="temp.dir" value="${basedir}/temp"/>
-        <property name="plugin.destination" value="${basedir}"/>
-        <property name="build.result.dir" value="${basedir}"/>
-        <property name="download.destination" value="${basedir}"/>
-        <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
-        <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
-        <property name="odc.location" value = "${plugin.dir}/Eclipse_SWT_PI/s60"/>
-        <mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
-        <property name="test.jar.dir" value = "${epoc.root}epoc32/release/armv5/urel/z/resource/java/jvm/lib/common"/>
-        <property name="jar.dir" value = "${epoc.root}epoc32/release/armv5/urel/z/resource/java/jvm/lib/jrt"/>
-        <property name="epoc.debug.dir" value = "${epoc.root}epoc32/release/armv5/udeb"/>
-        <property name="epoc.release.dir" value = "${epoc.root}epoc32/release/armv5/urel"/>
-        <property name="omj.loc.dir" value = "${epoc.root}${java.src.root}/build/loc"/>
-        <path id="javac.bootclasspath">
-            <pathelement path="${epoc.root}epoc32/BUILD/java/javabuild/javautils/winscw/debug/classes/collection"/>
-            <pathelement location="${epoc.root}epoc32/release/armv5/urel/java_signature_test.jar"/>
-        </path>
-    </target>
-    
-    <target name="init.env">
-        <property environment = "env"/>
-
-        <!-- If environment variables JAVA_SRC_ROOT, JAVA_BIN_ROOT and/or EPOC_ROOT are
-             set, use those values. Otherwise default to values that work in OMJ build
-             environment -->
-        <condition property="java.src.root" value="${env.JAVA_SRC_ROOT}" else="/omj_build/">
-            <isset property="env.JAVA_SRC_ROOT"/>
-        </condition>
-        <condition property="java.bin.root" value="${env.JAVA_BIN_ROOT}" else="/epoc32/armv5/c/java/">
-            <isset property="env.JAVA_BIN_ROOT"/>
-        </condition>        
-        <!--<condition property="epoc.root" value="${env.EPOCROOT}" else="/">
-            <isset property="env.EPOCROOT"/>
-        </condition>-->
-        <property name="epoc.root" value="z:\"/>
-              
-    </target>
-
-    <target name="init.export.path">
-        <property name="export.jar.debug.path" value = "${epoc.root}epoc32/release/armv5/udeb/Z/resource/java/jvm/lib/jrt"/>
-        <property name="export.jar.release.path" value = "${epoc.root}epoc32/release/armv5/urel/Z/resource/java/jvm/lib/jrt"/>
-        <property name="export.lib.debug.path" value = "${epoc.root}epoc32/release/armv5/udeb"/>
-        <property name="export.lib.release.path" value = "${epoc.root}epoc32/release/armv5/urel"/>
-    </target>
-        
-    <target name="download" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}/swtdownload/"/>
-        <antcall target="build.jar"/>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${basedir}/release/" 
-                update="true" includes="eswt*.dll,libeswt*.so"/>
-        <copy file="${build.result.dir}/${jar.filename}" todir="${temp.dir}/swtdownload"/>
-        <antcall target="src.zip"/>
-        <copy file="${build.result.dir}/src.zip" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.project" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.classpath" todir="${temp.dir}/swtdownload"/>
-        <copy todir="${temp.dir}/swtdownload">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-        <zip zipfile="${download.destination}/eswt-${ws}-${os}-${arch}-${jsdk}.zip">
-            <zipfileset dir="${temp.dir}/swtdownload/"/>
-        </zip>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="src.zip" depends="init">
-        <mkdir dir="${build.result.dir}/"/>
-        <zip zipfile="${build.result.dir}/src.zip">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-                <fileset dir="${plugin.dir}/Eclipse_SWT_PI/s60/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/midp/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-            <fileset dir="${basedir}" includes="about.html,about_files/" excludes=""/>
-        </zip>
-    </target>
-        
-    <target name="gather.sources" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy file="${build.result.dir}/src.zip" todir="${destination.temp.folder}/${full.name}/"/>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-    </target>
-
-    <target name="gather.individual.sources" depends="init">
-        <copy todir="${destination.temp.folder}/" failonerror="true" overwrite="true">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/s60/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/midp/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-        </copy>
-    </target>
-
-    <target name="gather.bin.parts" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy todir="${destination.temp.folder}/${full.name}" failonerror="true">
-            <fileset dir="${plugin.dir}/bin" includes="*"/>
-        </copy>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="eswt*.dll,libeswt*.so,META-INF/"/>
-        </copy>
-        <chmod perm="755" dir="${destination.temp.folder}/${full.name}" includes="eswt*.dll,libeswt*.so" />
-        <eclipse.versionReplacer path="${destination.temp.folder}/${full.name}" version="${version.suffix}"/>
-    </target>
-        
-    <target name="jar.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <jar jarfile="${plugin.destination}/${full.name}.jar" 
-                basedir="${temp.dir}/${full.name}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-        
-    <target name="zip.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="src.zip"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <antcall target="gather.sources">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <zip zipfile="${plugin.destination}/${full.name}.zip" 
-                basedir="${temp.dir}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="build">        
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-        
-    <target name="build.jar" depends="init,localization" description="Produces eswt-qt.jar">
-        <mkdir dir="${plugin.dir}/bin"/>
-        <javac destdir="${plugin.dir}/bin" source="${javac.source}" target="${javac.target}"
-            debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true"
-            fork="true" includeAntRuntime="false" includeJavaRuntime="false">
-            <src path="${plugin.dir}/Eclipse SWT/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse SWT/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/s60/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/extensions/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp_symbian/" />
-            <bootclasspath refid="javac.bootclasspath"/>
-            <classpath>
-                <pathelement path="${epoc.root}epoc32\BUILD\java\javabuild\javautils\winscw\debug\classes\collection"/>
-                <pathelement location="${epoc.root}epoc32\release\armv5\urel\java_signature_test.jar"/>
-                <pathelement location="${plugin.dir}/../com.nokia.swt.extensions/extra_jars/cdc-compilation-support.jar"/>
-            </classpath>
-        </javac>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${plugin.dir}/bin" includes="**/*.class"/>
-    </target>
-
-    <target name="build.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="build.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="build.lib">
-        <antcall target="build.lib.debug"/>
-        <antcall target="build.lib.release"/>
-    </target>
-
-    <target name="build.lib.debug" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.release" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.common" depends="init" description="params: config">
-        <javah destdir="${lib.path}/${generated.native.dir}/" classpath="${plugin.dir}/bin" verbose="yes">
-            <class name="org.eclipse.swt.internal.qt.OS"/>
-            <class name="org.eclipse.swt.internal.qt.graphics.OS"/>
-            <class name="org.eclipse.swt.internal.qt.s60.OS"/>
-            <class name="org.eclipse.swt.internal.extension.OS"/>
-        </javah>
- 
-        <!-- check  if symexports needs to be called  by checking if the either os.h and gfxos.h is never than jni_lookup-cpp  -->
-        <uptodate property="symexports.notRequired" targetfile="${lib.path}/${generated.native.dir}/jni_lookup.cpp" 
-			srcfile="${lib.path}/${generated.native.dir}/org_eclipse_swt_internal_qt_OS.h" />
-        <antcall target="symexports" />
-                
-        <antcall target="qmake">
-            <param name="qmake.dir" value="${lib.path}"/>
-            <param name="qmake.target" value="${build.lib.common.config}"/>
-            <param name="qmake.spec" value="${lib.spec}"/>
-            <param name="qmake.file" value="${lib.makefile}"/>
-        </antcall>
-        <exec executable="cmd" dir="${lib.path}" failonerror="true">
-            <arg value="/c"/>
-            <arg value="bldmake bldfiles"/>
-        </exec>
-        <antcall target="abld">
-            <param name="abld.dir" value="${lib.path}"/>
-            <param name="abld.command" value="build"/>
-            <param name="abld.platform" value="armv5"/>
-            <param name="abld.config" value="${build.lib.common.config}"/>
-        </antcall>
-        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
-        <!-- On S60 the libs are generated directly into the export path -->
-        <condition property="build.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${build.lib.common.config}" arg2="debug"/>
-        </condition>
-        <copy file="${build.lib.common.export.path}/${lib.filename}" 
-            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-        
-        <target name="symexports" unless="symexports.notRequired">
-            <echo message="Calling symexports to generate jni_lookup.cpp"></echo>
-            <exec executable="${epoc.root}epoc32\tools\symexports" dir="${lib.path}/${generated.native.dir}" failonerror="true">
-                <arg line="-h:./org_eclipse_swt_internal_qt_OS.h" />
-                <arg line="-h:./org_eclipse_swt_internal_qt_graphics_OS.h" />
-                <arg line="-h:./org_eclipse_swt_internal_qt_s60_OS.h" />
-                <arg value="-out:./jni_lookup.cpp"/>
-            </exec>
-        </target>
-        
-    <target name="clean">
-        <antcall target="clean.jar"/>
-        <antcall target="clean.lib"/>
-    </target>
-        
-    <target name="clean.jar" depends="init" description="">
-        <delete dir="${plugin.dir}/bin"/>
-        <delete file="${build.result.dir}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.debug.path}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
-    </target>
-
-    <target name="clean.lib">
-        <antcall target="clean.lib.debug"/>
-        <antcall target="clean.lib.release"/>
-    </target>
-
-    <target name="clean.lib.debug" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.release" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.common" depends="init" description="params: config">
-        <antcall target="qmake">
-            <param name="qmake.dir" value="${lib.path}"/>
-            <param name="qmake.target" value="${clean.lib.common.config}"/>
-            <param name="qmake.spec" value="${lib.spec}"/>
-            <param name="qmake.file" value="${lib.makefile}"/>
-        </antcall>
-        <exec executable="cmd" dir="${lib.path}" failonerror="true">
-            <arg value="/c"/>
-            <arg value="bldmake bldfiles"/>
-        </exec>
-        <antcall target="abld">
-            <param name="abld.dir" value="${lib.path}"/>
-            <param name="abld.command" value="reallyclean"/>
-            <param name="abld.platform" value="armv5"/>
-            <param name="abld.config" value="${clean.lib.common.config}"/>
-        </antcall>
-	<delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-        <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
-        <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${clean.lib.common.config}" arg2="debug"/>
-        </condition>
-        <delete file="${clean.lib.common.export.path}/${lib.filename}" verbose="true"/>
-        <delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
-    </target>
-
-    <target name="export">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-
-    <target name="export.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="export.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-        <target name="export.jar">
-                <antcall target="export.jar.debug"/>
-                <antcall target="export.jar.release"/>
-        </target>
-
-        <target name="export.jar.debug" depends="build.jar" if="export.jar.debug.path">
-                <mkdir dir="${export.jar.debug.path}"/>
-                <copy file="${build.result.dir}/${jar.filename}" 
-            tofile="${export.jar.debug.path}/${jar.filename}" overwrite="true" verbose="true"/>
-                <copy file="${odc.location}/eswt.odc" 
-            tofile="${export.jar.debug.path}/eswt.odc" overwrite="true" verbose="true"/>
-        </target>
-
-        <target name="export.jar.release" depends="build.jar" if="export.jar.release.path">
-                <mkdir dir="${export.jar.release.path}"/>
-                <copy file="${build.result.dir}/${jar.filename}"
-            tofile="${export.jar.release.path}/${jar.filename}" overwrite="true" verbose="true"/>
-                <copy file="${odc.location}/eswt.odc" 
-            tofile="${export.jar.release.path}/eswt.odc" overwrite="true" verbose="true"/>
-        </target>
-
-    <target name="export.lib">
-        <antcall target="export.lib.debug"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="export.lib.debug" depends="build.lib.debug" if="export.lib.debug.path">
-        <!-- Nothing to do. On S60 libs are exported automatically -->
-    </target>
-
-    <target name="export.lib.release" depends="build.lib.release" if="export.lib.release.path">
-        <!-- Nothing to do. On S60 libs are exported automatically -->
-    </target>
-
-    <target name="make" description="params: dir, file, target">
-        <exec executable="make" dir="${make.dir}" failonerror="true">
-            <arg line="-f ${make.file} ${make.target}"/>
-        </exec>
-    </target>
-
-    <target name="qmake" description="params: dir, spec, target">
-        <exec executable="qmake" dir="${qmake.dir}" failonerror="true">
-            <arg line="-spec ${qmake.spec} -o ${qmake.file}"/>
-            <arg value="CONFIG+=${qmake.target}"/>
-            <arg value="DESTDIR=${qmake.target}"/>
-            <arg value="OBJECTS_DIR=${qmake.target}/${qmake.spec}/build"/>
-        </exec>
-    </target>
-
-    <target name="abld" description="params: dir, command, platform, config">
-        <condition property="abld.actual.config" value="udeb" else="urel">
-            <equals arg1="${abld.config}" arg2="debug"/>
-        </condition>
-        <exec executable="cmd" dir="${abld.dir}" failonerror="true">
-            <arg line="/c abld ${abld.command} ${abld.platform} ${abld.actual.config}"/>
-        </exec>
-
-    </target>
-
-    <target name="build.tests" depends="init,build.release">
-        <mkdir dir="${tests.utils.dir}/java/bin"/>
-        <mkdir dir="${tests.junit.dir}/bin"/>
-        <mkdir dir="${tests.mt.dir}/bin"/>
-        
-        <!-- build s60uitestutils -->
-        <javac destdir="${tests.utils.dir}/java/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-                <src path="${tests.utils.dir}/java/src/"/>
-            <classpath>
-                <pathelement path="${plugin.dir}/bin/"/>
-            </classpath>
-        </javac>
-        <jar jarfile="${build.result.dir}/s60uitestutils.jar">
-                <fileset dir="${tests.utils.dir}/java/bin"/>
-        </jar>
-        <copy file="${build.result.dir}/s60uitestutils.jar" todir="${test.jar.dir}"/>
-        
-        <javah outputfile="../s60utils/inc/s60utils.h" classpath="${tests.utils.dir}/java/bin" verbose="yes">
-            <class name="com.nokia.mj.impl.uitestutils.S60Utils"/>
-        </javah>
-        <exec executable="${epoc.root}epoc32\tools\symexports" dir="${tests.utils.dir}/group" failonerror="true">
-            <arg line="-h:../inc/s60utils.h" />
-            <arg value="-out:../src/jni_lookup.cpp"/>
-        </exec>
-        <exec executable="cmd" dir="${tests.utils.dir}/group" failonerror="true">
-            <arg value="/c"/>
-            <arg value="bldmake bldfiles"/>
-        </exec>
-        <antcall target="abld">
-            <param name="abld.dir" value="${tests.utils.dir}/group"/>
-            <param name="abld.command" value="build"/>
-            <param name="abld.platform" value="armv5"/>
-        </antcall>
-
-        <!-- build JUnit tests -->
-        <javac destdir="${tests.junit.dir}/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.tck/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests.qt/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.qt/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests.qt/src/"/>
-            <exclude name="**/Test_com_ibm_ugl_UGLCompatibility.java"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement path="${plugin.dir}/bin/"/>
-            </classpath>
-        </javac>        
-        
-        <!-- build MT tests -->
-        <javac destdir="${tests.mt.dir}/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-                <src path="${tests.mt.dir}/src/"/>
-                <src path="${tests.mt.dir}/src_j2me/"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement path="${plugin.dir}/bin/"/>
-                <pathelement path="${tests.junit.dir}/bin/"/>
-                <pathelement path="${tests.utils.dir}/java/bin/"/>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-            </classpath>
-        </javac>
-        <jar jarfile="${build.result.dir}/eswt-qt-tests.jar" excludes="**/*.java">
-                <fileset dir="${tests.junit.dir}/bin"/>
-                
-                <!-- JUnit test resources are in the source folders -->
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests/src"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests.qt/src"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests/src"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.qt/src"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.tck/src"/> 
-                
-                <fileset dir="${tests.mt.dir}/bin"/>
-                <fileset dir="${tests.mt.dir}/res"/>
-        </jar>
-        <copy file="${tests.mt.dir}/junit-3.8.1.1.jar" todir="${test.jar.dir}"/>
-        <copy file="${build.result.dir}/eswt-qt-tests.jar" todir="${test.jar.dir}"/>
-    </target>
-        
-    <target name="clean.tests" depends="init">
-        <delete dir="${tests.utils.dir}/java/bin"/>
-        <delete dir="${tests.utils.dir}/native/release"/>
-        <delete dir="${tests.utils.dir}/native/debug"/>
-        <delete dir="${tests.junit.dir}/bin"/>
-        <delete dir="${tests.mt.dir}/bin"/>
-        <delete file="${build.result.dir}/eswt-qt-tests.jar" verbose="true"/>
-        <delete file="${build.result.dir}/s60uitestutils.jar" verbose="true"/>
-        <delete file="${build.result.dir}/release/libxlibevents.so" verbose="true"/>
-        <delete file="${build.result.dir}/debug/libxlibevents.so" verbose="true"/>
-        <delete file="${epoc.release.dir}/s60uitestutils.dll" verbose="true"/>
-        <delete file="${epoc.release.dir}/s60uitestutils.lib" verbose="true"/>
-        <delete file="${epoc.debug.dir}/s60uitestutils.dll" verbose="true"/>
-        <delete file="${epoc.debug.dir}/s60uitestutils.lib" verbose="true"/>
-    </target>
-    
-    <target name="run.tests" depends="init,build.tests">
-        <mkdir dir="${build.result.dir}/testresults"/>
-        <junit printsummary="yes" fork="yes">
-                <test name="com.nokia.eswt.mt.AllTests"/>
-                <formatter type="xml" usefile="yes"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement location="${build.result.dir}/eswt-qt.jar"/>
-                <pathelement location="${build.result.dir}/eswt-qt-tests.jar"/>
-                <pathelement path="${java.class.path}"/>
-            </classpath>
-                <sysproperty key="java.library.path" value="${build.result.dir}/release"/>
-        </junit>
-        <junitreport todir="${build.result.dir}/testresults">
-                <fileset dir="${build.result.dir}">
-                        <include name="TEST-*.xml" />
-                </fileset>
-                <report todir="${build.result.dir}/testresults"/>
-        </junitreport>
-    </target>
-
-    <target name="make.sis" depends="init">
-        <exec executable="make" dir="${java.src.root}/build/sis" failonerror="false">
-            <arg line="UI=QT"/>
-        </exec>
-    </target>
-
-		<!-- Localization process -->
-	<target name="localization" depends="init">
- 			<zip destfile="${omj.loc.dir}/${loc.qt.jar}" update="true" filesonly="true">
-      		<zipfileset dir="../loc" prefix="resources/com/nokia/mj/impl"
-                 includes="eswtcore.loc,eswtmobile.loc" />
-    	</zip>
-			<copy file="${omj.loc.dir}/${loc.qt.jar}"  tofile="${jar.dir}/${loc.jar}" />
-	</target>    			
-	
-</project>
-
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/.project	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.qt.s60.winscw</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-</projectDescription>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/build.properties	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-custom = true
-ws = qt
-os = symbian
-arch=x86
-java.edition=me
-fragment=org.eclipse.swt.qt.s60.winscw
-version.suffix=3.5.0
-plugin.dir=../org.eclipse.swt
-tests.junit.dir=../eclipsetests
-tests.mt.dir=../nokiatests
-tests.utils.dir=../s60utils
-javac.source=1.3
-javac.target=1.3
-javac.debug=false
-lib.filename = eswtqt.dll
-lib.makefile = bld.inf
-lib.spec=symbian-abld
-jar.filename=eswt.jar
-generated.native.dir = generated
-loc.jar=resources.jar
-loc.qt.jar=resources_qt.jar
-qmake.dir=/epoc32/tools/qt
-make.dir=/epoc32/tools
\ No newline at end of file
--- a/javauis/eswt_qt/org.eclipse.swt.qt.s60.winscw/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,602 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.swt.qt.s60.winscw" default="build" basedir=".">
-
-    <target name="help">
-        <echo level="info">
-Usage: ant [one of the following:]
-build              : Build debug + release
-build.jar          : Build all jars
-build.debug        : Build all debug binaries
-build.release      : Build all release binaries
-build.lib          : Build all native libraries
-build.lib.debug    : Build debug native libraries
-build.lib.release  : Build release native libraries
-build.tests        : Build JUnit and MT tests
-clean              : Clean everything
-clean.jar          : Clean all jars
-clean.lib          : Clean native libraries and object files
-clean.lib.debug    : Clean debug native libraries and object files
-clean.lib.release  : Clean release native libraries and object files
-export             : Export everything
-export.jar         : Export Java classes packed as jar
-export.debug       : Export all debug binaries
-export.release     : Export all release binaries
-export.lib         : Export native libraries
-export.lib.debug   : Export debug native libraries
-export.lib.release : Export release native libraries
-run.tests          : Run JUnit and MT tests
-make.sis           : Create OMJ SIS package
-        </echo>
-    </target>
-
-    <target name="init" depends="init.env, init.export.path">
-        <property file="./build.properties"></property>
-        <property name="full.name" value="${fragment}_${version.suffix}"/>
-        <property name="temp.dir" value="${basedir}/temp"/>
-        <property name="plugin.destination" value="${basedir}"/>
-        <property name="build.result.dir" value="${basedir}"/>
-        <property name="download.destination" value="${basedir}"/>
-        <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
-        <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
-        <property name="odc.location" value = "${plugin.dir}/Eclipse_SWT_PI/s60"/>
-        <mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
-        <property name="test.jar.dir" value = "${env.EPOCROOT}epoc32/release/winscw/udeb/z/resource/java/jvm/lib/common"/>
-        <property name="jar.dir" value = "${env.EPOCROOT}epoc32/release/winscw/udeb/z/resource/java/jvm/lib/jrt"/>
-        <property name="epoc.debug.dir" value = "${env.EPOCROOT}epoc32/release/winscw/udeb"/>
-        <property name="epoc.release.dir" value = "${env.EPOCROOT}epoc32/release/winscw/urel"/>
-        <property name="omj.loc.dir" value = "${env.JAVA_SRC_ROOT}/build/loc"/>
-        <path id="javac.bootclasspath">
-            <pathelement path="${env.EPOCROOT}epoc32/BUILD/java/javabuild/javautils/winscw/debug/classes/collection"/>
-            <pathelement location="${env.JAVA_SRC_ROOT}/inc/classes.cldc.zip"/>
-        </path>
-    </target>
-    
-    <target name="init.env">
-        <property environment = "env"/>
-        <fail message="JAVA_SRC_ROOT system variable not defined">
-            <condition>
-                <not>
-                    <isset property="env.JAVA_SRC_ROOT"/>
-                </not>
-            </condition>
-        </fail>
-        <fail message="JAVA_BIN_ROOT system variable not defined">
-            <condition>
-                <not>
-                    <isset property="env.JAVA_BIN_ROOT"/>
-                </not>
-            </condition>
-        </fail>
-        <fail message="EPOCROOT system variable not defined">
-            <condition>
-                <not>
-                    <isset property="env.EPOCROOT"/>
-                </not>
-            </condition>
-        </fail>
-    </target>
-
-    <target name="init.export.path">
-        <property name="export.jar.debug.path" value = "${env.EPOCROOT}epoc32/release/winscw/udeb/Z/resource/java/jvm/lib/jrt"/>
-        <property name="export.jar.release.path" value = "${env.EPOCROOT}epoc32/release/winscw/urel/Z/resource/java/jvm/lib/jrt"/>
-        <property name="export.lib.debug.path" value = "${env.EPOCROOT}epoc32/release/winscw/udeb"/>
-        <property name="export.lib.release.path" value = "${env.EPOCROOT}epoc32/release/winscw/urel"/>
-    </target>
-        
-    <target name="download" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}/swtdownload/"/>
-        <antcall target="build.jar"/>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${basedir}/release/" 
-                update="true" includes="eswt*.dll,libeswt*.so"/>
-        <copy file="${build.result.dir}/${jar.filename}" todir="${temp.dir}/swtdownload"/>
-        <antcall target="src.zip"/>
-        <copy file="${build.result.dir}/src.zip" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.project" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.classpath" todir="${temp.dir}/swtdownload"/>
-        <copy todir="${temp.dir}/swtdownload">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-        <zip zipfile="${download.destination}/eswt-${ws}-${os}-${arch}-${jsdk}.zip">
-            <zipfileset dir="${temp.dir}/swtdownload/"/>
-        </zip>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="src.zip" depends="init">
-        <mkdir dir="${build.result.dir}/"/>
-        <zip zipfile="${build.result.dir}/src.zip">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/s60/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/midp/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-            <fileset dir="${basedir}" includes="about.html,about_files/" excludes=""/>
-        </zip>
-    </target>
-        
-    <target name="gather.sources" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy file="${build.result.dir}/src.zip" todir="${destination.temp.folder}/${full.name}/"/>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-    </target>
-
-    <target name="gather.individual.sources" depends="init">
-        <copy todir="${destination.temp.folder}/" failonerror="true" overwrite="true">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/s60/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/../com.nokia.swt.extensions/midp/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-        </copy>
-    </target>
-
-    <target name="gather.bin.parts" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy todir="${destination.temp.folder}/${full.name}" failonerror="true">
-            <fileset dir="${plugin.dir}/bin" includes="*"/>
-        </copy>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="eswt*.dll,libeswt*.so,META-INF/"/>
-        </copy>
-        <chmod perm="755" dir="${destination.temp.folder}/${full.name}" includes="eswt*.dll,libeswt*.so" />
-        <eclipse.versionReplacer path="${destination.temp.folder}/${full.name}" version="${version.suffix}"/>
-    </target>
-        
-    <target name="jar.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <jar jarfile="${plugin.destination}/${full.name}.jar" 
-                basedir="${temp.dir}/${full.name}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-        
-    <target name="zip.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="src.zip"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <antcall target="gather.sources">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <zip zipfile="${plugin.destination}/${full.name}.zip" 
-                basedir="${temp.dir}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="build">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-        
-    <target name="build.jar" depends="init,localization" description="Produces eswt-qt.jar">
-        <mkdir dir="${plugin.dir}/bin"/>
-        <javac destdir="${plugin.dir}/bin" source="${javac.source}" target="${javac.target}"
-            debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-            <src path="${plugin.dir}/Eclipse SWT/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse SWT/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/s60/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/extensions/"/>
-            <src path="${plugin.dir}/../com.nokia.swt.extensions/midp_symbian/" />
-            <bootclasspath refid="javac.bootclasspath"/>
-            <classpath>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-                <pathelement location="${plugin.dir}/../com.nokia.swt.extensions/extra_jars/cdc-compilation-support.jar"/>
-            </classpath>
-        </javac>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${plugin.dir}/bin" includes="**/*.class"/>
-    </target>
-
-    <target name="build.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="build.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="build.lib">
-        <antcall target="build.lib.debug"/>
-        <antcall target="build.lib.release"/>
-    </target>
-
-    <target name="build.lib.debug" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.release" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.common" depends="init" description="params: config">
-        <javah destdir="${lib.path}/${generated.native.dir}/" classpath="${plugin.dir}/bin" verbose="yes">
-            <class name="org.eclipse.swt.internal.qt.OS"/>
-			<class name="org.eclipse.swt.internal.qt.graphics.OS"/>
-            <class name="org.eclipse.swt.internal.qt.s60.OS"/>
-            <class name="org.eclipse.swt.internal.extension.OS"/>
-        </javah>
- 
-        <!-- check  if symexports needs to be called  by checking if the either os.h and gfxos.h is never than jni_lookup-cpp  -->
-        <uptodate property="symexports.notRequired" targetfile="${lib.path}/${generated.native.dir}/jni_lookup.cpp" 
-			srcfile="${lib.path}/${generated.native.dir}/org_eclipse_swt_internal_qt_OS.h" />
-        <antcall target="symexports" />
-                
-        <antcall target="qmake">
-            <param name="qmake.dir" value="${lib.path}"/>
-            <param name="qmake.target" value="${build.lib.common.config}"/>
-            <param name="qmake.spec" value="${lib.spec}"/>
-            <param name="qmake.file" value="${lib.makefile}"/>
-        </antcall>
-        <exec executable="cmd" dir="${lib.path}" failonerror="true">
-            <arg value="/c"/>
-            <arg value="bldmake bldfiles"/>
-        </exec>
-        <antcall target="abld">
-            <param name="abld.dir" value="${lib.path}"/>
-            <param name="abld.command" value="build"/>
-            <param name="abld.platform" value="winscw"/>
-            <param name="abld.config" value="${build.lib.common.config}"/>
-        </antcall>
-        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
-        <!-- On S60 the libs are generated directly into the export path -->
-        <condition property="build.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${build.lib.common.config}" arg2="debug"/>
-        </condition>
-        <copy file="${build.lib.common.export.path}/${lib.filename}" 
-            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-        
-    <target name="symexports" unless="symexports.notRequired">
-        <echo message="Calling symexports to generate jni_lookup.cpp"></echo>
-        <exec executable="/epoc32/tools/symexports" dir="${lib.path}/${generated.native.dir}" failonerror="true">
-                <arg line="-h:./org_eclipse_swt_internal_qt_OS.h" />
-                <arg line="-h:./org_eclipse_swt_internal_qt_graphics_OS.h" />
-                <arg line="-h:./org_eclipse_swt_internal_qt_s60_OS.h" />
-            <arg value="-out:./jni_lookup.cpp"/>
-        </exec>
-    </target>
-        
-    <target name="clean">
-        <antcall target="clean.jar"/>
-        <antcall target="clean.lib"/>
-    </target>
-        
-    <target name="clean.jar" depends="init" description="">
-        <delete dir="${plugin.dir}/bin"/>
-        <delete file="${build.result.dir}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.debug.path}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
-    </target>
-
-    <target name="clean.lib">
-        <antcall target="clean.lib.debug"/>
-        <antcall target="clean.lib.release"/>
-    </target>
-
-    <target name="clean.lib.debug" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.release" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.common" depends="init" description="params: config">
-        <antcall target="qmake">
-            <param name="qmake.dir" value="${lib.path}"/>
-            <param name="qmake.target" value="${clean.lib.common.config}"/>
-            <param name="qmake.spec" value="${lib.spec}"/>
-            <param name="qmake.file" value="${lib.makefile}"/>
-        </antcall>
-        <exec executable="cmd" dir="${lib.path}" failonerror="true">
-            <arg value="/c"/>
-            <arg value="bldmake bldfiles"/>
-        </exec>
-        <antcall target="abld">
-            <param name="abld.dir" value="${lib.path}"/>
-            <param name="abld.command" value="reallyclean"/>
-            <param name="abld.platform" value="winscw"/>
-            <param name="abld.config" value="${clean.lib.common.config}"/>
-        </antcall>
-        <delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-        <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
-        <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${clean.lib.common.config}" arg2="debug"/>
-        </condition>
-        <delete file="${clean.lib.common.export.path}/${lib.filename}" verbose="true"/>
-        <delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
-    </target>
-
-    <target name="export">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-
-    <target name="export.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="export.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="export.jar">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.jar.release"/>
-    </target>
-
-    <target name="export.jar.debug" depends="build.jar" if="export.jar.debug.path">
-        <mkdir dir="${export.jar.debug.path}"/>
-        <copy file="${build.result.dir}/${jar.filename}" 
-            tofile="${export.jar.debug.path}/${jar.filename}" overwrite="true" verbose="true"/>
-        <copy file="${odc.location}/eswt.odc" 
-            tofile="${export.jar.debug.path}/eswt.odc" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="export.jar.release" depends="build.jar" if="export.jar.release.path">
-        <mkdir dir="${export.jar.release.path}"/>
-        <copy file="${build.result.dir}/${jar.filename}"
-            tofile="${export.jar.release.path}/${jar.filename}" overwrite="true" verbose="true"/>
-        <copy file="${odc.location}/eswt.odc" 
-            tofile="${export.jar.release.path}/eswt.odc" overwrite="true" verbose="true"/>        
-    </target>
-
-    <target name="export.lib">
-        <antcall target="export.lib.debug"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="export.lib.debug" depends="build.lib.debug" if="export.lib.debug.path">
-        <!-- Nothing to do. On S60 libs are exported automatically -->
-    </target>
-
-    <target name="export.lib.release" depends="build.lib.release" if="export.lib.release.path">
-        <!-- Nothing to do. On S60 libs are exported automatically -->
-    </target>
-
-    <target name="make" description="params: dir, file, target">
-        <exec executable="make" dir="${make.dir}" failonerror="true">
-            <arg line="-f ${make.file} ${make.target}"/>
-        </exec>
-    </target>
-
-    <target name="qmake" description="params: dir, spec, target">
-        <exec executable="qmake" dir="${qmake.dir}" failonerror="true">
-            <arg line="-spec ${qmake.spec} -o ${qmake.file}"/>
-            <arg value="CONFIG+=${qmake.target}"/>
-            <arg value="DESTDIR=${qmake.target}"/>
-            <arg value="OBJECTS_DIR=${qmake.target}/${qmake.spec}/build"/>
-        </exec>
-    </target>
-
-    <target name="abld" description="params: dir, command, platform, config">
-        <condition property="abld.actual.config" value="udeb" else="urel">
-            <equals arg1="${abld.config}" arg2="debug"/>
-        </condition>
-        <exec executable="cmd" dir="${abld.dir}" failonerror="true">
-            <arg line="/c abld ${abld.command} ${abld.platform} ${abld.actual.config}"/>
-        </exec>
-
-    </target>
-
-    <target name="build.tests" depends="init"> 
-        <mkdir dir="${tests.utils.dir}/java/bin"/>
-        <mkdir dir="${tests.junit.dir}/bin"/>
-        <mkdir dir="${tests.mt.dir}/bin"/>
-        
-        <!-- build s60uitestutils -->
-        <javac destdir="${tests.utils.dir}/java/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-                <src path="${tests.utils.dir}/java/src/"/>
-            <classpath>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-            </classpath>
-        </javac>
-        <jar jarfile="${build.result.dir}/s60uitestutils.jar">
-            <fileset dir="${tests.utils.dir}/java/bin"/>
-        </jar>
-        <copy file="${build.result.dir}/s60uitestutils.jar" todir="${test.jar.dir}"/>
-        
-       
-       <javah outputfile="../s60utils/native/s60utils.h" classpath="${tests.utils.dir}/java/bin" verbose="yes">
-          	<class name="com.nokia.mj.impl.uitestutils.S60Utils"/>
-        </javah>
-        
-        <exec executable="python" failonerror="true">
-      		<arg value="${env.JAVA_SRC_ROOT}/build/buildutils/generates60lookup.py"/>
-      		<arg value="--nojxe"/>
-      		<arg value="${tests.utils.dir}/native/s60utils.h"/>
-      		<arg value="${tests.utils.dir}/native/jni_lookup.cpp"/>
-    	</exec>
-			
-        <exec executable="${qmake.dir}/qmake" dir="${tests.utils.dir}/native" failonerror="true" >
-            <arg line="-spec symbian-sbsv2"/>
-        </exec>
- 
-        <exec executable="${make.dir}/make" dir="${tests.utils.dir}/native" failonerror="true"/>
-        
-        <!-- build JUnit tests -->
-        <javac destdir="${tests.junit.dir}/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.tck/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests.qt/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.qt/src/"/>
-            <src path="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests.qt/src/"/>
-            <exclude name="**/Test_com_ibm_ugl_UGLCompatibility.java"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-            </classpath>
-        </javac>
-        
-        <!-- build MT tests -->
-        <javac destdir="${tests.mt.dir}/bin" source="${javac.source}" target="${javac.target}" 
-                debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-                <src path="${tests.mt.dir}/src/"/>
-                <src path="${tests.mt.dir}/src_j2me/"/>
-                <src path="${tests.mt.dir}/../CgfxTestRunner/src/"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-                <pathelement path="${tests.junit.dir}/bin/"/>
-                <pathelement path="${tests.utils.dir}/java/bin/"/>
-                <pathelement location="${epoc.debug.dir}/java_impl_cldc.jar"/>
-                <pathelement location="${env.JAVA_SRC_ROOT}/inc/classes.cldc.zip"/>
-            </classpath>
-        </javac>
-        
-        <jar jarfile="${build.result.dir}/eswt-qt-tests.jar">
-                <fileset dir="${tests.junit.dir}/bin"/>
-                
-                <!-- JUnit test resources are in the source folders -->
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests/src" excludes="**/*.java"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.core.tests.qt/src" excludes="**/*.java"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.expanded.tests/src" excludes="**/*.java"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.qt/src" excludes="**/*.java"/> 
-                <fileset dir="${tests.junit.dir}/org.eclipse.ercp.swt.mobile.tests.tck/src" excludes="**/*.java"/> 
-                
-                <fileset dir="${tests.mt.dir}/bin"/>
-                <fileset dir="${tests.mt.dir}/res"/>
-        </jar>
-        <copy file="${tests.mt.dir}/junit-3.8.1.1.jar" todir="${test.jar.dir}"/>
-        <copy file="${build.result.dir}/eswt-qt-tests.jar" todir="${test.jar.dir}"/>
-        <antcall target="rename"/>
-    </target>
-        
-    <target name="clean.tests" depends="init">
-        <exec executable="make" dir="${tests.utils.dir}/native" failonerror="true">
-            <arg line="clean"/>
-        </exec>
-        <delete dir="${tests.utils.dir}/java/bin"/>
-        <delete dir="${tests.utils.dir}/native/release"/>
-        <delete dir="${tests.utils.dir}/native/debug"/>
-        <delete dir="${tests.junit.dir}/bin"/>
-        <delete dir="${tests.mt.dir}/bin"/>
-        <delete file="${build.result.dir}/eswt-qt-tests.jar" verbose="true"/>
-        <delete file="${build.result.dir}/s60uitestutils.jar" verbose="true"/>
-        <delete file="${build.result.dir}/release/libxlibevents.so" verbose="true"/>
-        <delete file="${build.result.dir}/debug/libxlibevents.so" verbose="true"/>
-        <delete file="${epoc.release.dir}/s60uitestutils.dll" verbose="true"/>
-        <delete file="${epoc.release.dir}/s60uitestutils.lib" verbose="true"/>
-        <delete file="${epoc.debug.dir}/s60uitestutils.dll" verbose="true"/>
-        <delete file="${epoc.debug.dir}/s60uitestutils.lib" verbose="true"/>
-    </target>
-    
-    <target name="run.tests" depends="init,build.tests">
-        <mkdir dir="${build.result.dir}/testresults"/>
-        <junit printsummary="yes" fork="yes">
-                <test name="com.nokia.eswt.mt.AllTests"/>
-                <formatter type="xml" usefile="yes"/>
-            <classpath>
-                <pathelement location="${tests.mt.dir}/junit-3.8.1.1.jar"/>
-                <pathelement location="${build.result.dir}/eswt-qt.jar"/>
-                <pathelement location="${build.result.dir}/eswt-qt-tests.jar"/>
-                <pathelement path="${java.class.path}"/>
-            </classpath>
-            <sysproperty key="java.library.path" value="${build.result.dir}/release"/>
-        </junit>
-        <junitreport todir="${build.result.dir}/testresults">
-                <fileset dir="${build.result.dir}">
-                        <include name="TEST-*.xml" />
-                </fileset>
-                <report todir="${build.result.dir}/testresults"/>
-        </junitreport>
-    </target>
-
-    <target name="make.sis" depends="init">
-        <exec executable="make" dir="${java.src.root}/build/sis" failonerror="false">
-            <arg line="UI=QT"/>
-        </exec>
-    </target>
-
-	<!-- Localization process -->
-	<target name="localization" depends="init">
- 			<zip destfile="${omj.loc.dir}/${loc.qt.jar}" update="true" filesonly="true">
-      		<zipfileset dir="../loc" prefix="resources/com/nokia/mj/impl"
-                 includes="eswtcore.loc,eswtmobile.loc" />
-    	</zip>
-			<copy file="${omj.loc.dir}/${loc.qt.jar}"  tofile="${jar.dir}/${loc.jar}" />
-	</target>    			
-	
-	<!-- Dll rename for tests run -->
-	<target name="rename" >
-		<!-- Renames only when tests are compiling very first time or 
-		tests compiling very first time after omj recompiled -->
-		<condition property="isjavajvmargsmodifierfile">
-			<available file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierfile.dll"/>
-   		</condition>
-  		<antcall target="rename_dll"/>
-	</target>  
-	
-	<target name="rename_dll" if="isjavajvmargsmodifierfile">
-   		<condition property="isjavajvmargsmodifierdefault">
-    			<available file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierdefault.dll"/>
-   		</condition>
-   		<antcall target="rename_omjrecompiled"/>
-   		<antcall target="rename_firsttime"/>
-  	</target>  
-  
- 	 <target name="rename_omjrecompiled" if="isjavajvmargsmodifierdefault">
-  		<delete file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierdefault.dll" />
-		<move file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier.dll"  tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierdefault.dll" failonerror="false"/>
-		<move file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierfile.dll"  tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier.dll" failonerror="false"/>
-  	</target>  
-  	
- 	<target name="rename_firsttime" unless="isjavajvmargsmodifierdefault">
- 		<copy file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier.dll" tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier_org.dll"/>  
- 		<copy file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierfile.dll" tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierfile_org.dll"/>
- 		<move file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier.dll"  tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierdefault.dll" failonerror="false"/>
-		<move file="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifierfile.dll"  tofile="${env.EPOCROOT}epoc32/release/winscw/udeb/javajvmargsmodifier.dll" failonerror="false"/>
- 	</target>  
- 	
-</project>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/.project	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.qt.win32.x86.internal</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-</projectDescription>
--- a/javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/build.properties	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-custom = true
-ws = qt
-os = win32
-arch=x86
-java.edition= se
-fragment=org.eclipse.swt.qt.win32.x86.internal
-version.suffix=3.5.0
-plugin.dir=../org.eclipse.swt
-tests.junit.dir=../eclipsetests
-tests.mt.dir=../nokiatests
-tests.utils.dir=../s60utils
-javac.source=1.3
-javac.target=1.3
-javac.debug=false
-lib.filename = eswtqt.dll
-lib.makefile = Makefile.win32
-lib.spec=win32-g++
-jar.filename=eswt-qt.jar
-generated.native.dir = generated
\ No newline at end of file
--- a/javauis/eswt_qt/org.eclipse.swt.qt.win32.x86.internal/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,347 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.swt.qt.win32.x86.internal" default="build" basedir=".">
-
-    <target name="help">
-        <echo level="info">
-Usage: ant [one of the following:]
-build              : Build debug + release
-build.jar          : Build all jars
-build.debug        : Build all debug binaries
-build.release      : Build all release binaries
-build.lib          : Build all native libraries
-build.lib.debug    : Build debug native libraries
-build.lib.release  : Build release native libraries
-build.tests        : Build JUnit and MT tests
-clean              : Clean everything
-clean.jar          : Clean all jars
-clean.lib          : Clean native libraries and object files
-clean.lib.debug    : Clean debug native libraries and object files
-clean.lib.release  : Clean release native libraries and object files
-export             : Export everything
-export.jar         : Export Java classes packed as jar
-export.debug       : Export all debug binaries
-export.release     : Export all release binaries
-export.lib         : Export native libraries
-export.lib.debug   : Export debug native libraries
-export.lib.release : Export release native libraries
-run.tests                  : Run JUnit and MT tests
-        </echo>
-    </target>
-
-    <target name="init" depends="init.env, init.export.path">
-        <property file="./build.properties"></property>
-        <property name="full.name" value="${fragment}_${version.suffix}"/>
-        <property name="temp.dir" value="${basedir}/temp"/>
-        <property name="plugin.destination" value="${basedir}"/>
-        <property name="build.result.dir" value="${basedir}"/>
-        <property name="download.destination" value="${basedir}"/>
-        <property name="lib.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library"/>
-        <property name="lib.gfx.path" value = "${plugin.dir}/Eclipse_SWT_PI/qt/library/graphics"/>
-        <mkdir dir="${lib.path}/${generated.native.dir}"/>
-        <!-- Platform Specific properties -->
-   </target>
-
-    <target name="init.env">
-        <property environment = "env"/>
-    </target>
-
-    <target name="init.export.path" if="env.JAVA_BIN_ROOT">
-        <property name="export.jar.debug.path" value = "${env.JAVA_BIN_ROOT}/jsr/classes"/>
-        <property name="export.jar.release.path" value = "${env.JAVA_BIN_ROOT}/jsr/classes"/>
-        <property name="export.lib.debug.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
-        <property name="export.lib.release.path" value = "${env.JAVA_BIN_ROOT}/lib"/>
-    </target>
-        
-    <target name="download" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}/swtdownload/"/>
-        <antcall target="build.jar"/>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${basedir}/release/" 
-                update="true" includes="eswt*.dll,libeswt*.so"/>
-        <copy file="${build.result.dir}/${jar.filename}" todir="${temp.dir}/swtdownload"/>
-        <antcall target="src.zip"/>
-        <copy file="${build.result.dir}/src.zip" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.project" todir="${temp.dir}/swtdownload"/>
-        <copy file="${plugin.dir}/build/.classpath" todir="${temp.dir}/swtdownload"/>
-        <copy todir="${temp.dir}/swtdownload">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-        <zip zipfile="${download.destination}/eswt-${ws}-${os}-${arch}-${jsdk}.zip">
-            <zipfileset dir="${temp.dir}/swtdownload/"/>
-        </zip>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="src.zip" depends="init">
-        <mkdir dir="${build.result.dir}/"/>
-        <zip zipfile="${build.result.dir}/src.zip">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Nokia SWT/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-            <fileset dir="${basedir}" includes="about.html,about_files/" excludes=""/>
-        </zip>
-    </target>
-        
-    <target name="gather.sources" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy file="${build.result.dir}/src.zip" todir="${destination.temp.folder}/${full.name}/"/>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="about.html,about_files/"/>
-        </copy>
-    </target>
-
-    <target name="gather.individual.sources" depends="init">
-        <copy todir="${destination.temp.folder}/" failonerror="true" overwrite="true">
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/common/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Browser/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT Drag and Drop/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/library/"/>
-            <fileset dir="${plugin.dir}/Eclipse_SWT_PI/qt/graphics_library/"/>
-            <fileset dir="${plugin.dir}/Nokia SWT/extensions/" includes="**/*.java" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/" includes="**/*.properties" excludes=""/>
-            <fileset dir="${plugin.dir}/Eclipse SWT/common/" includes="**/version.txt" excludes=""/>
-        </copy>
-    </target>
-
-    <target name="gather.bin.parts" depends="init" if="destination.temp.folder">
-        <mkdir dir="${destination.temp.folder}/${full.name}"/>
-        <copy todir="${destination.temp.folder}/${full.name}" failonerror="true">
-            <fileset dir="${plugin.dir}/bin" includes="*"/>
-        </copy>
-        <copy todir="${destination.temp.folder}/${full.name}">
-            <fileset dir="${basedir}" includes="eswt*.dll,libeswt*.so,META-INF/"/>
-        </copy>
-        <chmod perm="755" dir="${destination.temp.folder}/${full.name}" includes="eswt*.dll,libeswt*.so" />
-        <eclipse.versionReplacer path="${destination.temp.folder}/${full.name}" version="${version.suffix}"/>
-    </target>
-        
-    <target name="jar.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <jar jarfile="${plugin.destination}/${full.name}.jar" 
-                basedir="${temp.dir}/${full.name}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-        
-    <target name="zip.plugin" depends="init">
-        <delete dir="${temp.dir}"/>
-        <mkdir dir="${temp.dir}"/>
-        <antcall target="build.jar"/>
-        <antcall target="src.zip"/>
-        <antcall target="gather.bin.parts">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <antcall target="gather.sources">
-            <param name="destination.temp.folder" value="${temp.dir}/"/>
-        </antcall>
-        <zip zipfile="${plugin.destination}/${full.name}.zip" 
-                basedir="${temp.dir}" filesonly="true"/>
-        <delete dir="${temp.dir}"/>
-    </target>
-
-    <target name="build">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-        
-    <target name="build.jar" depends="init" description="Produces eswt-qt.jar">
-        <mkdir dir="${plugin.dir}/bin"/>
-        <javac destdir="${plugin.dir}/bin" source="${javac.source}" target="${javac.target}"
-            debug="${javac.debug}" debuglevel="lines,vars,source" verbose="true" failonerror="true">
-            <src path="${plugin.dir}/Eclipse SWT/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse SWT/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/common/"/>
-            <src path="${plugin.dir}/Eclipse SWT Browser/qt/"/>
-            <src path="${plugin.dir}/Eclipse SWT Drag and Drop/qt/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/common_j2${java.edition}/"/>
-            <src path="${plugin.dir}/Eclipse_SWT_PI/qt/"/>
-            <src path="${plugin.dir}/Nokia SWT/extensions/"/>
-        </javac>
-        <jar jarfile="${build.result.dir}/${jar.filename}" basedir="${plugin.dir}/bin"/>
-    </target>
-
-    <target name="build.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="build.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="build.lib">
-        <antcall target="build.lib.debug"/>
-        <antcall target="build.lib.release"/>
-    </target>
-
-    <target name="build.lib.debug" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.release" depends="init">
-        <antcall target="build.lib.common">
-            <param name="build.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="build.lib.common" depends="init" description="params: config">
-        <javah outputfile="${lib.path}/${generated.native.dir}/os.h" classpath="${plugin.dir}/bin" verbose="yes">
-            <class name="org.eclipse.swt.internal.qt.OS"/>
-            <class name="org.eclipse.swt.internal.qt.graphics.OS"/>
-            <class name="org.eclipse.swt.internal.extension.OS"/>
-        </javah>
-        <antcall target="qmake">
-            <param name="qmake.dir" value="${lib.path}"/>
-            <param name="qmake.target" value="${build.lib.common.config}"/>
-            <param name="qmake.spec" value="${lib.spec}"/>
-            <param name="qmake.file" value="${lib.makefile}.${build.lib.common.config}"/>
-        </antcall>
-        <antcall target="make">
-            <param name="make.dir" value="${lib.path}"/>
-            <param name="make.file" value="${lib.makefile}.${build.lib.common.config}"/>
-            <param name="make.target" value=""/>
-        </antcall>
-        <!--<exec executable="pexports" dir="${lib.path}" failonerror="false">
-            <arg line="${build.lib.common.config}/${lib.filename} > swt.def"/>
-        </exec>-->
-        <mkdir dir="${build.result.dir}/${build.lib.common.config}/"/>
-        <copy file="${lib.path}/${build.lib.common.config}/${lib.filename}" 
-            tofile="${build.result.dir}/${build.lib.common.config}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="clean">
-        <antcall target="clean.jar"/>
-        <antcall target="clean.lib"/>
-    </target>
-        
-    <target name="clean.jar" depends="init" description="">
-        <delete dir="${plugin.dir}/bin"/>
-        <delete file="${build.result.dir}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.debug.path}/${jar.filename}" verbose="true"/>
-        <delete file="${export.jar.release.path}/${jar.filename}" verbose="true"/>
-    </target>
-
-    <target name="clean.lib">
-        <antcall target="clean.lib.debug"/>
-        <antcall target="clean.lib.release"/>
-    </target>
-
-    <target name="clean.lib.debug" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="debug"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.release" depends="init">
-        <antcall target="clean.lib.common">
-            <param name="clean.lib.common.config" value="release"/>
-        </antcall>
-    </target>
-
-    <target name="clean.lib.common" depends="init" description="params: config">
-        <antcall target="make">
-            <param name="make.dir" value="${lib.path}"/>
-            <param name="make.target" value="clean"/>
-            <param name="make.file" value="${lib.makefile}.${clean.lib.common.config}"/>
-            <param name="fail" value="false"/>
-        </antcall>
-        <delete file="${lib.path}/${lib.makefile}.${clean.lib.common.config}" verbose="true"/>
-        <delete dir="${lib.path}/${generated.native.dir}" verbose="true"/>
-    	<delete dir="${lib.path}/${clean.lib.common.config}" verbose="true"/>
-        <delete file="${build.result.dir}/${clean.lib.common.config}/${lib.filename}" verbose="true"/>
-        <condition property="clean.lib.common.export.path" value="${export.lib.debug.path}" else="${export.lib.release.path}">
-            <equals arg1="${clean.lib.common.config}" arg2="debug"/>
-        </condition>
-        <delete file="${clean.lib.common.export.path}/${lib.filename}" verbose="true"/>
-    </target>
-
-    <target name="export">
-        <antcall target="export.jar"/>
-        <antcall target="export.lib"/>
-    </target>
-
-    <target name="export.debug">
-        <antcall target="export.jar.debug"/>
-        <antcall target="export.lib.debug"/>
-    </target>
-
-    <target name="export.release">
-        <antcall target="export.jar.release"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-        <target name="export.jar">
-                <antcall target="export.jar.debug"/>
-                <antcall target="export.jar.release"/>
-        </target>
-
-        <target name="export.jar.debug" depends="build.jar" if="export.jar.debug.path">
-                <mkdir dir="${export.jar.debug.path}"/>
-                <copy file="${build.result.dir}/${jar.filename}" 
-            tofile="${export.jar.debug.path}/${jar.filename}" overwrite="true" verbose="true"/>
-        </target>
-
-        <target name="export.jar.release" depends="build.jar" if="export.jar.release.path">
-                <mkdir dir="${export.jar.release.path}"/>
-                <copy file="${build.result.dir}/${jar.filename}"
-            tofile="${export.jar.release.path}/${jar.filename}" overwrite="true" verbose="true"/>
-        </target>
-
-    <target name="export.lib">
-        <antcall target="export.lib.debug"/>
-        <antcall target="export.lib.release"/>
-    </target>
-
-    <target name="export.lib.debug" depends="build.lib.debug" if="export.lib.debug.path">
-        <mkdir dir="${export.lib.debug.path}"/>
-        <copy file="${lib.path}/debug/${lib.filename}" 
-            tofile="${export.lib.debug.path}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="export.lib.release" depends="build.lib.release" if="export.lib.release.path">
-        <mkdir dir="${export.lib.release.path}"/>
-        <copy file="${lib.path}/release/${lib.filename}"
-            tofile="${export.lib.release.path}/${lib.filename}" overwrite="true" verbose="true"/>
-    </target>
-
-    <target name="make" description="params: dir, file, target">
-        <exec executable="mingw32-make" dir="${make.dir}" failonerror="false">
-            <arg line="-f ${make.file} ${make.target}"/>
-        </exec>
-    </target>
-
-    <target name="qmake" description="params: dir, spec, target">
-        <exec executable="qmake" dir="${qmake.dir}" failonerror="true">
-            <arg line="-spec ${qmake.spec} -o ${qmake.file}"/>
-            <arg value="CONFIG+=${qmake.target}"/>
-            <arg value="DESTDIR=${qmake.target}"/>
-            <arg value="OBJECTS_DIR=${qmake.target}/${qmake.spec}/build"/>
-        </exec>
-    </target>
-
-
-</project>
-
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT Browser/qt/org/eclipse/swt/browser/QtWebKit.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT Browser/qt/org/eclipse/swt/browser/QtWebKit.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
  * All rights reserved. This program and the accompanying materials 
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.internal.qt.OS;
+import org.eclipse.swt.internal.qt.webkit.OS_webkit;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
@@ -38,7 +39,7 @@
     // At this point, browser.handle is the view port of QScrollArea, set by Composite
     int scrollAreaHandle = Internal_PackageSupport.topHandle(browser);
     int viewPortHandle = Internal_PackageSupport.handle(browser);
-    webViewHandle = OS.QWebView_new();
+    webViewHandle = OS_webkit.QWebView_new();
     OS.QWidget_setParent(webViewHandle, scrollAreaHandle);
     
     int layout = OS.QVBoxLayout_new(0);
@@ -83,25 +84,25 @@
     browser.setData(SET_NO_MOUSE_PROPAGATE_STATE_KEY, new Boolean(true));
     browser.setData(SET_EMBEDDED_SCROLLBARS_STATE_KEY, new Boolean(true));
     
-    int handler1 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADFINISHED);
+    int handler1 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADFINISHED);
     OS.QObject_connectOrThrow(webViewHandle, "loadFinished(bool)", 
         handler1, "widgetSignal(bool)", OS.QT_AUTOCONNECTION);
-    int handler2 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADPROGRESS);
+    int handler2 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADPROGRESS);
     OS.QObject_connectOrThrow(webViewHandle, "loadProgress(int)", 
         handler2, "widgetSignal(int)", OS.QT_AUTOCONNECTION);
-    int handler3 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADSTARTED);
+    int handler3 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LOADSTARTED);
     OS.QObject_connectOrThrow(webViewHandle, "loadStarted()", 
         handler3, "widgetSignal()", OS.QT_AUTOCONNECTION);
-    int handler4 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_STATUSBARMESSAGE);
+    int handler4 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_STATUSBARMESSAGE);
     OS.QObject_connectOrThrow(webViewHandle, "statusBarMessage(const QString&)", 
         handler4, "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
-    int handler5 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_TITLECHANGED);
+    int handler5 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_TITLECHANGED);
     OS.QObject_connectOrThrow(webViewHandle, "titleChanged(const QString&)", 
         handler5, "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
-    int handler6 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_URLCHANGED);
+    int handler6 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_URLCHANGED);
     OS.QObject_connectOrThrow(webViewHandle, "urlChanged(const QUrl&)", 
         handler6, "widgetSignal(const QUrl&)", OS.QT_AUTOCONNECTION);
-    int handler7 = OS.SignalHandler_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LINKCLICKED);
+    int handler7 = OS.SignalForwarder_new(webViewHandle, this, OS.QSIGNAL_WEBVIEW_LINKCLICKED);
     OS.QObject_connectOrThrow(webViewHandle, "linkClicked(const QUrl&)", 
         handler7, "widgetSignal(const QUrl&)", OS.QT_AUTOCONNECTION);
 }
@@ -110,10 +111,10 @@
  * @see WebBrowser
  */
 public boolean back() {
-    if (OS.QWebView_swt_canGoBack(webViewHandle)) {
+    if (OS_webkit.QWebView_swt_canGoBack(webViewHandle)) {
         if (sendLocationEventChanging((int)System.currentTimeMillis(), 
-            OS.QWebView_swt_backUrl(webViewHandle))) {
-            OS.QWebView_back(webViewHandle);
+            OS_webkit.QWebView_swt_backUrl(webViewHandle))) {
+            OS_webkit.QWebView_back(webViewHandle);
             return true;
         }
     }
@@ -124,17 +125,17 @@
  * @see WebBrowser
  */
 public boolean execute(String script) {
-    return OS.QWebView_swt_evaluateJavaScript(webViewHandle, script);
+    return OS_webkit.QWebView_swt_evaluateJavaScript(webViewHandle, script);
 }
 
 /**
  * @see WebBrowser
  */
 public boolean forward() {
-    if (OS.QWebView_swt_canGoForward(webViewHandle)) {
+    if (OS_webkit.QWebView_swt_canGoForward(webViewHandle)) {
         if (sendLocationEventChanging((int)System.currentTimeMillis(), 
-            OS.QWebView_swt_forwardUrl(webViewHandle))) {
-            OS.QWebView_forward(webViewHandle);
+            OS_webkit.QWebView_swt_forwardUrl(webViewHandle))) {
+            OS_webkit.QWebView_forward(webViewHandle);
             return true;
         }
     }
@@ -159,21 +160,21 @@
  * @see WebBrowser
  */
 public String getUrl() {
-    return OS.QWebView_url(webViewHandle);
+    return OS_webkit.QWebView_url(webViewHandle);
 }
 
 /**
  * @see WebBrowser
  */
 public boolean isBackEnabled() {
-    return OS.QWebView_swt_canGoBack(webViewHandle);
+    return OS_webkit.QWebView_swt_canGoBack(webViewHandle);
 }
 
 /**
  * @see WebBrowser
  */
 public boolean isForwardEnabled() {
-    return OS.QWebView_swt_canGoForward(webViewHandle);
+    return OS_webkit.QWebView_swt_canGoForward(webViewHandle);
 }
 
 /**
@@ -181,8 +182,8 @@
  */
 public void refresh() {
     if (sendLocationEventChanging((int)System.currentTimeMillis(), 
-        OS.QWebView_url(webViewHandle))) {
-        OS.QWebView_reload(webViewHandle);
+        OS_webkit.QWebView_url(webViewHandle))) {
+        OS_webkit.QWebView_reload(webViewHandle);
     }
 }
 
@@ -191,7 +192,7 @@
  */
 public boolean setText(String html) {
     if (sendLocationEventChanging((int)System.currentTimeMillis(), "about:blank")) {
-        OS.QWebView_setHtml(webViewHandle, html);
+        OS_webkit.QWebView_setHtml(webViewHandle, html);
         return true;
     }
     else {
@@ -204,7 +205,7 @@
  */
 public boolean setUrl(String url) {
     if (sendLocationEventChanging((int)System.currentTimeMillis(), url)) {
-        OS.QWebView_setUrl(webViewHandle, url);
+        OS_webkit.QWebView_setUrl(webViewHandle, url);
         return true;
     }
     else {
@@ -216,7 +217,7 @@
  * @see WebBrowser
  */
 public void stop() {
-    OS.QWebView_stop(webViewHandle);
+    OS_webkit.QWebView_stop(webViewHandle);
 }
 
 final boolean eventProcess( int widgetHandle, int eventType, int time, 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Resource.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-
-/**
- * This class is the abstract superclass of all graphics resource objects.  
- * Resources created by the application must be disposed.
- * <p>
- * IMPORTANT: This class is intended to be subclassed <em>only</em>
- * within the SWT implementation. However, it has not been marked
- * final to allow those outside of the SWT development team to implement
- * patched versions of the class in order to get around specific
- * limitations in advance of when those limitations can be addressed
- * by the team.  Any class built using subclassing to access the internals
- * of this class will likely fail to compile or run between releases and
- * may be strongly platform specific. Subclassing should not be attempted
- * without an intimate and detailed understanding of the workings of the
- * hierarchy. No support is provided for user-written classes which are
- * implemented as subclasses of this class.
- * </p>
- *
- * @see #dispose
- * @see #isDisposed
- * 
- * @since 3.1
- */
-public abstract class Resource {
-    
-	/**
-	 * the device where this resource was created
-	 */
-	Device device;
-
-Resource() {
-}
-
-Resource(Device device) {
-	if (device == null) device = Device.getDevice();
-	if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
-	this.device = device;
-}
-
-void destroy() {
-}
-
-/**
- * Disposes of the operating system resources associated with
- * this resource. Applications must dispose of all resources
- * which they allocate.
- */
-public void dispose() {
-	if (device == null) return;
-	if (device.isDisposed()) return;
-	destroy();
-	if (device.tracking) device.dispose_Object(this);
-	device = null;
-}
-
-/**
- * Returns the <code>Device</code> where this resource was
- * created.
- *
- * @return <code>Device</code> the device of the receiver
- * 
- * @since 3.2
- */
-public Device getDevice() {
-	Device device = this.device;
-	if (device == null || isDisposed ()) SWT.error (SWT.ERROR_GRAPHIC_DISPOSED);
-	return device;
-}
-
-void init() {
-	if (device.tracking) device.new_Object(this);
-}
-
-/**
- * Returns <code>true</code> if the resource has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the resource.
- * When a resource has been disposed, it is an error to
- * invoke any other method using the resource.
- *
- * @return <code>true</code> when the resource is disposed and <code>false</code> otherwise
- */
-public abstract boolean isDisposed();
-
-}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/CaptionedControl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/CaptionedControl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,12 +1,12 @@
 /*******************************************************************************
  * Copyright (c) 2004, 2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved. This program and the accompanying materials 
+ * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
- *     Yu You (Nokia Corp.)- initial API specification 
+ *     Yu You (Nokia Corp.)- initial API specification
  *     Nokia Corporation - S60 implementation
  *     Nokia Corporation - QT implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 import java.lang.Math;
 
 /**
- * 
+ *
  * A CaptionedControl is used to display a label (caption) in front of a
  * control. An optional trailing text can be used after the control, for
  * example, to indicate units of measurement.
@@ -37,7 +37,7 @@
  * order for the captions is determined by the <code>SWT.LEFT_TO_RIGHT</code>
  * and <code>SWT.RIGHT_TO_LEFT</code> styles hints.
  * </p>
- * 
+ *
  * <p>
  * CaptionedControl does not support nested CaptionedControls. An exception will
  * be thrown when an instance of CaptionedControl is given as the constructor's
@@ -59,7 +59,7 @@
  * control.getTrailingText(&quot;cm&quot;);
  * </pre></code>
  * </p>
- * 
+ *
  * <p>
  * <dl>
  * <dt><b>Styles: </b></dt>
@@ -75,7 +75,7 @@
  * <p>
  * IMPORTANT: This class is not intended to be subclassed.
  * </p>
- * 
+ *
  */
 public final class CaptionedControl extends Composite {
     boolean initPhase;
@@ -93,7 +93,7 @@
     public void qt_signal_qapplication_focusChanged(int old, int now) {
         ((CaptionedControl)w).qt_signal_qapplication_focusChanged(old, now);
     }
-    
+
     public void removeControl(Control control) {
         ((CaptionedControl)w).removeControl(control);
     }
@@ -102,18 +102,18 @@
 class CaptionedControlLayout extends Layout {
 
 int checkHint(int hint, int spacing) {
-    
+
     // Adjust a hint by spacing, check that result is not negative
     if (hint == SWT.DEFAULT) {
         return hint;
     }
-    
+
     hint -= spacing;
-    
+
     if (hint < 0) {
         hint = 0;
     }
-    
+
     return hint;
 }
 
@@ -122,7 +122,7 @@
     Point res = new Point(0, 0);
     int wHint = checkHint(hint, 2 * margin);
     int hHint = checkHint(hint2, 2 * margin);
-    
+
     CaptionedControlLayoutData data = getData(wHint, hHint);
     if ((getStyle() & SWT.HORIZONTAL) != 0) {
         if (hint == SWT.DEFAULT) {
@@ -152,7 +152,7 @@
             res.y = data.row1.y + Math.max(hint2, data.trail.y);
         }
     }
-    
+
     // Since the margins are big enough, adding the border is pointless.
     res.x += 2 * margin;
     res.y += 2 * margin;
@@ -162,30 +162,30 @@
 
 protected void layout(Composite composite, boolean flushCache) {
 
-    Point size = composite.getSize();    
+    Point size = composite.getSize();
     if (size.x <= 0 || size.y <= 0) {
         return;
     }
-    
+
     CaptionedControlLayoutData data = getData(size.x, size.y);
-    
+
     int x = margin;
     int y = margin;
     int w = size.x - 2 * margin;
     int h = 0;
-    
+
     if ((getStyle() & SWT.HORIZONTAL) != 0) {
         h = size.y - 2 * margin;
     }
     else {
         h = data.row1.y;
     }
-    
+
     if (h < 0) h = 0;
-    
+
     imageLabel.setBounds(x, y, data.img.x, h);
     x += data.img.x;
-    
+
     titleLabel.setBounds(x, y, data.title.x, h);
     x += data.title.x;
 
@@ -196,12 +196,12 @@
         h = size.y - data.row1.y - 2 * margin;
         if (h < 0) h = 0;
         x = margin;
-        
+
         if (child == null) {
             trailW = data.row1.x - 2 * margin;
         }
     }
-    
+
     int childW = 0;
     if (child != null) {
         if ((getStyle() & SWT.HORIZONTAL) != 0) {
@@ -216,8 +216,8 @@
 
         child.setBounds(x, y, childW, h);
         x += childW;
-    } 
-    
+    }
+
     trailLabel.setBounds(x, y, trailW, h);
 }
 
@@ -229,10 +229,10 @@
     CaptionedControlLayoutData res = new CaptionedControlLayoutData();
 
     int extra = spacing * 2;
-    
+
     wHint = checkHint(wHint, extra);
     hHint = checkHint(hHint, extra);
-    
+
     if ((getStyle() & SWT.HORIZONTAL) != 0) {
         if (imageLabel.getImage() != null) {
             res.img = imageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
@@ -245,14 +245,14 @@
         if (trail != null && trail.length() > 0) {
             res.trail = trailLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
         }
-        
+
     } else {
         if (imageLabel.getImage() != null) {
             res.img = imageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
         }
         String caption = titleLabel.getText();
         if (caption != null && caption.length() > 0) {
-            
+
             if (wHint != SWT.DEFAULT) {
                 int hint = wHint - res.img.x;
                 if (hint < 0) {
@@ -263,15 +263,15 @@
                 res.title = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
             }
         }
-        
+
         String trail = trailLabel.getText();
         if (trail != null && trail.length() > 0) {
             res.trail = trailLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
         }
-        
-        
+
+
     }
-    
+
     if (res.img.x > 0 && res.img.y > 0) {
         res.img.x += extra;
         res.img.y += extra;
@@ -284,11 +284,11 @@
         res.trail.x += extra;
         res.trail.y += extra;
     }
-    
+
     if ((getStyle() & SWT.HORIZONTAL) != 0) {
         if (child != null) {
             res.child = child.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            
+
             if (wHint != SWT.DEFAULT) {
                 res.child.x = wHint - res.img.x - res.title.x - res.trail.x;
                 if (res.child.x < 0) {
@@ -303,13 +303,13 @@
             } else {
                 res.child = child.computeSize(SWT.DEFAULT, SWT.DEFAULT);
             }
-            
+
             if (hHint != SWT.DEFAULT) {
                 res.child.y = hHint - res.row1.y;
             }
         }
     }
-    
+
     if ((getStyle() & SWT.HORIZONTAL) != 0) {
         res.row1.x = res.img.x + res.title.x + res.child.x + res.trail.x;
         res.row1.y = Math.max(res.row1.y, res.img.y);
@@ -318,24 +318,24 @@
         res.row1.y = Math.max(res.row1.y, res.child.y);
     }
     else {
-        // If the first row would expand to be bigger than the contained 
+        // If the first row would expand to be bigger than the contained
         // control, adjust title caption width.
         if ((child != null) && (res.img.x + res.title.x > res.child.x + res.trail.x)) {
             int width = res.child.x + res.trail.x - res.img.x;
-            
+
             if (width < 0) {
                 width = 0;
             }
-            
+
             Point newTitle = titleLabel.computeSize(width, SWT.DEFAULT);
-            
+
             // Adjust title size only if the adjustment causes line count to
             // change (i.e. title height increases)
             if (newTitle.y > res.title.y) {
                 res.title = newTitle;
             }
         }
-        
+
         res.row1.x = res.img.x + res.title.x;
         res.row1.y = Math.max(res.row1.y, res.img.y);
         res.row1.y = Math.max(res.row1.y, res.title.y);
@@ -343,7 +343,7 @@
         res.row2.y = Math.max(res.row2.y, res.trail.y);
         res.row2.y = Math.max(res.row2.y, res.child.y);
     }
-    
+
     return res;
 }
 }
@@ -376,13 +376,13 @@
  * style constants. The class description lists the style constants that are
  * applicable to the class. Style bits are also inherited from superclasses.
  * </p>
- * 
+ *
  * @param parent
  *            a widget which will be the parent of the new instance (cannot
  *            be null)
  * @param style
  *            the style of widget to construct
- * 
+ *
  * @exception IllegalArgumentException
  *                <ul>
  *                <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
@@ -394,12 +394,12 @@
  *                <li>ERROR_INVALID_SUBCLASS - if this class is not an
  *                allowed subclass</li>
  *                </ul>
- * 
+ *
  * @see SWT#LEFT_TO_RIGHT
  * @see SWT#RIGHT_TO_LEFT
  */
 public CaptionedControl (Composite parent, int style) {
-    super(parent, Internal_PackageSupport.checkBits(style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0), 0, 
+    super(parent, Internal_PackageSupport.checkBits(style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0), 0,
             new CaptionedControlPackageProxy(), false);
     if (parent instanceof CaptionedControl) {
         SWT.error(SWT.ERROR_INVALID_PARENT);
@@ -414,8 +414,8 @@
     }
     trailLabel = new Label(this, SWT.CENTER);
     initPhase = false;
-    
-        
+
+
 
     layout = new CaptionedControlLayout();
     super.setLayout(layout);
@@ -555,13 +555,13 @@
 
 public Rectangle computeTrim(int x, int y, int width, int height) {
     checkWidget();
-    
+
     Rectangle res = new Rectangle(0, 0, 0, 0);
-    
+
     if (layout != null) {
         CaptionedControlLayoutData data = layout.getData();
-        
-        if ((getStyle() & SWT.HORIZONTAL) != 0) { 
+
+        if ((getStyle() & SWT.HORIZONTAL) != 0) {
             res.width = data.img.x + data.title.x + data.trail.x + width;
             res.height = height;
             res.x = x - data.img.x - data.title.x - margin;
@@ -577,12 +577,12 @@
     else {
         res.width = width;
         res.height = height;
-        res.x = x; 
+        res.x = x;
         res.y = y;
     }
     res.width += 2 * margin;
     res.height += 2 * margin;
-    
+
     return res;
 }
 
@@ -687,7 +687,7 @@
     Control[] children = super.getChildren();
     Control[] res = new Control[children.length - 3];
     for (int i = 0, j = 0; i < children.length; i++) {
-        if (children[i] != imageLabel 
+        if (children[i] != imageLabel
             && children[i] != titleLabel
             && children[i] != trailLabel ) {
             res[j] = children[i];
@@ -699,15 +699,15 @@
 
 public Rectangle getClientArea() {
     checkWidget();
-    
+
     Rectangle res = new Rectangle(0, 0, 0, 0);
-    
+
     Point size = getSize();
     size.x -= 2 * margin;
-    size.y -= 2 * margin;    
-    
+    size.y -= 2 * margin;
+
     if (layout != null) {
-        
+
         CaptionedControlLayoutData data = layout.getData(size.x, size.y);
         if ((getStyle() & SWT.HORIZONTAL) != 0) {
             res.width = size.x - data.img.x - data.title.x - data.trail.x;
@@ -716,7 +716,7 @@
             res.y = margin;
         }
         else {
-            res.width = size.x - data.trail.x; 
+            res.width = size.x - data.trail.x;
             res.height = size.y - data.row1.y;
             res.x = margin;
             res.y = data.row1.y + margin;
@@ -726,19 +726,19 @@
         res.width = size.x;
         res.height = size.y;
     }
-    
+
     if (res.width < 0) res.width = 0;
     if (res.height < 0) res.height = 0;
-    
+
     return res;
 }
 
 /**
  * Returns the CaptionedControl's icon image, or null if it has never been
  * set.
- * 
+ *
  * @return the icon image or null.
- * 
+ *
  * @exception SWTException
  *                <ul>
  *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
@@ -756,7 +756,7 @@
 /**
  * Gets the caption text, which will be an empty string if it has never been
  * set.
- * 
+ *
  * @return The label text.
  * @exception SWTException
  *                <ul>
@@ -765,7 +765,7 @@
  *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
  *                thread that created the parent</li>
  *                </ul>
- * 
+ *
  * @see #setText(java.lang.String)
  */
 public String getText () {
@@ -776,9 +776,9 @@
 /**
  * Gets the trailing text, which will be an empty string if it has never
  * been set.
- * 
+ *
  * @return The trailing text.
- * 
+ *
  * @exception SWTException
  *                <ul>
  *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
@@ -786,7 +786,7 @@
  *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
  *                thread that created the parent</li>
  *                </ul>
- * 
+ *
  * @see #setTrailingText(java.lang.String)
  */
 public String getTrailingText () {
@@ -847,19 +847,18 @@
 /**
  * Sets the image as an icon to the CaptionedControl. The icon can co-exist
  * with caption text. The icon position is platform-dependent.
- * 
+ *
  * <p>
  * The parameter can be null indicating that no image should be displayed.
  * The implementation will adjust the image size to make it best fit the
  * CaptionedControl.
  * </p>
- * 
+ *
  * @param image
  *            the image to display on the receiver
- * 
+ *
  * @exception IllegalArgumentException
  *                <ul>
- *                <li>ERROR_NULL_ARGUMENT - if the image is null</li>
  *                <li>ERROR_INVALID_ARGUMENT - if the image has been
  *                disposed</li>
  *                </ul>
@@ -870,13 +869,10 @@
  *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
  *                thread that created the receiver</li>
  *                </ul>
- * 
+ *
  */
 public void setImage (Image image) {
     checkWidget();
-    if (image == null) {
-        SWT.error(SWT.ERROR_NULL_ARGUMENT);
-    }
     if (image != null && image.isDisposed()) {
         SWT.error(SWT.ERROR_INVALID_ARGUMENT);
     }
@@ -892,10 +888,10 @@
 
 /**
  * Sets the caption label
- * 
+ *
  * @param string
  *            the new caption label
- * 
+ *
  * @throws java.lang.IllegalArgumentException
  *             <code>ERROR_NULL_ARGUMENT</code> if the text is null
  * @exception SWTException
@@ -918,10 +914,10 @@
 
 /**
  * Sets the trailing label
- * 
+ *
  * @param string
  *            the new trailing label
- * 
+ *
  * @exception IllegalArgumentException
  *                <ul>
  *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
@@ -933,7 +929,7 @@
  *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
  *                thread that created the parent</li>
  *                </ul>
- * 
+ *
  * @see #getTrailingText
  */
 public void setTrailingText (java.lang.String string) {
@@ -946,13 +942,12 @@
 }
 
 private final int handle() {
-    return Internal_PackageSupport.handle(this); 
+    return Internal_PackageSupport.handle(this);
 }
 
 
 void hookFocusChangedEvent() {
     focusSignalProxy = OS.SignalHandler_new(topHandle(),
-            Internal_PackageSupport.display(this),
             OS.QSIGNAL_QAPPLICATION_FOCUSCHANGED_TO_WIDDGET);
     OS.QObject_connectOrThrow(OS.QCoreApplication_instance(),
             "focusChanged(QWidget*, QWidget*)", focusSignalProxy,
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/Command.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/Command.java	Fri Jun 11 13:33:44 2010 +0300
@@ -432,7 +432,7 @@
     void hookEvents() {
         Internal_PackageSupport.hookEvents(this);
         if ( type == Command.COMMANDGROUP ) return;
-        int triggeredProxy = OS.SignalHandler_new(handle(), Internal_PackageSupport.display(this), OS.QSIGNAL_TRIGGERED);
+        int triggeredProxy = OS.SignalHandler_new(handle(), OS.QSIGNAL_TRIGGERED);
         OS.QObject_connectOrThrow(handle(), "triggered(bool)", triggeredProxy, "widgetSignal(bool)", OS.QT_AUTOCONNECTION);
     }
 
@@ -450,7 +450,7 @@
             parent.addCommand( this );
         }else{
             Internal_PackageSupport.addCommand( this.control, this );
-            Internal_PackageSupport.display(this).commandArranger.commandAdded( this );
+            Internal_PackageSupport.commandArranger().commandAdded( this );
         }
 
     }
@@ -571,7 +571,7 @@
      */
     public boolean isDefaultCommand() {
         checkWidget ();
-        return Internal_PackageSupport.display(this).commandArranger.getDefaultCommand() == this;
+        return Internal_PackageSupport.commandArranger().getDefaultCommand() == this;
     }
 
     /**
@@ -659,7 +659,7 @@
         if ((accelerator & SWT.SHIFT) != 0) mask |= OS.QT_SHIFTMODIFIER;
         if ((accelerator & SWT.CONTROL) != 0) mask |= OS.QT_CONTROLMODIFIER;
         int keysym = accelerator & SWT.KEY_MASK;
-        int newKey = Display.untranslateKey (keysym);
+        int newKey = Internal_PackageSupport.untranslateKey (keysym);
         if (newKey != 0) {
             keysym = newKey;
         }
@@ -677,7 +677,7 @@
         checkWidget ();
         //Commmands that are in a command group can not be default commands
         if(parent != null ) return;
-        Internal_PackageSupport.display(this).commandArranger.setDefaultCommand(this);
+        Internal_PackageSupport.commandArranger().setDefaultCommand(this);
     }
 
     /**
@@ -809,7 +809,7 @@
 
     void releaseWidget () {
         Internal_PackageSupport.releaseWidget(this);
-        if( parent == null ) Internal_PackageSupport.display(this).commandArranger.commandRemoved( this );
+        if( parent == null ) Internal_PackageSupport.commandArranger().commandRemoved( this );
         accelerator = 0;
         parent = null;
         children = null;
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ConstrainedText.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ConstrainedText.java	Fri Jun 11 13:33:44 2010 +0300
@@ -853,18 +853,18 @@
 void hookEvents () {  
     Internal_PackageSupport.hookEvents(this);
     int handle = handle();
-    int handler = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), OS.QSIGNAL_TEXT_CHANGED);
+    int handler = OS.SignalHandler_new(handle, OS.QSIGNAL_TEXT_CHANGED);
     OS.QObject_connectOrThrow(handle, "textChanged(const QString&)",
         handler, "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
-    handler = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), OS.QSIGNAL_RETURN_PRESSED);
+    handler = OS.SignalHandler_new(handle, OS.QSIGNAL_RETURN_PRESSED);
     OS.QObject_connectOrThrow(handle, "returnPressed()",
         handler, "widgetSignal()", OS.QT_AUTOCONNECTION);
 
     if(isExtended()) {
-        handler = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), OS.QSIGNAL_TEXT_CURSORPOSITIONCHANGED);
+        handler = OS.SignalHandler_new(handle, OS.QSIGNAL_TEXT_CURSORPOSITIONCHANGED);
         OS.QObject_connectOrThrow(handle, "cursorPositionChanged(int, int)",
             handler, "widgetSignal(int, int)", OS.QT_AUTOCONNECTION);
-        handler = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), OS.QSIGNAL_TEXT_SELECTIONCHANGED);
+        handler = OS.SignalHandler_new(handle, OS.QSIGNAL_TEXT_SELECTIONCHANGED);
         OS.QObject_connectOrThrow(handle, "selectionChanged()",
             handler, "widgetSignal()", OS.QT_AUTOCONNECTION);
     }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/DateEditor.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/DateEditor.java	Fri Jun 11 13:33:44 2010 +0300
@@ -427,7 +427,7 @@
     }
 
     void hookEvents() {
-        int signalProxy = OS.SignalHandler_new(handle(), Internal_PackageSupport.display(this),
+        int signalProxy = OS.SignalHandler_new(handle(),
                 OS.QSIGNAL_DATETIMEEDIT_CHANGED);
         OS.QObject_connectOrThrow(handle(), "dateTimeChanged(const QDateTime&)",
                 signalProxy, "widgetSignal(const QDateTime&)",
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListBox.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListBox.java	Fri Jun 11 13:33:44 2010 +0300
@@ -547,8 +547,7 @@
 
     void hookEvents() {
         if (selectionModelHandle != 0) {
-            int signalProxy = OS.SignalHandler_new(topHandle(),
-                    Internal_PackageSupport.display(this), OS.QSIGNAL_SELECTIONCHANGED);
+            int signalProxy = OS.SignalHandler_new(topHandle(), OS.QSIGNAL_SELECTIONCHANGED);
             OS.QObject_connectOrThrow(
                     selectionModelHandle,
                     "selectionChanged( const QItemSelection&, const QItemSelection& )",
@@ -556,8 +555,7 @@
                     "widgetSignal( const QItemSelection&, const QItemSelection& )",
                     OS.QT_AUTOCONNECTION);
 
-            int itemActivatedSignalProxy = OS.SignalHandler_new(topHandle(),
-                    Internal_PackageSupport.display(this), OS.QSIGNAL_ABSTRACTITEMVIEW_ACTIVATED);
+            int itemActivatedSignalProxy = OS.SignalHandler_new(topHandle(), OS.QSIGNAL_ABSTRACTITEMVIEW_ACTIVATED);
             OS.QObject_connectOrThrow(topHandle(),
                     "activated(const QModelIndex& )", itemActivatedSignalProxy,
                     "widgetSignal(const QModelIndex&)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListView.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListView.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1504,11 +1504,11 @@
 void hookEvents () {
     Internal_PackageSupport.hookEvents(this);
     int handle = topHandle();
-    int signalProxySel = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), 
+    int signalProxySel = OS.SignalHandler_new(handle, 
             OS.QSIGNAL_LIST_ITEMSELECTION_CHANGED);
     OS.QObject_connectOrThrow(handle, "itemSelectionChanged()", 
             signalProxySel, "widgetSignal()", OS.QT_AUTOCONNECTION);
-    int signalProxyDefSel = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), 
+    int signalProxyDefSel = OS.SignalHandler_new(handle, 
             OS.QSIGNAL_LIST_ITEM_DOUBLECLICKED);
     OS.QObject_connectOrThrow(handle, "itemDoubleClicked(QListWidgetItem*)", 
             signalProxyDefSel, "widgetSignal(QListWidgetItem*)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java	Fri Jun 11 13:33:44 2010 +0300
@@ -260,7 +260,7 @@
 	}
 	
 	private static void hookEvents() {
-	    int screenSignalProxy = OS.SignalHandler_new(desktopWidgetHandle, getDisplay(), OS.QSIGNAL_QDESKTOPWIDGET_SCREENCOUNTCHANGED);
+	    int screenSignalProxy = OS.SignalHandler_new(desktopWidgetHandle, OS.QSIGNAL_QDESKTOPWIDGET_SCREENCOUNTCHANGED);
 	    OS.QObject_connectOrThrow(desktopWidgetHandle, "screenCountChanged(int)", screenSignalProxy,
 	            "widgetSignal(int)", OS.QT_AUTOCONNECTION);
 	}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MultiPageDialog.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MultiPageDialog.java	Fri Jun 11 13:33:44 2010 +0300
@@ -177,7 +177,7 @@
         
         void hookEvents() {
             Internal_PackageSupport.hookEvents(this);
-            int signalProxy = OS.SignalHandler_new(handle(), Internal_PackageSupport.display(this),
+            int signalProxy = OS.SignalHandler_new(handle(), 
                     OS.QSIGNAL_CURRENT_TAB_CHANGED);
             OS.QObject_connectOrThrow(handle(), "currentChanged(int)", signalProxy,
                     "widgetSignal(int)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/SortedList.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/SortedList.java	Fri Jun 11 13:33:44 2010 +0300
@@ -15,7 +15,6 @@
 package org.eclipse.ercp.swt.mobile;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Internal_PackageSupport;
 import org.eclipse.swt.widgets.Scrollable;
 import org.eclipse.swt.widgets.Composite;
@@ -628,23 +627,22 @@
 
 void hookEvents () {
     Internal_PackageSupport.hookEvents(this);
-    Display display = Internal_PackageSupport.display(this);
     int scrollAreaHandle = scrollAreaHandle();
-    int signalProxy1 = OS.SignalHandler_new(scrollAreaHandle, display, 
+    int signalProxy1 = OS.SignalHandler_new(scrollAreaHandle, 
         OS.QSIGNAL_LIST_ITEMSELECTION_CHANGED);
     OS.QObject_connectOrThrow(scrollAreaHandle, "itemSelectionChanged()", 
         signalProxy1, "widgetSignal()", OS.QT_AUTOCONNECTION);
-    int signalProxy2 = OS.SignalHandler_new(scrollAreaHandle, display, 
+    int signalProxy2 = OS.SignalHandler_new(scrollAreaHandle, 
         OS.QSIGNAL_LIST_ITEM_DOUBLECLICKED);
     OS.QObject_connectOrThrow(scrollAreaHandle, "itemDoubleClicked(QListWidgetItem*)", 
         signalProxy2, "widgetSignal(QListWidgetItem*)", OS.QT_AUTOCONNECTION);
     int signalProxy3 = OS.SignalHandler_new(Internal_PackageSupport.topHandle(this),
-        display, OS.QSIGNAL_LIST_ITEM_ACTIVATED);
+        OS.QSIGNAL_LIST_ITEM_ACTIVATED);
     OS.QObject_connectOrThrow(scrollAreaHandle,
         "itemActivated(QListWidgetItem* )", signalProxy3,
         "widgetSignal(QListWidgetItem* )", OS.QT_AUTOCONNECTION);
     if (editorHandle != 0) {
-        int signalProxy4 = OS.SignalHandler_new(editorHandle, display, OS.QSIGNAL_TEXT_CHANGED);
+        int signalProxy4 = OS.SignalHandler_new(editorHandle, OS.QSIGNAL_TEXT_CHANGED);
         OS.QObject_connectOrThrow(editorHandle, "textChanged(const QString&)",
             signalProxy4, "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
     }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/TextExtension.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/TextExtension.java	Fri Jun 11 13:33:44 2010 +0300
@@ -351,7 +351,7 @@
                     SWT.getMessage("fetch_email"), OS.CNT_ACTIONALL,
                     OS.CNT_DISPLAYALL);
     Display display = Internal_PackageSupport.display(this);
-    int handler = OS.SignalHandler_new(topHandle(), display,
+    int handler = OS.SignalHandler_new(topHandle(), 
             OS.QSIGNAL_REQUESTCOMPLETED);
 
     OS.QObject_connectOrThrow(serviceRequest, "requestCompleted(QVariant)",
@@ -389,7 +389,7 @@
                     SWT.getMessage("fetch_phonenumber"), OS.CNT_ACTIONALL,
                     OS.CNT_DISPLAYALL);
     Display display = Internal_PackageSupport.display(this);
-    int handler = OS.SignalHandler_new(topHandle(), display,
+    int handler = OS.SignalHandler_new(topHandle(), 
             OS.QSIGNAL_REQUESTCOMPLETED);
 
     OS.QObject_connectOrThrow(serviceRequest, "requestCompleted(QVariant)",
@@ -458,7 +458,7 @@
     Internal_PackageSupport.hookEvents(this);
     if(isExtended()) {
         Display display = Internal_PackageSupport.display(this);
-        int handler1 = OS.SignalHandler_new(topHandle(), display, OS.QSIGNAL_TEXT_CURSORPOSITIONCHANGED);
+        int handler1 = OS.SignalHandler_new(topHandle(), OS.QSIGNAL_TEXT_CURSORPOSITIONCHANGED);
         String s;
         if(Internal_PackageSupport.variant(this) == TextUtils.LINE_EDIT) {
         	s = "cursorPositionChanged(int, int)";         	
@@ -467,7 +467,7 @@
         }
         OS.QObject_connectOrThrow(topHandle(), s,
             handler1, "widgetSignal()", OS.QT_AUTOCONNECTION);
-        int handler2 = OS.SignalHandler_new(topHandle(), display, OS.QSIGNAL_TEXT_SELECTIONCHANGED);
+        int handler2 = OS.SignalHandler_new(topHandle(), OS.QSIGNAL_TEXT_SELECTIONCHANGED);
         OS.QObject_connectOrThrow(topHandle(), "selectionChanged()",
             handler2, "widgetSignal()", OS.QT_AUTOCONNECTION);
     }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Color.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Color.java	Fri Jun 11 13:33:44 2010 +0300
@@ -116,7 +116,7 @@
 public void dispose() {
     if (device == null) return;
     if (device.isDisposed()) return;    
-    if (device.tracking) device.dispose_Object(this);
+    if (Device.tracking) device.dispose_Object(this);
     device = null;
     handle = -1;
 }
@@ -214,8 +214,6 @@
  * Invokes platform specific functionality to allocate a new color.
  */
 void init(Device device, int red, int green, int blue) {
-    
-    if (device == null) device = Device.getDevice();
     if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
     this.device = device;
     
@@ -226,7 +224,7 @@
     }
     handle = (red & 0xFF) | ((green & 0xFF) << 8) | ((blue & 0xFF) << 16);
     // Keep this after dealing with all exceptions!
-    if (device.tracking) device.new_Object(this);
+    if (Device.tracking) device.new_Object(this);
 }
 
 /**
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Device.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Device.java	Fri Jun 11 13:33:44 2010 +0300
@@ -29,77 +29,60 @@
 public abstract class Device implements Drawable {
     
     // Native device handle
-    int paintDevice;
+    static int paintDevice;
 
     // Device instance tracking
     static Device[] Devices = new Device[4];
     
     // Debugging
     public static boolean DEBUG; 
-    boolean debug = DEBUG;
-    boolean tracking = DEBUG;
-    Error [] errors;
-    Object [] objects;
-    Object trackingLock;
+    static boolean debug = DEBUG;
+    static boolean tracking = DEBUG;
+    static Error [] errors;
+    static Object [] objects;
+    static Object trackingLock;
 
     // Themed system colors
-    Color COLOR_LIST_BACKGROUND;
-    Color COLOR_LIST_FOREGROUND;
-    Color COLOR_LIST_SELECTION;
-    Color COLOR_LIST_SELECTION_TEXT;
-    Color COLOR_TITLE_BACKGROUND;
-    Color COLOR_TITLE_BACKGROUND_GRADIENT;
-    Color COLOR_TITLE_FOREGROUND;
-    Color COLOR_TITLE_INACTIVE_BACKGROUND;
-    Color COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT;
-    Color COLOR_TITLE_INACTIVE_FOREGROUND;
-    Color COLOR_WIDGET_BACKGROUND;
-    Color COLOR_WIDGET_BORDER;
-    Color COLOR_WIDGET_DARK_SHADOW;
-    Color COLOR_WIDGET_FOREGROUND;
-    Color COLOR_WIDGET_HIGHLIGHT_SHADOW;
-    Color COLOR_WIDGET_LIGHT_SHADOW;
-    Color COLOR_WIDGET_NORMAL_SHADOW;
+    static Color COLOR_LIST_BACKGROUND;
+    static Color COLOR_LIST_FOREGROUND;
+    static Color COLOR_LIST_SELECTION;
+    static Color COLOR_LIST_SELECTION_TEXT;
+    static Color COLOR_TITLE_BACKGROUND;
+    static Color COLOR_TITLE_BACKGROUND_GRADIENT;
+    static Color COLOR_TITLE_FOREGROUND;
+    static Color COLOR_TITLE_INACTIVE_BACKGROUND;
+    static Color COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT;
+    static Color COLOR_TITLE_INACTIVE_FOREGROUND;
+    static Color COLOR_WIDGET_BACKGROUND;
+    static Color COLOR_WIDGET_BORDER;
+    static Color COLOR_WIDGET_DARK_SHADOW;
+    static Color COLOR_WIDGET_FOREGROUND;
+    static Color COLOR_WIDGET_HIGHLIGHT_SHADOW;
+    static Color COLOR_WIDGET_LIGHT_SHADOW;
+    static Color COLOR_WIDGET_NORMAL_SHADOW;
     
-    // Disposed state flag
+    // Disposed state flag, instance data
     protected boolean disposed;
     
+    // Initialized state flag
+    static boolean initialized;
+    
+	// Internal state flag telling if this is the application's instance
+	// or an internal one
+    boolean internal;
+    
     // Handle to the null Icon. Eventually set by Image.internal_getNullIconHandle
     static int nullIconHandle;
     
     // Default height for FontData
     static final int FONT_DEF_HEIGHT = 12;
-    
-    /*
-    * TEMPORARY CODE. When a graphics object is
-    * created and the device parameter is null,
-    * the current Display is used. This presents
-    * a problem because SWT graphics does not
-    * reference classes in SWT widgets. The correct
-    * fix is to remove this feature. Unfortunately,
-    * too many application programs rely on this
-    * feature.
-    *
-    * This code will be removed in the future.
-    */
-    protected static Device CurrentDevice;
-    protected static Runnable DeviceFinder;
+        
     static {
         try {
             Class.forName ("org.eclipse.swt.widgets.Display");
         } catch (Throwable e) {}
     }   
 
-/*
-* TEMPORARY CODE.
-*/
-static synchronized Device getDevice () {
-    if (DeviceFinder != null) DeviceFinder.run();
-    Device device = CurrentDevice;  
-    CurrentDevice = null;
-    return device;
-}
-
 /**
  * Constructs a new instance of this class.
  * <p>
@@ -128,7 +111,18 @@
  * @see DeviceData
  */
 public Device(DeviceData data) {
+	this(data, false);
+}
+
+/**
+ * <p>
+ * <b>IMPORTANT:</b> This constructor is <em>not</em> part of the SWT
+ * public API. It should never be referenced from application code.
+ * </p>
+ */
+protected Device(DeviceData data, boolean internal) {
     synchronized (Device.class) {
+    	this.internal = internal;
         if (data != null) {
             debug = data.debug;
             tracking = data.tracking;
@@ -141,6 +135,7 @@
         // In this order
         init();
         register(this);
+    	initialized = true;
     }
 }
 
@@ -220,6 +215,7 @@
             deregister(this);
         } finally {
             disposed = true;
+        	initialized = false;
         }
         if (tracking) {
             synchronized (trackingLock) {
@@ -567,51 +563,53 @@
  * @see #create
  */
 protected void init () {
-    int palette = OS.QApplication_swt_palette_new();
-    try {
-        int[] rgb;
-        
-        // List like widgets
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BASE);
-        COLOR_LIST_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_TEXT);
-        COLOR_LIST_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-    
-        // Highlight
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHT);
-        COLOR_LIST_SELECTION = new Color(this, rgb[0], rgb[1], rgb[2]);
-        COLOR_TITLE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);    
-        COLOR_TITLE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]);
-        COLOR_WIDGET_HIGHLIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHTTEXT);
-        COLOR_LIST_SELECTION_TEXT = new Color(this, rgb[0], rgb[1], rgb[2]);
-        COLOR_TITLE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-    
-        // Inactive highlight
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_HIGHLIGHT);
-        COLOR_TITLE_INACTIVE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-        COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]);
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_TEXT);
-        COLOR_TITLE_INACTIVE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-        
-        // Window
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOW);
-        COLOR_WIDGET_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOWTEXT);
-        COLOR_WIDGET_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
-        
-        // Shadows: Black <= Shadow < [Dark] < [Mid] < [Button] < Midlight < Light <= White
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_DARK);
-        COLOR_WIDGET_DARK_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);    
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_MID);
-        COLOR_WIDGET_BORDER = new Color(this, rgb[0], rgb[1], rgb[2]);
-        COLOR_WIDGET_NORMAL_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
-        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BUTTON);
-        COLOR_WIDGET_LIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
-    } finally {
-        OS.QPalette_delete(palette);
-    }
-    paintDevice = OS.QApplication_swt_desktopPaintDevice();
+	if(!initialized) {
+	    int palette = OS.QApplication_swt_palette_new();
+	    try {
+	        int[] rgb;
+	        
+	        // List like widgets
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BASE);
+	        COLOR_LIST_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_TEXT);
+	        COLOR_LIST_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	    
+	        // Highlight
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHT);
+	        COLOR_LIST_SELECTION = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        COLOR_TITLE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);    
+	        COLOR_TITLE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        COLOR_WIDGET_HIGHLIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHTTEXT);
+	        COLOR_LIST_SELECTION_TEXT = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        COLOR_TITLE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	    
+	        // Inactive highlight
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_HIGHLIGHT);
+	        COLOR_TITLE_INACTIVE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_TEXT);
+	        COLOR_TITLE_INACTIVE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        
+	        // Window
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOW);
+	        COLOR_WIDGET_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOWTEXT);
+	        COLOR_WIDGET_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        
+	        // Shadows: Black <= Shadow < [Dark] < [Mid] < [Button] < Midlight < Light <= White
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_DARK);
+	        COLOR_WIDGET_DARK_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);    
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_MID);
+	        COLOR_WIDGET_BORDER = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        COLOR_WIDGET_NORMAL_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
+	        rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BUTTON);
+	        COLOR_WIDGET_LIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]);
+	    } finally {
+	        OS.QPalette_delete(palette);
+	    }
+	    paintDevice = OS.QApplication_swt_desktopPaintDevice();
+	}
 }
 
 /**  
@@ -761,46 +759,47 @@
             OS.QIcon_delete( nullIconHandle );
             nullIconHandle = 0;
         }
+        COLOR_LIST_BACKGROUND.dispose();
+        COLOR_LIST_FOREGROUND.dispose();
+        COLOR_LIST_SELECTION.dispose();
+        COLOR_LIST_SELECTION_TEXT.dispose();
+        COLOR_TITLE_BACKGROUND.dispose();
+        COLOR_TITLE_BACKGROUND_GRADIENT.dispose();
+        COLOR_TITLE_FOREGROUND.dispose();
+        COLOR_TITLE_INACTIVE_BACKGROUND.dispose();
+        COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT.dispose();
+        COLOR_TITLE_INACTIVE_FOREGROUND.dispose();
+        COLOR_WIDGET_BACKGROUND.dispose();
+        COLOR_WIDGET_BORDER.dispose();
+        COLOR_WIDGET_DARK_SHADOW.dispose();
+        COLOR_WIDGET_FOREGROUND.dispose();
+        COLOR_WIDGET_HIGHLIGHT_SHADOW.dispose();
+        COLOR_WIDGET_LIGHT_SHADOW.dispose();
+        COLOR_WIDGET_NORMAL_SHADOW.dispose();
+        
+        COLOR_LIST_BACKGROUND = null;
+        COLOR_LIST_FOREGROUND = null;
+        COLOR_LIST_SELECTION = null;
+        COLOR_LIST_SELECTION_TEXT = null;
+        COLOR_TITLE_BACKGROUND = null;
+        COLOR_TITLE_BACKGROUND_GRADIENT = null;
+        COLOR_TITLE_FOREGROUND = null;
+        COLOR_TITLE_INACTIVE_BACKGROUND = null;
+        COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = null;
+        COLOR_TITLE_INACTIVE_FOREGROUND = null;
+        COLOR_WIDGET_BACKGROUND = null;
+        COLOR_WIDGET_BORDER = null;
+        COLOR_WIDGET_DARK_SHADOW = null;
+        COLOR_WIDGET_FOREGROUND = null;
+        COLOR_WIDGET_HIGHLIGHT_SHADOW = null;
+        COLOR_WIDGET_LIGHT_SHADOW = null;
+        COLOR_WIDGET_NORMAL_SHADOW = null;
+        
+        paintDevice = 0;
     }
     
     // Non static data follows
-    COLOR_LIST_BACKGROUND.dispose();
-    COLOR_LIST_FOREGROUND.dispose();
-    COLOR_LIST_SELECTION.dispose();
-    COLOR_LIST_SELECTION_TEXT.dispose();
-    COLOR_TITLE_BACKGROUND.dispose();
-    COLOR_TITLE_BACKGROUND_GRADIENT.dispose();
-    COLOR_TITLE_FOREGROUND.dispose();
-    COLOR_TITLE_INACTIVE_BACKGROUND.dispose();
-    COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT.dispose();
-    COLOR_TITLE_INACTIVE_FOREGROUND.dispose();
-    COLOR_WIDGET_BACKGROUND.dispose();
-    COLOR_WIDGET_BORDER.dispose();
-    COLOR_WIDGET_DARK_SHADOW.dispose();
-    COLOR_WIDGET_FOREGROUND.dispose();
-    COLOR_WIDGET_HIGHLIGHT_SHADOW.dispose();
-    COLOR_WIDGET_LIGHT_SHADOW.dispose();
-    COLOR_WIDGET_NORMAL_SHADOW.dispose();
-    
-    COLOR_LIST_BACKGROUND = null;
-    COLOR_LIST_FOREGROUND = null;
-    COLOR_LIST_SELECTION = null;
-    COLOR_LIST_SELECTION_TEXT = null;
-    COLOR_TITLE_BACKGROUND = null;
-    COLOR_TITLE_BACKGROUND_GRADIENT = null;
-    COLOR_TITLE_FOREGROUND = null;
-    COLOR_TITLE_INACTIVE_BACKGROUND = null;
-    COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = null;
-    COLOR_TITLE_INACTIVE_FOREGROUND = null;
-    COLOR_WIDGET_BACKGROUND = null;
-    COLOR_WIDGET_BORDER = null;
-    COLOR_WIDGET_DARK_SHADOW = null;
-    COLOR_WIDGET_FOREGROUND = null;
-    COLOR_WIDGET_HIGHLIGHT_SHADOW = null;
-    COLOR_WIDGET_LIGHT_SHADOW = null;
-    COLOR_WIDGET_NORMAL_SHADOW = null;
-    
-    paintDevice = 0;
+    // No non-static data to release
 }
 
 /**
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Font.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Font.java	Fri Jun 11 13:33:44 2010 +0300
@@ -173,7 +173,7 @@
             OS.QFont_delete(handle);
         }
         handle = 0;
-		if (device.tracking)
+		if (Device.tracking)
 			device.dispose_Object(this);
 		device = null;
 	}
@@ -260,8 +260,6 @@
 		extraFontStyle = false;
 		xlfd = null;
 		if (device == null)
-			device = Device.getDevice();
-		if (device == null)
 			SWT.error(SWT.ERROR_NULL_ARGUMENT);
 		this.device = device;
 		if (name == null)
@@ -270,7 +268,7 @@
 			SWT.error(SWT.ERROR_INVALID_ARGUMENT);
 
 		// Keep this after dealing with all exceptions!
-		if (device.tracking)
+		if (Device.tracking)
 			device.new_Object(this);
 
 		boolean italic = (style & SWT.ITALIC) != 0;
@@ -352,8 +350,6 @@
 		if (handle <= 0)
 			return null;
 		if (device == null)
-			device = Device.getDevice();
-		if (device == null)
 			SWT.error(SWT.ERROR_NULL_ARGUMENT);
 		Font font = new Font();
 		font.handle = handle;
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/GC.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/GC.java	Fri Jun 11 13:33:44 2010 +0300
@@ -322,9 +322,12 @@
  *                that created the drawable</li>
  */
 public void dispose() {
+	final Display display = (Display)data.device; 
+	if(display.getThread() != Thread.currentThread()) {
+		SWT.error(SWT.ERROR_THREAD_INVALID_ACCESS);
+	}
     if (drawable != null && handle != 0) {
         if (data.buffered && (drawable instanceof Control)) {
-            final Display display = Display.getDefault();
             display.syncExec(new Runnable() {
                 public void run() {
                     ((Control) drawable).redraw();
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Image.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/graphics/Image.java	Fri Jun 11 13:33:44 2010 +0300
@@ -160,7 +160,6 @@
      * @param device Device
      */
     Image(Device device) {
-        if (device == null) device = Device.getDevice();
         if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
         this.device = device;
     }
@@ -450,7 +449,7 @@
 
         if (device == null) return;
         if (device.isDisposed()) return;
-        if (device.tracking) device.dispose_Object(this);
+        if (Device.tracking) device.dispose_Object(this);
         device = null;
     }
 
@@ -820,6 +819,6 @@
      * Call this only after dealing with all exceptions!
      */
     private void track() {
-        if (device.tracking) device.new_Object(this);
+        if (Device.tracking) device.new_Object(this);
     }
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Button.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Button.java	Fri Jun 11 13:33:44 2010 +0300
@@ -162,7 +162,7 @@
     }
 
     void hookEvents_pp () {
-        int signalProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_CLICKED);
+        int signalProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_CLICKED);
         OS.QObject_connectOrThrow(handle, "clicked()", signalProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
     }
 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Combo.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Combo.java	Fri Jun 11 13:33:44 2010 +0300
@@ -127,12 +127,12 @@
 
     void register_pp() {
         super.register_pp();
-        display.addWidget(comboTextHandle, this);
+        Display.addWidget(comboTextHandle, this);
     }
 
     void deregister_pp() {
         super.deregister_pp();
-        display.removeWidget(comboTextHandle);
+        Display.removeWidget(comboTextHandle);
     }
 
     void releaseHandle_pp() {
@@ -307,18 +307,18 @@
         super.hookEvents_pp();
 
         int selectionSignalProxy = OS.SignalHandler_new(topHandle,
-                display, OS.QSIGNAL_SELECTIONCHANGED);
+                OS.QSIGNAL_SELECTIONCHANGED);
         OS.QObject_connectOrThrow(topHandle,
                 "currentIndexChanged(const QString&)", selectionSignalProxy,
                 "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
 
-        int returnPressedProxy = OS.SignalHandler_new(comboTextHandle, display,
+        int returnPressedProxy = OS.SignalHandler_new(comboTextHandle, 
                 OS.QSIGNAL_RETURN_PRESSED);
         OS.QObject_connectOrThrow(comboTextHandle, "returnPressed()",
                 returnPressedProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
 
         int modifySignalProxy = OS.SignalHandler_new(topHandle,
-                display, OS.QSIGNAL_TEXT_CHANGED);
+                OS.QSIGNAL_TEXT_CHANGED);
         OS.QObject_connectOrThrow(topHandle,
                 "editTextChanged(const QString&)", modifySignalProxy,
                 "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Composite.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Composite.java	Fri Jun 11 13:33:44 2010 +0300
@@ -326,7 +326,7 @@
     for(int i = 0; i < count; ++i) {
         int handle = list[i];
         if (handle != 0) {
-            Widget widget = display.getWidget (handle);
+            Widget widget = Display.getWidget (handle);
             if (widget != null && widget != this) {
                 if (widget instanceof Control && !(widget instanceof Shell)) {
                     children [childControls++] = (Control) widget;
@@ -519,7 +519,7 @@
         if(dx != 0) {
             Control[] children =_getChildren();
             try {
-                display.blockedQtEventType = OS.QSWTEVENT_WIDGETMOVED;
+                Display.blockedQtEventType = OS.QSWTEVENT_WIDGETMOVED;
                 for (int i = 0; i < children.length; ++i) {
                     Control child = children[i];
                     if (!child.isDisposed()) {
@@ -529,7 +529,7 @@
                     }
                 }
             } finally {
-                display.blockedQtEventType = OS.QEVENT_NONE;
+                Display.blockedQtEventType = OS.QEVENT_NONE;
             }
         }
     }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Control.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Control.java	Fri Jun 11 13:33:44 2010 +0300
@@ -847,7 +847,7 @@
 }
 
 boolean forceFocus(int focusReason) {
-    if (display.focusEvent == SWT.FocusOut) return false;
+    if (Display.focusEvent == SWT.FocusOut) return false;
     Decorations shell = menuShell();
     shell.setSavedFocus(this);
     if (!isEnabled() || !isVisible() || !isActive())
@@ -1424,7 +1424,7 @@
 }
 
 boolean isActive() {
-    Dialog dialog = display.getModalDialog();
+    Dialog dialog = Display.getModalDialog();
     if (dialog != null) {
         Shell dialogShell = dialog.parent;
         if (dialogShell != null && !dialogShell.isDisposed()) {
@@ -1433,7 +1433,7 @@
         }
     }
     Shell shell = null;
-    Shell[] modalShells = display.modalShells;
+    Shell[] modalShells = Display.modalShells;
     if (modalShells != null) {
         int bits = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
         int index = modalShells.length;
@@ -1735,7 +1735,7 @@
                 continue;
             }
             if (next) {
-                Widget widget = display.getWidget(children[iChild]);
+                Widget widget = Display.getWidget(children[iChild]);
                 if (widget != null && widget != this) {
                     if (widget instanceof org.eclipse.swt.widgets.Control) {
                         controlAbove = (Control) widget;
@@ -1985,7 +1985,7 @@
 }
 
 boolean qt_event_shortcut(int key, int modifier, int character) {
-    display.mnemonicControl = this;
+    Display.mnemonicControl = this;
     Control shortcutHandler = getShortcutHandler();
     if (shortcutHandler == null) {
         // If there's no shortcut handler then just activate the shortcut.
@@ -2001,24 +2001,24 @@
 
 void qt_swt_event_focusWasGained() {
     try {
-        display.focusEvent = SWT.FocusIn;
+        Display.focusEvent = SWT.FocusIn;
         sendEvent(SWT.FocusIn);
     } finally {
         if(display != null && !display.isDisposed()) {
-            display.focusEvent = SWT.None;
+            Display.focusEvent = SWT.None;
         }
     }
     if(display != null && !display.isDisposed()) {
-        display.commandArranger.focusedControlChanged();
+        Display.commandArranger.focusedControlChanged();
     }
 }
 void qt_swt_event_focusWasLost() {
     try {
-        display.focusEvent = SWT.FocusOut;
+        Display.focusEvent = SWT.FocusOut;
         sendEvent(SWT.FocusOut);
     } finally {
         if(display != null && !display.isDisposed()) {
-            display.focusEvent = SWT.None;
+            Display.focusEvent = SWT.None;
         }
     }
 }
@@ -2614,10 +2614,10 @@
         if (oldSize.x != width || oldSize.y != height) {
             if(isParentMirrored()) {
                 try {
-                    display.blockedQtEventType = OS.QSWTEVENT_WIDGETMOVED;
+                    Display.blockedQtEventType = OS.QSWTEVENT_WIDGETMOVED;
                     OS.QWidget_move(topHandle, oldPos.x - (width - oldSize.x), oldPos.y);
                 } finally {
-                    display.blockedQtEventType = OS.QEVENT_NONE;
+                    Display.blockedQtEventType = OS.QEVENT_NONE;
                 }
             }
             // This will send a resize event
@@ -2715,7 +2715,7 @@
     Control control = null;
     boolean fixFocus = false;
     if (!enabled) {
-        if (display.focusEvent != SWT.FocusOut) {
+        if (Display.focusEvent != SWT.FocusOut) {
             control = display.getFocusControl ();
             fixFocus = isFocusAncestor (control);
         }
@@ -3238,7 +3238,7 @@
     Control control = null;
     boolean fixFocus = false;
     if (!visible) {
-        if (display.focusEvent != SWT.FocusOut) {
+        if (Display.focusEvent != SWT.FocusOut) {
             control = display.getFocusControl ();
             fixFocus = isFocusAncestor (control);
         }
@@ -3396,7 +3396,7 @@
     // but if it's done then traversal is attempted relative to this control.
     // Normally it would be done relative to the control that had the
     // shortcut event.
-    display.mnemonicControl = this;
+    Display.mnemonicControl = this;
 
     return doTraversal(event);
 }
@@ -3479,9 +3479,9 @@
 
     // SWT checks for mnemonic hit here
 
-    if (display.mnemonicControl == null)
+    if (Display.mnemonicControl == null)
         return false;
-    Control nextControl = display.mnemonicControl.findNextControl(false);
+    Control nextControl = Display.mnemonicControl.findNextControl(false);
     if (nextControl != null) {
         nextControl.setFocus(OS.QT_TABFOCUSREASON);
         return true;
@@ -3576,9 +3576,9 @@
     // one event we are waiting for.
     OS.QApplication_syncX();
     // Make Qt process all XEvents.
-    display.noInterrupt = true;
+    Display.noInterrupt = true;
     OS.QCoreApplication_processEvents(Display.handle,
             OS.QEVENTLOOP_EXCLUDEUSERINPUTEVENTS);
-    display.noInterrupt = false;
+    Display.noInterrupt = false;
 }
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Decorations.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Decorations.java	Fri Jun 11 13:33:44 2010 +0300
@@ -681,7 +681,7 @@
         menuBar = menu;
         ownMenuBar = 0;
         //Inform CommandArranger
-        display.commandArranger.menuBarChanged( this );
+        Display.commandArranger.menuBarChanged( this );
     }
 }
 
@@ -767,7 +767,7 @@
 }
 
 void saveFocus () {
-    Control control = display._getFocusControl ();
+    Control control = Display._getFocusControl ();
     if (control != null && control != this && this == control.menuShell ()) {
         setSavedFocus (control);
     }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Display.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Display.java	Fri Jun 11 13:33:44 2010 +0300
@@ -113,7 +113,7 @@
 static int handle;
 
 /* QApplication event filter */
-int eventFilterHandle;
+static int eventFilterHandle;
 
 static final String SWT_OBJECT_INDEX = "swt_obj_idx";
 static final String ADD_WIDGET_KEY = "org.eclipse.swt.internal.addWidget";
@@ -121,32 +121,30 @@
 static final String IMAGE_LOAD_SIZE_KEY = "org.eclipse.swt.internal.image.loadSize";
 static final String SWT_EVENT_FILTER = "swt_event_filter";
 
-public CommandArranger commandArranger;
+static CommandArranger commandArranger;
 
-Event[] eventQueue;
-EventTable eventTable, filterTable;
+static Event[] eventQueue;
+static EventTable eventTable, filterTable;
 
-// Note that this won't work with multiple displays in the same process.
-// All the displays will have the same appname.
 static String APP_NAME;
 
 /* Widget Table */
-int[] indexTable;
-int freeSlot;
-int lastHandle;
-Widget lastWidget;
-Widget[] widgetTable;
+static int[] indexTable;
+static int freeSlot;
+static int lastHandle;
+static Widget lastWidget;
+static Widget[] widgetTable;
 final static int GROW_SIZE = 64;
 
-MobileDevice mobileDevice;
-int mobileDeviceHandle;
+static MobileDevice mobileDevice;
+static int mobileDeviceHandle;
 
 /* Modality */
-Shell [] modalShells;
-Dialog modalDialog;
+static Shell [] modalShells;
+static Dialog modalDialog;
 
 /* Sync/Async Widget Communication */
-Synchronizer synchronizer = new Synchronizer (this);
+static Synchronizer synchronizer;
 Thread thread;
 
 static Thread fixedUiThread;
@@ -155,29 +153,29 @@
 Runnable [] disposeList;
 
 /* System Tray */
-Tray tray;
+static Tray tray;
 
 /* Timers */
-int [] timerHandles;
-Runnable [] timerRunnables;
+static int [] timerHandles;
+static Runnable [] timerRunnables;
 
 /* Timestamp of the Last Received Event */
-int lastEventTime;
+static int lastEventTime;
 
 /* If not to interrupt event processing after every event */
-boolean noInterrupt;
+static boolean noInterrupt;
 
 /* Used to block one type of events temporarily */
-int blockedQtEventType;
+static int blockedQtEventType;
 
 /* Default orientation for Controls when style is not specified */
-int defaultOrientation;
-boolean defaultOrientationIsSysLangDirection;
+static int defaultOrientation;
+static boolean defaultOrientationIsSysLangDirection;
 
 // The next Image loaded by Image class constructors will be scaled to
 // this size. Can be set using Display.setData([key], Point). Useful
 // for SVG images. 
-private Point imageLoadSize;
+static private Point imageLoadSize;
 
 /* Key Mappings */
 static final int [] [] KeyTable = {
@@ -287,6 +285,7 @@
 
 /* Multiple Displays. */
 static Display Default;
+static Display Internal;
 static Display [] Displays = new Display [4];
 
 /* Package name */
@@ -299,48 +298,24 @@
 static final String INTERNAL_EXTENSION_PACKAGE_PREFIX = "org.eclipse.swt.internal.extension.";
 
 /* Display Data */
-Object data;
-String [] keys;
-Object [] values;
+static Object data;
+static String [] keys;
+static Object [] values;
 
 /* Last ShortcutOverride event parameters */
-int shortcutOverrideKey;
-int shortcutOverrideModifier;
-int shortcutOverrideCharacter;
+static int shortcutOverrideKey;
+static int shortcutOverrideModifier;
+static int shortcutOverrideCharacter;
 
 /* Last control that had a mnemonic hit i.e. shortcut event*/
-Control mnemonicControl;
+static Control mnemonicControl;
 
 /* It is stored here if we are currently in a focus event */
-int focusEvent;
+static int focusEvent;
 
 /* Settings event specific variables */
 static final int SETTINGS_DELAY = 2000;
-Runnable settingsRunnable;
-
-/*
-* TEMPORARY CODE.  Install the runnable that
-* gets the current display. This code will
-* be removed in the future.
-*/
-static {
-    DeviceFinder = new Runnable () {
-        public void run () {
-            Device device = getCurrent ();
-            if (device == null) {
-                device = getDefault ();
-            }
-            setDevice (device);
-        }
-    };
-}
-
-/*
-* TEMPORARY CODE.
-*/
-static void setDevice (Device device) {
-    CurrentDevice = device;
-}
+static Runnable settingsRunnable;
 
 /**
  * Constructs a new instance of this class.
@@ -374,6 +349,17 @@
     super(data);
 }
 
+private Display(DeviceData data, boolean internal) {
+	super(data, internal);
+}
+
+static Display internalInstance() {
+	if(Internal == null) {
+		Internal = new Display(null, true);
+	}
+	return Internal;
+}
+
 /**
  * Adds the listener to the collection of listeners who will
  * be notified when an event of the given type occurs anywhere
@@ -448,7 +434,7 @@
     eventTable.hook (eventType, listener);
 }
 
-void addWidget (int handle, Widget widget) {
+static void addWidget (int handle, Widget widget) {
     if (handle == 0) return;
     if (freeSlot == -1) {
         int length = (freeSlot = indexTable.length) + GROW_SIZE;
@@ -514,7 +500,7 @@
     OS.QApplication_beep();
 }
 
-private void checkDefaultOrientation(int sysLangDirection) {
+private static void checkDefaultOrientation(int sysLangDirection) {
     defaultOrientation = SWT.LEFT_TO_RIGHT;
     String s = System.getProperty("org.eclipse.ercp.swt.defaultOrientation");
     if (s != null) {
@@ -533,12 +519,14 @@
     if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
 }
 
-static void checkDisplay (Thread thread, boolean multiple) {
+final void checkDisplay (Thread thread, boolean multiple) {
     synchronized (Device.class) {
         for (int i=0; i<Displays.length; i++) {
             if (Displays [i] != null) {
-                if (!multiple) SWT.error (SWT.ERROR_NOT_IMPLEMENTED, null, " [multiple displays]");
-                if (Displays [i].thread == thread) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
+            	if(Internal_GfxPackageSupport.internal(this) == Internal_GfxPackageSupport.internal(Displays[i])) {
+            		if (!multiple) SWT.error (SWT.ERROR_NOT_IMPLEMENTED, null, " [multiple displays]");
+                    if (Displays [i].thread == thread) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
+            	}
             }
         }
         // On some platforms it's not supported to dispose the Display and
@@ -550,11 +538,11 @@
     }
 }
 
-void checkSubclass () {
+final void checkSubclass () {
     if (!isValidClass (getClass ())) error (SWT.ERROR_INVALID_SUBCLASS);
 }
 
-void clearModal (Shell shell) {
+final void clearModal (Shell shell) {
     if (modalShells == null) return;
     int index = 0, length = modalShells.length;
     while (index < length) {
@@ -590,7 +578,7 @@
     if (event.doit) dispose ();
 }
 
-void createDisplay() {
+static void createDisplay() {
     // It's possible that there's already a QApplication from an old Display
     // that has been disposed in an event listener but we were unable to delete
     // the QApplication there. If we are creating this Display from an event
@@ -603,7 +591,7 @@
 
     // Create the object that manages the JNI activity. It's only possible when
     // this object exists.
-    JniUtils.handle = OS.JniUtils_new(this);
+    JniUtils.handle = OS.JniUtils_new();
 
     handle = OS.QApplication_swt_new(JniUtils.handle);
     if(handle == 0) SWT.error(SWT.ERROR_UNSPECIFIED);
@@ -645,11 +633,24 @@
  * @see #release
  */
 protected void destroy () {
-    if (this == Default) Default = null;
+    boolean notifyExit;
+	if (notifyExit = (this == Default)) {
+    	Default = null;    	
+    } else if(this == Internal) {
+    	Internal = null;
+    }
     deregister (this);
-    GraphicsContext sharedGc = SharedGCWrapper.getSharedGC();
-    if(sharedGc != null && !sharedGc.isDisposed()) sharedGc.dispose();
-    destroyDisplay ();
+    if(Default == null && Internal == null) {
+	    GraphicsContext sharedGc = SharedGCWrapper.getSharedGC();
+	    if(sharedGc != null && !sharedGc.isDisposed()) sharedGc.dispose();
+	    destroyDisplay ();
+	    super.destroy();
+    }
+    if(notifyExit) {
+        // Notify MIDP runtime to watch that the MIDlet exits. 
+        // For other runtime environments this does nothing. 
+        ExitNotificationWrapper.notifyExit();
+    }
 }
 
 void destroyDisplay () {
@@ -657,10 +658,16 @@
     OS.EventHandler_destroy(eventFilterHandle);
     OS.QApplication_syncX();
     tryDestroy();
+}
 
-    // Notify MIDP runtime to watch that the MIDlet exits. 
-    // For other runtime environments this does nothing. 
-    ExitNotificationWrapper.notifyExit();
+int displayCount() {
+    int res = 0;
+    for (int i = 0; i < Displays.length; i++) {
+        if (Displays[i] != null && !Displays[i].isDisposed()) {
+            res++;
+        }
+    }
+    return res;
 }
 
 /**
@@ -706,7 +713,7 @@
 /*
  * This is the main event handler that is called by native code.
  */
-final boolean eventProcess(int widgetHandle, int eventType, int time,
+static boolean eventProcess(int widgetHandle, int eventType, int time,
         int arg1, int arg2, int arg3, int arg4, int arg5, String arg6) {
     // Silently let blocked events through
     if(blockedQtEventType == eventType) return false;
@@ -717,7 +724,7 @@
     // Get target widget or null if not found or is the Display
     Widget widget = ((widgetHandle == handle) ? null : getWidget ( widgetHandle ));
 
-    if(!noInterrupt && !isDisposed()) {
+    if(!noInterrupt) {
         interrupt();
     }
     
@@ -733,17 +740,17 @@
     }
 }
 
-boolean filterEvent (Event event) {
+static boolean filterEvent (Event event) {
     if (filterTable != null) filterTable.sendEvent (event);
     return false;
 }
 
-boolean filters (int eventType) {
+static boolean filters (int eventType) {
     if (filterTable == null) return false;
     return filterTable.hooks (eventType);
 }
 
-Control findControl (int handle) {
+static Control findControl (int handle) {
     if (handle == 0) return null;
     do {
         Widget widget = getWidget (handle);
@@ -767,7 +774,7 @@
     synchronized (Device.class) {
         for (int i=0; i<Displays.length; i++) {
             Display display = Displays [i];
-            if (display != null && display.thread == thread) {
+            if (display != null && display.thread == thread && !Internal_GfxPackageSupport.internal(display)) {
                 return display;
             }
         }
@@ -836,7 +843,7 @@
     return OS.QDesktopWidget_availableGeometry(OS.QApplication_desktop(), -1);
 }
 
-Control[] getControls()
+static Control[] getControls()
 {
     // Create a table of all Controls, no duplicates
     Control controlTable[] = new Control[widgetTable.length];
@@ -1007,7 +1014,7 @@
     return _getFocusControl ();
 }
 
-Control _getFocusControl () {
+static Control _getFocusControl () {
     return findControl( OS.QApplication_focusWidget() );
 }
 
@@ -1029,19 +1036,19 @@
     return super.getDepth();
 }
 
-int getLastEventTime () {
+static int getLastEventTime () {
     return lastEventTime;
 }
 
-int getMessageCount () {
+static int getMessageCount () {
     return synchronizer.getMessageCount ();
 }
 
-Dialog getModalDialog () {
+static Dialog getModalDialog () {
     return modalDialog;
 }
 
-Menu[] getMenus()
+static Menu[] getMenus()
 {
     // Create a table of all Menus, no duplicates
     Menu menuTable[] = new Menu[widgetTable.length];
@@ -1080,6 +1087,10 @@
  */
 public Shell [] getShells () {
     checkDevice ();
+    return getShells_();
+}
+
+static Shell[] getShells_() {
     int index = 0;
     Shell [] result = new Shell [16];
     for (int i = 0; i < widgetTable.length; i++) {
@@ -1103,7 +1114,7 @@
     if (index == result.length) return result;
     Shell [] newResult = new Shell [index];
     System.arraycopy (result, 0, newResult, 0, index);
-    return newResult;
+    return newResult;	
 }
 
 /**
@@ -1163,7 +1174,7 @@
     }
 }
 
-private final int getTimerHandleIndex(int timerHandle) {
+private static int getTimerHandleIndex(int timerHandle) {
     if(timerHandles == null) return -1;
     int index;
     for(index = 0; index < timerHandles.length; ++index) {
@@ -1174,7 +1185,7 @@
     return -1;
 }
 
-Widget getWidget (int handle) {
+static Widget getWidget (int handle) {
     if (handle == 0) return null;
     if (lastWidget != null && lastHandle == handle) return lastWidget;
     int index = OS.QObject_property( handle, SWT_OBJECT_INDEX) - 1;
@@ -1185,7 +1196,7 @@
     return null;
 }
 
-final private boolean handleNativeSwtEvent(Widget widget, int widgetHandle,
+static private boolean handleNativeSwtEvent(Widget widget, int widgetHandle,
         int eventType, int time, int arg1, int arg2, int arg3, int arg4,
         int arg5) {
 
@@ -1250,15 +1261,17 @@
     }
 }
 
-final private boolean handleQtEvent(Widget widget, int widgetHandle, int eventType,
+static private boolean handleQtEvent(Widget widget, int widgetHandle, int eventType,
         int arg1, int arg2, int arg3, int arg4, int arg5) {
 
     // These events are coming from an application event filter of QApplication.
     // The return value of this method will be returned by the filter.
+	
     if (eventType == OS.QEVENT_KEYPRESS && arg1 == OS.QT_KEY_NO) {
-        qt_key_event_endKeyPressed();
+    	qt_key_event_endKeyPressed();
         return false;
     }
+    
     if (widget == null) {
         return false;
     }
@@ -1331,7 +1344,7 @@
     }
 }
 
-final private boolean handleQtSignal(Widget widget, int widgetHandle,
+static private boolean handleQtSignal(Widget widget, int widgetHandle,
         int eventType, int arg1, int arg2, int arg3, int arg4, int arg5,
         String arg6) {
 
@@ -1525,8 +1538,8 @@
     }
 }
 
-void hookEvents() {
-    int focusSignalProxy = OS.SignalHandler_new(handle, this, OS.QSIGNAL_QAPPLICATION_FOCUSCHANGED);
+static void hookEvents() {
+    int focusSignalProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_QAPPLICATION_FOCUSCHANGED);
     OS.QObject_connectOrThrow(handle, "focusChanged(QWidget*, QWidget*)", focusSignalProxy,
             "widgetSignal(QWidget*, QWidget*)", OS.QT_AUTOCONNECTION);
 }
@@ -1534,16 +1547,21 @@
 protected void init () {
     checkSubclass ();
     checkDisplay(thread = Thread.currentThread (), false);
-    createDisplay();
-    commandArranger = new CommandArranger();
+    if(!Internal_GfxPackageSupport.initialized()) {
+    	createDisplay();
+	    synchronizer = new Synchronizer (this);
+	    commandArranger = new CommandArranger(this);
+    }
     register (this);
-    if (Default == null) Default = this;
+    if (Default == null && !Internal_GfxPackageSupport.internal(this)) Default = this;
     
     super.init ();
-    initializeWidgetTable ();
+    if(!Internal_GfxPackageSupport.initialized()) {
+    	initializeWidgetTable ();
+    }
 }
 
-void initializeWidgetTable () {
+static void initializeWidgetTable () {
     indexTable = new int [GROW_SIZE];
     widgetTable = new Widget [GROW_SIZE];
     for (int i=0; i<GROW_SIZE-1; i++) indexTable [i] = i + 1;
@@ -1607,7 +1625,7 @@
     return data.internalGc.getHandle();
 }
 
-void interrupt() {
+static void interrupt() {
     /*
      * Try to interrupt to make the native event processing methods return. By
      * default Qt processes all available events in one iteration. This is
@@ -1617,9 +1635,12 @@
      * event loop iterations and in each iteration several QEvents can get
      * dispatched.
      */
-    int threadHandle = OS.QObject_thread( Display.handle );
-    int dispatcher = OS.QAbstractEventDispatcher_instance( threadHandle );
-    OS.QAbstractEventDispatcher_interrupt( dispatcher );
+	synchronized(Device.class) {
+		if(handle == 0) return;
+	}
+    int threadHandle = OS.QObject_thread(handle);
+    int dispatcher = OS.QAbstractEventDispatcher_instance(threadHandle);
+    OS.QAbstractEventDispatcher_interrupt(dispatcher);
 }
 
 static boolean isValidClass (Class clazz) {
@@ -1972,7 +1993,7 @@
     return false;
 }
 
-void postEvent (Event event) {
+static void postEvent (Event event) {
     /*
     * Place the event at the end of the event queue.
     * This code is always called in the Display's
@@ -1994,7 +2015,7 @@
     eventQueue [index] = event;
 }
 
-void qt_signal_qapplication_focusChanged(int old, int now) {
+static void qt_signal_qapplication_focusChanged(int old, int now) {
     Widget oldWidget = null, nowWidget = null;
 
     if(old != 0) oldWidget = getWidget(old);
@@ -2015,7 +2036,7 @@
     }
 }
 
-void qt_signal_timer (int timerHandleIndex) {
+static void qt_signal_timer (int timerHandleIndex) {
     if (timerRunnables == null || timerHandles == null) return;
 
     Runnable runnable = timerRunnables [timerHandleIndex];
@@ -2031,19 +2052,22 @@
     if (runnable != null) runnable.run ();
 }
 
-
-void qt_key_event_endKeyPressed(){
-    close();
+static void qt_key_event_endKeyPressed() {
+    Event event = new Event ();
+    sendEvent (SWT.Close, event);
+    if (event.doit) {
+    	if(Default != null) {
+    		Default.dispose ();
+    	}
+    }
 }
 
-
-void qt_swt_event_systemShutdown(){
+static void qt_swt_event_systemShutdown(){
     Event event = new Event ();
     sendEvent (SWT.Close, event);
     ExitNotificationWrapper.notifyExit();
 }
 
-
 /**
  * Reads an event from the operating system's event queue,
  * dispatches it appropriately, and returns <code>true</code>
@@ -2091,10 +2115,10 @@
     return asyncRetVal;
 }
 
-Point readAndClearImageLoadSize() {
-	Point imageLoadSize = this.imageLoadSize;
-	this.imageLoadSize = null;
-	return imageLoadSize;
+static Point readAndClearImageLoadSize() {
+	Point ilSize = Display.imageLoadSize;
+	Display.imageLoadSize = null;
+	return ilSize;
 }
 
 static void register (Display display) {
@@ -2143,22 +2167,27 @@
         Shell shell = shells [i];
         if (!shell.isDisposed ())  shell.dispose ();
     }
-    commandArranger.dispose();
-    if (tray != null) tray.dispose ();
-    tray = null;
+    final boolean lastDisplay = (displayCount() == 1);
+    if(lastDisplay) {
+	    commandArranger.dispose();
+	    if (tray != null) tray.dispose ();
+	    tray = null;
+    }
     while (readAndDispatch ()) {}
     if (disposeList != null) {
         for (int i=0; i<disposeList.length; i++) {
             if (disposeList [i] != null) disposeList [i].run ();
         }
     }
-    disposeList = null;
-    synchronizer.releaseSynchronizer ();
-    synchronizer = null;
+    if(lastDisplay) {
+	    synchronizer.releaseSynchronizer ();
+	    synchronizer = null;
+	    lastWidget = null;
+	    indexTable = null;
+	    widgetTable = null;
+    }
     thread = null;
-    lastWidget = null;
-    indexTable = null;
-    widgetTable = null;
+    disposeList = null;
     super.release ();
 }
 
@@ -2222,7 +2251,7 @@
     eventTable.unhook (eventType, listener);
 }
 
-Widget removeWidget (int handle) {
+static Widget removeWidget (int handle) {
     if (handle == 0) return null;
     lastWidget = null;
     Widget widget = null;
@@ -2248,11 +2277,11 @@
     return disposed;
 }
 
-boolean runAsyncMessages (boolean all) {
+static boolean runAsyncMessages (boolean all) {
     return synchronizer.runAsyncMessages (all);
 }
 
-boolean runDeferredEvents () {
+static boolean runDeferredEvents () {
     /*
     * Run deferred events.  This code is always
     * called in the Display's thread so it must
@@ -2288,7 +2317,7 @@
     return true;
 }
 
-void runSettings () {
+static void runSettings () {
     Control[] controls = getControls();
     updateImages(controls);
     updateLayoutDirections(controls);
@@ -2296,7 +2325,7 @@
     for(int i = 0; i < controls.length; i++) {
         controls[i].doRedraw();
     }
-    Shell [] shells = getShells ();
+    Shell [] shells = getShells_();
     for(int i = 0; i < shells.length; i++) {
         Shell shell = shells [i];
         if(!shell.isDisposed ()) {
@@ -2316,12 +2345,12 @@
     return disposed;
 }
 
-void sendEvent (int eventType, Event event) {
+static void sendEvent (int eventType, Event event) {
     if (eventTable == null && filterTable == null) {
         return;
     }
     if (event == null) event = new Event ();
-    event.display = this;
+    event.display = Default;
     event.type = eventType;
     if (event.time == 0) event.time = getLastEventTime ();
     if (!filterEvent (event)) {
@@ -2350,13 +2379,13 @@
     return disposed;
 }
 
-final private void sendSettings()
-{
-    if(settingsRunnable != null) {
+static private void sendSettings() {
+    Display instance = Default != null ? Default : Internal;
+	if(settingsRunnable != null) {
         // Cancel the existing timer
-        timerExec(-1, settingsRunnable);
+        instance.timerExec(-1, settingsRunnable);
     }
-    timerExec(SETTINGS_DELAY, settingsRunnable = new Runnable() {
+    instance.timerExec(SETTINGS_DELAY, settingsRunnable = new Runnable() {
         public void run() {
             runSettings();
             settingsRunnable = null;
@@ -2374,7 +2403,7 @@
  */
 public static void setAppName (String name) {
     APP_NAME = name;
-    if (Display.getCurrent() != null) {
+    if (Display.handle != 0 && (!Default.disposed || !Internal.disposed)) {
         OS.QCoreApplication_setApplicationName(handle, name);
         OS.setSymbianAppName(name);
     }
@@ -2500,22 +2529,22 @@
  */
 public void setData (Object data) {
     checkDevice ();
-    this.data = data;
+    Display.data = data;
 }
 
-void setScreenPaintingAttributes(boolean on) {
+static void setScreenPaintingAttributes(boolean on) {
     OS.QWidget_setAttribute(OS.QApplication_desktop(), OS.QT_WA_PAINTOUTSIDEPAINTEVENT, on);
     OS.QWidget_setAttribute(OS.QApplication_desktop(), OS.QT_WA_PAINTONSCREEN, on);
     OS.QWidget_setAttribute(OS.QApplication_desktop(), OS.QT_WA_PAINTUNCLIPPED, on);
 }
 
-void setModalDialog (Dialog modalDialog) {
-    this.modalDialog = modalDialog;
-    Shell [] shells = getShells ();
+static void setModalDialog (Dialog modalDialog) {
+    Display.modalDialog = modalDialog;
+    Shell [] shells = getShells_();
     for (int i=0; i<shells.length; i++) shells [i].updateModal ();
 }
 
-void setModalShell (Shell shell) {
+static void setModalShell (Shell shell) {
     if (modalShells == null) modalShells = new Shell [4];
     int index = 0, length = modalShells.length;
     while (index < length) {
@@ -2529,7 +2558,7 @@
         modalShells = newModalShells;
     }
     modalShells [index] = shell;
-    Shell [] shells = getShells ();
+    Shell [] shells = getShells_();
     for (int i=0; i<shells.length; i++) shells [i].updateModal ();
 }
 
@@ -2551,11 +2580,11 @@
 public void setSynchronizer (Synchronizer synchronizer) {
     checkDevice ();
     if (synchronizer == null) error (SWT.ERROR_NULL_ARGUMENT);
-    if (synchronizer == this.synchronizer) return;
+    if (synchronizer == Display.synchronizer) return;
     Synchronizer oldSynchronizer;
     synchronized (Device.class) {
-        oldSynchronizer = this.synchronizer;
-        this.synchronizer = synchronizer;
+        oldSynchronizer = Display.synchronizer;
+        Display.synchronizer = synchronizer;
     }
     if (oldSynchronizer != null) {
         oldSynchronizer.runAsyncMessages(true);
@@ -2611,7 +2640,7 @@
     Synchronizer synchronizer;
     synchronized (Device.class) {
         if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-        synchronizer = this.synchronizer;
+        synchronizer = Display.synchronizer;
     }
     synchronizer.syncExec (runnable);
 }
@@ -2687,7 +2716,7 @@
     if (timerHandle != 0) {
         OS.QObject_setParent(timerHandle, handle); // QTimer is a child of QApplication
         OS.QTimer_setSingleShot(timerHandle, true);
-        int signalProxy = OS.SignalHandler_new(timerHandle, this, OS.QSIGNAL_TIMEOUT);
+        int signalProxy = OS.SignalHandler_new(timerHandle, OS.QSIGNAL_TIMEOUT);
         OS.QObject_connectOrThrow(timerHandle, "timeout()", signalProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
         OS.QTimer_start(timerHandle, milliseconds);
         timerHandles [index] = timerHandle;
@@ -2697,7 +2726,7 @@
 
 // Converts single mouse button from Qt to SWT for the MouseEvent.button
 // field which takes integers, 1, 2, 3, ...
-static final int translateButton(int nativeButton) {
+static int translateButton(int nativeButton) {
     switch(nativeButton) {
     case OS.QT_LEFTBUTTON:
         return 1;
@@ -2711,7 +2740,7 @@
 }
 
 // Converts a mask of buttons from Qt to SWT
-static final int translateButtons(int buttons) {
+static int translateButtons(int buttons) {
     int state = 0;
     if((buttons & OS.QT_LEFTBUTTON) != 0) state |= SWT.BUTTON1;
     if((buttons & OS.QT_MIDBUTTON) != 0) state |= SWT.BUTTON2;
@@ -2720,7 +2749,7 @@
 }
 
 // Converts keys from Qt to SWT
-static final int translateKey (int key, boolean keypad ) {
+static int translateKey (int key, boolean keypad ) {
     if( keypad ){
         for (int i=0; i<KeyPadKeyTable.length; i++) {
             if (KeyPadKeyTable [i] [0] == key) return KeyPadKeyTable [i] [1];
@@ -2733,7 +2762,7 @@
 }
 
 // Converts modifiers from Qt to SWT
-static final int translateModifiers(int nativeModifiers) {
+static int translateModifiers(int nativeModifiers) {
     int modifiers = 0;
     if ((nativeModifiers & OS.QT_ALTMODIFIER) != 0) modifiers |= SWT.ALT;
     if ((nativeModifiers & OS.QT_SHIFTMODIFIER) != 0) modifiers |= SWT.SHIFT;
@@ -2741,7 +2770,7 @@
     return modifiers;
 }
 
-static final int translateDirection(int orientation) {
+static int translateDirection(int orientation) {
     if(orientation ==  OS.QT_RIGHTTOLEFT) {
         return SWT.RIGHT_TO_LEFT;
     } else {
@@ -2750,7 +2779,7 @@
 }
 
 // Converts native scan code to key location (left/right) for CTRL/ALT/SHIFT/etc
-static final int translateKeyLocation(int nativeScanCode) {
+static int translateKeyLocation(int nativeScanCode) {
     
     if(OS.windowServer == OS.WS_SYMBIAN_S60) {
         switch (nativeScanCode) {
@@ -2787,7 +2816,13 @@
     return 0;
 }
 
-private final void tryDestroy() {
+private static void tryDestroy() {
+	// Do nothing if there are Displays that have not been disposed
+	if((Default != null && !Default.disposed) || 
+			(Internal != null && !Internal.disposed)) {
+		return;
+	}
+	
     // Destroy the QApplication only when all event loops have exited.
     if(handle != 0 && OS.SwtApplication_javaCallbackCount() == 0) {
         
@@ -2815,7 +2850,7 @@
 }
 
 // Converts mouse buttons from SWT to Qt
-static final int unTranslateButton(int button) {
+static int unTranslateButton(int button) {
     switch(button) {
     case 1:
         return OS.QT_LEFTBUTTON;
@@ -2829,7 +2864,7 @@
 }
 
 // Converts event types from SWT to Qt
-static final int unTranslateEventType(int type) {
+static int unTranslateEventType(int type) {
     switch (type) {
     case SWT.KeyDown:
         return OS.QEVENT_KEYPRESS;
@@ -2849,7 +2884,7 @@
 }
 
 // Converts keys from SWT to Qt
-public final static int untranslateKey (int key) {
+static int untranslateKey (int key) {
     for (int i=0; i<KeyTable.length; i++) {
         if (KeyTable [i] [1] == key) return KeyTable [i] [0];
     }
@@ -2860,7 +2895,7 @@
 }
 
 // Converts modifiers from SWT to Qt
-static final int unTranslateModifiers(int modifiers) {
+static int unTranslateModifiers(int modifiers) {
     int nativeModifiers = 0;
     if ((modifiers & SWT.ALT) != 0) nativeModifiers |= OS.QT_ALTMODIFIER;
     if ((modifiers & SWT.SHIFT) != 0) nativeModifiers |= OS.QT_SHIFTMODIFIER;
@@ -2886,13 +2921,13 @@
     }
 }
 
-void updateImages (Control[] controls) {
+static void updateImages (Control[] controls) {
     for(int i = 0; i < controls.length; ++i) {
         controls[i].updateImages();
     }
 }
 
-void updateLayoutDirection(Widget widget) {
+static void updateLayoutDirection(Widget widget) {
     // If the widget doesn't follow system language direction then leave it
     if((widget.state & WidgetState.FOLLOWS_SYSLANG_DIRECTION) != 0) {
         // Update the style flags. We already know LEFT_TO_RIGHT flag is not 
@@ -2913,7 +2948,7 @@
     }
 }
 
-void updateLayoutDirections(Control[] controls) {
+static void updateLayoutDirections(Control[] controls) {
     if(!defaultOrientationIsSysLangDirection) return;
     
     // Update the default orientation
@@ -2949,13 +2984,13 @@
     }
 }
 
-void wakeThread () {
+static void wakeThread () {
     int threadHandle = OS.QObject_thread( Display.handle );
     int dispatcher = OS.QAbstractEventDispatcher_instance( threadHandle );
     OS.QAbstractEventDispatcher_wakeup( dispatcher );
 }
 
-int initializeMobileDevice(){
+static int initializeMobileDevice(){
 	if(mobileDeviceHandle == 0){
 		mobileDeviceHandle = OS.MobileDevice_new();
 	}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Link.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Link.java	Fri Jun 11 13:33:44 2010 +0300
@@ -200,7 +200,7 @@
     
     void hookEvents_pp() {
         super.hookEvents_pp();
-        int signalProxy = OS.SignalHandler_new(handle, display,
+        int signalProxy = OS.SignalHandler_new(handle, 
                 OS.QSIGNAL_LINKACTIVATED);
         OS.QObject_connectOrThrow(handle, "linkActivated(const QString&)",
                 signalProxy, "widgetSignal(const QString&)",
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/List.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/List.java	Fri Jun 11 13:33:44 2010 +0300
@@ -195,14 +195,14 @@
         super.hookEvents_pp();
 
         int selectionSignalProxy = OS.SignalHandler_new(topHandle,
-                display, OS.QSIGNAL_LIST_ITEMSELECTION_CHANGED);
+                OS.QSIGNAL_LIST_ITEMSELECTION_CHANGED);
 
         OS.QObject_connectOrThrow(topHandle,
                 "itemSelectionChanged()", selectionSignalProxy,
                 "widgetSignal()", OS.QT_AUTOCONNECTION);
 
         int itemActivatedSignalProxy = OS.SignalHandler_new(topHandle,
-              display, OS.QSIGNAL_LIST_ITEM_ACTIVATED);
+              OS.QSIGNAL_LIST_ITEM_ACTIVATED);
 
         OS.QObject_connectOrThrow(topHandle,
               "itemActivated(QListWidgetItem* )", itemActivatedSignalProxy,
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Menu.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Menu.java	Fri Jun 11 13:33:44 2010 +0300
@@ -250,7 +250,7 @@
 public MenuItem getDefaultItem () {
     checkWidget();
     int actionHandle = OS.QMenu_defaultAction( handle );
-    Widget widget = display.getWidget( actionHandle );
+    Widget widget = Display.getWidget( actionHandle );
     if( widget != null){
         if (MenuItem.class.isInstance( widget ))
             return (MenuItem)widget;
@@ -300,7 +300,7 @@
     int indexOfLastMenuItem = -1;
     MenuItem itemAtIndex = null;
     for(int i = 0; i < actions.length; ++i) {
-    	Widget widget = display.getWidget(actions[i]);
+    	Widget widget = Display.getWidget(actions[i]);
     	if(widget != null && widget instanceof MenuItem) {
     		if(++indexOfLastMenuItem == index) {
     			itemAtIndex = (MenuItem)widget;
@@ -355,7 +355,7 @@
     for( int i = 0; i < count; ++i) {
         int handle = handles[i];
         if (handle != 0) {
-            Widget widget = display.getWidget (handle);
+            Widget widget = Display.getWidget (handle);
             if (widget != null && widget != this) {
                 if (widget instanceof MenuItem) {
                     children [items++] = (MenuItem) widget;
@@ -487,9 +487,9 @@
 void hookEvents_pp () {
     super.hookEvents_pp ();
     if ((style & SWT.BAR) == 0) {
-        int aboutToHideProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_ABOUTTOHIDE);
+        int aboutToHideProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_ABOUTTOHIDE);
         OS.QObject_connectOrThrow(handle, "aboutToHide()", aboutToHideProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
-        int aboutToShowProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_ABOUTTOSHOW);
+        int aboutToShowProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_ABOUTTOSHOW);
         OS.QObject_connectOrThrow(handle, "aboutToShow()", aboutToShowProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
     }
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/MenuItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/MenuItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -324,10 +324,10 @@
 void hookEvents_pp () {
     super.hookEvents_pp ();
     if ((style & SWT.CASCADE) == 0 ){
-        int triggeredProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_TRIGGERED);
+        int triggeredProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_TRIGGERED);
         OS.QObject_connectOrThrow(handle, "triggered(bool)", triggeredProxy, "widgetSignal(bool)", OS.QT_AUTOCONNECTION);
     }
-    int hoveredProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_HOVER );
+    int hoveredProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_HOVER );
     OS.QObject_connectOrThrow(handle, "hovered()", hoveredProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
 }
 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/ScrollBar.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/ScrollBar.java	Fri Jun 11 13:33:44 2010 +0300
@@ -847,15 +847,15 @@
 
     void hookEvents_pp() {
         super.hookEvents_pp();
-        int signalProxy = OS.SignalHandler_new(handle, display,
+        int signalProxy = OS.SignalHandler_new(handle, 
                 OS.QSIGNAL_SLIDER_CHANGED);
         OS.QObject_connectOrThrow(handle, "valueChanged(int)", signalProxy,
                 "widgetSignal(int)", OS.QT_AUTOCONNECTION);
-        signalProxy = OS.SignalHandler_new(handle, display,
+        signalProxy = OS.SignalHandler_new(handle, 
                 OS.QSIGNAL_SLIDER_ACTION_TRIGGERED);
         OS.QObject_connectOrThrow(handle, "actionTriggered(int)", signalProxy,
                 "widgetSignal(int)", OS.QT_AUTOCONNECTION);
-        signalProxy = OS.SignalHandler_new(handle, display,
+        signalProxy = OS.SignalHandler_new(handle, 
                 OS.QSIGNAL_SLIDER_RELEASED);
         OS.QObject_connectOrThrow(handle, "sliderReleased()", signalProxy,
                 "widgetSignal()", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Scrollable.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Scrollable.java	Fri Jun 11 13:33:44 2010 +0300
@@ -401,12 +401,12 @@
 
     void deregister_pp() {
         super.deregister_pp();
-        display.removeWidget(scrollAreaHandle);
+        Display.removeWidget(scrollAreaHandle);
     }
 
     void register_pp() {
         super.register_pp();
-        display.addWidget(scrollAreaHandle, this);
+        Display.addWidget(scrollAreaHandle, this);
     }
 
     void releaseHandle_pp() {
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java	Fri Jun 11 13:33:44 2010 +0300
@@ -604,9 +604,9 @@
     // Viewport & scroll area
     super.register_pp ();
     // Main window, if top-level
-    if(mainWindowHandle != 0) display.addWidget (mainWindowHandle, this);    
+    if(mainWindowHandle != 0) Display.addWidget (mainWindowHandle, this);    
     // Dialog window, if a dialog Shell
-    if(dialogWindowHandle != 0) display.addWidget (dialogWindowHandle, this);    
+    if(dialogWindowHandle != 0) Display.addWidget (dialogWindowHandle, this);    
 }
 
 void releaseParent_pp () {
@@ -911,7 +911,7 @@
 }
 
 void enableWidget(boolean enabled) {
-    Control oldFocus = display._getFocusControl();
+    Control oldFocus = Display._getFocusControl();
     super.enableWidget(enabled);
     if(!enabled) {
         // All children were looped through and disabled by QWidget unless they
@@ -969,11 +969,11 @@
    int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
     if ((style & mask) != 0) {
         if (visible) {
-            display.setModalShell (this);
+            Display.setModalShell (this);
             if ((style & (SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL)) != 0) {
-                display.setModalDialog (null);
+                Display.setModalDialog (null);
             }
-            Control control = display._getFocusControl();
+            Control control = Display._getFocusControl();
             if (control != null && !control.isActive()) {
                 bringToTop(false);
                 if (isDisposed()) return;
@@ -1029,10 +1029,10 @@
 void deregister_pp () {
     super.deregister_pp ();
     if(mainWindowHandle != 0) {
-        display.removeWidget(mainWindowHandle);
+        Display.removeWidget(mainWindowHandle);
     }
     if(dialogWindowHandle != 0) {
-        display.removeWidget(dialogWindowHandle);
+        Display.removeWidget(dialogWindowHandle);
     }
 }
 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Slider.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Slider.java	Fri Jun 11 13:33:44 2010 +0300
@@ -181,7 +181,7 @@
     }
 
     void hookEvents_pp() {
-        int signalProxy = OS.SignalHandler_new(handle, display,
+        int signalProxy = OS.SignalHandler_new(handle, 
                 OS.QSIGNAL_SLIDER_CHANGED);
         OS.QObject_connectOrThrow(handle, "valueChanged(int)", signalProxy,
                 "widgetSignal(int)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Table.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Table.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1255,23 +1255,23 @@
         super.hookEvents_pp ();
         
         if(!((style & SWT.SINGLE) != 0 && (style & SWT.RADIO) != 0 )){
-            int itemSelectionChangedProxy = OS.SignalHandler_new(topHandle, display,
+            int itemSelectionChangedProxy = OS.SignalHandler_new(topHandle, 
                 OS.QSIGNAL_TABLE_ITEMSELECTION_CHANGED);
             OS.QObject_connectOrThrow(topHandle, "itemSelectionChanged()", itemSelectionChangedProxy,
                 "widgetSignal()", OS.QT_AUTOCONNECTION);
         }
         
-        int currentCellChangedProxy = OS.SignalHandler_new(topHandle, display,
+        int currentCellChangedProxy = OS.SignalHandler_new(topHandle, 
                 OS.QSIGNAL_TABLE_CURRENTCELL_CHANGED);
         OS.QObject_connectOrThrow(topHandle, "currentCellChanged(int,int,int,int)", currentCellChangedProxy,
                 "widgetSignal(int,int,int,int)", OS.QT_AUTOCONNECTION);
         
-        int cellChangedProxy = OS.SignalHandler_new(topHandle, display,
+        int cellChangedProxy = OS.SignalHandler_new(topHandle, 
                 OS.QSIGNAL_TABLE_CELL_CHANGED);
         OS.QObject_connectOrThrow(topHandle, "cellChanged(int,int)", cellChangedProxy,
                 "widgetSignal(int,int)", OS.QT_AUTOCONNECTION);
         
-        int cellActivatedProxy = OS.SignalHandler_new(topHandle, display,
+        int cellActivatedProxy = OS.SignalHandler_new(topHandle, 
                 OS.QSIGNAL_TABLE_CELL_ACTIVATED);
         OS.QObject_connectOrThrow(topHandle, "cellActivated(int,int)", cellActivatedProxy,
                 "widgetSignal(int,int)", OS.QT_AUTOCONNECTION);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TableItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TableItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -212,7 +212,7 @@
             radioButtonHandle = OS.QRadioButton_new();
             OS.QObject_setProperty(radioButtonHandle, "swt_obj_idx", OS.QObject_property(parent.topHandle, "swt_obj_idx"));
             
-            int signalProxy = OS.SignalHandler_new(radioButtonHandle, display, OS.QSIGNAL_RELEASED);
+            int signalProxy = OS.SignalHandler_new(radioButtonHandle, OS.QSIGNAL_RELEASED);
             OS.QObject_connectOrThrow(radioButtonHandle, "released()", signalProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
             
             OS.QWidget_setFocusPolicy(radioButtonHandle, OS.QT_FOCUSPOLICY_NOFOCUS);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Text.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Text.java	Fri Jun 11 13:33:44 2010 +0300
@@ -423,7 +423,7 @@
 void deregister_pp () {  
     super.deregister_pp ();
     if (variant == TextUtils.TEXT_EDIT) {
-        display.removeWidget(scrollAreaHandle);
+        Display.removeWidget(scrollAreaHandle);
     }
 }
 
@@ -903,13 +903,13 @@
 
 void hookEvents_pp () {  
     super.hookEvents_pp();
-    int textChangedProxy = OS.SignalHandler_new(topHandle, display, OS.QSIGNAL_TEXT_CHANGED);
+    int textChangedProxy = OS.SignalHandler_new(topHandle, OS.QSIGNAL_TEXT_CHANGED);
     
     if (variant == TextUtils.LINE_EDIT) {
         OS.QObject_connectOrThrow(topHandle, "textChanged(const QString&)",
                 textChangedProxy, "widgetSignal(const QString&)", OS.QT_AUTOCONNECTION);
 
-        int returnPressedProxy = OS.SignalHandler_new(topHandle, display, OS.QSIGNAL_RETURN_PRESSED);
+        int returnPressedProxy = OS.SignalHandler_new(topHandle, OS.QSIGNAL_RETURN_PRESSED);
         OS.QObject_connectOrThrow(topHandle, "returnPressed()",
                 returnPressedProxy, "widgetSignal()", OS.QT_AUTOCONNECTION);
     } else {
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tray.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tray.java	Fri Jun 11 13:33:44 2010 +0300
@@ -140,7 +140,7 @@
 
 void releaseParent_pp () {
 	super.releaseParent_pp ();
-	if (display.tray == this) display.tray = null;
+	if (Display.tray == this) Display.tray = null;
 }
 
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TrayItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/TrayItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -180,7 +180,7 @@
 
 
 void hookEvents_pp () {
-    int activatedProxy = OS.SignalHandler_new(handle, display, OS.QSIGNAL_TRAY_ACTIVATED);
+    int activatedProxy = OS.SignalHandler_new(handle, OS.QSIGNAL_TRAY_ACTIVATED);
     OS.QObject_connectOrThrow(handle, "activated(QSystemTrayIcon::ActivationReason)", activatedProxy, "widgetSignal(QSystemTrayIcon::ActivationReason)", OS.QT_AUTOCONNECTION);
  }
 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tree.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tree.java	Fri Jun 11 13:33:44 2010 +0300
@@ -648,14 +648,14 @@
         super.hookEvents_pp();
 
         int selectionSignalProxy = OS.SignalHandler_new(topHandle,
-                display, OS.QSIGNAL_TREE_ITEMSELECTION_CHANGED);
+                OS.QSIGNAL_TREE_ITEMSELECTION_CHANGED);
 
         OS.QObject_connectOrThrow(topHandle,
                 "itemSelectionChanged()", selectionSignalProxy,
                 "widgetSignal()", OS.QT_AUTOCONNECTION);
 
         int itemActivatedSignalProxy = OS.SignalHandler_new(
-                topHandle, display, OS.QSIGNAL_TREE_ITEM_ACTIVATED);
+                topHandle, OS.QSIGNAL_TREE_ITEM_ACTIVATED);
 
         OS.QObject_connectOrThrow(topHandle,
                 "itemActivated(QTreeWidgetItem*,int)",
@@ -663,14 +663,14 @@
                 OS.QT_AUTOCONNECTION);
 
         int itemExpandedSignalProxy = OS.SignalHandler_new(
-                topHandle, display, OS.QSIGNAL_TREE_ITEM_EXPANDED);
+                topHandle, OS.QSIGNAL_TREE_ITEM_EXPANDED);
 
         OS.QObject_connectOrThrow(topHandle,
                 "itemExpanded(QTreeWidgetItem*)", itemExpandedSignalProxy,
                 "widgetSignal(QTreeWidgetItem*)", OS.QT_AUTOCONNECTION);
 
         int itemCollapsedSignalProxy = OS.SignalHandler_new(
-                topHandle, display, OS.QSIGNAL_TREE_ITEM_COLLAPSED);
+                topHandle, OS.QSIGNAL_TREE_ITEM_COLLAPSED);
 
         OS.QObject_connectOrThrow(topHandle,
                 "itemCollapsed(QTreeWidgetItem*)", itemCollapsedSignalProxy,
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Widget.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Widget.java	Fri Jun 11 13:33:44 2010 +0300
@@ -185,7 +185,7 @@
 }
 
 final void addWidget (int handle) {
-    display.addWidget(handle, this);
+    Display.addWidget(handle, this);
 }
 
 final void checkOrientation (Widget parent) {
@@ -204,14 +204,14 @@
         } else {
             // Use the default determined by a system property. 
             // Setting RIGHT_TO_LEFT flag triggers the coordinate mirroring. 
-            if(display.defaultOrientation != SWT.LEFT_TO_RIGHT) {
-                style |= display.defaultOrientation;
+            if(Display.defaultOrientation != SWT.LEFT_TO_RIGHT) {
+                style |= Display.defaultOrientation;
             }
             
             // If there's no parent this widget follows the system language 
             // direction if that's the default behavior configured by a system 
             // property. 
-            if(display.defaultOrientationIsSysLangDirection)
+            if(Display.defaultOrientationIsSysLangDirection)
                 state |= WidgetState.FOLLOWS_SYSLANG_DIRECTION;
         }
     }
@@ -328,7 +328,7 @@
 }
 
 void deregister_pp () {
-    if (handle != 0) display.removeWidget (handle);
+    if (handle != 0) Display.removeWidget (handle);
 }
 
 void destroyWidget () {
@@ -377,7 +377,7 @@
 }
 
 final boolean filters (int eventType) {
-    return display.filters (eventType);
+    return Display.filters (eventType);
 }
 
 static final Command[] getCommands(Control control) {
@@ -874,7 +874,7 @@
 
 void register_pp () {
     if (handle == 0) return;
-    if ((state & WidgetState.HANDLE) != 0) display.addWidget (handle, this);
+    if ((state & WidgetState.HANDLE) != 0) Display.addWidget (handle, this);
 }
 
 void release (boolean destroy) {
@@ -1019,12 +1019,12 @@
 }
 
 final Widget removeWidget (int handle) {
-    return display.removeWidget(handle);
+    return Display.removeWidget(handle);
 }
 
 final void sendEvent (Event event) {
     Display display = event.display;
-    if (!display.filterEvent (event)) {
+    if (!Display.filterEvent (event)) {
         if (eventTable != null) eventTable.sendEvent (event);
     }
 }
@@ -1038,7 +1038,7 @@
 }
 
 final void sendEvent (int eventType, Event event, boolean send) {
-    if (eventTable == null && !display.filters (eventType)) {
+    if (eventTable == null && !Display.filters (eventType)) {
         return;
     }
     if (event == null) event = new Event ();
@@ -1046,12 +1046,12 @@
     event.display = display;
     event.widget = this;
     if (event.time == 0) {
-        event.time = display.getLastEventTime ();
+        event.time = Display.getLastEventTime ();
     }
     if (send) {
         sendEvent (event);
     } else {
-        display.postEvent (event);
+        Display.postEvent (event);
     }
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/linux/org/eclipse/swt/internal/qt/midp/UIThreadLauncher.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.qt.midp;
+
+/**
+ * Linux specific implementation of launching the UI thread for a MIDlet. 
+ */
+public final class UIThreadLauncher {
+	public static boolean startInUIThread(Runnable runnable) {
+		new Thread(runnable, "SwtQtUiThread").start();
+		return true;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/linux/org/eclipse/swt/internal/qt/s60/S60CommandPresentationStrategy.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,178 @@
+package org.eclipse.swt.internal.qt.s60;
+
+import org.eclipse.ercp.swt.mobile.Command;
+import org.eclipse.swt.internal.qt.CommandPresentationStrategy;
+import org.eclipse.swt.internal.qt.CommandUtils;
+import org.eclipse.swt.internal.qt.OS;
+import org.eclipse.swt.internal.qt.CommandArranger.CommandCollection;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Widget;
+
+public class S60CommandPresentationStrategy extends CommandPresentationStrategy {
+    private Command[] positiveKeyCommands;
+    private Command negativeKeyCommand;
+    private Command defaultCommand;
+
+    public S60CommandPresentationStrategy() {
+        super();
+    }
+
+    protected void dispose() {
+        positiveKeyCommands = null;
+        negativeKeyCommand = null;
+        defaultCommand =null;
+    }
+
+
+    protected void handleCommandListChange(Command added, Command removed,
+            CommandCollection commands) {
+        cleanNegativeCommand();
+        cleanPositiveCommands();
+        updateCommandPositions(commands.getCommands(null));
+        placeNegativeCommand();
+        placePositiveCommands();
+    }
+
+    protected void handleDefaultCommandChange(Command defaultCommand) {
+        this.defaultCommand = defaultCommand;
+        cleanPositiveCommands();
+        placePositiveCommands();
+    }
+
+
+    protected void handleFocusChange(Control focused,
+            CommandCollection oldCommands, CommandCollection commands) {
+
+        //Clean-up the existing commands
+        cleanPositiveCommands();
+        cleanNegativeCommand();
+        //determine where the commands go
+        if( commands != null && commands.getSize()>0 ){
+            Command[] add = commands.getCommands(null);
+            updateCommandPositions(add);
+        }
+        //Place them to their places
+        placePositiveCommands();
+        placeNegativeCommand();
+
+    }
+
+    private void updateCommandPositions(Command[] commands) {
+        positiveKeyCommands = new Command[commands.length];
+        int  positiveKeyIndex=0;
+        for (int i = 0; i < commands.length; i++) {
+            Command cmd = commands[i];
+            if ( cmd.isDefaultCommand()){
+                defaultCommand = cmd;
+                continue;
+            }
+            if( CommandUtils.isNegativeType(cmd.type) ){
+                if (negativeKeyCommand == null || negativeKeyCommand.isDisposed()){
+                    negativeKeyCommand = cmd;
+                }else
+                if( negativeKeyCommand.getPriority() <= cmd.getPriority() ){
+                    positiveKeyCommands[positiveKeyIndex] = negativeKeyCommand;
+                    positiveKeyIndex++;
+                    negativeKeyCommand = cmd;
+                }else{
+                    positiveKeyCommands[positiveKeyIndex] = cmd;
+                    positiveKeyIndex++;
+                }
+                continue;
+            }
+            positiveKeyCommands[positiveKeyIndex]=cmd;
+            positiveKeyIndex++;
+        }
+        if ((positiveKeyIndex) < positiveKeyCommands.length ){// needs to shrink
+            Command[] rightSized = new Command[positiveKeyIndex];
+            System.arraycopy(positiveKeyCommands, 0, rightSized, 0, rightSized.length);
+            positiveKeyCommands = rightSized;
+        }
+    }
+
+
+    private void cleanPositiveCommands() {
+        boolean useBar = false;
+        if ( (positiveKeyCommands != null && positiveKeyCommands.length >1) ||
+                (defaultCommand != null && positiveKeyCommands != null) ){
+            useBar = true;
+        }
+        if (defaultCommand != null && !defaultCommand.isDisposed()
+                && !defaultCommand.control.isDisposed()) {
+            if (useBar) {
+                OS.QWidget_removeAction(defaultCommand.control.getShell()
+                        .internal_getOwnMenuBar(), topHandle(defaultCommand));
+            }
+            else{
+                 OS.QWidget_removeAction(topHandle(defaultCommand.control), topHandle(defaultCommand));
+            }
+        }
+        if (positiveKeyCommands != null) {
+            for (int i = 0; i < positiveKeyCommands.length; i++) {
+                Command cmd = positiveKeyCommands[i];
+                if (cmd == null || cmd.isDisposed()  || cmd.control.isDisposed()){
+                	continue;
+                }
+                int handle = 0;
+                if (useBar) {
+                    handle = cmd.control.getShell().internal_getOwnMenuBar();
+                } else {
+                    handle = topHandle(positiveKeyCommands[0].control);
+                }
+                OS.QWidget_removeAction(handle, topHandle(cmd));
+
+            }
+        }
+    }
+
+   private void cleanNegativeCommand() {
+        if(negativeKeyCommand != null && !negativeKeyCommand.isDisposed() && !negativeKeyCommand.control.isDisposed() ){
+            OS.QWidget_removeAction(topHandle(negativeKeyCommand.control), topHandle(negativeKeyCommand));
+        }
+    }
+
+    private void placeNegativeCommand() {
+        if(negativeKeyCommand != null ){
+            OS.QWidget_addAction(Internal_PackageSupport.topHandle(negativeKeyCommand.control),
+                    topHandle(negativeKeyCommand));
+        }
+    }
+
+    private void placePositiveCommands() {
+        if (defaultCommand != null ) {
+            int defaultCmdHandle = topHandle(defaultCommand);
+            if (positiveKeyCommands != null) {
+                OS.QMenuBar_addAction(defaultCommand.control.getShell()
+                        .internal_getOwnMenuBar(), defaultCmdHandle);
+            } else {
+                OS.QWidget_addAction(Internal_PackageSupport
+                        .topHandle(defaultCommand.control), defaultCmdHandle);
+            }
+        }
+        if (positiveKeyCommands != null) {
+            if (positiveKeyCommands.length == 1 && defaultCommand == null) {
+                OS.QWidget_addAction(Internal_PackageSupport
+                        .topHandle(positiveKeyCommands[0].control),
+                        topHandle(positiveKeyCommands[0]));
+            } else {
+                CommandUtils.sort(positiveKeyCommands);
+                for (int i = 0; i < positiveKeyCommands.length; i++) {
+                    OS.QMenuBar_addAction(positiveKeyCommands[i].control
+                            .getShell().internal_getOwnMenuBar(),
+                            topHandle(positiveKeyCommands[i]));
+                }
+            }
+        }
+    }
+
+    protected void handleMenuBarChanged(int newMenuBar,
+            CommandCollection commands) {
+        placePositiveCommands();
+    }
+
+
+    private static final int topHandle(Widget w) {
+        return Internal_PackageSupport.topHandle(w);
+    }
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eswt_widgets.pri	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eswt_widgets.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -9,14 +9,21 @@
 #     Nokia Corporation - initial implementation
 #*******************************************************************************
 
+QT += core \
+      gui
+
+DEFINES += SWTQT_LIBRARY
+
 INCLUDEPATH += $$PWD
 DEPENDPATH += $$PWD
 
-HEADERS += eventcallback.h \
+HEADERS += \
+    eventcallback.h \
     slotcallback.h \
     swtlog.h \
     jniutils.h \
     swt.h \
+    swterror.h \
     autorelease.h \
     listdatamodel.h \
     qcaptionedwidget.h \
@@ -26,11 +33,11 @@
     qswttabwidget.h \
     execexceptionhandler.h \
     swtfontcache.h \
-    swtbufferflushevent.h
-
+    swtbufferflushevent.h \
+    swtexport.h
 
-
-SOURCES += eventcallback.cpp \
+SOURCES += \
+    eventcallback.cpp \
     slotcallback.cpp \
     os.cpp \
     swtlog.cpp \
@@ -45,29 +52,33 @@
 
 ##### Symbian specific items ######
 symbian {
-
-CONFIG += mobility
-MOBILITY += bearer
-
-HEADERS += swts60.h \
-	swtmobiledevice.h \
-    swtflipwatch.h
-
-SOURCES += swts60.cpp \
-	swtmobiledevice.cpp \
-    swtflipwatch.cpp
+    CONFIG += mobility
+    MOBILITY += bearer
+    
+    HEADERS += \
+        swts60.h \
+    	swtmobiledevice.h \
+        swtflipwatch.h
     
-LIBS += -leikcore
-LIBS += -lapparc
-LIBS += -lavkon
-LIBS += -lefsrv
-LIBS += -lcone
-LIBS += -leikcoctl
-LIBS += -lapgrfx
-LIBS += -lHWRMVibraClient
-LIBS += -lHWRMLightClient
-LIBS += -lxqservice
-LIBS += -lxqtelephonyservice
-LIBS += -lQtContacts
-
+    SOURCES += \
+        swts60.cpp \
+    	swtmobiledevice.cpp \
+        swtflipwatch.cpp
+        
+    LIBS += \
+        -leikcore \
+        -lapparc \
+        -lavkon \
+        -lefsrv \
+        -lcone \
+        -leikcoctl \
+        -lapgrfx \
+        -lHWRMVibraClient \
+        -lHWRMLightClient \
+        -lxqservice \
+        -lxqtelephonyservice \
+        -lQtContacts \
+        -lhal \
+        -lws32 \
+        -lgdi
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eventcallback.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/eventcallback.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -17,7 +17,6 @@
 #include "eventcallback.h"
 #include "swtlog.h"
 #include "jniutils.h"
-#include "swt.h"
 #include "swtapplication.h"
 
 using namespace Java::eSWT;
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/gfxos.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/gfxos.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -388,6 +388,19 @@
     GFX_CATCH
 }
 
+JNIEXPORT void JNICALL Java_org_eclipse_swt_internal_qt_graphics_OS_graphicsContext_1drawWindowSurface
+  (JNIEnv* aJniEnv, jclass, jint aHandle, jint aSurfaceHandle, jint aX, jint aY, jint aWidth, jint aHeight) 
+{
+    GFX_TRY
+    {
+        GFX_LOG_JNI_CALL();
+        HANDLE_TO_POINTER(GraphicsContext*, gc, aHandle);
+        HANDLE_TO_POINTER(WindowSurface*, surface, aSurfaceHandle);
+        gc->drawWindowSurface(surface, aX, aY, aWidth, aHeight);
+    }
+    GFX_CATCH
+}
+
 void JNICALL Java_org_eclipse_swt_internal_qt_graphics_OS_graphicsContext_1fillArc
   (JNIEnv* aJniEnv , jclass, jint aHandle, jint aX, jint aY, jint aWidth, jint aHeight, jint aStartAngle, jint aArcAngle)
 {
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.h	Fri Jun 11 13:33:44 2010 +0300
@@ -153,8 +153,9 @@
 {
     WsTypeUnknown       = 0x0000,  // unknonwn or uninitialized type
     WsTypeQtImage       = 0x0001,  // QImage
-    WsTypeSymbianBitmap = 0x0002,  // CFbsBitmap
-    WsTypeEglSurface    = 0x0004   // EGL surface
+    WsTypeQtPixmap      = 0x0002,  // QPixmap
+    WsTypeSymbianBitmap = 0x0004,  // CFbsBitmap
+    WsTypeEglSurface    = 0x0016   // EGL surface
 };
 
 
@@ -629,6 +630,17 @@
         int aLength, int aAlignments, int aFlags, bool aIsTransparent) = 0;
 
     /**
+     * Draws given window surface to current target.
+     * 
+     * @param aSurface The WindowSurface to draw
+     * @param aX The x-coordinate of the area to draw
+     * @param aY The y-coordinate of the area to draw
+     * @param aWidth The width of the area to draw
+     * @param aHeigth The height of the area to draw
+     */
+    virtual void drawWindowSurface(WindowSurface* aSurface, int aX, int aY, int aWidth, int aHeight) = 0;
+	
+    /**
      * Fill interior of circular or elliptical arc within specified rectangular area.
      *
      * @param aX The x coordinate of top left corner of arc rectangle
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.pri	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphics.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -27,13 +27,20 @@
     $$PWD/qt/graphicscontextimpl.h \
     $$PWD/qt/bufferimpl.h \
     $$PWD/qt/targetobserver.h \
-    $$PWD/qt/windowsurfaceimpl.h \
     $$PWD/gfxlog.h \
     $$PWD/graphics.h \
-    $$PWD/gfxutils.h
+    $$PWD/gfxutils.h \
+    $$PWD/qt/windowsurfaceimpl_linux.h \
+    $$PWD/qt/windowsurfaceimpl_symbian.h
+
+symbian {
+    HEADERS -= $$PWD/qt/windowsurfaceimpl_linux.h
+}
+!symbian {
+    HEADERS -= $$PWD/qt/windowsurfaceimpl_symbian.h
+}
 
 SOURCES += $$PWD/qt/surfaceimpl.cpp \
-    $$PWD/qt/windowsurfaceimpl.cpp \
     $$PWD/qt/pixmap.cpp \
     $$PWD/qt/imageloaderimpl.cpp \
     $$PWD/qt/imagedataimpl.cpp \
@@ -43,8 +50,14 @@
     $$PWD/qt/targetobserver.cpp \
     $$PWD/graphicsfactory.cpp \
     $$PWD/gfxos.cpp \
-    $$PWD/gfxutils.cpp
+    $$PWD/gfxutils.cpp \
+    $$PWD/qt/windowsurfaceimpl_linux.cpp \
+    $$PWD/qt/windowsurfaceimpl_symbian.cpp
 
 symbian {
-LIBS += -llibEGL
+    SOURCES -= $$PWD/qt/windowsurfaceimpl_linux.cpp
+    LIBS += -llibEGL
 }
+!symbian {
+    SOURCES -= $$PWD/qt/windowsurfaceimpl_symbian.cpp
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphicsfactory.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/graphicsfactory.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -16,9 +16,14 @@
 #include "imageloaderimpl.h"
 #include "imagedataimpl.h"
 #include "palettedataimpl.h"
-#include "windowsurfaceimpl.h"
 #include "gfxlog.h"
 
+#ifdef __SYMBIAN32__
+#include "windowsurfaceimpl_symbian.h"
+#else
+#include "windowsurfaceimpl_linux.h"
+#endif
+
 namespace Java { namespace GFX {
 
 /*static*/ WindowSurface* GraphicsFactory::createWindowSurface(QPaintDevice* aSurface, WindowSurfaceType aType)
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -915,6 +915,22 @@
     mPainter->restore();
 }
 
+void GraphicsContextImpl::drawWindowSurface(WindowSurface* aSurface, int aX, int aY, int aWidth, int aHeight)
+{
+    GFX_LOG_FUNC_CALL();
+    QRect area(aX, aY, aWidth, aHeight);
+    switch(aSurface->getType())
+    {
+        case WsTypeQtImage:
+        {  
+            mPainter->drawImage(area, *aSurface->getQtImage(), area);
+            break;
+        }
+        default:
+            return;   
+    }
+}
+
 void GraphicsContextImpl::fillArc(int aX, int aY, int aWidth, int aHeight, int aStartAngle, int aArcAngle)
 {
     GFX_LOG_FUNC_CALL();
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/graphicscontextimpl.h	Fri Jun 11 13:33:44 2010 +0300
@@ -65,6 +65,7 @@
     virtual void drawString(
         const unsigned short* aText, int aX, int aY, int aWidth, int aHeight,
         int aLength, int aAlignments, int aFlags, bool aIsTransparent);
+    virtual void drawWindowSurface(WindowSurface* aSurface, int aX, int aY, int aWidth, int aHeight);
     virtual void fillArc(int aX, int aY, int aWidth, int aHeight, int aStartAngle, int aArcAngle);
     virtual void fillEllipse(int aX, int aY, int aWidth, int aHeight);
     virtual void fillGradientRect(int aX, int aY, int aWidth, int aHeight, bool aVertical, bool aSwapColors);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl.cpp	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Nokia Corporation - initial API and implementation
- *******************************************************************************/
-
-//#include <QtOpenGL>
-#include <QWidget>
-#include <QPainter>
-#include <QPaintEngine>
-#include "windowsurfaceimpl.h"
-#include "gfxlog.h"
-
-namespace Java { namespace GFX {
-
-WindowSurfaceImpl::WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType)
-: mIsBound(false),
-  mBufferedRendering(false),
-  mAutoRefresh(false),
-  mPaintingStarted(false)
-{
-    GFX_LOG_FUNC_CALL();
-    mMainSurface.device = aSurface;
-    mMainSurface.type = aType;
-}
-
-WindowSurfaceImpl::WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh)
-: mIsBound(false),
-  mBufferedRendering(false),
-  mAutoRefresh(false),
-  mPaintingStarted(false)
-{
-    GFX_LOG_FUNC_CALL();
-    if(aWidget == NULL) 
-    {
-        throw GfxException(EGfxErrorIllegalArgument, "Target widget is NULL");
-    }
-    mMainSurface.widget = aWidget;
-    mAutoRefresh = aAutoRefresh;
-    updateSurfaceData();   
-}
-
-
-WindowSurfaceImpl::~WindowSurfaceImpl()
-{
-    GFX_LOG_FUNC_CALL();
-    if(mMainSurface.localSurface != NULL)
-    {
-        delete mMainSurface.localSurface;
-        mMainSurface.localSurface = NULL;
-    }
-}
-
-void WindowSurfaceImpl::beginPaint(int aX, int aY, int aWidth, int aHeight)
-{
-    if(mAutoRefresh && (mMainSurface.widget != NULL)) 
-    {
-        updateSurfaceData();
-    }
-#ifdef __SYMBIAN32__
-    if(!mMainSurface.localSurfaceInUse)
-    {
-        QRegion region(aX, aY, aWidth, aHeight);
-        mMainSurface.qSurface->beginPaint(region);
-        // In case local surface was used last round
-        // and we now have Qt's window surface again
-        // delete the local surface to save memory
-        if(mMainSurface.localSurface != NULL)
-        {
-            delete mMainSurface.localSurface;
-            mMainSurface.localSurface = NULL;
-        }
-    }
-#endif
-    mPaintingStarted = true;
-}
-
-void WindowSurfaceImpl::endPaint()
-{
-#ifdef __SYMBIAN32__
-    if(!mMainSurface.localSurfaceInUse)
-    {
-        mMainSurface.qSurface->endPaint(QRegion());
-    }
-#endif
-    mPaintingStarted = false;
-}
-
-void WindowSurfaceImpl::flush()
-{
-#ifdef __SYMBIAN32__
-    if(!mMainSurface.localSurfaceInUse)
-    { 
-        QRegion region(0,0,mMainSurface.device->width(), mMainSurface.device->height());  
-        mMainSurface.qSurface->flush(mMainSurface.widget, region, QPoint());
-    }
-#endif
-}
-
-void WindowSurfaceImpl::bind(int aCapabilies)
-{
-    GFX_LOG_FUNC_CALL();
-    // Bind is not allowed if beginPaint has not been called
-    if(!mPaintingStarted)
-    {
-        throw GfxException(EGfxErrorIllegalState, "beginPaint() not called before bind()");
-    }
-    
-    switch (mMainSurface.type)
-    {
-        case WsTypeQtImage:
-        {
-            mBufferedRendering = true;
-            break;
-        }
-        
-        case WsTypeEglSurface:
-        {
-            // If caller does not support EGL surface
-            // create temp buffer to be used as target and
-            // copy pixels from window surface to temp buffer
-            if ((aCapabilies & WsTypeEglSurface) == 0) {
-                // TODO copy pixels from EGL surface to 
-                // QImage created here
-                
-            } else {
-                // Caller supports EGL surface, so just 
-                // save EGL state here
-                saveEglState();
-            }
-            break;
-        }
-        case WsTypeSymbianBitmap:
-        {
-            break;
-        }
-        default:
-        {
-            // we should newer get here
-        }
-    }
-    mIsBound = true;
-}
-
-int WindowSurfaceImpl::getType()
-{
-    GFX_LOG_FUNC_CALL();
-    return mMainSurface.type;
-}
-
-QPaintDevice* WindowSurfaceImpl::getDevice()
-{
-    return mMainSurface.device;
-}
-
-#ifdef __SYMBIAN32__
-EGLSurface WindowSurfaceImpl::getEglSurface()
-{
-    return mEgl.drawSurface;
-}
-
-EGLenum WindowSurfaceImpl::getEglApi()
-{
-    return mEgl.api;
-}
-
-CFbsBitmap* WindowSurfaceImpl::getSymbianBitmap()
-{
-    return mMainSurface.symbianBitmap;
-}
-#endif
-
-QImage* WindowSurfaceImpl::getQtImage()
-{
-    return mMainSurface.localSurface;
-}
-
-void WindowSurfaceImpl::refresh()
-{
-    updateSurfaceData();
-}
-
-void WindowSurfaceImpl::release()
-{
-    GFX_LOG_FUNC_CALL();
-    if (!mIsBound)
-    {
-        return;
-    }
-
-    if (mBufferedRendering)
-    {
-        // TODO draw QImage with painter to actual target
-    }
-    else
-    {
-        if(mMainSurface.type == WsTypeEglSurface)
-        {
-            restoreEglState();
-        }
-        // pixels are already rendered to the target
-        // no post blitter hook needed
-    }
-    mIsBound = false;
-}
-
-void WindowSurfaceImpl::dispose()
-{
-    GFX_LOG_FUNC_CALL();
-    delete this;
-}
-
-void WindowSurfaceImpl::saveEglState()
-{
-#ifdef __SYMBIAN32__
-    // Some painter needs to be active on the device
-    // in order to get correct data from EGL, so if 
-    // there's no active painter, activate one here
-    if(!mMainSurface.device->paintingActive())
-    {
-        mPainter.begin(mMainSurface.device);
-    }
-    mEgl.drawSurface = eglGetCurrentSurface(EGL_DRAW);
-    mEgl.readSurface = eglGetCurrentSurface(EGL_READ);
-    mEgl.context = eglGetCurrentContext();
-    mEgl.api = eglQueryAPI();
-#endif
-}
-    
-void WindowSurfaceImpl::restoreEglState()
-{
-#ifdef __SYMBIAN32__
-    eglBindAPI(mEgl.api);
-    eglMakeCurrent(EGL_DEFAULT_DISPLAY, mEgl.drawSurface, mEgl.readSurface, mEgl.context);
-    mEgl.drawSurface = EGL_NO_SURFACE;
-    mEgl.readSurface = EGL_NO_SURFACE;
-    mEgl.context = EGL_NO_CONTEXT;
-    
-    // if owned painter was activate to the device 
-    // release it
-    if(mPainter.isActive())
-    {
-        mPainter.end();
-    }
-#endif
-}
-
-// Private methods
-
-void WindowSurfaceImpl::createLocalSurface(int aWidth, int aHeight)
-{
-    mMainSurface.localSurface = new QImage(aWidth, aHeight, QImage::Format_ARGB32);
-    if(mMainSurface.localSurface->isNull()) 
-    {   
-        throw GfxException(EGfxErrorNoMemory, "Local Surface creation failed");
-    }   
-}
-
-void WindowSurfaceImpl::deleteLocalSurface()
-{
-    if(mMainSurface.localSurface != NULL)
-    {
-        delete mMainSurface.localSurface;
-        mMainSurface.localSurface = NULL;
-    }
-    
-}
-
-bool WindowSurfaceImpl::isLocalSurfaceValid()
-{
-    if(mMainSurface.localSurface == NULL)
-    {
-        return false;
-    }
-    
-    if((mMainSurface.localSurfaceInUse) && 
-       (mMainSurface.localSurface->width() == mMainSurface.widget->width()) && 
-       (mMainSurface.localSurface->height() == mMainSurface.widget->height()))
-    {
-        return true;
-    }
-    return false;
-}
-
-void WindowSurfaceImpl::updateSurfaceData()
-{   
-#ifdef __SYMBIAN32__
-    // If painting is active, i.e. beginPaint has been called 
-    // surface data is not updated
-    if(mPaintingStarted)
-    {
-        return;
-    }   
-    QWindowSurface* surface = mMainSurface.widget->windowSurface();
-    
-    // If window surface is null it means that the widget has been 
-    // sent to background and widget's window surface has been deleted, 
-    // in such case create own QImage as local surface in order to support 
-    // rendering in background
-    if(surface == NULL || surface == 0)
-    {
-        // check if we already have local surface with valid size
-        if(!isLocalSurfaceValid()) 
-        {
-            // incase we have invalid surface delete the current one
-            // and create new
-            if(mMainSurface.localSurfaceInUse) 
-            {
-                deleteLocalSurface();
-            }
-            createLocalSurface(mMainSurface.widget->width(), mMainSurface.widget->height());
-            // set info
-            mMainSurface.qSurface = NULL;
-            mMainSurface.device = mMainSurface.localSurface;
-            mMainSurface.type = WsTypeQtImage;
-            mMainSurface.localSurfaceInUse = true;
-            return;
-        }
-        else 
-        {
-            // We have valid local surface so just return
-            return;
-        }
-    }
-    else 
-    {
-        // We got Qt's window surface, so in case we had local surface in use
-        // delete it as it's not used anymore
-        if(mMainSurface.localSurfaceInUse)
-        {
-            deleteLocalSurface();
-        }
-    }
-    
-    // We got window surface so extract information
-    QPaintDevice* device = surface->paintDevice();
-    if(device->paintingActive())
-    {
-        throw GfxException(EGfxErrorIllegalState, "Internal error: Device active when refreshing data");  
-    }
-    
-    // Attach painter to device in oder to see which type 
-    // of device it is working on
-    mPainter.begin(device);
-    QPaintEngine* engine = mPainter.paintEngine();
-    
-    // determine the surface type based on the engine used
-    // as Qt does not provide exact info of the surface type
-    switch (engine->type())
-    {
-        case QPaintEngine::OpenVG:
-            // surface is EGL window surface
-            mMainSurface.type = WsTypeEglSurface;
-            break;
-        case QPaintEngine::Raster:
-            mMainSurface.type = WsTypeSymbianBitmap;
-            if(device->devType() == QInternal::Pixmap)
-            {
-                QPixmap* pixmap = static_cast<QPixmap*>(device);
-                mMainSurface.symbianBitmap = pixmap->toSymbianCFbsBitmap();
-            }
-            else 
-            {
-                throw GfxException(EGfxErrorIllegalArgument, "Unsupported device type");
-            }
-            break;
-        default:
-            throw GfxException(EGfxErrorIllegalArgument, "Unsupported widget window surface type");
-            break;
-    }
-    
-    // release painter
-    mPainter.end();
-    mMainSurface.qSurface = surface;
-    mMainSurface.device = device;
-    mMainSurface.localSurfaceInUse = false;
-#endif
-}
-
-
-} // namespace GFX
-} // namespace Java
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl.h	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Nokia Corporation - initial API and implementation
- *******************************************************************************/
-#ifndef WINDOWSURFACEQT_H_
-#define WINDOWSURFACEQT_H_
-
-#include "graphics.h"
-
-#ifdef __SYMBIAN32__
-#include "qwindowsurface_p.h"
-#else
-class QWindowSurface;
-#endif
-
-namespace Java { namespace GFX {
-
-class WindowSurfaceImpl: public WindowSurface
-{
-public:
-   /**
-    * Ctor for paint device
-    * @param surface The paindevice of Qt render surface
-    * @param type The type of the surface 
-    */
-    WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType);
-    
-    /**
-     * Ctor for window owning widgets
-     * @param aWidget The target widget that this window surface is created on
-     * @param aAutoRefresh If true the Qt window surface pointer is updated each time
-     *                     the bind is called, otherwise not 
-     */
-    WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh);
-
-   /**
-    * Dtor
-    */
-    virtual ~WindowSurfaceImpl();
-    
-    /**
-     * From WindowSurface
-     * @see WindowSurface
-     */
-    virtual void bind(int aCapabilies = WsTypeQtImage) ;
-    virtual void beginPaint(int aX, int aY, int aWidth, int aHeight);
-    virtual void endPaint();
-    virtual void flush();
-    virtual int getType();
-    virtual QPaintDevice* getDevice();
-#ifdef __SYMBIAN32__
-    virtual EGLSurface getEglSurface();
-    virtual EGLenum getEglApi();
-#endif
-    virtual QImage* getQtImage();
-    virtual void refresh();
-    virtual void release();
-    virtual void dispose();
-    
-#ifdef __SYMBIAN32__
-    virtual CFbsBitmap* getSymbianBitmap();
-#endif
-    
-
-private:
-    
-    /**
-     * Creates and activates local off-screen buffer for rendering 
-     * in background mode
-     */
-    void createLocalSurface(int aWidth, int aHeight);
-    
-    /**
-     * Deletes local surface
-     */
-    void deleteLocalSurface();
-    
-    /**
-     * Checks that local surface size is correct
-     */
-    bool isLocalSurfaceValid();
-    
-    /**
-     * Updates window surface info, i.e. fetches info from Qt
-     */
-    void updateSurfaceData();
-    
-    /**
-     * Saves current EGL state
-     */
-    void saveEglState();
-    
-    /**
-     * Restores previously saved EGL state
-     */
-    void restoreEglState();
-    
-#ifdef __SYMBIAN32__    
-    struct surfaceData
-    {
-        // The window surface that Qt has created
-        QWindowSurface* qSurface;
-        // The paint device QWindowSurface has
-        QPaintDevice* device;
-        // The Target widget which owns the QWindowSurface
-        QWidget* widget;
-        // Local surface used when widget is in background
-        // and QWindowSurface is not available
-        QImage* localSurface;
-        // The symbian bitmap used in a case where
-        // the widget is parially visible and Qt switches 
-        // to software rendering
-        CFbsBitmap* symbianBitmap;
-        // The current type of the target surface
-        WindowSurfaceType type;
-        // Indicates if local surface is used
-        bool localSurfaceInUse;
-        surfaceData() : qSurface(NULL),
-                        device(NULL), 
-                        widget(NULL),
-                        localSurface(NULL),
-                        symbianBitmap(NULL),
-                        type(WsTypeUnknown),
-                        localSurfaceInUse(false)
-        {}
-    };
-#else
-    struct surfaceData
-    {
-        QWindowSurface* qSurface;
-        QPaintDevice* device;
-        QWidget* widget;
-        QImage* localSurface;
-        WindowSurfaceType type;  
-        bool localSurfaceInUse;
-        surfaceData() : qSurface(NULL),
-                        device(NULL), 
-                        widget(NULL),
-                        localSurface(NULL),
-                        type(WsTypeUnknown),
-                        localSurfaceInUse(false)
-        {}
-    };
-#endif
-    
-    /**
-     * Data collection for EGL surface
-     */
-    struct eglData
-    {
-#ifdef __SYMBIAN32__
-        EGLSurface drawSurface;
-        EGLSurface readSurface;
-        EGLContext context;
-        EGLenum api;
-        eglData() : drawSurface(EGL_NO_SURFACE),
-                    readSurface(EGL_NO_SURFACE),
-                    context(EGL_NO_CONTEXT),
-                    api(EGL_OPENGL_ES_API)
-        {}
-#endif
-    };
-    
-    surfaceData mMainSurface;
-    eglData mEgl;
-    QPainter mPainter;
-    bool mIsBound;
-    bool mBufferedRendering;
-    bool mAutoRefresh;
-    bool mPaintingStarted;
-};
-
-} // namespace GFX
-} // namespace Java
-
-#endif /*WINDOWSURFACEQT_H_*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_linux.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial API and implementation
+ *******************************************************************************/
+
+#include <QWidget>
+#include <QPainter>
+#include <QPaintEngine>
+#include "windowsurfaceimpl_linux.h"
+#include "gfxlog.h"
+
+namespace Java { namespace GFX {
+
+WindowSurfaceImpl::WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType)
+: mIsBound(false),
+  mBufferedRendering(false),
+  mAutoRefresh(false),
+  mPaintingStarted(false)
+{
+    GFX_LOG_FUNC_CALL();
+    mMainSurface.device = aSurface;
+    mMainSurface.type = aType;
+}
+
+WindowSurfaceImpl::WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh)
+: mIsBound(false),
+  mBufferedRendering(false),
+  mAutoRefresh(false),
+  mPaintingStarted(false)
+{
+    GFX_LOG_FUNC_CALL();
+    if(aWidget == NULL) 
+    {
+        throw GfxException(EGfxErrorIllegalArgument, "Target widget is NULL");
+    }
+    mMainSurface.widget = aWidget;
+    mAutoRefresh = aAutoRefresh;
+    updateSurfaceData();   
+}
+
+
+WindowSurfaceImpl::~WindowSurfaceImpl()
+{
+    GFX_LOG_FUNC_CALL();
+    if(mMainSurface.localSurface != NULL)
+    {
+        delete mMainSurface.localSurface;
+        mMainSurface.localSurface = NULL;
+    }
+}
+
+void WindowSurfaceImpl::beginPaint(int aX, int aY, int aWidth, int aHeight)
+{
+    if(mAutoRefresh && (mMainSurface.widget != NULL)) 
+    {
+        updateSurfaceData();
+    }
+    mPaintingStarted = true;
+}
+
+void WindowSurfaceImpl::endPaint()
+{
+    // nothing to do
+}
+
+void WindowSurfaceImpl::flush()
+{
+    // nothing to do
+}
+
+void WindowSurfaceImpl::bind(int aCapabilies)
+{
+    GFX_LOG_FUNC_CALL();
+    // Bind is not allowed if beginPaint has not been called
+    if(!mPaintingStarted)
+    {
+        throw GfxException(EGfxErrorIllegalState, "beginPaint() not called before bind()");
+    }
+    mIsBound = true;
+}
+
+int WindowSurfaceImpl::getType()
+{
+    GFX_LOG_FUNC_CALL();
+    return mMainSurface.type;
+}
+
+QPaintDevice* WindowSurfaceImpl::getDevice()
+{
+    if(mMainSurface.localSurfaceInUse) 
+    {
+        return mMainSurface.localSurface;
+    }
+    else 
+    {
+        return mMainSurface.device;
+    }
+}
+
+QImage* WindowSurfaceImpl::getQtImage()
+{
+    return mMainSurface.localSurface;
+}
+
+void WindowSurfaceImpl::refresh()
+{
+    updateSurfaceData();
+}
+
+void WindowSurfaceImpl::release()
+{
+    GFX_LOG_FUNC_CALL();
+    if (!mIsBound)
+    {
+        return;
+    }
+    // nothing to do
+    mIsBound = false;
+}
+
+void WindowSurfaceImpl::dispose()
+{
+    GFX_LOG_FUNC_CALL();
+    delete this;
+}
+
+
+// Private methods
+void WindowSurfaceImpl::createLocalSurface(int aWidth, int aHeight)
+{
+    mMainSurface.localSurface = new QImage(aWidth, aHeight, QImage::Format_ARGB32);
+    if(mMainSurface.localSurface->isNull()) 
+    {   
+        throw GfxException(EGfxErrorNoMemory, "Local Surface creation failed");
+    }   
+}
+
+void WindowSurfaceImpl::deleteLocalSurface()
+{
+    if(mMainSurface.localSurface != NULL)
+    {
+        delete mMainSurface.localSurface;
+        mMainSurface.localSurface = NULL;
+    }
+    
+}
+
+bool WindowSurfaceImpl::isLocalSurfaceValid()
+{
+    if(mMainSurface.localSurface == NULL)
+    {
+        return false;
+    }
+    
+    if((mMainSurface.localSurfaceInUse) && 
+       (mMainSurface.localSurface->width() == mMainSurface.widget->width()) && 
+       (mMainSurface.localSurface->height() == mMainSurface.widget->height()))
+    {
+        return true;
+    }
+    return false;
+}
+
+void WindowSurfaceImpl::updateSurfaceData()
+{   
+    // If painting is active, i.e. beginPaint has been called 
+    // surface data is not updated
+    if(mPaintingStarted)
+    {
+        return;
+    }   
+    // check if we already have local surface with valid size
+    if(!isLocalSurfaceValid()) 
+    {
+    	// incase we have invalid surface delete the current one
+        // and create new
+        if(mMainSurface.localSurfaceInUse) 
+        {
+            deleteLocalSurface();
+        }
+        createLocalSurface(mMainSurface.widget->width(), mMainSurface.widget->height());
+        // set info
+        mMainSurface.qSurface = NULL;
+        mMainSurface.device = mMainSurface.localSurface;
+        mMainSurface.type = WsTypeQtImage;
+        mMainSurface.localSurfaceInUse = true;
+        return;
+    }
+    else 
+    {
+        // We have valid local surface so just return
+        return;
+    }
+}
+
+
+} // namespace GFX
+} // namespace Java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_linux.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial API and implementation
+ *******************************************************************************/
+#ifndef WINDOWSURFACEQT_H_
+#define WINDOWSURFACEQT_H_
+
+#include "graphics.h"
+
+namespace Java { namespace GFX {
+
+class WindowSurfaceImpl: public WindowSurface
+{
+public:
+   /**
+    * Ctor for paint device
+    * @param surface The paindevice of Qt render surface
+    * @param type The type of the surface 
+    */
+    WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType);
+    
+    /**
+     * Ctor for window owning widgets
+     * @param aWidget The target widget that this window surface is created on
+     * @param aAutoRefresh If true the Qt window surface pointer is updated each time
+     *                     the bind is called, otherwise not 
+     */
+    WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh);
+
+   /**
+    * Dtor
+    */
+    virtual ~WindowSurfaceImpl();
+    
+    /**
+     * From WindowSurface
+     * @see WindowSurface
+     */
+    virtual void bind(int aCapabilies = WsTypeQtImage) ;
+    virtual void beginPaint(int aX, int aY, int aWidth, int aHeight);
+    virtual void endPaint();
+    virtual void flush();
+    virtual int getType();
+    virtual QPaintDevice* getDevice();
+    virtual QImage* getQtImage();
+    virtual void refresh();
+    virtual void release();
+    virtual void dispose();
+
+private:
+    
+    /**
+     * Creates and activates local off-screen buffer for rendering 
+     * in background mode
+     */
+    void createLocalSurface(int aWidth, int aHeight);
+    
+    /**
+     * Deletes local surface
+     */
+    void deleteLocalSurface();
+    
+    /**
+     * Checks that local surface size is correct
+     */
+    bool isLocalSurfaceValid();
+    
+    /**
+     * Updates window surface info, i.e. fetches info from Qt
+     */
+    void updateSurfaceData();
+
+    struct surfaceData
+    {
+        QWindowSurface* qSurface;
+        QPaintDevice* device;
+        QWidget* widget;
+        QImage* localSurface;
+        WindowSurfaceType type;  
+        bool localSurfaceInUse;
+        surfaceData() : qSurface(NULL),
+                        device(NULL), 
+                        widget(NULL),
+                        localSurface(NULL),
+                        type(WsTypeUnknown),
+                        localSurfaceInUse(false)
+        {}
+    };
+
+    
+    surfaceData mMainSurface;
+    QPainter mPainter;
+    bool mIsBound;
+    bool mBufferedRendering;
+    bool mAutoRefresh;
+    bool mPaintingStarted;
+};
+
+} // namespace GFX
+} // namespace Java
+
+#endif /*WINDOWSURFACEQT_H_*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_symbian.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,372 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial API and implementation
+ *******************************************************************************/
+
+//#include <QtOpenGL>
+#include <QWidget>
+#include <QPainter>
+#include <QPaintEngine>
+#include "windowsurfaceimpl_symbian.h"
+#include "gfxlog.h"
+
+namespace Java { namespace GFX {
+
+WindowSurfaceImpl::WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType)
+: mIsBound(false),
+  mBufferedRendering(false),
+  mAutoRefresh(false),
+  mPaintingStarted(false)
+{
+    GFX_LOG_FUNC_CALL();
+    mMainSurface.device = aSurface;
+    mMainSurface.type = aType;
+}
+
+WindowSurfaceImpl::WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh)
+: mIsBound(false),
+  mBufferedRendering(false),
+  mAutoRefresh(false),
+  mPaintingStarted(false)
+{
+    GFX_LOG_FUNC_CALL();
+    if(aWidget == NULL) 
+    {
+        throw GfxException(EGfxErrorIllegalArgument, "Target widget is NULL");
+    }
+    mMainSurface.widget = aWidget;
+    mAutoRefresh = aAutoRefresh;
+    updateSurfaceData();   
+}
+
+
+WindowSurfaceImpl::~WindowSurfaceImpl()
+{
+    GFX_LOG_FUNC_CALL();
+    if(mMainSurface.localSurface != NULL)
+    {
+        delete mMainSurface.localSurface;
+        mMainSurface.localSurface = NULL;
+    }
+}
+
+void WindowSurfaceImpl::beginPaint(int aX, int aY, int aWidth, int aHeight)
+{
+    if(mAutoRefresh && (mMainSurface.widget != NULL)) 
+    {
+        updateSurfaceData();
+    }
+    if(!mMainSurface.localSurfaceInUse)
+    {
+        QRegion region(aX, aY, aWidth, aHeight);
+        mMainSurface.qSurface->beginPaint(region);
+        // In case local surface was used last round
+        // and we now have Qt's window surface again
+        // delete the local surface to save memory
+        if(mMainSurface.localSurface != NULL)
+        {
+            delete mMainSurface.localSurface;
+            mMainSurface.localSurface = NULL;
+        }
+    }
+    mPaintingStarted = true;
+}
+
+void WindowSurfaceImpl::endPaint()
+{
+    if(!mMainSurface.localSurfaceInUse)
+    {
+        mMainSurface.qSurface->endPaint(QRegion());
+    }
+    mPaintingStarted = false;
+}
+
+void WindowSurfaceImpl::flush()
+{
+    if(!mMainSurface.localSurfaceInUse)
+    { 
+        QRegion region(0,0,mMainSurface.device->width(), mMainSurface.device->height());  
+        mMainSurface.qSurface->flush(mMainSurface.widget, region, QPoint());
+    }
+}
+
+void WindowSurfaceImpl::bind(int aCapabilies)
+{
+    GFX_LOG_FUNC_CALL();
+    // Bind is not allowed if beginPaint has not been called
+    if(!mPaintingStarted)
+    {
+        throw GfxException(EGfxErrorIllegalState, "beginPaint() not called before bind()");
+    }
+    
+    switch (mMainSurface.type)
+    {
+        case WsTypeQtImage:
+        {
+            mBufferedRendering = true;
+            break;
+        }
+        
+        case WsTypeEglSurface:
+        {
+            // If caller does not support EGL surface
+            // create temp buffer to be used as target and
+            // copy pixels from window surface to temp buffer
+            if ((aCapabilies & WsTypeEglSurface) == 0) {
+                // TODO copy pixels from EGL surface to 
+                // QImage created here
+                
+            } else {
+                // Caller supports EGL surface, so just 
+                // save EGL state here
+                saveEglState();
+            }
+            break;
+        }
+        case WsTypeSymbianBitmap:
+        {
+            break;
+        }
+        default:
+        {
+            // we should newer get here
+        }
+    }
+    mIsBound = true;
+}
+
+int WindowSurfaceImpl::getType()
+{
+    GFX_LOG_FUNC_CALL();
+    return mMainSurface.type;
+}
+
+QPaintDevice* WindowSurfaceImpl::getDevice()
+{
+    return mMainSurface.device;
+}
+
+
+EGLSurface WindowSurfaceImpl::getEglSurface()
+{
+    return mEgl.drawSurface;
+}
+
+EGLenum WindowSurfaceImpl::getEglApi()
+{
+    return mEgl.api;
+}
+
+CFbsBitmap* WindowSurfaceImpl::getSymbianBitmap()
+{
+    return mMainSurface.symbianBitmap;
+}
+
+QImage* WindowSurfaceImpl::getQtImage()
+{
+    return mMainSurface.localSurface;
+}
+
+void WindowSurfaceImpl::refresh()
+{
+    updateSurfaceData();
+}
+
+void WindowSurfaceImpl::release()
+{
+    GFX_LOG_FUNC_CALL();
+    if (!mIsBound)
+    {
+        return;
+    }
+
+    if (mBufferedRendering)
+    {
+        // TODO draw QImage with painter to actual target
+    }
+    else
+    {
+        if(mMainSurface.type == WsTypeEglSurface)
+        {
+            restoreEglState();
+        }
+        // pixels are already rendered to the target
+        // no post blitter hook needed
+    }
+    mIsBound = false;
+}
+
+void WindowSurfaceImpl::dispose()
+{
+    GFX_LOG_FUNC_CALL();
+    delete this;
+}
+
+void WindowSurfaceImpl::saveEglState()
+{
+    // Some painter needs to be active on the device
+    // in order to get correct data from EGL, so if 
+    // there's no active painter, activate one here
+    if(!mMainSurface.device->paintingActive())
+    {
+        mPainter.begin(mMainSurface.device);
+    }
+    mEgl.drawSurface = eglGetCurrentSurface(EGL_DRAW);
+    mEgl.readSurface = eglGetCurrentSurface(EGL_READ);
+    mEgl.display = eglGetCurrentDisplay();
+    mEgl.context = eglGetCurrentContext();
+    mEgl.api = eglQueryAPI();
+}
+    
+void WindowSurfaceImpl::restoreEglState()
+{
+    eglBindAPI(mEgl.api);
+    eglMakeCurrent(mEgl.display, mEgl.drawSurface, mEgl.readSurface, mEgl.context);
+    
+    // if owned painter was activate to the device 
+    // release it
+    if(mPainter.isActive())
+    {
+        mPainter.end();
+    }
+}
+
+// Private methods
+
+void WindowSurfaceImpl::createLocalSurface(int aWidth, int aHeight)
+{
+    mMainSurface.localSurface = new QImage(aWidth, aHeight, QImage::Format_ARGB32);
+    if(mMainSurface.localSurface->isNull()) 
+    {   
+        throw GfxException(EGfxErrorNoMemory, "Local Surface creation failed");
+    }   
+}
+
+void WindowSurfaceImpl::deleteLocalSurface()
+{
+    if(mMainSurface.localSurface != NULL)
+    {
+        delete mMainSurface.localSurface;
+        mMainSurface.localSurface = NULL;
+    }
+    
+}
+
+bool WindowSurfaceImpl::isLocalSurfaceValid()
+{
+    if(mMainSurface.localSurface == NULL)
+    {
+        return false;
+    }
+    
+    if((mMainSurface.localSurfaceInUse) && 
+       (mMainSurface.localSurface->width() == mMainSurface.widget->width()) && 
+       (mMainSurface.localSurface->height() == mMainSurface.widget->height()))
+    {
+        return true;
+    }
+    return false;
+}
+
+void WindowSurfaceImpl::updateSurfaceData()
+{   
+    // If painting is active, i.e. beginPaint has been called 
+    // surface data is not updated
+    if(mPaintingStarted)
+    {
+        return;
+    }   
+    QWindowSurface* surface = mMainSurface.widget->windowSurface();
+    
+    // If window surface is null it means that the widget has been 
+    // sent to background and widget's window surface has been deleted, 
+    // in such case create own QImage as local surface in order to support 
+    // rendering in background
+    if(surface == NULL || surface == 0)
+    {
+        // check if we already have local surface with valid size
+        if(!isLocalSurfaceValid()) 
+        {
+            // incase we have invalid surface delete the current one
+            // and create new
+            if(mMainSurface.localSurfaceInUse) 
+            {
+                deleteLocalSurface();
+            }
+            createLocalSurface(mMainSurface.widget->width(), mMainSurface.widget->height());
+            // set info
+            mMainSurface.qSurface = NULL;
+            mMainSurface.device = mMainSurface.localSurface;
+            mMainSurface.type = WsTypeQtImage;
+            mMainSurface.localSurfaceInUse = true;
+            return;
+        }
+        else 
+        {
+            // We have valid local surface so just return
+            return;
+        }
+    }
+    else 
+    {
+        // We got Qt's window surface, so in case we had local surface in use
+        // delete it as it's not used anymore
+        if(mMainSurface.localSurfaceInUse)
+        {
+            deleteLocalSurface();
+        }
+    }
+    
+    // We got window surface so extract information
+    QPaintDevice* device = surface->paintDevice();
+    if(device->paintingActive())
+    {
+        throw GfxException(EGfxErrorIllegalState, "Internal error: Device active when refreshing data");  
+    }
+    
+    // Attach painter to device in oder to see which type 
+    // of device it is working on
+    mPainter.begin(device);
+    QPaintEngine* engine = mPainter.paintEngine();
+    
+    // determine the surface type based on the engine used
+    // as Qt does not provide exact info of the surface type
+    switch (engine->type())
+    {
+        case QPaintEngine::OpenVG:
+            // surface is EGL window surface
+            mMainSurface.type = WsTypeEglSurface;
+            break;
+        case QPaintEngine::Raster:
+            mMainSurface.type = WsTypeSymbianBitmap;
+            if(device->devType() == QInternal::Pixmap)
+            {
+                QPixmap* pixmap = static_cast<QPixmap*>(device);
+                mMainSurface.symbianBitmap = pixmap->toSymbianCFbsBitmap();
+            }
+            else 
+            {
+                throw GfxException(EGfxErrorIllegalArgument, "Unsupported device type");
+            }
+            break;
+        default:
+            throw GfxException(EGfxErrorIllegalArgument, "Unsupported widget window surface type");
+            break;
+    }
+    
+    // release painter
+    mPainter.end();
+    mMainSurface.qSurface = surface;
+    mMainSurface.device = device;
+    mMainSurface.localSurfaceInUse = false;
+}
+
+
+} // namespace GFX
+} // namespace Java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/windowsurfaceimpl_symbian.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial API and implementation
+ *******************************************************************************/
+#ifndef WINDOWSURFACEQT_H_
+#define WINDOWSURFACEQT_H_
+
+#include "graphics.h"
+#include "qwindowsurface_p.h"
+
+namespace Java { namespace GFX {
+
+class WindowSurfaceImpl: public WindowSurface
+{
+public:
+   /**
+    * Ctor for paint device
+    * @param surface The paindevice of Qt render surface
+    * @param type The type of the surface 
+    */
+    WindowSurfaceImpl(QPaintDevice* aSurface, WindowSurfaceType aType);
+    
+    /**
+     * Ctor for window owning widgets
+     * @param aWidget The target widget that this window surface is created on
+     * @param aAutoRefresh If true the Qt window surface pointer is updated each time
+     *                     the bind is called, otherwise not 
+     */
+    WindowSurfaceImpl(QWidget* aWidget, bool aAutoRefresh);
+
+   /**
+    * Dtor
+    */
+    virtual ~WindowSurfaceImpl();
+    
+    /**
+     * From WindowSurface
+     * @see WindowSurface
+     */
+    virtual void bind(int aCapabilies = WsTypeQtImage) ;
+    virtual void beginPaint(int aX, int aY, int aWidth, int aHeight);
+    virtual void endPaint();
+    virtual void flush();
+    virtual int getType();
+    virtual QPaintDevice* getDevice();
+    virtual EGLSurface getEglSurface();
+    virtual EGLenum getEglApi();
+    virtual QImage* getQtImage();
+    virtual void refresh();
+    virtual void release();
+    virtual void dispose();
+    virtual CFbsBitmap* getSymbianBitmap();
+
+private:
+    
+    /**
+     * Creates and activates local off-screen buffer for rendering 
+     * in background mode
+     */
+    void createLocalSurface(int aWidth, int aHeight);
+    
+    /**
+     * Deletes local surface
+     */
+    void deleteLocalSurface();
+    
+    /**
+     * Checks that local surface size is correct
+     */
+    bool isLocalSurfaceValid();
+    
+    /**
+     * Updates window surface info, i.e. fetches info from Qt
+     */
+    void updateSurfaceData();
+    
+    /**
+     * Saves current EGL state
+     */
+    void saveEglState();
+    
+    /**
+     * Restores previously saved EGL state
+     */
+    void restoreEglState();
+    
+ 
+    struct surfaceData
+    {
+        // The window surface that Qt has created
+        QWindowSurface* qSurface;
+        // The paint device QWindowSurface has
+        QPaintDevice* device;
+        // The Target widget which owns the QWindowSurface
+        QWidget* widget;
+        // Local surface used when widget is in background
+        // and QWindowSurface is not available
+        QImage* localSurface;
+        // The symbian bitmap used in a case where
+        // the widget is parially visible and Qt switches 
+        // to software rendering
+        CFbsBitmap* symbianBitmap;
+        // The current type of the target surface
+        WindowSurfaceType type;
+        // Indicates if local surface is used
+        bool localSurfaceInUse;
+        surfaceData() : qSurface(NULL),
+                        device(NULL), 
+                        widget(NULL),
+                        localSurface(NULL),
+                        symbianBitmap(NULL),
+                        type(WsTypeUnknown),
+                        localSurfaceInUse(false)
+        {}
+    };
+    
+    /**
+     * Data collection for EGL surface
+     */
+    struct eglData
+    {
+        EGLSurface drawSurface;
+        EGLSurface readSurface;
+        EGLContext context;
+        EGLenum api;
+        EGLDisplay display;
+        eglData() : drawSurface(EGL_NO_SURFACE),
+                    readSurface(EGL_NO_SURFACE),
+                    context(EGL_NO_CONTEXT),
+                    api(EGL_OPENGL_ES_API),
+                    display(EGL_DEFAULT_DISPLAY)
+        {}
+    };
+    
+    surfaceData mMainSurface;
+    eglData mEgl;
+    QPainter mPainter;
+    bool mIsBound;
+    bool mBufferedRendering;
+    bool mAutoRefresh;
+    bool mPaintingStarted;
+};
+
+} // namespace GFX
+} // namespace Java
+
+#endif /*WINDOWSURFACEQT_H_*/
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies).
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -45,23 +45,15 @@
     POINT,
     SWT,
     STRING,
+    DISPLAY,
 
     NUM_SWT_JCLASSES
 } SwtJClass;
 
-JniUtils::JniUtils(JNIEnv* aEnv, jobject aDisplay) :
-    mUIThreadJniEnv(aEnv)
+JniUtils::JniUtils(JNIEnv* aEnv) : mUIThreadJniEnv(aEnv)
 {
     SWT_LOG_FUNC_CALL();
 
-    // Create global ref to Display
-    jobject display = mUIThreadJniEnv->NewGlobalRef( aDisplay );
-    if( !display )
-    {
-        throw std::bad_alloc();
-    }
-    mDisplay = display;
-
     // Get local class refs. These classes are needed by Display so they should
     // be already loaded at this point. This doesn't cause any additional
     // classes, that wouldn't potentially be needed, to be loaded.
@@ -71,6 +63,7 @@
     mJclasses[POINT] = mUIThreadJniEnv->FindClass("org/eclipse/swt/graphics/Point");
     mJclasses[SWT] = mUIThreadJniEnv->FindClass("org/eclipse/swt/SWT");
     mJclasses[STRING] = mUIThreadJniEnv->FindClass("java/lang/String");
+    mJclasses[DISPLAY] = mUIThreadJniEnv->FindClass("org/eclipse/swt/widgets/Display");
 
     // Check that local class refs ok
     for (int i = 0; i < NUM_SWT_JCLASSES; ++i)
@@ -82,7 +75,8 @@
     }
 
     // Create global class refs for caching. Global refs can be used across 
-    // threads. 
+    // threads. Keeping global class refs ensures that the classes won't get
+    // unloaded. 
     for (int i = 0; i < NUM_SWT_JCLASSES; ++i)
     {
         jclass globalRef = static_cast<jclass>(mUIThreadJniEnv->NewGlobalRef( mJclasses[i] ));
@@ -108,12 +102,12 @@
         }
     }
 
-    // Compute methodIDs for caching, only Display instance and static methods.
-    // Other instance methods are not cached here. MethodIDs have the same 
-    // values for all threads so the cached values may be used by any thread. 
+    // Compute methodIDs for caching. MethodIDs have the same values for all 
+    // threads so the cached values may be used by any thread. MethodIDs are 
+    // valid until objects are garbage collected or classes unloaded. 
     mJmethodIds = new jmethodID[NUM_SWT_JMETHODIDS];
     ::memset( mJmethodIds, 0, sizeof(jmethodID)*NUM_SWT_JMETHODIDS );
-    mJmethodIds[DISPLAY_EVENTPROCESS_IIIIIIIISTRING_Z] = FindJavaMethodID(mUIThreadJniEnv, mDisplay, "eventProcess", "(IIIIIIIILjava/lang/String;)Z");
+    mJmethodIds[DISPLAY_EVENTPROCESS_IIIIIIIISTRING_Z] = mUIThreadJniEnv->GetStaticMethodID(mJclasses[DISPLAY], "eventProcess", "(IIIIIIIILjava/lang/String;)Z");
     mJmethodIds[RECTANGLE_INIT_IIII_V] = mUIThreadJniEnv->GetMethodID(mJclasses[RECTANGLE], "<init>", "(IIII)V");
     mJmethodIds[POINT_INIT_II_V] = mUIThreadJniEnv->GetMethodID(mJclasses[POINT], "<init>", "(II)V");
     mJmethodIds[SWT_ERROR_I_V] = mUIThreadJniEnv->GetStaticMethodID(mJclasses[SWT], "error", "(I)V");
@@ -145,8 +139,6 @@
 
     delete mJmethodIds;
     mJmethodIds = NULL;
-
-    mUIThreadJniEnv->DeleteGlobalRef(mDisplay);
 }
 
 bool JniUtils::eventProcess(const QObject* aQObject, const int& aQEventType,
@@ -155,12 +147,41 @@
                             const jstring aString)
 {
     SWT_LOG_FUNC_CALL();
-    return eventProcess(mDisplay,
-            mJmethodIds[DISPLAY_EVENTPROCESS_IIIIIIIISTRING_Z], reinterpret_cast<int>(aQObject),
+    return eventProcess(
+            NULL, 
+            mJclasses[DISPLAY], 
+            mJmethodIds[DISPLAY_EVENTPROCESS_IIIIIIIISTRING_Z], 
+            reinterpret_cast<int>(aQObject),
             aQEventType, a1, a2, a3, a4, a5, aString);
 }
 
 bool JniUtils::eventProcess(jobject aObject, const jmethodID aMethodID,
+        const QObject* aQObject, const int& aQEventType, const int& a1,
+        const int& a2, const int& a3, const int& a4, const int& a5,
+        const jstring aString)
+{
+    return eventProcess(
+            aObject, 
+            NULL, 
+            aMethodID, 
+            reinterpret_cast<int>(aQObject),
+            aQEventType, a1, a2, a3, a4, a5, aString);
+}
+
+bool JniUtils::eventProcess(jclass aClazz, const jmethodID aMethodID,
+        const QObject* aQObject, const int& aQEventType, const int& a1,
+        const int& a2, const int& a3, const int& a4, const int& a5,
+        const jstring aString)
+{
+    return eventProcess(
+            NULL, 
+            aClazz, 
+            aMethodID, 
+            reinterpret_cast<int>(aQObject),
+            aQEventType, a1, a2, a3, a4, a5, aString);
+}
+
+bool JniUtils::eventProcess(jobject aObject, jclass aClazz, const jmethodID aMethodID,
         const int& aQObject, const int& aQEventType, const int& a1,
         const int& a2, const int& a3, const int& a4, const int& a5,
         const jstring aString)
@@ -182,10 +203,20 @@
         // return back through the call stack. This list of objects can be used
         // to determine if deletion of an object is safe in these terms. 
         JavaCallbackCounter counter(mObjectsBeingHandled, reinterpret_cast<QObject*>(aQObject));
-        
+
+        jboolean result;
+
         // Callback Java
-        jboolean result = mUIThreadJniEnv->CallBooleanMethod(aObject, aMethodID,
-                aQObject, aQEventType, swtApp->eventTime(), a1, a2, a3, a4, a5, aString);
+        if(aObject == NULL)
+        {
+            result = mUIThreadJniEnv->CallStaticBooleanMethod(aClazz, aMethodID,
+                    aQObject, aQEventType, swtApp->eventTime(), a1, a2, a3, a4, a5, aString);        
+        }
+        else
+        {
+            result = mUIThreadJniEnv->CallBooleanMethod(aObject, aMethodID,
+                    aQObject, aQEventType, swtApp->eventTime(), a1, a2, a3, a4, a5, aString);
+        }
         
         // If an exception has occurred then any native eventloop we have
         // started, e.g. when opening a QDialog, must exit to allow Java stack
@@ -207,11 +238,6 @@
     return false;
 }
 
-bool JniUtils::isDisplay(jobject aObject)
-{
-    return (mUIThreadJniEnv->IsSameObject(aObject, mDisplay) == JNI_TRUE);
-}
-
 void JniUtils::enterExec(QObject* aObject)
 {
     QDialog* dialog = qobject_cast<QDialog*>( aObject );
@@ -273,7 +299,7 @@
     return result;
 }
 
-QString JniUtils::JavaStringToQString(JNIEnv* aEnv, jstring aJavaString)
+SWTQT_EXPORT QString JniUtils::JavaStringToQString(JNIEnv* aEnv, jstring aJavaString)
 {
     SWT_LOG_FUNC_CALL();
     if (aJavaString == NULL)
@@ -296,7 +322,7 @@
     }
  }
 
-jstring JniUtils::QStringToJavaString(JNIEnv* aEnv, const QString& aQString)
+SWTQT_EXPORT jstring JniUtils::QStringToJavaString(JNIEnv* aEnv, const QString& aQString)
 {
     SWT_LOG_FUNC_CALL();
 
@@ -417,7 +443,7 @@
     return result;
 }
 
-void JniUtils::Throw(JNIEnv* aEnv, const int& aError)
+SWTQT_EXPORT void JniUtils::Throw(JNIEnv* aEnv, const int& aError)
 {
     SWT_LOG_FUNC_CALL();
     aEnv->CallStaticVoidMethod(mJclasses[SWT], mJmethodIds[SWT_ERROR_I_V],
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/jniutils.h	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies).
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
 #include <QStack>
 #include <QPointer>
 #include <jni.h>
+#include "swtexport.h"
 
 template<class T>
 class QStack;
@@ -45,9 +46,8 @@
     /**
      * The constructor.
      * @param aEnv The JNI environment pointer of the Qt GUI thread.
-     * @param aDisplay Local ref to the Java Display instance, JniUtils will create a global ref
      */
-    JniUtils(JNIEnv* aEnv, jobject aDisplay);
+    JniUtils(JNIEnv* aEnv);
 
     /**
      * The destructor.
@@ -55,7 +55,7 @@
     virtual ~JniUtils();
 
     /**
-     * Calls eventProcess Java method of the active Display instance. 
+     * Calls eventProcess Java method of the Display class. 
      * Can only be called in the UI thread. 
      * @param aQObject Target QObject of the QEvent
      * @param aQEventType Type of the QEvent
@@ -69,7 +69,7 @@
                       const jstring aString = NULL);
 
     /**
-     * Calls eventProcess Java method based on the given jobject and jmethodID.
+     * Calls eventProcess Java instance method based on the given jobject and jmethodID.
      * Can only be called in the UI thread. 
      * @param aObject The Java object instance for the method call.
      * @param aMethodID The Java methodID for the method call.
@@ -77,18 +77,23 @@
      * @return True if the event should be canceled.
      */
     bool eventProcess(jobject aObject, const jmethodID aMethodID,
-            const int& aQObject, const int& aQEventType, const int& a1,
+            const QObject* aQObject, const int& aQEventType, const int& a1,
             const int& a2, const int& a3, const int& a4, const int& a5,
             const jstring aString);
 
     /**
-     * Query if the jobject is the Display of the process.
+     * Calls static eventProcess Java method based on the given jclass and jmethodID.
      * Can only be called in the UI thread. 
-     * @param aObject jobject to compare to the Display.
-     * @return true if given jobject is the Display
+     * @param aObject The Java class for the method call. 
+     * @param aMethodID The Java methodID for the method call. 
+     * @param ... Parameters to pass to the Java method.
+     * @return True if the event should be canceled.
      */
-    bool isDisplay(jobject aObject);
-
+    bool eventProcess(jclass aClazz, const jmethodID aMethodID,
+            const QObject* aQObject, const int& aQEventType, const int& a1,
+            const int& a2, const int& a3, const int& a4, const int& a5,
+            const jstring aString);
+    
     /**
      * This must be called before entering an event loop. E.g. dialogs and
      * menus need to call this before calling exec(). This will handle closing
@@ -138,7 +143,7 @@
      * @return A QString object.
      * @exception std::bad_alloc
      */
-    QString JavaStringToQString(JNIEnv* aEnv, jstring aJavaString);
+    SWTQT_EXPORT QString JavaStringToQString(JNIEnv* aEnv, jstring aJavaString);
 
     /**
      * Creates a Java string from the given QString.
@@ -147,7 +152,7 @@
      * @return A Java string.
      * @exception std::bad_alloc
      */
-    jstring QStringToJavaString(JNIEnv* aEnv, const QString& aQString);
+    SWTQT_EXPORT jstring QStringToJavaString(JNIEnv* aEnv, const QString& aQString);
 
     /**
      * Creates a new Java integer array from the given native int array.
@@ -201,7 +206,7 @@
      * @param aEnv JNI environment for the thread
      * @param aError The SWT error code to throw.
      */
-    void Throw(JNIEnv* aEnv, const int& aError);
+    SWTQT_EXPORT void Throw(JNIEnv* aEnv, const int& aError);
     
     /**
      * Throws a custom Java exception from the current JNI call. 
@@ -341,6 +346,20 @@
     JniUtils() {};
 
     /**
+     * Calls back Java eventProcess method which can be either static class
+     * method of the given class or an instance method of the given object. 
+     * @param aObject Java object instance or NULL if the method is static. 
+     * @param aClazz Java class or NULL if the method is an instance method. 
+     * @param aMethodID The Java methodID for the method call.
+     * @param ... Parameters to pass to the Java method.
+     * @return True if the event should be canceled. 
+     */
+    bool eventProcess(jobject aObject, jclass aClazz, const jmethodID aMethodID,
+            const int& aQObject, const int& aQEventType, const int& a1,
+            const int& a2, const int& a3, const int& a4, const int& a5,
+            const jstring aString);
+    
+    /**
      * Creates a native palette data object based on the given palette data object.
      * @param aEnv JNI environment
      * @param aJavaPaletteData Java side image data object
@@ -385,7 +404,6 @@
     };
 
     JNIEnv*     mUIThreadJniEnv;
-    jobject     mDisplay;
     jclass*     mJclasses;
     jmethodID*  mJmethodIds;
     ExecStack   mExecStack;
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/listdatamodel.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/listdatamodel.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -27,7 +27,6 @@
  * list type
  */
 const static int LISTTYPE_SORTEDLIST = 0x2;
-const static int LISTTYPE_LISTVIEW = 0x4;
 const static int LISTTYPE_LISTBOX = 0x8;
 
 /**
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/os.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/os.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -78,12 +78,6 @@
 #include <QInputContextFactory>
 #include <QChar>
 
-#ifndef QT_NO_WEBKIT
-#include <QWebView>
-#include <QWebFrame>
-#include <QWebHistory>
-#endif
-
 #ifdef __SYMBIAN32__
 #include <xqservicerequest.h>
 #include <xqcallinfo.h>
@@ -99,6 +93,7 @@
 #include "jniutils.h"
 #include "swtfontcache.h"
 #include "swt.h"
+#include "swterror.h"
 #include "listdatamodel.h"
 #include "qcaptionedwidget.h"
 #include "qswttimeedit.h"
@@ -116,33 +111,6 @@
 
 #define OS_NATIVE(func) Java_org_eclipse_swt_internal_qt_OS_##func
 
-#define POINTER_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QObject*>(pointer))
-#define HANDLE_TO_POINTER(type, variable, handle) type variable = qobject_cast<type>(static_cast<type>(reinterpret_cast<QObject*>( handle )))
-
-#define QCOLOR_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QColor*>(pointer))
-#define HANDLE_TO_QCOLOR(variable, handle) QColor* variable = static_cast<QColor*>(reinterpret_cast<QColor*>( handle ))
-
-#define QTABLEWIDGETITEM_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QTableWidgetItem*>(pointer))
-#define HANDLE_TO_QTABLEWIDGETITEM(variable, handle) QTableWidgetItem* variable = static_cast<QTableWidgetItem*>(reinterpret_cast<QTableWidgetItem*>( handle ))
-#define QTREEWIDGETITEM_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QTreeWidgetItem*>(pointer))
-#define HANDLE_TO_QTREEWIDGETITEM(variable, handle) QTreeWidgetItem* variable = static_cast<QTreeWidgetItem*>(reinterpret_cast<QTreeWidgetItem*>( handle ))
-
-#define SWT_TRY try
-#define SWT_CATCH \
-catch(std::bad_alloc const&)\
-    {\
-    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorNoHandles );\
-    }\
-catch(std::exception const&)\
-    {\
-    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorUnspecified );\
-    }
-#define SWT_CATCH_1(err) \
-catch(std::exception const&)\
-    {\
-    swtApp->jniUtils().Throw( aJniEnv, err );\
-    }
-
 #ifdef Q_WS_X11
 void extern qt_x11_wait_for_window_manager(QWidget* widget);
 #endif
@@ -10194,297 +10162,6 @@
     return ( result ? JNI_TRUE : JNI_FALSE );
 }
 
-
-//
-// QWebView
-//
-JNIEXPORT jint JNICALL OS_NATIVE( QWebView_1new )
-    ( JNIEnv* aJniEnv , jclass )
-    {
-#ifndef QT_NO_WEBKIT
-    QWebView* browser = NULL;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-        browser = new QWebView();
-        }
-    SWT_CATCH
-    return POINTER_TO_HANDLE( browser );
-#endif
-#ifdef QT_NO_WEBKIT
-    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorNotImplemented );
-    return 0;
-#endif
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1back )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->back();
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1forward )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->forward();
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1reload )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->reload();
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1setHtml )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-, jstring
-#ifndef QT_NO_WEBKIT
-aText
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->setHtml( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) );
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1setUrl )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-, jstring
-#ifndef QT_NO_WEBKIT
-aText
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->setUrl( QUrl( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) ) );
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT void JNICALL OS_NATIVE( QWebView_1stop )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        browser->stop();
-#endif
-        }
-    SWT_CATCH
-    }
-
-JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1swt_1backUrl )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    jstring res = NULL;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        QWebHistory* history = browser->history();
-        if ( history && history->canGoBack() )
-            {
-            res = swtApp->jniUtils().QStringToJavaString( aJniEnv, history->backItem().url().toString() );
-            }
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
-JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1canGoBack )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    jboolean res = false;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        QWebHistory* history = browser->history();
-        if ( history )
-            {
-            res = history->canGoBack();
-            }
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
-JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1canGoForward )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    jboolean res = false;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        QWebHistory* history = browser->history();
-        if ( history )
-            {
-            res = history->canGoForward();
-            }
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
-JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1evaluateJavaScript )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-, jstring
-#ifndef QT_NO_WEBKIT
-aText
-#endif
-)
-    {
-    jboolean res = false;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        QWebPage* page = browser->page();
-        if ( page )
-            {
-            QWebFrame* frame = page->currentFrame();
-            if ( !frame )
-                {
-                frame = page->mainFrame();
-                }
-            if ( frame )
-                {
-                res = ( frame->evaluateJavaScript( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) ) ).toBool();
-                }
-            }
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
-JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1swt_1forwardUrl )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    jstring res = NULL;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        QWebHistory* history = browser->history();
-        if ( history && history->canGoForward() )
-            {
-            res = swtApp->jniUtils().QStringToJavaString( aJniEnv, history->forwardItem().url().toString() );
-            }
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
-JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1url )
-    ( JNIEnv* aJniEnv , jclass, jint
-#ifndef QT_NO_WEBKIT
-aHandle
-#endif
-)
-    {
-    jstring res = NULL;
-    SWT_TRY
-        {
-        SWT_LOG_JNI_CALL();
-#ifndef QT_NO_WEBKIT
-        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
-        res = swtApp->jniUtils().QStringToJavaString( aJniEnv, browser->url().toString() );
-#endif
-        }
-    SWT_CATCH
-    return res;
-    }
-
 //
 // Special purpose global functions exported by Qt
 //
@@ -11730,7 +11407,6 @@
     {
 #ifdef __SYMBIAN32__    
     bool result = false;
-    XQServiceRequest* client = NULL;
     SWT_TRY
         {
         SWT_LOG_JNI_CALL();
@@ -12110,6 +11786,24 @@
     }
 
 JNIEXPORT jint JNICALL OS_NATIVE(SignalHandler_1new)
+  (JNIEnv* aJniEnv, jclass, jint aWidget, jint aSignalId )
+    {
+    SlotCallback* cb = NULL;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+        SWT_LOG_DATA_1("peer=%x", aPeer);
+
+        HANDLE_TO_POINTER( QObject*, widget, aWidget );
+
+        // Widget takes ownership of the signal handler instance
+        cb = new SlotCallback( aJniEnv, NULL, widget, aSignalId );
+        }
+    SWT_CATCH
+    return POINTER_TO_HANDLE( cb );
+    }
+
+JNIEXPORT jint JNICALL OS_NATIVE(SignalForwarder_1new)
   (JNIEnv* aJniEnv, jclass, jint aWidget, jobject aPeer, jint aSignalId )
     {
     SlotCallback* cb = NULL;
@@ -12128,12 +11822,12 @@
     }
 
 JNIEXPORT jint JNICALL OS_NATIVE( JniUtils_1new )
-  (JNIEnv* aJniEnv, jclass, jobject aDisplay)
+  (JNIEnv* aJniEnv, jclass)
     {
     // Note that JNI callbacks are not possible before first successfully creating jniUtils
     JniUtils* jniUtils = NULL;
     try {
-        jniUtils = new JniUtils(aJniEnv, aDisplay);
+        jniUtils = new JniUtils(aJniEnv);
         }
     catch(...)
         {
@@ -12220,7 +11914,7 @@
 (JNIEnv*, jclass, jobject, jint)
 #endif
     {
-    jint retVal = 0;
+    jint retVal = -1;
 #ifdef __SYMBIAN32__
     retVal = static_cast<jint>(SymbianUtils::startUI( aJniEnv, aRunner,  aUid));
 #endif
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -21,9 +21,9 @@
 #include "QListWidgetItem"
 
 #include "slotcallback.h"
-#include "swt.h"
 #include "jniutils.h"
 #include "swtapplication.h"
+#include "swtlog.h"
 
 using namespace Java::eSWT;
 
@@ -38,7 +38,7 @@
 
     // If Java peer is not Display then jobject ref and methodID are needed.
     // Otherwise they are managed by JniUtils.
-    if (!swtApp->jniUtils().isDisplay(aPeer))
+    if (aPeer != NULL)
     {
         mPeer = aJniEnv->NewGlobalRef(aPeer);
         if(!mPeer)
@@ -70,7 +70,7 @@
     if (mPeer)
     {
         // Call non-Display peer using our own jobject ref and jmethodID
-        jniUtils.eventProcess(mPeer, mJmethod, reinterpret_cast<int>(parent()), mSignalId, a1, a2, a3, a4, a5, aString);
+        jniUtils.eventProcess(mPeer, mJmethod, parent(), mSignalId, a1, a2, a3, a4, a5, aString);
     }
     else
     {
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/slotcallback.h	Fri Jun 11 13:33:44 2010 +0300
@@ -16,9 +16,7 @@
 #ifndef QT_NO_SYSTEMTRAYICON
 #include <QSystemTrayIcon>
 #endif
-#include "swtlog.h"
 #include "jni.h"
-#include "swt.h"
 
 class QPoint;
 class QItemSelection;
@@ -39,8 +37,10 @@
      * Constructor.
      * @param aJniEnv JNIEnv pointer for the GUI thread.
      * @param aPeer Local ref to the peer jobject that signals are forwarded to
-     * @param aParent Source QObject of the signal
-     * @param aSignalId Signal ID that will be used to identify the signal in Java code
+     *              or NULL if forwarded to a class (static) method of the 
+     *              class Display. 
+     * @param aParent Source QObject of the signal. 
+     * @param aSignalId Signal ID that will be used to identify the signal in Java code. 
      */
     SlotCallback( JNIEnv* aJniEnv,
                   jobject aPeer,
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.h	Fri Jun 11 13:33:44 2010 +0300
@@ -12,49 +12,37 @@
 #ifndef _SWT_H_
 #define _SWT_H_
 
-namespace Java { namespace eSWT {
+#include "swterror.h"
+
+// Pointer-handle conversion macros
+
+#define POINTER_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QObject*>(pointer))
+#define HANDLE_TO_POINTER(type, variable, handle) type variable = qobject_cast<type>(static_cast<type>(reinterpret_cast<QObject*>( handle )))
+
+#define QCOLOR_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QColor*>(pointer))
+#define HANDLE_TO_QCOLOR(variable, handle) QColor* variable = static_cast<QColor*>(reinterpret_cast<QColor*>( handle ))
+
+#define QTABLEWIDGETITEM_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QTableWidgetItem*>(pointer))
+#define HANDLE_TO_QTABLEWIDGETITEM(variable, handle) QTableWidgetItem* variable = static_cast<QTableWidgetItem*>(reinterpret_cast<QTableWidgetItem*>( handle ))
+#define QTREEWIDGETITEM_TO_HANDLE(pointer) reinterpret_cast<jint>(static_cast<QTreeWidgetItem*>(pointer))
+#define HANDLE_TO_QTREEWIDGETITEM(variable, handle) QTreeWidgetItem* variable = static_cast<QTreeWidgetItem*>(reinterpret_cast<QTreeWidgetItem*>( handle ))
 
-enum SwtError
-    {
-    ESwtErrorNone                =  0,
-    ESwtErrorUnspecified         =  1,
-    ESwtErrorNoHandles           =  2,
-    ESwtErrorNoMoreCallbacks     =  3,
-    ESwtErrorNullArgument        =  4,
-    ESwtErrorInvalidArgument     =  5,
-    ESwtErrorInvalidRange        =  6,
-    ESwtErrorCannotBeZero        =  7,
-    ESwtErrorCannotGetItem       =  8,
-    ESwtErrorCannotGetSelection  =  9,
-    ESwtErrorCannotGetItemHeight = 11,
-    ESwtErrorCannotGetText       = 12,
-    ESwtErrorCannotSetText       = 13,
-    ESwtErrorItemNotAdded        = 14,
-    ESwtErrorItemNotRemoved      = 15,
-    ESwtErrorNotImplemented      = 20,
-    ESwtErrorMenuNotDropDown     = 21,
-    ESwtErrorThreadInvalidAccess = 22,
-    ESwtErrorWidgetDisposed      = 24,
-    ESwtErrorMenuItemNotCascade  = 27,
-    ESwtErrorCannotSetSelection  = 28,
-    ESwtErrorCannotSetMenu       = 29,
-    ESwtErrorCannotSetEnabled    = 30,
-    ESwtErrorCannotGetEnabled    = 31,
-    ESwtErrorInvalidParent       = 32,
-    ESwtErrorMenuNotBar          = 33,
-    ESwtErrorCannotGetCount      = 36,
-    ESwtErrorMenuNotPopUp        = 37,
-    ESwtErrorUnsupportedDepth    = 38,
-    ESwtErrorIO                  = 39,
-    ESwtErrorInvalidImage        = 40,
-    ESwtErrorUnsupportedFormat   = 42,
-    ESwtErrorInvalidSubclass     = 43,
-    ESwtErrorGraphicDisposed     = 44,
-    ESwtErrorDeviceDisposed      = 45,
-    ESwtErrorFailedExec          = 46,
-    ESwtErrorFailedLoadLibrary   = 47
-    };
+// Try-catch macros for to be used in the JNI functions
 
-}}
+#define SWT_TRY try
+#define SWT_CATCH \
+catch(std::bad_alloc const&)\
+    {\
+    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorNoHandles );\
+    }\
+catch(std::exception const&)\
+    {\
+    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorUnspecified );\
+    }
+#define SWT_CATCH_1(err) \
+catch(std::exception const&)\
+    {\
+    swtApp->jniUtils().Throw( aJniEnv, err );\
+    }
 
 #endif // _SWT_H_
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swt.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -9,19 +9,18 @@
 #     Nokia Corporation - initial implementation
 #******************************************************************************/
 
-TEMPLATE = lib
-TARGET = eswtqt
+SWTLIBNAME = eswtqt
+SWTGENERATEDDIR = $$PWD/generated/$$SWTLIBNAME
 
-QT += core \
-      gui \
-      webkit
+TEMPLATE = lib
+TARGET = $$SWTLIBNAME
 
-MOC_DIR= ./generated
+MOC_DIR= $$SWTGENERATEDDIR
 include(eswt_widgets.pri)
 include(./graphics/graphics.pri)
 
 unix {
-    INCLUDEPATH +=$(JAVA_HOME)/include \
+    INCLUDEPATH += $(JAVA_HOME)/include \
         $(JAVA_HOME)/include/linux
 }
 
@@ -29,39 +28,6 @@
     INCLUDEPATH += $(JAVA_HOME)/include \
         $(JAVA_HOME)/include/win32
 
-        # Required for win32, can be replaced with an auto-generate
-        DEF_FILE = swt.def
+    # Required for win32, can be replaced with an auto-generate
+    DEF_FILE = swt.def
 }
-
-symbian {
-    TARGET.UID =0x101FD687
-    TARGET.CAPABILITY ="ALL -TCB"
-
-    # Temporarily allow WSD, to be removed later if possible
-    TARGET.EPOCALLOWDLLDATA = 1
-
-    # Prepend to includepath to avoid problems with Qt's overriding files
-    INCLUDEPATH = \epoc32\include \
-                  \epoc32\include\stdapis \
-                  \epoc32\include\osextensions\stdapis\sys \
-                  \epoc32\include\osextensions\stdapis\stlport \
-                  \epoc32\include\osextensions\stdapis\stlport\stl \
-                  $$INCLUDEPATH
-
-    INCLUDEPATH += \epoc32\include\middleware \
-                   \epoc32\include\domain\middleware
-
-    # J9 VM specific definitions
-    DEFINES+=J9EPOC32
-
-    # Std cpp requirements
-    LIBS += -llibc
-    LIBS += -leuser
-    LIBS += -llibstdcpp
-    
-    DEFINES+= MACRO_WCHAR_T_DECLARED
-    QMAKE_CXXFLAGS.CW += -wchar_t on
-
-    # jni lookup
-    SOURCES += $$PWD/generated/jni_lookup.cpp
-}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -21,16 +21,12 @@
 #include "swtapplication.h"
 #include "jniutils.h"
 #include "swtfontcache.h"
-#include "swt.h"
 #include "swtlog.h"
 
 #ifdef __SYMBIAN32__
 #include "swts60.h"
 #endif
 
-
-
-
 using namespace Java::eSWT;
 
 SwtApplication::SwtApplication(int &argc, char **argv, JniUtils* aJniUtils, int version)
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.h	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtapplication.h	Fri Jun 11 13:33:44 2010 +0300
@@ -128,13 +128,13 @@
         QEvent* mEvent;
         };
     
-    QTime mStartTime;
-    QPointer<JniUtils> mJniUtils;
-    SwtFontCache* mFontCache;
     QVector<SwtDeferredQEvent*> mDeferredEvents;
 #ifdef __SYMBIAN32__
     CSwtMobileDevice* iMobileDevice;
 #endif
+    QPointer<JniUtils> mJniUtils;
+    SwtFontCache* mFontCache;
+    QTime mStartTime;
 };
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swterror.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+#ifndef SWTERROR_H_
+#define SWTERROR_H_
+
+namespace Java { namespace eSWT {
+
+// SWT error types used for throwing Java exceptions. 
+// Values duplicated from Java definitions. 
+enum SwtError
+    {
+    ESwtErrorNone                =  0,
+    ESwtErrorUnspecified         =  1,
+    ESwtErrorNoHandles           =  2,
+    ESwtErrorNoMoreCallbacks     =  3,
+    ESwtErrorNullArgument        =  4,
+    ESwtErrorInvalidArgument     =  5,
+    ESwtErrorInvalidRange        =  6,
+    ESwtErrorCannotBeZero        =  7,
+    ESwtErrorCannotGetItem       =  8,
+    ESwtErrorCannotGetSelection  =  9,
+    ESwtErrorCannotGetItemHeight = 11,
+    ESwtErrorCannotGetText       = 12,
+    ESwtErrorCannotSetText       = 13,
+    ESwtErrorItemNotAdded        = 14,
+    ESwtErrorItemNotRemoved      = 15,
+    ESwtErrorNotImplemented      = 20,
+    ESwtErrorMenuNotDropDown     = 21,
+    ESwtErrorThreadInvalidAccess = 22,
+    ESwtErrorWidgetDisposed      = 24,
+    ESwtErrorMenuItemNotCascade  = 27,
+    ESwtErrorCannotSetSelection  = 28,
+    ESwtErrorCannotSetMenu       = 29,
+    ESwtErrorCannotSetEnabled    = 30,
+    ESwtErrorCannotGetEnabled    = 31,
+    ESwtErrorInvalidParent       = 32,
+    ESwtErrorMenuNotBar          = 33,
+    ESwtErrorCannotGetCount      = 36,
+    ESwtErrorMenuNotPopUp        = 37,
+    ESwtErrorUnsupportedDepth    = 38,
+    ESwtErrorIO                  = 39,
+    ESwtErrorInvalidImage        = 40,
+    ESwtErrorUnsupportedFormat   = 42,
+    ESwtErrorInvalidSubclass     = 43,
+    ESwtErrorGraphicDisposed     = 44,
+    ESwtErrorDeviceDisposed      = 45,
+    ESwtErrorFailedExec          = 46,
+    ESwtErrorFailedLoadLibrary   = 47
+    };
+
+}} // namespaces
+
+#endif /* SWTERROR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtexport.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+#ifndef SWTEXPORT_H_
+#define SWTEXPORT_H_
+
+// Macros for exporting/importing symbols using the correct Qt-macro. 
+// SWTQT_LIBRARY is defined in the Qt project file of the exporting library. 
+
+#if defined(SWTQT_LIBRARY)
+#  define SWTQT_EXPORT Q_DECL_EXPORT
+#else
+#  define SWTQT_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif /* SWTEXPORT_H_ */
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtmobiledevice.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtmobiledevice.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -42,9 +42,10 @@
 // ---------------------------------------------------------------------------
 //
 CSwtMobileDevice::CSwtMobileDevice()
-    :iSupportedLights(CHWRMLight::ENoTarget),
-    iLightLevel(KErrNotFound),
-    iHWRMLight(NULL), iVibra(NULL)
+    : iVibra(NULL),
+      iHWRMLight(NULL),
+      iSupportedLights(CHWRMLight::ENoTarget),
+      iLightLevel(KErrNotFound)
     {
     }
 
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swts60.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swts60.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -38,8 +38,8 @@
 // Stack size for the UI thread, 0x14000 = 80kB
 const TInt KSwtUiThreadStackSize = 0x14000;
 
-// Stack size for the support thread, 0x200 = 0.5kB
-const TInt KSwtSupportThreadStackSize = 0x200;
+// Stack size for the support thread, 0x1F40 = 8kB
+const TInt KSwtSupportThreadStackSize = 0x1F40;
 
 static const char* const EVENT_FILTER = "swt_event_filter";
 
@@ -449,6 +449,7 @@
 
     // Wait until the process dies. If the UI thread dies notify MIDP 
     // application management software that the MIDlet should die. 
+    // This is a workaround until QTBUG-5284 is resolved.
     while(ETrue)
         {
         User::WaitForAnyRequest();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/eswt_webkit.pri	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,21 @@
+#*******************************************************************************
+# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     Nokia Corporation - initial implementation
+#*******************************************************************************
+
+QT += core \
+      gui \
+      webkit
+
+INCLUDEPATH += $$PWD $$PWD/..
+DEPENDPATH += $$PWD
+
+SOURCES += os.cpp
+
+LIBS += -leswtqt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/os.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+#ifndef QT_NO_WEBKIT
+#include <QWebView>
+#include <QWebFrame>
+#include <QWebHistory>
+#endif
+
+#include "org_eclipse_swt_internal_qt_webkit_OS_0005fwebkit.h"
+#include "swt.h"
+#include "swtlog.h"
+#include "swtapplication.h"
+#include "jniutils.h"
+
+#define OS_NATIVE(func) Java_org_eclipse_swt_internal_qt_webkit_OS_1webkit_##func
+
+using namespace Java::eSWT;
+
+//
+// QWebView
+//
+JNIEXPORT jint JNICALL OS_NATIVE( QWebView_1new )
+    ( JNIEnv* aJniEnv , jclass )
+    {
+#ifndef QT_NO_WEBKIT
+    QWebView* browser = NULL;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+        browser = new QWebView();
+        }
+    SWT_CATCH
+    return POINTER_TO_HANDLE( browser );
+#endif
+#ifdef QT_NO_WEBKIT
+    swtApp->jniUtils().Throw( aJniEnv, ESwtErrorNotImplemented );
+    return 0;
+#endif
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1back )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->back();
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1forward )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->forward();
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1reload )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->reload();
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1setHtml )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+, jstring
+#ifndef QT_NO_WEBKIT
+aText
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->setHtml( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) );
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1setUrl )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+, jstring
+#ifndef QT_NO_WEBKIT
+aText
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->setUrl( QUrl( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) ) );
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT void JNICALL OS_NATIVE( QWebView_1stop )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        browser->stop();
+#endif
+        }
+    SWT_CATCH
+    }
+
+JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1swt_1backUrl )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    jstring res = NULL;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        QWebHistory* history = browser->history();
+        if ( history && history->canGoBack() )
+            {
+            res = swtApp->jniUtils().QStringToJavaString( aJniEnv, history->backItem().url().toString() );
+            }
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
+
+JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1canGoBack )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    jboolean res = false;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        QWebHistory* history = browser->history();
+        if ( history )
+            {
+            res = history->canGoBack();
+            }
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
+
+JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1canGoForward )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    jboolean res = false;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        QWebHistory* history = browser->history();
+        if ( history )
+            {
+            res = history->canGoForward();
+            }
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
+
+JNIEXPORT jboolean JNICALL OS_NATIVE( QWebView_1swt_1evaluateJavaScript )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+, jstring
+#ifndef QT_NO_WEBKIT
+aText
+#endif
+)
+    {
+    jboolean res = false;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        QWebPage* page = browser->page();
+        if ( page )
+            {
+            QWebFrame* frame = page->currentFrame();
+            if ( !frame )
+                {
+                frame = page->mainFrame();
+                }
+            if ( frame )
+                {
+                res = ( frame->evaluateJavaScript( swtApp->jniUtils().JavaStringToQString( aJniEnv, aText ) ) ).toBool();
+                }
+            }
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
+
+JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1swt_1forwardUrl )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    jstring res = NULL;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        QWebHistory* history = browser->history();
+        if ( history && history->canGoForward() )
+            {
+            res = swtApp->jniUtils().QStringToJavaString( aJniEnv, history->forwardItem().url().toString() );
+            }
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
+
+JNIEXPORT jstring JNICALL OS_NATIVE( QWebView_1url )
+    ( JNIEnv* aJniEnv , jclass, jint
+#ifndef QT_NO_WEBKIT
+aHandle
+#endif
+)
+    {
+    jstring res = NULL;
+    SWT_TRY
+        {
+        SWT_LOG_JNI_CALL();
+#ifndef QT_NO_WEBKIT
+        HANDLE_TO_POINTER( QWebView*, browser, aHandle );
+        res = swtApp->jniUtils().QStringToJavaString( aJniEnv, browser->url().toString() );
+#endif
+        }
+    SWT_CATCH
+    return res;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/webkit/swt.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,40 @@
+#******************************************************************************
+# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     Nokia Corporation - initial implementation
+#******************************************************************************/
+
+SWTLIBNAME = eswtqtwebkit
+SWTGENERATEDDIR = ../generated/$$SWTLIBNAME
+
+TEMPLATE = lib
+TARGET = $$SWTLIBNAME
+
+MOC_DIR= $$SWTGENERATEDDIR
+
+# Locate the main eswtqt lib
+CONFIG(debug, debug|release) {
+    LIBS += -L../debug
+} else {
+    LIBS += -L../release
+}
+
+include(eswt_webkit.pri)
+
+unix {
+    INCLUDEPATH += $(JAVA_HOME)/include \
+        $(JAVA_HOME)/include/linux
+}
+
+win32 {
+    INCLUDEPATH += $(JAVA_HOME)/include \
+        $(JAVA_HOME)/include/win32
+
+    # Required for win32, can be replaced with an auto-generate
+    DEF_FILE = swt.def
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/graphics/Internal_GfxPackageSupport.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/graphics/Internal_GfxPackageSupport.java	Fri Jun 11 13:33:44 2010 +0300
@@ -39,6 +39,15 @@
 public static int getPixmapHandle(Image i) {
     return i.getPixmapHandle();
 }
+/*
+ * From the class Device
+ */
+public static boolean internal(Device d) {
+	return d.internal;
+}
+public static boolean initialized() {
+	return Device.initialized;
+}
 
 public static Color newColor(Device device, int handle) {
     return Color.qt_new(device, handle);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/ApplicationUIListener.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.qt;
+
+/**
+ * An internal interface for providing notifications about the state of the UI
+ * during the life-time of the application.
+ */
+public interface ApplicationUIListener {
+	/**
+	 * Called when the application requests the UI thread to call back a
+	 * Runnable that the application provided.
+	 */
+	public void applicationUIThreadRequest();
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/BaseCSSEngine.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/BaseCSSEngine.java	Fri Jun 11 13:33:44 2010 +0300
@@ -38,7 +38,7 @@
 	public BaseCSSEngine(Display display){
 		if (display == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
 		if (display.isDisposed ()) SWT.error (SWT.ERROR_INVALID_ARGUMENT);
-		if (Display.getCurrent() == null ) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
+		if (display.getThread() != Thread.currentThread()) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
 		this.parent = display;
 	}
 
@@ -145,12 +145,14 @@
 	 *
 	 */
 	public void dispose(){
-		if (Display.getCurrent() == null ) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
-		parent = null;
+		if(parent != null) {
+			if (parent.getThread() != Thread.currentThread()) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
+			parent = null;
+		}
 	}
 
 	private void checkEngine(){
 		if ( parent == null || parent.isDisposed() ) SWT.error( SWT.ERROR_WIDGET_DISPOSED);
-	    if (Display.getCurrent() == null ) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
+	    if ( parent.getThread() != Thread.currentThread() ) SWT.error (SWT.ERROR_THREAD_INVALID_ACCESS);
 	}
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/CommandArranger.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/CommandArranger.java	Fri Jun 11 13:33:44 2010 +0300
@@ -64,7 +64,6 @@
             Command[] newList = new Command[size];
             // find the insertion point so that the order is correct
             int insertPoint = 0;
-            Display display = Display.getCurrent();
             Shell activeShell = display.getActiveShell();
             Control ctrl = display.getFocusControl();
             while (ctrl != null && ctrl != activeShell) {
@@ -170,9 +169,11 @@
     private CommandCollection currentCommands;
     private CommandPresentationStrategy strategy;
     private Command defaultCommand;
+    private Display display;
 
-    public CommandArranger(){
+    public CommandArranger(Display display){
         super();
+        this.display = display;
         currentCommands = new CommandCollection();
         strategy = CommandPresentationStrategyWrapper.createStrategy();
     }
@@ -206,7 +207,6 @@
      * @see Control#qt_swt_event_focusWasGained()
      */
     public void focusedControlChanged(){
-        Display display = Display.getCurrent();
         Control focusControl = display.getFocusControl();
         if (focusControl == focusedControl) {
             return;
@@ -263,6 +263,7 @@
         strategy.dispose();
         strategy = null;
         currentCommands = null;
+        display = null;
     }
     /**
      * Called when a Command is set default
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/OS.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/OS.java	Fri Jun 11 13:33:44 2010 +0300
@@ -167,7 +167,6 @@
     // QInputContextFactory key
     public static final String  QINPUTCONTEXT_COEFEP = "coefep";
     
-    
     // CntServicesContact actions
     public static final String CNT_ACTIONALL = "all";
     public static final String CNT_ACTIONCALL ="call";
@@ -178,9 +177,6 @@
     public static final String  CNT_DISPLAYALL = "all";
     public static final String  CNT_FILTERDISPLAYFAVORITES = "favorites";
 
-    
-
-
     // Implementation specific codes for the signals emitted by the Qt widgets
     public static final int QSIGNAL_ID_RANGE_FIRST = 1000;
     public static final int QSIGNAL_PRESSED = QSIGNAL_ID_RANGE_FIRST;
@@ -1502,23 +1498,6 @@
             int max, int defaultValue, String dialogId, int layoutDirection);
 
     //
-    // QWebView
-    //
-    public static final native int QWebView_new();
-    public static final native void QWebView_back(int handle);
-    public static final native void QWebView_forward(int handle);
-    public static final native void QWebView_reload(int handle);
-    public static final native void QWebView_setHtml(int handle, String html);
-    public static final native void QWebView_setUrl(int handle, String url);
-    public static final native void QWebView_stop(int handle);
-    public static final native String QWebView_swt_backUrl(int handle);
-    public static final native boolean QWebView_swt_canGoBack(int handle);
-    public static final native boolean QWebView_swt_canGoForward(int handle);
-    public static final native boolean QWebView_swt_evaluateJavaScript(int handle, String script);
-    public static final native String QWebView_swt_forwardUrl(int handle);
-    public static final native String QWebView_url(int handle);
-
-    //
     // QSystemTrayIcon
     //
     public static final native boolean QSystemTrayIcon_isSystemTrayAvailable();
@@ -1727,22 +1706,32 @@
     // Other
     //
     public static final native int EventHandler_new( );
-    public static final native void EventHandler_destroy( int handle );
+    public static final native void EventHandler_destroy(int handle);
+    
     /**
-     * Creates a QObject which implements slots to receive the signals and passes
-     * them to Java along with signal parameters and the signal id.
+     * Creates a QObject which implements slots to receive signals and passes
+     * them to the Display along with the signal parameters and the signal id. 
      * @param widget The handle of the widget which will send the signal.
-     * @param peer The peer Java object where signal is delivered to (The Display)
      * @param signalId The id that can be used to identify the signal.
-     * @return handle of the slot object, owned by the widget
+     * @return Handle of the slot object, owned by the widget that was passed as the first parameter. 
      */
-    public static final native int SignalHandler_new( int widget, Object peer, int signalId );
+    public static final native int SignalHandler_new(int widget, int signalId);
+    
+    /**
+     * Creates a QObject which implements slots to receive signals and forwards
+     * them to the given Object along with the signal parameters and the signal id. 
+     * @param widget The handle of the widget which will send the signal.
+     * @param peer The peer Java object where the signal is delivered to. 
+     * @param signalId The id that can be used to identify the signal.
+     * @return Handle of the slot object, owned by the widget that was passed as the first parameter. 
+     */
+    public static final native int SignalForwarder_new(int widget, Object peer, int signalId);
+    
     /**
      * Creates the JNI utility used for all JNI activity.
-     * @param display The Display
      * @return handle or 0 in case of failure, doesn't throw an exception
      */
-    public static final native int JniUtils_new(Object display);
+    public static final native int JniUtils_new();
 
     /**
      * Performs a check if the QObject can be safely deleted immediately. If not
@@ -1750,6 +1739,7 @@
      * be deleted safely e.g. when inside an event listener of the object.
      */
     public static final native boolean JniUtils_safeToDelete(int handle, int qObjectHandle);
+    
     private static final native int windowServer();
 
     /**
@@ -1759,6 +1749,7 @@
      * @return 0 in case of success, non-zero in case of failure.
      */
     public static final native int initUiThread(int uid);
+    
     /**
      * Some platforms require initialization before Qt-APIs can be used
      * and cleaning up after the application is done with them. This method will
@@ -1766,10 +1757,7 @@
      */
     public static final native void cleanUpUiThread();
 
-    // Add new stuff above Other, Other is the last category
-
-
     public static final native void setSymbianAppName(String name);
 
-
+    // Add new stuff above the category "Other", that is the last category
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/UIThreadManager.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.swt.internal.qt;
+
+import org.eclipse.swt.internal.qt.ApplicationUIListener;
+import org.eclipse.swt.internal.qt.midp.UIThreadLauncher;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * A class that manages the UI thread hand-over from the internal UI event loop
+ * to the application.
+ */
+public final class UIThreadManager {
+	private static Object lock = new Object();
+	private static boolean threadWaitingForApplication;
+	private static Runnable applicationRunnable;
+	private static ApplicationUIListener applicationUIListener;
+		
+	/**
+	 * Pass the control of the thread to the application by calling a Runnable
+	 * provided by the application. If the Runnable has not yet been provided
+	 * then the thread waits until it becomes available, or the wait is aborted
+	 * by calling <code>abortWait()</code>. 
+	 */
+	public static void runApplicationUI() {
+		synchronized(lock) {
+			if(!applicationWaiting()) {
+				waitForApplication();
+			}
+			callback();
+		}
+	}
+
+	/**
+	 * If the UI thread is waiting for the application to request the callback
+	 * in the UI thread then calling this will abort the wait and make the UI
+	 * thread to return back from the <code>runApplicationUI()</code>.
+	 */
+	public static void abortWait() {
+		synchronized(lock) {
+			lock.notify();
+		}
+	}
+
+	/**
+	 * Called indirectly by the application when it's requesting the UI thread. 
+	 * Application will pass a Runnable as a parameter and expects it to get called
+	 * in the UI thread. 
+	 * 
+	 * @param runnable
+	 *            The Runnable to call in the UI thread.
+	 * @return True if obtaining the UI thread was successful and the runnable
+	 *         will be called.
+	 */
+	public static boolean startInUIThread(Runnable runnable) {
+		synchronized(lock) {
+			applicationRunnable = runnable;
+			if(threadWaitingForApplication) {
+				lock.notify();
+			} else {
+				if(!waitForUIThread()) {
+					// If the internal UI has not been created then it can't be
+					// signaled and we can't wait for it. This must mean there's
+					// no UI thread yet in the process and we can create it here.
+					if(!UIThreadLauncher.startInUIThread(runnable)) {
+				    	return false;
+				    }	
+				}
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Sets the listener that will be notified of the state of the UI during its
+	 * life-time.
+	 */
+	public static void setApplicationUIListener(ApplicationUIListener listener) {
+		synchronized(lock) {
+			applicationUIListener = listener;
+		}
+	}
+	
+	/*
+	 * Signal the internal UI loop and wait until it passes the control of the
+	 * UI thread into runApplicationUI(). Return false if the internal UI can't
+	 * be signaled. 
+	 */
+	private static boolean waitForUIThread() {
+		if(signalUIThreadRequest()) {
+			try {
+				lock.wait();
+			} catch(InterruptedException e) {
+				// Nothing to do
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * Wait until signaled by the application requesting the callback to its
+	 * Runnable, or by abortWait().
+	 */
+	private static void waitForApplication() {
+		threadWaitingForApplication = true;
+		try {
+			lock.wait();
+		} catch(InterruptedException e) {
+			// Nothing to do
+		} finally {
+			threadWaitingForApplication = false;
+		}		
+	}
+	
+	/*
+	 * Returns true if application has provided the Runnable and is thus waiting
+	 * for the callback.
+	 */
+	private static boolean applicationWaiting() {
+		return (applicationRunnable != null);
+	}
+	
+	/*
+	 * Post an event to the internal Display to request the control of the UI
+	 * thread. After this runApplication() should get called in the UI thread.
+	 */
+	private static boolean signalUIThreadRequest() {
+		Display internalDisplay = Internal_PackageSupport.getInternalDisplayInstance();
+		if(internalDisplay != null) {
+			if(applicationUIListener != null) {
+				applicationUIListener.applicationUIThreadRequest();
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * Call back the application's runnable
+	 */
+	private static void callback() {
+		try {
+			if(applicationRunnable != null) {
+				flushInternals();
+				applicationRunnable.run();
+			}
+		} finally {
+			applicationRunnable = null;
+		}
+	}
+	
+	/*
+	 * Clear any events or other items possibly left over by any previous usage
+	 * of the UI resources. There must not be anything that can interfere with
+	 * the application. It must appear as the application starts with an
+	 * uninitialized UI.
+	 */
+	private static void flushInternals() {
+		Display internalDisplay = Internal_PackageSupport.getInternalDisplayInstance();
+		
+		// Dispose all widgets
+		Shell[] shells = internalDisplay.getShells();
+		for(int i = 0; i < shells.length; ++i) {
+			if(shells[i] != null && !shells[i].isDisposed()) {
+				shells[i].dispose();
+			}
+		}
+		
+		// Flush the event queue
+		while(internalDisplay.readAndDispatch()) {}
+	}
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/GraphicsContext.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/GraphicsContext.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1136,6 +1136,28 @@
     }
 
     /**
+     * Draws given WindowSurface. Supported only when WindowSurface
+     * uses local off-screen image as draw surface.
+     * The defined rectangular area is drawn to the same x and y position in the 
+     * target as the given arguments x and y specify.
+     * 
+     * @param surface The WindowSurface to draw
+     * @param x The x-coordinate of the source area to draw
+     * @param y The y-coordinate of the source area to draw
+     * @param width The width of the source area to draw
+     * @param height The height of the source area to draw
+     * @throws NullPointerException if surface is null
+     */
+    public void drawWindowSurface(WindowSurface surface, int x, int y, int width, int height) {
+    	if(surface == null) 
+    	{
+    	    throw new NullPointerException("surface is null");
+    	}
+    	OS.graphicsContext_drawWindowSurface(handle, surface.handle, x, y, width, height);
+    }
+    
+    
+    /**
      * Fill interior of circular or elliptical arc within specified rectangular area, using background color.
      *
      * @param x The x coordinate of top left corner of arc rectangle
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/OS.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/OS.java	Fri Jun 11 13:33:44 2010 +0300
@@ -39,6 +39,7 @@
     static final native void graphicsContext_drawRoundRect(int handle,int x,int y,int width,int height,int arcWidth,int arcHeight);
     static final native void graphicsContext_drawString(int handle, String string, int x, int y, int width, int height, 
                                                         int alignments, int flags, boolean isTransparent);
+    static final native void graphicsContext_drawWindowSurface(int handle, int surfaceHandle, int x, int y, int width, int height);
     static final native void graphicsContext_fillArc(int handle, int x, int y, int width, int height, int startAngle, int arcAngle);
     static final native void graphicsContext_fillEllipse(int handle, int x, int y, int width, int height);
     static final native void graphicsContext_fillGradientRect(int handle, int x, int y, int width, int height, boolean vertical, boolean swapColors);
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/Utils.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/graphics/Utils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -11,6 +11,7 @@
 package org.eclipse.swt.internal.qt.graphics;
 
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
 
 /** 
  * Class for general utilities for common graphics
@@ -28,10 +29,13 @@
 		if (!Config.ENABLE_UI_THREAD_VALIDATION) {
 			return;
 		}
-		if (Display.getCurrent() == null) {
+		Display display = Internal_PackageSupport.getDisplayInstance();
+		if(display == null) {
+			display = Internal_PackageSupport.getInternalDisplayInstance();
+		}
+		if (display == null) {
 			throw new Error("Ui thread not initialized or call was made outside ui thread");
 		} else {
-			Display display = Display.getCurrent();
 			if (Thread.currentThread() != display.getThread()) {
 				throw new Error("Call to common graphics object occured outside ui thread");
 			}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/widgets/Internal_PackageSupport.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/widgets/Internal_PackageSupport.java	Fri Jun 11 13:33:44 2010 +0300
@@ -13,9 +13,9 @@
 
 import org.eclipse.ercp.swt.mobile.Command;
 import org.eclipse.ercp.swt.mobile.MobileDevice;
-import org.eclipse.ercp.swt.mobile.TextExtension;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.internal.qt.CommandArranger;
 import org.eclipse.swt.internal.qt.graphics.WindowSurface;
 
 /**
@@ -348,17 +348,29 @@
 public static Display getDisplayInstance() {
     return Display.Default;
 }
+public static Display getInternalDisplayInstance() {
+    return Display.Internal;	
+}
+public static Display internalInstance() {
+	return Display.internalInstance();
+}
 public static Widget getDWidget(Display display, int widgetHandle) {
-    return display.getWidget(widgetHandle);
+    return Display.getWidget(widgetHandle);
 }
 public static int initializeMobileDevice(Display display) {
-    return display.initializeMobileDevice();
+    return Display.initializeMobileDevice();
 }
 public static int handle(Display d) {
-    return d.handle;
+    return Display.handle;
 }
 public static Point readAndClearImageLoadSize(Display d) {
-	return d.readAndClearImageLoadSize();
+	return Display.readAndClearImageLoadSize();
+}
+public static CommandArranger commandArranger() {
+	return Display.commandArranger;
+}
+public static int untranslateKey (int key) {
+	return Display.untranslateKey(key);
 }
 /*
  * From the class Label
@@ -368,7 +380,7 @@
 }
 
 public static void setMobileDevice(Display display, MobileDevice mobileDevice){
-	display.mobileDevice = mobileDevice;
+	Display.mobileDevice = mobileDevice;
 }
 
 }
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/eswt.odc	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/eswt.odc	Fri Jun 11 13:33:44 2010 +0300
@@ -8,7 +8,9 @@
 org/eclipse/swt/graphics
 org/eclipse/swt/internal
 org/eclipse/swt/internal/qt
+org/eclipse/swt/internal/qt/midp
 org/eclipse/swt/internal/qt/graphics
+org/eclipse/swt/internal/qt/webkit
 org/eclipse/swt/internal/image
 org/eclipse/swt/internal/extension
 org/eclipse/swt/layout
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/org/eclipse/swt/internal/qt/midp/UIThreadLauncher.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.qt.midp;
+
+import org.eclipse.swt.internal.qt.s60.OS;
+
+/**
+ * Symbian specific implementation of launching the UI thread for a MIDlet. 
+ */
+public final class UIThreadLauncher {
+	public static boolean startInUIThread(Runnable runnable) {
+	    int status = OS.startUI(runnable);
+	    if(status != 0) {
+	    	return false;
+	    }
+	    return true;
+	}
+}
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/org/eclipse/swt/internal/qt/s60/OS.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/s60/org/eclipse/swt/internal/qt/s60/OS.java	Fri Jun 11 13:33:44 2010 +0300
@@ -19,19 +19,21 @@
 
     private static boolean started;
     
-    /**
-     * Obtains the platform specific UI thread where SWT UI APIs can be accessed
-     * in and calls the provided UIThreadCallback in it. This method instantly
-     * returns leaving two threads running concurrently: the calling thread and
-     * the UI thread. Only one UI thread can exist per process and this method
-     * can be called only once to obtain it. Subsequent calls will result in an
-     * exception being thrown. This method can be called by any thread.
-     * 
-     * @param callback An object to call in the UI thread.
-     * @return 0 In case of success, non-zero if starting failed and
-     *         callback object will never be called.
-     * @exception RuntimeException If called again after already started
-     */
+	/**
+	 * Obtains the platform specific UI thread where SWT UI APIs can be accessed
+	 * in and calls the provided Runnable in it. This method instantly returns
+	 * leaving two threads running concurrently: the calling thread and the UI
+	 * thread. Only one UI thread can exist per process and this method can be
+	 * called only once to obtain it. Subsequent calls will result in an
+	 * exception being thrown. This method can be called by any thread.
+	 * 
+	 * @param callback
+	 *            An object to call in the UI thread.
+	 * @return 0 In case of success, non-zero if starting failed and callback
+	 *         object will never be called.
+	 * @exception RuntimeException
+	 *                If called again after already started
+	 */
     public synchronized static final int startUI(
             final Runnable callback) {
         if (started) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/webkit/org/eclipse/swt/internal/qt/webkit/OS_webkit.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.qt.webkit;
+
+import org.eclipse.swt.internal.Library;
+
+/**
+ * Native methods requiring QtWebkit. They are separated to avoid
+ * loading the related libraries until they are needed. 
+ */
+public final class OS_webkit {
+    static {
+        Library.loadLibrary("eswtqtwebkit");
+    }
+
+    //
+    // QWebView
+    //
+    public static final native int QWebView_new();
+    public static final native void QWebView_back(int handle);
+    public static final native void QWebView_forward(int handle);
+    public static final native void QWebView_reload(int handle);
+    public static final native void QWebView_setHtml(int handle, String html);
+    public static final native void QWebView_setUrl(int handle, String url);
+    public static final native void QWebView_stop(int handle);
+    public static final native String QWebView_swt_backUrl(int handle);
+    public static final native boolean QWebView_swt_canGoBack(int handle);
+    public static final native boolean QWebView_swt_canGoForward(int handle);
+    public static final native boolean QWebView_swt_evaluateJavaScript(int handle, String script);
+    public static final native String QWebView_swt_forwardUrl(int handle);
+    public static final native String QWebView_url(int handle);
+}
--- a/javauis/eswt_qt/s60utils/.project	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>s60utils</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.nokia.carbide.cdt.builder.carbideCPPBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.core.ccnature</nature>
-		<nature>com.nokia.carbide.cdt.builder.carbideCPPBuilderNature</nature>
-	</natures>
-</projectDescription>
--- a/javauis/eswt_qt/s60utils/bwins/s60uitestutilsu.def	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXPORTS
-	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
-
--- a/javauis/eswt_qt/s60utils/exports.inf	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-// exports.inf
-
-#ifndef __UITESTUTILSIMPL_EXPORTS_INF__
-#define __UITESTUTILSIMPL_EXPORTS_INF__
-
-#include <domain/osextensions/platform_paths.hrh>
-
-PRJ_EXPORTS
-
-#endif // __UITESTUTILSIMPL_EXPORTS_INF__
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/ImageTestUtils.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,655 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-import org.eclipse.swt.internal.qt.graphics.Image;
-import java.util.Arrays;
-
-/**
- * Image utils for verifying image pixels against mask
- * plus some other helpers for verifying image properties. 
- * 
- * NOTE. Currently only CGFX images are supported however eSWT images 
- * can be verified by using org.eclipse.swt.internal.qt.graphics.Image internal_getImage()
- * to obtain wrapped CGFX image.
- * 
- * Usage example
- * 
- * create a mask from mask data and then mask by giving data and scanlenght.
- * <code>
- * int[] maskData = {
- *   	0,0,0,0,0,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,0,0,0,0,0
- * };
- * 
- * Mask mask = new Mask(maskData, 9);
- * </code>
- * 
- * Then image pixels can be validated with ImageTestUtils. That is where there is 1 in mask it is
- * compared against maskArgb and all where there is 0 in mask it is compared against bgArgb.
- * <code>
- * ImageTestUtils.validatePixels(imageToValidate, mask, maskArgb, bgArgb); 
- * </code>
- * 
- * @author sampkaar
- *
- */
-public class ImageTestUtils {
-
-	/** 
-	 * This pixel is rendering target image background color.
-	 */
-	public static final int IMAGE_BACKGROUND_COLOR = 0;
-
-	/** 
-	 * This pixel is foreground color set to GC.
-	 */
-	public static final int GC_FOREGROUND_COLOR = 1;
-
-	/**
-	 * This pixel is either foreground or image background color.
-	 * Used for example in drawRoundRect and drawEllipse tests.
-	 */
-	public static final int FOREGROUND_OR_IMAGE_BACKGROUND_COLOR = 2;
-	
-	/** 
-	 * This pixel is background color set to GC.
-	 * Used for example in fillGradientRect test.
-	 */
-	public static final int GC_BACKGROUND_COLOR = 3;
-
-	/**
-	 * This pixel is neither foreground nor gc background color. 
-	 * Used for example in fillGradientRect test. 
-	 */
-	public static final int NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR = 4;
-
-	/** 
-	 * This pixel can be ignored.
-	 * Used for example in fillGradientRect test.
-	 */
-	public static final int IGNORE_COLOR = 5;
-	
-	/**
-	 * Validates image dimensions against reference width and height.
-	 * Prints possible problems to System.out.
-	 * 
-	 * @param img - The image to check
-	 * @param refWidth - The reference width
-	 * @param refHeight - The reference height
-	 */
-	public static final boolean validateImageDimensions(Image img, int refWidth, int refHeight) {
-		if ((refWidth != img.getWidth()) || (refHeight != img.getHeight())) {
-			System.out.println("Image size should be ("+refWidth+","+refHeight+"), "+
-							   "but is ("+img.getWidth()+","+img.getHeight()+")");
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Validates image pixels which are outside specified rectangle ingoreRect against given reference color.
-	 * 
-	 * @param ignoreRect The area that is to be ingnored
-	 * @param img Image to validate
-	 * @param argb The reference color
-	 * @return true if all pixels outside ingoreRect have reference color orherwise false 
-	 */
-	public static final boolean validatePixels(Rect ignoreRect, Image img, int argb) {
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  width * height;
-		final int scanlength = img.getWidth();
-		
-		// data array for image data
-		int[] imageData = new int[pixels];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-
-		// calculate start index
-		int start = scanlength*ignoreRect.y();
-		for(int y = 0; y<ignoreRect.height();y++) {
-			Arrays.fill(imageData, start+ignoreRect.x(), start+ignoreRect.width()+ignoreRect.x(), argb);
-			// move start to next line
-			start += scanlength;
-		}
-		
-		// validate array
-		for(int i=0; i < pixels; i++) {
-			if(!(imageData[i] == argb)) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Validates that there is at least one pixel with foreground color inside the specified rectangle
-	 * and that image pixels which are outside specified rectangle has background color.
-	 * 
-	 * @param rect The area that is to be checked
-	 * @param img Image to validate
-	 * @param fgColor The color that must exist inside the rect
-	 * @param bgColor The color which must be outside the rect
-	 * @return true if all pixels outside rect have background color and at least one pixel inside the rect has foreground color 
-	 *         orherwise false 
-	 */
-	public static final boolean validatePixels(Rect rect, Image img, int fgColor, int bgColor) {
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  width * height;
-		final int scanlength = img.getWidth();
-		boolean foundFgColor = false;
-				
-		// data array for image data
-		int[] imageData = new int[pixels];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-
-		Rect imageRect = new Rect(0,0,width, height);
-		rect = rect.intersection(imageRect);
-
-		// Check that foreground color was found inside the rect
-		foundFgColor = isAtleastOnePixelWithRefColor(img, rect, fgColor);		
-		if(!foundFgColor){
-			return false;
-		}
-		
-		int start = scanlength*rect.y();
-		// Fill the rect with background color
-		for(int y = 0; y<rect.height();y++) {
-			Arrays.fill(imageData, start+rect.x(), start+rect.width()+rect.x(), bgColor);
-			// move start to next line
-			start += scanlength;
-		}
-		
-		// validate array, now all pixels should have background color
-		for(int i=0; i < pixels; i++) {
-			if(!(imageData[i] == bgColor)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Validates that there is at least one pixel with foreground color inside the specified rectangle
-	 * and that image pixels which are outside specified rectangle has background color.
-	 * 
-	 * @param rect The area that is to be checked
-	 * @param img Image to validate
-	 * @param fgColor The color that must exist inside the rect
-	 * @param textRectColor The background color of the rect 
-	 * @param bgColor The color which must be outside the rect
-	 * @param textRectColorOn true if textRectColor must exist inside the rect, false if textRectColor shouldn't be found inside the rect 
-	 * @return true if all pixels outside rect have background color and at least one pixel inside the rect has foreground color 
-	 *         orherwise false 
-	 */
-	public static final boolean validatePixels(Rect rect, Image img, int fgColor, int textRectColor, int bgColor, boolean textRectColorOn) {
-
-		if(textRectColorOn){
-			// Check that text background color was found inside the rect
-			if(!isAtleastOnePixelWithRefColor(img, rect, textRectColor)){
-				return false;
-			}
-		} else {
-			// Check that text background color is not found inside the rect		
-			if(isAtleastOnePixelWithRefColor(img, rect, textRectColor)){
-				return false;
-			}
-		}
-		
-		return validatePixels(rect, img, fgColor, bgColor);
-	}
-
-	/**
-	 * Validates that there is at least one pixel with foreground color inside the specified rectangles
-	 * and that image pixels which are outside specified rectangles has background color.
-	 * 
-	 * @param rects The areas that is to be checked
-	 * @param img Image to validate
-	 * @param fgColor The color that must exist inside the rects
-	 * @param bgColor The color which must be outside the rects
-	 * @return true if all pixels outside rects have background color and at least one pixel inside the rects has foreground color 
-	 *         orherwise false 
-	 */
-	public static final boolean validatePixels(Rect[] rects, Image img, int fgColor, int bgColor) {
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  width * height;
-		final int scanlength = img.getWidth();
-		boolean foundFgColor = false;
-		final int rectCount = rects.length;
-
-		Rect imageRect = new Rect(0,0,width, height);
-		// Check that foreground color is found inside each rect
-		for(int i=0; i<rectCount; i++){
-			rects[i] = rects[i].intersection(imageRect);
-			foundFgColor = isAtleastOnePixelWithRefColor(img, rects[i], fgColor);		
-			if(!foundFgColor){
-				return false;
-			}
-		}
-		
-		// Check that background color is found outside the rects
-
-		// data array for image data
-		int[] imageData = new int[pixels];
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-
-		int start;
-		// Fill the rects with background color
-		for(int i=0; i<rectCount; i++){
-			start = scanlength*rects[i].y();
-			for(int y = 0; y<rects[i].height();y++) {
-				Arrays.fill(imageData, start+rects[i].x(), start+rects[i].width()+rects[i].x(), bgColor);
-				// move start to next line
-				start += scanlength;
-			}
-		}
-		
-		// validate array, now all pixels should have background color
-		for(int i=0; i < pixels; i++) {
-			if(!(imageData[i] == bgColor)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Checks is there at least one pixel with reference color inside the specified rectangle in Image.
-	 * 
-	 * @param rect The area that is to be checked
-	 * @param refColor The color that must exist inside the rect
-	 * @return true if at least one pixel inside the rect has reference color orherwise false 
-	 */
-	public static final boolean isAtleastOnePixelWithRefColor(Image img, Rect rect, int refColor) {
-		
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  width * height;
-		final int scanlength = img.getWidth();
-
-		// data array for image data
-		int[] imageData = new int[pixels];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-
-		// calculate start index
-		int start = scanlength*rect.y();
-
-		// Check that is at least one pixel has foreground color inside the rect
-		for(int y = 0; y<rect.height();y++) {
-			for(int i=start+rect.x(); i < start+rect.width()+rect.x(); i++) {			
-				if((imageData[i] == refColor)) {
-					return true;
-				}
-			}
-			// move start to next line
-			start += scanlength;
-		}	
-		return false;
-	}
-	
-	/**
-	 * Validates that every pixel in given image has
-	 * given referense color value argb. 
-	 * 
-	 * @param img - The image to check
-	 * @param argb - The referece color to compare
-	 */
-	public static final boolean validatePixels(Image img, int argb) {
-		
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  width * height;
-		
-		// get color components from reference
-		final int refAlpha 	= (argb >> 24) 	& 0xff;
-		final int refRed   	= (argb >> 16) 	& 0xff;
-		final int refGreen 	= (argb >> 8) 	& 0xff;
-		final int refBlue 	= (argb) 		& 0xff;
-		
-		// data array for image data
-		int[] imageData = new int[pixels];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-	
-		// check each pixel in image, break if pixel does not match
-		for(int i=0; i < pixels; i++) {
-			if (refAlpha != ((imageData[i] >> 24) & 0xff)) return false;
-			if (refRed 	 != ((imageData[i] >> 16) & 0xff)) return false; 
-			if (refGreen != ((imageData[i] >> 8 ) & 0xff)) return false;
-			if (refBlue  != ( imageData[i]        & 0xff)) return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Validates that given pixels are equal to 
-	 * reference pixel color (argb) and background color in given rgb data
-	 * 
-	 * @param rgbdata - The image data to be checked
-	 * @param mask - the reference mask
-	 * @param maskArgb - The reference color for pixels with value 1 in mask
-	 * @param bgArgb - The reference color for pixels with value 0 in mask
-	 * 
-	 */
-	public static final boolean validatePixels(int[] rgbdata, Mask mask, int maskArgb, int bgArgb) {
-		return doCheckPixels(rgbdata, mask, maskArgb, bgArgb, 0, false);
-	}
-	
-	/**
-	 * Validates that given pixels are equal to 
-	 * reference pixel color (argb) and background color in given rgb data
-	 * 
-	 * @param rgbdata - The image data to be checked
-	 * @param dataOffset The offset from beginning of rgbdata where image data starts
-	 * @param dataLength The lenght of image data after offset
-	 * @param mask - the reference mask
-	 * @param maskArgb - The reference color for pixels with value 1 in mask
-	 * @param bgArgb - The reference color for pixels with value 0 in mask
-	 * 
-	 */
-	public static final boolean validatePixels(int[] rgbdata, int dataOffset, int dataLength, Mask mask, int maskArgb, int bgArgb) {
-		
-		// create array for data 
-		int[] data = new int[dataLength];
-		
-		// copy from rgbdata to data
-		for(int i=dataOffset; i < rgbdata.length; i++) {
-			data[i-dataOffset] = rgbdata[i];
-		}
-		
-		//System.out.println("\n mask size: " + mask.getData().length+", dataSize: " + rgbdata.length);
-		return doCheckPixels(data, mask, maskArgb, bgArgb, 0, false);
-	}
-	
-	/**
-	 * Validates that given pixels are equal to 
-	 * reference pixel color (argb) and background color in image
-	 * 
-	 * @param img - The image to check
-	 * @param mask - the reference mask
-	 * @param maskArgb - The reference color for pixels with value 1 in mask
-	 * @param bgArgb - The reference color for pixels with value 0 in mask
-	 * 
-	 */
-	public static final boolean validatePixels(Image img, Mask mask, int maskArgb, int bgArgb) {
-		
-		// data array for image data
-		int[] imageData = new int[img.getWidth()*img.getHeight()];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
-		
-		// check pixels
-		return doCheckPixels(imageData, mask, maskArgb, bgArgb, 0, false);
-	}
-	
-	/**
-	 * Validates that given pixels are equal to 
-	 * reference pixel color (argb) and background color in image
-	 * 
-	 * @param img - The image to check
-	 * @param mask - the reference mask
-	 * @param maskArgb - The reference color for pixels with value 1 in mask
-	 * @param bgArgb - The reference color for pixels with value 0 in mask
-	 * @param ingoreAlpha If true alpha value is not validated
-	 * @return true if mask and image match otherwise false
-	 */
-	public static final boolean validatePixels(Image img, Mask mask, int maskArgb, int bgArgb, boolean ignoreAlpha) {
-		
-		// data array for image data
-		int[] imageData = new int[img.getWidth()*img.getHeight()];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
-		
-		// check pixels
-		return doCheckPixels(imageData, mask, maskArgb, bgArgb, 0, ignoreAlpha);
-	}
-
-	/**
-	 * Validates that given pixels are equal to 
-	 * foreground color (argb), image background color and gc background color in image
-	 * 
-	 * @param img - The image to check
-	 * @param mask - the reference mask
-	 * @param fgArgb - The reference color for pixels with value 1 GC_FOREGROUND_COLOR in mask
-	 * @param gcBgArgb - The reference color for pixels with value 3 GC_BACKGROUND_COLOR in mask
-	 * @param imgBgArgb - The reference color for pixels with value 0 IMAGE_BACKGROUND_COLOR in mask
-	 * @param ingoreAlpha If true alpha value is not validated
-	 * @return true if mask and image match otherwise false
-	 */
-	public static final boolean validatePixels(Image img, Mask mask, int fgArgb, int gcBgArgb, int imgBgArgb, boolean ignoreAlpha) {
-		
-		// data array for image data
-		int[] imageData = new int[img.getWidth()*img.getHeight()];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
-		
-		// check pixels
-		return doCheckPixels(imageData, mask, fgArgb, imgBgArgb, gcBgArgb, ignoreAlpha);
-	}
-
-	/*
-	 * method for checking pixels against mask
-	 * The imageData and the data in mask must be same size.  
-	 */
-	private static final boolean doCheckPixels(int[] imageData, Mask mask, int fgColorArgb, int imgBgColorArgb, int gcBgColorArgb, boolean ignoreAlpha ) {
-		
-		// get color components for GC foreground color
-		final int fgAlpha 	= (fgColorArgb >> 24) 	& 0xff;
-		final int fgRed   	= (fgColorArgb >> 16) 	& 0xff;
-		final int fgGreen 	= (fgColorArgb >> 8) 	& 0xff;
-		final int fgBlue 	= (fgColorArgb) 		& 0xff;
-		
-		// get color components for image background color
-		final int imgBgAlpha 	= (imgBgColorArgb  >> 24) 	& 0xff;
-		final int imgBgRed   	= (imgBgColorArgb  >> 16) 	& 0xff;
-		final int imgBgGreen 	= (imgBgColorArgb  >> 8) 	& 0xff;
-		final int imgBgBlue 	= (imgBgColorArgb) 			& 0xff;
-		
-		// get color components for GC background color
-		int gcBgAlpha 	= 0;
-		int gcBgRed   	= 0;
-		int gcBgGreen 	= 0;
-		int gcBgBlue 	= 0;
-		if (gcBgColorArgb != 0){ // GC Background color is defined
-			gcBgAlpha 	= (gcBgColorArgb  >> 24) 	& 0xff;
-			gcBgRed   	= (gcBgColorArgb  >> 16) 	& 0xff;
-			gcBgGreen 	= (gcBgColorArgb  >> 8) 	& 0xff;
-			gcBgBlue 	= (gcBgColorArgb) 			& 0xff;
-		}
-		
-		// get mask data
-		int[] maskdata = mask.getData();
-		
-		// verify background & pixels
-		for(int i=0; i < imageData.length; i++) {
-
-			// if mask pixel is GC_FOREGROUND_COLOR (1), check against fgArgb
-			if(maskdata[i] == GC_FOREGROUND_COLOR) {	
-				if (!ignoreAlpha) {
-				    if (fgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
-				}
-				if (fgRed	!= ((imageData[i] >> 16) & 0xff)) return false; 
-				if (fgGreen != ((imageData[i] >> 8 ) & 0xff)) return false;
-				if (fgBlue  != ( imageData[i]        & 0xff)) return false;
-			} 
-			// if mask pixel is FOREGROUND_OR_IMAGE_BACKGROUND_COLOR (2), this pixel is either 
-			// foreground or image background color. 
-			// Used for example in drawRoundRect and drawEllipse tests.
-			else if(maskdata[i] == FOREGROUND_OR_IMAGE_BACKGROUND_COLOR) {	
-				if (!ignoreAlpha) {
-					if (fgAlpha 	!= ((imageData[i] >> 24) & 0xff) && 
-						imgBgAlpha 	!= ((imageData[i] >> 24) & 0xff)) return false;
-				}				
-				if (fgRed 	 	!= ((imageData[i] >> 16) & 0xff) && 
-					imgBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
-
-				if (fgGreen 	!= ((imageData[i] >> 8 ) & 0xff) && 
-					imgBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
-	
-				if (fgBlue  	!= ( imageData[i]        & 0xff) && 
-					imgBgBlue	!= ( imageData[i]         & 0xff)) return false;
-			} 
-			// if mask pixel is GC_BACKGROUND_COLOR (3), this pixel is background color set to GC. 
-			// Used for example in fillGradientRect test.
-			else if(maskdata[i] == GC_BACKGROUND_COLOR) {	
-				if (!ignoreAlpha) {
-					if (gcBgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
-				}
-				if (gcBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
-				if (gcBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
-				if (gcBgBlue  	!= ( imageData[i]        & 0xff)) return false;
-			} 
-			// if mask pixel is NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR (4), this pixel is neither 
-			// foreground nor gc background color. 
-			// Used for example in fillGradientRect test.
-			else if(maskdata[i] == NEITHER_FOREGROUND_NOR_GC_BACKGROUND_COLOR) {	
-				if (!ignoreAlpha) {
-					if (fgAlpha != gcBgAlpha){
-						if (fgAlpha 	== ((imageData[i] >> 24) & 0xff) || 
-							gcBgAlpha 	== ((imageData[i] >> 24) & 0xff)) return false;
-					}
-				}
-				
-				if (fgRed != gcBgRed){
-					if (fgRed 	 	== ((imageData[i] >> 16) & 0xff) || 
-						gcBgRed  	== ((imageData[i] >> 16) & 0xff)) return false; 
-				}
-				if (fgGreen != gcBgGreen){
-					if (fgGreen 	== ((imageData[i] >> 8 ) & 0xff) || 
-						gcBgGreen	== ((imageData[i] >> 8 ) & 0xff)) return false;
-				}
-				if (fgBlue != gcBgBlue){
-					if (fgBlue  	== ( imageData[i]        & 0xff) || 
-						gcBgBlue 	== ( imageData[i]         & 0xff)) return false;
-				}
-			} 
-			else if(maskdata[i] == IGNORE_COLOR) {	
-				// skip the pixel
-			} 
-			// if mask pixel is IMAGE_BACKGROUND_COLOR (1), check against imgBg
-			else  if(maskdata[i] == IMAGE_BACKGROUND_COLOR) {
-				if (!ignoreAlpha) {
-				    if (imgBgAlpha != ((imageData[i] >> 24) & 0xff)) return false;
-				}
-				if (imgBgRed 	!= ((imageData[i] >> 16) & 0xff)) return false; 
-				if (imgBgGreen 	!= ((imageData[i] >> 8 ) & 0xff)) return false;
-				if (imgBgBlue 	!= ( imageData[i]         & 0xff)) return false;
-			}
-			// If mask pixel is something else that's error
-			else {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * prints black & white image to console.
-	 * black is printed as 1 and white as 0.
-	 */
-	public static final void print(Image img) {
-
-		final int width = img.getWidth();
-		final int height = img.getHeight();
-		final int pixels =  img.getWidth() * img.getHeight();
-		
-		// data array for image data
-		int[] imageData = new int[pixels];
-		
-		// get data for whole image
-		img.getRGB(imageData, 0, width, 0, 0, width, height);
-		
-		String output = "Image("+img.getWidth()+","+img.getHeight()+"):\n";
-		int y = 0;
-		for(int i = 0; i < imageData.length; i++) {
-			
-			int a = ((imageData[i] >> 24) & 0xff);
-			int r = ((imageData[i] >> 16) & 0xff); 
-			int b = ((imageData[i] >> 8 ) & 0xff);
-			int g = ( imageData[i] & 0xff);
-			
-			if (a == 255 && r == 0 && g == 0 && b == 0) {
-				output += "1,";
-			} else if (a == 255 && r == 255 && g == 255 && b == 255) {
-				output += "0,";
-			}
-			else {
-				output += "("+a+","+r+","+b+","+g+")";
-			}
-			
-			if(i==((y*width) + (width-1))) {
-				output += "\n";
-				y++;
-			}
-		}
-		System.out.println(output);
-	}
-	
-	public static final void print(int[] array, int scanlength) {
-		final int width = scanlength;
-		String output = "";
-		
-		int y = 0;
-		for(int i = 0; i < array.length; i++) {
-			
-			int a = ((array[i] >> 24) & 0xff);
-			int r = ((array[i] >> 16) & 0xff); 
-			int b = ((array[i] >> 8 ) & 0xff);
-			int g = ( array[i] & 0xff);
-			
-			if (a == 255 && r == 0 && g == 0 && b == 0) {
-				output += "1,";
-			} else if (a == 255 && r == 255 && g == 255 && b == 255) {
-				output += "0,";
-			}
-			else {
-				output += "x,";
-			}
-			
-			if(i==((y*width) + (width-1))) {
-				output += "\n";
-				y++;
-			}
-		}
-		System.out.println(output);
-	}
-
-	private int getIndexForPoint(int scanlength, int x, int y) {
-		return y*scanlength+x;
-	}
-	
-	
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Key.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,548 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-//Key.java
-//
-//
-//
-
-package com.nokia.mj.impl.uitestutils;
-
-public class Key {
-
-    //
-    // NON UNICODE LOGICAL KEY CODES
-    // pass them to class c.tor to generate symbian symbian scan and key codes
-    // (for unicode keys use unicode char)
-    //
-
-    //non unicode MIDP key codes
-    public static final  int UpArrow                     = -1;
-    public static final  int DownArrow                   = -2;
-    public static final  int LeftArrow                   = -3;
-    public static final  int RightArrow                  = -4;
-    public static final  int Clear                       = -5;  // Clear key
-    public static final  int Select                      = -6;  // Selection key
-    public static final  int Edit                        = -7; // Edit Key
-    public static final  int Send                        = -8; // Send Key
-    public static final  int CBA1                        = -9;  // Left CBA
-    public static final  int CBA2                        = -10;  // Right CBA
-    public static final  int End                         = -11; // End key
-    public static final  int Applications                = -12; // Applications key
-    public static final  int Voice                       = -13; // Voice key
-
-    //non unicode non MIDP key codes
-    public static final  int  Power      = -14;
-    public static final  int  Backspace  = -15;
-    public static final  int  GripOpen   = -16;
-    public static final  int  GripClose  = -17;
-    public static final  int  Camera     = -18;
-    public static final  int  VolumeUp   = -19;
-    public static final  int  VolumeDown = -20;
-    public static final  int  PlayPause = -21; //Media key
-    public static final  int  Stop = -22; //Media Key
-    public static final  int  NextFF = -23; //Media key
-    public static final  int  PreviousRew = -24; //Media key
-
-    public static final  int  PageUp                     = -25;
-    public static final  int  PageDown                   = -26;
-    public static final  int  HomeKey                    = -27;
-    public static final  int  EndKey                     = -28;
-    // Activate key represents a key that will cause a "default selection" of an item. On Linux
-    // this is Enter, but on S60 it may be the same key as Select.
-    public static final  int  Activate                   = -29;
-    public static final  int  InsertKey                  = -30;
-    public static final  int  ReturnKey                  = -31;
-    public static final  int  DeleteKey                  = -32;
-    public static final  int  Escape                     = -33;
-
-
-
-    //
-    // SYMBIAN SCAN CODES - copied from e32keys.h
-    //
-
-    public static final int EStdKeyNull=0x00;                     /**< No key present. */
-    public static final int EStdKeyBackspace=0x01;                /**< Scan code for Backspace key.*/
-    public static final int EStdKeyTab=0x02;                      /**< Scan code for Tab key. */
-    public static final int EStdKeyEnter=0x03;                    /**< Scan code for Enter key.*/
-    public static final int EStdKeyEscape=0x04;                   /**< Scan code for Escape (Esc) key.*/
-    public static final int EStdKeySpace=0x05;                    /**< Scan code for Space key.*/
-    public static final int EStdKeyPrintScreen=0x06;              /**< Scan code for Print Screen key.*/
-    public static final int EStdKeyPause=0x07;                    /**< Scan code for Pause key.*/
-    public static final int EStdKeyHome=0x08;                     /**< Scan code for Home key.*/
-    public static final int EStdKeyEnd=0x09;                      /**< Scan code for End key.*/
-    public static final int EStdKeyPageUp=0x0a;                   /**< Scan code for Page Up key.*/
-    public static final int EStdKeyPageDown=0x0b;                 /**< Scan code for Page Down key.*/
-    public static final int EStdKeyInsert=0x0c;                   /**< Scan code for Insert key.*/
-    public static final int EStdKeyDelete=0x0d;                   /**< Scan code for Delete (Del) key.*/
-    public static final int EStdKeyLeftArrow=0x0e;                /**< Scan code for Left arrow key.*/
-    public static final int EStdKeyRightArrow=0x0f;               /**< Scan code for Right arrow key.*/
-    public static final int EStdKeyUpArrow=0x10;                  /**< Scan code for Up arrow key.*/
-    public static final int EStdKeyDownArrow=0x11;                /**< Scan code for Down arrow key.*/
-    public static final int EStdKeyLeftShift=0x12;                /**< Scan code for left Shift key.*/
-    public static final int EStdKeyRightShift=0x13;               /**< Scan code for right Shift key.*/
-    public static final int EStdKeyLeftAlt=0x14;                  /**< Scan code for left Alt key.*/
-    public static final int EStdKeyRightAlt=0x15;                 /**< Scan code for right Alt key.*/
-    public static final int EStdKeyLeftCtrl=0x16;                 /**< Scan code for left Control (Ctrl) key.*/
-    public static final int EStdKeyRightCtrl=0x17;                /**< Scan code for right Control (Ctrl) key.*/
-    public static final int EStdKeyLeftFunc=0x18;                 /**< Scan code for left Fn key.*/
-    public static final int EStdKeyRightFunc=0x19;                /**< Scan code for right Fn key.*/
-    public static final int EStdKeyCapsLock=0x1a;                 /**< Scan code for Caps lock key.*/
-    public static final int EStdKeyNumLock=0x1b;                  /**< Scan code for Num lock key.*/
-    public static final int EStdKeyScrollLock=0x1c;               /**< Scan code for Scroll lock key.*/
-    public static final int EStdKeyF1=0x60;                       /**< Scan code for function key F1.*/
-    public static final int EStdKeyF2=0x61;                       /**< Scan code for function key F2.*/
-    public static final int EStdKeyF3=0x62;                       /**< Scan code for function key F3.*/
-    public static final int EStdKeyF4=0x63;                       /**< Scan code for function key F4.*/
-    public static final int EStdKeyF5=0x64;                       /**< Scan code for function key F5*/
-    public static final int EStdKeyF6=0x65;                       /**< Scan code for function key F6*/
-    public static final int EStdKeyF7=0x66;                       /**< Scan code for function key F7*/
-    public static final int EStdKeyF8=0x67;                       /**< Scan code for function key F8*/
-    public static final int EStdKeyF9=0x68;                       /**< Scan code for function key F9*/
-    public static final int EStdKeyF10=0x69;                      /**< Scan code for function key F10*/
-    public static final int EStdKeyF11=0x6a;                      /**< Scan code for function key F11*/
-    public static final int EStdKeyF12=0x6b;                      /**< Scan code for function key F12*/
-    public static final int EStdKeyF13=0x6c;                      /**< Scan code for function key F13*/
-    public static final int EStdKeyF14=0x6d;                      /**< Scan code for function key F14*/
-    public static final int EStdKeyF15=0x6e;                      /**< Scan code for function key F15*/
-    public static final int EStdKeyF16=0x6f;                      /**< Scan code for function key F16*/
-    public static final int EStdKeyF17=0x70;                      /**< Scan code for function key F17*/
-    public static final int EStdKeyF18=0x71;                      /**< Scan code for function key F18*/
-    public static final int EStdKeyF19=0x72;                      /**< Scan code for function key F19*/
-    public static final int EStdKeyF20=0x73;                      /**< Scan code for function key F20*/
-    public static final int EStdKeyF21=0x74;                      /**< Scan code for function key F21*/
-    public static final int EStdKeyF22=0x75;                      /**< Scan code for function key F22.*/
-    public static final int EStdKeyF23=0x76;                      /**< Scan code for function key F23.*/
-    public static final int EStdKeyF24=0x77;                      /**< Scan code for function key F24.*/
-    public static final int EStdKeyXXX=0x78;                      /**< Scan code for the key to the left of the 1 key on a standard keyboard.*/
-    public static final int EStdKeyComma=0x79;                    /**< Scan code for Comma (,) key.*/
-    public static final int EStdKeyFullStop=0x7a;                 /**< Scan code for Full stop (.) key.*/
-    public static final int EStdKeyForwardSlash=0x7b;             /**< Scan code for Forward slash (/) key.*/
-    public static final int EStdKeyBackSlash=0x7c;                /**< Scan code for Back slash (\) key.*/
-    public static final int EStdKeySemiColon=0x7d;                /**< Scan code for Semi colon (;) key.*/
-    public static final int EStdKeySingleQuote=0x7e;              /**< Scan code for Single quote (') key.*/
-    public static final int EStdKeyHash=0x7f;                     /**< Scan code for Hash key (#) key.*/
-    public static final int EStdKeySquareBracketLeft=0x80;        /**< Scan code for left Square bracket ([) key.*/
-    public static final int EStdKeySquareBracketRight=0x81;       /**< Scan code for right Square bracket (]) key.*/
-    public static final int EStdKeyMinus=0x82;                    /**< Scan code for Minus key (-) key.*/
-    public static final int EStdKeyEquals=0x83;                   /**< Scan code for Equals key (=) key.*/
-    public static final int EStdKeyNkpForwardSlash=0x84;          /**< Scan code for forward slash (/) key on the Numeric keypad.*/
-    public static final int EStdKeyNkpAsterisk=0x85;              /**< Scan code for Asterisk (*) key on the Numeric keypad.*/
-    public static final int EStdKeyNkpMinus=0x86;                 /**< Scan code for Minus (-) key on the Numeric keypad.*/
-    public static final int EStdKeyNkpPlus=0x87;                  /**< Scan code for Plus (+) key on the Numeric keypad.*/
-    public static final int EStdKeyNkpEnter=0x88;                 /**< Scan code for Enter key on the Numeric keypad.*/
-    public static final int EStdKeyNkp1=0x89;                     /**< Scan code for the 1 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp2=0x8a;                     /**< Scan code for the 2 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp3=0x8b;                     /**< Scan code for the 3 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp4=0x8c;                     /**< Scan code for the 4 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp5=0x8d;                     /**< Scan code for the 5 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp6=0x8e;                     /**< Scan code for the 6 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp7=0x8f;                     /**< Scan code for the 7 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp8=0x90;                     /**< Scan code for the 8 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp9=0x91;                     /**< Scan code for the 9 key on the Numeric keypad.*/
-    public static final int EStdKeyNkp0=0x92;                     /**< Scan code for the 0 key on the Numeric keypad.*/
-    public static final int EStdKeyNkpFullStop=0x93;              /**< Scan code for Full stop (.) key on the Numeric keypad.*/
-    public static final int EStdKeyMenu=0x94;                     /**< Scan code for Menu key.*/
-    public static final int EStdKeyBacklightOn=0x95;              /**< Scan code for Backlight on key.*/
-    public static final int EStdKeyBacklightOff=0x96;             /**< Scan code for Backlight off key.*/
-    public static final int EStdKeyBacklightToggle=0x97;          /**< Scan code for Backlight toggle key.*/
-    public static final int EStdKeyIncContrast=0x98;              /**< Scan code for Increase contrast key.*/
-    public static final int EStdKeyDecContrast=0x99;              /**< Scan code for Decrease contrast key.*/
-    public static final int EStdKeySliderDown=0x9a;               /**< Scan code for Slider down key.*/
-    public static final int EStdKeySliderUp=0x9b;                 /**< Scan code for Slider up key.*/
-    public static final int EStdKeyDictaphonePlay=0x9c;           /**< Scan code for Dictaphone play key.*/
-    public static final int EStdKeyDictaphoneStop=0x9d;           /**< Scan code for Dictaphone stop key.*/
-    public static final int EStdKeyDictaphoneRecord=0x9e;         /**< Scan code for Dictaphone record key.*/
-    public static final int EStdKeyHelp=0x9f;                     /**< Scan code for Help key */
-    public static final int EStdKeyOff=0xa0;                      /**< Scan code for Off key.*/
-    public static final int EStdKeyDial=0xa1;                     /**< Scan code for Dial key.*/
-    public static final int EStdKeyIncVolume=0xa2;                /**< Scan code for Increase volume key.*/
-    public static final int EStdKeyDecVolume=0xa3;                /**< Scan code for Decrease volume key.*/
-    public static final int EStdKeyDevice0=0xa4;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice1=0xa5;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice2=0xa6;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice3=0xa7;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice4=0xa8;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice5=0xa9;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice6=0xaa;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice7=0xab;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice8=0xac;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDevice9=0xad;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceA=0xae;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceB=0xaf;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceC=0xb0;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceD=0xb1;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceE=0xb2;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyDeviceF=0xb3;                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
-    public static final int EStdKeyApplication0=0xb4;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication1=0xb5;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication2=0xb6;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication3=0xb7;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication4=0xb8;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication5=0xb9;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication6=0xba;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication7=0xbb;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication8=0xbc;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplication9=0xbd;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationA=0xbe;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationB=0xbf;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationC=0xc0;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationD=0xc1;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationE=0xc2;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyApplicationF=0xc3;             /**< Scan code for device-specific application launcher key.*/
-    public static final int EStdKeyYes=0xc4;                      /**< Scan code for Yes key.*/
-    public static final int EStdKeyNo=0xc5;                       /**< Scan code for No key.*/
-    public static final int EStdKeyIncBrightness=0xc6;            /**< Scan code for Increase brightness key.*/
-    public static final int EStdKeyDecBrightness=0xc7;            /**< Scan code for Decrease brightness key.*/
-    public static final int EStdKeyKeyboardExtend=0xc8;           /**< Scan code for flip actuated when keypad extends to full keyboard.*/
-	public static final int EStdKeyDevice10 = 0xc9;               /**< Diagonal LeftUpArrow.*/
-	public static final int EStdKeyDevice11 = 0xca;               /**< Diagonal RightUpArrow.*/
-	public static final int EStdKeyDevice12 = 0xcb;               /**< Diagonal RightDownArrow.*/
-	public static final int EStdKeyDevice13 = 0xcc;               /**< Diagonal LeftDownArrow.*/
-
-    //
-    // SYMBIAN KEY CODES
-    //
-
-    public static final int ENonCharacterKeyBase = 0xf800;
-
-    public static final int EKeyNull=0x0000;                     /**< Code for the Null key. */
-    public static final int EKeyBell=0x0007;                     /**< Code for the Bell key*/
-    public static final int EKeyBackspace=0x0008;                /**< Code for the Backspace key */
-    public static final int EKeyTab=0x0009;                      /**< Code for the Tab key*/
-    public static final int EKeyLineFeed=0x000a;                 /**< Code for the Linefeed key*/
-    public static final int EKeyVerticalTab=0x000b;              /**< Code for the Vertical tab key*/
-    public static final int EKeyFormFeed=0x000c;                 /**< Code for the Form feed key*/
-    public static final int EKeyEnter=0x000d;                    /**< Code for the Enter key */
-    public static final int EKeyEscape=0x001b;                   /**< Code for the Escape key */
-    public static final int EKeySpace=0x0020;                    /**< Code for the Space key*/
-    public static final int EKeyDelete=0x007f;                   /**< Code for the Delete (Del) key*/
-    public static final int EKeyPrintScreen = ENonCharacterKeyBase;/**< Code for the Print screen key */
-    public static final int EKeyPause = ENonCharacterKeyBase + 1;     /**< Code for the Pause key*/
-    public static final int EKeyHome = ENonCharacterKeyBase + 2;                            /**< Code for the Home key*/
-    public static final int EKeyEnd = ENonCharacterKeyBase + 3;                             /**< Code for the End key*/
-    public static final int EKeyPageUp = ENonCharacterKeyBase + 4;                          /**< Code for the Page up key*/
-    public static final int EKeyPageDown = ENonCharacterKeyBase + 5;                        /**< Code for the Page down key*/
-    public static final int EKeyInsert = ENonCharacterKeyBase + 6;                          /**< Code for the Insert key*/
-    public static final int EKeyLeftArrow = ENonCharacterKeyBase + 7;                       /**< Code for the Left arrow key*/
-    public static final int EKeyRightArrow = ENonCharacterKeyBase + 8;                      /**< Code for the Right arrow key*/
-    public static final int EKeyUpArrow = ENonCharacterKeyBase + 9;                         /**< Code for the Up arrow key*/
-    public static final int EKeyDownArrow = ENonCharacterKeyBase + 10;                       /**< Code for the Down arrow key*/
-    public static final int EKeyLeftShift = ENonCharacterKeyBase + 11;                       /**< Code for the left Shift key*/
-    public static final int EKeyRightShift = ENonCharacterKeyBase + 12;                      /**< Code for the right Shift key*/
-    public static final int EKeyLeftAlt = ENonCharacterKeyBase + 13;                         /**< Code for the left Alt key*/
-    public static final int EKeyRightAlt = ENonCharacterKeyBase + 14;                        /**< Code for the right Alt key*/
-    public static final int EKeyLeftCtrl = ENonCharacterKeyBase + 15;                        /**< Code for the left Control (Ctrl) key*/
-    public static final int EKeyRightCtrl = ENonCharacterKeyBase + 16;                       /**< Code for the right Control (Ctrl) key.*/
-    public static final int EKeyLeftFunc = ENonCharacterKeyBase + 17;                        /**< Code for the left Fn key.*/
-    public static final int EKeyRightFunc = ENonCharacterKeyBase + 18;                       /**< Code for the right Fn key.*/
-    public static final int EKeyCapsLock = ENonCharacterKeyBase + 19;                        /**< Code for the Caps lock key.*/
-    public static final int EKeyNumLock = ENonCharacterKeyBase + 20;                         /**< Code for the Num lock key.*/
-    public static final int EKeyScrollLock = ENonCharacterKeyBase + 21;                      /**< Code for the Scroll lock key.*/
-    public static final int EKeyF1 = ENonCharacterKeyBase + 22;                              /**< Code for the F1 function key.*/
-    public static final int EKeyF2 = ENonCharacterKeyBase + 23;                              /**< Code for the F2 function key.*/
-    public static final int EKeyF3 = ENonCharacterKeyBase + 24;                              /**< Code for the F3 function key.*/
-    public static final int EKeyF4 = ENonCharacterKeyBase + 25;                              /**< Code for the F4 function key.*/
-    public static final int EKeyF5 = ENonCharacterKeyBase + 26;                              /**< Code for the F5 function key.*/
-    public static final int EKeyF6 = ENonCharacterKeyBase + 27;                              /**< Code for the F6 function key.*/
-    public static final int EKeyF7 = ENonCharacterKeyBase + 28;                              /**< Code for the F7 function key.*/
-    public static final int EKeyF8 = ENonCharacterKeyBase + 29;                              /**< Code for the F8 function key.*/
-    public static final int EKeyF9 = ENonCharacterKeyBase + 30;                              /**< Code for the F9 function key.*/
-    public static final int EKeyF10 = ENonCharacterKeyBase + 31;                             /**< Code for the F10 function key.*/
-    public static final int EKeyF11 = ENonCharacterKeyBase + 21;                             /**< Code for the F11 function key.*/
-    public static final int EKeyF12 = ENonCharacterKeyBase + 33;                             /**< Code for the F12 function key.*/
-    public static final int EKeyF13 = ENonCharacterKeyBase + 34;                             /**< Code for the F13 function key.*/
-    public static final int EKeyF14 = ENonCharacterKeyBase + 35;                             /**< Code for the F14 function key.*/
-    public static final int EKeyF15 = ENonCharacterKeyBase + 36;                             /**< Code for the F15 function key.*/
-    public static final int EKeyF16 = ENonCharacterKeyBase + 37;                             /**< Code for the F16 function key.*/
-    public static final int EKeyF17 = ENonCharacterKeyBase + 38;                             /**< Code for the F17 function key.*/
-    public static final int EKeyF18 = ENonCharacterKeyBase + 39;                             /**< Code for the F18 function key.*/
-    public static final int EKeyF19 = ENonCharacterKeyBase + 40;                             /**< Code for the F19 function key.*/
-    public static final int EKeyF20 = ENonCharacterKeyBase + 41;                             /**< Code for the F20 function key.*/
-    public static final int EKeyF21 = ENonCharacterKeyBase + 42;                             /**< Code for the F21 function key.*/
-    public static final int EKeyF22 = ENonCharacterKeyBase + 43;                             /**< Code for the F22 function key.*/
-    public static final int EKeyF23 = ENonCharacterKeyBase + 44;                             /**< Code for the F23 function key.*/
-    public static final int EKeyF24 = ENonCharacterKeyBase + 45;                             /**< Code for the F24 function key.*/
-    public static final int EKeyOff = ENonCharacterKeyBase + 46;                             /**< Code for the Off key.*/
-    public static final int EKeyIncContrast = ENonCharacterKeyBase + 47;                     /**< Code for the Increase contrast key.*/
-    public static final int EKeyDecContrast = ENonCharacterKeyBase + 48;                     /**< Code for the Decrease contrast key.*/
-    public static final int EKeyBacklightOn = ENonCharacterKeyBase + 49;                     /**< Code for the Backlight on key.*/
-    public static final int EKeyBacklightOff = ENonCharacterKeyBase + 50;                    /**< Code for the Backlight off key.*/
-    public static final int EKeyBacklightToggle = ENonCharacterKeyBase + 51;                 /**< Code for the Backlight toggle key.*/
-    public static final int EKeySliderDown = ENonCharacterKeyBase + 52;                      /**< Code for the Slider down key.*/
-    public static final int EKeySliderUp = ENonCharacterKeyBase + 53;                        /**< Code for the Slider up key.*/
-    public static final int EKeyMenu = ENonCharacterKeyBase + 54;                            /**< Code for the Menu key.*/
-    public static final int EKeyDictaphonePlay = ENonCharacterKeyBase + 55;                  /**< Code for the Dictaphone play key.*/
-    public static final int EKeyDictaphoneStop = ENonCharacterKeyBase + 56;                  /**< Code for the Dictaphone stop key.*/
-    public static final int EKeyDictaphoneRecord = ENonCharacterKeyBase + 57;                /**< Code for the Dictaphone record key.*/
-    public static final int EKeyHelp = ENonCharacterKeyBase + 58;                            /**< Code for the Help key.*/
-    public static final int EKeyDial = ENonCharacterKeyBase + 59;                            /**< Code for the Dial key.*/
-    public static final int EKeyScreenDimension0 = ENonCharacterKeyBase + 60;                /**< Code for the first Screen dimension change key.*/
-    public static final int EKeyScreenDimension1 = ENonCharacterKeyBase + 61;                /**< Code for the second Screen dimension change key.*/
-    public static final int EKeyScreenDimension2 = ENonCharacterKeyBase + 62;                /**< Code for the third Screen dimension change key.*/
-    public static final int EKeyScreenDimension3 = ENonCharacterKeyBase + 63;                /**< Code for the fourth Screen dimension change key.*/
-    public static final int EKeyIncVolume = ENonCharacterKeyBase + 64;                       /**< Code for the increase colume key.*/
-    public static final int EKeyDecVolume = ENonCharacterKeyBase + 65;                       /**< Code for the decrease volume key.*/
-    public static final int EKeyDevice0 = ENonCharacterKeyBase + 66;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice1 = ENonCharacterKeyBase + 67;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice2 = ENonCharacterKeyBase + 68;                         /**< Code for a device specific key. */
-    public static final int EKeyDevice3 = ENonCharacterKeyBase + 69;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice4 = ENonCharacterKeyBase + 70;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice5 = ENonCharacterKeyBase + 71;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice6 = ENonCharacterKeyBase + 72;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice7 = ENonCharacterKeyBase + 73;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice8 = ENonCharacterKeyBase + 74;                         /**< Code for a device specific key.*/
-    public static final int EKeyDevice9 = ENonCharacterKeyBase + 75;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceA = ENonCharacterKeyBase + 76;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceB = ENonCharacterKeyBase + 77;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceC = ENonCharacterKeyBase + 78;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceD = ENonCharacterKeyBase + 79;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceE = ENonCharacterKeyBase + 80;                         /**< Code for a device specific key.*/
-    public static final int EKeyDeviceF = ENonCharacterKeyBase + 81;                         /**< Code for a device specific key.*/
-    public static final int EKeyApplication0 = ENonCharacterKeyBase + 82;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication1 = ENonCharacterKeyBase + 83;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication2 = ENonCharacterKeyBase + 84;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication3 = ENonCharacterKeyBase + 85;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication4 = ENonCharacterKeyBase + 86;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication5 = ENonCharacterKeyBase + 87;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication6 = ENonCharacterKeyBase + 88;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication7 = ENonCharacterKeyBase + 89;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication8 = ENonCharacterKeyBase + 90;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplication9 = ENonCharacterKeyBase + 91;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationA = ENonCharacterKeyBase + 92;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationB = ENonCharacterKeyBase + 93;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationC = ENonCharacterKeyBase + 94;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationD = ENonCharacterKeyBase + 95;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationE = ENonCharacterKeyBase + 96;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyApplicationF = ENonCharacterKeyBase + 97;                    /**< Code for an Application launcher key.*/
-    public static final int EKeyYes = ENonCharacterKeyBase + 98;                             /**< Code for the Yes key.*/
-    public static final int EKeyNo = ENonCharacterKeyBase + 99;                              /**< Code for the No key.*/
-    public static final int EKeyIncBrightness = ENonCharacterKeyBase + 100;                   /**< Code for the increase brightness key.*/
-    public static final int EKeyDecBrightness = ENonCharacterKeyBase + 101;                   /**< Code for the decrease brightness key. */
-    public static final int EKeyKeyboardExtend = ENonCharacterKeyBase + 102;                  /**< Code for flip actuated when keypad extends to full keyboard.*/
-	public static final int EKeyDevice10 = ENonCharacterKeyBase + 103;                         /**< Diagonal LeftUpArrow.*/
-	public static final int EKeyDevice11 = ENonCharacterKeyBase + 104;                         /**< Diagonal RightUpArrow.*/
-	public static final int EKeyDevice12 = ENonCharacterKeyBase + 105;                         /**< Diagonal RightDownArrow.*/
-	public static final int EKeyDevice13 = ENonCharacterKeyBase + 106;                         /**< Diagonal LeftDownArrow.*/
-
-    /** map from logical key codes to symbian key codes
-     *  (index is logical key codes above with opposite sign)
-     * */
-    private int logicalKeyCodes[] = {
-            EKeyUpArrow, //UpArrow
-            EKeyDownArrow,//DownArrow
-            EKeyLeftArrow,//LeftArrow
-            EKeyRightArrow,//RightArrow
-            EStdKeyDelete, //Clear
-            EKeyDevice3, //Select
-            EKeyRightShift, //Edit
-            EKeyYes, //Send
-            EKeyDevice0, //CBA1
-            EKeyDevice1, //CBA2
-            EKeyNo, //End
-            EKeyApplication0, //Applications
-            EKeyDevice6, //Voice
-            EKeyDevice7, //Power
-            EKeyDelete, //Backspace
-            EKeySliderDown, //GripOpen
-            EKeySliderUp,   //GripClose
-            EKeyDevice7, //Camera
-            EKeyIncVolume, //VolumeUp
-            EKeyDecVolume, //VolumeDown
-            EKeyApplication2, //PlayPause
-            EKeyApplication3, //Stop
-            EKeyApplication4, //NextFF
-            EKeyApplication5, //PreviousRew
-            EKeyPageUp, // PageUp
-            EKeyPageDown, // PageDown
-            EKeyHome, // HomeKey
-            EKeyEnd, // EndKey
-            EKeyDevice3, // Activate
-            EKeyInsert, // InsertKey
-            EKeyEnter, // ReturnKey
-            EKeyDelete, // DeleteKey
-            EKeyEscape, // Escape
-			EKeyDevice10, //Diagonal LeftUpArrow
-			EKeyDevice11, //Diagonal RightUpArrow
-			EKeyDevice12, //Diagonal RightDownArrow
-			EKeyDevice13 //Diagonal LeftDownArrow
-    };
-
-    /** map from logical key codes to symbian scan codes
-     * (index is logical key codes above with opposite sign)
-     * */
-    private int logicalScanCodes[] = {
-            EStdKeyUpArrow, //UpArrow
-            EStdKeyDownArrow, //DownArrow
-            EStdKeyLeftArrow, //LeftArrow
-            EStdKeyRightArrow, //RightArrow
-            EStdKeyBackspace, //Clear
-            EStdKeyDevice3, //Select
-            EStdKeyRightShift, //Edit
-            EStdKeyYes, //Send
-            EStdKeyDevice0, //CBA1
-            EStdKeyDevice1, //CBA2
-            EStdKeyNo, //End
-            EStdKeyApplication0, //Applications
-            EStdKeyDevice6, //Voice
-            EStdKeyDevice2, //Power
-            EStdKeyBackspace, //Backspace
-            EStdKeyNull, //GripOpen  //TODO
-            EStdKeyNull, //GripClose    //TODO
-            EStdKeyDevice7, //Camera
-            EStdKeyIncVolume, //VolumeUp
-            EStdKeyDecVolume, //VolumeDown
-            EStdKeyApplication2, //PlayPause
-            EStdKeyApplication3, //Stop
-            EStdKeyApplication4, //NextFF
-            EStdKeyApplication5, //PreviousRew
-            EStdKeyPageUp,// PageUp
-            EStdKeyPageDown,// PageDown
-            EStdKeyHome,// HomeKey
-            EStdKeyEnd,// EndKey
-            EStdKeyDevice3,// Activate
-            EStdKeyInsert,// InsertKey
-            EStdKeyEnter,// ReturnKey
-            EStdKeyDelete,// DeleteKey
-            EStdKeyEscape,// Escape
-			EStdKeyDevice10, //Diagonal LeftUpArrow
-			EStdKeyDevice11, //Diagonal RightUpArrow
-			EStdKeyDevice12, //Diagonal RightDownArrow
-			EStdKeyDevice13 //Diagonal LeftDownArrow
-
-
-    };
-
-    /** Default constructor */
-    public Key() {
-        this.keyCode = 0;
-        this.scanCode = 0;
-    }
-
-    /** Constructor accepting symbian key and scan codes defined above */
-    public Key(int keyCode, int scanCode) {
-        this.keyCode = keyCode;
-        this.scanCode = scanCode;
-    }
-
-    /** Constructor accepting unicode or logical key codes defined above */
-    public Key(int keyCode) {
-    //JDEBUG("Key: Converting logical code " + keyCode);
-
-        if (keyCode < 0) {
-            this.keyCode = logicalKeyCodes[-keyCode -1];
-            this.scanCode = logicalScanCodes[-keyCode -1];
-        } else if (keyCode >= 'a' && keyCode <= 'z') {
-            this.keyCode = keyCode;
-            this.scanCode = keyCode - 'a' + 'A';
-        } else if (keyCode == '*') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyNkpAsterisk;
-
-        } else if (keyCode == '#') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyHash;
-        }  else if (keyCode == '/' || keyCode == '?') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyForwardSlash;
-        }
-        else if (keyCode == EKeyBackspace) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyBackspace;
-        }
-        else if (keyCode == EKeyEnter) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyEnter;
-        }
-        else if (keyCode == EKeyEscape) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyEscape;
-        }
-        else if (keyCode == EKeyDelete) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyDelete;
-        }
-        else if (keyCode == EKeyTab) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyTab;
-        }
-        else if (keyCode == '-' || keyCode == '_') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyMinus;
-        }
-        else if (keyCode == '=') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyEquals;
-        }
-        else if (keyCode == '+') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyNkpPlus;
-        }
-        else if (keyCode == ';' || keyCode == ':') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeySemiColon;
-        }
-        else if (keyCode == '\'' || keyCode == '\"' ) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeySingleQuote;
-        }
-        else if (keyCode >= '0' && keyCode <= '9') {
-            this.keyCode = keyCode;
-            this.scanCode = keyCode;
-        }
-        else if (keyCode == EKeySpace) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeySpace;
-        }
-        else if (keyCode == DownArrow) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyDownArrow;
-        }
-        else if (keyCode == UpArrow) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyUpArrow;
-        }
-        else if (keyCode == LeftArrow) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyLeftArrow;
-        }
-        else if (keyCode == RightArrow) {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyRightArrow;
-        }
-        else if (keyCode == ',') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyComma;
-        }
-        else if (keyCode == '.') {
-            this.keyCode = keyCode;
-            this.scanCode = EStdKeyFullStop;
-        } else {
-            this.keyCode = keyCode;
-            this.scanCode = keyCode;
-        }
-    }
-
-    /** The symbian key code */
-    public int keyCode;
-
-    /** The symbian scan code */
-    public int scanCode;
-
-    /** Modifiers, for compatibility with XlibUtils **/
-    public int modifiers;
-}
\ No newline at end of file
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/KeyFactory.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
-package com.nokia.mj.impl.uitestutils;
-
-public class KeyFactory
-{
-
-    public static Key RIGHT_ARROW = new Key(Key.RightArrow);
-    public static Key LEFT_ARROW = new Key(Key.LeftArrow);
-    public static Key UP_ARROW = new Key(Key.UpArrow);
-    public static Key DOWN_ARROW = new Key(Key.DownArrow);
-    public static Key LEFTUP_ARROW = new Key(Key.EStdKeyDevice10);
-    public static Key RIGHTUP_ARROW = new Key(Key.EStdKeyDevice11);
-    public static Key RIGHTDOWN_ARROW = new Key(Key.EStdKeyDevice12);
-    public static Key LEFTDOWN_ARROW = new Key(Key.EStdKeyDevice13);
-    
-    public static Key SELECT_KEY = new Key(Key.Select);
-    public static Key SK1 = new Key(Key.CBA1);
-    public static Key SK2 = new Key(Key.CBA2);
-
-    public static Key KEYPAD_0 = new Key(Key.EStdKeyNkp0);
-    public static Key KEYPAD_1 = new Key(Key.EStdKeyNkp1);
-    public static Key KEYPAD_2 = new Key(Key.EStdKeyNkp2);
-    public static Key KEYPAD_3 = new Key(Key.EStdKeyNkp3);
-    public static Key KEYPAD_4 = new Key(Key.EStdKeyNkp4);
-    public static Key KEYPAD_5 = new Key(Key.EStdKeyNkp5);
-    public static Key KEYPAD_6 = new Key(Key.EStdKeyNkp6);
-    public static Key KEYPAD_7 = new Key(Key.EStdKeyNkp7);
-    public static Key KEYPAD_8 = new Key(Key.EStdKeyNkp8);
-    public static Key KEYPAD_9 = new Key(Key.EStdKeyNkp9);
-
-    public static Key F1 = new Key(Key.EKeyF1);
-    public static Key F2 = new Key(Key.EKeyF2);
-    public static Key F3 = new Key(Key.EKeyF3);
-    public static Key F4 = new Key(Key.EKeyF4);
-    public static Key F5 = new Key(Key.EKeyF5);
-    public static Key F6 = new Key(Key.EKeyF6);
-    public static Key F7 = new Key(Key.EKeyF7);
-    public static Key F8 = new Key(Key.EKeyF8);
-    public static Key F9 = new Key(Key.EKeyF9);
-    public static Key F10 = new Key(Key.EKeyF10);
-    public static Key F11 = new Key(Key.EKeyF11);
-    public static Key F12 = new Key(Key.EKeyF12);
-    public static Key F13 = new Key(Key.EKeyF13);
-    public static Key F14 = new Key(Key.EKeyF14);
-    public static Key F15 = new Key(Key.EKeyF15);
-
-    public static Key BACKSPACE = new Key(Key.Backspace);
-    public static Key ENTER = new Key(Key.EKeyEnter);
-    public static Key ESCAPE = new Key(Key.EKeyEscape);
-    public static Key TAB = new Key(Key.EKeyTab);
-    public static Key CTRL_RIGHT = new Key(Key.EStdKeyRightCtrl);
-    public static Key CTRL_LEFT = new Key(Key.EStdKeyLeftCtrl);
-    public static Key SHIFT_RIGHT = new Key(Key.EStdKeyRightShift);
-    public static Key SHIFT_LEFT = new Key(Key.EStdKeyLeftShift);
-    public static Key SPACE = new Key(Key.EStdKeySpace);
-    public static Key DEL = new Key(Key.EKeyDelete);
-
-    public static Key STAR = new Key('*');
-    public static Key DIVIDE = new Key(Key.EStdKeyNkpForwardSlash);
-    public static Key ADD = new Key(Key.EStdKeyNkpPlus);
-    public static Key SUBTRACT = new Key(Key.EStdKeyNkpMinus);
-    public static Key HASH = new Key('#');
-    public static Key CLEAR = new Key(Key.EStdKeyBackspace);
-    public static Key EDIT = new Key(Key.EStdKeyRightShift);
-    public static Key SEND = new Key(Key.EStdKeyYes);
-    public static Key END = new Key(Key.EStdKeyNo);
-    public static Key APPLICATIONS = new Key(Key.EStdKeyApplication0);
-    public static Key VOICE = new Key(Key.EStdKeyDevice6);
-    public static Key SOFTKEY_1 = new Key(Key.EStdKeyDevice0);
-    public static Key SOFTKEY_2 = new Key(Key.EStdKeyDevice1);
-
-    public static Key key(int keyCode)
-    {
-        return new Key(keyCode);
-    }
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Mask.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,291 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-/**
- * Mask implementation for storing and manipulating reference mask 
- * for pixel checking. Mask can be mirrored, rotated, restored etc.
- * 
- * A new mask can be created from int[] array which holds indexes for 
- * refrence colors, e.g. value 1 can stand for red and 0 for white.
- * 
- * example:
- * <code>
- * int[] maskData  = {
- * 		0,0,0,0,0,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,1,0,0,0,0,
- * 		0,0,0,0,0,0,0,0,0
- * };
- * </code>
- * 
- * ImageUtils can validate image pixels against mask indexes and given index colors.
- * 
- * @author sampkaar
- */
-
-
-public class Mask {
-	
-	int[] iMask = null;
-	int[] iOrigMask = null;
-	int iScanlength = 0;
-	int iWidth = 0;
-	int iHeight = 0;
-	Point iCenter;
-	
-	/**
-	 * Creates instance of Mask.
-	 * 
-	 * @param mask - int array for mask to be created, values should be 0 or 1
-	 * @param scanlength - length of line in mask
-	 * 
-	 * @throws IllegalArgumentException - if mask is null
-	 * @throws IllegalArgumentException - if remainder or mask.length/scanlength is not zero
-	 */
-	public Mask(int[] mask, int scanlength) {
-		if(mask == null) {
-			throw new IllegalArgumentException("mask is null");
-		}
-		if((mask.length % scanlength) != 0) {
-			throw new IllegalArgumentException("Illegal scanlength");
-		}
-		iMask = mask;
-		iOrigMask = mask;
-		iScanlength = scanlength;
-		iCenter = new Point(scanlength/2, (iMask.length/scanlength)/2);
-		iWidth = scanlength;
-		iHeight = iMask.length/scanlength;
-	}
-	
-	/**
-	 * Returns mask's data array. 
-	 */
-	public int[] getData() {
-			return iMask;
-	}
-	
-	/**
-	 * gets subarea (rect) of mask specified by given arguments.
-	 * 
-	 * @param x The x-coordinate of ractangle
-	 * @param y The y-coordinate of ractangle
-	 * @param width The width of ractangle
-	 * @param height The height of ractangle
-	 */
-	public int[] getData(int x, int y, int width, int height) {
-		// specified area cannot exceed mask bounds
-		if((x+width > iWidth) || (y+height > iHeight)) {
-			throw new IllegalArgumentException("Area to be retrieved exceeds mask bounds");
-		}
-		
-		// create new array 
-		int[] result = new int[width*height];
-		final int h = y+height;
-		final int w = x+width;
-		
-		// populate array
-		int resultIndex = 0;
-		for(int i = y; i < h ; i++) {
-			for(int j=x; j<w ; j++) {
-				result[resultIndex] = iMask[(i*iWidth)+j];
-				resultIndex++;
-			}
-		}
-		return result;
-	}
-	
-	
-	/**
-	 * gets the width of mask.
-	 */
-	public int getWidth() {
-		return iWidth;
-	}
-	
-	/**
-	 * gets the height of mask.
-	 */
-	public int getHeight() {
-		return iHeight;
-	}
-	
-	/**
-	 * Mirrors mask around its center point.
-	 * 
-	 * @param vertical if true mirror is done along y-axis otherwise along x-axis
-	 */
-	public void mirror(boolean vertical) {
-		int[] resultMask = new int[iMask.length];
-		int y = 0; // linecounter
-		
-		// along y-axis
-		if(vertical) {
-			// start at end for first scanline
-			int sourceIndex = iScanlength-1; 
-			for(int i=0; i<iMask.length; i++) {
-				resultMask[i] = iMask[sourceIndex];
-				sourceIndex--;
-				
-				// move to next line
-				if(i==((y*iScanlength) + (iScanlength-1))) {
-					y++;
-					sourceIndex = (y*iScanlength)+(iScanlength-1); 
-				} 
-			}
-		}
-		// along x-axis
-		else {
-			int dstIndex = 0;
-			for(int srcIndex = (iMask.length-iScanlength); srcIndex >= 0; srcIndex -= iScanlength) {
-				System.arraycopy(iMask, srcIndex, resultMask, dstIndex, iScanlength);
-				dstIndex += iScanlength;
-			}
-		}
-		// save result mask
-		iMask = resultMask;	
-	}
-	
-	/**
-	 * Prints mask contents to console
-	 */
-	public void print() {
-		String output = "\n Mask("+iScanlength+","+iMask.length/iScanlength+"):\n";
-		int y = 0;
-		for(int i = 0; i < iMask.length; i++) {
-			output += iMask[i]+",";
-			if(i==((y*iScanlength) + (iScanlength-1))) {
-				output += "\n";
-				y++;
-			}
-		}
-		System.out.println(output);
-	}
-	
-	/**
-	 * prints given mask data
-	 * 
-	 * @param maskData The data of mask to be printed
-	 * @param scanlengt The scanlength of one line in maskData
-	 */
-	public void print(int[] maskData, int scanlength) {
-		
-		final int width = scanlength;
-		final int height = maskData.length / width;
-		
-		String output = "\n Mask("+width+","+height+"):\n";
-		
-		int y = 0;
-		for(int i = 0; i < maskData.length; i++) {
-			output += maskData[i]+",";
-			if(i==((y*width) + (width-1))) {
-				output += "\n";
-				y++;
-			}
-		}
-		System.out.println(output);
-	}
-	
-	/**
-	 * Resets mask to original mask given in constructor.
-	 */
-	public void resetOriginal() {
-		iMask = iOrigMask;
-	}
-	
-	/**
-	 * Rotates mask.
-	 * Positive angle rotates clockwise 
-	 * Negative angle rotates counterclockwise
-	 * 
-	 * NOTE output is 100% correct only if width/height of mask is not even, i.e.
-	 * 21 is ok, but 20 not. This is because currently the rotation is done after 
-	 * translating origin to the center of the mask and if width is 20 there no clear 
-	 * center...
-	 * 
-	 * @param angel - The rotation angel
-	 * @throws IllegalArgumentException - if remainder of angle / 90 is not zero
-	 */
-	public void rotate(float angle) {
-		if((angle % 90) != 0) {
-			throw new IllegalArgumentException("do not use other than 90 degree rotations");
-		}
-		Matrix m = new Matrix();
-		m.translate(iCenter.x, iCenter.y);
-		m.rotate(angle);
-		m.translate(-iCenter.x, -iCenter.y);
-		transform(m);
-	}
-	
-	/**
-	 * Transforms mask based on given transform matrix.
-	 * Note e.g. 45 degree rotation will fail as it needs bigger
-	 * buffer, which is not supported.
-	 * 
-	 * @param m - The trasformation matrix
-	 * @throws IllegalArgumentException - if matrix m is null
-	 * 
-	 */
-	private void transform(Matrix m) {
-		if(m == null) {
-			throw new IllegalArgumentException("Matrix m is null");
-		}
-		
-		int[] resultMask = new int[iMask.length];
-		int y = 0; // line in source mask
-		int targetIndex = 0; // result mask index
-		
-		// points for source and target
-		Point sourcePoint;
-		Point targetPoint;
-		
-		for(int i=0; i< iMask.length ; i++){
-			sourcePoint = new Point((i-(y*iScanlength)), y);
-			targetPoint = m.transform(sourcePoint);
-			targetIndex = (round(targetPoint.y)*iScanlength)+round(targetPoint.x);
-			resultMask[targetIndex] = iMask[i];
-			
-			if(i==((y*iScanlength) + (iScanlength-1))) {
-				y++;
-			}                   
-		}
-		iMask = resultMask;
-	}
-	
-	/**
-	 * Rounds given float to closest int value, e.g.
-	 * If value >= 0.5 result is 1 
-	 * if value <= 0.49 result is 0
-	 * 
-	 * @param value - The value to be rounded
-	 */
-	private int round(float value) {
-		int result = 0;
-		float temp = (int)value;  
-		
-		if((temp+0.5 <= value))  {
-			result = (int)value+1;
-		} else {
-			result = (int)value;
-		}
-		return result;
-	}
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Matrix.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-/**
- * Matrix calculation implementation.
- * 
- */
-public class Matrix {
-
-    static final int ARRAY_SIZE = 6;
-    // Array index
-    static private final int M00 = 0; 
-    static private final int M10 = 1; 
-    static private final int M01 = 2; 
-    static private final int M11 = 3; 
-    static private final int M02 = 4; 
-    static private final int M12 = 5; 
-	
-    private float iComponents[];
-
-    /**
-     * Construct a matrix with the following components:
-     * <pre>
-     * [1 0 0]
-     * [0 1 0]
-     * </pre>
-     */
-    public Matrix() {
-        iComponents = new float[ARRAY_SIZE];
-        identity();
-    }
-    
-    /**
-     * Construct a matrix with the following components:
-     * <pre>
-     * [aM00 aM01 aM02]
-     * [aM10 aM11 aM12]
-     * </pre>
-     * @param aM00 the x scaling component
-     * @param aM10 the y shearing component
-     * @param aM01 the x shearing component
-     * @param aM11 the y scaling component
-     * @param aM02 the x translation component
-     * @param aM12 the y translation component
-     */
-    public Matrix(float aM00, float aM10, float aM01, 
-    		     float aM11, float aM02, float aM12) {
-        iComponents = new float[ARRAY_SIZE];
-        iComponents[M00] = aM00; iComponents[M01] = aM01; iComponents[M02] = aM02; 
-        iComponents[M10] = aM10; iComponents[M11] = aM11; iComponents[M12] = aM12;	
-    }
-
-    /**
-     * Constructor
-     * Create a new matrix by coping the given one.
-     * @param aMatrix the matrix to copy
-     */ 
-    public Matrix(Matrix aMatrix) {
-        iComponents = new float[aMatrix.iComponents.length];
-        for(int index = 0; index < iComponents.length; index++) {
-            iComponents[index] = aMatrix.iComponents[index];
-        }
-    }
-    
-    /**
-     * 
-     */
-    public float getComponent(int index) {
-        return iComponents[index];
-    }
-
-    /**
-     * Set matrix components:
-     * <pre>
-     * [1 0 0]
-     * [0 1 0]
-     * </pre>
-     * 
-     */
-    public void identity()
-    {
-        iComponents[M00] = 1; iComponents[M01] = 0; iComponents[M02] = 0; 
-        iComponents[M10] = 0; iComponents[M11] = 1; iComponents[M12] = 0; 
-    }
-
-    /**
-     * Return transformed <code>Point</code> instance
-     *
-     * The transformation can be represented using matrix math on a 3x3 array.
-     * Given (x,y), the transformation (x',y') can be found by:
-     * [ x']   [ m00 m01 m02 ] [ x ]   [ m00*x + m01*y + m02 ]
-     * [ y'] = [ m10 m11 m12 ] [ y ] = [ m10*x + m11*y + m12 ]
-     * [ 1 ]   [  0   0   1  ] [ 1 ]   [          1          ]
-     *
-     * The bottom row of the matrix is constant, so a transform can be uniquely
-     * represented by "[[m00, m01, m02], [m10, m11, m12]]".
-     * @param p the source point
-     * @return new point instance
-     */
-    public Point transform(final Point p)
-    {
-        return new Point(
-            iComponents[M00] * p.x + iComponents[M01] * p.y + iComponents[M02],
-            iComponents[M10] * p.x + iComponents[M11] * p.y + iComponents[M12]);
-    }
-    
-    /**
-     * Return the matrix of components used in this transform. The resulting
-     * values are:
-     * <pre>
-     * [array[0] array[2] array[4]]
-     * [array[1] array[3] array[5]]
-     * </pre>
-     * @return array that contains the matrix components.
-     */
-    float[] getComponents() {
-	return iComponents;
-    }
-
-    
-    /**
-     * Return the determinant of this transform matrix. If the determinant is
-     * non-zero, the transform is invertible.
-     * The determinant is calculated as:
-     * <pre>
-     * [m00 m01 m02] 
-     * [m10 m11 m12] = m00 * m11 - m01 * m10
-     * [ 0   0   1 ]
-     * </pre>
-     * @return the determinant
-     */
-    public float determinant() {
-        return ((iComponents[M00] * iComponents[M11]) - 
-		        (iComponents[M01] * iComponents[M10]));
-    }
-        
-    /**
-     * The inverse is calculated as:
-     * <pre>
-     *     [m00 m01 m02]
-     *  M= [m10 m11 m12]
-     *     [ 0   0   1 ] 
-     *
-     *              1                 [ m11/det  -m01/det   (m01*m12-m02*m11)/det]     
-     * inverse(M)= --- x adjoint(M) = [-m10/det   m00/det   (m10*m02-m00*m12)/det] 
-     *             det                [    0         0               1           ]  
-     * </pre>
-     */
-    public Matrix inverse() {
-    	// The inversion is useful for undoing transformations.
-    	float det = determinant();
-        if (det == 0) 
-        { 
-            throw new RuntimeException("Invalid determinant");
-        }
-        return new Matrix(
-            iComponents[M11] / det, // iMtx[M00]
-            (-iComponents[M10]) / det, // iMtx[M10]
-            (-iComponents[M01]) / det, // iMtx[M01]
-            iComponents[M00] / det, // iMtx[M11]
-            ((iComponents[M01] * iComponents[M12]) - (iComponents[M02] * iComponents[M11])) / det, 
-            ((iComponents[M10] * iComponents[M02]) - (iComponents[M00] * iComponents[M12])) / det); 
-    }
-
-    /**
-     * The multiply is calculated as:
-     * <pre>
-     *       [a00 a01 a02]   [b00 b01 b02]
-     *  this=[a10 a11 a12] B=[b10 b11 b12] 
-     *       [ 0   0   1 ]   [ 0   0   1 ]
-     *
-     *                       [(a00*b00+a01*b10) (a00*b01+a01*b11) (a00*b02+a01*b12+a02)]   
-	 * [this] = [this]x[B] = [(a10*b00+a11*b10) (a10*b01+a11*b11) (a10*b02+a11*b12+a12)]
-     *                       [       0                   0                     1       ]
-     * </pre>
-     */
-    public Matrix multiply(Matrix b) {
-    	if(b == null) 
-    	{
-            throw new NullPointerException();
-    	}
-        float a00 = iComponents[M00]; // a
-        float a10 = iComponents[M10]; // b
-        float a01 = iComponents[M01]; // c
-        float a11 = iComponents[M11]; // d
-        float a02 = iComponents[M02]; // e
-        float a12 = iComponents[M12]; // f
-        iComponents[M00] = (a00 * b.iComponents[M00]) + (a01 * b.iComponents[M10]); // a
-        iComponents[M10] = (a10 * b.iComponents[M00]) + (a11 * b.iComponents[M10]); // b
-        iComponents[M01] = (a00 * b.iComponents[M01]) + (a01 * b.iComponents[M11]); // c
-        iComponents[M11] = (a10 * b.iComponents[M01]) + (a11 * b.iComponents[M11]); // d
-        iComponents[M02] = (a00 * b.iComponents[M02]) + (a01 * b.iComponents[M12]) + a02; // e
-        iComponents[M12] = (a10 * b.iComponents[M02]) + (a11 * b.iComponents[M12]) + a12; // f
-	return this;
-    }
-    
-    /**
-     * The rotation is calculated as:
-     * <pre>
-     *          [ cos(angle) -sin(angle) 0 ]
-     * [this] x [ sin(angle)  cos(angle) 0 ]
-     *          [     0           0      1 ]
-     * </pre>
-     */
-    public Matrix rotate(float angle) {
-	if (angle % 360 == 0) { 
-            return this; 
-	}
-	// Must convert degrees to radians since java.lang.Math expects radians
-	angle = angle * (float)Math.PI / 180.0f;
-	float c = (float)Math.cos(angle);
-	float s = (float)Math.sin(angle);
-        float m00 = iComponents[M00];
-        float m10 = iComponents[M10];
-        float m01 = iComponents[M01];
-        float m11 = iComponents[M11];
-	iComponents[M00] = m00 * c + m01 * s;
-	iComponents[M10] = m10 * c + m11 * s;
-	iComponents[M01] = m01 * c - m00 * s;
-	iComponents[M11] = m11 * c - m10 * s;
-	return this;
-    }
-
-    /**
-     * The multiply is calculated as:
-     * <pre>
-     *       [m00 m01 m02]   [scaleFactor      0      0]
-     *  this=[m10 m11 m12] B=[    0       scaleFactor 0] 
-     *       [ 0   0   1 ]   [    0            0      1]
-     *
-     *                       [(a00*scaleFactor) (a01*scaleFactor) a02]   
-     * [this] = [this]x[B] = [(a10*scaleFactor) (a11*scaleFactor) a12]
-     *                       [       0                   0         1 ]
-     * </pre>
-     * @see org.w3c.dom.svg.SVGMatrix#mScale()
-     */
-    public Matrix scale(float scaleFactor) {
-    	if(scaleFactor == 1) { 
-    		return this; 
-    	}
-        iComponents[M00] *= scaleFactor;  
-        iComponents[M01] *= scaleFactor; 
-        iComponents[M10] *= scaleFactor;  
-        iComponents[M11] *= scaleFactor;
-        return this;
-    }
-
-    /**
-     * 
-     */
-    public Matrix translate(float x, float y) {
-    	if(x == 0 && y == 0) { 
-    		return this; 
-    	}
-	iComponents[M02] += (iComponents[M00] * x) + (iComponents[M01] * y);
-	iComponents[M12] += (iComponents[M10] * x) + (iComponents[M11] * y); 
-    	return this;
-    }
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Modifier.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-public final class Modifier {
-
-    // Bitmask for sending modifiers 
-    // Values taken from /usr/include/X11/X.h
-    public static final int Shift                           = (1<<0);
-    public static final int CapsLock                        = (1<<1);
-    public static final int Control                         = (1<<2);
-    public static final int Alt                             = (1<<3);
-    public static final int NumLock                         = (1<<4);
-    public static final int ScrllLock                       = (1<<4);
-    public static final int AltGr                           = (1<<7);
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Point.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
-package com.nokia.mj.impl.uitestutils;
-
-/**
- * Class for storing point, i.e. x and y values.
- * This is used in matric calculations.
- *
- * @author ktuokkol
- */
-public class Point {
-    public float x;
-    public float y;
-    
-    /**
-     * Ctor
-     */
-    public Point() {
-        x = 0f;
-        y = 0f;
-    }
-
-    /**
-     * Ctor
-     * @param x
-     * @param y
-     */
-    public Point(float x, float y) {
-        this.x = x;
-        this.y = y;
-    }
-    
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/Rect.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-/**
- * Simple rect container
- * @author sampkaar
- *
- */
-public class Rect {
-	
-	private int x;
-	private int y;
-	private int width;
-	private int height;
-	
-	public Rect(int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-	
-	public int x() {
-		return this.x;
-	}
-	
-	public int y() {
-		return this.y;
-	}
-	
-	public int width() {
-		return this.width;
-	}
-	
-	public int height() {
-		return this.height;
-	}
-
-	public Rect intersection(Rect aRect){
-
-		if( aRect.x < this.x && aRect.x+aRect.width < this.x ||
-            aRect.x > this.x+this.width && aRect.x+aRect.width > this.x+this.width)
-        { // no intersection
-        	return new Rect(0,0,0,0);
-        } 
-        if( aRect.y < this.y && aRect.y+aRect.height < this.y ||
-            aRect.y > this.y+this.height && aRect.y+aRect.height > this.y+this.height)
-        { // no intersection
-            return new Rect(0,0,0,0);
-        }
-        int x = 0;
-        int y = 0;
-        int w = 0;
-        int h = 0;
-        
-        if(aRect.x < this.x)
-        {
-        	x = this.x;
-        	if (this.x + this.width < aRect.x + aRect.width)
-        	{
-        		w = this.width;
-        	}else
-        	{
-        		w = aRect.x + aRect.width - this.x;        		
-        	}
-        } else
-        { // aRect.x >= this.x
-        	x = aRect.x;        	
-        	if (aRect.x + aRect.width < this.x + this.width)
-        	{
-        		w = aRect.width;
-        	}else
-        	{
-        		w = this.x + this.width - aRect.x;
-        	}
-        }
-        if(aRect.y < this.y)
-        {
-        	y = this.y;
-        	if (this.y + this.height < aRect.y + aRect.height)
-        	{
-        		h = this.height;
-        	}else
-        	{
-        		h = aRect.y + aRect.height - this.y;
-        	}
-        } else
-        { // aRect.y >= this.y
-        	y = aRect.y;        	
-        	if (aRect.y + aRect.height < this.y + this.height)
-        	{
-        		h = aRect.height;
-        	}else
-        	{
-        		h = this.y + this.height - aRect.y;        		
-        	}
-        }
-		return new Rect(x, y, w, h);
-	}
-
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/RuntimeUtils.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-
-package com.nokia.mj.impl.uitestutils;
-
-import org.eclipse.ercp.swt.midp.UIThreadSupport;
-
-public class RuntimeUtils {
-
-    public static final int S60 = 1;
-    public static final int X11 = 2;
-    
-    public static int getPlatform() {
-        return S60;
-    }
-
-    public synchronized static final int startUI(
-            final Runnable callback) {
-        UIThreadSupport.startInUIThread(new Runnable() {
-            public void run() {
-                callback.run();
-            }
-        });
-        return 0;
-    }
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/S60Utils.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-package com.nokia.mj.impl.uitestutils;
-
-
-final class S60Utils {
-
-	static {
-		// Should use vmport, this is CDC/J2SE API
-		//System.loadLibrary("s60uitestutils");
-		org.eclipse.swt.internal.Library.loadLibrary("s60uitestutils");
-	}
-
-    /**
-     * Constant for key press event. 
-     */
-    static final int PRESS = 0;
-    
-    /**
-     * Constant for key release event. 
-     */
-    static final int RELEASE = 1;
-    
-    /**
-     * Button constants. 
-     */
-    static final int BUTTON1 = 1;
-    static final int BUTTON2 = 2;
-    static final int BUTTON3 = 3;
-
-
-	/**
-	 * Sends a key event to the window which has the keyboard focus. Get the keycode of 
-	 * the desired symbol using XKeysymToKeycode and pass that here. Or if the desired 
-	 * keycode is known it can be passed directly. 
-	 * @param keycode The keycode of the key to send. 
-	 * @param modifiers The modifiers to send. 
-     * @param pressOrRelease Either PRESS or RELEASE must be passed here.  
-	 * @return 0 if successful, otherwise a non-zero error code
-     * @see XlibKeys
-	 */
-    static final native int S60SendKeyToFocusWindow(int keycode, int modifiers, int pressOrRelease);
-	
-	/**
-	 * Returns the keycode of the given symbol (keysym) in the currently active
-	 * keyboard layout. Keysym constants are defined in XlibKeys. 
-	 * @param keysym
-	 * @return The keycode or zero in case of an error
-	 * @see XlibKeys
-	 */
-	static final native int S60KeysymToKeycode(int keysym);
-
-    /**
-     * Sends a pointer press or release event. 
-     * @param x X-coordinate to send, relative to X root window (i.e. screen). 
-     * @param y Y-coordinate to send, relative to X root window (i.e. screen). 
-     * @param modifiers The modifiers to send. 
-     * @param button The button that's pressed or released. 
-     * @param pressOrRelease Either PRESS or RELEASE must be passed here.  
-     * @return 0 if successful, otherwise a non-zero error code
-     */
-    static final native int S60SendPointerEvent(int x, int y, int button, int pressOrRelease);
-
-    /**
-     * Sends a pointer move event. 
-     * @param x X-coordinate to send, relative to X root window (i.e. screen). 
-     * @param y Y-coordinate to send, relative to X root window (i.e. screen).
-     * @param button The button that's held pressed during the move. 
-     * @return 0 if successful, otherwise a non-zero error code
-     */
-    static final native int S60SendPointerMoveEvent(int x, int y, int button);
-
-    /**
-     * Disables the screensaver. 
-     */
-    static final native void S60DisableScreensaver();
-
-    /**
-     * Sets the doubleclick interval. Set to 0 to disable doubleclicks. 
-     * @param interval New doubleclick interval
-     */
-    static final native void S60SetDoubleclickInterval(int interval);
-
-	/*static final native int _create(int toolkitHandle, UITestUtils testUtils); 
-	static final native void _dispose(int toolkitHandle, UITestUtils testUtils, int testUtilsHandle);
-
-	static final native void _startTest(int toolkitHandle, int handle, String screenShotDir); 	
-	static final native void _endTest(int toolkitHandle, int handle, boolean passed, String msg);
-
-	static final native void _log(int toolkitHandle, int handle, String msg); 	
-	static final native void _logResult(int toolkitHandle, int handle, boolean passed, String msgPassed, String msgFailed);
-
-	static final native void _triggerKeyPressEvent(int toolkitHandle, int handle, int keyCode, int scanCode); 	
-	static final native int _triggerKeyRepeatEvents(int toolkitHandle, int handle, int keyCode, int scanCode, int count); 	
-	static final native int _triggerMediaKeyRepeatEvents(int toolkitHandle, int handle, int keyCode, int scanCode, int pressedTimeInMillis); 	
-	
-	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName);
-	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName, 
-	                                      int areaToCompare, int displayableType);
-	static final native boolean _getScreenShot(int toolkitHandle, int handle, String screenShotName, 
-	                                      int topLeftX, int topLeftY, int bottomRightX, int bottomRightY);
-	
-	static final native void _triggerPointerDownEvent(int toolkitHandle, int handle, int x, int y); 	
-	static final native void _triggerPointerUpEvent(int toolkitHandle, int handle, int x, int y); 	
-	static final native void _triggerPointerDragEvent(int toolkitHandle, int handle, int x, int y); 	
-
-	static final native void _changeQwertyInput(int toolkitHandle, int handle, boolean aOn); 	
-	static final native int _switchResolution(int toolkitHandle, int handle, int numTimes, int delayMillis); 
-
-    static final native void _getBoundsOf(int toolkitHandle, int handle, int type, int[] coordinates);	
-    
-    static final native void _allowScreenSaver(int toolkitHandle, int handle, int allow);*/
-
-}
--- a/javauis/eswt_qt/s60utils/java/src/com/nokia/mj/impl/uitestutils/UITestUtils.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-// UITestUtils.java // // //
-
-package com.nokia.mj.impl.uitestutils;
-
-import java.lang.String;
-import org.eclipse.swt.internal.qt.OS;
-
-public class UITestUtils {
-
-    private static final int RES_CHANGE_DEFAULT_DELAY = 5000;
-
-    public UITestUtils() {
-        // Always disable screensaver when running tests.
-        S60Utils.S60DisableScreensaver(); 	
-    }
-
-    /** Init test and s. shot directory, make sure you use slashes to start and
-    end it dir name */
-    public void startTest(String screenShotDir) {
-    }
-
-    /** Ends the test, prints a summary, etc */
-    public void endTest(boolean passed, String msg) {
-    }
-
-    /** Log a message */
-    public void log(String msg) {
-    }
-
-    /** Logs one of the two messages and either PASSED or FAILED according to
-    value of    passed parameter */
-    public void log(boolean passed, String msgPassed, String msgFailed) {
-    }
-
-    /** Sends a key event to the midlet using the specified key and scan code */
-    public void triggerKeyPressEvent(Key key) {
-        int keycode = key.scanCode;
-        int modifiers = key.modifiers;
-        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.PRESS) != 0)
-            throw new RuntimeException("Emulating key press failed");
-        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.RELEASE) != 0)
-            throw new RuntimeException("Emulating key release failed");
-    }
-
-    /** Sends a key down event to the application using the specified key */
-    public void triggerKeyDownEvent(Key key) {
-        int keycode = key.scanCode;
-        int modifiers = key.modifiers;
-        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.PRESS) != 0)
-            throw new RuntimeException("Emulating key press failed");
-    }
-
-    /** Sends a key up event to the application using the specified key */
-    public void triggerKeyUpEvent(Key key) {
-        int keycode = key.scanCode;
-        int modifiers = key.modifiers;
-        if(S60Utils.S60SendKeyToFocusWindow(keycode, modifiers, S60Utils.RELEASE) != 0)
-            throw new RuntimeException("Emulating key release failed");
-    }
-
-
-    /** Triggers key repeat events using the specified key and scan code.
-        Calling this method will trigger the following events to Canvas/CustomItem:
-            1. keyPressed event
-            2. keyRepeated events, the number of events is indicated by count parameter
-            3. keyReleased events
-
-        NOTE 1: This method returns right after triggering the keyPressed event. There should be enough delay
-        after calling this so that all repeat events can be handled before the test result is checked.
-        The delay before triggering first repeat event is 0.6 seconds and between sequential repeat
-        events 0.2 seconds.
-
-        NOTE 2: For triggering media key repeat events triggerMediaKeyRepeatEvents()
-        must be used.
-    */
-    public int triggerKeyRepeatEvents(Key key, int count) {
-        return 0;
-    }
-
-    /** This method must be used when triggering repeat events for media keys.
-        pressedTimeInMillis defines how long a key is kept pressed down.
-
-        NOTE 1: This method returns right after triggering the keyDown event. There should be enough delay
-         (> pressedTimeInMillis) after calling this so that all repeat events and key up can be handled before
-         the test result is checked.
-    */
-    public int triggerMediaKeyRepeatEvents(Key key, int pressedTimeInMillis) {
-        return 0;
-    }
-
-    /** Sends pointer down event to the midlet */
-    public void triggerPointerDownEvent(int x, int y) {
-        // Setting double click interval to 0 disables double clicks, making it possible
-        // to click around in the test cases quickly without causing unwanted double click
-        // events 
-        OS.QApplication_setDoubleClickInterval(0); 	
-        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON1, S60Utils.PRESS) != 0)
-            throw new RuntimeException("Emulating pointer down failed");
-    }
-
-    /** Sends pointer up event to the midlet */
-    public void triggerPointerUpEvent(int x, int y) {
-        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON1, S60Utils.RELEASE) != 0)
-            throw new RuntimeException("Emulating pointer up failed");
-    }
-
-    /** Sends pointer drag event to the midlet */
-    public void triggerPointerDragEvent(int x, int y) {
-        if(S60Utils.S60SendPointerMoveEvent(x, y, S60Utils.BUTTON1) != 0 ) {
-            throw new RuntimeException("Emulating pointer move failed");
-        }
-    }
-
-    /**
-     * Sends a pointer event to open up a context menu. E.g. long-press, right-click
-     * or such depending on the platform.
-     */
-    public void triggerContextPointerEvent(int x, int y) {
-        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON3, S60Utils.PRESS) != 0)
-            throw new RuntimeException("Emulating pointer down failed");
-        if(S60Utils.S60SendPointerEvent(x, y, S60Utils.BUTTON3, S60Utils.RELEASE) != 0)
-            throw new RuntimeException("Emulating pointer up failed");
-    }
-
-    /** Takes a screen shot and saves it into a .png file. Returns true if
-    reference screen shot exists and is identical to the new screen shot*/
-    public boolean getScreenShot(String screenShotName) {
-        return true;
-    }
-
-    /** Takes a screen shot and saves it into a .png file. Returns true if
-    reference screen shot exists and compared area is identical in the reference and new screen shot.
-    areaToCompare and displayableType define the area that is compared. See also SpedeRunner.java.*/
-    public boolean getScreenShot(String screenShotName, int areaToCompare, int displayableType) {
-        return true;
-    }
-
-    /** Takes a screen shot and saves it into a .png file. Returns true if
-    reference screen shot exists and compared area is identical in the reference and new screen shot.
-    Four integer parameters define the rectangle area for screen shot comparison. */
-    public boolean getScreenShot(String screenShotName, int topLeftX, int topLeftY,
-                                                        int bottomRightX, int bottomRightY) {
-        return true;
-    }
-
-    public void dispose() {
-    }
-
-    /** Enable or disable QWERTY input */
-    public void changeQwertyInput(boolean aOn) {
-    }
-
-    public int switchResolution() {
-        return switchResolution(1);
-    }
-
-    /** Change the screen resolution - works only on the emulator */
-    public int switchResolution(int numTimes) {
-        return 0;
-    }
-
-    /** Change the screen resolution - works only on the emulator */
-    public int switchResolutionWithDelay(int delayMillis) {
-        return 0;
-    }
-
-    /**
-     * Get the top left and bottom right coordinates of main pane, form rect, etc.
-     *
-     * @param coordinates   The coordinates are returned in this array
-     * @param type          Defines for which area the coordinates are fetched
-     */
-    public void getBoundsOf(int type, int[] coordinates) {
-    }
-
-    /**
-     * Disable screen saver
-     */
-    public void disableScreenSaver() {
-    }
-
-    /**
-     * Enable screen saver
-     */
-    public void enableScreenSaver() {
-    }
-}
--- a/javauis/eswt_qt/s60utils/native/native.pro	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-######################################################################
-# Automatically generated by qmake (2.01a) Wed 9. Sep 14:45:48 2009
-######################################################################
-
-TEMPLATE = lib
-TARGET = s60uitestutils
-DEPENDPATH += .
-INCLUDEPATH += . /epoc32/include /epoc32/include/domain/middleware
-INCLUDEPATH += ../../../../inc
-
-# Input
-HEADERS += s60utils.h
-SOURCES += s60utils.cpp jni_lookup.cpp
-
-QT += core
-
-TARGET.UID = 0x1000008d
-TARGET.CAPABILITY ="ALL -TCB"
-
-# Temporarily allow WSD, to be removed later if possible
-TARGET.EPOCALLOWDLLDATA = 1
-
-LIBS += -leikcore
-
-DEFINES+=J9EPOC32
-
-# Std cpp requirements
-LIBS += -llibc
-LIBS += -leuser
-LIBS += -llibstdcpp
-LIBS += -ljavautils
-
-DEFINES+= MACRO_WCHAR_T_DECLARED
-QMAKE_CXXFLAGS.CW += -wchar_t on
--- a/javauis/eswt_qt/s60utils/native/s60utils.cpp	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
-#include <e32debug.h>
-#include <e32base.h>
-#include <e32event.h>
-#include <eikenv.h>
-#include <coemain.h>
-#include <e32property.h>
-#include <screensaverinternalpskeys.h>
-#include <e32keys.h>
-
-//#include <QApplication>
-
-#include "s60utils.h"
-// Note following modifilers are from X11 instead of Symbian
-static const TInt Shift                           = (1<<0);
-static const TInt CapsLock                        = (1<<1);
-static const TInt Control                         = (1<<2);
-static const TInt Alt                             = (1<<3);
-static const TInt NumLock                         = (1<<4);
-static const TInt ScrllLock                       = (1<<4);
-static const TInt AltGr                           = (1<<7);
-
-
-static TInt symbianKeyCode(TInt aX11Modifier)
-    {
-    TInt keyCode(0);
-    if( (aX11Modifier & Shift) > 0 )
-        {
-        keyCode = EStdKeyLeftShift;
-        }
-    else if( (aX11Modifier & CapsLock) > 0 )
-        {
-        keyCode = EStdKeyCapsLock;
-        }
-    else if( (aX11Modifier & Control) > 0 )
-        {
-        keyCode = EStdKeyLeftCtrl;
-        }
-    else if( (aX11Modifier & Alt) > 0 )
-        {
-        keyCode = EStdKeyLeftAlt;
-        }
-    else if( (aX11Modifier & NumLock) > 0 )
-        {
-        keyCode = EStdKeyNumLock;
-        }
-    else if( (aX11Modifier & ScrllLock) > 0 )
-        {
-        keyCode = EStdKeyScrollLock;
-        }
-    else if( (aX11Modifier & AltGr) > 0 )
-        {
-        keyCode = EStdKeyRightAlt;
-        }
-    return keyCode;
-    }
-
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendKeyToFocusWindow
-  (JNIEnv *, jclass, jint aKeyCode, jint aModifier, jint aPressOrRelease)
-    {
-    RDebug::Print(_L("S60UITestUtils : S60SendKeyToFocusWindow, keycode=%d"), aKeyCode);
-    
-    User::ResetInactivityTime();// Reset user inactivity timers
-
-    if(aModifier > 0 && aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS)
-        {
-        TRawEvent mevent;
-        TInt keyCode = symbianKeyCode( aModifier);
-        mevent.Set(TRawEvent::EKeyDown, keyCode);
-        UserSvr::AddEvent(mevent);
-        User::After(100000);
-        }
-    
-	TRawEvent event;
-	
-	if (aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS)
-	    {
-	    event.Set(TRawEvent::EKeyDown, aKeyCode);
-	    }
-	else
-	    {
-	    event.Set(TRawEvent::EKeyUp, aKeyCode);
-	    }
-	
-	UserSvr::AddEvent(event);
-    User::After(100000);
-    if(aModifier > 0 && aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_RELEASE)
-        {
-        TRawEvent mevent;
-        TInt keyCode = symbianKeyCode(aModifier);
-        mevent.Set(TRawEvent::EKeyUp, keyCode);
-        UserSvr::AddEvent(mevent);
-        User::After(100000);
-        }
-
-	return 0;
-    }
-
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60KeysymToKeycode
-  (JNIEnv *, jclass, jint)
-    {
-    return 0;
-    }
-
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendPointerEvent
-  (JNIEnv *, jclass, jint aX, jint aY, jint /*aButton*/, jint aPressOrRelease)
-    {
-    User::ResetInactivityTime();// Reset user inactivity timers
-	
-	TRawEvent event;
-	
-	if (aPressOrRelease == com_nokia_mj_impl_uitestutils_S60Utils_PRESS) {
-	    event.Set(TRawEvent::EButton1Down, aX, aY);
-	} else {
-	    event.Set(TRawEvent::EButton1Up, aX, aY);
-    }   
-	UserSvr::AddEvent(event);
-	return 0;
-    }
-
-JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SendPointerMoveEvent
-  (JNIEnv *, jclass, jint aX, jint aY, jint)
-    {
-    User::ResetInactivityTime();// Reset user inactivity timers
-	TRawEvent event;
-	event.Set(TRawEvent::EPointerMove, aX, aY);
-	UserSvr::AddEvent(event);
-    return 0;
-    }
-
-JNIEXPORT void JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60DisableScreensaver
-  (JNIEnv *, jclass)
-    {
-    RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 1 );
-    }
-    
-JNIEXPORT void JNICALL Java_com_nokia_mj_impl_uitestutils_S60Utils_S60SetDoubleclickInterval
-  (JNIEnv *, jclass, jint aInterval)
-    {
-    // Commented out for now. This can be taken into use once Qt doesn't need WSD to be allowed
-    /*QApplication* app = static_cast<QApplication*>(QCoreApplication::instance());
-    if ( app )
-        {
-        app->setDoubleClickInterval( aInterval );
-        }*/
-    }
-    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 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: 
+#
+
+include $(JAVA_SRC_ROOT)/build/Makefile.defs
+
+COMPONENTS = \
+    eswtuitestutils/build \
+    nokiatests/build \
+    
+
+include ${JAVA_SRC_ROOT}/build/Makefile.subsystem
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/ui_mts_sis/Makefile	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 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:
+#
+
+# About signing certificates:
+#	Used signing certificates can be given by specifying certificate 
+#	directories with macro SIGNING_KEY_DIRS. Each .der file in the 
+#	directories is used as certificate, and must be accompanied with
+# 	a .key file having same basename. Directories must be specificed
+#	using slashes as directory separator also in windows. Any path 
+#	accessible by OS can be used, including windows share UNCs.
+
+include $(JAVA_SRC_ROOT)/build/Makefile.defs
+
+SISFILES = java_3_1.sis
+
+
+all: $(SISFILES)
+
+# Find signing certificates from SIGNING_KEY_DIR (*.der, each having .key file)
+# Fix path to native separator
+SIGNING_CERTS=$(call PATHFIX,$(wildcard $(addsuffix /*.der,$(SIGNING_KEY_DIRS))))
+
+$(DEPLOYDIR)/% :: % 
+	if not exist $(WINDEPLOYDIR) mkdir $(WINDEPLOYDIR)
+	copy $< $(subst /,\,$@)
+
+# Recreate the SIS files always
+.phony: ALWAYS
+.phony: all clean reallyclean
+
+
+CPP_SIS_CMD = cpp -lang-asm -P -undef
+
+%.sis: %.pkg ALWAYS
+	$(CPP_SIS_CMD) $< $<.pkg
+	makesis $<.pkg unsigned.$@
+	copy unsigned.$@ $@
+	echo Signing with $(SIGNING_CERTS) \
+	$(foreach cert,$(SIGNING_CERTS), && signsis $@ $@ $(cert) $(basename $(cert)).key)
+	del $<.pkg
+
+clean:
+	del *.sis* 2>NUL
+
+reallyclean: clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/ui_mts_sis/java_3_1.pkg	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,52 @@
+;
+; Copyright (c) 2009 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: 
+;
+;Languages
+&EN
+
+#include "../../../inc/build_defines.hrh"
+
+; UID of the sis file
+#{"Java Runtime"},(0x2001FD68), RD_JAVA_VERSION, TYPE=SA,RU
+
+;Localised Vendor name
+%{"Nokia"}
+
+;Unique Vendor name
+:"Nokia"
+
+;Supports Series 60 v 5.0
+;This line indicates that this installation is for the Series 60 platform v3.0
+;This line must appear _exactly_ as shown below in the sis file
+;If this line is missing or incorrect, the sis file will not be able
+;to be installed on Series 60 v5.0 platforms
+[0x1028315F], 0, 0, 0, {"Series60ProductID"}
+
+
+; Jars
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\nokiaeswttests.jar"-"c:\resource\java\jvm\lib\jrt\nokiaeswttests.jar"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\eswtuitestutils.jar"-"c:\resource\java\jrt\lib\common\eswtuitestutils.jar"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\junit-3.8.1.1.jar"-"c:\resource\java\jvm\lib\jrt\junit-3.8.1.1.jar"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\openlcduitests.jar"-"c:\resource\java\jvm\lib\jrt\openlcduitests.jar"
+
+; test odc files
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\nokiaeswttests.odc"-"c:\resource\java\jvm\lib\jrt\nokiaeswttests.odc"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\openlcduitests.odc"-"c:\resource\java\jvm\lib\jrt\openlcduitests.odc"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\eswtuitestutils.odc"-"c:\resource\java\jvm\lib\jrt\eswtuitestutils.odc"
+"\epoc32\release\armv5\urel\z\resource\java\jvm\lib\jrt\junit-3.8.1.1.odc"-"c:\resource\java\jvm\lib\jrt\junit-3.8.1.1.odc"
+
+"\epoc32\release\armv5\urel\eswtuitestutils.dll"-"c:\sys\bin\eswtuitestutils.dll"
+
+"\epoc32\data\z\resource\java\installerodclist"-"c:\resource\java\installerodclist"
\ No newline at end of file
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/ImageTestUtils.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/ImageTestUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 import org.eclipse.swt.internal.qt.graphics.Image;
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Key.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Key.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 /**
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/KeyFactory.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/KeyFactory.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 public class KeyFactory
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Mask.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Mask.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 /**
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Matrix.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Matrix.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 /**
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Modifier.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Modifier.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 public final class Modifier {
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Point.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Point.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 
 package com.nokia.mj.impl.uitestutils;
 
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Rect.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/Rect.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 /**
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/RuntimeUtils.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/RuntimeUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 public class RuntimeUtils {
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/UITestUtils.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/UITestUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 /**
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibKeys.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibKeys.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 final class XlibKeys {
--- a/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibUtils.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/java/src/com/nokia/mj/impl/uitestutils/XlibUtils.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 package com.nokia.mj.impl.uitestutils;
 
 import org.eclipse.swt.internal.Library;
--- a/javauis/eswt_qt/xlibutils/native/os.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/eswt_qt/xlibutils/native/os.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 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: 
-*
-*/
 // Description: Testing utility for emulating pointer/key input events in X. 
 
 #include <QApplication>
--- a/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java	Fri Jun 11 13:33:44 2010 +0300
@@ -88,6 +88,15 @@
      */
     public abstract boolean isNgaEnabled();
 
+
+    /**
+     * NGA specific change.
+     * LCDUI's client APIs (e.g M3G) can check are they on foreground or not. 
+     * @return <code>true</code> if MIDlet is on foreground.
+     * @since S60 9.2
+     */
+    public abstract boolean isForeground();
+    
     //
     // Image access
     //
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitObserverNGAExtension.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,29 @@
+/*
+* 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:
+*
+*/
+
+
+package com.nokia.mj.impl.rt.legacy;
+
+public interface ToolkitObserverNGAExtension extends ToolkitObserver
+{
+    /**
+     * Notification about MIDlet going to background or coming foreground.
+     * @param foreground    true, when MIDlet came to foreground
+     *                      false, when MIDlet was sent to background
+     */
+    void foregroundEvent(boolean foreground);
+}
\ No newline at end of file
--- a/javauis/javauis.pro	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/javauis.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -14,12 +14,14 @@
 # Description: Generated file - do not edit manually
 #
 TEMPLATE = subdirs
-SUBDIRS += eswt_qt/build/eswtqt.pro 
+SUBDIRS += nokiasound/build/javanokiasound.pro 
+SUBDIRS += eswt_qt/build 
 SUBDIRS += lcdui_qt/build/openlcdui.pro 
 SUBDIRS += runtimeui_qt/build/javaruntimeui.pro 
 SUBDIRS += nokiauiapi_qt/build/nokiauiapiqt.pro 
 SUBDIRS += mmapi_qt/build/javamobilemedia.pro 
 SUBDIRS += amms_qt/build/javaamms.pro 
+SUBDIRS += m3g_qt/build/javam3g.pro 
 SUBDIRS += javalegacyutils 
 BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"coreui/build/bld.inf\""  
 BLD_INF_RULES.prj_extensions += "prj_extensions" 
--- a/javauis/lcdui_qt/src/com/nokia/mj/impl/nokialcdui/LCDUIInvoker.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/com/nokia/mj/impl/nokialcdui/LCDUIInvoker.java	Fri Jun 11 13:33:44 2010 +0300
@@ -94,6 +94,16 @@
     }
 
     /**
+     * Returns the WindowSurface where g will be drawing.
+     * @param g The graphics object
+     * @return WindowSurface where g will be drawing.
+     */
+    public static org.eclipse.swt.internal.qt.graphics.WindowSurface getWindowSurface(Graphics g)
+    {
+        return invokerInstance.doGetWindowSurface(g);
+    }
+    
+    /**
      * Creates LCDUI Image from an eSWT Image. The returned object is a new
      * LCDUI Image object created from the eSWT Image, so this method is not
      * as efficient as getEswtImage.
@@ -202,6 +212,47 @@
     }
 
     /**
+     * Synchronizes any pending buffered draw commands to the target of the 
+     * graphics object.
+     *
+     * Must be called from UI-thread.
+     *
+     * @param graphics The object to synchronize
+     */
+    public static void sync(Object graphics)
+    {
+    	invokerInstance.doSync(graphics);
+    }
+    
+    /**
+     * Begins an external renderer session to given Graphics. An external renderer
+     * could be, for example,  M3G renderer. The opened rendering session must be
+     * ended by calling the endExternalRendering().
+     *
+     * This function must be called from UI-thread only.
+     *
+     * @param g Graphics where the rendering session starts.
+     */
+    public static void startExternalRendering(Graphics g)
+    {
+        invokerInstance.doStartExternalRendering(g);
+    }
+    
+    /**
+     * Ends the external rendering session on given Graphics that was started
+     * by calling startExternalRendering().
+     *
+     * This function must be called from UI-thread only.
+     *
+     * @param g The Graphics instance.
+     */
+    public static void endExternalRendering(Graphics g)
+    {
+        invokerInstance.doEndExternalRendering(g);
+    }
+     
+    
+    /**
      * Returns the dynamic property value.
      *
      * @param key property key
@@ -240,6 +291,8 @@
 
     protected abstract void doSetItemControlStateChangeListener(ItemControlStateChangeListener listener,Item item);
 
+    protected abstract org.eclipse.swt.internal.qt.graphics.WindowSurface doGetWindowSurface( Graphics g );
+    
     // DirectGraphics support
 
     protected abstract DirectGraphics doGetDirectGraphics(Graphics g);
@@ -264,6 +317,12 @@
     protected abstract void doFlushGraphics(Object canvas,
                                             int x, int y, int width, int height);
 
+    protected abstract void doSync(Object graphics);
+    
+    protected abstract void doStartExternalRendering(Graphics g);
+    
+    protected abstract void doEndExternalRendering(Graphics g);
+    
     protected abstract String doGetDynamicProperty(String key);
 
     protected abstract boolean doDetectCollision(Image image1, int transform1, int p1x, int p1y,
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009,2010 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009 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"
@@ -14,11 +14,14 @@
 * Description:
 *
 */
+
 package javax.microedition.lcdui;
 
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.internal.qt.OS;
 import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
 import org.eclipse.swt.internal.qt.graphics.JavaCommandBuffer;
 import org.eclipse.swt.internal.qt.graphics.WindowSurface;
@@ -40,6 +43,13 @@
 abstract class Buffer
 {
 
+    // Default values for Graphics 
+    final static Font defaultFont = Font.getDefaultFont();
+    final static int defaultColor = 0xff000000;
+    final static int defaultStrokeStyle = Graphics.SOLID;
+    final static int defaultTranslateX = 0;
+    final static int defaultTranslateY = 0;
+
     // Constants for buffer host types
     final static int HOST_TYPE_IMAGE = 1;
     final static int HOST_TYPE_CANVAS = 2;
@@ -68,12 +78,10 @@
     private JavaCommandBuffer commandBuffer;
     private Rectangle hostBounds;
     private Graphics currentClient;
-    private boolean started;
+    private boolean isInitialized;
     private int clientCount;
-
-    // The target window surface where this
-    // instance flushes draw primitives
-    WindowSurface windowSurface;
+    
+    private boolean isSurfaceSessionOpen;
 
     /**
      * Constructor
@@ -90,16 +98,57 @@
     }
 
     /**
+     * Creates Buffer instance based on the type of given host object 
+     * and the platform (symbian/linux) currently running on.
+     * 
+     * @param host The host target where pixels are drawn. Given object must be Canvas, CustomItem or Image.
+     * @param control The eSWT control associated with the target, or null if the host is Image
+     * @return New buffer instance
+     */
+    static Buffer createInstance(Object host, Control control)
+    {
+    	if(host instanceof Canvas) 
+    	{
+    		if(OS.windowServer == OS.WS_SYMBIAN_S60)
+    		{	
+    		    return new CanvasBufferSymbian((Canvas) host, control);
+    		}
+    		else if(OS.windowServer == OS.WS_X11)
+    		{
+    			return new CanvasBufferLinux((Canvas) host, control);
+    		}
+  			return null;
+    	} 
+    	else if(host instanceof CustomItem)
+    	{
+    		if(OS.windowServer == OS.WS_SYMBIAN_S60)
+    		{	
+    		    return new CustomItemBufferSymbian((CustomItem) host, control);
+    		}
+    		else if(OS.windowServer == OS.WS_X11)
+    		{
+    			return new CustomItemBufferLinux((CustomItem) host, control);
+    		}
+  			return null;
+    	} 
+    	else if(host instanceof Image) 
+    	{
+    	    return new ImageBuffer((Image) host);	
+    	}
+    	return null;
+    }
+    
+    /**
      * Initializes data, called once
      */
-    void init()
+    protected void init()
     {
         clientCount = 0;
         gc = new GraphicsContext();
         commandBuffer = new JavaCommandBuffer();
         gc.bindTarget(commandBuffer);
         writeControlBoundsToBuffer(false);
-        started = true;
+        isInitialized = true;
     }
 
     /**
@@ -113,86 +162,182 @@
      */
     void setControlBounds(final Control control)
     {
-        ESWTUIThreadRunner.safeSyncExec(new Runnable()
-        {
-            public void run()
-            {
-                // This implementation is based on the fact that
-                // the QWindowSurface has the size of the shell active area
-                // not the whole display, thus Shell clientArea equals QWindowSurface.
-                // This might change in future if/when Qt starts
-                // rendering e.g. the status pane i.e. the whole display
-                // to window surface
-                Point controlLoc = control.toDisplay(0,0);
-                Point shellLoc = control.getShell().toDisplay(0,0);
-                hostBounds.x = controlLoc.x - shellLoc.x;
-                hostBounds.y = controlLoc.y - shellLoc.y;
-                hostBounds.width = control.getBounds().width;
-                hostBounds.height = control.getBounds().height;
-            }
-        });
+        // This implementation is based on the fact that
+        // the QWindowSurface has the size of the shell active area
+        // not the whole display, thus Shell clientArea equals QWindowSurface.
+        // This might change in future if/when Qt starts
+        // rendering e.g. the status pane i.e. the whole display
+        // to window surface
+        Point controlLoc = control.toDisplay(0,0);
+        Point shellLoc = control.getShell().toDisplay(0,0);
+        hostBounds.x = controlLoc.x - shellLoc.x;
+        hostBounds.y = controlLoc.y - shellLoc.y;
+        hostBounds.width = control.getBounds().width;
+        hostBounds.height = control.getBounds().height;
     }
 
     /**
-     * Performs binding to target in host specific way
+     * Prepares surface for a new frame and starts paint session. 
+     * Must be called in UI thread (sync calls this automatically)
+     * and at the start of new frame. The rectangle provided as 
+     * arguments are in control coordinates.
+     * 
+     * @param x The x-coordinate of the area to be painted
+     * @param y The y-coordinate of the area to be painted
+     * @param w The width of the area to be painted
+     * @param h The height of the area to be painted
+     */
+    void startFrame(int x, int y, int w, int h)
+    {
+    	if(!isSurfaceSessionOpen)
+    	{
+    	    beginPaint(x, y, w, h);
+    	    isSurfaceSessionOpen = true;
+    	}
+    }
+    
+    /**
+     * Ends frame painting session. Must be called in UI thread and
+     * at the end of the frame. BlitToDisplay calls this automatically.
+     */
+    void endFrame()
+    {
+    	if(isSurfaceSessionOpen)
+    	{
+    		endPaint();
+    	    isSurfaceSessionOpen = false;
+    	}
+    }
+    
+    /**
+     * Transfers the result of rendering to display.
+     * @param gc The graphics context used for blit, may be null in some cases
+     * @param widget The widget that is the target 
+     */
+    void blitToDisplay(GraphicsContext gc, Widget widget)
+    {
+  	    endFrame();
+    	blit(gc, widget);
+    }
+    
+    /** 
+     * Prepares surface for painting, implemented by
+     * child implementation.
+     * @param x The x-coordinate of the area to be painted
+     * @param y The y-coordinate of the area to be painted
+     * @param w The width of the area to be painted
+     * @param h The height of the area to be painted
+     */
+    abstract void beginPaint(int x, int y, int w, int h);
+    
+    /**
+     * Ends frame painting session. Must be called in UI thread and
+     * at the end of the frame. Implemented by
+     * child implementation.
+     */
+    abstract void endPaint();
+    
+    /**
+     * Performs binding to target in host specific way. Implemented by
+     * child implementation.
      */
     abstract void bindToHost(GraphicsContext gc);
-
+    
+    /** 
+     * Performs the actual blit operation in child class implementation.
+     * @param gc The graphics context used for blit, may be null in some cases
+     * @param widget The widget that is the target 
+     */
+    abstract void blit(GraphicsContext gc, Widget widget);
+    
     /**
-     * Getter for the host of the buffer
+     * Getter for the host of the buffer, implemented by
+     * child implementation.
      * @return The host
      */
     abstract Object getHost();
 
     /**
-     * Getter for the host type
+     * Getter for the host type,implemented by
+     * child implementation.
      * @return One of host types defined in this class
      */
     abstract int getHostType();
 
     /**
-     *  Setups the window surface if not setup already.
-     *  This method must be called before flushing buffer to
-     *  window surface
-     *  Note. must be called in UI thread
+     * Status checker that indicates if this instance has requested a synchronous paint event, 
+     * implemented by child implementation.
+     * @return True if this instance has requested a redraw paint event, otherwise false
      */
-    abstract void setupWindowSurface();
-
+    abstract boolean isPaintingActive(); 
+    
     /**
      * Creates and returns new Graphics instance
      * @return new Graphics instance
      */
     Graphics getGraphics()
     {
-        if(!started)
+        if(!isInitialized)
         {
             init();
         }
         clientCount++;
-        return new Graphics(this);
+        // In case this is the first Graphics instance
+        // write the default values to the buffer
+        if(clientCount == 1) 
+        {
+            writeDefaultValuesToBuffer();	
+        }
+        return new Graphics(this, hostBounds );
     }
 
     /**
      * Synchronizes this buffer with the actual target
      * must be called in UI thread. If no Graphics instances
-     * are creates, sync has no effect
+     * are created, sync has no effect. This variant always closes 
+     * the surface session unconditionally
      */
-    void sync()
+    void sync() 
     {
-        if(!started)
+    	sync(true);
+    }
+    
+    /**
+     * Synchronizes this buffer with the actual target
+     * must be called in UI thread. If no Graphics instances
+     * are created, sync has no effect
+     * 
+     * @param closeSurfaceSession If true the endFrame is called after sync has been 
+     *                            performed closing the surface session, otherwise
+     *                            endFrame is performed and surface session is left open
+     */
+    void sync(boolean closeSurfaceSession)
+    {
+        if(!isInitialized)
         {
             return;
         }
+        
         // if there's nothing to flush return
         if(!commandBuffer.containsDrawnPrimitives())
         {
             return;
         }
+        
+        // Start surface session if not started yet
+       	startFrame(hostBounds.x, hostBounds.y , hostBounds.width , hostBounds.height);
+        
         doRelease();
         bindToHost(gc);
         gc.render(commandBuffer);
         doRelease();
 
+        // Close surface session
+        if(closeSurfaceSession)
+        {
+            endFrame();
+        }
+        
         // Reset commands
         commandBuffer.reset();
 
@@ -220,9 +365,12 @@
      */
     void dispose()
     {
-        doRelease();
-        gc.dispose();
-        gc = null;
+    	if(gc != null) 
+    	{
+            doRelease();
+            gc.dispose();
+            gc = null;
+    	}
         commandBuffer = null;
     }
 
@@ -501,6 +649,16 @@
 
 
     /**
+     * Returns the WindowSurface that relates to this Buffer
+     *
+     * @return WindowSurface owned by this Buffer
+     */
+    WindowSurface getWindowSurface()
+    {
+        return null;
+    }
+    
+    /**
      * Translates given rectangle to display/window surface coordinates
      * and outlines the clip inside the control bounds.
      *
@@ -607,10 +765,10 @@
         }
         if((STROKESTYLE & flags) != 0)
         {
-            if(bufferStrokeStyle != client.currentStrokeSyle)
+            if(bufferStrokeStyle != client.currentStrokeStyle)
             {
-                gc.setStrokeStyle(Graphics.mapStrokeStyle(client.currentStrokeSyle));
-                bufferStrokeStyle = client.currentStrokeSyle;
+                gc.setStrokeStyle(Graphics.mapStrokeStyle(client.currentStrokeStyle));
+                bufferStrokeStyle = client.currentStrokeStyle;
             }
         }
     }
@@ -655,6 +813,24 @@
         }
     }
 
+   /**
+    * Writes Graphics default values to buffer
+    */
+    private void writeDefaultValuesToBuffer()
+    {
+        int handle = Font.getESWTFont(defaultFont).handle;
+        gc.setFont(handle);
+        bufferFontHandle = handle;
+        gc.setBackgroundColor(defaultColor, true);
+        gc.setForegroundColor(defaultColor, true);
+        bufferColor = defaultColor;
+        gc.setStrokeStyle(Graphics.mapStrokeStyle(defaultStrokeStyle));
+        bufferStrokeStyle = defaultStrokeStyle;
+        gc.resetTransform();
+        bufferTranslateX = defaultTranslateX;
+        bufferTranslateY = defaultTranslateY;
+    }
+    
     private void doRelease()
     {
         gc.releaseTarget();
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java	Fri Jun 11 13:33:44 2010 +0300
@@ -158,8 +158,12 @@
     // Canvas Graphics object passed to paint(Graphics g)
     private Graphics canvasGraphics;
 
+    // Graphics object for transferring return values
+    // from UI thread
+    private Graphics tempGraphics;
+    
     // Graphics command buffer for this instance
-	CanvasBuffer graphicsBuffer;
+	Buffer graphicsBuffer;
 	
     //On Screen Keypad
     //private Composite keypadComposite;
@@ -209,7 +213,6 @@
         cleanupLock = new Object();
         construct();
         keysPressed = new Vector();
-        graphicsBuffer = new CanvasBuffer(this, getContentComp());
     }
 
     /* (non-Javadoc)
@@ -301,6 +304,8 @@
             onScreenkeypad = new CanvasKeypad(this, canvasComp, oskAttr);
         }
 
+        // create graphics buffer
+        graphicsBuffer = Buffer.createInstance(this, canvasComp);
 
         return canvasComp;
     }
@@ -622,7 +627,15 @@
      */
     final Graphics getGameBufferGraphics()
     {
-        return graphicsBuffer.getGraphics();
+    	tempGraphics = null;
+   		ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+		{
+			public void run()
+			{
+				tempGraphics =  graphicsBuffer.getGraphics();
+			}
+		});
+    	return tempGraphics;
     }
 
     CanvasKeypad getCanvasKeypad()
@@ -666,11 +679,18 @@
     void flushGameBuffer(final int x, final int y, final int width,
                          final int height)
     {
-        synchronized(graphicsBuffer)
+    	synchronized(graphicsBuffer)
         {
-            flushGraphicsBuffer(x, y, width, height);
+    		ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+			{
+				public void run()
+				{
+					graphicsBuffer.sync();
+					graphicsBuffer.blitToDisplay(null, getContentComp());
+				}
+            });
         }
-    }
+    }	
 
     /**
      * Called by ShellListener when shell gets activated.
@@ -708,10 +728,9 @@
     {
         super.eswtHandleResizeEvent(width, height);
         // update new bounds to graphicsBuffer
-        synchronized(graphicsBuffer)
-        {
-            graphicsBuffer.setControlBounds(getContentComp());
-        }
+        // this call must not be synchronized as we 
+        // cannot use locking in UI thread
+        graphicsBuffer.setControlBounds(getContentComp());
         synchronized(cleanupLock)
         {
             cleanupNeeded = true;
@@ -739,26 +758,33 @@
      */
     class CanvasShellPaintListener implements PaintListener
     {
-
         public void paintControl(PaintEvent pe)
         {
-            // Native toolkit is requesting an update of an area that has
-            // become invalid. Can't do anything here because the contents
-            // need to be queried from the MIDlet in another thread by
-            // a paint callback. For this a paint callback event is posted.
-            // For a moment the native toolkit thinks that the area has
-            // been validated when in truth it will be painted later after
-            // the paint callback has been executed.
-            EventDispatcher eventDispatcher = EventDispatcher.instance();
-            LCDUIEvent event = eventDispatcher.newEvent(
-                                   LCDUIEvent.CANVAS_PAINT_NATIVE_REQUEST,
-                                   javax.microedition.lcdui.Canvas.this);
-            event.x = pe.x;
-            event.y = pe.y;
-            event.width = pe.width;
-            event.height = pe.height;
-            event.widget = pe.widget;
-            eventDispatcher.postEvent(event);
+            // Check if we got here from buffer flush
+        	if(graphicsBuffer.isPaintingActive()) 
+        	{
+        	    graphicsBuffer.blitToDisplay(pe.gc.getGCData().internalGc, null);
+        	}
+        	else
+        	{
+                // Native toolkit is requesting an update of an area that has
+                // become invalid. Can't do anything here because the contents
+                // need to be queried from the MIDlet in another thread by
+                // a paint callback. For this a paint callback event is posted.
+                // For a moment the native toolkit thinks that the area has
+                // been validated when in truth it will be painted later after
+                // the paint callback has been executed.
+                EventDispatcher eventDispatcher = EventDispatcher.instance();
+                LCDUIEvent event = eventDispatcher.newEvent(
+                                       LCDUIEvent.CANVAS_PAINT_NATIVE_REQUEST,
+                                       javax.microedition.lcdui.Canvas.this);
+                event.x = pe.x;
+                event.y = pe.y;
+                event.width = pe.width;
+                event.height = pe.height;
+                event.widget = pe.widget;
+                eventDispatcher.postEvent(event);
+        	}
         }
     }
 
@@ -851,7 +877,14 @@
         // Create instance of Graphics if not created yet
         if(canvasGraphics == null)
         {
-            canvasGraphics = graphicsBuffer.getGraphics();
+        	 ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+             {
+          	    public void run()
+         	    {
+                    canvasGraphics = graphicsBuffer.getGraphics();
+                    canvasGraphics.setSyncStrategy(Graphics.SYNC_LEAVE_SURFACE_SESSION_OPEN);
+         	    }
+             });
         }
 
         // Clean the background if dirty, buffer the operations.
@@ -877,29 +910,22 @@
         // The callback
         paint(canvasGraphics);
 
-
-        // Flush drawn graphics to display
-        synchronized(graphicsBuffer)
-        {
-            flushGraphicsBuffer(redrawNowX, redrawNowY, redrawNowW, redrawNowH);
-        }
-    }
-
-    private void flushGraphicsBuffer(final int redrawNowX, final int redrawNowY, final int redrawNowW, final int redrawNowH)
-    {
-        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        // Blit frame to display
+        synchronized(graphicsBuffer) 
         {
-            public void run()
+            ESWTUIThreadRunner.safeSyncExec(new Runnable() 
             {
-                graphicsBuffer.setupWindowSurface();
-                Rectangle rect = graphicsBuffer.toWindowCoordinates(redrawNowX, redrawNowY, redrawNowW, redrawNowH);
-                graphicsBuffer.windowSurface.beginPaint(rect.x, rect.y, rect.width, rect.height);
-                graphicsBuffer.sync();
-                graphicsBuffer.windowSurface.endPaint();
-                graphicsBuffer.windowSurface.flush();
-            }
-
-        });
+         	    public void run()
+        	    {
+        		    if(event.widget.isDisposed())
+        		    {
+        			    return;
+        		    }
+        		    graphicsBuffer.sync();
+        		    graphicsBuffer.blitToDisplay(null, event.widget);
+                }
+            });
+        }
     }
 
     /*
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBuffer.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
-* Copyright (c) 2009,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:
-*
-*/
-package javax.microedition.lcdui;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
-import org.eclipse.swt.widgets.Internal_PackageSupport;
-
-final class CanvasBuffer extends Buffer
-{
-
-    private Canvas host;
-
-    CanvasBuffer(Canvas canvas, Control ctrl)
-    {
-        super();
-        setControlBounds(ctrl);
-        host = canvas;
-    }
-
-    int getHostType()
-    {
-        return HOST_TYPE_CANVAS;
-    }
-
-    void setupWindowSurface()
-    {
-        if(super.windowSurface == null)
-        {
-            super.windowSurface = Internal_PackageSupport.getWindowsurface(host.getShell());
-        }
-    }
-
-    Object getHost()
-    {
-        return host;
-    }
-
-    void bindToHost(GraphicsContext gc)
-    {
-        gc.bindTarget(super.windowSurface);
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBufferLinux.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+package javax.microedition.lcdui;
+
+import org.eclipse.swt.internal.extension.CompositeExtension;
+import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swt.internal.qt.graphics.WindowSurface;
+
+
+final class CanvasBufferLinux extends Buffer {
+
+	private Canvas host;
+	private WindowSurface surface;
+	private boolean syncPaintCallback;
+	private int paintX, paintY;
+	private int paintW, paintH;
+	
+	CanvasBufferLinux(Canvas canvas, Control ctrl)
+	{
+        super();
+        setControlBounds(ctrl);
+        host = canvas;
+	}
+    
+	protected void init() 
+    {
+    	super.init();
+    	surface = Internal_PackageSupport.getWindowsurface(host.getShell());
+    }
+	
+	void bindToHost(GraphicsContext gc) 
+	{
+		gc.bindTarget(surface);
+	}
+
+	void beginPaint(int x, int y, int w, int h) 
+	{
+		paintX = x; 
+		paintY = y;
+		paintW = w;
+		paintH = h;
+		surface.beginPaint(paintX, paintY, paintW, paintH);
+	}
+	
+	void endPaint() 
+	{
+	    // nothing to do	
+	}
+
+	void blit(GraphicsContext gc, Widget widget) 
+	{
+		// On linux platform this method is called in order to 
+		// request new paint event and also from the actual paint event itself to blit the
+		// frame to display.
+		// The behavior of this method depends on the syncpaintCallback flag, which 
+		// indicates on which above scenario we are in each time.
+        
+		// If we are within the paint callback
+		// draw the window surface to display
+		if(syncPaintCallback) 
+		{
+			gc.drawWindowSurface(surface, paintX, paintX, paintW, paintH);
+		}
+		else
+		{	
+			// We are requesting a paint event
+			syncPaintCallback = true;
+			((CompositeExtension)widget).redrawNow(paintX, paintY, paintW, paintH);
+			syncPaintCallback = false;
+			
+			// Once the display has been updated, 
+			// clear the invalidate area
+			paintX = paintY = paintW = paintH = 0; 
+		}
+	}
+	
+	Object getHost() 
+	{	
+		return host;
+	}
+
+	int getHostType() 
+	{
+		return HOST_TYPE_CANVAS;
+	}
+
+	boolean isPaintingActive() {
+		return syncPaintCallback;
+	}
+	
+	WindowSurface getWindowSurface()
+    {
+        return surface;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CanvasBufferSymbian.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+package javax.microedition.lcdui;
+
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.internal.qt.graphics.WindowSurface;
+
+final class CanvasBufferSymbian extends Buffer
+{
+    private Canvas host;
+    private WindowSurface surface;
+
+    CanvasBufferSymbian(Canvas canvas, Control ctrl)
+    {
+        super();
+        setControlBounds(ctrl);
+        host = canvas;
+    }
+    
+    void ensureWindowSurface() 
+    {
+    	if(surface == null)
+    	{
+    	    surface = Internal_PackageSupport.getWindowsurface(host.getShell());
+    	}
+    }
+    
+    void beginPaint(int x, int y, int w, int h) {
+		ensureWindowSurface();
+		Rectangle rect = toWindowCoordinates(x, y, w, h);
+		surface.beginPaint(rect.x, rect.y, rect.width, rect.height);		
+	}
+	
+    void endPaint() {
+		surface.endPaint();
+	}
+	
+	void blit(GraphicsContext gc, Widget widget)
+	{
+	    if( surface != null )
+	    {
+    		surface.flush();
+    	}
+	}
+	
+    int getHostType()
+    {
+        return HOST_TYPE_CANVAS;
+    }
+
+    Object getHost()
+    {
+        return host;
+    }
+
+    void bindToHost(GraphicsContext gc)
+    {
+    	gc.bindTarget(surface);
+    }
+
+	boolean isPaintingActive() {
+		return false;
+	}
+	
+    WindowSurface getWindowSurface()
+    {
+        return surface;
+    }
+}
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -67,7 +67,7 @@
     private com.nokia.mj.impl.rt.support.Finalizer finalizer;
 
     // Graphics command buffer for this instance
-    CustomItemBuffer graphicsBuffer;
+    Buffer graphicsBuffer;
     Graphics CustomItemGraphics;
 
     CustomItemLayouter layouter;
@@ -552,8 +552,9 @@
                 }
                 if(CustomItemGraphics == null)
                 {
-                    graphicsBuffer = new CustomItemBuffer(self, (Control)event.widget);
+                    graphicsBuffer = Buffer.createInstance(self, (Control)event.widget);
                     CustomItemGraphics = graphicsBuffer.getGraphics();
+                    CustomItemGraphics.setSyncStrategy(Graphics.SYNC_LEAVE_SURFACE_SESSION_OPEN);
                 }
                 else
                 {
@@ -604,31 +605,8 @@
                 {
                     return;
                 }
-                // Transform invalid area to Display coordinates
-                // as the CustomItem is rendered directly to the
-                // window surface
-                Point topleft = ((Control)event.widget).toDisplay(redrawNowX, redrawNowY);
-
-                synchronized(graphicsBuffer)
-                {
-                    flushGraphicsBuffer(topleft.x, topleft.y, redrawNowW, redrawNowH);
-                }
-            }
-        });
-    }
-
-    private void flushGraphicsBuffer(final int redrawNowX, final int redrawNowY, final int redrawNowW, final int redrawNowH)
-    {
-        ESWTUIThreadRunner.safeSyncExec(new Runnable()
-        {
-            public void run()
-            {
-                graphicsBuffer.setupWindowSurface();
-                Rectangle rect = graphicsBuffer.toWindowCoordinates(redrawNowX, redrawNowY, redrawNowW, redrawNowH);
-                graphicsBuffer.windowSurface.beginPaint(rect.x, rect.y, rect.width, rect.height);
                 graphicsBuffer.sync();
-                graphicsBuffer.windowSurface.endPaint();
-                graphicsBuffer.windowSurface.flush();
+                graphicsBuffer.blitToDisplay(null, event.widget);
             }
         });
     }
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBuffer.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
-* Copyright (c) 2009,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:
-*
-*/
-package javax.microedition.lcdui;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
-import org.eclipse.swt.widgets.Control;
-
-final class CustomItemBuffer extends Buffer
-{
-
-    private CustomItem host;
-
-    CustomItemBuffer(CustomItem customItem, Control ctrl)
-    {
-        super();
-        setControlBounds(ctrl);
-        host = customItem;
-    }
-
-    int getHostType()
-    {
-        return HOST_TYPE_CUSTOMITEM;
-    }
-
-    void setupWindowSurface()
-    {
-        throw new IllegalStateException("not impl yet");
-        // TODO Auto-generated method stub
-
-    }
-
-    Object getHost()
-    {
-        return host;
-    }
-
-    void bindToHost(GraphicsContext gc)
-    {
-        gc.bindTarget(super.windowSurface);
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBufferLinux.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+package javax.microedition.lcdui;
+
+import org.eclipse.swt.internal.extension.CanvasExtension;
+import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
+import org.eclipse.swt.internal.qt.graphics.WindowSurface;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Widget;
+
+
+final class CustomItemBufferLinux extends Buffer {
+
+    private CustomItem host;
+    private WindowSurface surface;
+    private boolean syncPaintCallback;
+	private int paintX, paintY;
+	private int paintW, paintH;
+
+    CustomItemBufferLinux(CustomItem customItem, Control ctrl)
+    {
+        super();
+        setControlBounds(ctrl);
+        host = customItem;
+    }
+	
+    protected void init() 
+    {
+    	super.init();
+    	surface = Internal_PackageSupport.getWindowsurface(host.layouter.dfi.getForm().getContentComp().getShell());
+    }
+    
+    void bindToHost(GraphicsContext gc) {
+		gc.bindTarget(surface);
+	}
+
+	void blit(GraphicsContext gc, Widget widget) {
+		// On linux platform this method is called in order to 
+		// request new paint event and also from the actual paint event itself to blit the
+		// frame to display.
+		// The behavior of this method depends on the syncpaintCallback flag, which 
+		// indicates on which above scenario we are in each time.
+        
+		// If we are within the paint callback
+		// draw the window surface to display
+		if(syncPaintCallback) 
+		{
+			gc.drawWindowSurface(surface, paintX, paintX, paintW, paintH);
+		}
+		else
+		{	
+			// We are requesting a paint event
+			syncPaintCallback = true;
+			((CanvasExtension)widget).redrawNow(paintX, paintY, paintW, paintH);
+			syncPaintCallback = false;
+			
+			// Once the display has been updated, 
+			// clear the invalidate area
+			paintX = paintY = paintW = paintH = 0; 
+		}		
+	}
+
+	void endPaint() {
+		// nothing to do
+	}
+
+	Object getHost() {
+		return host;
+	}
+
+	int getHostType() {
+		return Buffer.HOST_TYPE_CUSTOMITEM;
+	}
+
+	void beginPaint(int x, int y, int w, int h) {
+		paintX = x; 
+		paintY = y;
+		paintW = w;
+		paintH = h;
+		surface.beginPaint(paintX, paintY, paintW, paintH);
+	}
+
+	boolean isPaintingActive() {
+		return syncPaintCallback;
+	}
+
+    WindowSurface getWindowSurface()
+    {
+        return surface;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemBufferSymbian.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+package javax.microedition.lcdui;
+
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
+import org.eclipse.swt.internal.qt.graphics.WindowSurface;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Widget;
+
+final class CustomItemBufferSymbian extends Buffer
+{
+    private CustomItem host;
+    private WindowSurface surface;
+
+    CustomItemBufferSymbian(CustomItem customItem, Control ctrl)
+    {
+        super();
+        setControlBounds(ctrl);
+        host = customItem;
+    }
+
+    protected void init() 
+    {
+    	super.init();
+    	surface = Internal_PackageSupport.getWindowsurface(host.layouter.dfi.getForm().getContentComp().getShell());
+    }
+    
+    int getHostType()
+    {
+        return HOST_TYPE_CUSTOMITEM;
+    }
+
+    Object getHost()
+    {
+        return host;
+    }
+
+    void bindToHost(GraphicsContext gc)
+    {
+        gc.bindTarget(surface);
+    }
+
+    void blit(GraphicsContext gc, Widget widget) {
+		surface.flush();
+	}
+
+    void endPaint() {
+		surface.endPaint();
+	}
+
+    void beginPaint(int x, int y, int w, int h) {
+		Rectangle rect = toWindowCoordinates(x, y, w, h);
+		surface.beginPaint(rect.x, rect.y, rect.width, rect.height);
+	}
+
+	boolean isPaintingActive() {
+		return false;
+	}
+	
+	WindowSurface getWindowSurface()
+    {
+        return surface;
+    }
+}
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemLayouter.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/CustomItemLayouter.java	Fri Jun 11 13:33:44 2010 +0300
@@ -423,23 +423,37 @@
 
         public void paintControl(PaintEvent pe)
         {
-            // Native toolkit is requesting an update of an area that has
-            // become invalid. Can't do anything here because the contents
-            // need to be queried from the MIDlet in another thread by
-            // a paint callback. For this a paint callback event is posted.
-            // For a moment the native toolkit thinks that the area has
-            // been validated when in truth it will be painted later after
-            // the paint callback has been executed.
-            EventDispatcher eventDispatcher = EventDispatcher.instance();
-            LCDUIEvent event = eventDispatcher.newEvent(
-                                   LCDUIEvent.CUSTOMITEM_PAINT_NATIVE_REQUEST, dfi.getForm());
-            event.x = pe.x;
-            event.y = pe.y;
-            event.width = pe.width;
-            event.height = pe.height;
-            event.widget = pe.widget;
-            event.item = customItem;
-            eventDispatcher.postEvent(event);
+        	// graphicsBuffer may be null when control
+        	// is brought to foreground the first time
+        	if(customItem.graphicsBuffer != null)
+        	{
+        		// If we have initiated a synchronous paint event 
+        		// draw the buffer to display here
+        	    if(customItem.graphicsBuffer.isPaintingActive()) 
+        	    {
+        		    customItem.graphicsBuffer.blitToDisplay(pe.gc.getGCData().internalGc, null);
+        	    }
+        	}
+        	else 
+        	{
+        	    // Native toolkit is requesting an update of an area that has
+                // become invalid. Can't do anything here because the contents
+                // need to be queried from the MIDlet in another thread by
+                // a paint callback. For this a paint callback event is posted.
+        	    // For a moment the native toolkit thinks that the area has
+                // been validated when in truth it will be painted later after
+                // the paint callback has been executed.
+                EventDispatcher eventDispatcher = EventDispatcher.instance();
+                LCDUIEvent event = eventDispatcher.newEvent(
+                                       LCDUIEvent.CUSTOMITEM_PAINT_NATIVE_REQUEST, dfi.getForm());
+                event.x = pe.x;
+                event.y = pe.y;
+                event.width = pe.width;
+                event.height = pe.height;
+                event.widget = pe.widget;
+                event.item = customItem;
+                eventDispatcher.postEvent(event);
+        	}
         }
     }
 
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Font.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Font.java	Fri Jun 11 13:33:44 2010 +0300
@@ -459,7 +459,14 @@
      */
     public int charsWidth(char[] c, int offset, int length)
     {
-        return stringWidth(new String(c, offset, length));
+        try 
+        {
+           final String string = new String(c, offset, length);
+           return stringWidth(string);
+        }catch (StringIndexOutOfBoundsException ex) 
+        {
+            throw new ArrayIndexOutOfBoundsException();
+        }
     }
 
     /**
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Form.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Form.java	Fri Jun 11 13:33:44 2010 +0300
@@ -250,7 +250,7 @@
             throw new IllegalStateException(
                 MsgRepository.FORM_EXCEPTION_ITEM_OWNED_BY_CONTAINER);
         }
-        if((position < 0) || (position > (items.size() - 1)))
+        if ((position < 0) || (position > items.size() )) 
         {
             throw new IndexOutOfBoundsException(
                 MsgRepository.FORM_EXCEPTION_INVALID_ITEM_INDEX);
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Graphics.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Graphics.java	Fri Jun 11 13:33:44 2010 +0300
@@ -84,28 +84,30 @@
 
     static final int COMPONENT_MASK = 0xFF;
 
+    /**
+     * Constants for sync strategy
+     */
+    static final int SYNC_LEAVE_SURFACE_SESSION_CLOSED = 10;
+    static final int SYNC_LEAVE_SURFACE_SESSION_OPEN = 11;
+    
+    // Set default sync strategy as closed
+    private int syncStrategy = SYNC_LEAVE_SURFACE_SESSION_CLOSED; 
+    
     private DirectGraphics directGraphics;
     private Buffer graphicsBuffer;
 
-    // Off-screen buffer.
-    //private org.eclipse.swt.internal.qt.graphics.Image frameBuffer;
-
     // Current font for rendering texts.
     Font currentFont;
     int currentColor;
     int translateX;
     int translateY;
     int[] currentClip = new int[4];
-    int currentStrokeSyle;
+    int currentStrokeStyle;
 
     private com.nokia.mj.impl.rt.support.Finalizer finalizer;
-    // serialization lock for command buffering and flush
-    private final Object flushLock = new Object();
-    private Canvas canvasParent;
-    private CustomItem customItemParent;
 
     //Constructor
-    Graphics(Buffer buffer)
+    Graphics(Buffer buffer, Rectangle clipRect)
     {
         finalizer = ((finalizer != null) ? finalizer
                      : new com.nokia.mj.impl.rt.support.Finalizer()
@@ -129,6 +131,10 @@
                 }
             }
         });
+        currentClip[0] = clipRect.x;
+        currentClip[1] = clipRect.y;
+        currentClip[2] = clipRect.width;
+        currentClip[3] = clipRect.height;
         graphicsBuffer = buffer;
         reset();
     }
@@ -151,11 +157,11 @@
      */
     void reset()
     {
-        setColor(0, 0, 0);
-        setFont(Font.getDefaultFont());
-        setStrokeStyle(Graphics.SOLID);
-        this.translateX = 0;
-        this.translateY = 0;
+        currentFont = Buffer.defaultFont;
+        currentColor = Buffer.defaultColor;
+        currentStrokeStyle = Buffer.defaultStrokeStyle;
+        translateX = Buffer.defaultTranslateX;
+        translateY = Buffer.defaultTranslateY;
     }
 
     /**
@@ -180,7 +186,19 @@
         setColor(savedColor);
     }
 
-
+    /**
+     * Sets the sync strategy for this instance.
+     * This affects on the behavior of the sync method of this class
+     * which is called via LCDUIInvoker
+     */
+    void setSyncStrategy(int strategy)
+    {
+    	if((strategy != SYNC_LEAVE_SURFACE_SESSION_CLOSED) && (strategy != SYNC_LEAVE_SURFACE_SESSION_OPEN)) 
+    	{
+    		throw new IllegalArgumentException("Internal: Invalid strategy value");
+    	}
+    	syncStrategy = strategy;
+    }
 
     /**
      * Sets coordinate translation. Translations are cumulative.
@@ -855,8 +873,22 @@
 
             synchronized(image.graphicsBuffer)
             {
-                image.sync();
-                graphicsBuffer.drawImage(Internal_GfxPackageSupport.getImage(Image.getESWTImage(image)), x, y, this);
+                final Image localLcduiImage = image;
+                final org.eclipse.swt.internal.qt.graphics.Image localCgfxImage = 
+                	Internal_GfxPackageSupport.getImage(Image.getESWTImage(image));
+                final int localX = x;
+                final int localY = y;
+                final Graphics self = this;
+                
+                ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+    			{
+    				public void run()
+    				{
+    					localLcduiImage.sync(false);
+    					graphicsBuffer.drawImage(localCgfxImage, localX, localY, self);
+    				}
+    			});
+                
             }
         }
     }
@@ -910,7 +942,7 @@
      */
     public void setStrokeStyle(int newStyle)
     {
-        if(newStyle == currentStrokeSyle)
+        if(newStyle == currentStrokeStyle)
         {
             return;
         }
@@ -923,7 +955,7 @@
                     MsgRepository.GRAPHICS_EXCEPTION_ILLEGAL_STROKE_STYLE);
             }
             graphicsBuffer.setStrokeStyle(styleToApply, newStyle, this);
-            currentStrokeSyle = newStyle;
+            currentStrokeStyle = newStyle;
         }
     }
 
@@ -936,7 +968,7 @@
     {
         synchronized(graphicsBuffer)
         {
-            return currentStrokeSyle;
+            return currentStrokeStyle;
         }
     }
 
@@ -1150,14 +1182,55 @@
             final int gcTransform = Image.getCgTransformValue(transform);
             synchronized(srcImage.graphicsBuffer)
             {
-                srcImage.sync();
-                graphicsBuffer.drawImage(Internal_GfxPackageSupport.getImage(Image.getESWTImage(srcImage)),
-                                         x, y, width, height, xSrc, ySrc, width, height, gcTransform, this);
+            	final Image localLcduiSrcImage = srcImage;
+            	final org.eclipse.swt.internal.qt.graphics.Image localCgfxImage = 
+                	Internal_GfxPackageSupport.getImage(Image.getESWTImage(srcImage));
+            	final int localX = x;
+            	final int localY = y;
+            	final int localW = width;
+            	final int localH = height;
+            	final int localXSrc = xSrc;
+            	final int localYSrc = ySrc;
+            	final int localGcTransform = gcTransform;
+            	final Graphics self = this;
+            	ESWTUIThreadRunner.safeSyncExec(new Runnable()
+                {
+                    public void run()
+                    {
+                    	localLcduiSrcImage.sync(false);
+                        graphicsBuffer.drawImage(localCgfxImage,
+                        		localX, localY, localW, localH, localXSrc, localYSrc, localW, localH, localGcTransform, self);
+                    }
+                });
             }
         }
     }
 
     /**
+     * Performs synchronization on the graphics buffer, i.e.
+     * the buffered draw commands are rasterized to the surface.
+     */
+    void sync()
+    {
+    	synchronized(graphicsBuffer) 
+    	{
+    		if(syncStrategy == SYNC_LEAVE_SURFACE_SESSION_OPEN)
+    		{
+    			// This instance is used only with paint callbacks, thus  
+    			// sync is called with the indication that surface paint  
+    			// session can be left open as it will be closed when the 
+    			// callback returns.
+    		    graphicsBuffer.sync(false);
+    		}
+    		else 
+    		{
+    			graphicsBuffer.sync(true);
+    		} 
+    	}
+    }
+    
+    
+    /**
      * Return DirectGraphics associated with this instance.
      */
     DirectGraphics getDirectGraphics()
@@ -1170,6 +1243,15 @@
     }
 
     /**
+	 * Getter for graphics buffer.
+	 * @return The Buffer.
+	 */
+    Buffer getGraphicsBuffer()
+    {
+        return graphicsBuffer;
+    }
+	
+    /**
      * Maps stroke style constant from values used by
      * Graphics to values defined in GraphicsContext
      */
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Image.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Image.java	Fri Jun 11 13:33:44 2010 +0300
@@ -43,6 +43,10 @@
     // buffer has package visibility so that it can be used as
     // a lock in other classes
     ImageBuffer graphicsBuffer;
+    
+    // Graphics for transferring instance
+    // between application and UI thread
+    Graphics tempGraphics;
 
     /**
      * Constructor.
@@ -647,14 +651,33 @@
     }
 
     /**
-     * Synchronizes any pending draw commands to this image
+     * Synchronizes any pending draw commands to this image. The buffer sync 
+     * must be executed in UI thread and if this method is not requested to switch to
+     * UI thread, the caller must take care of serializing the call over the graphicsBuffer
+     * of this instance.
+     * 
+     * @param switchToUIThread If true the sync is run in UI thread, oherwise
+     *        caller must take care of switching to UI thread
      */
-    void sync()
+    void sync(boolean switchToUIThread)
     {
-        synchronized(graphicsBuffer)
-        {
-            graphicsBuffer.sync();
-        }
+    	if(switchToUIThread) 
+		{
+    	    synchronized(graphicsBuffer)
+            {
+                ESWTUIThreadRunner.safeSyncExec(new Runnable()
+                {
+                    public void run()
+                    {
+                        graphicsBuffer.sync();
+                    }
+                });
+            }
+         } 
+    	else 
+    	{
+    		graphicsBuffer.sync();
+    	}
     }
 
     /**
@@ -762,7 +785,6 @@
 
         synchronized(graphicsBuffer)
         {
-            graphicsBuffer.sync();
             final int[] localRgbData = rgbData;
             final int localOffset = offset;
             final int localLength = length;
@@ -774,6 +796,7 @@
             {
                 public void run()
                 {
+                	graphicsBuffer.sync();
                     org.eclipse.swt.internal.qt.graphics.Image cgImage = Internal_GfxPackageSupport.getImage(eswtImage);
                     cgImage.getRGB(localRgbData, localOffset, localLength,
                                    localX, localY, localW, localH);
@@ -791,8 +814,16 @@
     public Graphics getGraphics()
     {
         if(mutable)
-        {
-            return graphicsBuffer.getGraphics();
+        {	
+        	tempGraphics = null;
+        	ESWTUIThreadRunner.safeSyncExec(new Runnable()
+            {
+                public void run()
+                {
+        	        tempGraphics =  graphicsBuffer.getGraphics();
+                }
+            });
+            return tempGraphics;
         }
         throw new IllegalStateException(MsgRepository.IMAGE_EXCEPTION_IMMUTABLE);
     }
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/ImageBuffer.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/ImageBuffer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -14,10 +14,12 @@
 * Description:
 *
 */
+
 package javax.microedition.lcdui;
 
 import org.eclipse.swt.graphics.Internal_GfxPackageSupport;
 import org.eclipse.swt.internal.qt.graphics.GraphicsContext;
+import org.eclipse.swt.widgets.Widget;
 
 final class ImageBuffer extends Buffer
 {
@@ -34,11 +36,6 @@
         return HOST_TYPE_IMAGE;
     }
 
-    void setupWindowSurface()
-    {
-        // nothing to do here
-    }
-
     Object getHost()
     {
         return host;
@@ -49,4 +46,20 @@
         gc.bindTarget(Internal_GfxPackageSupport.getImage(Image.getESWTImage(host)));
     }
 
+    void blit(GraphicsContext gc, Widget widget) {
+		// nothing to do 
+	}
+
+    void endPaint() {
+		// nothing to do 
+	}
+
+	boolean isPaintingActive() {
+		return false;
+	}
+
+	void beginPaint(int x, int y, int w, int h) {
+		// nothing to do 
+	}
+
 }
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/LCDUIInvokerImpl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/LCDUIInvokerImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -205,6 +205,15 @@
         return ((Canvas) canvas).getGameBufferGraphics();
     }
 
+    protected org.eclipse.swt.internal.qt.graphics.WindowSurface doGetWindowSurface( Graphics g )
+    {
+        if( g != null )
+        {
+            return g.getGraphicsBuffer().getWindowSurface();
+        }
+        return null;
+    }
+    
     protected Object doGetFlushLock(Object graphics)
     {
         //return ((Graphics) graphics).graphicsBuffer;
@@ -227,6 +236,26 @@
         ((Canvas) canvas).flushGameBuffer(x, y, width, height);
     }
 
+    protected void doSync(Object graphics) 
+    {
+    	((Graphics)graphics).sync();
+    } 
+    
+    protected void doStartExternalRendering(Graphics g)
+    {
+        // Flush any pending 2D graphics.
+        g.sync();
+        g.getGraphicsBuffer().startFrame( g.getClipX(),
+                                          g.getClipY(),
+                                          g.getClipWidth(),
+                                          g.getClipHeight() );
+    }
+    
+    protected void doEndExternalRendering(Graphics g)
+    {
+        g.getGraphicsBuffer().endFrame();
+    }
+    
     protected String doGetDynamicProperty(String key)
     {
         if("com.nokia.key.scancode".equals(key))
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/List.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/List.java	Fri Jun 11 13:33:44 2010 +0300
@@ -311,7 +311,11 @@
      */
     public void delete(int position)
     {
-//        choiceImpl.delete(position);
+        if (position < 0 || ( position >= size())) 
+        {
+            throw new IndexOutOfBoundsException(
+                    MsgRepository.CHOICE_EXCEPTION_INVALID_ITEM_INDEX);
+        }
         final int index = position; // index of changed element
         ESWTUIThreadRunner.syncExec(new Runnable()
         {
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/StringItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/StringItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -82,7 +82,7 @@
      */
     public void setText(String newTxt)
     {
-        if((newTxt == null) || (newTxt.equals("")))
+        if(newTxt == null)
         {
             text = null;
         }
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/TextFieldLayouter.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/TextFieldLayouter.java	Fri Jun 11 13:33:44 2010 +0300
@@ -16,14 +16,13 @@
 */
 package javax.microedition.lcdui;
 
-import org.eclipse.ercp.swt.mobile.ConstrainedText;
 import org.eclipse.ercp.swt.mobile.TextExtension;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-
+import org.eclipse.swt.internal.extension.TextExtensionExtension;
 /**
  * Responsible for correct layout of TextField in a Form.
  */
@@ -54,12 +53,6 @@
 
     // private static Control[] staticControls = new Control[6];
 
-    private static TextExtension any;
-    private static ConstrainedText numeric;
-    private static ConstrainedText phonenr;
-    private static ConstrainedText decimal;
-    private static TextExtension   email;
-    private static TextExtension   url;
     private static boolean isCorrectText;
 
     /**
@@ -91,45 +84,23 @@
         }
         */
 
-        if(constraint == TextField.NUMERIC)
-        {
-            if(numeric == null)
-            {
-                numeric = new ConstrainedText(eswtGetStaticShell(), SWT.SINGLE,
-                                              ConstrainedText.NUMERIC);
-            }
-            ret = numeric;
+        if (constraint == TextField.NUMERIC) {
+            constraint = TextExtensionExtension.NUMERIC;
         }
-        else if(constraint == TextField.DECIMAL)
-        {
-            if(decimal == null)
-            {
-                decimal = new ConstrainedText(eswtGetStaticShell(), SWT.SINGLE,
-                                              ConstrainedText.DECIMAL);
-            }
-            ret = decimal;
+        else if (constraint == TextField.DECIMAL) {
+            constraint = TextExtensionExtension.DECIMAL;
         }
-        else if(constraint == TextField.PHONENUMBER)
-        {
-            if(phonenr == null)
-            {
-                phonenr = new ConstrainedText(eswtGetStaticShell(), SWT.SINGLE,
-                                              ConstrainedText.PHONENUMBER);
-            }
-            ret = phonenr;
+        else if (constraint == TextField.PHONENUMBER) {
+            constraint = TextExtensionExtension.PHONENUMBER;
         }
         else
         {
             // TODO: eSWT support required - text validation on EMAIL and URL constraints
             // default
-            if(any == null)
-            {
-                any = new TextExtension(eswtGetStaticShell(), SWT.MULTI | SWT.WRAP);
-            }
-            ret = any;
+            constraint = 0;
         }
 
-        return ret;
+        return new TextExtensionExtension(eswtGetStaticShell(), SWT.MULTI | SWT.WRAP,constraint);
     }
 
     /**
@@ -194,8 +165,7 @@
      */
     boolean eswtIsSpecificControl(Item item, Control control)
     {
-        return (control instanceof TextExtension
-                || control instanceof ConstrainedText);
+        return (control instanceof TextExtension);
     }
 
     /**
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/TextWrapper.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/TextWrapper.java	Fri Jun 11 13:33:44 2010 +0300
@@ -16,8 +16,8 @@
 */
 package javax.microedition.lcdui;
 
-import org.eclipse.ercp.swt.mobile.ConstrainedText;
 import org.eclipse.ercp.swt.mobile.TextExtension;
+import org.eclipse.swt.internal.extension.TextExtensionExtension;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionListener;
@@ -326,7 +326,6 @@
                     {
                         retTopPixel = ((TextExtension) control).getTopPixel();
                     }
-                    // ConstrainedText does not scroll -> value is 0
                 }
             });
         }
@@ -837,10 +836,6 @@
             {
                 ((TextExtension) control).addModifyListener(ltnr);
             }
-            else
-            {
-                ((ConstrainedText) control).addModifyListener(ltnr);
-            }
         }
     }
 
@@ -858,10 +853,6 @@
             {
                 ((TextExtension) control).addSelectionListener(ltnr);
             }
-            else
-            {
-                ((ConstrainedText) control).addSelectionListener(ltnr);
-            }
         }
     }
 
@@ -875,7 +866,6 @@
      */
     static Control eswtConstructText(Composite parent, int aStyle, int aConstraints)
     {
-        Control ret = null;
 
         int style = aStyle;
         int extractedFlag = aConstraints & ~TextField.CONSTRAINT_MASK;
@@ -884,6 +874,7 @@
         if((extractedFlag & TextField.PASSWORD) == TextField.PASSWORD)
         {
             // Text class will remove incompatible flags for SINGLE
+            style &= ~SWT.MULTI;
             style |= SWT.SINGLE | SWT.PASSWORD;
         }
         if((extractedFlag & TextField.UNEDITABLE) == TextField.UNEDITABLE)
@@ -893,27 +884,20 @@
 
         if(extractedConstraint == TextField.NUMERIC)
         {
-            ret = new ConstrainedText(parent, style, ConstrainedText.NUMERIC);
+            extractedConstraint = TextExtensionExtension.NUMERIC;
         }
         else if(extractedConstraint == TextField.DECIMAL)
         {
-            ret = new ConstrainedText(parent, style, ConstrainedText.DECIMAL);
+            extractedConstraint = TextExtensionExtension.DECIMAL;
         }
         else if(extractedConstraint == TextField.PHONENUMBER)
         {
-            ret = new ConstrainedText(parent, style, ConstrainedText.PHONENUMBER);
-        }
-        else if(extractedConstraint == TextField.NON_PREDICTIVE
-                || extractedConstraint == TextField.SENSITIVE)
-        {
-            // We treat non-predictive and sensitive to be equal
-            ret = new TextExtension(parent, style, TextExtension.NON_PREDICTIVE);
-        }
-        else
-        {
-            ret = new TextExtension(parent, style);
-        }
-        return ret;
+            extractedConstraint = TextExtensionExtension.PHONENUMBER;
+       }
+       else {
+            extractedConstraint = 0;
+       }
+        return new TextExtensionExtension(parent, style,extractedConstraint);
     }
 
     /**
@@ -930,10 +914,6 @@
             {
                 ret = ((TextExtension) control).getCaretPosition();
             }
-            else
-            {
-                ret = ((ConstrainedText) control).getCaretPosition();
-            }
         }
         return ret;
     }
@@ -970,10 +950,6 @@
             {
                 ret = ((TextExtension) control).getText();
             }
-            else
-            {
-                ret = ((ConstrainedText) control).getText();
-            }
         }
         return ret;
     }
@@ -1010,10 +986,6 @@
             {
                 ret = ((TextExtension) control).getLineHeight();
             }
-            else
-            {
-                ret = ((ConstrainedText) control).getSize().y;
-            }
         }
         return ret;
     }
@@ -1032,10 +1004,6 @@
             {
                 ret = ((TextExtension) control).getTextLimit();
             }
-            else
-            {
-                ret = ((ConstrainedText) control).getTextLimit();
-            }
         }
         return ret;
     }
@@ -1054,11 +1022,6 @@
             {
                 ret = ((TextExtension) control).getSelectionText();
             }
-            else
-            {
-                // TODO: eSWT support required - get selection in ConstrainedText
-                ret = ((ConstrainedText) control).getText();
-            }
         }
         return ret;
     }
@@ -1077,10 +1040,6 @@
             {
                 ret = ((TextExtension) control).getCharCount();
             }
-            else
-            {
-                ret = ((ConstrainedText) control).getCharCount();
-            }
         }
         return ret;
     }
@@ -1099,10 +1058,6 @@
             {
                 ((TextExtension) control).removeModifyListener(ltnr);
             }
-            else
-            {
-                ((ConstrainedText) control).removeModifyListener(ltnr);
-            }
         }
     }
 
@@ -1120,10 +1075,6 @@
             {
                 ((TextExtension) control).removeSelectionListener(ltnr);
             }
-            else
-            {
-                ((ConstrainedText) control).removeSelectionListener(ltnr);
-            }
         }
     }
 
@@ -1141,10 +1092,6 @@
             {
                 ((TextExtension) control).setText(text);
             }
-            else
-            {
-                ((ConstrainedText) control).setText(text);
-            }
         }
     }
 
@@ -1233,10 +1180,6 @@
             {
                 ((TextExtension) control).setTextLimit(maxSize);
             }
-            else
-            {
-                ((ConstrainedText) control).setTextLimit(maxSize);
-            }
         }
     }
 
@@ -1255,10 +1198,6 @@
             {
                 ((TextExtension) control).setSelection(sta, end);
             }
-            else
-            {
-                ((ConstrainedText) control).setSelection(sta, end);
-            }
         }
     }
 
--- a/javauis/lcdui_qt/tsrc/.classpath	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/tsrc/.classpath	Fri Jun 11 13:33:44 2010 +0300
@@ -3,12 +3,10 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="src_j2se"/>
 	<classpathentry kind="src" path="res"/>
-	<classpathentry kind="lib" path="/XlibUiTestUtils/bin"/>
 	<classpathentry kind="lib" path="junit-3.8.1.1.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="lib" path="S:/epoc32/RELEASE/WINSCW/udeb/Z/resource/java/jvm/lib/common/eswt.jar"/>
-	<classpathentry kind="lib" path="S:/epoc32/RELEASE/WINSCW/udeb/Z/resource/java/jvm/lib/common/openlcdui.jar"/>
-	<classpathentry kind="lib" path="S:/epoc32/RELEASE/WINSCW/udeb/java_signature_test.jar"/>
-	<classpathentry kind="lib" path="S:/epoc32/release/winscw/udeb/Z/resource/java/jvm/lib/common/s60uitestutils.jar"/>
+	<classpathentry kind="var" path="CDC_CLASSES"/>
+	<classpathentry kind="var" path="CLDC_JAR"/>
+	<classpathentry kind="var" path="eSWT_UITESTUTILS"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/tsrc/build/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,111 @@
+<!--
+#
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+#
+-->
+
+<project name="openlcduitests" default="createJars" basedir=".">
+
+    <description>
+        Builds OpenLcdui Tests on eSWT
+    </description>
+
+    <import file="../../../../build/utilities.xml"/>
+
+    <!-- Needed by the utilities.xml. See the description form the utilities.xml
+         file -->
+
+    <property name="java.src.paths" value="../src:../src_j2me"/>
+
+		<!--default bootclasspath is cldc, later if added cdc to the calsspath, it always refer to cldc classes 
+		if the classes are common in both configuarations. To fix this issue, bootclasspath is overriden-->
+		<property name="bootclasspath" value="${bootclasspath.cdc}"/>
+    
+    <target name="compile">
+    	<omj.javac classpath="../junit-3.8.1.1.jar:${impl.cldc.jar}:${bcp.dest.directory}/eswtuitestutils.jar" excludes="**/Test_com_ibm_ugl_UGLCompatibility.java"/>
+    </target>
+
+     <!-- This empty call is needed to avoid OMJ tool to add this component class to cldc jar -->
+    <target name="add.classes.to.collection.jar"/>
+ 
+    <target name="createJars" depends="deploy"> 
+    	<jar jarfile="${bcp.dest.directory}/openlcduitests.jar">
+       		<fileset dir="${classes.collection.dir}" includes="**/*.class"/>
+       		<fileset dir="../res"/>
+        </jar>
+    	<copy file="../junit-3.8.1.1.jar" todir="${bcp.dest.directory}"/>
+    	<copy file="../junit-3.8.1.1.odc" todir="${bcp.dest.directory}"/>
+    	<antcall target="appendODC"/>
+	</target>
+	
+	<target name="appendODC" >
+		<!-- Appends openlcduitests.odc, junit-3.8.1.1.odc,  openlcdui.odc and javanokiaui.odc
+		if not present in installerodclist30 file  -->
+		<loadfile srcFile="${epocroot}epoc32/data/z/resource/java/installerodclist" property="junitTests">
+			<filterchain>
+				<linecontains>
+					<contains value="junit-3.8.1.1.odc"/>
+				</linecontains>
+			</filterchain>
+		</loadfile>
+		<antcall target="appendJunit"/>
+		
+		<loadfile srcFile="${epocroot}epoc32/data/z/resource/java/installerodclist" property="lcduiTests">
+			<filterchain>
+				<linecontains>
+					<contains value="${component.dir}.odc"/>
+				</linecontains>
+			</filterchain>
+		</loadfile>
+		<antcall target="appendLcduiTests"/>
+		
+		<loadfile srcFile="${epocroot}epoc32/data/z/resource/java/installerodclist" property="lcduiODC">
+			<filterchain>
+				<linecontains>
+					<contains value="openlcdui.odc"/>
+				</linecontains>
+			</filterchain>
+		</loadfile>
+		<antcall target="appendLcdui"/>
+		
+		<loadfile srcFile="${epocroot}epoc32/data/z/resource/java/installerodclist" property="uiapiODC">
+			<filterchain>
+				<linecontains>
+					<contains value="javanokiaui.odc"/>
+				</linecontains>
+			</filterchain>
+		</loadfile>
+		<antcall target="appendUIAPI"/>
+	</target>
+
+	<target name="appendJunit" unless="junitTests">
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">junit-3.8.1.1.odc${line.separator}</concat>
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">junit-3.8.1.1.jar${line.separator}</concat>
+	</target>
+		
+	<target name="appendLcduiTests" unless="lcduiTests">
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">${component.dir}.odc${line.separator}</concat>
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">${component.dir}.jar${line.separator}</concat>
+	</target>
+	
+	<target name="appendLcdui" unless="lcduiODC">
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">openlcdui.odc${line.separator}</concat>
+	</target>
+	
+	<target name="appendUIAPI" unless="uiapiODC">
+		<concat destfile="${epocroot}epoc32/data/z/resource/java/installerodclist" append="true">javanokiaui.odc${line.separator}</concat>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/tsrc/build/bwins/openlcduitestsu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/tsrc/build/eabi/openlcduitestsu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/tsrc/build/openlcduitests.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 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: 
+#
+
+TEMPLATE=lib
+TARGET=openlcduitests
+CONFIG += omj java javaonly
+CONFIG -= qt
+
+TARGET.UID3 = 0x2002E69A
+
+include(../../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/tsrc/junit-3.8.1.1.odc	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,13 @@
+[container]
+name=junit-3.8.1.1
+type=JXESL
+
+[packages]
+junit/awtui
+junit/extensions
+junit/framework
+junit/runner
+junit/swingui
+junit/textui
+
+[properties]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/build/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,110 @@
+<!--
+#
+# Copyright (c) 2008-2009 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: 
+#
+-->
+
+<project name="javam3g" default="deploy" basedir=".">
+
+	<description>
+		Builds M3G on Qt.
+	</description>
+	
+  <import file="../../../build/utilities.xml"/>
+
+  <!-- Needed by the utilities.xml. See the description form the utilities.xml
+       file -->
+
+
+  <target name="compile">
+    <omj.javac classpath="${impl.cldc.jar}" excludes="**/CDCCompatibilityDelegate.java"/>
+  </target>
+
+
+  <!-- Needed by the utilities.xml. See the description form the utilities.xml
+       file -->
+
+  <property name="javah.classnames" 
+            value="javax.microedition.m3g.AnimationController,
+                   javax.microedition.m3g.AnimationTrack,
+                   javax.microedition.m3g.Appearance,
+                   javax.microedition.m3g.Background,
+                   javax.microedition.m3g.Camera,
+                   javax.microedition.m3g.CompositingMode,
+                   javax.microedition.m3g.Fog,
+                   javax.microedition.m3g.Graphics3D,
+                   javax.microedition.m3g.Group,
+                   javax.microedition.m3g.Image2D,
+                   javax.microedition.m3g.Interface,
+                   javax.microedition.m3g.KeyframeSequence,
+                   javax.microedition.m3g.Light,
+                   javax.microedition.m3g.Loader,
+                   javax.microedition.m3g.Material,
+                   javax.microedition.m3g.Mesh,
+                   javax.microedition.m3g.MorphingMesh,
+                   javax.microedition.m3g.Node,
+                   javax.microedition.m3g.Object3D,
+                   javax.microedition.m3g.Platform,
+                   javax.microedition.m3g.PolygonMode,
+                   javax.microedition.m3g.SkinnedMesh,
+                   javax.microedition.m3g.Sprite3D,
+                   javax.microedition.m3g.Texture2D,
+                   javax.microedition.m3g.Transform,
+                   javax.microedition.m3g.Transformable,
+                   javax.microedition.m3g.TriangleStripArray,
+                   javax.microedition.m3g.VertexArray,
+                   javax.microedition.m3g.VertexBuffer,
+                   javax.microedition.m3g.World"/>
+
+  <target name="system.properties">
+    <properties>
+        microedition.m3g.version=1.1
+    </properties>
+  </target>
+  
+    <target name="create.public.api.jar">
+      <omj.public.apis includes="javax/microedition/m3g/AnimationController.class,
+                                 javax/microedition/m3g/AnimationTrack.class,
+                                 javax/microedition/m3g/Appearance.class,
+                                 javax/microedition/m3g/Background.class,
+                                 javax/microedition/m3g/Camera.class,
+                                 javax/microedition/m3g/CompositingMode.class,
+                                 javax/microedition/m3g/Fog.class,
+                                 javax/microedition/m3g/Graphics3D.class,
+                                 javax/microedition/m3g/Group.class,
+                                 javax/microedition/m3g/Image2D.class,
+                                 javax/microedition/m3g/Interface.class,
+                                 javax/microedition/m3g/KeyframeSequence.class,
+                                 javax/microedition/m3g/Light.class,
+                                 javax/microedition/m3g/Loader.class,
+                                 javax/microedition/m3g/Material.class,
+                                 javax/microedition/m3g/Mesh.class,
+                                 javax/microedition/m3g/MorphingMesh.class,
+                                 javax/microedition/m3g/Node.class,
+                                 javax/microedition/m3g/Object3D.class,
+                                 javax/microedition/m3g/Platform.class,
+                                 javax/microedition/m3g/PolygonMode.class,
+                                 javax/microedition/m3g/SkinnedMesh.class,
+                                 javax/microedition/m3g/Sprite3D.class,
+                                 javax/microedition/m3g/Texture2D.class,
+                                 javax/microedition/m3g/Transform.class,
+                                 javax/microedition/m3g/Transformable.class,
+                                 javax/microedition/m3g/TriangleStripArray.class,
+                                 javax/microedition/m3g/VertexArray.class,
+                                 javax/microedition/m3g/VertexBuffer.class,
+                                 javax/microedition/m3g/World.class"/>
+  </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/build/bwins/javam3gu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/build/eabi/javam3gu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/build/javam3g.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 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: 
+#
+
+TEMPLATE=lib
+TARGET=javam3g
+CONFIG += omj java staticdata stl
+#CONFIG -= qt
+
+QT += core gui
+
+INCLUDEPATH += ../inc
+INCLUDEPATH += ../src/jni
+INCLUDEPATH += ../../eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics
+
+
+
+SOURCES += ../src/*.cpp
+         
+DEFINES += M3G_TARGET_SYMBIAN
+DEFINES += M3G_NATIVE_LOADER
+
+LIBS += -lcone \
+        -lezlib \
+        -lfbscli \
+        -llibgles_cm \
+        -llibegl \
+        -lm3gcore
+
+include(../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/inc/CSynchronization.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2005-2006 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:  M3GCore function call serialization and synchronization
+*
+*/
+
+#ifndef CSYNCHRONIZATION_H
+#define CSYNCHRONIZATION_H
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <e32base.h>
+
+// CLASS DECLARATION
+/**
+ * @class CSynchronization
+ */
+class CSynchronization : public CBase
+{
+public:
+    /**
+     * Two-phased constructor.
+         */
+    static CSynchronization* InstanceL();
+
+    /**
+         * Dtor
+         */
+    ~CSynchronization();
+
+    /**
+       * Locks the semaphore
+       */
+    void Lock();
+
+    /**
+       * Unlocks the semaphore
+       */
+    void Unlock();
+
+    /**
+    * Sets error code for error occured during lock period
+    */
+    void SetErrorCode(TInt aCode);
+
+    /**
+    * Returns error string set with SetErrorString
+    */
+    TInt GetErrorCode();
+
+private: // METHODS
+    /**
+      * Constructor
+      */
+    CSynchronization();
+
+    /**
+    * Two-phased constructor.
+    * @return New object
+    */
+    static CSynchronization* NewL();
+
+    /**
+     * Constructor
+     */
+    void ConstructL();
+
+private: // MEMBER VARIABLES
+    static CSynchronization* iSelf;
+    RCriticalSection iGuard;
+    TInt iErrorCode;
+};
+
+#endif // CSYNCHRONIZATION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/inc/m3g_jsr184.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+#ifndef M3G_JSR184_H
+#define M3G_JSR184_H
+
+/*!
+ * \file \brief Global enumerations for JSR-184
+ *
+ */
+
+#if defined(M3G_CORE_INCLUDE)
+#   error includes Java dependencies; do not include into the core module.
+#endif
+
+#include <m3g/m3g_core.h>
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------
+     * Enumerations
+     *--------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------
+     * JSR-184 API internal functions
+     *--------------------------------------------------------------------*/
+
+    static M3Guint jsr184BytesPerPixels(int format);
+    static const char *jsr184Exception(M3Genum errorCode);
+
+#if defined(__cplusplus)
+} /* extern "C" */
+#endif
+
+#endif // M3G_JSR184_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/AnimationController.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class AnimationController extends Object3D
+{
+    //------------------------------------------------------------------
+    // Constructor
+    //------------------------------------------------------------------
+
+    public AnimationController()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    AnimationController(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setActiveInterval(int worldTimeMin, int worldTimeMax)
+    {
+        _setActiveInterval(handle, worldTimeMin, worldTimeMax);
+    }
+
+    public int getActiveIntervalStart()
+    {
+        return _getActiveIntervalStart(handle);
+    }
+
+    public int getActiveIntervalEnd()
+    {
+        return _getActiveIntervalEnd(handle);
+    }
+
+    public void setSpeed(float factor, int worldTime)
+    {
+        _setSpeed(handle, factor, worldTime);
+    }
+
+    public float getSpeed()
+    {
+        return _getSpeed(handle);
+    }
+
+    public void setPosition(float time, int worldTime)
+    {
+        _setPosition(handle, time, worldTime);
+    }
+
+    public float getPosition(int worldTime)
+    {
+        return _getPosition(handle, worldTime);
+    }
+
+    public void setWeight(float weight)
+    {
+        _setWeight(handle, weight);
+    }
+
+    public float getWeight()
+    {
+        return _getWeight(handle);
+    }
+
+    // M3G maintenance version 1.1
+    public int getRefWorldTime()
+    {
+        return _getRefWorldTime(handle);
+    }
+
+
+    // Native methods
+    private native static int _ctor(int hInterface);
+    private native static void _setActiveInterval(int handle, int worldTimeMin, int worldTimeMax);
+    private native static int _getActiveIntervalStart(int handle);
+    private native static int _getActiveIntervalEnd(int handle);
+    private native static void _setSpeed(int handle, float factor, int worldTime);
+    private native static float _getSpeed(int handle);
+    private native static void _setPosition(int handle, float time, int worldTime);
+    private native static float _getPosition(int handle, int worldTime);
+    private native static void _setWeight(int handle, float weight);
+    private native static float _getWeight(int handle);
+
+    // M3G maintenance version 1.1
+    private native static int _getRefWorldTime(int handle);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/AnimationTrack.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class AnimationTrack extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int ALPHA               = 256;
+    public static final int AMBIENT_COLOR       = 257;
+    public static final int COLOR               = 258;
+    public static final int CROP                = 259;
+    public static final int DENSITY             = 260;
+    public static final int DIFFUSE_COLOR       = 261;
+    public static final int EMISSIVE_COLOR      = 262;
+    public static final int FAR_DISTANCE        = 263;
+    public static final int FIELD_OF_VIEW       = 264;
+    public static final int INTENSITY           = 265;
+    public static final int MORPH_WEIGHTS       = 266;
+    public static final int NEAR_DISTANCE       = 267;
+    public static final int ORIENTATION         = 268;
+    public static final int PICKABILITY         = 269;
+    public static final int SCALE               = 270;
+    public static final int SHININESS           = 271;
+    public static final int SPECULAR_COLOR      = 272;
+    public static final int SPOT_ANGLE          = 273;
+    public static final int SPOT_EXPONENT       = 274;
+    public static final int TRANSLATION         = 275;
+    public static final int VISIBILITY          = 276;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private AnimationController controller;
+    private KeyframeSequence sequence;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    AnimationTrack(int handle)
+    {
+        super(handle);
+        controller = (AnimationController)getInstance(_getController(handle));
+        sequence = (KeyframeSequence)getInstance(_getSequence(handle));
+    }
+
+    public AnimationTrack(KeyframeSequence sequence, int property)
+    {
+        super(_ctor(Interface.getHandle(),
+                    sequence != null ? sequence.handle : 0, property));
+        this.sequence = sequence;
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setController(AnimationController controller)
+    {
+        _setController(handle, controller != null ? controller.handle : 0);
+        this.controller = controller;
+    }
+
+    public AnimationController getController()
+    {
+        return controller;
+    }
+
+    public KeyframeSequence getKeyframeSequence()
+    {
+        return sequence;
+    }
+
+    public int getTargetProperty()
+    {
+        return _getTargetProperty(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private native static int _ctor(int hInterface,
+                                    int hSequence,
+                                    int property);
+    private native static int _getController(int handle);
+    private native static int _getSequence(int handle);
+    private native static int _getTargetProperty(int handle);
+    private native static void _setController(int handle, int hController);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Appearance.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,159 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Appearance extends Object3D
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private CompositingMode compositingMode;
+    private Fog             fog;
+    private Material        material;
+    private PolygonMode     polygonMode;
+    private Texture2D[]     textures;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public Appearance()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Appearance(int handle)
+    {
+        super(handle);
+
+        compositingMode = (CompositingMode) getInstance(_getCompositingMode(handle));
+        fog             = (Fog) getInstance(_getFog(handle));
+        material        = (Material) getInstance(_getMaterial(handle));
+        polygonMode     = (PolygonMode) getInstance(_getPolygonMode(handle));
+
+        textures = new Texture2D[Defs.NUM_TEXTURE_UNITS];
+
+        for (int i = 0; i < Defs.NUM_TEXTURE_UNITS; ++i)
+        {
+            textures[i] = (Texture2D) getInstance(_getTexture(handle, i));
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setCompositingMode(CompositingMode compositingMode)
+    {
+        _setCompositingMode(handle,
+                            compositingMode != null
+                            ? compositingMode.handle
+                            : 0);
+        this.compositingMode = compositingMode;
+    }
+
+    public CompositingMode getCompositingMode()
+    {
+        return compositingMode;
+    }
+
+    public void setFog(Fog fog)
+    {
+        _setFog(handle, fog != null ? fog.handle : 0);
+        this.fog = fog;
+    }
+
+    public Fog getFog()
+    {
+        return fog;
+    }
+
+    public void setPolygonMode(PolygonMode polygonMode)
+    {
+        _setPolygonMode(handle, polygonMode != null ? polygonMode.handle : 0);
+        this.polygonMode = polygonMode;
+    }
+
+    public PolygonMode getPolygonMode()
+    {
+        return polygonMode;
+    }
+
+    public void setLayer(int index)
+    {
+        _setLayer(handle, index);
+    }
+
+    public int getLayer()
+    {
+        return _getLayer(handle);
+    }
+
+    public void setMaterial(Material material)
+    {
+        _setMaterial(handle, material != null ? material.handle : 0);
+        this.material = material;
+    }
+
+    public Material getMaterial()
+    {
+        return material;
+    }
+
+    public void setTexture(int unit, Texture2D texture)
+    {
+        _setTexture(handle, unit, texture != null ? texture.handle : 0);
+
+        if (textures == null)
+        {
+            textures = new Texture2D[Defs.NUM_TEXTURE_UNITS];
+        }
+        textures[unit] = texture;
+    }
+
+    public Texture2D getTexture(int unit)
+    {
+        return (Texture2D) getInstance(_getTexture(handle, unit));
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private static native int   _ctor(int hInterface);
+
+    private static native int   _getCompositingMode(int hApp);
+    private static native int   _getFog(int hApp);
+    private static native int   _getLayer(int hApp);
+    private static native int   _getMaterial(int hApp);
+    private static native int   _getPolygonMode(int hApp);
+    private static native int   _getTexture(int hApp, int unit);
+
+    private static native void  _setCompositingMode(int hApp, int hMode);
+    private static native void  _setFog(int hApp, int hFog);
+    private static native void  _setLayer(int hApp, int layer);
+    private static native void  _setMaterial(int hApp, int hMaterial);
+    private static native void  _setPolygonMode(int hApp, int hMode);
+    private static native void  _setTexture(int hApp,
+                                            int unit,
+                                            int hTexture);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Background.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,154 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Background extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int BORDER = 32;
+    public static final int REPEAT = 33;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private Image2D image;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public Background()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Background(int handle)
+    {
+        super(handle);
+        image = (Image2D) getInstance(_getImage(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setColor(int ARGB)
+    {
+        _setColor(handle, ARGB);
+    }
+
+    public int getColor()
+    {
+        return _getColor(handle);
+    }
+
+    public void setImage(Image2D image)
+    {
+        _setImage(handle, image != null ? image.handle : 0);
+        this.image = image;
+    }
+
+    public Image2D getImage()
+    {
+        return image;
+    }
+
+    public void setImageMode(int modeX, int modeY)
+    {
+        _setImageMode(handle, modeX, modeY);
+    }
+
+    public int getImageModeX()
+    {
+        return _getImageMode(handle, Defs.GET_MODEX);
+    }
+
+    public int getImageModeY()
+    {
+        return _getImageMode(handle, Defs.GET_MODEY);
+    }
+
+    public void setColorClearEnable(boolean enable)
+    {
+        _enable(handle, Defs.SETGET_COLORCLEAR, enable);
+    }
+
+    public void setDepthClearEnable(boolean enable)
+    {
+        _enable(handle, Defs.SETGET_DEPTHCLEAR, enable);
+    }
+
+    public boolean isColorClearEnabled()
+    {
+        return _isEnabled(handle, Defs.SETGET_COLORCLEAR);
+    }
+
+    public boolean isDepthClearEnabled()
+    {
+        return _isEnabled(handle, Defs.SETGET_DEPTHCLEAR);
+    }
+
+    public void setCrop(int cropX, int cropY, int width, int height)
+    {
+        _setCrop(handle, cropX, cropY, width, height);
+    }
+
+    public int getCropX()
+    {
+        return _getCrop(handle, Defs.GET_CROPX);
+    }
+
+    public int getCropY()
+    {
+        return _getCrop(handle, Defs.GET_CROPY);
+    }
+
+    public int getCropWidth()
+    {
+        return _getCrop(handle, Defs.GET_CROPWIDTH);
+    }
+
+    public int getCropHeight()
+    {
+        return _getCrop(handle, Defs.GET_CROPHEIGHT);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native functions
+    private static native int _ctor(int hInterface);
+    private static native void _setColor(int handle, int ARGB);
+    private static native int _getColor(int handle);
+    private static native void _setImage(int handle, int hImage);
+    private static native int  _getImage(int handle);
+    private static native void _setImageMode(int handle, int modeX, int modeY);
+    private static native int _getImageMode(int handle, int which);
+    private static native void _enable(int handle, int which, boolean enable);
+    private static native boolean _isEnabled(int handle, int which);
+    private static native void _setCrop(int handle, int cropX, int cropY, int width, int height);
+    private static native int _getCrop(int handle, int which);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Camera.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Camera extends Node
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int GENERIC = 48;
+    public static final int PARALLEL = 49;
+    public static final int PERSPECTIVE = 50;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public Camera()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Camera(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setParallel(float height, float aspectRatio, float near, float far)
+    {
+        _setParallel(handle, height, aspectRatio, near, far);
+    }
+
+    public void setPerspective(float fovy, float aspectRatio, float near, float far)
+    {
+        _setPerspective(handle, fovy, aspectRatio, near, far);
+    }
+
+    public void setGeneric(Transform transform)
+    {
+        _setGeneric(handle, transform.matrix);
+    }
+
+    public int getProjection(Transform transform)
+    {
+        return _getProjectionAsTransform(handle, transform != null ? transform.matrix : null);
+    }
+
+    public int getProjection(float[] params)
+    {
+        return _getProjectionAsParams(handle, params);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native methods
+    private static native int _ctor(int hInterface);
+    private static native void _setParallel(int handle, float height, float aspectRatio, float near, float far);
+    private static native void _setPerspective(int handle, float fovy, float aspectRatio, float near, float far);
+    private static native void _setGeneric(int handle, byte[] transform);
+    private static native int _getProjectionAsTransform(int handle, byte[] transform);
+    private static native int _getProjectionAsParams(int handle, float[] params);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/CompositingMode.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class CompositingMode extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int ALPHA       = 64;
+    public static final int ALPHA_ADD   = 65;
+    public static final int MODULATE    = 66;
+    public static final int MODULATE_X2 = 67;
+    public static final int REPLACE     = 68;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public CompositingMode()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    CompositingMode(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setBlending(int mode)
+    {
+        _setBlending(handle, mode);
+    }
+
+    public int getBlending()
+    {
+        return _getBlending(handle);
+    }
+
+    public void setAlphaThreshold(float threshold)
+    {
+        _setAlphaThreshold(handle, threshold);
+    }
+
+    public float getAlphaThreshold()
+    {
+        return _getAlphaThreshold(handle);
+    }
+
+    public void setAlphaWriteEnable(boolean enable)
+    {
+        _setAlphaWriteEnable(handle, enable);
+    }
+
+    public boolean isAlphaWriteEnabled()
+    {
+        return _isAlphaWriteEnabled(handle);
+    }
+
+    public void setColorWriteEnable(boolean enable)
+    {
+        _enableColorWrite(handle, enable);
+    }
+
+    public boolean isColorWriteEnabled()
+    {
+        return _isColorWriteEnabled(handle);
+    }
+
+    public void setDepthWriteEnable(boolean enable)
+    {
+        _enableDepthWrite(handle, enable);
+    }
+
+    public boolean isDepthWriteEnabled()
+    {
+        return _isDepthWriteEnabled(handle);
+    }
+
+    public void setDepthTestEnable(boolean enable)
+    {
+        _enableDepthTest(handle, enable);
+    }
+
+    public boolean isDepthTestEnabled()
+    {
+        return _isDepthTestEnabled(handle);
+    }
+
+    public void setDepthOffset(float factor, float units)
+    {
+        _setDepthOffset(handle, factor, units);
+    }
+
+    public float getDepthOffsetFactor()
+    {
+        return _getDepthOffsetFactor(handle);
+    }
+
+    public float getDepthOffsetUnits()
+    {
+        return _getDepthOffsetUnits(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private native static int _ctor(int hInterface);
+    private native static void _setBlending(int handle, int mode);
+    private native static int _getBlending(int handle);
+    private native static void _setAlphaThreshold(int handle, float threshold);
+    private native static float _getAlphaThreshold(int handle);
+    private native static void _setAlphaWriteEnable(int handle, boolean enable);
+    private native static boolean _isAlphaWriteEnabled(int handle);
+    private native static void _enableDepthTest(int handle, boolean enable);
+    private native static boolean _isDepthTestEnabled(int handle);
+    private native static void _enableDepthWrite(int handle, boolean enable);
+    private native static boolean _isDepthWriteEnabled(int handle);
+    private native static void _enableColorWrite(int handle, boolean enable);
+    private native static boolean _isColorWriteEnabled(int handle);
+    private native static void _setDepthOffset(int handle, float factor, float units);
+    private native static float _getDepthOffsetFactor(int handle);
+    private native static float _getDepthOffsetUnits(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Defs.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+class Defs
+{
+    static boolean supportDithering = false;
+    static boolean supportTrueColor = false;
+    static boolean supportAntialiasing = true;
+    static boolean supportMipmapping = true;
+    static boolean supportPerspectiveCorrection = true;
+    static boolean supportLocalCameraLighting = false;
+
+    static int MAX_LIGHTS = 8;
+    static int MAX_TEXTURE_DIMENSION = 1024;
+    static int MAX_TRANSFORMS_PER_VERTEX = 4;
+    static int MAX_VIEWPORT_WIDTH = 1024;
+    static int MAX_VIEWPORT_HEIGHT = 1024;
+    static int MAX_VIEWPORT_DIMENSION = 1024;
+    static int NUM_TEXTURE_UNITS = 2;
+
+    /* Constants used in various setters/getters */
+
+    /* VertexBuffer */
+    static final int GET_POSITIONS     = 0;
+    static final int GET_NORMALS       = 1;
+    static final int GET_COLORS        = 2;
+    static final int GET_TEXCOORDS0    = 3;
+    /*               GET_TEXCOORDS1    = 4 */
+    /* Sprite and Background */
+    static final int GET_CROPX         = 0;
+    static final int GET_CROPY         = 1;
+    static final int GET_CROPWIDTH     = 2;
+    static final int GET_CROPHEIGHT    = 3;
+    /* Background */
+    static final int GET_MODEX         = 0;
+    static final int GET_MODEY         = 1;
+    static final int SETGET_COLORCLEAR = 0;
+    static final int SETGET_DEPTHCLEAR = 1;
+    /* Fog */
+    static final int GET_NEAR          = 0;
+    static final int GET_FAR           = 1;
+    /* Node */
+    static final int SETGET_RENDERING  = 0;
+    static final int SETGET_PICKING    = 1;
+    /* Light */
+    static final int GET_CONSTANT      = 0;
+    static final int GET_LINEAR        = 1;
+    static final int GET_QUADRATIC     = 2;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Fog.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Fog extends Object3D
+{
+    public static final int EXPONENTIAL = 80;
+    public static final int LINEAR = 81;
+
+    public Fog()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Fog(int handle)
+    {
+        super(handle);
+    }
+
+    public void setMode(int mode)
+    {
+        _setMode(handle, mode);
+    }
+
+    public int getMode()
+    {
+        return _getMode(handle);
+    }
+
+    public void setLinear(float near, float far)
+    {
+        _setLinear(handle, near, far);
+    }
+
+    public float getNearDistance()
+    {
+        return _getDistance(handle, Defs.GET_NEAR);
+    }
+
+    public float getFarDistance()
+    {
+        return _getDistance(handle, Defs.GET_FAR);
+    }
+
+    public void setDensity(float density)
+    {
+        _setDensity(handle, density);
+    }
+
+    public float getDensity()
+    {
+        return _getDensity(handle);
+    }
+
+    public void setColor(int RGB)
+    {
+        _setColor(handle, RGB);
+    }
+
+    public int getColor()
+    {
+        return _getColor(handle);
+    }
+
+    // Native methods
+    private static native int _ctor(int hInterface);
+    private static native void _setMode(int handle, int mode);
+    private static native int _getMode(int handle);
+    private static native void _setLinear(int handle, float near, float far);
+    private static native float _getDistance(int handle, int which);
+    private static native void _setDensity(int handle, float density);
+    private static native float _getDensity(int handle);
+    private static native void _setColor(int handle, int RGB);
+    private static native int _getColor(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Graphics3D.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,743 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import javax.microedition.lcdui.Graphics;
+import java.util.Hashtable;
+import java.util.Vector;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.qt.graphics.*;
+import org.eclipse.swt.internal.qt.GCData;
+import com.nokia.mj.impl.rt.support.ShutdownListener;
+import com.nokia.mj.impl.rt.support.ApplicationUtils;
+import com.nokia.mj.impl.nokialcdui.LCDUIInvoker;
+
+
+public class Graphics3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int ANTIALIAS   = 2;
+    public static final int DITHER      = 4;
+    public static final int TRUE_COLOR  = 8;
+
+    // M3G 1.1
+    public static final int OVERWRITE   = 16;
+
+    // Singleton instances
+    static Graphics3D s_instance = null;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    int handle;
+    int iSurfaceHandle;
+
+    private Camera camera = null;
+    private Vector lights = new Vector();
+
+    private java.lang.Object currentTarget = null;
+    private int offsetX, offsetY, hints = 0;
+    private boolean depthEnabled = true;
+    private Destroyer destroyer;
+    private Interface iInterface;
+
+    // this flag is for identification of image target types
+    // - True for mutable off-screen images
+    // - False for canvas/GameCanvas framebuffer
+    private boolean iIsImageTarget;
+
+    // this flag is for identification if MBX HW accelerator is present
+    // - True - MBX is NOT present
+    // - False - MBX is present
+    private boolean iIsProperRenderer;
+
+    private boolean iNativeInitialized = false;
+
+    // Shutdown listener
+    private class Destroyer implements ShutdownListener
+    {
+        Graphics3D target;
+
+        Destroyer(Graphics3D g3d)
+        {
+            target = g3d;
+            ApplicationUtils appUtils = ApplicationUtils.getInstance();
+            appUtils.addShutdownListener(this);
+        }
+
+        // This method gets called when application is shuttingdown
+        public void shuttingDown()
+        {
+
+            // Finalize native peer
+            Platform.finalizeObject(target.handle, target.iInterface);
+
+            // signal shutdown (set shutdown flag)
+            // and remove references
+            target.iInterface.signalShutdown();
+            target.iInterface = null;
+            target.camera = null;
+            //target.s_instance = null;
+
+            // All done, Call gc() and finalization to collect
+            // remaining objects, thus zeroying liveObjects count
+            // in interface instance
+
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+    public static final Graphics3D getInstance()
+    {
+
+        if (s_instance == null)
+        {
+            s_instance = new Graphics3D();
+        }
+        return s_instance;
+    }
+
+    private Graphics3D()
+    {
+        iInterface = Interface.getInstance();
+        initNativePeer();
+
+        // setup listener for singleton teardown
+        destroyer = new Destroyer(this);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    /**
+     */
+    public void bindTarget(java.lang.Object target)
+    {
+        bindTarget(target, true, 0);
+    }
+
+    /**
+     *
+     */
+    public void bindTarget(java.lang.Object target, boolean depth, int flags)
+    {
+        integrityCheck();
+        if (currentTarget != null)
+        {
+            throw new IllegalStateException();
+        }
+
+        if (target == null)
+        {
+            throw new NullPointerException();
+        }
+
+        final int finalFlags = flags;
+        final boolean finalDepth = depth;
+
+        if (target instanceof org.eclipse.swt.graphics.GC)
+        {
+            Rectangle clip = ((org.eclipse.swt.graphics.GC)target).getClipping();
+            final int clipW = clip.width;
+            final int clipH = clip.height;
+            final int clipX = clip.x;
+            final int clipY = clip.y;
+
+            if (clipW > Defs.MAX_VIEWPORT_WIDTH ||
+                    clipH > Defs.MAX_VIEWPORT_HEIGHT)
+            {
+                throw new IllegalArgumentException();
+            }
+
+            final Object finalTarget = target;
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    GCData gcData = ((org.eclipse.swt.graphics.GC)finalTarget).getGCData();
+                    iSurfaceHandle = gcData.internalGc.getWindowSurface().getHandle();
+                    iIsImageTarget = _bindGraphics(
+                                         handle,
+                                         iSurfaceHandle,
+                                         clipX, clipY,
+                                         clipW, clipH,
+                                         finalDepth, finalFlags,
+                                         iIsProperRenderer);
+                }
+            });
+            currentTarget = target;
+        }
+
+        else if (target instanceof Graphics)
+        {
+
+            Graphics g = (Graphics) target;
+            //Platform.sync(g);
+
+            if (g.getClipWidth() > Defs.MAX_VIEWPORT_WIDTH ||
+                    g.getClipHeight() > Defs.MAX_VIEWPORT_HEIGHT)
+            {
+                throw new IllegalArgumentException();
+            }
+
+            offsetX = g.getTranslateX();
+            offsetY = g.getTranslateY();
+
+            final Graphics finalG = g;
+
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    LCDUIInvoker.startExternalRendering( finalG );
+                    iSurfaceHandle = LCDUIInvoker.getWindowSurface(finalG).getHandle();
+                    iIsImageTarget = _bindGraphics(
+                                         handle,
+                                         iSurfaceHandle,
+                                         finalG.getClipX() + offsetX, finalG.getClipY() + offsetY,
+                                         finalG.getClipWidth(), finalG.getClipHeight(),
+                                         finalDepth, finalFlags,
+                                         iIsProperRenderer);
+                }
+            });
+            currentTarget = g;
+        }
+        else if (target instanceof Image2D)
+        {
+            Image2D img = (Image2D) target;
+
+            offsetX = offsetY = 0;
+            final int imageHandle = img.handle;
+
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    _bindImage(handle, imageHandle, finalDepth, finalFlags);
+                }
+            });
+            currentTarget = img;
+        }
+        else
+        {
+            throw new IllegalArgumentException();
+        }
+
+        hints = flags;
+        depthEnabled = depth;
+    }
+
+    /**
+     *
+     */
+    public void releaseTarget()
+    {
+        integrityCheck();
+        if (currentTarget == null)
+        {
+            return;
+        }
+
+        if (currentTarget instanceof org.eclipse.swt.graphics.GC)
+        {
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    _releaseGraphics(handle,
+                                     iSurfaceHandle, iIsImageTarget, iIsProperRenderer);
+                }
+            });
+        }
+        else if (currentTarget instanceof Graphics)
+        {
+                final Graphics finalG = (Graphics)currentTarget;
+                Platform.executeInUIThread(
+                    new M3gRunnable()
+                {
+                    public void doRun()
+                    {
+                        _releaseGraphics(handle,
+                                         iSurfaceHandle, iIsImageTarget, iIsProperRenderer);
+                        LCDUIInvoker.endExternalRendering( finalG );
+                    }
+                });
+            /*
+            Graphics g = (Graphics) currentTarget;
+
+            //ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+
+            Platform.getUIThread().syncExec(
+                    new Runnable() {
+                        public void run() {
+                                        _releaseGraphics( handle,
+                                        invoker.graphicsGetHandle(g), iIsImageTarget, iIsProperRenderer );
+                                }
+                        });
+                        */
+        }
+        else if (currentTarget instanceof Image2D)
+        {
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    _releaseImage(handle);
+                }
+            });
+        }
+        else
+        {
+            throw new Error();
+        }
+        currentTarget = null;
+        iSurfaceHandle = 0;
+    }
+
+    /**
+     *
+     */
+    public void setViewport(int x, int y, int width, int height)
+    {
+        integrityCheck();
+        if (width <= 0 || height <= 0
+                || width  > Defs.MAX_VIEWPORT_DIMENSION
+                || height > Defs.MAX_VIEWPORT_DIMENSION)
+        {
+            throw new IllegalArgumentException();
+        }
+        _setViewport(handle, x + offsetX, y + offsetY, width, height);
+    }
+
+    /**
+     *
+     */
+    public void clear(Background background)
+    {
+        integrityCheck();
+        final Background finalBackground = background;
+        Platform.executeInUIThread(
+            new M3gRunnable()
+        {
+            public void doRun()
+            {
+                _clear(handle, finalBackground != null ? finalBackground.handle : 0);
+            }
+        });
+    }
+
+    /**
+     *
+     */
+    public void render(World world)
+    {
+        integrityCheck();
+        final World finalWorld = world;
+        Platform.executeInUIThread(
+            new M3gRunnable()
+        {
+            public void doRun()
+            {
+                _renderWorld(handle, finalWorld.handle);
+            }
+        });
+    }
+
+    /**
+     *
+     */
+    public void render(VertexBuffer vertices,
+                       IndexBuffer primitives,
+                       Appearance appearance,
+                       Transform transform)
+    {
+        // Call rendering method with default visibility
+        integrityCheck();
+        render(vertices, primitives, appearance, transform, -1);
+    }
+
+    /**
+     *
+     */
+    public void render(VertexBuffer vertices,
+                       IndexBuffer primitives,
+                       Appearance appearance,
+                       Transform transform,
+                       int scope)
+    {
+
+        // null pointer exceptions thrown automatically below
+        integrityCheck();
+
+        final VertexBuffer finalVertices = vertices;
+        final IndexBuffer finalPrimitives = primitives;
+        final Appearance finalAppearance = appearance;
+        final Transform finalTransform = transform;
+        final int finalScope = scope;
+
+        Platform.executeInUIThread(
+            new M3gRunnable()
+        {
+            public void doRun()
+            {
+                _render(handle,
+                        finalVertices.handle,
+                        finalPrimitives.handle,
+                        finalAppearance.handle,
+                        finalTransform != null ? finalTransform.matrix : null,
+                        finalScope);
+            }
+        });
+    }
+
+    /**
+     *
+     */
+    public void render(Node node, Transform transform)
+    {
+        if (!(node instanceof Mesh
+                || node instanceof Sprite3D
+                || node instanceof Group)
+                && node != null)
+        {
+            throw new IllegalArgumentException();
+        }
+        integrityCheck();
+
+        final Node finalNode = node;
+        final Transform finalTransform = transform;
+
+        Platform.executeInUIThread(
+            new M3gRunnable()
+        {
+            public void doRun()
+            {
+                _renderNode(handle,
+                            finalNode.handle,
+                            finalTransform != null ? finalTransform.matrix : null);
+            }
+        });
+    }
+
+
+    public void setCamera(Camera camera, Transform transform)
+    {
+        integrityCheck();
+        _setCamera(handle,
+                   camera != null ? camera.handle : 0,
+                   transform != null ? transform.matrix : null);
+
+        this.camera = camera;
+    }
+
+    /**
+     */
+    public int addLight(Light light, Transform transform)
+    {
+        integrityCheck();
+        int index = _addLight(handle,
+                              light.handle,
+                              transform != null ? transform.matrix : null);
+        if (lights.size() < index + 1)
+        {
+            lights.setSize(index + 1);
+        }
+        lights.setElementAt(light, index);
+        return index;
+    }
+
+    /**
+     *
+     */
+    public void setLight(int index, Light light, Transform transform)
+    {
+        integrityCheck();
+        _setLight(handle,
+                  index,
+                  light != null ? light.handle : 0,
+                  transform != null ? transform.matrix : null);
+        lights.setElementAt(light, index);
+    }
+
+    /**
+     */
+    public void resetLights()
+    {
+        integrityCheck();
+        _resetLights(handle);
+        lights.removeAllElements();
+    }
+
+    /**
+     *
+     */
+    public static final Hashtable getProperties()
+    {
+        Hashtable props = new Hashtable();
+
+        props.put("supportAntialiasing",          new java.lang.Boolean(
+                      _isAASupported(Interface.getHandle())));
+        props.put("supportTrueColor",             new java.lang.Boolean(Defs.supportTrueColor));
+        props.put("supportDithering",             new java.lang.Boolean(Defs.supportDithering));
+        props.put("supportMipmapping",            new java.lang.Boolean(Defs.supportMipmapping));
+        props.put("supportPerspectiveCorrection", new java.lang.Boolean(Defs.supportPerspectiveCorrection));
+        props.put("supportLocalCameraLighting",   new java.lang.Boolean(Defs.supportLocalCameraLighting));
+        props.put("maxLights",                    new java.lang.Integer(Defs.MAX_LIGHTS));
+        props.put("maxViewportWidth",             new java.lang.Integer(Defs.MAX_VIEWPORT_WIDTH));
+        props.put("maxViewportHeight",            new java.lang.Integer(Defs.MAX_VIEWPORT_HEIGHT));
+        props.put("maxViewportDimension",         new java.lang.Integer(Defs.MAX_VIEWPORT_DIMENSION));
+        props.put("maxTextureDimension",          new java.lang.Integer(Defs.MAX_TEXTURE_DIMENSION));
+        props.put("maxSpriteCropDimension",       new java.lang.Integer(Defs.MAX_TEXTURE_DIMENSION));
+        props.put("numTextureUnits",              new java.lang.Integer(Defs.NUM_TEXTURE_UNITS));
+        props.put("maxTransformsPerVertex",       new java.lang.Integer(Defs.MAX_TRANSFORMS_PER_VERTEX));
+
+        // Extra properties
+        props.put("m3gRelease",                   new java.lang.String("04_wk49"));
+
+        return props;
+    }
+
+    /**
+     *
+     */
+    public void setDepthRange(float near, float far)
+    {
+        integrityCheck();
+        _setDepthRange(handle, near, far);
+    }
+
+    // M3G 1.1
+
+    public Camera getCamera(Transform transform)
+    {
+        integrityCheck();
+        if (transform != null)
+        {
+            _getViewTransform(handle, transform.matrix);
+        }
+
+        return (Camera) Object3D.getInstance(_getCamera(handle));
+    }
+
+    public float getDepthRangeFar()
+    {
+        integrityCheck();
+        return _getDepthRangeFar(handle);
+    }
+
+    public float getDepthRangeNear()
+    {
+        integrityCheck();
+        return _getDepthRangeNear(handle);
+    }
+
+    public Light getLight(int index, Transform transform)
+    {
+        integrityCheck();
+        if (index < 0 || index >= _getLightCount(handle))
+        {
+            throw new IndexOutOfBoundsException();
+        }
+
+        return (Light) Object3D.getInstance(_getLightTransform(handle,
+                                            index,
+                                            transform != null ? transform.matrix : null));
+    }
+
+    public int getLightCount()
+    {
+        integrityCheck();
+        return _getLightCount(handle);
+    }
+
+    public java.lang.Object getTarget()
+    {
+        return currentTarget;
+    }
+
+    public int getViewportHeight()
+    {
+        integrityCheck();
+        return _getViewportHeight(handle);
+    }
+
+    public int getViewportWidth()
+    {
+        integrityCheck();
+        return _getViewportWidth(handle);
+    }
+
+    public int getViewportX()
+    {
+        integrityCheck();
+        return _getViewportX(handle) - offsetX;
+    }
+
+    public int getViewportY()
+    {
+        integrityCheck();
+        return _getViewportY(handle) - offsetY;
+    }
+
+    public int getHints()
+    {
+        return hints;
+    }
+
+    public boolean isDepthBufferEnabled()
+    {
+        return depthEnabled;
+    }
+
+    // M3G 1.1 getters END
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private void integrityCheck()
+    {
+        if (iInterface == null)
+        {
+            throw new RuntimeException("Graphics3D closed");
+        }
+        if (!iNativeInitialized)
+        {
+            // If native interface cannot be initialized we cannot recover from it
+            if (!initNativePeer())
+            {
+                throw new Error("UI thread not available");
+            }
+        }
+    }
+
+    /**
+     * Initializes native peer
+     * @return true if native interface was succesfully inialized otherwise false
+     */
+    private boolean initNativePeer()
+    {
+        if (iNativeInitialized)
+        {
+            return true;
+        }
+        if (iInterface.isFullyInitialized() && Platform.uiThreadAvailable())
+        {
+            handle = _ctor(iInterface.getHandle());
+            _addRef(handle);
+
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    iIsProperRenderer = _isProperRenderer();
+                }
+            });
+            iNativeInitialized = true;
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Native implementation methods
+    //------------------------------------------------------------------
+    private native static int _ctor(int hInterface);
+    private native static void _addRef(int hObject);
+    private native static int _addLight(int handle,
+                                        int hLight,
+                                        byte[] transform);
+    private native static boolean _bindGraphics(int handle,
+            int surfaceHandle,
+            int clipX, int clipY,
+            int clipW, int clipH,
+            boolean depth,
+            int hintBits,
+            boolean aIsProperRenderer);
+    private native static void _bindImage(int handle, int imgHandle, boolean depth, int hintBits);
+    private native static void _releaseGraphics(int handle,
+            int surfaceHandle,
+            boolean aIsImageTarget,
+            boolean aIsProperRenderer);
+    private native static void _releaseImage(int handle);
+    private native static void _resetLights(int handle);
+    private native static void _clear(int handle, int hBackground);
+    private native static void _render(int handle,
+                                       int hVtxBuffer,
+                                       int hIdxBuffer,
+                                       int hAppearance,
+                                       byte[] transform,
+                                       int scope);
+    private native static void _renderNode(int handle, int hNode, byte[] transform);
+    private native static void _renderWorld(int handle, int hWorld);
+    private native static void _setCamera(int handle,
+                                          int hCamera,
+                                          byte[] transform);
+    private native static void _setViewport(int handle,
+                                            int x, int y,
+                                            int width, int height);
+    private native static void _setLight(int handle,
+                                         int index,
+                                         int hLight,
+                                         byte[] transform);
+    private native static void _setDepthRange(int handle,
+            float near,
+            float far);
+
+    // M3G 1.1
+    // Maintenance release getters
+
+    private native static void _getViewTransform(int handle,
+            byte[] transform);
+    private native static int _getCamera(int handle);
+    private native static int _getLightTransform(int handle,
+            int index,
+            byte[] transform);
+    private native static int _getLightCount(int handle);
+    private native static float _getDepthRangeNear(int handle);
+    private native static float _getDepthRangeFar(int handle);
+    private native static int _getViewportX(int handle);
+    private native static int _getViewportY(int handle);
+    private native static int _getViewportWidth(int handle);
+    private native static int _getViewportHeight(int handle);
+
+    /* Statistics support, MUST be disabled in official releases! */
+    /*
+        public native static int getStatistics(int[] statistics);
+    */
+    private native static boolean _isAASupported(int handle);
+    private native static boolean _isProperRenderer();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Group.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,191 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import java.util.Vector;
+
+public class Group extends Node
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    // The child links are duplicated on the Java side for the same
+    // reason as the other node->node references; see Node.java
+
+    Vector children;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public Group()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    Group(int handle)
+    {
+        super(handle);
+        int n = _getChildCount(handle);
+        while (n-- > 0)
+        {
+            linkChild((Node) getInstance(_getChild(handle, n)));
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void addChild(Node child)
+    {
+        _addChild(handle, child != null ? child.handle : 0);
+        if (child != null)
+        {
+            linkChild(child);
+        }
+    }
+
+    public void removeChild(Node child)
+    {
+        if (child != null)
+        {
+            _removeChild(handle, child.handle);
+            detachChild(child);
+        }
+    }
+
+    public int getChildCount()
+    {
+        return _getChildCount(handle);
+    }
+
+    public Node getChild(int index)
+    {
+
+        /* Instead of trying to match the indexing of children on the
+         * native side, we just call the native getter. This may have
+         * some performance penalty, but likely not enough to make it
+         * worth the extra maintenance burden of duplicating the
+         * native ordering here. */
+
+        return (Node) getInstance(_getChild(handle, index));
+    }
+
+    public boolean pick(int mask,
+                        float ox, float oy, float oz,
+                        float dx, float dy, float dz,
+                        RayIntersection ri)
+    {
+        float[] result = RayIntersection.createResult();
+        float[] ray = {ox, oy, oz, dx, dy, dz};
+        int hIntersected;
+
+        hIntersected = _pick3D(handle, mask, ray, result);
+
+        if (hIntersected != 0)
+        {
+            if (ri != null)
+            {
+                ri.fill(hIntersected, result);
+            }
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    public boolean pick(int mask, float x, float y, Camera camera, RayIntersection ri)
+    {
+        float[] result = RayIntersection.createResult();
+        int hIntersected;
+
+        hIntersected = _pick2D(handle, mask, x, y, camera != null ? camera.handle : 0, result);
+
+        if (hIntersected != 0)
+        {
+            if (ri != null)
+            {
+                ri.fill(hIntersected, result);
+            }
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    /**
+     * Adds a Java-side child link in this Group.
+     */
+    private void linkChild(Node child)
+    {
+        if (child == null)
+        {
+            throw new Error(); // DEBUG
+        }
+        if (children == null)
+        {
+            children = new Vector();
+        }
+        children.addElement(child);
+        child.setParent(this);
+    }
+
+    /**
+     * Removes a Java-side child link from this Group.
+     */
+    private void detachChild(Node child)
+    {
+        if (children != null)
+        {
+            if (children.removeElement(child))
+            {
+                /* If no children remain, we delete the array to free some
+                 * memory. If a Group is frequently cleared and
+                 * re-populated, this should be covered by the free list
+                 * used by most VM implementations without causing
+                 * significant performance degradation. */
+                if (children.isEmpty())
+                {
+                    children = null;
+                }
+
+                child.setParent(null);
+            }
+        }
+    }
+
+    // Native methods
+    private static native int _ctor(int hInterface);
+    private static native void _addChild(int handle, int hNode);
+    private static native void _removeChild(int handle, int hNode);
+    private static native int _getChildCount(int handle);
+    private static native int _getChild(int handle, int index);
+    private static native int _pick3D(int handle, int mask, float[] ray, float[] result);
+    private static native int _pick2D(int handle, int mask, float x, float y, int hCamera, float[] result);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Image2D.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,232 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import javax.microedition.lcdui.Image;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.qt.graphics.*;
+import com.nokia.mj.impl.nokialcdui.LCDUIInvoker;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+
+public class Image2D extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int ALPHA               = 96;
+    public static final int LUMINANCE           = 97;
+    public static final int LUMINANCE_ALPHA     = 98;
+    public static final int RGB                 = 99;
+    public static final int RGBA                = 100;
+
+    static int tempHandle;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public Image2D(int format, Object image)
+    {
+        // If image is instance of lcdui.Image then checkAndCreate
+        // builds the image and returns the handle to native image,
+        // otherwise throws exception Done this way because class of
+        // image cannot be checked befor calling super()
+        super(Image2D.checkAndCreate(format, image));
+    }
+
+    public Image2D(int format, int width, int height, byte[] image)
+    {
+        super(createHandle(format, width, height, image));
+    }
+
+    public Image2D(int format,
+                   int width, int height,
+                   byte[] image,
+                   byte[] palette)
+    {
+        super(createHandle(format, width, height, image, palette));
+    }
+
+    public Image2D(int format, int width, int height)
+    {
+        super(createHandle(format, width, height));
+    }
+
+    Image2D(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void set(int x, int y, int width, int height, byte[] image)
+    {
+        if (image == null)
+        {
+            throw new NullPointerException();
+        }
+        _set(handle, x, y, width, height, image);
+    }
+
+    public boolean isMutable()
+    {
+        return _isMutable(handle);
+    }
+
+    public int getFormat()
+    {
+        return _getFormat(handle);
+    }
+
+    public int getWidth()
+    {
+        return _getWidth(handle);
+    }
+
+    public int getHeight()
+    {
+        return _getHeight(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private static int checkAndCreate(int format, Object image)
+    {
+        if (image == null)
+        {
+            throw new NullPointerException();
+        }
+        if (!(image instanceof javax.microedition.lcdui.Image) &&
+                !(image instanceof org.eclipse.swt.graphics.Image))
+        {
+            throw new IllegalArgumentException();
+        }
+
+        final int finalFormat = format;
+        tempHandle = 0;
+
+        if (image instanceof org.eclipse.swt.graphics.Image)
+        {
+            // get internal image
+            final org.eclipse.swt.internal.qt.graphics.Image cgfxImage = 
+                    Internal_GfxPackageSupport.getImage((org.eclipse.swt.graphics.Image)image);
+            // excute in UI thread
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                void doRun()
+                {
+                    tempHandle = _ctorImage(Interface.getHandle(), finalFormat, cgfxImage.getHandle());
+                }
+            });
+        }
+        else if (image instanceof javax.microedition.lcdui.Image)
+        {
+            final org.eclipse.swt.internal.qt.graphics.Image cgfxImage =
+                    Internal_GfxPackageSupport.getImage(
+                            LCDUIInvoker.getEswtImage( (javax.microedition.lcdui.Image)image ) );
+
+            // excute in UI thread
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                void doRun()
+                {
+                    tempHandle = _ctorImage(Interface.getHandle(), finalFormat, cgfxImage.getHandle());
+                }
+            });
+        }
+        return tempHandle;
+    }
+
+    //Platform.heuristicGC();
+    //ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+
+    // Decide if trueAlpha
+    //Image i = (Image)image;
+    //boolean trueAlpha = !(i.isMutable() && format == ALPHA);
+
+    //Platform.sync((Image) image);
+
+//        Platform.getUIThread().syncExec(
+//                    new Runnable() {
+//                        public void run() {
+//                                               tempHandle = _ctorImage(/*Interface.getEventSourceHandle(),*/ Interface.getHandle(), finalFormat, /*invoker.imageGetHandle(image)*/ 5);
+//                                          }
+//                                  });
+//          return tempHandle;
+
+
+    private static int createHandle(int format, int width, int height, byte[] image)
+    {
+        Platform.heuristicGC();
+        return _ctorSizePixels(Interface.getHandle(),
+                               format,
+                               width, height,
+                               image);
+    }
+
+    private static int createHandle(int format,
+                                    int width, int height,
+                                    byte[] image,
+                                    byte[] palette)
+    {
+        Platform.heuristicGC();
+        return _ctorSizePixelsPalette(Interface.getHandle(),
+                                      format,
+                                      width, height,
+                                      image, palette);
+    }
+
+    private static int createHandle(int format, int width, int height)
+    {
+        Platform.heuristicGC();
+        return _ctorSize(Interface.getHandle(), format, width, height);
+    }
+
+    // Native methods
+    private native static int _ctorImage(/*int eventSourceHandle,*/
+        int hInterface,
+        int format,
+        int imageHandle);
+    private native static int _ctorSizePixels(int hInterface,
+            int format,
+            int width, int height,
+            byte[] image);
+    private native static int _ctorSizePixelsPalette(int hInterface,
+            int format,
+            int width, int height,
+            byte[] image,
+            byte[] palette);
+    private native static int _ctorSize(int hInterface,
+                                        int format,
+                                        int width, int height);
+
+    private native static void _set(int handle, int x, int y, int width,
+                                    int height, byte[] image);
+    private native static boolean _isMutable(int handle);
+    private native static int _getFormat(int handle);
+    private native static int _getWidth(int handle);
+    private native static int _getHeight(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/IndexBuffer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public abstract class IndexBuffer extends Object3D
+{
+    /**
+     * Only a package private constructor exists for this class.
+     */
+    IndexBuffer(int handle)
+    {
+        super(handle);
+    }
+
+    public abstract int getIndexCount();
+    public abstract void getIndices(int[] indices);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Interface.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+package javax.microedition.m3g;
+
+import java.lang.ref.WeakReference;
+import java.util.Hashtable;
+import org.eclipse.swt.widgets.Display;
+//#ifdef RD_JAVA_OMJ
+import com.nokia.mj.impl.rt.support.Finalizer;
+//#endif // RD_JAVA_OMJ
+
+/**
+ * M3G interface object. An interface is automatically created for
+ * each MIDlet using the 3D API to keep track of Java-side object
+ * lifetimes etc.
+ */
+class Interface
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    // Common class enumeration for Java and native code
+
+    private static final int ANIMATION_CONTROLLER = 0x01;
+    private static final int ANIMATION_TRACK      = 0x02;
+    private static final int APPEARANCE           = 0x03;
+    private static final int BACKGROUND           = 0x04;
+    private static final int CAMERA               = 0x05;
+    private static final int COMPOSITING_MODE     = 0x06;
+    private static final int FOG                  = 0x07;
+    private static final int GROUP                = 0x08;
+    private static final int IMAGE_2D             = 0x09;
+    private static final int INDEX_BUFFER         = 0x0A;
+    private static final int KEYFRAME_SEQUENCE    = 0x0B;
+    private static final int LIGHT                = 0x0C;
+    private static final int LOADER               = 0x0D;
+    private static final int MATERIAL             = 0x0E;
+    private static final int MESH                 = 0x0F;
+    private static final int MORPHING_MESH        = 0x10;
+    private static final int POLYGON_MODE         = 0x11;
+    private static final int RENDER_CONTEXT       = 0x12;
+    private static final int SKINNED_MESH         = 0x13;
+    private static final int SPRITE_3D            = 0x14;
+    private static final int TEXTURE_2D           = 0x15;
+    private static final int VERTEX_ARRAY         = 0x16;
+    private static final int VERTEX_BUFFER        = 0x17;
+    private static final int WORLD                = 0x18;
+
+    // Once created, the interface singleton currently remains in
+    // memory until VM exit.  By using a WeakReference here, with hard
+    // references stored in each object, it could be GC'd when no more
+    // objects exist, but that probably isn't worth the extra memory
+    // overhead.
+
+    //private static Hashtable s_instances = new Hashtable();
+    private static Interface instance = null;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    /**
+     * Handle of the native interface object.
+     */
+    private int handle;
+
+    /**
+     * Global handle-to-Object3D map used to both find the Java
+     * counterparts of objects returned from the native methods, and
+     * keep certain objects from being garbage collected.
+     */
+    private final Hashtable liveObjects = new Hashtable();
+
+    /**
+     * Flag for shutdown signal
+     */
+    private boolean iShutdown = false;
+
+    /**
+     * Flag for native peer init state
+     */
+    private boolean iNativeInitialized = false;
+
+
+//#ifdef RD_JAVA_OMJ
+    private Finalizer mFinalizer;
+//#endif // RD_JAVA_OMJ
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    private Interface()
+    {
+
+        // Contruct native peer
+        initNativePeer();
+
+//#ifdef RD_JAVA_OMJ
+        mFinalizer = new Finalizer()
+        {
+            public void finalizeImpl()
+            {
+                doFinalize();
+            }
+        };
+//#else // RD_JAVA_OMJ
+//        Platform.registerFinalizer(this);
+//#endif // RD_JAVA_OMJ
+    }
+
+    //------------------------------------------------------------------
+    // Package methods
+    //------------------------------------------------------------------
+
+    /**
+     * Returns the M3G interface instance for the current MIDlet.
+     */
+    static final Interface getInstance()
+    {
+        if (instance == null)
+        {
+            instance = new Interface();
+        }
+        return instance;
+    }
+
+    /**
+     * Returns the native handle of the current Interface instance.
+     */
+    static final int getHandle()
+    {
+        getInstance().integrityCheck();
+        return getInstance().handle;
+    }
+
+    /**
+     * Registers an Object3D with this interface. The object is added
+     * to the global handle-to-object map, and the native finalization
+     * callback is set up. The handle of the object must already be
+     * set at this point!
+     */
+    static final void register(Object3D obj)
+    {
+        Platform.registerFinalizer(obj);
+        getInstance().liveObjects.put(new Integer(obj.handle),
+                                      new WeakReference(obj));
+    }
+
+    static final void register(Loader obj)
+    {
+        Platform.registerFinalizer(obj);
+        getInstance().liveObjects.put(new Integer(obj.handle),
+                                      new WeakReference(obj));
+    }
+
+    /**
+     * Finds an Object3D in the global handle-to-object map. Also
+     * removes dead objects (that is, null references) from the map
+     * upon encountering them.
+     */
+    static final Object3D findObject(int handle)
+    {
+        Interface self = getInstance();
+        Integer iHandle = new Integer(handle);
+        Object ref = self.liveObjects.get(iHandle);
+
+        if (ref != null)
+        {
+            Object3D obj = (Object3D)((WeakReference)ref).get();
+            if (obj == null)
+            {
+                self.liveObjects.remove(iHandle);
+            }
+            return obj;
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    /**
+     * Returns the Java object representing a native object, or
+     * creates a new proxy/peer if one doesn't exist yet.
+     */
+    static final Object3D getObjectInstance(int handle)
+    {
+
+        // A zero handle equals null
+
+        if (handle == 0)
+        {
+            return null;
+        }
+
+        // Then try to find an existing Java representative for the
+        // object
+
+        Object3D obj = findObject(handle);
+        if (obj != null)
+        {
+            return obj;
+        }
+
+        // Not found, create a new Java object. Note that only
+        // non-abstract classes can possibly be returned.
+
+        switch (_getClassID(handle))
+        {
+        case ANIMATION_CONTROLLER:
+            return new AnimationController(handle);
+        case ANIMATION_TRACK:
+            return new AnimationTrack(handle);
+        case APPEARANCE:
+            return new Appearance(handle);
+        case BACKGROUND:
+            return new Background(handle);
+        case CAMERA:
+            return new Camera(handle);
+        case COMPOSITING_MODE:
+            return new CompositingMode(handle);
+        case FOG:
+            return new Fog(handle);
+        case GROUP:
+            return new Group(handle);
+        case IMAGE_2D:
+            return new Image2D(handle);
+        case INDEX_BUFFER:
+            return new TriangleStripArray(handle);
+        case KEYFRAME_SEQUENCE:
+            return new KeyframeSequence(handle);
+        case LIGHT:
+            return new Light(handle);
+            //case LOADER:
+        case MATERIAL:
+            return new Material(handle);
+        case MESH:
+            return new Mesh(handle);
+        case MORPHING_MESH:
+            return new MorphingMesh(handle);
+        case POLYGON_MODE:
+            return new PolygonMode(handle);
+            //case RENDER_CONTEXT:
+        case SKINNED_MESH:
+            return new SkinnedMesh(handle);
+        case SPRITE_3D:
+            return new Sprite3D(handle);
+        case TEXTURE_2D:
+            return new Texture2D(handle);
+        case VERTEX_ARRAY:
+            return new VertexArray(handle);
+        case VERTEX_BUFFER:
+            return new VertexBuffer(handle);
+        case WORLD:
+            return new World(handle);
+        default:
+            throw new Error();
+        }
+    }
+
+    /**
+     * Forces removal of an object from the handle-to-object map.
+     */
+    static final void deregister(Object3D obj, Interface self)
+    {
+        self.liveObjects.remove(new Integer(obj.handle));
+        if (self.liveObjects.isEmpty() && self.iShutdown)
+        {
+            self.registeredFinalize();
+        }
+    }
+
+    /**
+     * Forces removal of an object from the handle-to-object map.
+     */
+    static final void deregister(Loader obj, Interface self)
+    {
+        self.liveObjects.remove(new Integer(obj.handle));
+        if (self.liveObjects.isEmpty() && self.iShutdown)
+        {
+            self.registeredFinalize();
+        }
+    }
+
+    /**
+     *  Sets shutdown indication flag. Actual native
+     *  cleanup occurs when liveObjects count is zero
+     */
+    void signalShutdown()
+    {
+        iShutdown = true;
+    }
+
+    /**
+     * Gets the state of this interface
+     * @return true if interface is fully constructed, otherwise false
+     */
+    boolean isFullyInitialized()
+    {
+        return iNativeInitialized;
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    /**
+     * Checks the status of the native interface
+     */
+    private void integrityCheck()
+    {
+        if (!iNativeInitialized)
+        {
+            // If native interface cannot be initialized we cannot recover from it
+            if (!initNativePeer())
+            {
+                throw new Error("UI thread not available");
+            }
+        }
+    }
+
+    /**
+     * Initializes native peer
+     * @return true if native interface was succesfully inialized otherwise false
+     */
+    private boolean initNativePeer()
+    {
+        if (iNativeInitialized)
+        {
+            return true;
+        }
+        if (Platform.uiThreadAvailable())
+        {
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    handle = _ctor();
+                }
+            });
+            iNativeInitialized = true;
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+
+//#ifdef RD_JAVA_OMJ
+    private void doFinalize()
+    {
+        if (mFinalizer != null)
+        {
+            registeredFinalize();
+            mFinalizer = null;
+        }
+    }
+//#endif // RD_JAVA_OMJ
+
+    // Native finalization hook, for Symbian only
+    final private void registeredFinalize()
+    {
+        if (Interface.instance != null)
+        {
+            // Finalize M3G interface
+            Platform.executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    Platform.finalizeInterface(handle);
+                }
+            });
+            Interface.instance = null;
+        }
+    }
+
+    // Native constructor
+    private static native int _ctor();
+
+    // Native class ID resolver
+    private static native int _getClassID(int hObject);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/KeyframeSequence.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,150 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class KeyframeSequence extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int LINEAR = 176;
+    public static final int SLERP = 177;
+    public static final int SPLINE = 178;
+    public static final int SQUAD = 179;
+    public static final int STEP = 180;
+
+    public static final int CONSTANT = 192;
+    public static final int LOOP = 193;
+
+    //------------------------------------------------------------------
+    // Constructor
+    //------------------------------------------------------------------
+
+    public KeyframeSequence(int numKeyframes,
+                            int numComponents,
+                            int interpolation)
+    {
+        super(_ctor(Interface.getHandle(),
+                    numKeyframes,
+                    numComponents,
+                    interpolation));
+    }
+
+    /**
+     */
+    KeyframeSequence(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setKeyframe(int index, int time, float[] value)
+    {
+        _setKeyframe(handle, index, time, value);
+    }
+
+    public void setValidRange(int first, int last)
+    {
+        _setValidRange(handle, first, last);
+    }
+
+    public void setDuration(int duration)
+    {
+        _setDuration(handle, duration);
+    }
+
+    public int getDuration()
+    {
+        return _getDuration(handle);
+    }
+
+    /**
+     */
+    public void setRepeatMode(int mode)
+    {
+        _setRepeatMode(handle, mode);
+    }
+
+    /**
+     */
+    public int getRepeatMode()
+    {
+        return _getRepeatMode(handle);
+    }
+
+    // M3G 1.1 Maintenance release getters
+
+    public int getComponentCount()
+    {
+        return _getComponentCount(handle);
+    }
+
+    public int getInterpolationType()
+    {
+        return _getInterpolationType(handle);
+    }
+
+    public int getKeyframe(int index, float[] value)
+    {
+        return _getKeyframe(handle, index, value);
+    }
+
+    public int getKeyframeCount()
+    {
+        return _getKeyframeCount(handle);
+    }
+
+    public int getValidRangeFirst()
+    {
+        return _getValidRangeFirst(handle);
+    }
+
+    public int getValidRangeLast()
+    {
+        return _getValidRangeLast(handle);
+    }
+
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private native static int _ctor(int hInterface,
+                                    int numKeyframes,
+                                    int numComponents,
+                                    int interpolation);
+    private native static void _setValidRange(int handle, int first, int last);
+    private native static void _setKeyframe(int handle, int index, int time, float[] value);
+    private native static void _setDuration(int handle, int duration);
+    private native static int _getDuration(int handle);
+    private native static void _setRepeatMode(int handle, int mode);
+    private native static int _getRepeatMode(int handle);
+
+    // M3G 1.1 Maintenance release getters
+    private native static int _getComponentCount(int handle);
+    private native static int _getInterpolationType(int handle);
+    private native static int _getKeyframe(int handle, int index, float[] value);
+    private native static int _getKeyframeCount(int handle);
+    private native static int _getValidRangeFirst(int handle);
+    private native static int _getValidRangeLast(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Light.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Light extends Node
+{
+    public static final int AMBIENT     = 128;
+    public static final int DIRECTIONAL = 129;
+    public static final int OMNI        = 130;
+    public static final int SPOT        = 131;
+
+    public Light()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Light(int handle)
+    {
+        super(handle);
+    }
+
+    public void setIntensity(float intensity)
+    {
+        _setIntensity(handle, intensity);
+    }
+
+    public float getIntensity()
+    {
+        return _getIntensity(handle);
+    }
+
+    public void setColor(int RGB)
+    {
+        _setColor(handle, RGB);
+    }
+
+    public int getColor()
+    {
+        return _getColor(handle);
+    }
+
+    public void setMode(int mode)
+    {
+        _setMode(handle, mode);
+    }
+
+    public int getMode()
+    {
+        return _getMode(handle);
+    }
+
+    public void setSpotAngle(float angle)
+    {
+        _setSpotAngle(handle, angle);
+    }
+
+    public float getSpotAngle()
+    {
+        return _getSpotAngle(handle);
+    }
+
+    public void setSpotExponent(float exponent)
+    {
+        _setSpotExponent(handle, exponent);
+    }
+
+    public float getSpotExponent()
+    {
+        return _getSpotExponent(handle);
+    }
+
+    public void setAttenuation(float constant, float linear, float quadratic)
+    {
+        _setAttenuation(handle, constant, linear, quadratic);
+    }
+
+    public float getConstantAttenuation()
+    {
+        return _getAttenuation(handle, Defs.GET_CONSTANT);
+    }
+
+    public float getLinearAttenuation()
+    {
+        return _getAttenuation(handle, Defs.GET_LINEAR);
+    }
+
+    public float getQuadraticAttenuation()
+    {
+        return _getAttenuation(handle, Defs.GET_QUADRATIC);
+    }
+
+    // Native methods
+    private static native int   _ctor(int hInterface);
+    private static native void  _setIntensity(int handle, float intensity);
+    private static native float _getIntensity(int handle);
+    private static native void  _setColor(int handle, int RGB);
+    private static native int   _getColor(int handle);
+    private static native void  _setMode(int handle, int mode);
+    private static native int   _getMode(int handle);
+    private static native void  _setSpotAngle(int handle, float angle);
+    private static native float _getSpotAngle(int handle);
+    private static native void  _setSpotExponent(int handle, float exponent);
+    private static native float _getSpotExponent(int handle);
+    private static native void  _setAttenuation(int handle, float constant, float linear, float quadratic);
+    private static native float _getAttenuation(int handle, int type);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Loader.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,1123 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import java.io.*;
+import java.io.IOException;
+
+import java.util.Vector;
+import java.util.Hashtable;
+
+import javax.microedition.io.*;
+import javax.microedition.lcdui.Image;
+import javax.microedition.io.Connector;
+import javax.microedition.io.HttpConnection;
+//#ifdef RD_JAVA_OMJ
+import com.nokia.mj.impl.rt.support.Finalizer;
+//#endif // RD_JAVA_OMJ
+
+public class Loader
+{
+    // M3G
+    static final byte[] M3G_FILE_IDENTIFIER =
+    {
+        -85, 74, 83, 82, 49, 56, 52, -69, 13, 10, 26, 10
+    };
+    // PNG
+    static final byte[] PNG_FILE_IDENTIFIER =
+    {
+        -119, 80, 78, 71, 13, 10, 26, 10
+    };
+    static final int PNG_IHDR = ((73 << 24) + (72 << 16) + (68 << 8) + 82);
+    static final int PNG_tRNS = ((116 << 24) + (82 << 16) + (78 << 8) + 83);
+    static final int PNG_IDAT = ((73 << 24) + (68 << 16) + (65 << 8) + 84);
+
+    // JPEG
+    static final byte[] JPEG_FILE_IDENTIFIER =
+    {
+        -1, -40
+    };
+    static final int JPEG_JFIF = ((74 << 24) + (70 << 16) + (73 << 8) + 70);
+    // Bytes before colour info in a frame header 'SOFn':
+    // length (2 bytes), precision (1 byte), image height & width (4 bytes)
+    static final int JPEG_SOFn_DELTA = 7;
+    static final int JPEG_INVALID_COLOUR_FORMAT = -1;
+
+    // File identifier types
+    private static final int INVALID_HEADER_TYPE = -1;
+    private static final int M3G_TYPE = 0;
+    private static final int PNG_TYPE = 1;
+    private static final int JPEG_TYPE = 2;
+
+    // Misc.
+    private static final int MAX_IDENTIFIER_LENGTH  = M3G_FILE_IDENTIFIER.length;
+
+    // Initial buffer length for the header
+    private static final int AVG_HEADER_SEC_LENGTH  = 64;
+
+    // Initial buffer length for the xref section
+    private static final int AVG_XREF_SEC_LENGTH    = 128;
+
+    // Instance specific
+    int handle;
+
+    private Vector iLoadedObjects = new Vector();
+    private Vector iFileHistory = new Vector();
+    private String iResourceName = null;
+    private String iParentResourceName = null;
+
+    private int iTotalFileSize = 0;
+    private int iBytesRead = M3G_FILE_IDENTIFIER.length;
+
+    private byte[] iStreamData = null;
+    private int iStreamOffset = 0;
+
+    private Interface iInterface;
+
+//#ifdef RD_JAVA_OMJ
+    private Finalizer mFinalizer = new Finalizer()
+    {
+        public void finalizeImpl()
+        {
+            doFinalize();
+        }
+    };
+//#endif // RD_JAVA_OMJ
+
+    /**
+     * Default ctor
+     */
+    private Loader()
+    {
+        iInterface = Interface.getInstance();
+    }
+
+    /**
+     * Ctor
+     * @param aFileHistory File storage
+     * @param aParentResourceName Resource name
+     */
+    private Loader(Vector aFileHistory, String aParentResourceName)
+    {
+        iParentResourceName = aParentResourceName;
+        iFileHistory        = aFileHistory;
+        iInterface          = Interface.getInstance();
+    }
+
+    public static Object3D[] load(String name) throws IOException
+    {
+        if (name == null)
+        {
+            throw new NullPointerException();
+        }
+
+        try
+        {
+            return (new Loader()).loadFromStream(name);
+        }
+        catch (SecurityException e)
+        {
+            throw e;
+        }
+        catch (IOException e)
+        {
+            throw e;
+        }
+        catch (Exception e)
+        {
+            throw new IOException("Load error " + e);
+        }
+    }
+
+    public static Object3D[] load(byte[] data, int offset) throws IOException
+    {
+        if (data == null)
+        {
+            throw new NullPointerException();
+        }
+
+        if (offset < 0 || offset >= data.length)
+        {
+            throw new IndexOutOfBoundsException();
+        }
+        try
+        {
+            return (new Loader()).loadFromByteArray(data, offset);
+        }
+        catch (SecurityException e)
+        {
+            throw e;
+        }
+        catch (IOException e)
+        {
+            throw e;
+        }
+        catch (Exception e)
+        {
+            throw new IOException("Load error " + e);
+        }
+    }
+
+    /**
+     * @see javax.microedition.m3g.Loader#load(String)
+     */
+    private Object3D[] loadFromStream(String aName) throws IOException
+    {
+        if (aName == null)
+        {
+            throw new NullPointerException();
+        }
+
+        if (inFileHistory(aName))
+        {
+            throw new IOException("Reference loop detected.");
+        }
+        iResourceName = aName;
+        iFileHistory.addElement(aName);
+        PeekInputStream stream = new PeekInputStream(
+            getInputStream(aName), MAX_IDENTIFIER_LENGTH);
+        // png, jpeg or m3g
+        int type = getIdentifierType(stream);
+        stream.rewind();
+        iStreamData = null;
+        iStreamOffset = 0;
+
+        Object3D[] objects;
+        try
+        {
+            objects = doLoad(stream, type);
+        }
+        finally
+        {
+            try
+            {
+                stream.close();
+                stream = null;
+            }
+            catch (Exception e) {}
+        }
+        // Finally, remove file from history
+        iFileHistory.removeElement(aName);
+        return objects;
+    }
+
+    /**
+     * @see javax.microedition.m3g.Loader#load(byte[], int)
+     */
+    private Object3D[] loadFromByteArray(byte[] aData, int aOffset) throws IOException
+    {
+        if (aData == null)
+        {
+            throw new NullPointerException("Resource byte array is null.");
+        }
+        int type = getIdentifierType(aData, aOffset);
+        ByteArrayInputStream stream =
+            new ByteArrayInputStream(aData, aOffset, aData.length - aOffset);
+        iStreamData = aData;
+        iStreamOffset = aOffset;
+        iResourceName = "ByteArray";
+
+        Object3D[] objects;
+        try
+        {
+            objects = doLoad(stream, type);
+        }
+        finally
+        {
+            try
+            {
+                stream.close();
+                stream = null;
+            }
+            catch (Exception e) {}
+        }
+        return objects;
+    }
+
+    /**
+     * Dispatcher
+     * @param aStream Source stream
+     * @param aType Resource type
+     */
+    private Object3D[] doLoad(InputStream aStream, int aType) throws IOException
+    {
+        if (aType == M3G_TYPE)
+        {
+            return loadM3G(aStream);
+        }
+        else if (aType == PNG_TYPE)
+        {
+            return loadPNG(aStream);
+        }
+        else if (aType == JPEG_TYPE)
+        {
+            return loadJPEG(aStream);
+        }
+        throw new IOException("File not recognized.");
+    }
+
+    /**
+     * PNG resource loader
+     * @param aStream Resource stream
+     * @return An array of newly created Object3D instances
+     */
+    private Object3D[] loadPNG(InputStream aStream) throws IOException
+    {
+        int format = Image2D.RGB;
+        DataInputStream in = new DataInputStream(aStream);
+
+        // Scan chuncs that have effect on Image2D format
+        in.skip(PNG_FILE_IDENTIFIER.length);
+
+        try
+        {
+            while (true)
+            {
+                int length = in.readInt();
+                int type = in.readInt();
+                // IHDR
+                if (type == PNG_IHDR)
+                {
+                    in.skip(9);
+                    int colourType = in.readUnsignedByte();
+                    length -= 10;
+
+                    switch (colourType)
+                    {
+                    case 0:
+                        format = Image2D.LUMINANCE;
+                        break;
+                    case 2:
+                        format = Image2D.RGB;
+                        break;
+                    case 3:
+                        format = Image2D.RGB;
+                        break;
+                    case 4:
+                        format = Image2D.LUMINANCE_ALPHA;
+                        break;
+                    case 6:
+                        format = Image2D.RGBA;
+                        break;
+                    }
+                }
+                // tRNS
+                if (type == PNG_tRNS)
+                {
+                    switch (format)
+                    {
+                    case Image2D.LUMINANCE:
+                        format = Image2D.LUMINANCE_ALPHA;
+                        break;
+                    case Image2D.RGB:
+                        format = Image2D.RGBA;
+                        break;
+                    }
+                }
+                // IDAT
+                if (type == PNG_IDAT)
+                {
+                    break;
+                }
+
+                in.skip(length + 4);
+            }
+        }
+        // EOF
+        catch (Exception e)
+        {
+        }
+        // Close the data stream
+        try
+        {
+            in.close();
+            in = null;
+        }
+        catch (Exception e) {}
+        return buildImage2D(format);
+    }
+
+    /**
+     * JPEG (with the same detailed definitions about the JPEG image format as defined in the
+     * JSR 118 MIDP 2.1 specification for LCDUI) MUST be supported by compliant
+     * implementations as a 2D bitmap image format for the Image2D class using the
+     * javax.microedition.m3g.Loader class, and for M3G content files referencing bitmap images.
+     * For colour JPEG images, the pixel format of the returned Image2D object MUST be
+     * Image2D.RGB and for monochrome JPEG images, the pixel format MUST be
+     * Image2D.LUMINANCE.
+     *
+     * JPEG marker: A two-byte code in which the first byte is 0xFF and the second
+     * byte is a value between 1 and 0xFE.
+     *
+     * A JFIF file uses APP0 (0xe0) marker segments and constrains certain parameters in the frame.
+     *
+     * A frame header:
+     * - 0xff, 'SOFn'
+     * - length (2 bytes, Hi-Lo)
+     * - data precision (1 byte)
+     * - image height (2 bytes, Hi-Lo)
+     * - image width (2 bytes, Hi-Lo)
+     * - number of components (1 byte): 1 = grey scaled, 3 = color YCbCr or YIQ, 4 = color CMYK)
+     *
+     * @param aStream Resource stream
+     * @return An array of newly created Object3D instances
+     */
+    private Object3D[] loadJPEG(InputStream aStream) throws IOException
+    {
+        int format = JPEG_INVALID_COLOUR_FORMAT;
+        DataInputStream in = new DataInputStream(aStream);
+        // Skip file identifier
+        in.skip(JPEG_FILE_IDENTIFIER.length);
+        try
+        {
+            int marker;
+            do
+            {
+                // Find marker
+                while (in.readUnsignedByte() != 0xff);
+                do
+                {
+                    marker = in.readUnsignedByte();
+                }
+                while (marker == 0xff);
+
+                // Parse marker
+                switch (marker)
+                {
+                    // 'SOFn' (Start Of Frame n)
+                case 0xC0:
+                case 0xC1:
+                case 0xC2:
+                case 0xC3:
+                case 0xC5:
+                case 0xC6:
+                case 0xC7:
+                case 0xC9:
+                case 0xCA:
+                case 0xCB:
+                case 0xCD:
+                case 0xCE:
+                case 0xCF:
+                    // Skip length(2), precicion(1), width(2), height(2)
+                    in.skip(JPEG_SOFn_DELTA);
+                    switch (in.readUnsignedByte())
+                    {
+                    case 1:
+                        format = Image2D.LUMINANCE;
+                        break;
+                    case 3:
+                        format = Image2D.RGB;
+                        break;
+                    default:
+                        throw new IOException("Unknown JPG format.");
+                    }
+                    break;
+                    // APP0 (0xe0) marker segments and constrains certain parameters in the frame.
+                case 0xe0:
+                    int length = in.readUnsignedShort();
+                    if (JPEG_JFIF != in.readInt())
+                    {
+                        throw new IOException("Not a valid JPG file.");
+                    }
+                    in.skip(length - 4 - 2);
+                    break;
+                default:
+                    // Skip variable data
+                    in.skip(in.readUnsignedShort() - 2);
+                    break;
+                }
+            }
+            while (format == JPEG_INVALID_COLOUR_FORMAT);
+        }
+        catch (Exception e) {}
+        // Close the data stream
+        try
+        {
+            in.close();
+            in = null;
+        }
+        catch (Exception e) {}
+        return buildImage2D(format);
+    }
+
+    /**
+     * Image2D builder
+     * @param aColourFormat Colour format
+     * @return An array of newly created Object3D instances
+     */
+    private Object3D[] buildImage2D(int aColourFormat) throws IOException
+    {
+        InputStream stream;
+        if (iStreamData == null)
+        {
+            stream = getInputStream(iResourceName);
+        }
+        else
+        {
+            stream = (InputStream) new ByteArrayInputStream(
+                         iStreamData, iStreamOffset, iStreamData.length - iStreamOffset);
+        }
+        // Create an image object
+        Image2D i2d;
+        try
+        {
+            i2d = new Image2D(aColourFormat, Image.createImage(stream));
+        }
+        finally
+        {
+            try
+            {
+                stream.close();
+            }
+            catch (Exception e) {}
+        }
+        return new Object3D[] { i2d };
+    }
+
+
+    /**
+     * M3G resource loader
+     * @param aStream Resource stream
+     * @return An array of newly created Object3D instances
+     */
+    private Object3D[] loadM3G(InputStream aStream) throws IOException
+    {
+        aStream.skip(M3G_FILE_IDENTIFIER.length);
+        if (aStream instanceof PeekInputStream)
+            ((PeekInputStream)aStream).increasePeekBuffer(AVG_HEADER_SEC_LENGTH);
+
+        // Read header
+        int compressionScheme = readByte(aStream);
+        int totalSectionLength = readUInt32(aStream);
+        if (aStream instanceof PeekInputStream && totalSectionLength > AVG_HEADER_SEC_LENGTH)
+            ((PeekInputStream)aStream).increasePeekBuffer(totalSectionLength - AVG_HEADER_SEC_LENGTH);
+        int uncompressedLength = readUInt32(aStream);
+
+        int objectType = readByte(aStream);
+        int length    = readUInt32(aStream);
+
+        byte vMajor = (byte) readByte(aStream);
+        byte vMinor = (byte) readByte(aStream);
+        boolean externalLinks = readBoolean(aStream);
+        iTotalFileSize = readUInt32(aStream);
+        int approximateContentSize = readUInt32(aStream);
+        String authoringField = readString(aStream);
+
+        int checksum = readUInt32(aStream);
+
+        /* Create and register a new native Loader */
+        handle = _ctor(Interface.getHandle());
+        Interface.register(this);
+
+        if (externalLinks)
+        {
+            if (aStream instanceof PeekInputStream)
+                ((PeekInputStream)aStream).increasePeekBuffer(AVG_XREF_SEC_LENGTH);
+            loadExternalRefs(aStream);
+            if (iLoadedObjects.size() > 0)   // Load and set external references
+            {
+                int[] xRef = new int[iLoadedObjects.size()];
+                for (int i = 0; i < xRef.length; i++)
+                    xRef[i] = ((Object3D)iLoadedObjects.elementAt(i)).handle;
+                _setExternalReferences(handle, xRef);
+            }
+            else
+            {
+                throw new IOException("No external sections [" + iResourceName + "].");
+            }
+        }
+
+        // Reset stream
+        if (aStream instanceof PeekInputStream)
+            ((PeekInputStream)aStream).rewind();
+        else if (aStream.markSupported())
+            aStream.reset(); // Reset is supported in ByteArrayInputStreams
+
+        int read = 0;
+        int size = aStream.available();
+
+        if (size == 0)
+        {
+            size = 2048;    // start with some size
+        }
+
+        while (read < iTotalFileSize)
+        {
+            if (read + size > iTotalFileSize)
+            {
+                size = iTotalFileSize - read;
+            }
+            // Use native loader to load objects
+            byte[] data = new byte[size];
+            if (aStream.read(data) == -1)
+            {
+                break;
+            }
+            read += size;
+
+            size = _decodeData(handle, 0, data);
+            if (size > 0 && aStream.available() > size)
+            {
+                size = aStream.available();
+            }
+        }
+        if (size != 0 || read != iTotalFileSize)
+        {
+            throw new IOException("Invalid file length [" + iResourceName + "].");
+        }
+
+        Object3D[] objects = null;
+        int num = _getLoadedObjects(handle, null);
+        if (num > 0)
+        {
+            int[] obj = new int[num];
+            _getLoadedObjects(handle, obj);
+            objects = new Object3D[num];
+            for (int i = 0; i < objects.length; i++)
+            {
+                objects[i] = Interface.getObjectInstance(obj[i]);
+            }
+            setUserObjects();
+        }
+        return objects;
+    }
+
+    /**
+     *
+     */
+    private void setUserObjects() throws IOException
+    {
+        int numObjects = _getObjectsWithUserParameters(handle, null);
+        int[] obj = null;
+        if (numObjects > 0)
+        {
+            obj = new int[numObjects];
+            _getObjectsWithUserParameters(handle, obj);
+        }
+        for (int i = 0; i < numObjects; i++)
+        {
+            int num = _getNumUserParameters(handle, i);
+            if (num > 0)
+            {
+                Hashtable hash = new Hashtable();
+                for (int j = 0; j < num; j++)
+                {
+                    int len = _getUserParameter(handle, i, j, null);
+                    byte[] data = new byte[len];
+                    int id = _getUserParameter(handle, i, j, data);
+                    if (hash.put(new Integer(id), data) != null)
+                        throw new IOException("Duplicate id in user data [" + iResourceName + "].");;
+                }
+                Object3D object = Interface.getObjectInstance(obj[i]);
+                object.setUserObject(hash);
+            }
+        }
+    }
+
+    /**
+     * Load external resources
+     */
+    private void loadExternalRefs(InputStream aStream) throws IOException
+    {
+        // Check for the end of the aStream or file
+        int firstByte = readByte(aStream);
+        if (firstByte == -1 || (iTotalFileSize != 0 && iBytesRead >= iTotalFileSize))
+        {
+            return;
+        }
+
+        int compressionScheme = firstByte;
+
+        int totalSectionLength = readUInt32(aStream);
+        iBytesRead += totalSectionLength;
+        if (aStream instanceof PeekInputStream && totalSectionLength > AVG_XREF_SEC_LENGTH)
+            ((PeekInputStream)aStream).increasePeekBuffer(totalSectionLength - AVG_XREF_SEC_LENGTH);
+        int uncompressedLength = readUInt32(aStream);
+        int expectedCount = totalSectionLength;
+
+        // Decompress data if necessary
+        CountedInputStream uncompressedStream = null;
+        if (compressionScheme == 0)
+        {
+            uncompressedStream = new CountedInputStream(aStream);
+            if (uncompressedLength != totalSectionLength - 13)
+            {
+                throw new IOException("Section length mismatch [" + iResourceName + "].");
+            }
+        }
+        else if (compressionScheme == 1)
+        {
+            if (uncompressedLength == 0 && totalSectionLength - 13 == 0)
+            {
+                uncompressedStream = new CountedInputStream(null);
+            }
+            else
+            {
+                if (uncompressedLength <= 0 || totalSectionLength - 13 <= 0)
+                {
+                    throw new IOException("Section length mismatch [" + iResourceName + "].");
+                }
+                byte[] compressed = new byte[(int) totalSectionLength - 13];
+                aStream.read(compressed);
+
+                byte[] uncompressed = new byte[(int) uncompressedLength];
+
+                // zlib decompression
+                if (!_inflate(compressed, uncompressed))
+                {
+                    throw new IOException("Decompression error.");
+                }
+                uncompressedStream = new CountedInputStream(
+                    new ByteArrayInputStream(uncompressed));
+            }
+        }
+        else
+        {
+            throw new IOException("Unrecognized compression scheme [" + iResourceName + "].");
+        }
+
+        // load all objects in this section
+        uncompressedStream.resetCounter();
+
+        while (uncompressedStream.getCounter() < uncompressedLength)
+        {
+            iLoadedObjects.addElement(loadObject(uncompressedStream));
+        }
+
+        if (uncompressedStream.getCounter() != uncompressedLength)
+        {
+            throw new IOException("Section length mismatch [" + iResourceName + "].");
+        }
+
+        // read checksum
+        int checksum = readUInt32(aStream);
+    }
+
+    private Object3D loadObject(CountedInputStream aStream) throws IOException
+    {
+        int objectType = readByte(aStream);
+        int length    = readUInt32(aStream);
+
+        int expectedCount = aStream.getCounter() + length;
+        Object3D newObject = null;
+
+        if (objectType == 255)
+        {
+            String xref = readString(aStream);
+            newObject = (new Loader(iFileHistory, iResourceName)).loadFromStream(xref)[0];
+        }
+        else
+        {
+            throw new IOException("Invalid external section [" + iResourceName + "].");
+        }
+
+        if (expectedCount != aStream.getCounter())
+        {
+            throw new IOException("Object length mismatch [" + iResourceName + "].");
+        }
+
+        return newObject;
+    }
+
+    /**
+     * Read a byte integer from a stream
+     */
+    private static final int readByte(InputStream aStream) throws IOException
+    {
+        return aStream.read();
+    }
+
+    /**
+     * Read a boolean from a stream
+     */
+    private static boolean readBoolean(InputStream aStream) throws IOException
+    {
+        int b = aStream.read();
+        if (b == 0)
+        {
+            return false;
+        }
+        if (b != 1)
+        {
+            throw new IOException("Malformed boolean.");
+        }
+        return true;
+    }
+
+    /**
+     * Read a unsigned integer from a stream
+     */
+    private static final int readUInt32(InputStream aStream) throws IOException
+    {
+        return aStream.read()
+               + (aStream.read() << 8)
+               + (aStream.read() << 16)
+               + (aStream.read() << 24);
+    }
+
+    /**
+     * Read a string from a stream
+     */
+    private static String readString(InputStream aStream) throws IOException
+    {
+        StringBuffer result = new StringBuffer();
+        int i = 0;
+        for (int c = aStream.read(); c != 0; c = aStream.read())
+        {
+            if ((c & 0x80) == 0)   // 0xxxxxxx => 1 byte
+            {
+                result.append((char)(c & 0x00FF));
+            }
+            else if ((c & 0xE0) == 0xC0)   // 110xxxxx => 2 bytes
+            {
+                int c2 = aStream.read();
+                if ((c2 & 0xC0) != 0x80)   // second byte is not 10yyyyyy
+                {
+                    throw new IOException("Invalid UTF-8 string.");
+                }
+                else   // 110xxxxx 10yyyyyy
+                {
+                    result.append((char)(((c & 0x1F) << 6) | (c2 & 0x3F)));
+                }
+            }
+            else if ((c & 0xF0) == 0xE0)   // 1110 xxxx => 3 bytes
+            {
+                int c2 = aStream.read();
+                int c3 = aStream.read();
+                if (((c2 & 0xC0) != 0x80) || // second byte is not 10yyyyyy
+                        ((c3 & 0xC0) != 0x80))   // third byte is not 10zzzzzz
+                {
+                    throw new IOException("Invalid UTF-8 string.");
+                }
+                else   // 1110xxxx 10yyyyyy 10zzzzzz
+                {
+                    result.append((char)(((c & 0x0F) << 12) |
+                                         ((c2 & 0x3F) <<6) |
+                                         (c3 & 0x3F)));
+                }
+            }
+            else   // none of above
+            {
+                throw new IOException("Invalid UTF-8 string.");
+            }
+        }
+
+        return result.toString();
+    }
+
+    /**
+     * Solve an identifier of the given data
+     * @param aStream Stream
+     * @return solved identifier.
+     */
+    private int getIdentifierType(InputStream aStream) throws IOException
+    {
+        byte[] data = new byte[MAX_IDENTIFIER_LENGTH];
+        aStream.read(data);
+        return getIdentifierType(data, 0);
+    }
+
+    /**
+     * Solve an identifier of the given data
+     * @param aData Data
+     * @param aOffset Data offset
+     * @return solved identifier.
+     */
+    private static int getIdentifierType(byte[] aData, int aOffset)
+    {
+        // Try the JPEG/JFIF identifier
+        if (parseIdentifier(aData, aOffset, JPEG_FILE_IDENTIFIER))
+        {
+            return JPEG_TYPE;
+        }
+        // Try the PNG identifier
+        else if (parseIdentifier(aData, aOffset, PNG_FILE_IDENTIFIER))
+        {
+            return PNG_TYPE;
+        }
+        // Try the M3G identifier
+        else if (parseIdentifier(aData, aOffset, M3G_FILE_IDENTIFIER))
+        {
+            return M3G_TYPE;
+        }
+        return INVALID_HEADER_TYPE;
+    }
+
+    /**
+     * Parse identifier from a data
+     * @param aData Source data
+     * @param aOffset Source data offset
+     * @param aIdentifier Identifier
+     * @return true if the data contains the given identifier
+     */
+    private static boolean parseIdentifier(byte[] aData, int aOffset, byte[] aIdentifier)
+    {
+        if ((aData.length - aOffset) < aIdentifier.length)
+        {
+            return false;
+        }
+        for (int index = 0; index < aIdentifier.length; index++)
+        {
+            if (aData[index + aOffset] != aIdentifier[index])
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * File name storage for preventing multiple referencing
+     * @param name File name
+     * @return true if the storage contains the given file name
+     */
+    private boolean inFileHistory(String name)
+    {
+        for (int i = 0; i < iFileHistory.size(); i++)
+            if (((String)iFileHistory.elementAt(i)).equals(name))
+            {
+                return true;
+            }
+        return false;
+    }
+
+    /*
+     * InputStream-related helper functions
+     */
+
+    /**
+     * Open a HTTP stream and check its MIME type
+     * @param name Resource name
+     * @return a http stream and checks the MIME type
+     */
+    private InputStream getHttpInputStream(String name) throws IOException
+    {
+        InputConnection ic = (InputConnection)Connector.open(name);
+        // Content-Type is available for http and https connections
+        if (ic instanceof HttpConnection)
+        {
+            HttpConnection hc = (HttpConnection) ic;
+            // Check MIME type
+            String type = hc.getHeaderField("Content-Type");
+            if (type != null &&
+                    !type.equals("application/m3g") &&
+                    !type.equals("image/png") &&
+                    !type.equals("image/jpeg"))
+            {
+                throw new IOException("Wrong MIME type: " + type + ".");
+            }
+        }
+
+        InputStream is;
+        try
+        {
+            is = ic.openInputStream();
+        }
+        finally
+        {
+            try
+            {
+                ic.close();
+                ic = null;
+            }
+            catch (Exception e) {}
+        }
+        return is;
+    }
+
+    // returns a stream built from the specified file or URI
+    private InputStream getInputStream(String name) throws IOException
+    {
+        if (name.indexOf(':') != -1)   // absolute URI reference
+        {
+            return getHttpInputStream(name);
+        }
+
+        if (name.charAt(0) == '/')   // absolute file reference
+        {
+            return (new Object()).getClass().getResourceAsStream(name);
+        }
+
+        if (iParentResourceName == null)
+        {
+            throw new IOException("Relative URI.");
+        }
+
+        String uri = iParentResourceName.substring(0, iParentResourceName.lastIndexOf('/') + 1) + name;
+
+        if (uri.charAt(0) == '/')
+        {
+            return (new Object()).getClass().getResourceAsStream(uri);
+        }
+        else
+        {
+            return getHttpInputStream(uri);
+        }
+    }
+
+    class PeekInputStream extends InputStream
+    {
+        private int[] iPeekBuffer;
+        private InputStream iStream;
+        private int iBuffered;
+        private int iCounter;
+
+        PeekInputStream(InputStream aStream, int aLength)
+        {
+            iStream = aStream;
+            iPeekBuffer = new int[aLength];
+        }
+
+        public int read() throws IOException
+        {
+            if (iCounter < iBuffered)
+            {
+                return iPeekBuffer[iCounter++];
+            }
+
+            int nv = iStream.read();
+
+            if (iBuffered < iPeekBuffer.length)
+            {
+                iPeekBuffer[iBuffered] = nv;
+                iBuffered++;
+            }
+
+            iCounter++;
+            return nv;
+        }
+
+        public void increasePeekBuffer(int aLength)
+        {
+            int[] temp = new int[iPeekBuffer.length + aLength];
+            for (int i = 0; i < iBuffered; i++)
+                temp[i] = iPeekBuffer[i];
+            iPeekBuffer = temp;
+        }
+
+        public int available() throws IOException
+        {
+            if (iCounter < iBuffered)
+            {
+                return iBuffered - iCounter + iStream.available();
+            }
+            return iStream.available();
+        }
+
+        public void close()
+        {
+            try
+            {
+                iStream.close();
+            }
+            catch (IOException ioe)
+            {
+                // Intentionally left empty
+            }
+        }
+
+        public void rewind() throws IOException
+        {
+            if (iCounter > iBuffered)
+            {
+                throw new IOException("Peek buffer overrun.");
+            }
+            iCounter = 0;
+        }
+    }
+
+    class CountedInputStream extends InputStream
+    {
+        private InputStream iStream;
+        private int iCounter;
+
+        public CountedInputStream(InputStream aStream)
+        {
+            iStream = aStream;
+            resetCounter();
+        }
+
+        public int read() throws IOException
+        {
+            iCounter++;
+            return iStream.read();
+        }
+
+        public void resetCounter()
+        {
+            iCounter = 0;
+        }
+        public int getCounter()
+        {
+            return iCounter;
+        }
+
+        public void close()
+        {
+            try
+            {
+                iStream.close();
+            }
+            catch (IOException ioe)
+            {
+                // Intentionally left empty
+            }
+        }
+
+        public int available() throws IOException
+        {
+            return iStream.available();
+        }
+    }
+
+//#ifdef RD_JAVA_OMJ
+    private void doFinalize()
+    {
+        if (mFinalizer != null)
+        {
+            registeredFinalize();
+            mFinalizer = null;
+        }
+    }
+//#endif // RD_JAVA_OMJ
+
+    // Finalization method for Symbian
+    final private void registeredFinalize()
+    {
+        if (handle != 0)
+        {
+            Platform.finalizeObject(handle, iInterface);
+            iInterface.deregister(this, iInterface);
+            iInterface = null;
+            handle = 0;
+        }
+    }
+
+    // zlib decompression
+    private native static boolean _inflate(byte[] data, byte[] buffer);
+
+    // native loader
+    private native static int _ctor(int handle);
+    private native static int _decodeData(int handle, int offset, byte[] data);
+    private native static void _setExternalReferences(int handle, int[] references);
+    private native static int _getLoadedObjects(int handle, int[] objects);
+    private native static int _getObjectsWithUserParameters(int handle, int[] objects);
+    private native static int _getNumUserParameters(int handle, int obj);
+    private native static int _getUserParameter(int handle, int obj, int index, byte[] data);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/M3gRunnable.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+/**
+ * Class that wraps runnable in order to catch and forward
+ * exceptions that occured when executing in UI thread.
+ * This class is used only for running native methods in UI thread.
+ */
+abstract class M3gRunnable implements Runnable
+{
+    private Throwable e = null;
+
+    /**
+     * From Runnable interface
+     */
+    public void run()
+    {
+        try
+        {
+            doRun();
+        }
+        catch (Throwable t)
+        {
+            e = t;
+        }
+    }
+
+    /**
+     * Checks for possible exceptions and errors and throws them forward.
+     * Only unchecked exceptions and errors are thrown as only checked
+     * exception that m3gcore may throw comes from loader which is not
+     * executed in UI thread
+     *
+     * @throws RuntimeException
+     * @throws Error
+     */
+    public void checkAndThrow()
+    {
+        if (e == null)
+        {
+            return;
+        }
+        if (e instanceof RuntimeException)
+        {
+            throw(RuntimeException)e;
+        }
+        else if (e instanceof Error)
+        {
+            throw(Error)e;
+        }
+    }
+
+    /**
+     * Method to be implemented for the UI thead execution
+     */
+    abstract void doRun();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Material.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Material extends Object3D
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int AMBIENT  = 1024;
+    public static final int DIFFUSE  = 2048;
+    public static final int EMISSIVE = 4096;
+    public static final int SPECULAR = 8192;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public Material()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    Material(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setColor(int target, int ARGB)
+    {
+        _setColor(handle, target, ARGB);
+    }
+
+    public int getColor(int target)
+    {
+        return _getColor(handle, target);
+    }
+
+    public void setShininess(float shininess)
+    {
+        _setShininess(handle, shininess);
+    }
+
+    public float getShininess()
+    {
+        return _getShininess(handle);
+    }
+
+    public void setVertexColorTrackingEnable(boolean enable)
+    {
+        _setVertexColorTrackingEnable(handle, enable);
+    }
+
+    public boolean isVertexColorTrackingEnabled()
+    {
+        return _isVertexColorTrackingEnabled(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private native static int _ctor(int hInstance);
+    private native static void _setColor(int handle, int target, int ARGB);
+    private native static int _getColor(int handle, int target);
+    private native static void _setShininess(int handle, float shininess);
+    private native static float _getShininess(int handle);
+    private native static void _setVertexColorTrackingEnable(int handle, boolean enable);
+    private native static boolean _isVertexColorTrackingEnabled(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Mesh.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,235 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Mesh extends Node
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private VertexBuffer vertices;
+    private Appearance[] appearances;
+    private IndexBuffer[] triangles;
+
+    static private IndexBuffer[] tempTrianglesArray;
+    static private Appearance[]  tempAppearanceArray;
+
+    static private IndexBuffer tempTriangles;
+    static private Appearance  tempAppearance;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    Mesh(int handle)
+    {
+        super(handle);
+        updateReferences();
+    }
+
+    public Mesh(VertexBuffer vertices,
+                IndexBuffer[] triangles,
+                Appearance[] appearances)
+    {
+        super(createHandle(vertices, triangles, appearances));
+        updateReferences();
+    }
+
+    public Mesh(VertexBuffer vertices,
+                IndexBuffer triangles,
+                Appearance appearance)
+    {
+        super(createHandle(vertices, triangles, appearance));
+        updateReferences();
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setAppearance(int index, Appearance appearance)
+    {
+        _setAppearance(handle, index, appearance != null ? appearance.handle : 0);
+        appearances[index] = appearance;
+    }
+
+    public Appearance getAppearance(int index)
+    {
+        return appearances[index];
+    }
+
+    public IndexBuffer getIndexBuffer(int index)
+    {
+        return triangles[index];
+    }
+
+    public VertexBuffer getVertexBuffer()
+    {
+        return vertices;
+    }
+
+    public int getSubmeshCount()
+    {
+        return _getSubmeshCount(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    static void verifyParams(VertexBuffer vertices,
+                             IndexBuffer[] triangles,
+                             Appearance[] appearances)
+    {
+        if (vertices == null || triangles == null)
+        {
+            throw new NullPointerException();
+        }
+        if (triangles.length == 0
+                || appearances != null && appearances.length < triangles.length)
+        {
+            throw new IllegalArgumentException();
+        }
+        if (triangles.length == 0)
+        {
+            throw new IllegalArgumentException();
+        }
+        for (int i = 0; i < triangles.length; ++i)
+        {
+            if (triangles[i] == null)
+            {
+                throw new NullPointerException();
+            }
+        }
+    }
+
+    static void verifyParams(VertexBuffer vertices,
+                             IndexBuffer triangles)
+    {
+        if (vertices == null || triangles == null)
+        {
+            throw new NullPointerException();
+        }
+    }
+
+    void updateReferences()
+    {
+        triangles = new IndexBuffer[_getSubmeshCount(handle)];
+        appearances = new Appearance[triangles.length];
+
+        vertices = (VertexBuffer)getInstance(_getVertexBuffer(handle));
+
+        for (int i = 0; i < triangles.length; i++)
+        {
+            triangles[i] = (IndexBuffer)getInstance(_getIndexBuffer(handle, i));
+            appearances[i] = (Appearance)getInstance(_getAppearance(handle, i));
+        }
+    }
+
+    static int createHandle(VertexBuffer vertices,
+                            IndexBuffer[] triangles,
+                            Appearance[] appearances)
+    {
+
+        tempTrianglesArray = triangles;
+        tempAppearanceArray = appearances;
+
+        // Verify parameters
+        verifyParams(vertices, triangles, appearances);
+
+        // Init the native side
+        int[] hTriangles = new int[triangles.length];
+        int[] hAppearances = null;
+
+        if (appearances != null)
+        {
+            hAppearances = new int[appearances.length];
+        }
+
+        for (int i = 0; i < triangles.length; i++)
+        {
+            hTriangles[i] = triangles[i].handle;
+
+            if (appearances != null)
+            {
+                hAppearances[i] = appearances[i] != null ? appearances[i].handle : 0;
+            }
+        }
+
+        int ret =  _ctor(Interface.getHandle(),
+                         vertices.handle,
+                         hTriangles,
+                         hAppearances);
+
+
+        tempTrianglesArray = null;
+        tempAppearanceArray = null;
+
+        return ret;
+
+    }
+
+    static int createHandle(VertexBuffer vertices,
+                            IndexBuffer triangles,
+                            Appearance appearance)
+    {
+
+        tempTriangles  = triangles;
+        tempAppearance = appearance;
+
+        verifyParams(vertices, triangles);
+
+        // Init the native side
+        int[] hTriangles = new int[1];
+        int[] hAppearances = null;
+
+        hTriangles[0] = triangles.handle;
+
+        if (appearance != null)
+        {
+            hAppearances = new int[1];
+            hAppearances[0] = appearance.handle;
+        }
+
+        int ret =  _ctor(Interface.getHandle(),
+                         vertices.handle,
+                         hTriangles,
+                         hAppearances);
+
+
+        tempTriangles  = null;
+        tempAppearance = null;
+
+
+        return ret;
+
+    }
+
+    // Native methods
+    private static native int _ctor(int hInstance,
+                                    int hVertices,
+                                    int[] hTriangles,
+                                    int[] hAppearances);
+    private static native void _setAppearance(int handle, int index, int hAppearance);
+    private static native int _getAppearance(int handle, int index);
+    private static native int _getIndexBuffer(int handle, int index);
+    private static native int _getVertexBuffer(int handle);
+    private static native int _getSubmeshCount(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/MorphingMesh.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,199 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class MorphingMesh extends Mesh
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private VertexBuffer[] targets;
+
+    static private IndexBuffer[] tempTrianglesArray;
+    static private Appearance[]  tempAppearanceArray;
+
+    static private IndexBuffer tempTriangles;
+    static private Appearance  tempAppearance;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public MorphingMesh(
+        VertexBuffer base,
+        VertexBuffer[] targets,
+        IndexBuffer triangles,
+        Appearance appearance)
+    {
+        super(createHandle(base, targets, triangles, appearance));
+        this.targets = new VertexBuffer[targets.length];
+        System.arraycopy(targets, 0, this.targets, 0, targets.length);
+    }
+
+    public MorphingMesh(
+        VertexBuffer base,
+        VertexBuffer[] targets,
+        IndexBuffer[] triangles,
+        Appearance[] appearances)
+    {
+        super(createHandle(base, targets, triangles, appearances));
+        this.targets = new VertexBuffer[targets.length];
+        System.arraycopy(targets, 0, this.targets, 0, targets.length);
+    }
+
+    /**
+     */
+    MorphingMesh(int handle)
+    {
+        super(handle);
+        targets = new VertexBuffer[_getMorphTargetCount(handle)];
+        for (int i = 0; i < targets.length; i++)
+        {
+            targets[i] = (VertexBuffer)getInstance(_getMorphTarget(handle, i));
+        }
+    }
+
+    public VertexBuffer getMorphTarget(int index)
+    {
+        return targets[index];
+    }
+
+    public int getMorphTargetCount()
+    {
+        return _getMorphTargetCount(handle);
+    }
+
+    public void setWeights(float[] weights)
+    {
+        _setWeights(handle, weights);
+    }
+
+    public void getWeights(float[] weights)
+    {
+        _getWeights(handle, weights);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    static int createHandle(VertexBuffer base,
+                            VertexBuffer[] targets,
+                            IndexBuffer triangles,
+                            Appearance appearance)
+    {
+
+        tempTriangles  = triangles;
+        tempAppearance = appearance;
+
+        verifyParams(base, triangles);
+
+        int[] hTargets = new int[targets.length];
+        int[] hTriangles = null;
+        int[] hAppearances = null;
+
+        for (int i = 0; i < targets.length; i++)
+        {
+            hTargets[i] = targets[i].handle;
+        }
+
+        hTriangles = new int[1];
+        hTriangles[0] = triangles.handle;
+
+        if (appearance != null)
+        {
+            hAppearances = new int[1];
+            hAppearances[0] = appearance.handle;
+        }
+
+        int ret =  _ctor(Interface.getHandle(),
+                         base.handle,
+                         hTargets,
+                         hTriangles,
+                         hAppearances);
+
+        tempTriangles  = null;
+        tempAppearance = null;
+
+        return ret;
+    }
+
+    static int createHandle(VertexBuffer base,
+                            VertexBuffer[] targets,
+                            IndexBuffer[] triangles,
+                            Appearance[] appearances)
+    {
+
+        tempTrianglesArray = triangles;
+        tempAppearanceArray = appearances;
+
+
+        verifyParams(base, triangles, appearances);
+
+        int[] hTargets = new int[targets.length];
+        int[] hTriangles = null;
+        int[] hAppearances = null;
+
+        for (int i = 0; i < targets.length; i++)
+        {
+            hTargets[i] = targets[i].handle;
+        }
+
+        hTriangles = new int[triangles.length];
+
+        if (appearances != null)
+        {
+            hAppearances = new int[appearances.length];
+        }
+
+        for (int i = 0; i < triangles.length; i++)
+        {
+            hTriangles[i] = triangles[i].handle;
+
+            if (hAppearances != null)
+            {
+                hAppearances[i] = appearances[i] != null ? appearances[i].handle : 0;
+            }
+        }
+
+        int ret =  _ctor(Interface.getHandle(),
+                         base.handle,
+                         hTargets,
+                         hTriangles,
+                         hAppearances);
+
+        tempTrianglesArray = null;
+        tempAppearanceArray = null;
+
+        return ret;
+
+    }
+
+    // Native methods
+    private static native int _ctor(int hInstance,
+                                    int handle,
+                                    int[] hTargets,
+                                    int[] hTriangles,
+                                    int[] hAppearances);
+    private static native void _setWeights(int handle, float[] weights);
+    private static native void _getWeights(int handle, float[] weights);
+    private static native int _getMorphTarget(int handle, int index);
+    private static native int _getMorphTargetCount(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Node.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public abstract class Node extends Transformable
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int NONE = 144;
+    public static final int ORIGIN = 145;
+    public static final int X_AXIS = 146;
+    public static final int Y_AXIS = 147;
+    public static final int Z_AXIS = 148;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    // The node references are kept on the Java side to avoid having
+    // to replicate garbage collection in the native implementation.
+    // Instead, we let Java manage Node reachability detection and
+    // deletion.
+
+    private Node parent;
+    private Node zRef, yRef;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    /**
+     * There is only a package private constructor. Applications can not extend
+     * this class directly.</p>
+     */
+    Node(int handle)
+    {
+        super(handle);
+        parent = (Node) getInstance(_getParent(handle));
+        zRef = (Node) getInstance(_getZRef(handle));
+        yRef = (Node) getInstance(_getYRef(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public Node getParent()
+    {
+        return parent;
+    }
+
+    public boolean getTransformTo(Node target, Transform transform)
+    {
+        return _getTransformTo(handle,
+                               target.handle,
+                               transform != null ? transform.matrix : null);
+    }
+
+    public void setAlignment(Node zReference, int zTarget,
+                             Node yReference, int yTarget)
+    {
+        _setAlignment(handle,
+                      zReference != null ? zReference.handle : 0, zTarget,
+                      yReference != null ? yReference.handle : 0, yTarget);
+        zRef = zReference;
+        yRef = yReference;
+    }
+
+    public void setAlphaFactor(float alphaFactor)
+    {
+        _setAlphaFactor(handle, alphaFactor);
+    }
+
+    public float getAlphaFactor()
+    {
+        return _getAlphaFactor(handle);
+    }
+
+    public void setRenderingEnable(boolean enable)
+    {
+        _enable(handle, Defs.SETGET_RENDERING, enable);
+    }
+
+    public boolean isRenderingEnabled()
+    {
+        return _isEnabled(handle, Defs.SETGET_RENDERING);
+    }
+
+    public void setPickingEnable(boolean enable)
+    {
+        _enable(handle, Defs.SETGET_PICKING, enable);
+    }
+
+    public boolean isPickingEnabled()
+    {
+        return _isEnabled(handle, Defs.SETGET_PICKING);
+    }
+
+    public void setScope(int id)
+    {
+        _setScope(handle, id);
+    }
+
+    public int getScope()
+    {
+        return _getScope(handle);
+    }
+
+    public final void align(Node reference)
+    {
+        _align(handle, reference != null ? reference.handle : 0);
+    }
+
+    // M3G 1.1 Maintenance release getters
+
+    public Node getAlignmentReference(int axis)
+    {
+        switch (axis)
+        {
+        case Y_AXIS:
+            return yRef;
+        case Z_AXIS:
+            return zRef;
+        default:
+            throw new IllegalArgumentException();
+        }
+    }
+
+    public int getAlignmentTarget(int axis)
+    {
+        return _getAlignmentTarget(handle, axis);
+    }
+
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    void setParent(Node parent)
+    {
+        this.parent = parent;
+    }
+
+    // Native methods
+    private static native boolean _getTransformTo(int handle,
+            int hTarget,
+            byte[] transform);
+
+    private static native void _align(int handle, int refHandle);
+    private static native void _setAlignment(int handle,
+            int hZReference, int zTarget,
+            int hYReference, int yTarget);
+
+    private static native void _setAlphaFactor(int handle, float alphaFactor);
+    private static native float _getAlphaFactor(int handle);
+
+    private static native void _enable(int handle, int which, boolean enable);
+    private static native boolean _isEnabled(int handle, int which);
+
+    private static native void _setScope(int handle, int id);
+    private static native int _getScope(int handle);
+
+    private static native int _getParent(int handle);
+    private static native int _getZRef(int handle);
+    private static native int _getYRef(int handle);
+    static native int _getSubtreeSize(int handle);
+
+    // M3G 1.1 Maintenance release getters
+    private static native int _getAlignmentTarget(int handle, int axis);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Object3D.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import java.util.Enumeration;
+import java.util.Vector;
+import com.nokia.mj.impl.rt.support.Finalizer;
+
+/**
+*/
+public abstract class Object3D
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    int handle;
+
+    private Object userObject;
+    private Vector animTracks;
+    private Interface iInterface;
+
+    private Finalizer mFinalizer = new Finalizer()
+    {
+        public void finalizeImpl()
+        {
+            doFinalize();
+        }
+    };
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    /**
+     * <p>Only a package private constructor exists for this class.</p>
+     */
+    Object3D(int handle)
+    {
+        if (handle != 0)
+        {
+            this.handle = handle;
+            _addRef(handle);
+
+            // Get associated Interafece object and
+            // register this instance with that
+            iInterface = Interface.getInstance();
+            iInterface.register(this);
+
+            int n = _getAnimationTrackCount(handle);
+            while (n-- > 0)
+            {
+                linkAnimTrack((AnimationTrack) getInstance(_getAnimationTrack(handle, n)));
+            }
+        }
+        else
+        {
+            System.out.println("Warning: Object3D constructor called with zero handle");
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Public API
+    //------------------------------------------------------------------
+
+    public final Object3D duplicate()
+    {
+        int numRef = 1;
+        if (this instanceof Node)
+        {
+            numRef = ((Node)this)._getSubtreeSize(handle);
+        }
+        int[] handles = new int[numRef * 2];
+        Object3D obj = getInstance(_duplicate(handle, handles));
+        for (int i = 0; i < numRef; i++)
+        {
+            Object userObj = getInstance(handles[i * 2]).getUserObject();
+            Object3D duplicateObj = getInstance(handles[i * 2 + 1]);
+            if (userObj != null)
+            {
+                duplicateObj.setUserObject(userObj);
+            }
+        }
+        return obj;
+    }
+
+    public int getReferences(Object3D[] references)
+    {
+        int[] handles = null;
+        if (references != null)
+        {
+            handles = new int[references.length];
+        }
+        int num = _getReferences(handle, handles);
+        if (references != null)
+        {
+            for (int i = 0; i < num; i++)
+            {
+                references[i] = getInstance(handles[i]);
+            }
+        }
+        return num;
+    }
+
+    public void setUserID(int userID)
+    {
+        _setUserID(handle, userID);
+    }
+
+    public int getUserID()
+    {
+        return _getUserID(handle);
+    }
+
+    public Object3D find(int userID)
+    {
+        return getInstance(_find(handle, userID));
+    }
+
+    public void addAnimationTrack(AnimationTrack animationTrack)
+    {
+        _addAnimationTrack(handle, animationTrack.handle);
+        linkAnimTrack(animationTrack);
+    }
+
+    public AnimationTrack getAnimationTrack(int index)
+    {
+        /* Don't try to match the native indexing here -- just call
+         * the native getter */
+        return (AnimationTrack)getInstance(_getAnimationTrack(handle, index));
+    }
+
+    public void removeAnimationTrack(AnimationTrack animationTrack)
+    {
+        if (animationTrack != null)
+        {
+            _removeAnimationTrack(handle, animationTrack.handle);
+
+            if (animTracks != null)
+            {
+                animTracks.removeElement(animationTrack);
+                if (animTracks.isEmpty())
+                {
+                    animTracks = null;
+                }
+            }
+        }
+    }
+
+    public int getAnimationTrackCount()
+    {
+        return _getAnimationTrackCount(handle);
+    }
+
+    public final int animate(int time)
+    {
+        return _animate(handle, time);
+    }
+
+    public void setUserObject(Object obj)
+    {
+        userObject = obj;
+    }
+
+    public Object getUserObject()
+    {
+        return userObject;
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    static final Object3D getInstance(int handle)
+    {
+        return Interface.getObjectInstance(handle);
+    }
+
+    /**
+     * Adds a reference to an animation track.
+     */
+    private void linkAnimTrack(AnimationTrack track)
+    {
+        if (animTracks == null)
+        {
+            animTracks = new Vector();
+        }
+        animTracks.addElement(track);
+    }
+
+    /**
+     * Native peer finalization
+     */
+    private void doFinalize()
+    {
+        if (mFinalizer != null)
+        {
+            if (handle != 0)
+            {
+                // finalize native peer
+                Platform.finalizeObject(handle, iInterface);
+                iInterface.deregister(this, iInterface);
+
+                // reset handles
+                iInterface = null;
+                handle= 0;
+            }
+            mFinalizer = null;
+        }
+    }
+
+    // Native methods
+    private static native int _addAnimationTrack(int hObject, int hAnimationTrack);
+    private static native void _removeAnimationTrack(int hObject, int hAnimationTrack);
+    private static native int _getAnimationTrackCount(int hObject);
+    private static native int _animate(int hObject, int time);
+    private static native void _setUserID(int hObject, int userID);
+    private static native int _getUserID(int hObject);
+
+    private static native void _addRef(int hObject);
+    private static native int _getAnimationTrack(int hObject, int index);
+    private static native int _duplicate(int hObject, int[] handles);
+    private static native int _getReferences(int hObject, int[] handles);
+    private static native int _find(int hObject, int userID);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Platform.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+/**
+ * \file
+ * \brief Target platform dependent Java module for Symbian.
+ *
+ */
+
+package javax.microedition.m3g;
+import javax.microedition.lcdui.Graphics;
+import javax.microedition.lcdui.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.mj.impl.nokialcdui.LCDUIInvoker;
+import org.eclipse.swt.internal.extension.DisplayExtension;
+
+/**
+ * Implements platform-dependent functionality. At the moment, this
+ * includes native finalization and some helper methods for
+ * synchronizing 2D and 3D rendering.
+ */
+class Platform
+{
+    /**
+     * eSWT display for ui thread access
+     */
+    private static Display display = null;
+    private static boolean libraryLoaded = false;
+
+    //------------------------------------------------------------------
+    // Package private methods
+    //------------------------------------------------------------------
+
+    /**
+     * Executes given runnable in UI thread if caller thread is not UI thread
+     */
+    static void executeInUIThread(M3gRunnable obj)
+    {
+        if (display == null)
+        {
+            if (!uiThreadAvailable())
+            {
+                throw new Error("Ui thread not available");
+            }
+        }
+        if (display.isDisposed())
+        {
+            throw new Error("Display already disposed");
+        }
+
+        if (obj != null)
+        {
+            // If we are not in UI thread use display
+            if (Thread.currentThread() != display.getThread())
+            {
+                display.syncExec(obj);
+            }
+            else
+            {
+                // In this case we are in UI thread so just execute directly
+                obj.run();
+            }
+            // Check if any exceptions occured in execution
+            // and throw forward in caller thread
+            obj.checkAndThrow();
+        }
+    }
+
+    /**
+     * Check the UI thread / toolkit init status and store display if it is available
+     * @return true if either lcdui or eswt toolkit is initialized and ui thread is accessible
+     *              otherwise false
+     */
+    static boolean uiThreadAvailable()
+    {
+        if (display != null)
+        {
+            return true;
+        }
+        else
+        {
+            display = DisplayExtension.getDisplayInstance();
+            if (display == null)
+            {
+                return false;
+            }
+            else
+            {
+                // UI thread is available, so load native library if not already loaded
+                if (!libraryLoaded)
+                {
+                    com.nokia.mj.impl.rt.support.Jvm.loadSystemLibrary("javam3g");
+                    libraryLoaded = true;
+                }
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Registers an Object3D in the global handle-to-object map. The
+     * handle of the object must already be set at this point!
+     */
+    static final void registerFinalizer(Object3D obj)
+    {
+        //heuristicGC();
+    }
+
+    /**
+     * Registers a Graphics3D object (not derived from Object3D) for
+     * finalization.
+     */
+    static final void registerFinalizer(Graphics3D g3d)
+    {
+        //heuristicGC();
+    }
+
+    /**
+     * Registers an Interface object for finalization
+     */
+    static final void registerFinalizer(Interface m3g)
+    {
+    }
+
+    /**
+     * Registers a Loader object for finalization
+     */
+    static final void registerFinalizer(Loader loader)
+    {
+    }
+
+    /**
+     * Flushes all pending rendering to a Graphics context and blocks
+     * until finished
+     */
+    static final void sync(Graphics g)
+    {
+        //ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+        //invoker.toolkitSync(invoker.getToolkit());
+    }
+
+    /**
+     * Flushes all pending rendering to an Image object
+     */
+    static final void sync(Image img)
+    {
+        //ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+        //invoker.toolkitSync(invoker.getToolkit());
+    }
+
+    /**
+     * Finalizes the native peer of an interface
+     */
+    static final native void finalizeInterface(int handle);
+
+    /**
+     * Finalizes the native peer of an object
+     * JCF: added this wrapper method so we could pass the toolkit handle to the native method.
+     */
+    static final void finalizeObject(int handle)
+    {
+        try
+        {
+            final int finalHandle = handle;
+            executeInUIThread(
+                new M3gRunnable()
+            {
+                void doRun()
+                {
+                    _finalizeObject(finalHandle);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            // do nothing
+        }
+    }
+
+    /**
+     * Finalizes the native peer of an object associated with
+     * given Interface instance
+     */
+    static final void finalizeObject(int handle, Interface aInterface)
+    {
+        try
+        {
+            final int finalHandle = handle;
+            executeInUIThread(
+                new M3gRunnable()
+            {
+                public void doRun()
+                {
+                    _finalizeObject(finalHandle);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            // do nothing
+        }
+    }
+
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    /**
+     * Trigger GC if minimum free memory limit has been exceeded in the native side
+     */
+    static final void heuristicGC()
+    {
+    }
+    private static final native void _finalizeObject(int handle);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/PolygonMode.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,139 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class PolygonMode extends Object3D
+{
+
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int CULL_BACK = 0xA0;
+    public static final int CULL_FRONT = CULL_BACK + 1;
+    public static final int CULL_NONE = CULL_FRONT + 1;
+    public static final int SHADE_FLAT = 0xA4;
+    public static final int SHADE_SMOOTH = SHADE_FLAT + 1;
+    public static final int WINDING_CCW = 0xA8;
+    public static final int WINDING_CW = WINDING_CCW + 1;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public PolygonMode()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    PolygonMode(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setCulling(int mode)
+    {
+        _setCulling(handle, mode);
+    }
+
+    public int getCulling()
+    {
+        return _getCulling(handle);
+    }
+
+    public void setWinding(int mode)
+    {
+        _setWinding(handle, mode);
+    }
+
+    public int getWinding()
+    {
+        return _getWinding(handle);
+    }
+
+    public void setShading(int mode)
+    {
+        _setShading(handle, mode);
+    }
+
+    public int getShading()
+    {
+        return _getShading(handle);
+    }
+
+    public void setTwoSidedLightingEnable(boolean enable)
+    {
+        _setTwoSidedLightingEnable(handle, enable);
+    }
+
+    public boolean isTwoSidedLightingEnabled()
+    {
+        return _isTwoSidedLightingEnabled(handle);
+    }
+
+    public void setLocalCameraLightingEnable(boolean enable)
+    {
+        _setLocalCameraLightingEnable(handle, enable);
+    }
+
+    public void setPerspectiveCorrectionEnable(boolean enable)
+    {
+        _setPerspectiveCorrectionEnable(handle, enable);
+    }
+
+    // M3G 1.1 Maintenance release getters
+    public boolean isLocalCameraLightingEnabled()
+    {
+        return _isLocalCameraLightingEnabled(handle);
+    }
+
+    public boolean isPerspectiveCorrectionEnabled()
+    {
+        return _isPerspectiveCorrectionEnabled(handle);
+    }
+
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private native static int _ctor(int hInterface);
+    private native static void _setLocalCameraLightingEnable(int handle, boolean enable);
+    private native static void _setPerspectiveCorrectionEnable(int handle, boolean enable);
+    private native static void _setCulling(int handle, int mode);
+    private native static int _getCulling(int handle);
+    private native static void _setWinding(int handle, int mode);
+    private native static int _getWinding(int handle);
+    private native static void _setShading(int handle, int mode);
+    private native static int _getShading(int handle);
+    private native static void _setTwoSidedLightingEnable(int handle, boolean enable);
+    private native static boolean _isTwoSidedLightingEnabled(int handle);
+
+    // M3G 1.1 Maintenance release getters
+    private native static boolean _isLocalCameraLightingEnabled(int handle);
+    private native static boolean _isPerspectiveCorrectionEnabled(int handle);
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/RayIntersection.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,138 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class RayIntersection
+{
+    private Node intersected = null;
+    private float distance = 0.f;
+    private int submeshIndex = 0;
+    private float[] textureS = new float[Defs.NUM_TEXTURE_UNITS];
+    private float[] textureT = new float[Defs.NUM_TEXTURE_UNITS];
+    private float[] normal = new float[3];
+    private float[] ray = new float[6];
+
+    public RayIntersection()
+    {
+        normal[0] = 0.f;
+        normal[1] = 0.f;
+        normal[2] = 1.f;
+
+        ray[0] = 0.f;
+        ray[1] = 0.f;
+        ray[2] = 0.f;
+        ray[3] = 0.f;
+        ray[4] = 0.f;
+        ray[5] = 1.f;
+    }
+
+    public Node getIntersected()
+    {
+        return intersected;
+    }
+
+    public float getDistance()
+    {
+        return distance;
+    }
+
+    public int getSubmeshIndex()
+    {
+        return submeshIndex;
+    }
+
+    public float getTextureS(int index)
+    {
+        if (index < 0 || index >= textureS.length)
+        {
+            throw new IndexOutOfBoundsException();
+        }
+
+        return textureS[index];
+    }
+
+    public float getTextureT(int index)
+    {
+        if (index < 0 || index >= textureT.length)
+        {
+            throw new IndexOutOfBoundsException();
+        }
+
+        return textureT[index];
+    }
+
+    public float getNormalX()
+    {
+        return normal[0];
+    }
+
+    public float getNormalY()
+    {
+        return normal[1];
+    }
+
+    public float getNormalZ()
+    {
+        return normal[2];
+    }
+
+    public void getRay(float[] ray)
+    {
+        if (ray.length < 6)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        ray[0] = this.ray[0];
+        ray[1] = this.ray[1];
+        ray[2] = this.ray[2];
+        ray[3] = this.ray[3];
+        ray[4] = this.ray[4];
+        ray[5] = this.ray[5];
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    static float[] createResult()
+    {
+        return new float[1 + 1 + 2 * Defs.NUM_TEXTURE_UNITS + 3 + 6];
+    }
+
+    void fill(int hIntersected, float[] result)
+    {
+        intersected = (Node)Object3D.getInstance(hIntersected);
+        distance = result[0];
+        submeshIndex = (int)result[1];
+        textureS[0] = result[2];
+        textureS[1] = result[3];
+        textureT[0] = result[4];
+        textureT[1] = result[5];
+        normal[0] = result[6];
+        normal[1] = result[7];
+        normal[2] = result[8];
+        ray[0] = result[9];
+        ray[1] = result[10];
+        ray[2] = result[11];
+        ray[3] = result[12];
+        ray[4] = result[13];
+        ray[5] = result[14];
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/SkinnedMesh.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class SkinnedMesh extends Mesh
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private Group skeleton;
+
+    static private IndexBuffer[] tempTrianglesArray;
+    static private Appearance[]  tempAppearanceArray;
+
+    static private IndexBuffer tempTriangles;
+    static private Appearance  tempAppearance;
+
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public SkinnedMesh(VertexBuffer vertices,
+                       IndexBuffer[] triangles,
+                       Appearance[] appearances,
+                       Group skeleton)
+    {
+        super(createHandle(vertices, triangles, appearances, skeleton));
+        skeleton.setParent(this);
+        this.skeleton = skeleton;
+    }
+
+    public SkinnedMesh(VertexBuffer vertices,
+                       IndexBuffer triangles,
+                       Appearance appearance,
+                       Group skeleton)
+    {
+        super(createHandle(vertices, triangles, appearance, skeleton));
+        skeleton.setParent(this);
+        this.skeleton = skeleton;
+    }
+
+    /**
+     */
+    SkinnedMesh(int handle)
+    {
+        super(handle);
+        skeleton = (Group) getInstance(_getSkeleton(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void addTransform(Node bone,
+                             int weight,
+                             int firstVertex,
+                             int numVertices)
+    {
+        _addTransform(handle,
+                      bone != null ? bone.handle : 0,
+                      weight,
+                      firstVertex,
+                      numVertices);
+    }
+
+    public Group getSkeleton()
+    {
+        return skeleton;
+    }
+
+    // M3G 1.1 Maintenance release getters
+
+    public void getBoneTransform(Node bone, Transform transform)
+    {
+        _getBoneTransform(handle, bone.handle, transform.matrix);
+    }
+
+    public int getBoneVertices(Node bone, int[] indices, float[] weights)
+    {
+        return _getBoneVertices(handle, bone.handle, indices, weights);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    static int createHandle(VertexBuffer vertices,
+                            IndexBuffer[] triangles,
+                            Appearance[] appearances,
+                            Group skeleton)
+    {
+
+        tempTrianglesArray = triangles;
+        tempAppearanceArray = appearances;
+
+        verifyParams(vertices, triangles, appearances);
+
+        if (skeleton == null)
+        {
+            throw new NullPointerException();
+        }
+
+        if (skeleton.getParent() != null || skeleton instanceof World)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        int[] hTri = new int[triangles.length];
+        int[] hApp = new int[triangles.length];
+        for (int i = 0; i < triangles.length; i++)
+        {
+            hTri[i] = triangles[i].handle;
+            if (appearances != null && i < appearances.length)
+            {
+                hApp[i] = appearances[i] != null ? appearances[i].handle : 0;
+            }
+        }
+        int ret=  _ctor(Interface.getHandle(),
+                        vertices.handle,
+                        hTri,
+                        hApp,
+                        skeleton.handle);
+
+        tempTrianglesArray = triangles;
+        tempAppearanceArray = appearances;
+
+        return ret;
+    }
+
+    static int createHandle(VertexBuffer vertices,
+                            IndexBuffer triangles,
+                            Appearance appearance,
+                            Group skeleton)
+    {
+
+        tempTriangles  = triangles;
+        tempAppearance = appearance;
+
+        verifyParams(vertices, triangles);
+
+        if (skeleton == null)
+        {
+            throw new NullPointerException();
+        }
+        if (skeleton.getParent() != null || skeleton instanceof World)
+        {
+            throw new IllegalArgumentException();
+        }
+        int[] hTri = {triangles.handle};
+        int[] hApp = {appearance != null ? appearance.handle : 0};
+        int ret = _ctor(Interface.getHandle(),
+                        vertices.handle,
+                        hTri,
+                        hApp,
+                        skeleton.handle);
+
+        tempTriangles  = null;
+        tempAppearance = null;
+
+        return ret;
+    }
+
+    // Native methods
+    private native static int _ctor(int hInstance,
+                                    int hVertices,
+                                    int[] hTriangles,
+                                    int[] hAppearances,
+                                    int hSkeleton);
+    private native static void _addTransform(int handle,
+            int hBone,
+            int weight,
+            int firstVertex,
+            int numVertices);
+    private native static int _getSkeleton(int handle);
+
+    // M3G 1.1 Maintenance release getters
+    private native static void _getBoneTransform(int handle,
+            int hBone,
+            byte[] transform);
+    private native static int _getBoneVertices(int handle,
+            int hBone,
+            int[] indices,
+            float[] weights);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Sprite3D.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Sprite3D extends Node
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private Image2D    image;
+    private Appearance appearance;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public Sprite3D(boolean scaled, Image2D image, Appearance appearance)
+    {
+        super(_ctor(Interface.getHandle(),
+                    scaled,
+                    image != null ? image.handle : 0,
+                    appearance != null ? appearance.handle : 0));
+        this.image = image;
+        this.appearance = appearance;
+    }
+
+    /**
+     */
+    Sprite3D(int handle)
+    {
+        super(handle);
+        image = (Image2D)getInstance(_getImage(handle));
+        appearance = (Appearance)getInstance(_getAppearance(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public boolean isScaled()
+    {
+        return _isScaled(handle);
+    }
+
+    public void setAppearance(Appearance appearance)
+    {
+        _setAppearance(handle, appearance != null ? appearance.handle : 0);
+        this.appearance = appearance;
+    }
+
+    public Appearance getAppearance()
+    {
+        return appearance;
+    }
+
+    public void setImage(Image2D image)
+    {
+        _setImage(handle, image != null ? image.handle : 0);
+        this.image = image;
+    }
+
+    public Image2D getImage()
+    {
+        return image;
+    }
+
+    public void setCrop(int cropX, int cropY, int width, int height)
+    {
+        _setCrop(handle, cropX, cropY, width, height);
+    }
+
+    public int getCropX()
+    {
+        return _getCrop(handle, Defs.GET_CROPX);
+    }
+
+    public int getCropY()
+    {
+        return _getCrop(handle, Defs.GET_CROPY);
+    }
+
+    public int getCropWidth()
+    {
+        return _getCrop(handle, Defs.GET_CROPWIDTH);
+    }
+
+    public int getCropHeight()
+    {
+        return _getCrop(handle, Defs.GET_CROPHEIGHT);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native methods
+
+    private static native int _ctor(int hInterface,
+                                    boolean scaled,
+                                    int hImage,
+                                    int hAppearance);
+    private static native boolean _isScaled(int handle);
+    private static native void _setAppearance(int handle, int hAppearance);
+    private static native void _setImage(int handle, int hImage);
+    private static native void _setCrop(int handle,
+                                        int cropX, int cropY,
+                                        int width, int height);
+    private static native int _getCrop(int handle, int which);
+    private static native int _getAppearance(int handle);
+    private static native int _getImage(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Texture2D.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,151 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import javax.microedition.lcdui.Image;
+
+import java.io.*;
+
+public class Texture2D extends Transformable
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    public static final int FILTER_BASE_LEVEL = 208;
+    public static final int FILTER_LINEAR     = 209;
+    public static final int FILTER_NEAREST    = 210;
+    public static final int FUNC_ADD      = 224;
+    public static final int FUNC_BLEND    = 225;
+    public static final int FUNC_DECAL    = 226;
+    public static final int FUNC_MODULATE = 227;
+    public static final int FUNC_REPLACE  = 228;
+    public static final int WRAP_CLAMP  = 240;
+    public static final int WRAP_REPEAT = 241;
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private Image2D image;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public Texture2D(final Image2D image)
+    {
+        super(_ctor(Interface.getHandle(), image != null ? image.handle : 0));
+        this.image = image;
+    }
+
+    /**
+     */
+    Texture2D(int handle)
+    {
+        super(handle);
+        image = (Image2D) getInstance(_getImage(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setImage(final Image2D image)
+    {
+        _setImage(handle, image != null ? image.handle : 0);
+        this.image = image;
+    }
+
+    public Image2D getImage()
+    {
+        return image;
+    }
+
+    public void setFiltering(int levelFilter, int imageFilter)
+    {
+        _setFiltering(handle, levelFilter, imageFilter);
+    }
+
+    public void setWrapping(int wrapS, int wrapT)
+    {
+        _setWrapping(handle, wrapS, wrapT);
+    }
+
+    public int getWrappingS()
+    {
+        return _getWrappingS(handle);
+    }
+
+    public int getWrappingT()
+    {
+        return _getWrappingT(handle);
+    }
+
+    public void setBlending(int func)
+    {
+        _setBlending(handle, func);
+    }
+
+    public int getBlending()
+    {
+        return _getBlending(handle);
+    }
+
+    public void setBlendColor(int RGB)
+    {
+        _setBlendColor(handle, RGB);
+    }
+
+    public int getBlendColor()
+    {
+        return _getBlendColor(handle);
+    }
+
+    // M3G 1.1 Maintenance release getters
+
+    public int getImageFilter()
+    {
+        return _getImageFilter(handle);
+    }
+
+    public int getLevelFilter()
+    {
+        return _getLevelFilter(handle);
+    }
+
+    // Native methods
+    private native static int _ctor(int hInterface, int imageHandle);
+
+    private native static void _setImage(int handle, int imageHandle);
+    private native static int  _getImage(int handle);
+
+    private native static void _setFiltering(int handle, int levelFilter, int imageFilter);
+    private native static void _setWrapping(int handle, int wrapS, int wrapT);
+    private native static int _getWrappingS(int handle);
+    private native static int _getWrappingT(int handle);
+    private native static void _setBlending(int handle, int func);
+    private native static int _getBlending(int handle);
+    private native static void _setBlendColor(int handle, int RGB);
+    private native static int _getBlendColor(int handle);
+
+    // M3G 1.1 Maintenance release getters
+    private native static int _getImageFilter(int handle);
+    private native static int _getLevelFilter(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Transform.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class Transform
+{
+    //------------------------------------------------------------------
+    // Static data
+    //------------------------------------------------------------------
+
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    // Check size from m3g_math.h Matrix
+    byte[] matrix = new byte[72];
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public Transform()
+    {
+        if (!Platform.uiThreadAvailable())
+        {
+            throw new Error("UI thread not initialized");
+        }
+        setIdentity();
+    }
+
+    /**
+     */
+    public Transform(Transform other)
+    {
+        if (!Platform.uiThreadAvailable())
+        {
+            throw new Error("UI thread not initialized");
+        }
+        set(other);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setIdentity()
+    {
+        _setIdentity(matrix);
+    }
+
+    public void set(Transform transform)
+    {
+        System.arraycopy(transform.matrix, 0,
+                         this.matrix, 0,
+                         this.matrix.length);
+    }
+
+    public void set(float[] matrix)
+    {
+        _setMatrix(this.matrix, matrix);
+    }
+
+    public void get(float[] matrix)
+    {
+        _getMatrix(this.matrix, matrix);
+    }
+
+    public void invert()
+    {
+        _invert(matrix);
+    }
+
+    public void transpose()
+    {
+        _transpose(matrix);
+    }
+
+    public void postMultiply(Transform transform)
+    {
+        _mul(this.matrix, this.matrix, transform.matrix);
+    }
+
+    public void postScale(float sx, float sy, float sz)
+    {
+        _scale(matrix, sx, sy , sz);
+    }
+
+    /**
+     */
+    public void postRotate(float angle, float ax, float ay, float az)
+    {
+        _rotate(matrix, angle, ax, ay, az);
+    }
+
+    /**
+     */
+    public void postRotateQuat(float qx, float qy, float qz, float qw)
+    {
+        _rotateQuat(matrix, qx, qy, qz, qw);
+    }
+
+    /**
+     */
+    public void postTranslate(float tx, float ty, float tz)
+    {
+        _translate(matrix, tx, ty, tz);
+    }
+
+    /**
+     */
+    public void transform(float[] v)
+    {
+        if ((v.length % 4) != 0)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        if (v.length != 0)
+        {
+            _transformTable(matrix, v);
+        }
+    }
+
+    /**
+     */
+    public void transform(VertexArray in, float[] out, boolean W)
+    {
+        if (in == null || out == null)
+        {
+            throw new NullPointerException();
+        }
+
+        _transformArray(matrix, in.handle, out, W);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native methods
+    private static native void _mul(byte[] prod, byte[] left, byte[] right);
+    private static native void _setIdentity(byte[] matrix);
+    private static native void _setMatrix(byte[] matrix, float[] srcMatrix);
+    private static native void _getMatrix(byte[] matrix, float[] dstMatrix);
+    private static native void _invert(byte[] matrix);
+    private static native void _transpose(byte[] matrix);
+    private static native void _rotate(byte[] matrix, float angle, float ax, float ay, float az);
+    private static native void _rotateQuat(byte[] matrix, float qx, float qy, float qz, float qw);
+    private static native void _scale(byte[] matrix, float sx, float sy, float sz);
+    private static native void _translate(byte[] matrix, float tx, float ty, float tz);
+    private static native void _transformTable(byte[] matrix, float[] v);
+    private static native void _transformArray(byte[] matrix, int handle, float[] out, boolean W);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Transformable.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,132 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+/**
+ *
+ */
+public abstract class Transformable extends Object3D
+{
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    Transformable(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+
+    public void setOrientation(float angle, float ax, float ay, float az)
+    {
+        _setOrientation(handle, angle, ax, ay, az, true);
+    }
+
+    public void postRotate(float angle, float ax, float ay, float az)
+    {
+        _setOrientation(handle, angle, ax, ay, az, false);
+    }
+
+    public void preRotate(float angle, float ax, float ay, float az)
+    {
+        _preRotate(handle, angle, ax, ay, az);
+    }
+
+    public void getOrientation(float[] angleAxis)
+    {
+        _getOrientation(handle, angleAxis);
+    }
+
+    public void setScale(float sx, float sy, float sz)
+    {
+        _setScale(handle, sx, sy, sz, true);
+    }
+
+    public void scale(float sx, float sy, float sz)
+    {
+        _setScale(handle, sx, sy, sz, false);
+    }
+
+    public void getScale(float[] xyz)
+    {
+        _getScale(handle, xyz);
+    }
+
+    public void setTranslation(float tx, float ty, float tz)
+    {
+        _setTranslation(handle, tx, ty, tz, true);
+    }
+
+    public void translate(float tx, float ty, float tz)
+    {
+        _setTranslation(handle, tx, ty, tz, false);
+    }
+
+    public void getTranslation(float[] xyz)
+    {
+        _getTranslation(handle, xyz);
+    }
+
+    public void setTransform(Transform transform)
+    {
+        _setTransform(handle, (transform != null) ? transform.matrix : null);
+    }
+
+    public void getTransform(Transform transform)
+    {
+        _getTransform(handle, transform.matrix);
+    }
+
+    public void getCompositeTransform(Transform transform)
+    {
+        _getComposite(handle, transform.matrix);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private static native void _setOrientation(int handle,
+            float angle,
+            float ax, float ay, float az,
+            boolean absolute);
+    private static native void _preRotate(int handle,
+                                          float angle,
+                                          float ax, float ay, float az);
+    private static native void _getOrientation(int handle, float[] angleAxis);
+
+    private static native void _setScale(int handle,
+                                         float sx, float sy, float sz,
+                                         boolean absolute);
+    private static native void _getScale(int handle, float[] scale);
+
+    private static native void _setTranslation(int handle,
+            float tx, float ty, float tz,
+            boolean absolute);
+    private static native void _getTranslation(int handle, float[] translation);
+
+    private static native void _setTransform(int handle, byte[] transform);
+    private static native void _getTransform(int handle, byte[] transform);
+
+    private static native void _getComposite(int handle, byte[] transform);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/TriangleStripArray.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class TriangleStripArray extends IndexBuffer
+{
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public TriangleStripArray(int firstIndex, final int[] stripLengths)
+    {
+        super(_createImplicit(Interface.getHandle(),
+                              firstIndex,
+                              stripLengths));
+    }
+
+    public TriangleStripArray(final int[] indices, final int[] stripLengths)
+    {
+        super(_createExplicit(Interface.getHandle(), indices, stripLengths));
+    }
+
+    TriangleStripArray(int handle)
+    {
+        super(handle);
+    }
+
+    // M3G 1.1 Maintenance release getters
+
+    public int getIndexCount()
+    {
+        return _getIndexCount(handle);
+    }
+
+    public void getIndices(int[] indices)
+    {
+        if (indices.length < _getIndexCount(handle))
+        {
+            throw new IllegalArgumentException();
+        }
+        _getIndices(handle, indices);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native methods
+    private native static int _createImplicit(int hInterface,
+            int first,
+            final int[] lengths);
+    private native static int _createExplicit(int hInterface,
+            final int[] indices,
+            final int[] lengths);
+
+    // M3G 1.1 Maintenance release getters
+    private native static int _getIndexCount(int handle);
+    private native static void _getIndices(int handle, int[] indices);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/VertexArray.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class VertexArray extends Object3D
+{
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public VertexArray(int numVertices, int numComponents, int componentSize)
+    {
+        super(createHandle(numVertices,
+                           numComponents,
+                           componentSize));
+    }
+
+    /**
+     */
+    VertexArray(int handle)
+    {
+        super(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void set(int startIndex, int length, short[] values)
+    {
+        _setShort(handle, startIndex, length, values);
+    }
+
+    public void set(int startIndex, int length, byte[] values)
+    {
+        _setByte(handle, startIndex, length, values);
+    }
+
+    // M3G 1.1 Maintenance release getters
+    public void get(int firstVertex, int numVertices, byte[] values)
+    {
+        _getByte(handle, firstVertex, numVertices, values);
+    }
+
+    public void get(int firstVertex, int numVertices, short[] values)
+    {
+        _getShort(handle, firstVertex, numVertices, values);
+    }
+
+    public int getComponentCount()
+    {
+        return _getComponentCount(handle);
+    }
+
+    public int getComponentType()
+    {
+        return _getComponentType(handle);
+    }
+
+    public int getVertexCount()
+    {
+        return _getVertexCount(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    private static int createHandle(int numVertices, int numComponents, int componentSize)
+    {
+        Platform.heuristicGC();
+        return  _ctor(Interface.getHandle(),
+                      numVertices,
+                      numComponents,
+                      componentSize);
+    }
+
+    // Native methods
+    private native static int _ctor(int hInterface,
+                                    int numVertices,
+                                    int numComponents,
+                                    int componentSize);
+    private native static void _setByte(int handle,
+                                        int first,
+                                        int count,
+                                        byte[] src);
+    private native static void _setShort(int handle,
+                                         int first,
+                                         int count,
+                                         short[] src);
+
+    // M3G 1.1 Maintenance release getters
+    private native static void _getByte(int handle,
+                                        int firstVertex,
+                                        int numVertices,
+                                        byte[] values);
+    private native static void _getShort(int handle,
+                                         int firstVertex,
+                                         int numVertices,
+                                         short[] values);
+    private native static int _getComponentCount(int handle);
+    private native static int _getComponentType(int handle);
+    private native static int _getVertexCount(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/VertexBuffer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class VertexBuffer extends Object3D
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private VertexArray   positions;
+    private VertexArray   normals;
+    private VertexArray   colors;
+    private VertexArray[] texCoords;
+
+    //------------------------------------------------------------------
+    // Constructors
+    //------------------------------------------------------------------
+
+    public VertexBuffer()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    VertexBuffer(int handle)
+    {
+        super(handle);
+
+        positions = (VertexArray) getInstance(_getArray(handle, Defs.GET_POSITIONS, null));
+        normals   = (VertexArray) getInstance(_getArray(handle, Defs.GET_NORMALS, null));
+        colors    = (VertexArray) getInstance(_getArray(handle, Defs.GET_COLORS, null));
+
+        texCoords = new VertexArray[Defs.NUM_TEXTURE_UNITS];
+        for (int i = 0; i < Defs.NUM_TEXTURE_UNITS; ++i)
+        {
+            texCoords[i] =
+                (VertexArray) getInstance(_getArray(handle, Defs.GET_TEXCOORDS0 + i, null));
+        }
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public int getVertexCount()
+    {
+        return _getVertexCount(handle);
+    }
+
+    public void setPositions(VertexArray positions, float scale, float[] bias)
+    {
+        _setVertices(handle,
+                     (positions != null) ? positions.handle : 0,
+                     scale,
+                     bias);
+        this.positions = positions;
+    }
+
+    public void setTexCoords(int index, VertexArray texCoords, float scale, float[] bias)
+    {
+        _setTexCoords(handle,
+                      index,
+                      texCoords != null ? texCoords.handle : 0,
+                      scale,
+                      bias);
+
+        if (this.texCoords == null)
+        {
+            this.texCoords = new VertexArray[Defs.NUM_TEXTURE_UNITS];
+        }
+        this.texCoords[index] = texCoords;
+    }
+
+    public void setNormals(VertexArray normals)
+    {
+        _setNormals(handle, normals != null ? normals.handle : 0);
+        this.normals = normals;
+    }
+
+    public void setColors(VertexArray colors)
+    {
+        _setColors(handle, colors != null ? colors.handle : 0);
+        this.colors = colors;
+    }
+
+    public VertexArray getPositions(float[] scaleBias)
+    {
+        /* Get scale and bias with native getter */
+        _getArray(handle, Defs.GET_POSITIONS, scaleBias);
+        return positions;
+    }
+
+    public VertexArray getTexCoords(int index, float[] scaleBias)
+    {
+        /* Index has to be checked here due to the native getter input params */
+        if (index < 0 || index >= Defs.NUM_TEXTURE_UNITS)
+        {
+            throw new IndexOutOfBoundsException();
+        }
+
+        /* Get scale and bias with native getter */
+        _getArray(handle, Defs.GET_TEXCOORDS0 + index, scaleBias);
+        return texCoords != null ? texCoords[index] : null;
+    }
+
+    public VertexArray getNormals()
+    {
+        return normals;
+    }
+
+    public VertexArray getColors()
+    {
+        return colors;
+    }
+
+    public void setDefaultColor(int ARGB)
+    {
+        _setDefaultColor(handle, ARGB);
+    }
+
+    public int getDefaultColor()
+    {
+        return _getDefaultColor(handle);
+    }
+
+    //------------------------------------------------------------------
+    // Private methods
+    //------------------------------------------------------------------
+
+    // Native methods
+    private static native int _ctor(int hInterface);
+    private static native void _setColors(int hBuffer, int hArray);
+    private static native void _setNormals(int hBuffer, int hArray);
+    private static native void _setTexCoords(int hBuffer, int unit, int hArray, float scale, float[] bias);
+    private static native void _setVertices(int hBuffer, int hArray, float scale, float[] bias);
+    private static native void _setDefaultColor(int hBuffer, int ARGB);
+    private static native int  _getDefaultColor(int hBuffer);
+    private static native int  _getArray(int hBuffer, int which, float[] scaleBias);
+    private static native int  _getVertexCount(int hBuffer);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/World.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+public class World extends Group
+{
+    //------------------------------------------------------------------
+    // Instance data
+    //------------------------------------------------------------------
+
+    private Camera     activeCamera;
+    private Background background;
+
+    //------------------------------------------------------------------
+    // Constructor(s)
+    //------------------------------------------------------------------
+
+    public World()
+    {
+        super(_ctor(Interface.getHandle()));
+    }
+
+    /**
+     */
+    World(int handle)
+    {
+        super(handle);
+        background   = (Background) getInstance(_getBackground(handle));
+        activeCamera = (Camera) getInstance(_getActiveCamera(handle));
+    }
+
+    //------------------------------------------------------------------
+    // Public methods
+    //------------------------------------------------------------------
+
+    public void setBackground(Background background)
+    {
+        _setBackground(handle, background != null ? background.handle : 0);
+        this.background = background;
+    }
+
+    public Background getBackground()
+    {
+        return background;
+    }
+
+    public void setActiveCamera(Camera camera)
+    {
+        _setActiveCamera(handle, camera != null ? camera.handle : 0);
+        this.activeCamera = camera;
+    }
+
+    public Camera getActiveCamera()
+    {
+        return activeCamera;
+    }
+
+    // Native methods
+    private static native int _ctor(int hInterface);
+    private static native void _setActiveCamera(int handle, int hCamera);
+    private static native void _setBackground(int handle, int hBackground);
+    private static native int _getActiveCamera(int handle);
+    private static native int _getBackground(int handle);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/CSynchronization.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2005-2006 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:  M3GCore function call synchronization for J9
+*
+*/
+
+// INCLUDE FILES
+#include "CSynchronization.h"
+
+NONSHARABLE_CLASS(M3gGlobals)
+{
+public:
+    M3gGlobals() : mSync(0) {}
+
+public:
+    CSynchronization* mSync;
+};
+
+#if defined(__WINSCW__)
+
+#include <pls.h>
+M3gGlobals* getM3gGlobals()
+{
+    // Access the PLS of this process.
+    return Pls<M3gGlobals>(TUid::Uid(0x200211E2));
+}
+
+#else
+
+static M3gGlobals* sGlobals = 0;
+
+M3gGlobals* getM3gGlobals()
+{
+    if (sGlobals == 0)
+    {
+        sGlobals = new M3gGlobals();
+    }
+    return sGlobals;
+}
+#endif
+
+
+// STATIC MEMBERS
+/*static*/ //CSynchronization* CSynchronization::iSelf = NULL;
+
+// -----------------------------------------------------------------------------
+// CSynchronization::InstanceL
+// -----------------------------------------------------------------------------
+/*static*/ CSynchronization* CSynchronization::InstanceL()
+{
+    static M3gGlobals* globals = getM3gGlobals();
+    if (!globals->mSync)
+    {
+        globals->mSync = CSynchronization::NewL();
+    }
+    return globals->mSync;
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::NewL
+// -----------------------------------------------------------------------------
+/*static*/ CSynchronization* CSynchronization::NewL()
+{
+    CSynchronization* self = new(ELeave) CSynchronization();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::ConstructL
+// -----------------------------------------------------------------------------
+void CSynchronization::ConstructL()
+{
+    User::LeaveIfError(iGuard.CreateLocal());
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::CSynchronization
+// -----------------------------------------------------------------------------
+CSynchronization::CSynchronization() : iErrorCode(0)
+{
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::~CSynchronization
+// -----------------------------------------------------------------------------
+CSynchronization::~CSynchronization()
+{
+    iGuard.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::Lock
+// -----------------------------------------------------------------------------
+void CSynchronization::Lock()
+{
+    iGuard.Wait();
+    iErrorCode = 0;
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::Unlock
+// -----------------------------------------------------------------------------
+void CSynchronization::Unlock()
+{
+    iErrorCode = 0;
+    iGuard.Signal();
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::SetErrorCode
+// -----------------------------------------------------------------------------
+void CSynchronization::SetErrorCode(TInt aCode)
+{
+    iErrorCode = aCode;
+}
+
+// -----------------------------------------------------------------------------
+// CSynchronization::GetErrorCode
+// -----------------------------------------------------------------------------
+TInt CSynchronization::GetErrorCode()
+{
+    return iErrorCode;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/animationController.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_AnimationController.h"
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_AnimationController__1getPosition
+(JNIEnv* aEnv, jclass, jint aHController, jint aWorldTime)
+{
+    M3G_DO_LOCK
+    jfloat position = (jfloat)m3gGetPosition((M3GAnimationController)aHController, aWorldTime);
+    M3G_DO_UNLOCK(aEnv)
+    return position;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_AnimationController__1setWeight
+(JNIEnv* aEnv, jclass, jint aHController, jfloat aWeight)
+{
+    M3G_DO_LOCK
+    m3gSetWeight((M3GAnimationController)aHController, aWeight);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_AnimationController__1setActiveInterval
+(JNIEnv* aEnv, jclass, jint aHController, jint aWorldTimeMin, jint aWorldTimeMax)
+{
+    M3G_DO_LOCK
+    m3gSetActiveInterval((M3GAnimationController)aHController, aWorldTimeMin, aWorldTimeMax);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationController__1getActiveIntervalStart
+(JNIEnv* aEnv, jclass, jint aHController)
+{
+    M3G_DO_LOCK
+    jint start = (jint)m3gGetActiveIntervalStart((M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+    return start;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationController__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateAnimationController((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_AnimationController__1setPosition
+(JNIEnv* aEnv, jclass, jint aHController, jfloat aTime, jint aWorldTime)
+{
+    M3G_DO_LOCK
+    m3gSetPosition((M3GAnimationController)aHController, aTime, aWorldTime);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_AnimationController__1setSpeed
+(JNIEnv* aEnv, jclass, jint aHController, jfloat aFactor, jint aWorldTime)
+{
+    M3G_DO_LOCK
+    m3gSetSpeed((M3GAnimationController)aHController, aFactor, aWorldTime);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_AnimationController__1getSpeed
+(JNIEnv* aEnv, jclass, jint aHController)
+{
+    M3G_DO_LOCK
+    jfloat speed = (jfloat)m3gGetSpeed((M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+    return speed;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationController__1getActiveIntervalEnd
+(JNIEnv* aEnv, jclass, jint aHController)
+{
+    M3G_DO_LOCK
+    jint end = (jint)m3gGetActiveIntervalEnd((M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+    return end;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_AnimationController__1getWeight
+(JNIEnv* aEnv, jclass, jint aHController)
+{
+    M3G_DO_LOCK
+    jfloat weight = (jfloat)m3gGetWeight((M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+    return weight;
+}
+
+/* M3G 1.1 JNI Calls*/
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationController__1getRefWorldTime
+(JNIEnv* aEnv, jclass, jint aHController)
+{
+    M3G_DO_LOCK
+    jint time = (jint)m3gGetRefWorldTime((M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+    return time;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/animationTrack.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_AnimationTrack.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationTrack__1getTargetProperty
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint props = (jint)m3gGetTargetProperty((M3GAnimationTrack)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return props;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationTrack__1getSequence
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint sequence = (jint)m3gGetSequence((M3GAnimationTrack)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return sequence;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationTrack__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aHSequence, jint aProperty)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateAnimationTrack((M3GInterface)aM3g, (M3GKeyframeSequence)aHSequence, (M3Gint)aProperty);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_AnimationTrack__1getController
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint controller = (jint)m3gGetController((M3GAnimationTrack)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return controller;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_AnimationTrack__1setController
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHController)
+{
+    M3G_DO_LOCK
+    m3gSetController((M3GAnimationTrack)aHandle, (M3GAnimationController)aHController);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/appearance.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Appearance.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setLayer
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aLayer)
+{
+    M3G_DO_LOCK
+    m3gSetLayer((M3GAppearance)aHApp, (M3Gint)aLayer);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getCompositingMode
+(JNIEnv* aEnv,   jclass, jint aHApp)
+{
+    M3G_DO_LOCK
+    jint compMode = (jint)m3gGetCompositingMode((M3GAppearance)aHApp);
+    M3G_DO_UNLOCK(aEnv)
+    return compMode;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getFog
+(JNIEnv* aEnv,   jclass, jint aHApp)
+{
+    M3G_DO_LOCK
+    jint fog = (jint)m3gGetFog((M3GAppearance)aHApp);
+    M3G_DO_UNLOCK(aEnv)
+    return fog;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getLayer
+(JNIEnv* aEnv,   jclass, jint aHApp)
+{
+    M3G_DO_LOCK
+    jint layer = (jint)m3gGetLayer((M3GAppearance)aHApp);
+    M3G_DO_UNLOCK(aEnv)
+    return layer;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setCompositingMode
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aHMode)
+{
+    M3G_DO_LOCK
+    m3gSetCompositingMode((M3GAppearance)aHApp, (M3GCompositingMode)aHMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setPolygonMode
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aHMode)
+{
+    M3G_DO_LOCK
+    m3gSetPolygonMode((M3GAppearance)aHApp, (M3GPolygonMode)aHMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getPolygonMode
+(JNIEnv* aEnv,   jclass, jint aHApp)
+{
+    M3G_DO_LOCK
+    jint polyMode = (jint)m3gGetPolygonMode((M3GAppearance)aHApp);
+    M3G_DO_UNLOCK(aEnv)
+    return polyMode;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setTexture
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aUnit, jint aHTex)
+{
+    M3G_DO_LOCK
+    m3gSetTexture((M3GAppearance)aHApp, (M3Gint)aUnit, (M3GTexture)aHTex);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1ctor
+(JNIEnv* aEnv,   jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateAppearance((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getTexture
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aUnit)
+{
+    M3G_DO_LOCK
+    jint texture = (jint)m3gGetTexture((M3GAppearance)aHApp, (M3Gint)aUnit);
+    M3G_DO_UNLOCK(aEnv)
+    return texture;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setFog
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aHFog)
+{
+    M3G_DO_LOCK
+    m3gSetFog((M3GAppearance)aHApp, (M3GFog)aHFog);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Appearance__1setMaterial
+(JNIEnv* aEnv,   jclass, jint aHApp, jint aHMaterial)
+{
+    M3G_DO_LOCK
+    m3gSetMaterial((M3GAppearance)aHApp, (M3GMaterial)aHMaterial);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Appearance__1getMaterial
+(JNIEnv* aEnv,   jclass, jint aHApp)
+{
+    M3G_DO_LOCK
+    jint material = (jint)m3gGetMaterial((M3GAppearance)aHApp);
+    M3G_DO_UNLOCK(aEnv)
+    return material;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/background.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Background.h"
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Background__1isEnabled
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsBgEnabled((M3GBackground)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Background__1setCrop
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aCropX, jint aCropY, jint aWidth, jint aHeight)
+{
+    M3G_DO_LOCK
+    m3gSetBgCrop((M3GBackground)aHandle, (M3Gint)aCropX, (M3Gint)aCropY, (M3Gint)aWidth, (M3Gint)aHeight);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Background__1setImageMode
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aModeX, jint aModeY)
+{
+    M3G_DO_LOCK
+    m3gSetBgMode((M3GBackground)aHandle, aModeX, aModeY);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Background__1ctor
+(JNIEnv* aEnv,   jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateBackground((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Background__1getCrop
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jint crop = (jint)m3gGetBgCrop((M3GBackground)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return crop;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Background__1getImageMode
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jint mode = (jint)m3gGetBgMode((M3GBackground)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return mode;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Background__1setImage
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aHImage)
+{
+    M3G_DO_LOCK
+    m3gSetBgImage((M3GBackground)aHandle, (M3GImage)aHImage);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Background__1setColor
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aARGB)
+{
+    M3G_DO_LOCK
+    m3gSetBgColor((M3GBackground)aHandle, aARGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Background__1enable
+(JNIEnv* aEnv,   jclass, jint aHandle, jint aWhich, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetBgEnable((M3GBackground)aHandle, aWhich, aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Background__1getImage
+(JNIEnv* aEnv,   jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint image = (jint)m3gGetBgImage((M3GBackground)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return image;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Background__1getColor
+(JNIEnv* aEnv,   jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint color = (jint)m3gGetBgColor((M3GBackground)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/camera.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Camera.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Camera__1setPerspective
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aFovy, jfloat aAspectRatio, jfloat aNear, jfloat aFar)
+{
+    M3G_DO_LOCK
+    m3gSetPerspective((M3GCamera)aHandle, aFovy, aAspectRatio, aNear, aFar);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Camera__1setGeneric
+(JNIEnv* aEnv, jclass, jint aHandle, jbyteArray aTransform)
+{
+    jbyte* elems = NULL;
+    if (aTransform)
+    {
+        elems = aEnv->GetByteArrayElements(aTransform, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+    M3G_DO_LOCK
+    m3gSetProjectionMatrix((M3GCamera)aHandle,
+                           (const M3GMatrix *)elems);
+    M3G_DO_UNLOCK(aEnv)
+    if (elems)
+        aEnv->ReleaseByteArrayElements(aTransform, elems, 0);
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Camera__1getProjectionAsParams
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aParams)
+{
+    jfloat* elems = NULL;
+
+    if (aParams && aEnv->GetArrayLength(aParams) < 4)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return 0;
+    }
+    elems = NULL;
+    if (aParams)
+    {
+        elems = aEnv->GetFloatArrayElements(aParams, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_DO_LOCK
+    jint ret = m3gGetProjectionAsParams((M3GCamera)aHandle, (jfloat*)elems);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (elems)
+    {
+        aEnv->ReleaseFloatArrayElements(aParams, elems, 0);
+    }
+
+    return ret;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Camera__1setParallel
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aHeight, jfloat aAspectRatio, jfloat aNear, jfloat aFar)
+{
+    M3G_DO_LOCK
+    m3gSetParallel((M3GCamera)aHandle, aHeight, aAspectRatio, aNear, aFar);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Camera__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateCamera((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Camera__1getProjectionAsTransform
+(JNIEnv* aEnv, jclass, jint aHandle, jbyteArray aTransform)
+{
+    jbyte* elems = NULL;
+    if (aTransform)
+    {
+        elems = aEnv->GetByteArrayElements(aTransform, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_DO_LOCK
+    jint ret = m3gGetProjectionAsMatrix((M3GCamera)aHandle,
+                                        (M3GMatrix *)elems);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (elems)
+        aEnv->ReleaseByteArrayElements(aTransform, elems, 0);
+    return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/compositingMode.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,155 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_CompositingMode.h"
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_CompositingMode__1isDepthTestEnabled
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsDepthTestEnabled((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_CompositingMode__1getBlending
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jint blending = (jint)m3gGetBlending((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return blending;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_CompositingMode__1isAlphaWriteEnabled
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsAlphaWriteEnabled((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1enableDepthWrite
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gEnableDepthWrite((M3GCompositingMode)aHCompositingMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1setAlphaThreshold
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jfloat aThreshold)
+{
+    M3G_DO_LOCK
+    m3gSetAlphaThreshold((M3GCompositingMode)aHCompositingMode, (M3Gfloat)aThreshold);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1enableColorWrite
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gEnableColorWrite((M3GCompositingMode)aHCompositingMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1setDepthOffset
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jfloat aFactor, jfloat aUnits)
+{
+    M3G_DO_LOCK
+    m3gSetDepthOffset((M3GCompositingMode)aHCompositingMode, (M3Gfloat)aFactor, (M3Gfloat)aUnits);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1enableDepthTest
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gEnableDepthTest((M3GCompositingMode)aHCompositingMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_CompositingMode__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateCompositingMode((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_CompositingMode__1isColorWriteEnabled
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsColorWriteEnabled((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1setAlphaWriteEnable
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetAlphaWriteEnable((M3GCompositingMode)aHCompositingMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_CompositingMode__1isDepthWriteEnabled
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsDepthWriteEnabled((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_CompositingMode__1getDepthOffsetFactor
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jfloat factor = (jfloat)m3gGetDepthOffsetFactor((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return factor;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_CompositingMode__1getDepthOffsetUnits
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jfloat offset = (jfloat)m3gGetDepthOffsetUnits((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return offset;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_CompositingMode__1setBlending
+(JNIEnv* aEnv, jclass, jint aHCompositingMode, jint aMode)
+{
+    M3G_DO_LOCK
+    m3gSetBlending((M3GCompositingMode)aHCompositingMode, (int)aMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_CompositingMode__1getAlphaThreshold
+(JNIEnv* aEnv, jclass, jint aHCompositingMode)
+{
+    M3G_DO_LOCK
+    jfloat treshold = (jfloat)m3gGetAlphaThreshold((M3GCompositingMode)aHCompositingMode);
+    M3G_DO_UNLOCK(aEnv)
+    return treshold;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/fog.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Fog.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Fog__1setMode
+(JNIEnv* aEnv, jclass, jint aHandle, jint aMode)
+{
+    M3G_DO_LOCK
+    m3gSetFogMode((M3GFog)aHandle, aMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Fog__1setLinear
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aNear, jfloat aFar)
+{
+    M3G_DO_LOCK
+    m3gSetFogLinear((M3GFog)aHandle, aNear, aFar);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Fog__1getDistance
+(JNIEnv* aEnv, jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jfloat distance = (jfloat)m3gGetFogDistance((M3GFog)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return distance;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Fog__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateFog((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Fog__1getMode
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint mode = (jint)m3gGetFogMode((M3GFog)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return mode;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Fog__1setDensity
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aDensity)
+{
+    M3G_DO_LOCK
+    m3gSetFogDensity((M3GFog)aHandle, aDensity);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Fog__1getDensity
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jfloat density = (jfloat)m3gGetFogDensity((M3GFog)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return density;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Fog__1setColor
+(JNIEnv* aEnv, jclass, jint aHandle, jint aRGB)
+{
+    M3G_DO_LOCK
+    m3gSetFogColor((M3GFog)aHandle, aRGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Fog__1getColor
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint color = (jint)m3gGetFogColor((M3GFog)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/graphics3d.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,733 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Graphics3D.h"
+
+/*
+ * Must be executed in UI thread
+ */
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Graphics3D__1isProperRenderer
+(JNIEnv* /*aEnv*/, jclass)
+{
+    EGLContext ctx;
+    EGLConfig config;
+    EGLSurface surf;
+    EGLint attrib[5];
+    EGLint numConfigs;
+    bool isProperRenderer;
+
+    // initialize EGL and create a temporary surface & context for reading
+    // the renderer string
+    eglInitialize(eglGetDisplay(EGL_DEFAULT_DISPLAY), NULL, NULL);
+
+    attrib[0] = EGL_SURFACE_TYPE;
+    attrib[1] = EGL_PBUFFER_BIT;
+    attrib[2] = EGL_NONE;
+
+    eglChooseConfig(eglGetDisplay(0), attrib, &config, 1, &numConfigs);
+
+    ctx = eglCreateContext(eglGetDisplay(0), config, NULL, NULL);
+
+    attrib[0] = EGL_WIDTH;
+    attrib[1] = 2;
+    attrib[2] = EGL_HEIGHT;
+    attrib[3] = 2;
+    attrib[4] = EGL_NONE;
+
+    surf = eglCreatePbufferSurface(eglGetDisplay(0), config, attrib);
+    eglMakeCurrent(eglGetDisplay(0), surf, surf, ctx);
+
+    // We check if proper renderer is used and return value which is stored
+    // on java side and passed to fuctions where is decided if m3g renders
+    // into mutable off-screen image or into framebuffer (see
+    // Java_javax_microedition_m3g_Graphics3D__1bindGraphics and
+    // releaseGraphicsTarget).
+    const GLubyte *info;
+    info = glGetString(GL_RENDERER);   // get the renderer string
+
+    // check if "MBX" substring is found
+    if ( !info ||  strstr((const char *)info, "MBX"))
+    {
+        // HW renderer detected.
+        // If "MBX" HW is detected we must reset alpha for mutable off-screen
+        // images by hand (see releaseGraphicsTarget).
+        isProperRenderer = false;
+    }
+    else
+    {
+        // Other renderers can use m3g core API m3gSetAlphaWrite without
+        // performance drop.
+        isProperRenderer = true;
+    }
+
+    // destroy the temporary surface & context
+    eglMakeCurrent(eglGetDisplay(0), NULL, NULL, NULL);
+    eglDestroySurface(eglGetDisplay(0), surf);
+    eglDestroyContext(eglGetDisplay(0), ctx);
+
+    return isProperRenderer;
+}
+
+/*
+ * Must be executed in UI thread
+ */
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Graphics3D__1bindGraphics
+(JNIEnv* aEnv, jclass, jint aCtx,
+ jint aSurfaceHandle, jint aClipX, jint aClipY, jint aClipW, jint aClipH,
+ jboolean aDepth, jint aHintBits, jboolean aIsProperRenderer)
+{
+    M3GRenderContext ctx = (M3GRenderContext)aCtx;
+
+    // Fetch the native peer of our target object
+    Java::GFX::WindowSurface* wsurf = reinterpret_cast<Java::GFX::WindowSurface*>(aSurfaceHandle);
+    
+    wsurf->bind(Java::GFX::WsTypeQtImage | Java::GFX::WsTypeEglSurface);
+    jboolean isImageTarget = false; /*cmidGraphics->IsImageTarget();*/
+
+    M3G_DO_LOCK
+
+    /*
+    * Get the physical screen size and pass it to m3gcore. This affects (improves) the performance
+    * as the canvas frambuffer (rendering target) is larger than the physical screen size in
+    * devices that have more than one screen orientation, causing extra copying operations.
+    *
+    * This will improve m3g performance and suppresses extra bitmap copying.
+    */
+
+    //TRect screenRect = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+
+    eglWaitNative(EGL_CORE_NATIVE_ENGINE);
+
+    if (m3gSetRenderBuffers((M3GRenderContext)aCtx, aDepth ?
+                            M3G_COLOR_BUFFER_BIT|M3G_DEPTH_BUFFER_BIT :
+                            M3G_COLOR_BUFFER_BIT) && m3gSetRenderHints((M3GRenderContext)aCtx, aHintBits))
+    {
+
+        switch (wsurf->getType())
+        {
+        case Java::GFX::WsTypeQtImage:
+        {
+            QImage* bitmap = wsurf->getQtImage();
+            M3GPixelFormat format  = mapQtPixelformat(bitmap->format());
+            m3gBindMemoryTarget((M3GRenderContext)aCtx, bitmap->bits(), (M3Guint)bitmap->width(), (M3Guint)bitmap->height(), format, (M3Guint)(bitmap->width() * 4), NULL);
+            break;
+        }
+        case Java::GFX::WsTypeEglSurface:
+        {
+            if( eglQueryAPI() != EGL_OPENGL_ES_API )
+            {
+                eglMakeCurrent( EGL_DEFAULT_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+                eglBindAPI( EGL_OPENGL_ES_API );
+            }
+            m3gBindEGLSurfaceTarget((M3GRenderContext)aCtx, wsurf->getEglSurface() );
+            break;
+        }
+        default:
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+            break;
+        }
+
+        // Pass the physical screen size to m3gcore
+        //m3gSetDisplayArea(aCtx, screenRect.Width(), screenRect.Height());
+
+        m3gSetClipRect((M3GRenderContext)aCtx, aClipX, aClipY, aClipW, aClipH);
+        m3gSetViewport((M3GRenderContext)aCtx, aClipX, aClipY, aClipW, aClipH);
+    }
+
+    M3G_DO_UNLOCK(aEnv)
+
+    if (isImageTarget && aIsProperRenderer)
+    {
+        m3gSetAlphaWrite(ctx, M3G_FALSE);
+    }
+
+    return isImageTarget;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1setViewport
+(JNIEnv* aEnv, jclass, jint aHContext, jint aX, jint aY,
+ jint aWidth, jint aHeight)
+{
+    M3G_DO_LOCK
+    m3gSetViewport((M3GRenderContext)aHContext, aX, aY, aWidth, aHeight);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+
+static void releaseTarget(M3GRenderContext aCtx)
+{
+    eglWaitGL();
+    m3gReleaseTarget(aCtx);
+}
+
+
+/*
+static void releaseGraphicsTarget(M3GRenderContext aCtx, CMIDGraphics *aGraphics,
+    TBool aIsImageTarget, TBool aIsProperRenderer )
+    {
+    releaseTarget(aCtx);
+
+    // clear alpha for only mutable off-screen images (not for canvas/GameCanvas
+    // framebuffer) those images are indetified by aIsImageTarget argument
+    if (aIsImageTarget)
+        {
+        if ( aIsProperRenderer )
+            {
+            m3gSetAlphaWrite(aCtx, M3G_TRUE);
+            }
+        else
+            {
+            CFbsBitmap *bitmap = aGraphics->Bitmap();
+
+            const TInt width = bitmap->SizeInPixels().iWidth;
+            const TInt height = bitmap->SizeInPixels().iHeight;
+            TInt stride = bitmap->ScanLineLength(width, bitmap->DisplayMode());
+
+            bitmap->LockHeap();
+
+            for (TInt i = 0; i < height; i++)
+                {
+                const void *srcAddr =
+                    ((const char *) bitmap->DataAddress()) + i * stride;
+                unsigned char *src = (unsigned char *) srcAddr;
+                TInt count = width;
+                while (count--)
+                    {
+                    src += 3; //jump to last byte - alpha channel
+                    //setting FF to alpha channel for non-canvas image targets
+                    *src |= 0xff;
+                    src++;
+                    }
+                }
+
+            bitmap->UnlockHeap();
+            }
+        }
+    }
+*/
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1releaseGraphics
+(JNIEnv* aEnv, jclass, jint aHandle,
+ jint aSurfaceHandle, jboolean /*aIsImageTarget*/, jboolean /*aIsProperRenderer*/)
+{
+    M3G_DO_LOCK
+
+    releaseTarget((M3GRenderContext)aHandle);
+
+    // Release used target surface
+    Java::GFX::WindowSurface* surf = reinterpret_cast<Java::GFX::WindowSurface*>(aSurfaceHandle);
+    surf->release();
+    
+    /*
+    CMIDGraphics *cmidGraphics = MIDUnhandObject<CMIDGraphics>(aGraphicsHandle);
+
+    CJavaM3GEventSource* eventSource =
+        JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    eventSource->ExecuteV(&releaseGraphicsTarget, ((M3GRenderContext) aHandle),
+        cmidGraphics, ((TBool) aIsImageTarget), ((TBool) aIsProperRenderer) );
+        */
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1setCamera
+(JNIEnv* aEnv, jclass, jint aHContext, jint aHCamera, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (Matrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    M3G_DO_LOCK
+    m3gSetCamera((M3GRenderContext) aHContext, (M3GCamera) aHCamera, transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, JNI_ABORT);
+    }
+}
+
+/*
+static void renderWorld(M3GRenderContext aHContext,
+                        M3GWorld aHWorld)
+{
+    m3gRenderWorld(aHContext, aHWorld);
+}
+*/
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1renderWorld
+(JNIEnv* aEnv, jclass, jint aHContext, jint aHWorld)
+{
+    M3G_DO_LOCK
+
+    m3gRenderWorld((M3GRenderContext) aHContext, (M3GWorld) aHWorld);
+
+    /*
+    CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    eventSource->ExecuteV(&renderWorld,
+                       (M3GRenderContext) aHContext,
+                       (M3GWorld) aHWorld);
+    */
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    M3GRenderContext ctx = m3gCreateContext((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jint)ctx;
+}
+
+struct RenderStruct
+{
+    M3GVertexBuffer hVertices;
+    M3GIndexBuffer hIndices;
+    M3GAppearance hAppearance;
+    const M3GMatrix *transform;
+};
+
+/*
+static void renderImmediate(M3GRenderContext aHContext, RenderStruct *aR, jint aScope)
+{
+    m3gRender(aHContext,
+              aR->hVertices,
+              aR->hIndices,
+              aR->hAppearance,
+              aR->transform, 1.0f, aScope);
+}
+*/
+
+/*
+ * Must be executed in UI thread
+ */
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1render
+(JNIEnv* aEnv, jclass, jint aHContext,
+ jint aHVertices, jint aHIndices, jint aHAppearance, jbyteArray aTransform, jint aScope)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)aEnv->GetByteArrayElements(aTransform, NULL);
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    /*
+    RenderStruct r;
+    r.hVertices = (M3GVertexBuffer) aHVertices;
+    r.hIndices = (M3GIndexBuffer) aHIndices;
+    r.hAppearance = (M3GAppearance) aHAppearance;
+    r.transform = transform;
+    */
+
+
+    M3G_DO_LOCK
+
+    m3gRender((M3GRenderContext) aHContext, (M3GVertexBuffer) aHVertices, (M3GIndexBuffer) aHIndices, (M3GAppearance) aHAppearance,
+              transform, 1.0f, aScope);
+
+    /*
+      CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    eventSource->ExecuteV(&renderImmediate, ((M3GRenderContext) aHContext), &r, aScope);
+    */
+    M3G_DO_UNLOCK(aEnv)
+
+
+    if (transform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, JNI_ABORT);
+    }
+}
+
+/*
+static void clear(M3GRenderContext aHContext, M3GBackground aHBackground)
+{
+    m3gClear(aHContext, aHBackground);
+}
+*/
+
+/*
+ * Must be executed in UI thread
+ */
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1clear
+(JNIEnv* aEnv, jclass, jint aCtx, jint aBg)
+{
+    M3G_DO_LOCK
+    m3gClear((M3GRenderContext)aCtx, (M3GBackground)aBg);
+
+    /*
+    CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    eventSource->ExecuteV(&clear, (M3GRenderContext)aCtx, (M3GBackground)aBg);
+    */
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1releaseImage
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    M3G_DO_LOCK
+
+    releaseTarget((M3GRenderContext)aHCtx);
+
+    /*
+    CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    eventSource->ExecuteV(&releaseTarget, (M3GRenderContext)aHCtx);
+    */
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1addRef
+(JNIEnv* aEnv, jclass, jint aObject)
+{
+    M3G_DO_LOCK
+    m3gAddRef((M3GObject) aObject);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1addLight
+(JNIEnv* aEnv, jclass, jint aHContext, jint aHLight, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    M3G_DO_LOCK
+    int idx = m3gAddLight((M3GRenderContext) aHContext, (M3GLight) aHLight, transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, JNI_ABORT);
+    }
+
+    return idx;
+}
+
+/*
+static void bindImage(M3GRenderContext hCtx, M3GImage hImg, M3Gbool depth, M3Gbitmask hintBits)
+{
+    if (m3gSetRenderBuffers(hCtx, depth ? M3G_COLOR_BUFFER_BIT|M3G_DEPTH_BUFFER_BIT : M3G_COLOR_BUFFER_BIT) && m3gSetRenderHints(hCtx, hintBits)) {
+        m3gBindImageTarget(hCtx, hImg);
+    }
+}
+*/
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1bindImage
+(JNIEnv* aEnv, jclass, jint aHCtx, jint aImageHandle, jboolean aDepth, jint aHintBits)
+{
+    M3G_DO_LOCK
+
+    if (m3gSetRenderBuffers((M3GRenderContext)aHCtx, (M3Gbool)aDepth ? M3G_COLOR_BUFFER_BIT|M3G_DEPTH_BUFFER_BIT : M3G_COLOR_BUFFER_BIT) && m3gSetRenderHints((M3GRenderContext)aHCtx, (M3Gbitmask)aHintBits))
+    {
+        m3gBindImageTarget((M3GRenderContext)aHCtx, (M3GImage)aImageHandle);
+    }
+
+    //CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    //eventSource->ExecuteV(&bindImage, (M3GRenderContext)aHCtx, (M3GImage)aImageHandle, (M3Gbool)aDepth, (M3Gbitmask)aHintBits);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1resetLights
+(JNIEnv* aEnv, jclass, jint aHContext)
+{
+    M3G_DO_LOCK
+    m3gClearLights((M3GRenderContext) aHContext);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1setDepthRange
+(JNIEnv* aEnv, jclass, jint aHContext, jfloat aDepthNear, jfloat aDepthFar)
+{
+    M3G_DO_LOCK
+    m3gSetDepthRange((M3GRenderContext) aHContext, aDepthNear, aDepthFar);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1setLight
+(JNIEnv* aEnv, jclass, jint aHContext, jint aLightIndex, jint aHLight, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    M3G_DO_LOCK
+    m3gSetLight((M3GRenderContext) aHContext, aLightIndex, (M3GLight) aHLight, transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, JNI_ABORT);
+    }
+}
+
+/*
+static void renderNode(M3GRenderContext aHCtx,
+                       M3GNode aHNode,
+                       const M3GMatrix *aMtx)
+{
+    m3gRenderNode(aHCtx, aHNode, aMtx);
+}
+*/
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1renderNode
+(JNIEnv* aEnv, jclass, jint aHCtx, jint aHNode, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    M3G_DO_LOCK
+
+    m3gRenderNode((M3GRenderContext)aHCtx, (M3GNode)aHNode, (const M3GMatrix *)transform);
+
+    //CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    //eventSource->ExecuteV(&renderNode, (M3GRenderContext)aHCtx, (M3GNode)aHNode, (const M3GMatrix *)transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aTransform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, JNI_ABORT);
+    }
+}
+
+#if defined(M3G_ENABLE_PROFILING)
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getStatistics
+(JNIEnv* aEnv, jclass, jintArray aStatArray)
+{
+    const M3Gint *statArray = (M3Gint *)(aStatArray != NULL ? aEnv->GetIntArrayElements(aStatArray, NULL) : NULL);
+    jint statArrayLength = aStatArray ? aEnv->GetArrayLength(aStatArray) : 0;
+
+    if (statArray != NULL && statArrayLength >= sizeof(m3gs_statistic))
+    {
+        m3gCopy((void*)statArray, m3gs_statistic, sizeof(m3gs_statistic));
+    }
+
+    M3G_DO_LOCK
+    m3gZero(m3gs_statistic, sizeof(m3gs_statistic));
+    M3G_DO_UNLOCK(aEnv)
+
+    if (statArray)
+    {
+        aEnv->ReleaseIntArrayElements(aStatArray, (jint*)statArray, 0);
+    }
+
+    return sizeof(m3gs_statistic);
+}
+
+#endif /* M3G_ENABLE_PROFILING */
+
+
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1getViewTransform
+(JNIEnv* aEnv, jclass, jint aHCtx, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    M3G_DO_LOCK
+    m3gGetViewTransform((M3GRenderContext) aHCtx, transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        /* copy array to Java side and release arrays */
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, 0);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getCamera
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    M3G_DO_LOCK
+    jint camera = (jint)m3gGetCamera((M3GRenderContext)aHCtx);
+    M3G_DO_UNLOCK(aEnv)
+
+    return camera;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getLightTransform
+(JNIEnv* aEnv, jclass, jint aHCtx, jint aLightIndex, jbyteArray aTransform)
+{
+    M3GMatrix *transform = NULL;
+    if (aTransform)
+    {
+        transform = (M3GMatrix *)(aEnv->GetByteArrayElements(aTransform, NULL));
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    M3G_DO_LOCK
+    int lightTransform = (M3Guint)m3gGetLightTransform((M3GRenderContext)aHCtx, aLightIndex, transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        aEnv->ReleaseByteArrayElements(aTransform, (jbyte*)transform, 0);
+    }
+
+    return (jint)lightTransform;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getLightCount
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    M3G_DO_LOCK
+    jint lightCount = (jint)m3gGetLightCount((M3GRenderContext)aHCtx);
+    M3G_DO_UNLOCK(aEnv)
+
+    return lightCount;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Graphics3D__1getDepthRangeNear
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    float depthNear = 0;
+    float depthFar = 0;
+
+    M3G_DO_LOCK
+    m3gGetDepthRange((M3GRenderContext) aHCtx, &depthNear, &depthFar);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jfloat)depthNear;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Graphics3D__1getDepthRangeFar
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    float depthNear = 0;
+    float depthFar = 0;
+
+    M3G_DO_LOCK
+    m3gGetDepthRange((M3GRenderContext) aHCtx, &depthNear, &depthFar);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jfloat)depthFar;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getViewportX
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    int viewport[4];
+
+    M3G_DO_LOCK
+    m3gGetViewport((M3GRenderContext)aHCtx, &viewport[0],
+                   &viewport[1],
+                   &viewport[2],
+                   &viewport[3]);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jint)viewport[0];
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getViewportY
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    int viewport[4];
+
+    M3G_DO_LOCK
+    m3gGetViewport((M3GRenderContext)aHCtx, &viewport[0],
+                   &viewport[1],
+                   &viewport[2],
+                   &viewport[3]);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jint)viewport[1];
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getViewportWidth
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    int viewport[4];
+
+    M3G_DO_LOCK
+    m3gGetViewport((M3GRenderContext)aHCtx, &viewport[0],
+                   &viewport[1],
+                   &viewport[2],
+                   &viewport[3]);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jint)viewport[2];
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getViewportHeight
+(JNIEnv* aEnv, jclass, jint aHCtx)
+{
+    int viewport[4];
+
+    M3G_DO_LOCK
+    m3gGetViewport((M3GRenderContext)aHCtx, &viewport[0],
+                   &viewport[1],
+                   &viewport[2],
+                   &viewport[3]);
+    M3G_DO_UNLOCK(aEnv)
+
+    return (jint)viewport[3];
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Graphics3D__1isAASupported
+(JNIEnv* /*aEnv*/, jclass, jint aM3g)
+{
+    M3Gbool aaSupport = M3G_FALSE;
+
+    aaSupport = m3gIsAntialiasingSupported((M3GInterface)aM3g);
+
+    return (jboolean)aaSupport;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/group.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,126 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Group.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Group__1addChild
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHNode)
+{
+    M3G_DO_LOCK
+    m3gAddChild((M3GGroup)aHandle, (M3GNode)aHNode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Group__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateGroup((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Group__1pick2D
+(JNIEnv* aEnv, jclass, jint aHandle, jint aMask, jfloat aX, jfloat aY, jint aHCamera, jfloatArray aResult)
+{
+    jfloat* elems = NULL;
+    if (aResult)
+    {
+        elems = aEnv->GetFloatArrayElements(aResult, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_BEGIN_PROFILE(M3G_PROFILE_PICK);
+    M3G_DO_LOCK
+    jint ret = (jint)m3gPick2D((M3GGroup)aHandle, aMask, aX, aY, (M3GCamera)aHCamera, (jfloat*)elems);
+    M3G_DO_UNLOCK(aEnv)
+    M3G_END_PROFILE(M3G_PROFILE_PICK);
+
+    if (aResult)
+        aEnv->ReleaseFloatArrayElements(aResult, elems, 0);
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Group__1getChild
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex)
+{
+    M3G_DO_LOCK
+    jint child = (jint)m3gGetChild((M3GGroup)aHandle, aIndex);
+    M3G_DO_UNLOCK(aEnv)
+    return child;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Group__1pick3D
+(JNIEnv* aEnv, jclass, jint aHandle, jint aMask, jfloatArray aRay, jfloatArray aResult)
+{
+    jfloat* rayElems = NULL;
+    if (aRay)
+    {
+        rayElems = aEnv->GetFloatArrayElements(aRay, NULL);
+        if (rayElems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    jfloat* resultElems = NULL;
+    if (aResult)
+    {
+        resultElems = aEnv->GetFloatArrayElements(aResult, NULL);
+        if (resultElems == NULL)
+        {
+            if (rayElems)
+                aEnv->ReleaseFloatArrayElements(aRay, rayElems, JNI_ABORT);
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_BEGIN_PROFILE(M3G_PROFILE_PICK);
+    M3G_DO_LOCK
+    jint ret = (jint)m3gPick3D((M3GGroup)aHandle, aMask, (jfloat*)rayElems, (jfloat*)resultElems);
+    M3G_DO_UNLOCK(aEnv)
+    M3G_END_PROFILE(M3G_PROFILE_PICK);
+
+    if (resultElems)
+        aEnv->ReleaseFloatArrayElements(aResult, resultElems, 0);
+    if (rayElems)
+        aEnv->ReleaseFloatArrayElements(aRay, rayElems, 0);
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Group__1getChildCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint count =(jint)m3gGetChildCount((M3GGroup)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Group__1removeChild
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHNode)
+{
+    M3G_DO_LOCK
+    m3gRemoveChild((M3GGroup)aHandle, (M3GNode)aHNode);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/image2d.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,293 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Image2D.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Image2D__1set
+(JNIEnv* aEnv, jclass, jint aHImage2D, jint aX, jint aY, jint aWidth, jint aHeight, jbyteArray aImageArray)
+{
+    jbyte* imageArray = NULL;
+    if (aImageArray)
+    {
+        imageArray = aEnv->GetByteArrayElements(aImageArray, NULL);
+        if (imageArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+    M3G_DO_LOCK
+    m3gSetSubImage((M3GImage)aHImage2D, aX, aY, aWidth, aHeight, aImageArray ? aEnv->GetArrayLength(aImageArray) : NULL, imageArray);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (imageArray)
+    {
+        aEnv->ReleaseByteArrayElements(aImageArray, imageArray, JNI_ABORT);
+    }
+}
+
+static void getImageScanline(const QImage* qtImage,
+                             M3Gint line,
+                             M3Gint bpl,
+                             M3Guint *pixels,
+                             M3Gbool *trueAlpha)
+{
+
+    // Get pointer to start of requested line
+    const unsigned char* srcAddr = qtImage->bits() + line * bpl;
+
+    // As input and output are in the same, i.e. #AARRGGBB format,
+    // just run mem copy from source to destination to copy one line
+    memcpy(pixels, srcAddr, bpl);
+    *trueAlpha = false;
+}
+
+/*
+ * Must be excuted in UI thread
+ */
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1ctorImage
+(JNIEnv* aEnv, jclass, jint aHM3g, jint aFormat, jint aImageHandle)
+{
+
+    if (aImageHandle != 0)
+    {
+        Java::GFX::Image* cgfxImage = reinterpret_cast<Java::GFX::Image*>(aImageHandle);
+        QImage qtImage;
+
+        if (!cgfxImage)
+        {
+            return 0;
+        }
+        else
+        {
+            qtImage = cgfxImage->toImage();
+            if (qtImage.isNull())
+            {
+                return 0;
+            }
+        }
+
+        // m3g needs format in 32bpp, i.e. in RGB32 or ARGB32 so
+        // if format is not one of those convert it here
+        if ((qtImage.format() != QImage::Format_ARGB32) || (qtImage.format() != QImage::Format_RGB32))
+        {
+            qtImage = qtImage.convertToFormat(QImage::Format_ARGB32);
+            if (qtImage.isNull())
+            {
+                return 0;
+            }
+        }
+
+        // Create Image2D
+        M3GImage image;
+        M3Gint width = qtImage.width();
+        M3Gint height = qtImage.height();
+        M3Gint bpl = qtImage.bytesPerLine();
+
+        M3G_DO_LOCK
+
+        image = m3gCreateImage((M3GInterface)aHM3g, (M3GImageFormat)aFormat, width, height, 0);
+        if (image == NULL)
+        {
+            return 0;    // exception automatically raised
+        }
+
+        M3Guint *tempPixels = (M3Guint *) malloc(width * 4);
+        if (tempPixels == NULL)
+        {
+            m3gDeleteObject((M3GObject) image);
+            return 0;
+        }
+
+        // read and write scanline by scanline
+        for (M3Gint y = 0; y < height; ++y)
+        {
+            M3Gbool trueAlpha;
+            getImageScanline(&qtImage, y, bpl, tempPixels, &trueAlpha);
+            m3gSetImageScanline(image, y, trueAlpha, tempPixels);
+        }
+
+        // finally commit image
+        m3gCommitImage(image);
+
+        M3G_DO_UNLOCK(aEnv)
+
+        // free memory
+        free(tempPixels);
+
+        cgfxImage = NULL;
+        return reinterpret_cast<jint>(image);
+    }
+    return 0;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1getFormat
+(JNIEnv* aEnv, jclass, jint aHImage2D)
+{
+    M3G_DO_LOCK
+    jint format = (jint)m3gGetFormat((M3GImage)aHImage2D);
+    M3G_DO_UNLOCK(aEnv)
+    return format;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1ctorSizePixelsPalette
+(JNIEnv* aEnv, jclass, jint aM3g, jint aFormat, jint aWidth, jint aHeight, jbyteArray aImage, jbyteArray aPalette)
+{
+    M3GImageFormat format = (M3GImageFormat)aFormat;
+
+    int bpp = jsr184BytesPerPixel(format);
+
+    if (validateArray(aEnv, aImage, aWidth * aHeight))
+    {
+        if (aPalette == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+            return 0;
+        }
+        int paletteLen = aEnv->GetArrayLength(aPalette);
+        if ((paletteLen < 256 *(unsigned)bpp) &&
+                (paletteLen % (unsigned)bpp != 0))
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+            return 0;
+        }
+        else
+        {
+            M3G_DO_LOCK
+
+            M3GImage hImg = m3gCreateImage((M3GInterface)aM3g,
+                                           format,
+                                           aWidth, aHeight,
+                                           M3G_PALETTED);
+            if (hImg != NULL)
+            {
+                jbyte* palette = NULL;
+
+                int numEntries = paletteLen / bpp;
+                if (numEntries > 256)
+                {
+                    numEntries = 256;
+                }
+
+                jbyte* image = aEnv->GetByteArrayElements(aImage, NULL);
+                if (image == NULL)
+                {
+                    M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+                    return 0;
+                }
+
+                m3gSetImage(hImg, image);
+
+                palette = aEnv->GetByteArrayElements(aPalette, NULL);
+                if (palette == NULL)
+                {
+                    if (image)
+                    {
+                        aEnv->ReleaseByteArrayElements(aImage, image, JNI_ABORT);
+                    }
+                    M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+                    return 0;
+                }
+
+                m3gSetImagePalette(hImg, numEntries, palette);
+                m3gCommitImage(hImg);
+
+                if (image)
+                {
+                    aEnv->ReleaseByteArrayElements(aImage, image, JNI_ABORT);
+                }
+                if (palette)
+                {
+                    aEnv->ReleaseByteArrayElements(aPalette, palette, JNI_ABORT);
+                }
+            }
+            M3G_DO_UNLOCK(aEnv)
+            return ((unsigned) hImg);
+        }
+    }
+    return 0;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Image2D__1isMutable
+(JNIEnv* aEnv, jclass, jint aHImage2D)
+{
+    M3G_DO_LOCK
+    jboolean isMutable = (jboolean)m3gIsMutable((M3GImage)aHImage2D);
+    M3G_DO_UNLOCK(aEnv)
+    return isMutable;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1getHeight
+(JNIEnv* aEnv, jclass, jint aHImage2D)
+{
+    M3G_DO_LOCK
+    jint height = (jint)m3gGetHeight((M3GImage)aHImage2D);
+    M3G_DO_UNLOCK(aEnv)
+    return height;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1ctorSize
+(JNIEnv* aEnv, jclass, jint aM3g, jint aFormat, jint aWidth, jint aHeight)
+{
+    M3G_DO_LOCK
+    jint handle = (M3Guint) m3gCreateImage((M3GInterface)aM3g,
+                                           (M3GImageFormat)aFormat,
+                                           aWidth, aHeight,
+                                           M3G_DYNAMIC|M3G_RENDERING_TARGET);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1getWidth
+(JNIEnv* aEnv, jclass, jint aHImage2D)
+{
+    M3G_DO_LOCK
+    jint width = (jint)m3gGetWidth((M3GImage)aHImage2D);
+    M3G_DO_UNLOCK(aEnv)
+    return width;
+}
+
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Image2D__1ctorSizePixels
+(JNIEnv* aEnv, jclass, jint aM3g, jint aFormat, jint aWidth, jint aHeight, jbyteArray aImage)
+{
+    M3GImageFormat format = (M3GImageFormat)aFormat;
+
+    if (validateArray(aEnv, aImage, jsr184BytesPerPixel(format) * aWidth * aHeight))
+    {
+        M3G_DO_LOCK
+
+        M3GImage hImg = m3gCreateImage((M3GInterface)aM3g, format, aWidth, aHeight, 0);
+        if (hImg != NULL)
+        {
+            M3GImageFormat format = (M3GImageFormat)aFormat;
+
+            int bpp = jsr184BytesPerPixel(format);
+            jbyte* imageScanline = (jbyte*)malloc(aWidth * bpp);
+            for (int i=0; i < aHeight; i++)
+            {
+                aEnv->GetByteArrayRegion(aImage, aWidth * i * bpp, aWidth * bpp, imageScanline);
+                m3gSetSubImage(hImg, 0, i, aWidth, 1, aWidth * bpp, imageScanline);
+            }
+            m3gCommitImage(hImg);
+
+            free(imageScanline);
+        }
+        M3G_DO_UNLOCK(aEnv)
+        return (unsigned) hImg;
+    }
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/interface.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Interface.h"
+
+
+/*!
+ * \brief Error handler for the Java interface
+ *
+ * Converts M3G errors to exceptions and throws them automatically.
+ */
+static void errorHandler(M3Genum errorCode, M3GInterface /*m3g*/)
+{
+    CSynchronization::InstanceL()->SetErrorCode(errorCode);
+}
+
+/*
+static int createInterface(M3Gparams* aCs)
+{
+    return ((unsigned) m3gCreateInterface(aCs));
+}
+*/
+
+/*
+ * Must be executed in UI thread
+ */
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Interface__1ctor(JNIEnv* aEnv, jclass)
+{
+    M3Gparams cs;
+    memset(&cs, 0, sizeof(cs));
+    cs.mallocFunc = malloc;
+    cs.freeFunc   = free;
+    cs.errorFunc = errorHandler;
+
+    M3G_DO_LOCK
+    /* Call to the Eventserver side */
+    //CJavaM3GEventSource* eventSource = JavaUnhand<CJavaM3GEventSource>(aEventSourceHandle);
+    //jint handle = eventSource->Execute(&createInterface, &cs);
+    jint handle = (unsigned)m3gCreateInterface(&cs);
+    M3G_DO_UNLOCK(aEnv);
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Interface__1getClassID
+(JNIEnv* aEnv, jclass, jint aHObject)
+{
+    M3G_DO_LOCK
+    jint handle = m3gGetClass((M3GObject)aHObject);
+    M3G_DO_UNLOCK(aEnv);
+    return handle;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/keyframeSequence.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_KeyframeSequence.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getRepeatMode
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint mode = (jint)m3gGetRepeatMode((M3GKeyframeSequence)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return mode;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_KeyframeSequence__1setKeyframe
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex, jint aTime, jfloatArray aValue)
+{
+    jfloat* elems = NULL;
+    if (aValue)
+    {
+        elems = aEnv->GetFloatArrayElements(aValue, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    jsize length = aValue ? aEnv->GetArrayLength(aValue) : 0;
+
+    M3G_DO_LOCK
+    m3gSetKeyframe((M3GKeyframeSequence)aHandle,
+                   aIndex,
+                   aTime,
+                   length,
+                   (const M3Gfloat *)elems);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (elems)
+        aEnv->ReleaseFloatArrayElements(aValue, elems, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_KeyframeSequence__1setRepeatMode
+(JNIEnv* aEnv, jclass, jint aHandle, jint aMode)
+{
+    M3G_DO_LOCK
+    m3gSetRepeatMode((M3GKeyframeSequence)aHandle, (M3Genum)aMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_KeyframeSequence__1setDuration
+(JNIEnv* aEnv, jclass, jint aHandle, jint aDuration)
+{
+    M3G_DO_LOCK
+    m3gSetDuration((M3GKeyframeSequence)aHandle, (int)aDuration);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aNumKeyframes, jint aNumComponents, jint aInterpolation)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateKeyframeSequence((M3GInterface)aM3g, aNumKeyframes,
+                  aNumComponents, aInterpolation);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_KeyframeSequence__1setValidRange
+(JNIEnv* aEnv, jclass, jint aHandle, jint aFirst, jint aLast)
+{
+    M3G_DO_LOCK
+    m3gSetValidRange((M3GKeyframeSequence)aHandle, aFirst, aLast);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getDuration
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint duration = (jint)m3gGetDuration((M3GKeyframeSequence)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return duration;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getComponentCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint count = (jint)m3gGetComponentCount((M3GKeyframeSequence)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getInterpolationType
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint type = (jint)m3gGetInterpolationType((M3GKeyframeSequence)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return type;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getKeyframe
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex, jfloatArray aValue)
+{
+    jfloat* elems = NULL;
+    if (aValue)
+    {
+        elems = aEnv->GetFloatArrayElements(aValue, NULL);
+        if (elems == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    jsize length = aValue ? aEnv->GetArrayLength(aValue) : 0;
+
+    if ((length < m3gGetComponentCount((M3GKeyframeSequence)aHandle)) &&
+            (aValue != NULL))
+    {
+        if (elems)
+        {
+            aEnv->ReleaseFloatArrayElements(aValue, elems, JNI_ABORT);
+        }
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return 0;
+    }
+
+    M3G_DO_LOCK
+    jint keyFrame = m3gGetKeyframe((M3GKeyframeSequence)aHandle, aIndex, elems);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (elems)
+    {
+        /* copy array to java side and release arrays */
+        aEnv->ReleaseFloatArrayElements(aValue, elems, 0);
+    }
+    return keyFrame;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getKeyframeCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint count = (jint)m3gGetKeyframeCount((M3GKeyframeSequence)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getValidRangeFirst
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    int first = 0;
+    int last = 0;
+    M3G_DO_LOCK
+    m3gGetValidRange((M3GKeyframeSequence)aHandle, &first, &last);
+    M3G_DO_UNLOCK(aEnv)
+    return first;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_KeyframeSequence__1getValidRangeLast
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    int first = 0;
+    int last = 0;
+    M3G_DO_LOCK
+    m3gGetValidRange((M3GKeyframeSequence)aHandle, &first, &last);
+    M3G_DO_UNLOCK(aEnv)
+    return last;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/light.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Light.h"
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Light__1getSpotAngle
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jfloat angle = (jfloat)m3gGetSpotAngle((M3GLight)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return angle;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setSpotExponent
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aExponent)
+{
+    M3G_DO_LOCK
+    m3gSetSpotExponent((M3GLight)aHandle, aExponent);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setMode
+(JNIEnv* aEnv, jclass, jint aHandle, jint aMode)
+{
+    M3G_DO_LOCK
+    m3gSetLightMode((M3GLight)aHandle, (int)aMode);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setAttenuation
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aConstant, jfloat aLinear, jfloat aQuadratic)
+{
+    M3G_DO_LOCK
+    m3gSetAttenuation((M3GLight)aHandle, aConstant, aLinear, aQuadratic);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setIntensity
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aIntensity)
+{
+    M3G_DO_LOCK
+    m3gSetIntensity((M3GLight)aHandle, aIntensity);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Light__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (jint)m3gCreateLight((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Light__1getMode
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint mode = (jint)m3gGetLightMode((M3GLight)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return mode;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Light__1getAttenuation
+(JNIEnv* aEnv, jclass, jint aHandle, jint aType)
+{
+    M3G_DO_LOCK
+    jfloat att = (jfloat)m3gGetAttenuation((M3GLight)aHandle, aType);
+    M3G_DO_UNLOCK(aEnv)
+    return att;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Light__1getSpotExponent
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jfloat spotExp = (jfloat)m3gGetSpotExponent((M3GLight)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return spotExp;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setSpotAngle
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aAngle)
+{
+    M3G_DO_LOCK
+    m3gSetSpotAngle((M3GLight)aHandle, aAngle);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Light__1getIntensity
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jfloat intensity = (jfloat)m3gGetIntensity((M3GLight)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return intensity;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Light__1setColor
+(JNIEnv* aEnv, jclass, jint aHandle, jint aRGB)
+{
+    M3G_DO_LOCK
+    m3gSetLightColor((M3GLight)aHandle, aRGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Light__1getColor
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint color = (jint)m3gGetLightColor((M3GLight)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/loader.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,234 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Loader.h"
+
+#include <ezlib.h>
+
+/*!
+ * \brief Symbian implementation of the block inflation function for
+ * the Loader class
+ */
+static M3Gsizei m3gSymbianInflateBlock1(M3Gsizei srcLength,
+                                        const M3Gubyte *src,
+                                        M3Gsizei dstLength,
+                                        M3Gubyte *dst)
+{
+    unsigned long len = (unsigned long) dstLength;
+    if (uncompress((Bytef *) dst, &len,
+                   (const Bytef *) src, (uLong) srcLength) != Z_OK)
+    {
+        return 0;
+    }
+    return (M3Gsizei) len;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Loader__1inflate
+(JNIEnv* aEnv, jclass, jbyteArray aCompressed, jbyteArray aInflated)
+{
+    M3Guint result;
+
+    M3Gubyte *compressedData = (M3Gubyte *)aEnv->GetByteArrayElements(aCompressed, NULL);
+    if (compressedData == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+    M3Gint compressedLength = aEnv->GetArrayLength(aCompressed);
+    M3Gubyte *inflatedData = (M3Gubyte *)aEnv->GetByteArrayElements(aInflated, NULL);
+    if (inflatedData == NULL)
+    {
+        if (compressedData)
+            aEnv->ReleaseByteArrayElements(aCompressed, (jbyte*)compressedData, JNI_ABORT);
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+    M3Gint inflatedLength = aEnv->GetArrayLength(aInflated);
+
+    M3G_DO_LOCK
+    if (m3gSymbianInflateBlock1(compressedLength, compressedData,
+                                inflatedLength, inflatedData))
+    {
+        result = TRUE;
+    }
+    else
+    {
+        result = FALSE;
+    }
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aCompressed)
+    {
+        aEnv->ReleaseByteArrayElements(aCompressed, (jbyte*)compressedData, JNI_ABORT);
+    }
+
+    if (aInflated)
+    {
+        aEnv->ReleaseByteArrayElements(aInflated, (jbyte*)inflatedData, 0);
+    }
+
+    return result;
+}
+
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    M3GLoader loader = (M3GLoader)m3gCreateLoader((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return (M3Guint)loader;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1decodeData
+(JNIEnv* aEnv, jclass, jint aLoader, jint aOffset, jbyteArray aDataArray)
+{
+    /* null array is never passed */
+    M3Gubyte *data = (M3Gubyte *)aEnv->GetByteArrayElements(aDataArray, NULL);
+    if (data == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+
+    M3Gint bytes = aEnv->GetArrayLength(aDataArray);
+    M3GLoader loader = (M3GLoader)aLoader;
+
+    M3G_DO_LOCK
+    jint retVal = m3gDecodeData(loader, bytes, data + aOffset);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aDataArray)
+    {
+        aEnv->ReleaseByteArrayElements(aDataArray, (jbyte*)data, JNI_ABORT);
+    }
+
+    return retVal;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getLoadedObjects
+(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray)
+{
+    M3GObject *objects = NULL;
+    if (aObjectArray)
+    {
+        objects = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL);
+        if (objects == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3GLoader loader = (M3GLoader)aLoader;
+
+    M3G_DO_LOCK
+    jint retVal = m3gGetLoadedObjects(loader, objects);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aObjectArray)
+    {
+        aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)objects, 0);
+    }
+
+    return retVal;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Loader__1setExternalReferences
+(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray)
+{
+    /* null array is never passed */
+    M3GObject *xRefs = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL);
+    if (xRefs == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3Gint numXRefs = aEnv->GetArrayLength(aObjectArray);
+    M3GLoader loader = (M3GLoader)aLoader;
+
+    M3G_DO_LOCK
+    m3gImportObjects(loader, numXRefs, xRefs);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)xRefs, JNI_ABORT);
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getObjectsWithUserParameters
+(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray)
+{
+    M3GObject *objects = NULL;
+    if (aObjectArray)
+    {
+        objects = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL);
+        if (objects == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3GLoader loader = (M3GLoader)aLoader;
+
+    M3G_DO_LOCK
+    jint retVal = m3gGetObjectsWithUserParameters(loader, objects);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (objects)
+    {
+        aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)objects, 0);
+    }
+
+    return retVal;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getNumUserParameters
+(JNIEnv* aEnv, jclass, jint aLoader, jint aObj)
+{
+    M3GLoader loader = (M3GLoader)aLoader;
+    M3G_DO_LOCK
+    jint numParams = (jint)m3gGetNumUserParameters(loader, aObj);
+    M3G_DO_UNLOCK(aEnv)
+    return numParams;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getUserParameter
+(JNIEnv* aEnv, jclass, jint aLoader, jint aObj, jint aIndex, jbyteArray aDataArray)
+{
+    M3Gbyte *data = NULL;
+    if (aDataArray)
+    {
+        data = (M3Gbyte *)aEnv->GetByteArrayElements(aDataArray, NULL);
+        if (data == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3GLoader loader = (M3GLoader)aLoader;
+    M3G_DO_LOCK
+    jint retVal = m3gGetUserParameter(loader, aObj, aIndex, data);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (data)
+    {
+        aEnv->ReleaseByteArrayElements(aDataArray, (jbyte*)data, 0);
+    }
+
+    return retVal;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/material.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Material.h"
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Material__1isVertexColorTrackingEnabled
+(JNIEnv* aEnv, jclass, jint aHMaterial)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsVertexColorTrackingEnabled((M3GMaterial)aHMaterial);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Material__1getShininess
+(JNIEnv* aEnv, jclass, jint aHMaterial)
+{
+    M3G_DO_LOCK
+    jfloat shininess = (jfloat)m3gGetShininess((M3GMaterial)aHMaterial);
+    M3G_DO_UNLOCK(aEnv)
+    return shininess;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Material__1setVertexColorTrackingEnable
+(JNIEnv* aEnv, jclass, jint aHMaterial, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetVertexColorTrackingEnable((M3GMaterial)aHMaterial, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Material__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    M3GMaterial material = (M3GMaterial)m3gCreateMaterial((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return (M3Guint)material;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Material__1setColor
+(JNIEnv* aEnv, jclass, jint aHMaterial, jint aTarget, jint aARGB)
+{
+    M3G_DO_LOCK
+    m3gSetColor((M3GMaterial)aHMaterial, aTarget, aARGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Material__1setShininess
+(JNIEnv* aEnv, jclass, jint aHMaterial, jfloat aShininess)
+{
+    M3G_DO_LOCK
+    m3gSetShininess((M3GMaterial)aHMaterial, (M3Gfloat)aShininess);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Material__1getColor
+(JNIEnv* aEnv, jclass, jint aHMaterial, jint aTarget)
+{
+    M3G_DO_LOCK
+    jint color = (jint)m3gGetColor((M3GMaterial)aHMaterial, aTarget);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/mesh.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Mesh.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Mesh__1getIndexBuffer
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex)
+{
+    M3G_DO_LOCK
+    jint buffer = (M3Guint)m3gGetIndexBuffer((M3GMesh)aHandle, aIndex);
+    M3G_DO_UNLOCK(aEnv)
+    return buffer;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Mesh__1getSubmeshCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint count = (M3Guint)m3gGetSubmeshCount((M3GMesh)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Mesh__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aHVertices, jintArray aHTriangles, jintArray aHAppearances)
+{
+    if (aHVertices == 0 || aHTriangles == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return 0;
+    }
+
+    int trianglesLen = aEnv->GetArrayLength(aHTriangles);
+    int appearancesLen = aHAppearances ? aEnv->GetArrayLength(aHAppearances) : 0;
+    if (trianglesLen == 0 || (aHAppearances != NULL && appearancesLen < trianglesLen))
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return 0;
+    }
+
+    jint* triangle = aEnv->GetIntArrayElements(aHTriangles, NULL);
+    if (triangle == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+
+    jint* appearance = NULL;
+    if (aHAppearances)
+    {
+        appearance = aEnv->GetIntArrayElements(aHAppearances, NULL);
+        if (appearance == NULL)
+        {
+            aEnv->ReleaseIntArrayElements(aHTriangles, triangle, JNI_ABORT);
+
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    M3G_DO_LOCK
+    M3Guint ret = (M3Guint)m3gCreateMesh((M3GInterface)aM3g,
+                                         (M3GVertexBuffer)aHVertices,
+                                         (M3GIndexBuffer*)triangle,
+                                         (M3GAppearance*)appearance,
+                                         trianglesLen);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (triangle)
+    {
+        aEnv->ReleaseIntArrayElements(aHTriangles, triangle, JNI_ABORT);
+    }
+    if (appearance)
+    {
+        aEnv->ReleaseIntArrayElements(aHAppearances, appearance, JNI_ABORT);
+    }
+
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Mesh__1getVertexBuffer
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint vBuffer = (M3Guint)m3gGetVertexBuffer((M3GMesh)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return vBuffer;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Mesh__1getAppearance
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex)
+{
+    M3G_DO_LOCK
+    jint appearence = (M3Guint)m3gGetAppearance((M3GMesh)aHandle, aIndex);
+    M3G_DO_UNLOCK(aEnv)
+    return appearence;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Mesh__1setAppearance
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex, jint aHAppearance)
+{
+    M3G_DO_LOCK
+    m3gSetAppearance((M3GMesh)aHandle, aIndex, (M3GAppearance)aHAppearance);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/morphingMesh.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_MorphingMesh.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_MorphingMesh__1setWeights
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aWeightArray)
+{
+    if (aWeightArray != NULL)
+    {
+        jfloat* weightArray = aEnv->GetFloatArrayElements(aWeightArray, NULL);
+        if (weightArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        M3G_DO_LOCK
+        m3gSetWeights((M3GMorphingMesh)aHandle, (M3Gfloat *)weightArray, aEnv->GetArrayLength(aWeightArray));
+        M3G_DO_UNLOCK(aEnv)
+
+        if (weightArray)
+        {
+            aEnv->ReleaseFloatArrayElements(aWeightArray, weightArray, JNI_ABORT);
+        }
+    }
+    else
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_MorphingMesh__1getMorphTargetCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint count = (M3Guint)m3gGetMorphTargetCount((M3GMorphingMesh)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_MorphingMesh__1getWeights
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aWeightArray)
+{
+    if (aWeightArray != NULL)
+    {
+        jfloat* weightArray = aEnv->GetFloatArrayElements(aWeightArray, NULL);
+        if (weightArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        M3G_DO_LOCK
+        m3gGetWeights((M3GMorphingMesh)aHandle, (M3Gfloat *)weightArray, aEnv->GetArrayLength(aWeightArray));
+        M3G_DO_UNLOCK(aEnv)
+
+        if (weightArray)
+        {
+            aEnv->ReleaseFloatArrayElements(aWeightArray, weightArray, 0);
+        }
+    }
+    else
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_MorphingMesh__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aHVertices, jintArray aHTargets, jintArray aHTriangles, jintArray aHAppearances)
+{
+    if (aHVertices == 0 || aHTargets == NULL || aHTriangles == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return 0;
+    }
+
+    int trianglesLen = aEnv->GetArrayLength(aHTriangles);
+    int targetsLen = aEnv->GetArrayLength(aHTargets);
+
+    if (trianglesLen == 0 || targetsLen == 0)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return 0;
+    }
+
+    if (aHAppearances != NULL)
+    {
+        int appearancesLen = aEnv->GetArrayLength(aHAppearances);
+        if (appearancesLen < trianglesLen)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+            return 0;
+        }
+    }
+
+    jint* targets = aEnv->GetIntArrayElements(aHTargets, NULL);
+    if (targets == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+
+    jint* triangles = aEnv->GetIntArrayElements(aHTriangles, NULL);
+    if (triangles == NULL)
+    {
+        aEnv->ReleaseIntArrayElements(aHTargets, targets, JNI_ABORT);
+
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return 0;
+    }
+
+    jint* appearances = NULL;
+    if (aHAppearances)
+    {
+        appearances = aEnv->GetIntArrayElements(aHAppearances, NULL);
+        if (appearances == NULL)
+        {
+            aEnv->ReleaseIntArrayElements(aHTargets, targets, JNI_ABORT);
+            aEnv->ReleaseIntArrayElements(aHTriangles, triangles, JNI_ABORT);
+
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_DO_LOCK
+    M3Guint ret = (M3Guint)m3gCreateMorphingMesh((M3GInterface)aM3g,
+                  (M3GVertexBuffer)aHVertices,
+                  (M3GVertexBuffer*)targets,
+                  (M3GIndexBuffer*)triangles,
+                  (M3GAppearance*)appearances,
+                  trianglesLen,
+                  targetsLen);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseIntArrayElements(aHTargets, targets, JNI_ABORT);
+    aEnv->ReleaseIntArrayElements(aHTriangles, triangles, JNI_ABORT);
+    if (appearances)
+    {
+        aEnv->ReleaseIntArrayElements(aHAppearances, appearances, JNI_ABORT);
+    }
+
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_MorphingMesh__1getMorphTarget
+(JNIEnv* aEnv, jclass, jint aHandle, jint aIndex)
+{
+    M3G_DO_LOCK
+    jint target = (M3Guint)m3gGetMorphTarget((M3GMorphingMesh)aHandle, aIndex);
+    M3G_DO_UNLOCK(aEnv)
+    return target;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/node.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Node.h"
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Node__1isEnabled
+(JNIEnv* aEnv, jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsEnabled((M3GNode)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT jfloat JNICALL Java_javax_microedition_m3g_Node__1getAlphaFactor
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jfloat alpha = (jfloat)m3gGetAlphaFactor((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return alpha;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getParent
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint parent = (M3Guint)m3gGetParent((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return parent;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Node__1setScope
+(JNIEnv* aEnv, jclass, jint aHandle, jint aId)
+{
+    M3G_DO_LOCK
+    m3gSetScope((M3GNode)aHandle, aId);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getScope
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint scope = (jint)m3gGetScope((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return scope;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Node__1getTransformTo
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHTarget, jbyteArray aDstArray)
+{
+    jboolean ret = 0;
+    if (aDstArray != NULL && aHTarget != 0)
+    {
+        jbyte* dstArray = aEnv->GetByteArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+
+        M3G_DO_LOCK
+        ret = m3gGetTransformTo((M3GNode)aHandle, (M3GNode)aHTarget, (M3GMatrix *)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+
+        aEnv->ReleaseByteArrayElements(aDstArray, dstArray, 0);
+    }
+    else
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+    }
+
+    return ret;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Node__1align
+(JNIEnv* aEnv, jclass, jint aHNode, jint aHRef)
+{
+    M3G_BEGIN_PROFILE(M3G_PROFILE_ALIGN);
+    M3G_DO_LOCK
+    m3gAlignNode((M3GNode)aHNode, (M3GNode)aHRef);
+    M3G_DO_UNLOCK(aEnv)
+    M3G_END_PROFILE(M3G_PROFILE_ALIGN);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Node__1setAlphaFactor
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aAlphaFactor)
+{
+    M3G_DO_LOCK
+    m3gSetAlphaFactor((M3GNode)aHandle, aAlphaFactor);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Node__1enable
+(JNIEnv* aEnv, jclass, jint aHandle, jint aWhich, jboolean aEnabled)
+{
+    M3G_DO_LOCK
+    m3gEnable((M3GNode)aHandle, aWhich, (jint)aEnabled);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Node__1setAlignment
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHZReference, jint aZTarget, jint aHYReference, jint aYTarget)
+{
+    M3G_DO_LOCK
+    m3gSetAlignment((M3GNode)aHandle, (M3GNode)aHZReference, aZTarget, (M3GNode)aHYReference, aYTarget);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getZRef
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint zRef = (M3Guint)m3gGetZRef((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return zRef;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getYRef
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint yRef = (M3Guint)m3gGetYRef((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return yRef;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getSubtreeSize
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint size = (M3Guint)m3gGetSubtreeSize((M3GNode)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return size;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Node__1getAlignmentTarget
+(JNIEnv* aEnv, jclass, jint aHandle, jint aAxis)
+{
+    M3G_DO_LOCK
+    jint target = (jint)m3gGetAlignmentTarget((M3GNode)aHandle, aAxis);
+    M3G_DO_UNLOCK(aEnv)
+    return target;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/object3d.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Object3D.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1animate
+(JNIEnv* aEnv, jclass, jint aHObject, jint aTime)
+{
+    M3G_DO_LOCK
+    jint anim = (jint)m3gAnimate((M3GObject)aHObject, aTime);
+    M3G_DO_UNLOCK(aEnv)
+    return anim;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1getAnimationTrack
+(JNIEnv* aEnv, jclass, jint aHObject, jint aIndex)
+{
+    M3G_DO_LOCK
+    jint handle = (M3Guint)m3gGetAnimationTrack((M3GObject)aHObject, aIndex);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1find
+(JNIEnv* aEnv, jclass, jint aHObject, jint aUserID)
+{
+    M3G_DO_LOCK
+    jint target = (M3Guint)m3gFind((M3GObject)aHObject, aUserID);
+    M3G_DO_UNLOCK(aEnv)
+    return target;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1getUserID
+(JNIEnv* aEnv, jclass, jint aHObject)
+{
+    M3G_DO_LOCK
+    jint id = (jint)m3gGetUserID((M3GObject)aHObject);
+    M3G_DO_UNLOCK(aEnv)
+    return id;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1addAnimationTrack
+(JNIEnv* aEnv, jclass, jint aHObject, jint aHTrack)
+{
+    M3G_DO_LOCK
+    jint ret = (jint)m3gAddAnimationTrack((M3GObject)aHObject, (M3GAnimationTrack)aHTrack);
+    M3G_DO_UNLOCK(aEnv)
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1getAnimationTrackCount
+(JNIEnv* aEnv, jclass, jint aHObject)
+{
+    M3G_DO_LOCK
+    jint count = (jint)m3gGetAnimationTrackCount((M3GObject)aHObject);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Object3D__1removeAnimationTrack
+(JNIEnv* aEnv, jclass, jint aHObject, jint aHTrack)
+{
+    M3G_DO_LOCK
+    m3gRemoveAnimationTrack((M3GObject)aHObject, (M3GAnimationTrack)aHTrack);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Object3D__1setUserID
+(JNIEnv* aEnv, jclass, jint aHObject, jint aUserID)
+{
+    M3G_DO_LOCK
+    m3gSetUserID((M3GObject)aHObject, aUserID);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Object3D__1addRef
+(JNIEnv* aEnv, jclass, jint aObject)
+{
+    M3G_DO_LOCK
+    m3gAddRef((M3GObject) aObject);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1duplicate
+(JNIEnv* aEnv, jclass, jint aHObject, jintArray aHReferences)
+{
+    jint* references = NULL;
+    if (aHReferences)
+    {
+        references = aEnv->GetIntArrayElements(aHReferences, NULL);
+        if (references == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_DO_LOCK
+    M3Guint ret = (M3Guint)m3gDuplicate((M3GObject)aHObject, (M3GObject *)references);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (references)
+    {
+        aEnv->ReleaseIntArrayElements(aHReferences, references, 0);
+    }
+
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Object3D__1getReferences
+(JNIEnv* aEnv, jclass, jint aHObject, jintArray aHReferences)
+{
+    jint* references = NULL;
+    if (aHReferences)
+    {
+        references = aEnv->GetIntArrayElements(aHReferences, NULL);
+        if (references == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    jint numReferences = aHReferences ? aEnv->GetArrayLength(aHReferences) : 0;
+
+    M3G_DO_LOCK
+    jint ret = m3gGetReferences((M3GObject)aHObject, (M3GObject *)references, numReferences);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (references)
+    {
+        aEnv->ReleaseIntArrayElements(aHReferences, references, 0);
+    }
+
+    return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/platform.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Platform.h"
+
+/*
+ * Must be excuted in UI thread
+ */
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Platform_finalizeInterface
+(JNIEnv* aEnv, jclass, jint aHObj)
+{
+    M3G_DO_LOCK
+    m3gDeleteInterface((M3GInterface)aHObj);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+/*
+ * Must be excuted in UI thread
+ */
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Platform__1finalizeObject
+(JNIEnv* aEnv, jclass, jint aHObj)
+{
+    M3G_DO_LOCK
+    m3gDeleteObject((M3GObject)aHObj);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/polygonMode.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,130 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_PolygonMode.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setCulling
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jint aModeBits)
+{
+    M3G_DO_LOCK
+    m3gSetCulling((M3GPolygonMode)aHPolygonMode, aModeBits);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_PolygonMode__1getCulling
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jint culling = (jint)m3gGetCulling((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return culling;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setWinding
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jint aModeBits)
+{
+    M3G_DO_LOCK
+    m3gSetWinding((M3GPolygonMode)aHPolygonMode, aModeBits);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_PolygonMode__1getWinding
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jint winding = (jint)m3gGetWinding((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return winding;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_PolygonMode__1isTwoSidedLightingEnabled
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsTwoSidedLightingEnabled((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setTwoSidedLightingEnable
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetTwoSidedLightingEnable((M3GPolygonMode)aHPolygonMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setPerspectiveCorrectionEnable
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetPerspectiveCorrectionEnable((M3GPolygonMode)aHPolygonMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_PolygonMode__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    M3GPolygonMode gm = m3gCreatePolygonMode((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return (M3Guint)gm;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setLocalCameraLightingEnable
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jboolean aEnable)
+{
+    M3G_DO_LOCK
+    m3gSetLocalCameraLightingEnable((M3GPolygonMode)aHPolygonMode, (M3Gbool)aEnable);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_PolygonMode__1setShading
+(JNIEnv* aEnv, jclass, jint aHPolygonMode, jint aModeBits)
+{
+    M3G_DO_LOCK
+    m3gSetShading((M3GPolygonMode)aHPolygonMode, aModeBits);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_PolygonMode__1getShading
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jint shading = (jint)m3gGetShading((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return shading;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_PolygonMode__1isLocalCameraLightingEnabled
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsLocalCameraLightingEnabled((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_PolygonMode__1isPerspectiveCorrectionEnabled
+(JNIEnv* aEnv, jclass, jint aHPolygonMode)
+{
+    M3G_DO_LOCK
+    jboolean enabled = (jboolean)m3gIsPerspectiveCorrectionEnabled((M3GPolygonMode)aHPolygonMode);
+    M3G_DO_UNLOCK(aEnv)
+    return enabled;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/skinnedMesh.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,213 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_SkinnedMesh.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_SkinnedMesh__1addTransform
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHBone, jint aWeight, jint aFirstVertex, jint aNumVertices)
+{
+    M3G_DO_LOCK
+    m3gAddTransform((M3GSkinnedMesh)aHandle, (M3GNode)aHBone, aWeight, aFirstVertex, aNumVertices);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_SkinnedMesh__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aHVertices, jintArray aHTriangles, jintArray aHAppearances, jint aHSkeleton)
+{
+    jint* appearances = NULL;
+    if (aHAppearances)
+    {
+        appearances = aEnv->GetIntArrayElements(aHAppearances, NULL);
+        if (appearances == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    jint* triangles = NULL;
+    if (aHTriangles)
+    {
+        triangles = aEnv->GetIntArrayElements(aHTriangles, NULL);
+        if (triangles == NULL)
+        {
+            if (appearances)
+            {
+                aEnv->ReleaseIntArrayElements(aHAppearances, appearances, JNI_ABORT);
+            }
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    jint numTriangles = aEnv->GetArrayLength(aHTriangles);
+    M3GInterface m3g = (M3GInterface) aM3g;
+
+    M3G_DO_LOCK
+    M3Guint ret = (M3Guint)m3gCreateSkinnedMesh(m3g,
+                  (M3GVertexBuffer)aHVertices,
+                  (M3GIndexBuffer*)triangles,
+                  (M3GAppearance *)appearances,
+                  numTriangles,
+                  (M3GGroup)aHSkeleton);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (appearances)
+    {
+        aEnv->ReleaseIntArrayElements(aHAppearances, appearances, JNI_ABORT);
+    }
+    if (triangles)
+    {
+        aEnv->ReleaseIntArrayElements(aHTriangles, triangles, JNI_ABORT);
+    }
+
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_SkinnedMesh__1getSkeleton
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint skeleton = (M3Guint)m3gGetSkeleton((M3GSkinnedMesh)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return skeleton;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_SkinnedMesh__1getBoneTransform
+(JNIEnv* aEnv, jclass, jint aHandle, jint aBone, jbyteArray aTransform)
+{
+    jbyte *transform = NULL;
+    if (aTransform)
+    {
+        transform = aEnv->GetByteArrayElements(aTransform, NULL);
+        if (transform == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    M3G_DO_LOCK
+    m3gGetBoneTransform((M3GSkinnedMesh)aHandle, (M3GNode)aBone, (M3GMatrix *)transform);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (transform)
+    {
+        /* Update array to java side and release arrays */
+        aEnv->ReleaseByteArrayElements(aTransform, transform, 0);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_SkinnedMesh__1getBoneVertices
+(JNIEnv* aEnv, jclass, jint aHandle, jint aBone, jintArray aIndices, jfloatArray aWeights)
+{
+    int *indices = NULL;
+    float *weights = NULL;
+    jint vertices = 0;
+
+    /* get indices int array */
+    if (aIndices != NULL)
+    {
+        indices = aEnv->GetIntArrayElements(aIndices, NULL);
+        if (indices == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    /* get weights float array */
+    if (aWeights != NULL)
+    {
+        weights = aEnv->GetFloatArrayElements(aWeights, NULL);
+        if (weights == NULL)
+        {
+            if (indices)
+            {
+                /* Release indices int array*/
+                aEnv->ReleaseIntArrayElements(aIndices, indices, JNI_ABORT);
+            }
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    M3G_DO_LOCK
+    /* Get number of vertices */
+    int requiredLength = m3gGetBoneVertices((M3GSkinnedMesh)aHandle, (M3GNode)aBone, NULL, NULL);
+    M3G_DO_UNLOCK(aEnv)
+
+    /* If return value is 0, an error has occured so we leave here */
+    if (requiredLength == 0)
+    {
+
+        /* release arrays before exiting */
+        if (indices)
+        {
+            /* Release indices int array */
+            aEnv->ReleaseIntArrayElements(aIndices, indices, JNI_ABORT);
+        }
+        if (weights)
+        {
+            /* Release indices int array */
+            aEnv->ReleaseFloatArrayElements(aWeights, weights, JNI_ABORT);
+        }
+        return 0;
+    }
+    /*
+    *  If either of arrays is null, lengths are not checked.
+    *  If length validation fails, exception is automatically raised.
+    */
+    if (indices != NULL && weights != NULL &&
+            (!validateArray(aEnv, (jbyteArray)aIndices, requiredLength) ||
+             !validateArray(aEnv, (jbyteArray)aWeights, requiredLength)))
+    {
+
+        /* release arrays here */
+        if (indices)
+        {
+            /* Release indices int array */
+            aEnv->ReleaseIntArrayElements(aIndices, indices, JNI_ABORT);
+        }
+        if (weights)
+        {
+            /* Release indices int array */
+            aEnv->ReleaseFloatArrayElements(aWeights, weights, JNI_ABORT);
+        }
+
+        return 0;
+    }
+    else
+    {
+        M3G_DO_LOCK
+        vertices = m3gGetBoneVertices((M3GSkinnedMesh)aHandle, (M3GNode)aBone, indices, weights);
+        M3G_DO_UNLOCK(aEnv)
+    }
+
+    if (indices)
+    {
+        /* Update array to java side and release arrays */
+        aEnv->ReleaseIntArrayElements(aIndices, indices, 0);
+    }
+    if (weights)
+    {
+        /* Update array to java side and release arrays */
+        aEnv->ReleaseFloatArrayElements(aWeights, weights, 0);
+    }
+    return vertices;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/sprite3d.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Sprite3D.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Sprite3D__1setImage
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHImage)
+{
+    M3G_DO_LOCK
+    m3gSetSpriteImage((M3GSprite)aHandle, (M3GImage)aHImage);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Sprite3D__1isScaled
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jboolean scaled = (jboolean)m3gIsScaledSprite((M3GSprite)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return scaled;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Sprite3D__1getImage
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint image = (M3Guint)m3gGetSpriteImage((M3GSprite)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return image;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Sprite3D__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jboolean aScaled, jint aHImage, jint aHAppearance)
+{
+    M3G_DO_LOCK
+    jint handle = (M3Guint)m3gCreateSprite((M3GInterface)aM3g, aScaled, (M3GImage)aHImage, (M3GAppearance)aHAppearance);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Sprite3D__1getAppearance
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint appearence = (M3Guint)m3gGetSpriteAppearance((M3GSprite)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return appearence;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Sprite3D__1getCrop
+(JNIEnv* aEnv, jclass, jint aHandle, jint aWhich)
+{
+    M3G_DO_LOCK
+    jint crop = (jint)m3gGetCrop((M3GSprite)aHandle, aWhich);
+    M3G_DO_UNLOCK(aEnv)
+    return crop;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Sprite3D__1setCrop
+(JNIEnv* aEnv, jclass, jint aHandle, jint aCropX, jint aCropY, jint aWidth, jint aHeight)
+{
+    M3G_DO_LOCK
+    m3gSetCrop((M3GSprite)aHandle, aCropX, aCropY, aWidth, aHeight);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Sprite3D__1setAppearance
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHAppearance)
+{
+    M3G_DO_LOCK
+    m3gSetSpriteAppearance((M3GSprite)aHandle, (M3GAppearance)aHAppearance);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/texture2d.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Texture2D.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getBlending
+(JNIEnv* aEnv, jclass, jint aHTexture2D)
+{
+    M3G_DO_LOCK
+    jint blending = (jint)m3gTextureGetBlending((M3GTexture)aHTexture2D);
+    M3G_DO_UNLOCK(aEnv)
+    return blending;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getWrappingT
+(JNIEnv* aEnv, jclass, jint aHTexture2D)
+{
+    M3G_DO_LOCK
+    jint wrapping = (jint)m3gGetWrappingT((M3GTexture)aHTexture2D);
+    M3G_DO_UNLOCK(aEnv)
+    return wrapping;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getWrappingS
+(JNIEnv* aEnv, jclass, jint aHTexture2D)
+{
+    M3G_DO_LOCK
+    jint wrapping = (jint)m3gGetWrappingS((M3GTexture)aHTexture2D);
+    M3G_DO_UNLOCK(aEnv)
+    return wrapping;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Texture2D__1setFiltering
+(JNIEnv* aEnv, jclass, jint aHTexture2D, jint aLevelFilter, jint aImageFilter)
+{
+    M3G_DO_LOCK
+    m3gSetFiltering((M3GTexture)aHTexture2D, aLevelFilter, aImageFilter);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getBlendColor
+(JNIEnv* aEnv, jclass, jint aHTexture2D)
+{
+    M3G_DO_LOCK
+    jint color = (jint)m3gGetBlendColor((M3GTexture)aHTexture2D);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Texture2D__1setBlendColor
+(JNIEnv* aEnv, jclass, jint aHTexture2D, jint aRGB)
+{
+    M3G_DO_LOCK
+    m3gSetBlendColor((M3GTexture)aHTexture2D, aRGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aHImage)
+{
+    M3G_DO_LOCK
+    jint handle = (M3Guint)m3gCreateTexture((M3GInterface)aM3g, (M3GImage)aHImage);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Texture2D__1setWrapping
+(JNIEnv* aEnv, jclass, jint aHTexture2D, jint aWrapS, jint aWrapT)
+{
+    M3G_DO_LOCK
+    m3gSetWrapping((M3GTexture)aHTexture2D, aWrapS, aWrapT);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Texture2D__1setImage
+(JNIEnv* aEnv, jclass, jint aHTex, jint aHImg)
+{
+    M3G_DO_LOCK
+    m3gSetTextureImage((M3GTexture)aHTex, (M3GImage)aHImg);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Texture2D__1setBlending
+(JNIEnv* aEnv, jclass, jint aHTexture2D, jint aFunc)
+{
+    M3G_DO_LOCK
+    m3gTextureSetBlending((M3GTexture)aHTexture2D, aFunc);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getImage
+(JNIEnv* aEnv, jclass, jint aHTex)
+{
+    M3G_DO_LOCK
+    jint image = (M3Guint) m3gGetTextureImage((M3GTexture)aHTex);
+    M3G_DO_UNLOCK(aEnv)
+    return image;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getImageFilter
+(JNIEnv* aEnv, jclass, jint aHTex)
+{
+    M3Gint levelFilter = 0;
+    M3Gint imageFilter = 0;
+    M3G_DO_LOCK
+    m3gGetFiltering((M3GTexture)aHTex, &levelFilter, &imageFilter);
+    M3G_DO_UNLOCK(aEnv)
+    return (jint)imageFilter;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Texture2D__1getLevelFilter
+(JNIEnv* aEnv, jclass, jint aHTex)
+{
+    M3Gint levelFilter = 0;
+    M3Gint imageFilter = 0;
+    M3G_DO_LOCK
+    m3gGetFiltering((M3GTexture)aHTex, &levelFilter, &imageFilter);
+    M3G_DO_UNLOCK(aEnv)
+    return (jint)levelFilter;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/transform.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,367 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_Transform.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1transformArray
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jint aHArray, jfloatArray aOutArray, jboolean aW)
+{
+    // null pointers are never passed
+    Matrix* matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    jfloat* outArray = aEnv->GetFloatArrayElements(aOutArray, NULL);
+    if (outArray == NULL)
+    {
+        aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    int outArrayLen = aEnv->GetArrayLength(aOutArray);
+
+    M3G_DO_LOCK
+    m3gTransformArray((M3GVertexArray)aHArray, matrix, (M3Gfloat *)outArray, outArrayLen, (M3Gbool)aW);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+    aEnv->ReleaseFloatArrayElements(aOutArray, outArray, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1rotateQuat
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloat aQx, jfloat aQy, jfloat aQz, jfloat aQw)
+{
+    M3GQuat quat;
+    Matrix* matrix = NULL;
+
+    if (aQx == 0 && aQy == 0 && aQz == 0 && aQw == 0)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return;
+    }
+
+    matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    quat.x = aQx;
+    quat.y = aQy;
+    quat.z = aQz;
+    quat.w = aQw;
+
+    M3G_DO_LOCK
+    m3gNormalizeQuat(&quat);
+    m3gPostRotateMatrixQuat(matrix, (const Quat *)&quat);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1setIdentity
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix)
+{
+    Matrix* matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+    M3G_DO_LOCK
+    m3gIdentityMatrix(matrix);
+    M3G_DO_UNLOCK(aEnv)
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1translate
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloat aTx, jfloat aTy, jfloat aTz)
+{
+    Matrix* matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+    M3G_DO_LOCK
+    m3gPostTranslateMatrix(matrix, aTx, aTy, aTz);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1getMatrix
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloatArray aDstArray)
+{
+    Matrix *matrix = NULL;
+
+    if (aDstArray == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return;
+    }
+
+    if (aEnv->GetArrayLength(aDstArray) < 16)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return;
+    }
+
+    matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    float* dstArray = (float*)(aEnv->GetFloatArrayElements(aDstArray, NULL));
+    if (dstArray == NULL)
+    {
+        aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3G_DO_LOCK
+    m3gGetMatrixRows(matrix, dstArray);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+    aEnv->ReleaseFloatArrayElements(aDstArray, dstArray, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1transformTable
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloatArray aTableArray)
+{
+    // null pointers are never passed
+    M3Gfloat *v = (M3Gfloat *)(aEnv->GetFloatArrayElements(aTableArray, NULL));
+    if (v == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+    int tabelArrayLen = aEnv->GetArrayLength(aTableArray);
+    Matrix* matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        aEnv->ReleaseFloatArrayElements(aTableArray, v, JNI_ABORT);
+
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    {
+        M3Gint i;
+        M3GVec4 vec;
+
+        M3G_DO_LOCK
+        for (i = 0; i < tabelArrayLen; i += 4)
+        {
+            m3gSetVec4(&vec, v[i + 0], v[i + 1], v[i + 2], v[i + 3]);
+            m3gTransformVec4(matrix, &vec);
+            v[i + 0] = vec.x;
+            v[i + 1] = vec.y;
+            v[i + 2] = vec.z;
+            v[i + 3] = vec.w;
+        }
+        M3G_DO_UNLOCK(aEnv)
+    }
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+    aEnv->ReleaseFloatArrayElements(aTableArray, v, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1scale
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloat aSx, jfloat aSy, jfloat aSz)
+{
+    Matrix* matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3G_DO_LOCK
+    m3gPostScaleMatrix(matrix, aSx, aSy, aSz);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1mul
+(JNIEnv* aEnv, jclass, jbyteArray aProdArray, jbyteArray aLeftArray, jbyteArray aRightArray)
+{
+
+    if (aRightArray == NULL || aLeftArray == NULL || aProdArray == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return;
+    }
+
+    {
+        const Matrix *right = (const Matrix *)(aEnv->GetByteArrayElements(aRightArray, NULL));
+        if (right == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        const Matrix *left = (const Matrix *)(aEnv->GetByteArrayElements(aLeftArray, NULL));
+        if (left == NULL)
+        {
+            aEnv->ReleaseByteArrayElements(aRightArray, (jbyte*)right, JNI_ABORT);
+
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        Matrix *prod = (Matrix *)(aEnv->GetByteArrayElements(aProdArray, NULL));
+        if (prod == NULL)
+        {
+            aEnv->ReleaseByteArrayElements(aRightArray, (jbyte*)right, JNI_ABORT);
+            aEnv->ReleaseByteArrayElements(aLeftArray, (jbyte*)left, JNI_ABORT);
+
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        Matrix temp;
+        M3G_DO_LOCK
+        m3gMatrixProduct(&temp, left, right);
+        M3G_DO_UNLOCK(aEnv)
+
+        *prod = temp;
+
+        aEnv->ReleaseByteArrayElements(aRightArray, (jbyte*)right, JNI_ABORT);
+        aEnv->ReleaseByteArrayElements(aLeftArray, (jbyte*)left, JNI_ABORT);
+        aEnv->ReleaseByteArrayElements(aProdArray, (jbyte*)prod, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1setMatrix
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloatArray aSrcArray)
+{
+    Matrix *matrix = NULL;
+
+    if (aSrcArray == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return;
+    }
+    if (aEnv->GetArrayLength(aSrcArray) < 16)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return;
+    }
+
+    matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    float* srcArray = aEnv->GetFloatArrayElements(aSrcArray, NULL);
+    if (srcArray == NULL)
+    {
+        aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3G_DO_LOCK
+    m3gSetMatrixRows(matrix, (const float *)srcArray);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseFloatArrayElements(aSrcArray, srcArray, JNI_ABORT);
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1transpose
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix)
+{
+    Matrix tpos;
+    Matrix *matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+    M3G_DO_LOCK
+    m3gMatrixTranspose(&tpos, matrix);
+    m3gCopyMatrix(matrix, &tpos);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1invert
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix)
+{
+    Matrix *matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3G_BEGIN_PROFILE(M3G_PROFILE_TRANSFORM_INVERT);
+    M3G_DO_LOCK
+    if (!m3gInvertMatrix(matrix))
+    {
+        aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, JNI_ABORT);
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/ArithmeticException");
+        M3G_DO_UNLOCK(aEnv)
+        return;
+    }
+    M3G_DO_UNLOCK(aEnv)
+    M3G_END_PROFILE(M3G_PROFILE_TRANSFORM_INVERT);
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transform__1rotate
+(JNIEnv* aEnv, jclass, jbyteArray aMatrix, jfloat aAngle, jfloat aAx, jfloat aAy, jfloat aAz)
+{
+    Matrix *matrix = NULL;
+
+    if (aAx == 0 && aAy == 0 && aAz == 0 && aAngle != 0)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return;
+    }
+
+    matrix = (Matrix *)(aEnv->GetByteArrayElements(aMatrix, NULL));
+    if (matrix == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+        return;
+    }
+
+    M3G_DO_LOCK
+    m3gPostRotateMatrix(matrix, aAngle, aAx, aAy, aAz);
+    M3G_DO_UNLOCK(aEnv)
+
+    aEnv->ReleaseByteArrayElements(aMatrix, (jbyte*)matrix, 0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/transformable.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,195 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_Transformable.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1preRotate
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aAngle, jfloat aAx, jfloat aAy, jfloat aAz)
+{
+    M3G_DO_LOCK
+    m3gPreRotate((M3GTransformable)aHandle, aAngle, aAx, aAy, aAz);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1getComposite
+(JNIEnv* aEnv, jclass, jint aHandle, jbyteArray aDstArray)
+{
+    if (validateArray(aEnv, aDstArray, sizeof(M3GMatrix)))
+    {
+        jbyte* dstArray = aEnv->GetByteArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+
+        M3G_DO_LOCK
+        m3gGetCompositeTransform((M3GTransformable)aHandle, (M3GMatrix *)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseByteArrayElements(aDstArray, dstArray, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1setTransform
+(JNIEnv* aEnv, jclass, jint aHandle, jbyteArray aSrcArray)
+{
+    if (aSrcArray != NULL)
+    {
+        jbyte* srcArray = aEnv->GetByteArrayElements(aSrcArray, NULL);
+        if (srcArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+        M3G_DO_LOCK
+        m3gSetTransform((M3GTransformable)aHandle, (const M3GMatrix *)srcArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseByteArrayElements(aSrcArray, srcArray, JNI_ABORT);
+    }
+    else
+    {
+        M3G_DO_LOCK
+        m3gSetTransform((M3GTransformable)aHandle, NULL);
+        M3G_DO_UNLOCK(aEnv)
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1setTranslation
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aTx, jfloat aTy, jfloat aTz, jboolean aAbsolute)
+{
+
+    if (aAbsolute)
+    {
+        M3G_DO_LOCK
+        m3gSetTranslation((M3GTransformable)aHandle, aTx, aTy, aTz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+    else
+    {
+        M3G_DO_LOCK
+        m3gTranslate((M3GTransformable)aHandle, aTx, aTy, aTz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1setOrientation
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aAngle, jfloat aAx, jfloat aAy, jfloat aAz, jboolean aAbsolute)
+{
+
+    if (aAbsolute)
+    {
+        M3G_DO_LOCK
+        m3gSetOrientation((M3GTransformable)aHandle, aAngle, aAx, aAy, aAz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+    else
+    {
+        M3G_DO_LOCK
+        m3gPostRotate((M3GTransformable)aHandle, aAngle, aAx, aAy, aAz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1getTransform
+(JNIEnv* aEnv, jclass, jint aHandle, jbyteArray aDstArray)
+{
+    if (validateArray(aEnv, aDstArray, sizeof(M3GMatrix)))
+    {
+        jbyte* dstArray = aEnv->GetByteArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+        M3G_DO_LOCK
+        m3gGetTransform((M3GTransformable)aHandle, (M3GMatrix *)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseByteArrayElements(aDstArray, dstArray, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1setScale
+(JNIEnv* aEnv, jclass, jint aHandle, jfloat aSx, jfloat aSy, jfloat aSz, jboolean aAbsolute)
+{
+
+    if (aAbsolute)
+    {
+        M3G_DO_LOCK
+        m3gSetScale((M3GTransformable)aHandle, aSx, aSy, aSz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+    else
+    {
+        M3G_DO_LOCK
+        m3gScale((M3GTransformable)aHandle, aSx, aSy, aSz);
+        M3G_DO_UNLOCK(aEnv)
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1getTranslation
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aDstArray)
+{
+    if (validateArray(aEnv, (jbyteArray)aDstArray, 3))
+    {
+        jfloat* dstArray = aEnv->GetFloatArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+        M3G_DO_LOCK
+        m3gGetTranslation((M3GTransformable)aHandle, (M3Gfloat*)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseFloatArrayElements(aDstArray, dstArray, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1getScale
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aDstArray)
+{
+    if (validateArray(aEnv, (jbyteArray)aDstArray, 3))
+    {
+        jfloat* dstArray = aEnv->GetFloatArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+        M3G_DO_LOCK
+        m3gGetScale((M3GTransformable)aHandle, (M3Gfloat*)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseFloatArrayElements(aDstArray, dstArray, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_Transformable__1getOrientation
+(JNIEnv* aEnv, jclass, jint aHandle, jfloatArray aDstArray)
+{
+    if (validateArray(aEnv, (jbyteArray)aDstArray, 4))
+    {
+        jfloat* dstArray = aEnv->GetFloatArrayElements(aDstArray, NULL);
+        if (dstArray == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+        M3G_DO_LOCK
+        m3gGetOrientation((M3GTransformable)aHandle, (M3Gfloat*)dstArray);
+        M3G_DO_UNLOCK(aEnv)
+        aEnv->ReleaseFloatArrayElements(aDstArray, dstArray, 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/triangleStripArray.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_TriangleStripArray.h"
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_TriangleStripArray__1createImplicit
+(JNIEnv* aEnv, jclass, jint aM3g, jint first, jintArray aLengthArray)
+{
+    M3GIndexBuffer buffer;
+
+    int *lengths = NULL;
+    if (aLengthArray)
+    {
+        lengths = (int *)(aEnv->GetIntArrayElements(aLengthArray, NULL));
+        if (lengths == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    int count = aLengthArray != NULL ? aEnv->GetArrayLength(aLengthArray) : 0;
+
+    M3G_DO_LOCK
+    buffer = m3gCreateImplicitStripBuffer((M3GInterface)aM3g,
+                                          count,
+                                          lengths,
+                                          first);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (lengths)
+    {
+        aEnv->ReleaseIntArrayElements(aLengthArray, lengths, JNI_ABORT);
+    }
+
+    return (M3Guint) buffer;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_TriangleStripArray__1createExplicit
+(JNIEnv* aEnv, jclass, jint aM3g, jintArray aIndices, jintArray aLengths)
+{
+    M3GIndexBuffer buffer;
+
+
+    jint* lengths = NULL;
+    jint* indices = NULL;
+    if (aLengths)
+    {
+        lengths = aEnv->GetIntArrayElements(aLengths, NULL);
+        if (lengths == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    if (aIndices)
+    {
+        indices = aEnv->GetIntArrayElements(aIndices, NULL);
+        if (indices == NULL)
+        {
+            if (lengths)
+            {
+                aEnv->ReleaseIntArrayElements(aLengths, lengths, JNI_ABORT);
+            }
+
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+    M3G_DO_LOCK
+    buffer = m3gCreateStripBuffer((M3GInterface)aM3g,
+                                  M3G_TRIANGLE_STRIPS,
+                                  aLengths != NULL ? aEnv->GetArrayLength(aLengths) : 0,
+                                  (M3Gsizei *)lengths,
+                                  M3G_INT,
+                                  aIndices != NULL ? aEnv->GetArrayLength(aIndices) : 0,
+                                  (void *)indices);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (indices)
+    {
+        aEnv->ReleaseIntArrayElements(aIndices, indices, JNI_ABORT);
+    }
+    if (lengths)
+    {
+        aEnv->ReleaseIntArrayElements(aLengths, lengths, JNI_ABORT);
+    }
+
+    return (M3Guint) buffer;
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_TriangleStripArray__1getIndexCount
+(JNIEnv* aEnv, jclass, jint aHTsa)
+{
+    M3G_DO_LOCK
+    jint size = (jint)m3gGetBatchSize((M3GIndexBuffer)aHTsa, 0);
+    M3G_DO_UNLOCK(aEnv)
+    return size;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_TriangleStripArray__1getIndices
+(JNIEnv* aEnv, jclass, jint aHTsa, jintArray aIndices)
+{
+    jint* indices = NULL;
+
+    if (aIndices)
+    {
+        indices = aEnv->GetIntArrayElements(aIndices, NULL);
+        if (indices == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+    M3G_DO_LOCK
+    m3gGetBatchIndices((M3GIndexBuffer)aHTsa, 0, indices);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (indices)
+    {
+        aEnv->ReleaseIntArrayElements(aIndices, indices, 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/vertexArray.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include "javax_microedition_m3g_VertexArray.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexArray__1setShort
+(JNIEnv* aEnv, jclass, jint aHandle, jint aFirst, jint aCount, jshortArray aSrcArray)
+{
+    int srcLength = 0;
+    unsigned short *srcData = NULL;
+    if (aSrcArray)
+    {
+        srcData = (unsigned short *)aEnv->GetShortArrayElements(aSrcArray, NULL);
+        if (srcData == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    srcLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    M3G_DO_LOCK
+    m3gSetVertexArrayElements(
+        (M3GVertexArray) aHandle, aFirst, aCount, srcLength, M3G_SHORT, srcData);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aSrcArray)
+    {
+        aEnv->ReleaseShortArrayElements(aSrcArray, (jshort*)srcData, JNI_ABORT);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexArray__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g, jint aNumVertices, jint aNumComponents, jint aComponentSize)
+{
+    M3G_DO_LOCK
+    M3GVertexArray va = m3gCreateVertexArray((M3GInterface)aM3g,
+                        aNumVertices,
+                        aNumComponents,
+                        (aComponentSize == 1) ? M3G_BYTE :
+                        (aComponentSize == 2) ? M3G_SHORT :
+                        M3G_INT);
+    M3G_DO_UNLOCK(aEnv)
+    return (M3Guint) va;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexArray__1setByte
+(JNIEnv* aEnv, jclass, jint aHandle, jint aFirst, jint aCount, jbyteArray aSrcArray)
+{
+    int srcLength = 0;
+    unsigned char *srcData = NULL;
+    if (aSrcArray)
+    {
+        srcData = (unsigned char *)aEnv->GetByteArrayElements(aSrcArray, NULL);
+        if (srcData == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    srcLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    if (validateArray(aEnv, aSrcArray, aCount))
+    {
+        M3G_DO_LOCK
+        m3gSetVertexArrayElements(
+            (M3GVertexArray) aHandle, aFirst, aCount, srcLength, M3G_BYTE, srcData);
+        M3G_DO_UNLOCK(aEnv)
+    }
+
+    if (aSrcArray)
+    {
+        aEnv->ReleaseByteArrayElements(aSrcArray, (jbyte*)srcData, JNI_ABORT);
+    }
+}
+
+/* M3G 1.1 JNI Calls */
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexArray__1getByte
+(JNIEnv* aEnv, jclass, jint aHandle, jint aFirstVertex, jint aNumVertices, jbyteArray aSrcArray)
+{
+    int dstLength = 0;
+    unsigned char *dstData = NULL;
+    if (aSrcArray)
+    {
+        dstData = (unsigned char *)aEnv->GetByteArrayElements(aSrcArray, NULL);
+        if (dstData == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    dstLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    /*
+    * Parameter checking and exception throwing is handled in engine side, thus no
+    * checking / validation is done here.
+    */
+    M3G_DO_LOCK
+    m3gGetVertexArrayElements((M3GVertexArray) aHandle, aFirstVertex, aNumVertices, dstLength, M3G_BYTE, dstData);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aSrcArray)
+    {
+        /* copy dstData array to java side and release both arrays */
+        aEnv->ReleaseByteArrayElements(aSrcArray, (jbyte*)dstData, 0);
+    }
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexArray__1getShort
+(JNIEnv* aEnv, jclass, jint aHandle, jint aFirstVertex, jint aNumVertices, jshortArray aSrcArray)
+{
+    int dstLength = 0;
+    unsigned short *dstData = NULL;
+    if (aSrcArray)
+    {
+        dstData = (unsigned short *)aEnv->GetShortArrayElements(aSrcArray, NULL);
+        if (dstData == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    dstLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    /*
+    * Parameter checking and exception throwing is handled in engine side, thus no
+    * checking / validation is done here.
+    */
+    M3G_DO_LOCK
+    m3gGetVertexArrayElements((M3GVertexArray) aHandle, aFirstVertex, aNumVertices, dstLength, M3G_SHORT, dstData);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aSrcArray)
+    {
+        /* copy dstData array to java side and release both arrays */
+        aEnv->ReleaseShortArrayElements(aSrcArray, (jshort*)dstData, 0);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexArray__1getComponentCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3Gsizei size;
+    M3G_DO_LOCK
+    m3gGetVertexArrayParams((M3GVertexArray)aHandle, NULL, &size, NULL, NULL);
+    M3G_DO_UNLOCK(aEnv)
+    return (jint)size;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexArray__1getComponentType
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3Gdatatype type;
+    M3G_DO_LOCK
+    m3gGetVertexArrayParams((M3GVertexArray)aHandle, NULL, NULL, &type, NULL);
+    M3G_DO_UNLOCK(aEnv)
+    type = (type == M3G_BYTE) ? (M3Gdatatype) 1 : (M3Gdatatype) 2;
+    return (jint)type;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexArray__1getVertexCount
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3Gsizei count;
+    M3G_DO_LOCK
+    m3gGetVertexArrayParams((M3GVertexArray)aHandle, &count, NULL, NULL, NULL);
+    M3G_DO_UNLOCK(aEnv)
+    return (jint)count;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/vertexBuffer.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_VertexBuffer.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexBuffer__1setTexCoords
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aTexUnit, jint aHArray, jfloat aScale, jfloatArray aSrcArray)
+{
+    int biasLength = 0;
+    float *bias = NULL;
+    if (aSrcArray)
+    {
+        bias = (float *)aEnv->GetFloatArrayElements(aSrcArray, NULL);
+        if (bias == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    biasLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    M3G_DO_LOCK
+    m3gSetTexCoordArray((M3GVertexBuffer)aHBuffer, aTexUnit, (M3GVertexArray)aHArray, aScale, bias, biasLength);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aSrcArray)
+    {
+        aEnv->ReleaseFloatArrayElements(aSrcArray, bias, JNI_ABORT);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexBuffer__1getArray
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aWhich, jfloatArray aDstArray)
+{
+    int dstLength = 0;
+    float *dstData = NULL;
+    if (aDstArray)
+    {
+        dstData = (float *)aEnv->GetFloatArrayElements(aDstArray, NULL);
+        if (dstData == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return 0;
+        }
+    }
+
+    dstLength = aDstArray ? aEnv->GetArrayLength(aDstArray) : 0;
+
+    M3G_DO_LOCK
+    M3Guint ret = (M3Guint)m3gGetVertexArray((M3GVertexBuffer)aHBuffer, aWhich, dstData, dstLength);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aDstArray)
+    {
+        aEnv->ReleaseFloatArrayElements(aDstArray, dstData, 0);
+    }
+
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexBuffer__1getDefaultColor
+(JNIEnv* aEnv, jclass, jint aHBuffer)
+{
+    M3G_DO_LOCK
+    jint color = (M3Guint)m3gGetVertexDefaultColor((M3GVertexBuffer)aHBuffer);
+    M3G_DO_UNLOCK(aEnv)
+    return color;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexBuffer__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    M3GVertexBuffer vb = m3gCreateVertexBuffer((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return (M3Guint) vb;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexBuffer__1setNormals
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aHArray)
+{
+    M3G_DO_LOCK
+    m3gSetNormalArray((M3GVertexBuffer) aHBuffer, (M3GVertexArray) aHArray);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexBuffer__1setDefaultColor
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aARGB)
+{
+    M3G_DO_LOCK
+    m3gSetVertexDefaultColor((M3GVertexBuffer)aHBuffer, aARGB);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexBuffer__1setColors
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aHArray)
+{
+    M3G_DO_LOCK
+    m3gSetColorArray((M3GVertexBuffer) aHBuffer, (M3GVertexArray) aHArray);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_VertexBuffer__1setVertices
+(JNIEnv* aEnv, jclass, jint aHBuffer, jint aHArray, jfloat aScale, jfloatArray aSrcArray)
+{
+    int biasLength = 0;
+    float *bias = NULL;
+    if (aSrcArray)
+    {
+        bias = (float *)aEnv->GetFloatArrayElements(aSrcArray, NULL);
+        if (bias == NULL)
+        {
+            M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError");
+            return;
+        }
+    }
+
+    biasLength = aSrcArray ? aEnv->GetArrayLength(aSrcArray) : 0;
+
+    M3G_DO_LOCK
+    m3gSetVertexArray((M3GVertexBuffer)aHBuffer, (M3GVertexArray)aHArray, aScale, bias, biasLength);
+    M3G_DO_UNLOCK(aEnv)
+
+    if (aSrcArray)
+    {
+        aEnv->ReleaseFloatArrayElements(aSrcArray, bias, JNI_ABORT);
+    }
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_VertexBuffer__1getVertexCount
+(JNIEnv* aEnv, jclass, jint aHBuffer)
+{
+    M3G_DO_LOCK
+    jint count = (M3Guint)m3gGetVertexCount((M3GVertexBuffer)aHBuffer);
+    M3G_DO_UNLOCK(aEnv)
+    return count;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/jni/world.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "javax_microedition_m3g_World.h"
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_World__1setBackground
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHBackground)
+{
+    M3G_DO_LOCK
+    m3gSetBackground((M3GWorld)aHandle, (M3GBackground)aHBackground);
+    M3G_DO_UNLOCK(aEnv)
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_World__1ctor
+(JNIEnv* aEnv, jclass, jint aM3g)
+{
+    M3G_DO_LOCK
+    jint handle = (M3Guint)m3gCreateWorld((M3GInterface)aM3g);
+    M3G_DO_UNLOCK(aEnv)
+    return handle;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_World__1getBackground
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint bg = (M3Guint)m3gGetBackground((M3GWorld)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return bg;
+}
+
+JNIEXPORT jint JNICALL Java_javax_microedition_m3g_World__1getActiveCamera
+(JNIEnv* aEnv, jclass, jint aHandle)
+{
+    M3G_DO_LOCK
+    jint camera = (M3Guint)m3gGetActiveCamera((M3GWorld)aHandle);
+    M3G_DO_UNLOCK(aEnv)
+    return camera;
+}
+
+JNIEXPORT void JNICALL Java_javax_microedition_m3g_World__1setActiveCamera
+(JNIEnv* aEnv, jclass, jint aHandle, jint aHCamera)
+{
+    M3G_DO_LOCK
+    m3gSetActiveCamera((M3GWorld)aHandle, (M3GCamera)aHCamera);
+    M3G_DO_UNLOCK(aEnv)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/m3g_jsr184.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+/*!
+ * \file \brief Global methods for JSR-184
+ *
+ * This file is <em>included</em>, not linked, by specific VM bindings.
+ *
+ */
+
+#ifndef M3G_JAVA_INCLUDE
+#   error included by m3g_<platform>_java_api.c; do not compile separately.
+#endif
+
+#include <m3g/m3g_core.h>
+#include "m3g_jsr184.h"
+
+/*----------------------------------------------------------------------
+ * Internal functions
+ *--------------------------------------------------------------------*/
+
+/*!
+ * \brief Returns the number of bytes per pixel for a JSR-184 pixel
+ * format
+ *
+ * \note Dependent on constants in Image2D.java
+ */
+static M3Guint jsr184BytesPerPixel(int jsrFormat)
+{
+    switch (jsrFormat)
+    {
+    case M3G_ALPHA:
+        return 1;
+    case M3G_LUMINANCE:
+        return 1;
+    case M3G_LUMINANCE_ALPHA:
+        return 2;
+    case M3G_RGB:
+        return 3;
+    case M3G_RGBA:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+/*!
+ * \brief Returns m3g core pixel format for qiven Qt based pixel format
+ *
+ */
+static M3GPixelFormat mapQtPixelformat(int qtFormat)
+{
+    switch (qtFormat)
+    {
+    case QImage::Format_RGB32:
+    case QImage::Format_ARGB32:
+        return M3G_ARGB8;
+    case QImage::Format_RGB888:
+        return M3G_RGB8;
+    case QImage::Format_RGB444:
+        return M3G_RGB4;
+    case QImage::Format_RGB16:
+        return M3G_RGB565;
+    default:
+        return M3G_NO_FORMAT;
+    }
+}
+
+
+/*!
+ * \brief Return a MIDP exception string corresponding to an M3G error
+ */
+static const char *jsr184Exception(M3Genum errorCode)
+{
+    switch (errorCode)
+    {
+    case M3G_NO_ERROR:
+        return NULL;
+    case M3G_OUT_OF_MEMORY:
+        return "java/lang/OutOfMemoryError";
+    case M3G_INVALID_OPERATION:
+        return "java/lang/IllegalStateException";
+    case M3G_INVALID_INDEX:
+        return "java/lang/IndexOutOfBoundsException";
+    case M3G_NULL_POINTER:
+        return "java/lang/NullPointerException";
+    case M3G_ARITHMETIC_ERROR:
+        return "java/lang/ArithmeticException";
+    case M3G_IO_ERROR:
+        return "java/io/IOException";
+    default:
+        return "java/lang/IllegalArgumentException";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/m3g_kvm_api.inl	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,123 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+/*!
+ * \file \brief Java bindings for the K Virtual Machine native API
+ *
+ */
+
+
+
+#ifndef M3G_JAVA_INCLUDE
+#   error included by m3g_<platform>_java_api.c; do not compile separately.
+#endif
+
+/*!
+ * \brief Macros for dispatching exceptions to vm.
+ *
+ */
+#include <jni.h>
+#define M3G_RAISE_EXCEPTION(aEnv, aException){\
+                 if (aEnv != NULL){\
+                jclass jException = aEnv->FindClass(aException);\
+                if (jException != NULL){\
+                    aEnv->ThrowNew(jException, NULL);\
+         }}}\
+ 
+
+/*!
+ * \brief Macros for serializing m3gcore function calls 
+ * in native threading environment.
+ */
+#include "CSynchronization.h"
+#define M3G_DO_LOCK CSynchronization::InstanceL()->Lock();
+#define M3G_DO_UNLOCK(aEnv) {\
+                    TInt errorCode = CSynchronization::InstanceL()->GetErrorCode();\
+                    if ( errorCode != 0){\
+                            M3G_RAISE_EXCEPTION(aEnv, jsr184Exception(errorCode));\
+                    }\
+                    CSynchronization::InstanceL()->Unlock();\
+                    }\
+ 
+
+/*----------------------------------------------------------------------
+ * Internal data types
+ *--------------------------------------------------------------------*/
+
+
+
+/*----------------------------------------------------------------------
+ * Internal utility functions
+ *--------------------------------------------------------------------*/
+
+/*!
+ * \brief Checks that a Java array is non-null and meets a minimum
+ * length requirement
+ *
+ * Throws NullPointerException or IllegalArgumentException if
+ * constraints violated.
+ */
+static M3Gbool validateArray(JNIEnv* aEnv, const jbyteArray aArray, M3Gsizei aMinLength)
+{
+    if (aArray == NULL)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/NullPointerException");
+        return M3G_FALSE;
+    }
+
+    if (aEnv->GetArrayLength(aArray) < aMinLength)
+    {
+        M3G_RAISE_EXCEPTION(aEnv, "java/lang/IllegalArgumentException");
+        return M3G_FALSE;
+    }
+
+    return M3G_TRUE;
+}
+
+#include "m3g_jsr184.inl"
+#include "jni/triangleStripArray.inl"
+#include "jni/vertexBuffer.inl"
+#include "jni/fog.inl"
+#include "jni/polygonMode.inl"
+#include "jni/object3d.inl"
+#include "jni/node.inl"
+#include "jni/group.inl"
+#include "jni/skinnedMesh.inl"
+#include "jni/camera.inl"
+#include "jni/vertexArray.inl"
+#include "jni/transform.inl"
+#include "jni/graphics3d.inl"
+#include "jni/platform.inl"
+#include "jni/compositingMode.inl"
+#include "jni/world.inl"
+#include "jni/material.inl"
+#include "jni/keyframeSequence.inl"
+#include "jni/sprite3d.inl"
+#include "jni/mesh.inl"
+#include "jni/animationTrack.inl"
+#include "jni/texture2d.inl"
+#include "jni/morphingMesh.inl"
+#include "jni/transformable.inl"
+#include "jni/background.inl"
+#include "jni/image2d.inl"
+#include "jni/appearance.inl"
+#include "jni/light.inl"
+#include "jni/animationController.inl"
+#include "jni/interface.inl"
+#include "jni/loader.inl"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/src/m3g_symbian_java_api.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2003 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:
+*
+*/
+
+
+/*!
+ * \file \brief Symbian Java bindings
+ *
+ */
+
+#include <M3G/m3g_core.h> // Please check if this header is needed
+
+#include <jni.h>
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "graphics.h"
+#include <QDebug>
+//#include "gdi.h" // CFbsBitmap
+#include "fbs.h"
+
+#include <GLES/egl.h>
+
+struct ImageStruct
+{
+    CFbsBitmap* color;
+    CFbsBitmap* mask;
+};
+
+
+
+#define M3G_ASSERT(a)           ((void)(a))
+#define M3G_BEGIN_PROFILE(a)    ((void)(a))
+#define M3G_END_PROFILE(a)      ((void)(a))
+
+#define Matrix  M3GMatrix
+#define Quat    M3GQuat
+#define Vec4    M3GVec4
+
+#define M3G_JAVA_INCLUDE
+extern "C"
+{
+#include "m3g_kvm_api.inl"
+}
+#undef M3G_JAVA_INCLUDE
+
--- a/javauis/mmapi_qt/baseline/javasrc.emc/com/nokia/microedition/media/ManagerImpl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc.emc/com/nokia/microedition/media/ManagerImpl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -466,8 +466,30 @@
         {
             throw new IllegalArgumentException("Locator is null.");
         }
-        InternalPlayer player = iProtocolFactory.createPlayer(
-                                    new Locator(aLocator));
+        InternalPlayer player =null;
+        /// Implementation done for java ui 3.x req
+        // in case of AnimationPlayer, we won't be using the ProtocolFactory class.
+        //
+        Enumeration plugins = iPlugIns.elements();
+        AnimationPlayerFactory apf=null;
+        while (plugins.hasMoreElements() && (player == null))
+        {
+            PlugIn temp = (PlugIn) plugins.nextElement();
+            if (temp instanceof AnimationPlayerFactory)
+            {
+                apf = (AnimationPlayerFactory) temp;
+                break;
+            }
+        }
+        if (apf!=null)
+        {
+            player=apf.createPlayer(aLocator);
+        }
+        ////////////////////////////////////////////////////////
+        // if player is still null, try to create the native player
+        if (player==null)
+            player =iProtocolFactory.createPlayer(
+                        new Locator(aLocator));
         if (player == null)
         {
             throw new MediaException("Locator not supported: " +
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayer.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayer.java	Fri Jun 11 13:33:44 2010 +0300
@@ -16,12 +16,14 @@
 */
 package com.nokia.microedition.media.animation;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.Enumeration;
 import java.util.Hashtable;
 
 import javax.microedition.media.Control;
 import javax.microedition.media.MediaException;
+import javax.microedition.media.Player;
 import javax.microedition.media.PlayerListener;
 import javax.microedition.media.protocol.DataSource;
 
@@ -43,333 +45,418 @@
 import com.nokia.mj.impl.nokialcdui.LCDUIInvoker;
 import com.nokia.mj.impl.utils.Logger;
 
-public class AnimationPlayer extends PlayerBase {
-	// GIF image information, array length will be equal to the number of frames in image 
-	protected ImageData [] iImageData;
-	// number of times we need to repeat the animation
-	// by default it's value is one 
-	private int iTotalLoopCount=1;
-	// this holds all control related to this player 
-	private Hashtable iControls= new Hashtable();
-	// Current frame index of the Animation file
-	private int iFrameIndex;
-	// Current Loop Count 
-	private int iCurrentLoopCount;
-	// Indicates if looping indefinitely 
-	private boolean iRepeatForeEver;
-	// Current rate of the player, Used for RateControl
-	// Currently only two mode are supported 
-	// paused and default rate 
-	private int iCurrentRate;
-	// Display object of the eSWT API, creating this object will integrate the current java code with eSWT API. 
-	private Display iDisplay; 
-	// Control object of ESWT API, return from LCDUIInvoker. 
-	org.eclipse.swt.widgets.Control iControl;
-	// Following constants are used for comparison of the string, throughout the class 
-	private static final String ANIMATION_CONTENT_TYPE = "image/gif";
-	private static final String fVideoControl 				= VideoControl.class.getName();
-	private static final String fFramePositioningControl 	= FramePositioningControl.class.getName();
-	private static final String fStopTimeControl			= StopTimeControl.class.getName();
-	private static final String fRateControl				= RateControl.class.getName();
-	 
-	/**
+public class AnimationPlayer extends PlayerBase
+{
+    // GIF image information, array length will be equal to the number of frames in image
+    protected ImageData [] iImageData;
+    // number of times we need to repeat the animation
+    // by default it's value is one
+    private int iTotalLoopCount=1;
+    // this holds all control related to this player
+    private Hashtable iControls= new Hashtable();
+    // Current frame index of the Animation file
+    private int iFrameIndex;
+    // Current Loop Count
+    private int iCurrentLoopCount;
+    // Indicates if looping indefinitely
+    private boolean iRepeatForeEver;
+    // Current rate of the player, Used for RateControl
+    // Currently only two mode are supported
+    // paused and default rate
+    private int iCurrentRate;
+    // Display object of the eSWT API, creating this object will integrate the current java code with eSWT API.
+    private Display iDisplay;
+    // Control object of ESWT API, return from LCDUIInvoker.
+    org.eclipse.swt.widgets.Control iControl;
+    // Following constants are used for comparison of the string, throughout the class
+    private static final String ANIMATION_CONTENT_TYPE      = "image/gif";
+    private static final String fVideoControl               = VideoControl.class.getName();
+    private static final String fFramePositioningControl    = FramePositioningControl.class.getName();
+    private static final String fStopTimeControl            = StopTimeControl.class.getName();
+    private static final String fRateControl                = RateControl.class.getName();
+
+    /**
      * Default control package. Used when getting control with
      * getControl method which appends default control package if package is
      * not specified.
      */
     private static final String CONTROL_DEFAULT_PACKAGE =
         "javax.microedition.media.control.";
-    
-	//For Player listener 
-	protected PlayerListenerImpl iPlayerListenerImpl;
-	//Image to be displayed, an object of eSWT API. 
-	protected Image iImage;
-	// Actual dimension of the image, this should be initialized while creating the player
-	// as user can change the size of the image later, in that case too, getSourceheight and getSourceWidth 
-	// of VideoControl should return the actual width and height of the image 
-	private Point iSourceDimension;
-	// Total time taken so far to playe the animation 
-	private long iMediaTime;
-	// Time at which, player should be stopped
-	// This will set through StopTimeControl.setTime();
-	private long iStopTime=Long.MAX_VALUE;
-	
-	// Display Location, of the image
-	// there won't be any use of this, in case of Form(customItem)
-	private Point iDisplayLocation= new Point(0,0);
+
+    //For Player listener
+    protected PlayerListenerImpl iPlayerListenerImpl;
+    //Image to be displayed, an object of eSWT API.
+    protected Image iImage;
+    // Actual dimension of the image, this should be initialized while creating the player
+    // as user can change the size of the image later, in that case too, getSourceheight and getSourceWidth
+    // of VideoControl should return the actual width and height of the image
+    private Point iSourceDimension;
+    // Total time taken so far to playe the animation
+    private long iMediaTime;
+    // Time at which, player should be stopped
+    // This will set through StopTimeControl.setTime();
+    private long iStopTime=Long.MAX_VALUE;
+
+    // Display Location, of the image
+    // there won't be any use of this, in case of Form(customItem)
+    private Point iDisplayLocation= new Point(0,0);
 
-	/**
-	 * 
-	 * @param ds DataSource which contains the data to be displayed 
-	 */
-	public AnimationPlayer(DataSource ds){
-		iPlayerListenerImpl= new PlayerListenerImpl(this);
-		//TODO check if we can do it in better way 
-		// this is temporary solution
-		// for this I have written two functions getDataSource and getInputStream function 
-		BufferDataSource bds =(BufferDataSource )ds;
-		InputStreamDataSource isds=(InputStreamDataSource)bds.getDataSource();
-		InputStreamSourceStream isss=(InputStreamSourceStream )isds.getStreams()[0];
-		InputStream is = isss.getInputStream();
-		
-		if(is!=null){
-			ImageLoader imageLoader= new ImageLoader();
-			iImageData=imageLoader.load(is);
-			//iRepeatCount=imageLoader.repeatCount;
-			iSourceDimension= new Point(imageLoader.logicalScreenWidth, imageLoader.logicalScreenHeight);
-		}
-		pupulateControl();
-	}
-	
-	/**
-	 * 
-	 * @param locator
-	 * @throws SWTException
-	 */
-	public AnimationPlayer(String locator) throws SWTException{
-		ImageLoader imageLoader= new ImageLoader();
-		// Following line may throw SWTException 
-		iImageData=imageLoader.load(locator);
-		//iRepeatCount=imageLoader.repeatCount;
-		iSourceDimension= new Point(imageLoader.logicalScreenWidth, imageLoader.logicalScreenHeight);
-		pupulateControl();
-	}
-	
-	/**
-	 * Moved the player to close state and releases all resources, called from PlayerBase class  
-	 */
-	protected void doClose() {
-		iState=CLOSED;
-		iPlayerListenerImpl.postEvent(PlayerListener.CLOSED, null);
-	}
+    private boolean iIsControlVisible=true;
+    /**
+     *
+     * @param ds DataSource which contains the data to be displayed
+     */
+    public AnimationPlayer(DataSource ds)
+    {
+        System.out.println("AnimationPlayer(DataSource ds) + ");
+        iPlayerListenerImpl= new PlayerListenerImpl(this);
+        //TODO check if we can do it in better way
+        // this is temporary solution
+        // for this I have written two functions getDataSource and getInputStream function
+        BufferDataSource bds =(BufferDataSource)ds;
+        InputStreamDataSource isds=(InputStreamDataSource)bds.getDataSource();
+        InputStreamSourceStream isss=(InputStreamSourceStream)isds.getStreams()[0];
+        InputStream is = isss.getInputStream();
+        if (is!=null)
+        {
+            ImageLoader imageLoader= new ImageLoader();
+            iImageData=imageLoader.load(is);
+            try
+            {
+                is.close();
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace();
+            }
+            //iRepeatCount=imageLoader.repeatCount;
+            iSourceDimension= new Point(imageLoader.logicalScreenWidth, imageLoader.logicalScreenHeight);
+        }
+        populateControl();
+        System.out.println("AnimationPlayer(DataSource ds) - ");
+    }
 
-	protected void doDeallocate() {
-		// what to do here, nullify image data and display etc???
-	}
+    /**
+     *
+     * @param locator
+     * @throws SWTException
+     */
+    public AnimationPlayer(String locator) throws SWTException
+    {
+        System.out.println("AnimationPlayer(String locator) + ");
+        iPlayerListenerImpl= new PlayerListenerImpl(this);
+        ImageLoader imageLoader= new ImageLoader();
+        // Following line may throw SWTException
+        iImageData=imageLoader.load(locator);
+        //iRepeatCount=imageLoader.repeatCount;
+        iSourceDimension= new Point(imageLoader.logicalScreenWidth, imageLoader.logicalScreenHeight);
+        populateControl();
+        System.out.println("AnimationPlayer(String locator) - ");
+    }
+
+    /**
+     * Moved the player to close state and releases all resources, called from PlayerBase class
+     */
+    protected void doClose()
+    {
+        iState=CLOSED;
+        iPlayerListenerImpl.postEvent(PlayerListener.CLOSED, null);
+    }
 
-	protected void doPrefetch() throws MediaException {
-		iState=PREFETCHED;
-	}
+    /**
+     * Called from the PlayerBase class
+     */
+    protected void doDeallocate()
+    {
+        // dummy implementation
+    }
+
+    protected void doPrefetch() throws MediaException
+    {
+        iState=PREFETCHED;
+    }
+
+    protected void doRealize() throws MediaException
+    {
+        iState=REALIZED;
+        // this is temporary solution implement it in proper way
+        // initialize the iImage object with first frame
+        iImage=new Image(iDisplay, iImageData[0]);
+    }
 
-	protected void doRealize() throws MediaException {
-		iState=REALIZED;
-		// this is temporary solution implement it in proper way
-		// initialize the iImage object with first frame  
-		iImage=new Image(iDisplay, iImageData[0]);
-	}
-	
-	/**
-	 * 
-	 */
-	protected void doStop() throws MediaException {
-		// since after stopping the player the player state will move to pre-fetched state 
-		iState=PREFETCHED;
-		iPlayerListenerImpl.postEvent(PlayerListener.STOPPED, new Long(iMediaTime * 10000));
-	}
+    /**
+     *
+     */
+    protected void doStop() throws MediaException
+    {
+        // since after stopping the player the player state will move to pre-fetched state
+        iState=PREFETCHED;
+        iPlayerListenerImpl.postEvent(PlayerListener.STOPPED, new Long(iMediaTime * 10000));
+    }
 
-	public void addControl(Control aControl, String aControlType)
-			throws MediaException {
-		iControls.put(aControlType, aControl);
-	}
+    /**
+     * Function of InternalPlayer interface
+     */
+    public void addControl(Control aControl, String aControlType)
+    {
+        iControls.put(aControlType, aControl);
+    }
 
-	public void addPlayerListener(PlayerListener aPlayerListener) {
-		closeCheck();
+    /**
+     *
+     */
+    public void addPlayerListener(PlayerListener aPlayerListener)
+    {
+        closeCheck();
         iPlayerListenerImpl.addPlayerListener(aPlayerListener);
-	}
-	
-	/**
-	 * Returns the Content type("image/GIF") supported for by this player, 
-	 */
-	public String getContentType() {
-		closeCheck();
+    }
+
+    /**
+     * Returns the Content type("image/GIF") supported for by this player,
+     */
+    public String getContentType()
+    {
+        closeCheck();
         unrealizedCheck();
-		return ANIMATION_CONTENT_TYPE;
-	}
-	
-	/**
-	 * This function will return, total time in microseconds this player can be played 
-	 */
-	public long getDuration() {
-		closeCheck();
-		long time = TIME_UNKNOWN;
-		int totalNoOfFrames = iImageData.length;
-		for (int i = 0; i < totalNoOfFrames; i++) {
-			time += iImageData[i].delayTime;
-		}
-		// Since we have to return it in microsecond multiply it with 1000; 
-		return time * 10000;
-	}
-	
-	/**
-	 * This returns the total time taken, till now, to play the video.  
-	 */
-	public long getMediaTime() {
-		// Since we have to return it in microsecond multiply it with 1000;
-		return iMediaTime*10000;
-	}
+        return ANIMATION_CONTENT_TYPE;
+    }
+
+    /**
+     * This function will return, total time in microseconds this player can be played
+     */
+    public long getDuration()
+    {
+        closeCheck();
+        long time = TIME_UNKNOWN;
+        int totalNoOfFrames = iImageData.length;
+        for (int i = 0; i < totalNoOfFrames; i++)
+        {
+            time += iImageData[i].delayTime;
+        }
+        // Since we have to return it in microsecond multiply it with 1000;
+        return time * 10000;
+    }
 
-	public int getState() {
-		return iState;
-	}
-	
-	/**
-	 * Removes the specified playerListner from this player  
-	 */
-	public void removePlayerListener(PlayerListener aPlayerListener) {
-		closeCheck();
+    /**
+     * This returns the total time taken, till now, to play the video.
+     */
+    public long getMediaTime()
+    {
+        // Since we have to return it in microsecond multiply it with 1000;
+        return iMediaTime*10000;
+    }
+
+    public int getState()
+    {
+        return iState;
+    }
+
+    /**
+     * Removes the specified playerListner from this player
+     */
+    public void removePlayerListener(PlayerListener aPlayerListener)
+    {
+        closeCheck();
         iPlayerListenerImpl.removePlayerListener(aPlayerListener);
-	}
-	
-	/**
-	 * 
-	 */
-	
-	public void start() throws MediaException {
-		final String DEBUG_STR = "AnimationPlayer::start()";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "+");
-		prefetch();
-		// Only prefetched player may be started. If player is already started
-		// this method returns silently.
-		if (getState() == PREFETCHED) {
-			initialize();
-			addPaintListener(iControl);
-			iState = STARTED;
-			Thread thread = new Thread("Animation") {
-				// int frameIndex = iFrameindex;
-				int loopCount = iCurrentLoopCount;
-				GC gc = null;
-				public void run() {
-					final int noOfFrames = iImageData.length;
-					while (iFrameIndex < noOfFrames
-							&& (iRepeatForeEver || (loopCount < iTotalLoopCount))
-							&& (iState == STARTED)) {
-						final int delayTimeForNextFrame = iImageData[iFrameIndex].delayTime;
-						// Since we are going to display first frame, notify all
-						// PlayerListener that Player has started
-						if (iFrameIndex == 0) {
-							// TODO Is it true that whenever STARTED event will
-							// be posted
-							// 2nd argument in postEvent function(mediaTime)
-							// will be zero?
-							// in that case just pass the 2nd argument as zero,
-							// instead of multiplying
-							// iMediaTime with 10000.
-							iPlayerListenerImpl.postEvent(
-									PlayerListener.STARTED, new Long(
-											iMediaTime * 10000));
-						}
-						// if stop time has become more than the media time
-						// TODO This solution may not be accurate, if the delay
-						// between two frames is grater than 1 second.
-						// Do we need to implement the TimerTask only.
-						if ( iMediaTime > iStopTime ) {
-							Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"Going to post Stopped at time event to player Listener ");
-							iPlayerListenerImpl.postEvent(
-									PlayerListener.STOPPED_AT_TIME, new Long(
-											iMediaTime * 10000));
-							break;
-						}
-						iDisplay.asyncExec(new Runnable() {
-							public void run() {
-								try {
-									if (gc == null)
-										gc = new GC(iImage);
-								} catch (Exception e) {
-									// TODO Auto-generated catch block
-									// e.printStackTrace();
-								}
-								// iImage.dispose();
-								// iImage=new Image(iDisplay,
-								// iImageData[iFrameIndex]);
-								Image tempImage = new Image(iDisplay,
-										iImageData[iFrameIndex]);
-								gc.drawImage(tempImage, 0, 0);
-								tempImage.dispose();
-								iFrameIndex = (iFrameIndex + 1) % noOfFrames;
-								iControl.redraw();
-								// update the mediaTime, as Animation progress
-								iMediaTime += delayTimeForNextFrame;
+    }
+
+    /**
+     *
+     */
+
+    public void start() throws MediaException
+    {
+        final String DEBUG_STR = "AnimationPlayer::start()";
+        final long inTime= System.currentTimeMillis();
+        // Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "++++++++");
+        System.out.println(DEBUG_STR + "+++");
+        prefetch();
+        // Only prefetched player may be started. If player is already started
+        // this method returns silently.
+        if (getState() == PREFETCHED)
+        {
+            initialize();
+            iState = STARTED;
+            Thread thread = new Thread("Animation")
+            {
+                int loopCount = iCurrentLoopCount;
+                GC gc = null;
+
+                public void run()
+                {
+                    final int noOfFrames = iImageData.length;
+                    while (iFrameIndex < noOfFrames &&
+                            (iRepeatForeEver || (loopCount < iTotalLoopCount))&&
+                            (iState == STARTED))
+                    {
+                        final int delayTimeForNextFrame = iImageData[iFrameIndex].delayTime;
+                        // if stop time has become more than the media time
+                        // TODO This solution may not give the accurate result, if the delay
+                        // between two frames is grater than 1 second.
+                        // Do we need to implement the TimerTask only?
+                        if (iMediaTime > iStopTime)
+                        {
+                            iPlayerListenerImpl.postEvent(
+                                PlayerListener.STOPPED_AT_TIME, new Long(
+                                    iMediaTime * 10000));
+                            break;
+                        }
 
-								// If imageIndex becomes zero it means, all
-								// frames
-								// has been displayed
-								// So increase the loopCount
-								if (iFrameIndex == 0) {
-									// send the END_OF_MEDIA event to all
-									// listener
-									iPlayerListenerImpl.postEvent(
-											PlayerListener.END_OF_MEDIA,
-											new Long(iMediaTime * 10000));
-									loopCount++;
-									// since player is again going to start from
-									// the
-									// first frame
-									// so media time should be set to zero
-									iMediaTime = 0;
-								}
-								System.out
-										.println(DEBUG_STR
-												+ "\n End of asynchronous block imageIndex is "
-												+ iFrameIndex
-												+ " and loop count is"
-												+ loopCount);
-							}
-						});
-						try {
-							Thread.sleep(delayTimeForNextFrame * 10);
-						} catch (InterruptedException e) {
-							// TODO Auto-generated catch block
-							e.printStackTrace();
-						}
-					}
-					iCurrentLoopCount = loopCount;
-					Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR
-									+ "Came out side the while loop " + iState
-									+ " iFrameIndex " + iFrameIndex
-									+ " loopCount " + loopCount
-									);
-				}
-			};
-			thread.start();
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "-");
-	}
-	
-	/**
-	 * This function is also being called from VideoControl class, 
-	 * Since on each event 
-	 * @param aControl
-	 * @throws MediaException 
-	 */
-	 void addPaintListener(org.eclipse.swt.widgets.Control aControl) throws MediaException{
-		 iControl=aControl;
-		// iDisplay and IControl shouldn't be null here 
-		// Following line should never execute
-		// TODO check what message to provide in case of Exception 
-		if(iControl==null)
-			throw new MediaException("Update this message");
-		iDisplay.syncExec(new Runnable(){
-			public void run() {
-				iControl.addPaintListener(new PaintListener(){
-					public void paintControl(PaintEvent pe) {
-						if(iImage!=null){
-							pe.gc.drawImage(iImage, iDisplayLocation.x, iDisplayLocation.y);
-						}
-					}
-				});
-			}
-		});
-	}
-	/**
-	 * 
-	 */
-	public Control getControl(String aControlType) {
-		if (aControlType == null) {
-			throw new IllegalArgumentException("argument is null");
-		}
-		
-		String controlType = aControlType;
+                        if (iDisplay != null)
+                        {
+                            iDisplay.asyncExec(new Runnable()
+                            {
+                                public void run()
+                                {
+                                    System.out.println(DEBUG_STR+"asynchronous block +++");
+                                    // Since we are going to display first frame, notify all
+                                    // PlayerListener that Player has started
+                                    if (iFrameIndex == 0)
+                                    {
+                                        iPlayerListenerImpl.postEvent(
+                                            PlayerListener.STARTED, new Long(
+                                                iMediaTime * 10000));
+                                    }
+                                    if (gc == null)
+                                        gc = new GC(iImage);
+                                    Image tempImage = new Image(iDisplay,
+                                                                iImageData[iFrameIndex]);
+                                    gc.drawImage(tempImage, 0, 0);
+                                    tempImage.dispose();
+                                    iFrameIndex = (iFrameIndex + 1) % noOfFrames;
+                                    if (iControl != null)
+                                    {
+                                        iControl.redraw();
+                                    }
+                                    // update the mediaTime, as Animation
+                                    // progress
+                                    iMediaTime += delayTimeForNextFrame;
+                                    // If imageIndex becomes zero it means, all frames
+                                    // has been displayed
+                                    // So increase the loopCount
+                                    if (iFrameIndex == 0)
+                                    {
+                                        // send the END_OF_MEDIA event to all
+                                        // listener
+                                        iPlayerListenerImpl.postEvent(
+                                            PlayerListener.END_OF_MEDIA,
+                                            new Long(iMediaTime * 10000));
+                                        loopCount++;
+                                        // set iMediaTime to 0
+                                        iMediaTime = 0;
+                                    }
+                                    System.out.println(DEBUG_STR+"asynchronous block ---");
+                                }
+                            });
+                        }
+                        else
+                        {
+                            System.out.println(DEBUG_STR+"InitDisplaymode has not been called yet");
+                            if (iFrameIndex == 0)
+                            {
+                                iPlayerListenerImpl.postEvent(
+                                    PlayerListener.STARTED, new Long(
+                                        iMediaTime * 10000));
+                            }
+                            // This else block will execute if the initDisplayMode hasn't been called yet
+                            // check if initDisplayMode has been called
+                            initialize();
+                            iFrameIndex = (iFrameIndex + 1) % noOfFrames;
+                            iMediaTime += delayTimeForNextFrame;
+                            // post EOM event
+                            if (iFrameIndex == 0)
+                            {
+                                // send the END_OF_MEDIA event to all
+                                // listener
+                                iPlayerListenerImpl.postEvent(
+                                    PlayerListener.END_OF_MEDIA, new Long(
+                                        iMediaTime * 10000));
+                                loopCount++;
+                                // since player is again going to start from
+                                // the first frame
+                                // so media time should be set to zero
+                                iMediaTime = 0;
+                            }
+                        }
+                        try
+                        {
+                            Thread.sleep(delayTimeForNextFrame * 10);
+                        }
+                        catch (InterruptedException e)
+                        {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+                        System.out.println(DEBUG_STR+"while lopp ---");
+                    }// end of while loop
+                    iCurrentLoopCount = loopCount;
+                    // Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo, DEBUG_STR
+                    System.out.println(DEBUG_STR
+                                       + "Came out side the while loop " + iState
+                                       + " iFrameIndex " + iFrameIndex + " loopCount "
+                                       + loopCount);
+                }
+            };
+            thread.start();
+        }
+        // Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "-");
+        System.out.println(DEBUG_STR+" Total time taken:> "+(System.currentTimeMillis()-inTime)+" ---");
+    }
 
+    /**
+     * This function is also being called from VideoControl class,
+     * since on each repaint event, control is getting disposed and created each time
+     * @param aControl
+     */
+    void addPaintListener(org.eclipse.swt.widgets.Control aControl)
+    {
+        System.out.println("AnimationPlayer::addPaintListener +++");
+        iControl=aControl;
+        if (iControl != null)
+        {
+            iDisplay.syncExec(new Runnable()
+            {
+                public void run()
+                {
+                    iControl.addPaintListener(new PaintListener()
+                    {
+                        public void paintControl(PaintEvent pe)
+                        {
+                            //System.out.println("AnimationPlayer::addpaintListener paintControl "+ iImage+" iIsControlVisible "+iIsControlVisible+"current time is "+System.currentTimeMillis());
+                            System.out.println("AnimationPlayer::addPaintListener::PaintListener::paintControl");
+                            if (iImage != null && iIsControlVisible)
+                            {
+                                pe.gc.drawImage(iImage, iDisplayLocation.x,
+                                                iDisplayLocation.y);
+                            }
+                        }
+                    });
+                }
+            });
+        }
+        System.out.println("AnimationPlayer::addPaintListener ---");
+    }
+
+
+    /**
+     * This returns player Control.
+     *
+     * @param controlType - the class name of the Control. The class name should be given either
+     * as the fully-qualified name of the class; or if the package of the class is not given, the
+     * package javax.microedition.media.control is assumed.
+     *
+     *  @return the object that implements the control, or null.
+     */
+    public Control getControl(String aControlType)
+    {
+        if (aControlType == null)
+        {
+            throw new IllegalArgumentException("argument is null");
+        }
+        closeCheck();
+        unrealizedCheck();
+
+        String controlType = aControlType;
         // check if package name exists
         if (controlType.indexOf(".") == -1)
         {
@@ -379,247 +466,295 @@
         Control control = (Control)iControls.get(controlType);
         // If control does not exists with default name, check if there is
         // is a control with same type ( extends the given class name ).
-		if (control == null) {
-			try {
-				// try to create class for control
-				Class controlClass = Class.forName(controlType);
-				Enumeration elements = iControls.elements();
-				// search if any control is same type that requested control
-				while (elements.hasMoreElements()) {
-					Control tmpControl = (Control) elements.nextElement();
-					if (controlClass.isInstance(tmpControl)) {
-						// control is found
-						control = tmpControl;
-					}
-				}
-			} catch (ClassNotFoundException cnfe) // the class could not be
-													// found
-			{
-				// Exception is ignored and null is returned from this method
-			} catch (Error e) // the function failed for any other reason.
-			{
-				// Error is ignored and null is returned from this method
-			}
-		}
+        if (control == null)
+        {
+            try
+            {
+                // try to create class for control
+                Class controlClass = Class.forName(controlType);
+                Enumeration elements = iControls.elements();
+                // search if any control is same type that requested control
+                while (elements.hasMoreElements())
+                {
+                    Control tmpControl = (Control) elements.nextElement();
+                    if (controlClass.isInstance(tmpControl))
+                    {
+                        // control is found
+                        control = tmpControl;
+                    }
+                }
+            }
+            catch (ClassNotFoundException cnfe) // the class could not be
+                // found
+            {
+                // Exception is ignored and null is returned from this method
+            }
+            catch (Error e) // the function failed for any other reason.
+            {
+                // Error is ignored and null is returned from this method
+            }
+        }
         return control;
-	}
-	/**
-	 * Returns all the control associated with this player 
-	 */
-	public Control[] getControls() {
-		Control control[]= new Control[iControls.size()];
-		Enumeration enumeration= iControls.elements();
-		byte index=0;
-		while(enumeration.hasMoreElements()){
-			control[index++]=(Control)enumeration.nextElement();
-		}
-		return control;
-	}
-	/**
-	 * 
-	 */
-	public void setLoopCount(int aCount){
-		iRepeatForeEver = ( aCount == -1);
-		super.setLoopCount(aCount);
-		iTotalLoopCount=aCount;
-	}
-	/**
+    }
+    /**
+     * Returns all the control associated with this player
+     */
+    public Control[] getControls()
+    {
+        closeCheck();
+        unrealizedCheck();
+        Control control[]= new Control[iControls.size()];
+        Enumeration enumeration= iControls.elements();
+        byte index=0;
+        while (enumeration.hasMoreElements())
+        {
+            control[index++]=(Control)enumeration.nextElement();
+        }
+        return control;
+    }
+    /**
+     *
+     */
+    public void setLoopCount(int aCount)
+    {
+        iRepeatForeEver = (aCount == -1);
+        super.setLoopCount(aCount);
+        iTotalLoopCount=aCount;
+    }
+    /**
      * From PlayerBase
      * Here iFrameIndex variable will be updated according to the argument(aNow) supplied
      * We are updating the iFrameIndex variable, which is being used in the start function
-     * 
+     *
      * @see PlayerBase
      */
-	public long setMediaTime(long aNow) throws MediaException {
-		final String DEBUG_STR="AnimationPlayer::setmediaTime()";
-		long now = super.setMediaTime(aNow);
-		int totalFrames = iImageData.length;
-		int totalTime = 0;
-		for (int i = 0; i < totalFrames; i++) {
-			totalTime += iImageData[i].delayTime;
-			if (totalTime*10000 >= now ) {
-				iFrameIndex=i;
-				break;
-			}
-		}
-		// we need to update the iMediaTime as well 
-		iMediaTime=totalTime;
-		return totalTime * 10000;
-	}
-	//////////////////////////////////////////////////////////////////////////////////////
-	// Following functions are for internal use, and not exposed to MIDlet developer//////
-	/////////////////////////////////////////////////////////////////////////////////////
+    public long setMediaTime(long aNow) throws MediaException
+    {
+        final String DEBUG_STR="AnimationPlayer::setmediaTime()";
+        long now = super.setMediaTime(aNow);
+        int totalFrames = iImageData.length;
+        int totalTime = 0;
+        for (int i = 0; i < totalFrames; i++)
+        {
+            totalTime += iImageData[i].delayTime;
+            if (totalTime*10000 >= now)
+            {
+                iFrameIndex=i;
+                break;
+            }
+        }
+        // we need to update the iMediaTime as well
+        iMediaTime=totalTime;
+        return totalTime * 10000;
+    }
+    //////////////////////////////////////////////////////////////////////////////////////
+    // Following functions are for internal use, and not exposed to MIDlet developer//////
+    /////////////////////////////////////////////////////////////////////////////////////
+    /**
+     * This function is responsible for creating all controls and adding it into Controls hashtable.
+     */
+    private void populateControl()
+    {
+//      VideoControl videoControl = new VideoControl(this);
+//      FramePositioningControl fpc = new FramePositioningControl(this);
+//      StopTimeControl stc = new StopTimeControl(this);
+//      RateControl rc = new RateControl(this);
+        // there are four control provided by AnimationPlayer
+        // adding all one by one to the controlList(iControls)
+        addControl(new VideoControl(this), fVideoControl);
+        addControl(new FramePositioningControl(this), fFramePositioningControl);
+        addControl(new StopTimeControl(this), fStopTimeControl);
+        addControl(new RateControl(this), fRateControl);
+    }
+
+    /**
+     * This function initialize iControl and iDisplay object if it is null,
+     * otherwise return immediately.
+     *
+     * In case of Canvas, eSWT control will be returned immediately from VideoControl(vc.getControl()),
+     * but in case of CustomItem we need to keep polling, eSWT doesn't return the control for CustomItem
+     * until CustomItem is appended to Form.
+     */
+
+    private void initialize()
+    {
+        System.out.println("AnimationPlayer::initialize +++");
+        if (iControl == null || iDisplay == null)
+        {
+            VideoControl vc = (VideoControl) getControl(fVideoControl);
+            iDisplay = vc.getiDisplay();
+            iControl=vc.getControl();
+            addPaintListener(iControl);
+            System.out.println("AnimationPlayer::initialize iDsplay "+iDisplay+" iControl "+iControl);
+            // in case of CustomItem,
+//          while ((iControl = vc.getControl()) == null) {
+//              try {
+//                  Thread.sleep(100);
+//              } catch (InterruptedException e) {
+//                  e.printStackTrace();
+//              }
+//          }
+        }
+        System.out.println("AnimationPlayer::initialize ---");
+    }
+
+    /**
+     * This function will be called from setDisplaySize(int width, int height) of animation/VideoControl class
+     * When MIDlet developer will try to alter the size of the image
+     * @param width : to be set of the video(Animated GIF)
+     * @param height : height to be set of video(Animated GIF)
+     */
+    void updateImageData(int width, int height)
+    {
+        int noOfFrames= iImageData.length;
+        for (int i=0; i<noOfFrames; i++)
+        {
+            iImageData[i]=iImageData[i].scaledTo(width, height);
+        }
+        iImage=new Image(iDisplay, iImageData[0]);
+    }
+
+    /**
+     * Overloaded function for calling the above function
+     */
+    void updateImageData(Point aSize)
+    {
+        updateImageData(aSize.x, aSize.y);
+    }
+
+    /**
+     * This function will be called from getSnapshot() function of VideoControl class
+     * to get the snap shot of the video
+     *
+     * @param format
+     */
+    // This function is not implemented fully
+    javax.microedition.lcdui.Image getCurrentFrame(String format)
+    {
+        javax.microedition.lcdui.Image currentFrameImage= LCDUIInvoker.createLcduiImage(iImage);
+        return currentFrameImage;
+    }
+
     /**
-	 * This function is responsible for creating all controls and adding it into Controls hashtable.
-	 */
-	private void pupulateControl(){
-		VideoControl videoControl= new VideoControl(this);
-		FramePositioningControl fpc= new FramePositioningControl(this);
-		StopTimeControl stc= new StopTimeControl(this);
-		RateControl rc= new RateControl(this);
-		// there are four control provided by AnimationPlayer 
-		// adding all one by one to the controlList(iControls)
-		try {
-			addControl(videoControl, fVideoControl);
-			addControl(fpc, fFramePositioningControl);
-			addControl(stc, fStopTimeControl);
-			addControl(rc,fRateControl);
-		} catch (MediaException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-	/**
-	 * This function initialize iControl and iDisplay object if it is null,
-	 * otherwise return immediately.
-	 * 
-	 * In case of Canvas, eSWT control will be returned immediately from VideoControl(vc.getControl()), 
-	 * but in case of CustomItem we need to keep polling, eSWT doesn't return the control for CustomItem 
-	 * until CustomItem is appended to Form.      
-	 */
-	
-	private void initialize() {
-		if (iControl == null || iDisplay == null) {
-			VideoControl vc = (VideoControl) getControl(fVideoControl);
-			iDisplay = vc.getiDisplay();
-			// in case of CustomItem,
-			while ((iControl = vc.getControl()) == null) {
-				try {
-					Thread.sleep(100);
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This function will be called from setDisplaySize(int width, int height) of animation/VideoControl class
-	 * When MIDlet developer will try to alter the size of the image 
-	 * @param width : to be set of the video(Animated GIF) 
-	 * @param height : height to be set of video(Animated GIF) 
-	 */
-	void updateImageData(int width, int height){
-		int noOfFrames= iImageData.length;
-		for(int i=0;i<noOfFrames;i++){
-			iImageData[i]=iImageData[i].scaledTo(width, height);
-		}
-		iImage=new Image(iDisplay, iImageData[0]);
-	}
-	
-	/**
-	 * Overloaded function for calling the above function  
-	 */
-	void updateImageData(Point aSize){
-		updateImageData(aSize.x, aSize.y);
-	}
-	
-	/**
-	 * This function will be called from getSnapshot() function of VideoControl class 
-	 * to get the snap shot of the video 
-	 * 
-	 * @param format
-	 */
-	// This function is not implemented fully  
-	javax.microedition.lcdui.Image getCurrentFrame(String format){
-		javax.microedition.lcdui.Image currentFrameImage= LCDUIInvoker.createLcduiImage(iImage);
-		return currentFrameImage;
-	}
-	
-	/**
-	 * Returns Point object, which contains the width and height of the image
-	 * Called from VideoControl to get the image width and height, 
-	 * so that Item will be created exactly of same dimension 
-	 */
-	org.eclipse.swt.graphics.Point getImageDimension(){
-		return new org.eclipse.swt.graphics.Point(iImageData[0].width, iImageData[0].height);  
-	}
-	
-	/**
-	 * This returns the imageData array, 
-	 * called from FramePositioningControl class to calculate the frame time 
-	 */
-	ImageData[] getImageData(){
-		return iImageData;
-	}
-	
-	/**
-	 * 
-	 * @param aDisplayLocation x,y coordinate where image is to be displayed 
-	 */
-	void setDisplayLocation(int aX, int aY){
-		iDisplayLocation=new Point(aX,aY);
-	}
-	
-	/**
-	 * @return the position of the image to be displayed 
-	 */
-	Point getiDisplayLocation() {
-		return iDisplayLocation;
-	}
-	/**
-	 * Called from VideoControl to get the dimension of original image size 
-	 * @return
-	 */
-	Point getSourceDimension() {
-		return iSourceDimension;
-	}
+     * Returns Point object, which contains the width and height of the image
+     * Called from VideoControl to get the image width and height,
+     * so that Item will be created exactly of same dimension
+     */
+    org.eclipse.swt.graphics.Point getImageDimension()
+    {
+        return new org.eclipse.swt.graphics.Point(iImageData[0].width, iImageData[0].height);
+    }
+
+    /**
+     * This returns the imageData array,
+     * called from FramePositioningControl class to calculate the frame time
+     */
+    ImageData[] getImageData()
+    {
+        return iImageData;
+    }
+
+    /**
+     *
+     * @param aDisplayLocation x,y coordinate where image is to be displayed
+     */
+    void setDisplayLocation(int aX, int aY)
+    {
+        iDisplayLocation=new Point(aX,aY);
+    }
+
+    /**
+     * @return the position of the image to be displayed
+     */
+    Point getiDisplayLocation()
+    {
+        return iDisplayLocation;
+    }
+    /**
+     * Called from VideoControl to get the dimension of original image size
+     * @return
+     */
+    Point getSourceDimension()
+    {
+        return iSourceDimension;
+    }
+
+    /**
+     * @return the iPlayerListenerImpl
+     */
+    PlayerListenerImpl getiPlayerListenerImpl()
+    {
+        return iPlayerListenerImpl;
+    }
+
+    /**
+     * @return the iFrameIndex
+     */
+    int getiFrameIndex()
+    {
+        return iFrameIndex;
+    }
 
-	/**
-	 * @return the iPlayerListenerImpl
-	 */
-	PlayerListenerImpl getiPlayerListenerImpl() {
-		return iPlayerListenerImpl;
-	}
-
-	/**
-	 * @return the iFrameIndex
-	 */
-	int getiFrameIndex() {
-		return iFrameIndex;
-	}
-
-	/**
-	 * @return the iCurrentRate
-	 */
-	int getiCurrentRate() {
-		return iCurrentRate;
-	}
+    /**
+     * @return the iCurrentRate
+     */
+    int getiCurrentRate()
+    {
+        return iCurrentRate;
+    }
 
-	/**
-	 * @param aCurrentRate the iCurrentRate to set
-	 * @return actual rate set 
-	 */
-	int setiCurrentRate(int aCurrentRate) {
-		// if the player is already started and was paused due to setRate
-		// then we need to start the player again from the same frame 
-		if(iState == STARTED &&  iCurrentRate != aCurrentRate){
-			if(aCurrentRate<=0){
-				// pause the player
-				// following line will break the while loop in start method
-				// Objective here is to pause the animation, if is in started state
-				// also we do not need to notify to the playerListener that player has been stopped or paused 
-				iState=PREFETCHED;
-			}else{
-				//start the player
-				// this will start playing animation from the very same frame
-				// where it was paused due to setRate(0)
-				try {
-					start();
-				} catch (MediaException e) {
-					// ignore the exception
-					e.printStackTrace();
-				}
-			}
-		}
-		this.iCurrentRate = aCurrentRate;
-		return iCurrentRate;
-	}
+    /**
+     * @param aCurrentRate the iCurrentRate to set
+     * @return actual rate set
+     */
+    int setiCurrentRate(int aCurrentRate)
+    {
+        // if the player is already started and was paused due to setRate
+        // then we need to start the player again from the same frame
+        if (iState == STARTED &&  iCurrentRate != aCurrentRate)
+        {
+            if (aCurrentRate<=0)
+            {
+                // pause the player
+                // following line will break the while loop in start method
+                // Objective here is to pause the animation, if it is in started state
+                // also we do not need to notify to the playerListener that player has been stopped or paused
+                iState=PREFETCHED;
+            }
+            else
+            {
+                //start the player
+                // this will start playing animation from the very same frame
+                // where it was paused due to setRate(0)
+                try
+                {
+                    start();
+                }
+                catch (MediaException e)
+                {
+                    // ignore the exception
+                    e.printStackTrace();
+                }
+            }
+        }
+        this.iCurrentRate = aCurrentRate;
+        return iCurrentRate;
+    }
 
-	/**
-	 * @param iStopTime the iStopTime to set
-	 */
-	void setiStopTime(long iStopTime) {
-		this.iStopTime = iStopTime;
-	}
+    /**
+     * @param iStopTime the iStopTime to set
+     */
+    void setiStopTime(long iStopTime)
+    {
+        this.iStopTime = iStopTime;
+    }
+
+    /**
+     * @param iIsControlVisible the iIsControlVisible to set
+     */
+    void setiIsControlVisible(boolean iIsControlVisible)
+    {
+        this.iIsControlVisible = iIsControlVisible;
+    }
 }
+
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayerFactory.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/AnimationPlayerFactory.java	Fri Jun 11 13:33:44 2010 +0300
@@ -12,8 +12,8 @@
  * Contributors:
  *
  * Description:  This class has been implemented for playing the GIF animation
- * Earlier implementation were dependent on native API, but now AnimationPlayer 
- * will be not use any native code, and all the implementation here is using eswt API 
+ * Earlier implementation were dependent on native API, but now AnimationPlayer
+ * will be not use any native code, and all the implementation here is using eswt API
  *
  */
 
@@ -35,117 +35,140 @@
  * This class is used for playing GIF image animation. This class also
  * implements PlugIn interface which is used from ManagerImpl.
  * Entire Animation playing is written using eSWT API.
- * There is no call to native. 
- * 
+ * There is no call to native.
+ *
  */
-public class AnimationPlayerFactory implements PlugIn {
+public class AnimationPlayerFactory implements PlugIn
+{
+
+    // Used to recognize supported locators.
+    // private static final String ANIMATION_FILE_EXTENSION = ".gif";
+
+    // Used to get supported protocols and content type.
+    private static final String ANIMATION_CONTENT_TYPE = "image/gif";
+    private static final String ANIMATION_HTTP_PROTOCOL = "http";
+    private static final String ANIMATION_HTTPS_PROTOCOL = "https";
+    private static final String ANIMATION_FILE_PROTOCOL = "file";
+    // There is no need to read the first 6 byte and compare it with following string
+//  private static final String ANIMATION_GIF_HEADER="GIF89a";
 
-	// Used to recognize supported locators.
-	// private static final String ANIMATION_FILE_EXTENSION = ".gif";
+    /**
+     * From PlugIn
+     */
+    public InternalPlayer createPlayer(DataSource aDataSource)
+    throws MediaException, IOException
+    {
+        final String DEBUG_STR="AnimationPlayerFactory::createPlayer()";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
+        InternalPlayer player = null;
+        String contentType = aDataSource.getContentType();
+        // There is no difference in if and else block
+        // in first if block only checking if the content type is available
+        // Player is being created in the same way
 
-	// Used to get supported protocols and content type.
-	private static final String ANIMATION_CONTENT_TYPE = "image/gif";
-	private static final String ANIMATION_HTTP_PROTOCOL = "http";
-	private static final String ANIMATION_HTTPS_PROTOCOL = "https";
-	private static final String ANIMATION_FILE_PROTOCOL = "file";
-	// There is no need to read the first 6 byte and compare it with following string 
-//	private static final String ANIMATION_GIF_HEADER="GIF89a";
+        // First try to create player from content type
+        if (contentType != null)
+        {
+            if (contentType.equals(ANIMATION_CONTENT_TYPE))
+            {
+                player = new AnimationPlayer(aDataSource);
+            }
+//          else{
+//              throw new MediaException("Content type not supported: " + contentType);
+//          }
+        } //Since it was not possible to identify the player from content type, identify it from it's header
+        // Is there any need to create player through Locator?
+
+        else
+        {
+            // We need only 6 bytes to identify whether it's GIF image data or not.
+            // But the problem here is that if we will read even a single byte from stream
+            // that stream won't be useful for loading the image data through ImageLoader class
+            // So better solution is to let the ImageLoader.load(InputStream ) get called
+            // if it successfully load the image, then it means that stream is intended for this player only
+            // otherwise it will throw the SWTException, catch it and return properly
+            try
+            {
+                player = new AnimationPlayer(aDataSource);
+            }
+            catch (SWTException e)
+            {
+                // Simply ignore the exception
+                e.printStackTrace();
+            }
+        }
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
+        return player;
+    }
 
-	/**
-	 * From PlugIn
-	 */
-	public InternalPlayer createPlayer(DataSource aDataSource)
-			throws MediaException, IOException {
-		final String DEBUG_STR="AnimationPlayerFactory::createPlayer()";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
-		InternalPlayer player = null;
-		String contentType = aDataSource.getContentType();
-		// There is no difference in if and else block 
-		// in first if block only checking if the content type is available 
-		// Player is being created in the same way
-		
-		// First try to create player from content type 
-		if (contentType != null){
-			if(contentType.equals(ANIMATION_CONTENT_TYPE)) {
-				player = new AnimationPlayer(aDataSource);
-			}
-//			else{ 
-//	            throw new MediaException("Content type not supported: " + contentType);
-//			}
-		} //Since it was not possible to identify the player from content type, identify it from it's header
-		// Is there any need to create player through Locator?
-		
-		else {
-			// We need only 6 bytes to identify whether it's GIF image data or not.
-			// But the problem here is that if we will read even a single byte from stream
-			// that stream won't be useful for loading the image data through ImageLoader class
-			// So better solution is to let the ImageLoader.load(InputStream ) get called
-			// if it successfully load the image, then it means that stream is intended for this player only
-			// otherwise it will throw the SWTException, catch it and return properly
-			try{
-				player = new AnimationPlayer(aDataSource);
-			}catch(SWTException e){
-				// Simply ignore the exception 
-				e.printStackTrace();
-			}
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
-		return player;
-	}
-	
-	/**
-	 * @param locator
-	 * @return Interplayer object 
-	 */
-	public InternalPlayer createPlayer(String locator ){
-		final String DEBUG_STR="AnimationPlayerFactory::createPlayer(String locator )";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
-		InternalPlayer player = null;
-		try{
-			player = new AnimationPlayer(locator);
-		}catch(SWTException e){
-			// just ignore it 
-			e.printStackTrace();
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
-		return player;
-	}
-	
+    /**
+     * @param locator
+     * @return Interplayer object
+     * @throws IOException
+     */
+    public InternalPlayer createPlayer(String locator) throws IOException
+    {
+        final String DEBUG_STR="AnimationPlayerFactory::createPlayer(String locator )";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
+        InternalPlayer player = null;
+        try
+        {
+            player = new AnimationPlayer(locator);
+        }
+        catch (SWTException e)
+        {
+            // For all cases ImageLoader.load throws only SWTException
+            // here we are finding why it has throws this Exception
+            // if it is IOException we need to pass it to caller
+            if (e.getCause().toString().indexOf((IOException.class.getName()))!=-1)
+                throw new IOException();
+            // if exception is due to any other reason, just ignore it
+            e.printStackTrace();
+        }
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
+        return player;
+    }
+
 
-	/**
-	 * From PlugIn
-	 */
-	public String[] getSupportedContentTypes(String aProtocol) {
-		String[] types = new String[0];
-		if (aProtocol == null || aProtocol.equals(ANIMATION_HTTP_PROTOCOL)
-				|| aProtocol.equals(ANIMATION_HTTPS_PROTOCOL)
-				|| aProtocol.equals(ANIMATION_FILE_PROTOCOL)) {
-			types = new String[1];
-			types[0] = ANIMATION_CONTENT_TYPE;
-		}
-		return types;
-	}
+    /**
+     * From PlugIn
+     */
+    public String[] getSupportedContentTypes(String aProtocol)
+    {
+        String[] types = new String[0];
+        if (aProtocol == null || aProtocol.equals(ANIMATION_HTTP_PROTOCOL)
+                || aProtocol.equals(ANIMATION_HTTPS_PROTOCOL)
+                || aProtocol.equals(ANIMATION_FILE_PROTOCOL))
+        {
+            types = new String[1];
+            types[0] = ANIMATION_CONTENT_TYPE;
+        }
+        return types;
+    }
 
-	/**
-	 * From PlugIn
-	 */
-	public String[] getSupportedProtocols(String aContentType) {
-		String[] protocols = new String[0];
-		if ((aContentType == null)
-				|| aContentType.equals(ANIMATION_CONTENT_TYPE)) {
-			protocols = new String[3];
-			protocols[0] = ANIMATION_HTTP_PROTOCOL;
-			protocols[1] = ANIMATION_HTTPS_PROTOCOL;
-			protocols[2] = ANIMATION_FILE_PROTOCOL;
-		}
-		// else empty array is returned
-		return protocols;
-	}
+    /**
+     * From PlugIn
+     */
+    public String[] getSupportedProtocols(String aContentType)
+    {
+        String[] protocols = new String[0];
+        if ((aContentType == null)
+                || aContentType.equals(ANIMATION_CONTENT_TYPE))
+        {
+            protocols = new String[3];
+            protocols[0] = ANIMATION_HTTP_PROTOCOL;
+            protocols[1] = ANIMATION_HTTPS_PROTOCOL;
+            protocols[2] = ANIMATION_FILE_PROTOCOL;
+        }
+        // else empty array is returned
+        return protocols;
+    }
 
-	/**
-	 * From PlugIn. Empty implementation.
-	 */
-	public void preparePlayer(InternalPlayer aPlayer) throws MediaException {
-		
-	}
+    /**
+     * From PlugIn. Empty implementation.
+     */
+    public void preparePlayer(InternalPlayer aPlayer) throws MediaException
+    {
+
+    }
 }
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/FramePositioningControl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/FramePositioningControl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -26,139 +26,156 @@
 
 
 public class FramePositioningControl extends ControlImpl implements
-		javax.microedition.media.control.FramePositioningControl {
-	
-	private ImageData[] iImagedata;
-	
-	/**
-	 * Constructor of this Control
-	 * This constructor should be accessible only in this package, that's why it is being 
-	 * declared as package protected.    
-	 */
-	 FramePositioningControl(Player aPlayer) {
-		iPlayer=aPlayer;
-		iImagedata=((AnimationPlayer)iPlayer).getImageData();
-	}
+        javax.microedition.media.control.FramePositioningControl
+{
+
+    private ImageData[] iImagedata;
+
+    /**
+     * Constructor of this Control
+     * This constructor should be accessible only in this package, that's why it is being
+     * declared as package protected.
+     */
+    FramePositioningControl(Player aPlayer)
+    {
+        iPlayer=aPlayer;
+        iImagedata=((AnimationPlayer)iPlayer).getImageData();
+    }
 
-	/**
-	 * Converts the given frame number to the corresponding media time.
-	 * The method only performs the calculations. It does not position the media to the given frame. 
-	 */
-	public long mapFrameToTime(int aFrameNumber) {
-		checkState();
-		long time=0;
-		int totalNoOfFrames=iImagedata.length;
-		// if invalid parameter is passed
-		if(aFrameNumber<0 || aFrameNumber>totalNoOfFrames)
-			return -1;
-		for(int i=0;i<totalNoOfFrames;i++){
-			if(i==aFrameNumber)
-				break;
-			time+=iImagedata[i].delayTime;
-		}
-		return time*10000;
-	}
+    /**
+     * Converts the given frame number to the corresponding media time.
+     * The method only performs the calculations. It does not position the media to the given frame.
+     */
+    public long mapFrameToTime(int aFrameNumber)
+    {
+        checkState();
+        long time=0;
+        int totalNoOfFrames=iImagedata.length;
+        // if invalid parameter is passed
+        if (aFrameNumber<0 || aFrameNumber>totalNoOfFrames)
+            return -1;
+        for (int i=0; i<totalNoOfFrames; i++)
+        {
+            if (i==aFrameNumber)
+                break;
+            time+=iImagedata[i].delayTime;
+        }
+        return time*10000;
+    }
 
-	/**
-	 * Converts the given media time to the corresponding frame number. 
-	 * The method only performs the calculations. It does not position the media to the given media time.
-	 * The frame returned is the nearest frame that has a media time less than or equal to the given media time.
-	 * mapTimeToFrame(0) must not fail and must return the frame number of the first frame.
-	 * @param the input media time for the conversion in microseconds. 
-	 * @return the converted frame number for the given media time. If the conversion fails, -1 is returned. 
-	 */
-	public int mapTimeToFrame(long aMediaTime) {
-		checkState();
-		int frameNumber=-1;
-		int totalNoOfFrames=iImagedata.length;
-		long time=0;
-		for(int i=0;i<totalNoOfFrames;i++){
-			if(time > aMediaTime){
-				frameNumber=i-1;
-				break;
-			}
-			time+=iImagedata[i].delayTime*10000;
-		}
-		return frameNumber;
-	}
+    /**
+     * Converts the given media time to the corresponding frame number.
+     * The method only performs the calculations. It does not position the media to the given media time.
+     * The frame returned is the nearest frame that has a media time less than or equal to the given media time.
+     * mapTimeToFrame(0) must not fail and must return the frame number of the first frame.
+     * @param the input media time for the conversion in microseconds.
+     * @return the converted frame number for the given media time. If the conversion fails, -1 is returned.
+     */
+    public int mapTimeToFrame(long aMediaTime)
+    {
+        checkState();
+        int frameNumber=-1;
+        int totalNoOfFrames=iImagedata.length;
+        long time=0;
+        for (int i=0; i<totalNoOfFrames; i++)
+        {
+            if (time > aMediaTime)
+            {
+                frameNumber=i-1;
+                break;
+            }
+            time+=iImagedata[i].delayTime*10000;
+        }
+        return frameNumber;
+    }
 
-	/**
-	 * Seek to a given video frame. The media time of the Player will be updated to reflect
-	 * the new position set.
-	 * This method can be called on a stopped or started Player. If the Player is in the Started state,
-	 * this method may cause the Player to change states. If that happens, the appropriate transition
-	 *  events will be posted by the Player when its state changes.
-	 * If the given frame number is less than the first or larger than the last frame number in the media,
-	 * seek will jump to either the first or the last frame respectively.
-	 * @param aFrameNumber the frame to seek to. 
-	 * @return the actual number of frames skipped.
-	 */
-	public int seek(int aFrameNumber) {
-		final String DEBUG_STR = "FramePositionControl::seek";
-		// Check the state of the player, it shouldn't be in closed state
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "+");
-		checkState();
-		int frameNumber = aFrameNumber;
-		int totalNoOfFrames = iImagedata.length;
-		if (aFrameNumber < 0) {
-			frameNumber = 0;
-		} else {
-			if (aFrameNumber > totalNoOfFrames) {
-				frameNumber = totalNoOfFrames;
-			}
-		}
-		long mediaTime = mapFrameToTime(frameNumber);
-		//if the frame number is equal to total number of frames, we will seek to last frame
-		// because it's array index, so last index will be total length -1 
-		frameNumber=(frameNumber == totalNoOfFrames) ? (frameNumber-1) : frameNumber;
-		try {
-			long mediaTime1 = iPlayer.setMediaTime(mediaTime);
-		} catch (MediaException e) {
-			// Just ignore the exception
-			e.printStackTrace();
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "- seeked to "+frameNumber);
-		return frameNumber;
-	}
+    /**
+     * Seek to a given video frame. The media time of the Player will be updated to reflect
+     * the new position set.
+     * This method can be called on a stopped or started Player. If the Player is in the Started state,
+     * this method may cause the Player to change states. If that happens, the appropriate transition
+     *  events will be posted by the Player when its state changes.
+     * If the given frame number is less than the first or larger than the last frame number in the media,
+     * seek will jump to either the first or the last frame respectively.
+     * @param aFrameNumber the frame to seek to.
+     * @return the actual number of frames skipped.
+     */
+    public int seek(int aFrameNumber)
+    {
+        final String DEBUG_STR = "FramePositionControl::seek";
+        // Check the state of the player, it shouldn't be in closed state
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "+");
+        checkState();
+        int frameNumber = aFrameNumber;
+        int totalNoOfFrames = iImagedata.length;
+        if (aFrameNumber < 0)
+        {
+            frameNumber = 0;
+        }
+        else
+        {
+            if (aFrameNumber > totalNoOfFrames)
+            {
+                frameNumber = totalNoOfFrames;
+            }
+        }
+        long mediaTime = mapFrameToTime(frameNumber);
+        //if the frame number is equal to total number of frames, we will seek to last frame
+        // because it's array index, so last index will be total length -1
+        frameNumber=(frameNumber == totalNoOfFrames) ? (frameNumber-1) : frameNumber;
+        try
+        {
+            long mediaTime1 = iPlayer.setMediaTime(mediaTime);
+        }
+        catch (MediaException e)
+        {
+            // Just ignore the exception
+            e.printStackTrace();
+        }
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "- seeked to "+frameNumber);
+        return frameNumber;
+    }
 
-	/**
-	 *  Skip a given number of frames from the current position. The media time of the Player will be
-	 *  updated to reflect the new position set.
-	 *	This method can be called on a stopped or started Player. If the Player is in the Started state,
-	 *  the current position is changing. Hence, the frame actually skipped to will not be exact.
-	 *	If the Player is in the Started state, this method may cause the Player to change states.
-	 *  If that happens, the appropriate transition events will be posted.
-	 *	If the given framesToSkip will cause the position to extend beyond the first or last frame,
-	 *  skip will jump to the first or last frame respectively.
-	 *  @param framesToSkip - the number of frames to skip from the current position.
-	 *  If framesToSkip is positive, it will seek forward by framesToSkip number of frames.
-	 *  If framesToSkip is negative, it will seek backward by framesToSkip number of frames. 
-	 *  e.g. skip(-1) will seek backward one frame.
-	 *    
-	 *  @return the actual number of frames skipped.
-	 */
-	public int skip(int aFramesToSkip) {
-		final String DEBUG_STR = "FramePositionControl::skip";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
-		// check the state of the player, if it closed throw exception
-		checkState();
-		int frameNumberToJump;
-		if (aFramesToSkip < 0) {
-			frameNumberToJump = 0;
-		} 
-		// storing it in local variable, so that current frame index variable will be 
-		// consistent throughout this function, calling to getiFrameIndex(), each time
-		// may return the different value. 
-		int currentFrameIndex=((AnimationPlayer) iPlayer).getiFrameIndex();
-		// we are going to utilize the seek function here
-		// just get the current frame index from player and
-		// add it to the number of frame to skip
-		frameNumberToJump = currentFrameIndex + aFramesToSkip;
-		//if the frameNumberToJump > total no of frames, then skip to the last frame only 
-		frameNumberToJump =frameNumberToJump > iImagedata.length ? iImagedata.length-1 : frameNumberToJump;
-		seek(frameNumberToJump);
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
-		return frameNumberToJump - currentFrameIndex;
-	}
+    /**
+     *  Skip a given number of frames from the current position. The media time of the Player will be
+     *  updated to reflect the new position set.
+     *  This method can be called on a stopped or started Player. If the Player is in the Started state,
+     *  the current position is changing. Hence, the frame actually skipped to will not be exact.
+     *  If the Player is in the Started state, this method may cause the Player to change states.
+     *  If that happens, the appropriate transition events will be posted.
+     *  If the given framesToSkip will cause the position to extend beyond the first or last frame,
+     *  skip will jump to the first or last frame respectively.
+     *  @param framesToSkip - the number of frames to skip from the current position.
+     *  If framesToSkip is positive, it will seek forward by framesToSkip number of frames.
+     *  If framesToSkip is negative, it will seek backward by framesToSkip number of frames.
+     *  e.g. skip(-1) will seek backward one frame.
+     *
+     *  @return the actual number of frames skipped.
+     */
+    public int skip(int aFramesToSkip)
+    {
+        final String DEBUG_STR = "FramePositionControl::skip";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
+        // check the state of the player, if it closed throw exception
+        checkState();
+        int frameNumberToJump;
+        if (aFramesToSkip < 0)
+        {
+            frameNumberToJump = 0;
+        }
+        // storing it in local variable, so that current frame index variable will be
+        // consistent throughout this function, calling to getiFrameIndex(), each time
+        // may return the different value.
+        int currentFrameIndex=((AnimationPlayer) iPlayer).getiFrameIndex();
+        // we are going to utilize the seek function here
+        // just get the current frame index from player and
+        // add it to the number of frame to skip
+        frameNumberToJump = currentFrameIndex + aFramesToSkip;
+        //if the frameNumberToJump > total no of frames, then skip to the last frame only
+        frameNumberToJump =frameNumberToJump > iImagedata.length ? iImagedata.length-1 : frameNumberToJump;
+        seek(frameNumberToJump);
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
+        return frameNumberToJump - currentFrameIndex;
+    }
 
 }
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/RateControl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/RateControl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -22,55 +22,64 @@
 
 
 public class RateControl extends ControlImpl implements
-		javax.microedition.media.control.RateControl {
+        javax.microedition.media.control.RateControl
+{
 
-	private final static int DEFUALT_RATE=100000; 
-	private final static int MIN_RATE=0;
-	/**
-	 * 
-	 * @param aPlayer
-	 */
-	public RateControl(Player aPlayer){
-		this.iPlayer=aPlayer;
-		((AnimationPlayer)iPlayer).setiCurrentRate(DEFUALT_RATE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see javax.microedition.media.control.RateControl#getMaxRate()
-	 */
-	public int getMaxRate() {
-		checkState();
-		return DEFUALT_RATE;
-	}
+    private final static int DEFUALT_RATE=100000;
+    private final static int MIN_RATE=0;
+    /**
+     *
+     * @param aPlayer
+     */
+    public RateControl(Player aPlayer)
+    {
+        this.iPlayer=aPlayer;
+        ((AnimationPlayer)iPlayer).setiCurrentRate(DEFUALT_RATE);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.microedition.media.control.RateControl#getMaxRate()
+     */
+    public int getMaxRate()
+    {
+        checkState();
+        return DEFUALT_RATE;
+    }
 
-	/* (non-Javadoc)
-	 * @see javax.microedition.media.control.RateControl#getMinRate()
-	 */
-	public int getMinRate() {
-		checkState();
-		return MIN_RATE;
-	}
+    /* (non-Javadoc)
+     * @see javax.microedition.media.control.RateControl#getMinRate()
+     */
+    public int getMinRate()
+    {
+        checkState();
+        return MIN_RATE;
+    }
 
-	/* (non-Javadoc)
-	 * @see javax.microedition.media.control.RateControl#getRate()
-	 */
-	public int getRate() {
-		checkState();
-		return ((AnimationPlayer)iPlayer).getiCurrentRate();
-	}
+    /* (non-Javadoc)
+     * @see javax.microedition.media.control.RateControl#getRate()
+     */
+    public int getRate()
+    {
+        checkState();
+        return ((AnimationPlayer)iPlayer).getiCurrentRate();
+    }
 
-	/**
-	 * Current implementation support only two rate default(100000) or min(0). 
-	 * No other rate is supported 
-	 */
-	public int setRate(int aMilliRate) {
-		checkState();
-		int rate =aMilliRate;
-		if(rate<=MIN_RATE){
-			rate =MIN_RATE;
-		}else if(rate >= DEFUALT_RATE){
-			rate =DEFUALT_RATE;
-		}
-		return ((AnimationPlayer)iPlayer).setiCurrentRate(rate) ;
-	}
+    /**
+     * Current implementation support only two rate default(100000) or min(0).
+     * No other rate is supported
+     */
+    public int setRate(int aMilliRate)
+    {
+        checkState();
+        int rate =aMilliRate;
+        if (rate<=MIN_RATE)
+        {
+            rate =MIN_RATE;
+        }
+        else if (rate >= DEFUALT_RATE)
+        {
+            rate =DEFUALT_RATE;
+        }
+        return ((AnimationPlayer)iPlayer).setiCurrentRate(rate) ;
+    }
 }
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/StopTimeControl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/StopTimeControl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -28,17 +28,19 @@
  * <p>
  */
 public class StopTimeControl extends ControlImpl implements
-		javax.microedition.media.control.StopTimeControl {
+        javax.microedition.media.control.StopTimeControl
+{
 
-	private long iStopTime=RESET;
-	/**
-	 * 
-	 */
-	public StopTimeControl(Player aPlayer) {
-		this.iPlayer=aPlayer;
-	}
+    private long iStopTime=RESET;
+    /**
+     *
+     */
+    public StopTimeControl(Player aPlayer)
+    {
+        this.iPlayer=aPlayer;
+    }
 
-	/**
+    /**
      * Gets the last value successfully set by <CODE>setStopTime</CODE>.
      *
      * Returns the constant <CODE>RESET</CODE> if no stop time is set.
@@ -47,12 +49,13 @@
      * @return The current stop time in microseconds.
      * @see #setStopTime
      */
-	public long getStopTime() {
-		 checkState();
-		return iStopTime;
-	}
+    public long getStopTime()
+    {
+        checkState();
+        return iStopTime;
+    }
 
-	 /**
+    /**
     *
     * Sets the <i>media time</i> at which you want the <code>Player</code>
     * to stop.
@@ -89,13 +92,15 @@
     * <i>media stop-time</i> has already been set.
     * @see #getStopTime
     */
-	public void setStopTime(long aStopTime) {
-		checkState();
-		if (iPlayer.getState() == Player.STARTED && getStopTime() != RESET) {
-			throw new IllegalStateException(
-					"Player is STARTED or setStopTime() is already called successfully");
-		}
-		iStopTime = aStopTime;
-		((AnimationPlayer)iPlayer).setiStopTime(iStopTime);
-	}
+    public void setStopTime(long aStopTime)
+    {
+        checkState();
+        if (iPlayer.getState() == Player.STARTED && getStopTime() != RESET)
+        {
+            throw new IllegalStateException(
+                "Player is STARTED or setStopTime() is already called successfully");
+        }
+        iStopTime = aStopTime;
+        ((AnimationPlayer)iPlayer).setiStopTime(iStopTime);
+    }
 }
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoControl.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoControl.java	Fri Jun 11 13:33:44 2010 +0300
@@ -29,8 +29,11 @@
 import javax.microedition.media.PlayerListener;
 
 import org.eclipse.ercp.swt.mobile.MobileShell;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.ProxyControl;
@@ -50,17 +53,18 @@
 
 
 public class VideoControl extends ControlImpl implements
-		javax.microedition.media.control.VideoControl , ItemControlStateChangeListener{
+        javax.microedition.media.control.VideoControl , ItemControlStateChangeListener
+{
 
-	//	Following variable has been taken from VideoControl class
-	private static final String GUI_OBJECT_CLASS_NAME =
+    //  Following variable has been taken from VideoControl class
+    private static final String GUI_OBJECT_CLASS_NAME =
         "javax.microedition.lcdui.Item";
-	// lcdui package used with UiToolkitRegister
+    // lcdui package used with UiToolkitRegister
     private static String LCDUI_PACKAGE =
         "javax.microedition.lcdui";
     // eswt package used with UiToolkitRegister
     private static String ESWT_PACKAGE = "org.eclipse.swt.widgets";
-    // ToolkitRegister class name used with eswt and lcdui
+    // ToolkitRegister class name used with eSWT and LCDUI
     private static String DISPLAY = ".Display";
 
     // class name used to check if eswt is included
@@ -68,587 +72,661 @@
 
     // class name used to check if eswt is included
     private static String ESWT_CONTROL = ".control";
-    
-	private static final int NOT_INITIALIZED = -1;
-	protected int iStatus = NOT_INITIALIZED;
-	private static final int UNDEFINED_RETURN_VALUE=0;
-	// For integrating with eSWT API  
-	private Display iDisplay; 
-	// This is reference of eSWT Control, don't get confused with the Player Control 
-	private Control iControl;
-	/**
-	* When video display is set to full screen mode, old
+
+    private static final int NOT_INITIALIZED = -1;
+    protected int iStatus = NOT_INITIALIZED;
+    private static final int UNDEFINED_RETURN_VALUE=0;
+    // For integrating with eSWT API
+    private Display iDisplay;
+    // This is reference of eSWT Control, don't get confused with the Player Control
+    private Control iControl;
+    /**
+    * When video display is set to full screen mode, old
     * video position & size is stored to this member. When
     * full screen mode is turned off, this member is used to
     * find out if display size has been changed during full
     * screen mode. This is needed to generate a SIZE_CHANGED
     * event.
     */
-	private Point iOldDisplaySize;
-	/**
-	 * A CustomItem which needs to be returned in case USE_GUI_PRIMITIVE and null to MIDlet
-	 * from initDisplayMode function. 
-	 */
-	// Global??? yes because we need to remove it from player listener, while finalizer will be called
-	private VideoItem iVideoItem;
-	
-	
-	/**
-	 * Constructor of VideoControl  
-	 * @param player
-	 */
-	public VideoControl(Player player){
-		this.iPlayer=player;
-	}
-	/**
-	 * 
-	 */
-	private Finalizer mFinalizer = new Finalizer(){
-        public void finalizeImpl(){
+    private Point iOldDisplaySize;
+    /**
+     * A CustomItem which needs to be returned in case USE_GUI_PRIMITIVE and null to MIDlet
+     * from initDisplayMode function.
+     */
+    // Global??? yes because we need to remove it from player listener, while finalizer will be called
+    private VideoItem iVideoItem;
+
+
+    /**
+     * Constructor of VideoControl
+     * @param player
+     */
+    public VideoControl(Player player)
+    {
+        this.iPlayer=player;
+    }
+    /**
+     *
+     */
+    private Finalizer mFinalizer = new Finalizer()
+    {
+        public void finalizeImpl()
+        {
             doFinalize();
         }
     };
-	/**
-	 * 
-	 */
-	final void registeredFinalize() {
-		if (iVideoItem != null) {
-			iPlayer.removePlayerListener(iVideoItem);
-		}
-	}
+    /**
+     *
+     */
+    final void registeredFinalize()
+    {
+        if (iVideoItem != null)
+        {
+            iPlayer.removePlayerListener(iVideoItem);
+        }
+    }
+
+    /**
+     *
+     */
+    private void doFinalize()
+    {
+        if (mFinalizer != null)
+        {
+            registeredFinalize();
+            mFinalizer = null;
+        }
+    }
 
-	/**
-	 * 
-	 */
-	private void doFinalize() {
-		if (mFinalizer != null) {
-			registeredFinalize();
-			mFinalizer = null;
-		}
-	}
-	
-	/**
-	 * Return the actual height of the current render video. 
-	 * @return height of the display video 
-	 * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called. 
-	 */
-	public int getDisplayHeight() {
-		// this function can't be called, when the player is in closed state
-		// or until initDisplayMode function is not called
-		checkState();
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		// Following function will always return Player's current height
-		return ((AnimationPlayer) iPlayer).getImageDimension().x;
-	}
+    /**
+     * Return the actual height of the current render video.
+     * @return height of the display video
+     * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called.
+     */
+    public int getDisplayHeight()
+    {
+        // this function can't be called, when the player is in closed state
+        // or until initDisplayMode function is not called
+        checkState();
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        // Following function will always return Player's current height
+        return ((AnimationPlayer) iPlayer).getImageDimension().x;
+    }
 
-	/**
-	 * Return the actual width of the current render video. 
-	 * @return width of the display video 
-	 * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called.
-	 */
-	public int getDisplayWidth() {
-		checkState();
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		return ((AnimationPlayer) iPlayer).getImageDimension().x;
-	}
+    /**
+     * Return the actual width of the current render video.
+     * @return width of the display video
+     * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called.
+     */
+    public int getDisplayWidth()
+    {
+        checkState();
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        return ((AnimationPlayer) iPlayer).getImageDimension().x;
+    }
 
-	/**
-	 * Return the X-coordinate of the video with respect to the GUI object where the video is displayed.
-	 * The coordinate is specified in pixel values relative to the upper left hand corner of the GUI object.
-	 * The return value is undefined if initDisplayMode has not been called.
-	 * @return the X-coordinate of the video. 
-	 */
-	public int getDisplayX() {
-		checkState();
-		if (iStatus == NOT_INITIALIZED) {
-			return UNDEFINED_RETURN_VALUE;
-		}
-		return ((AnimationPlayer) iPlayer).getiDisplayLocation().x;
-	}
+    /**
+     * Return the X-coordinate of the video with respect to the GUI object where the video is displayed.
+     * The coordinate is specified in pixel values relative to the upper left hand corner of the GUI object.
+     * The return value is undefined if initDisplayMode has not been called.
+     * @return the X-coordinate of the video.
+     */
+    public int getDisplayX()
+    {
+        checkState();
+        if (iStatus == NOT_INITIALIZED)
+        {
+            return UNDEFINED_RETURN_VALUE;
+        }
+        return ((AnimationPlayer) iPlayer).getiDisplayLocation().x;
+    }
 
-	/** 
-	 * Return the Y-coordinate of the video with respective to the GUI object where the video is displayed.
-	 * The coordinate is specified in pixel values relative to the upper left hand corner of the GUI object.
-	 * The return value is undefined if initDisplayMode has not been called.
-	 * @return the Y-coordinate of the video.
- 	 */
-	public int getDisplayY() {
-		checkState();
-		if (iStatus == NOT_INITIALIZED) {
-			return UNDEFINED_RETURN_VALUE;
-		}
-		return ((AnimationPlayer) iPlayer).getiDisplayLocation().y;
-	}
+    /**
+     * Return the Y-coordinate of the video with respective to the GUI object where the video is displayed.
+     * The coordinate is specified in pixel values relative to the upper left hand corner of the GUI object.
+     * The return value is undefined if initDisplayMode has not been called.
+     * @return the Y-coordinate of the video.
+     */
+    public int getDisplayY()
+    {
+        checkState();
+        if (iStatus == NOT_INITIALIZED)
+        {
+            return UNDEFINED_RETURN_VALUE;
+        }
+        return ((AnimationPlayer) iPlayer).getiDisplayLocation().y;
+    }
 
-	/**
-	 * Get a snapshot of the displayed content. Features and format of the captured image are specified by
-	 * imageType. Supported formats can be queried from System.getProperty with  video.snapshot.encodings
-	 * as the key. The first format in the supported list is the default capture format. 
-	 * @param imageType - Format and resolution of the returned image.
-	 *  If null is given, the default capture format is used.
-	 *  
-	 * @return image as a byte array in required format. 
-	 * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called. 
-	 * @throws MediaException - Thrown if the requested format is not supported or the Player does not support snapshots.
-	 * @throws java.lang.SecurityException - Thrown if the caller does not have the security permission to take the snapshot. 
-	 */
-	//TODO Implementation pending, need discussion with UI team
-	public byte[] getSnapshot(String aImageType) throws MediaException {
-		checkState();
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		Image image=((AnimationPlayer)iPlayer).getCurrentFrame(aImageType);
-		byte bytArry[]= null;//getByteArray(image);
-		// TODO Enable the permission check 
-		// Commented out below line, because I was getting exception 
+    /**
+     * Get a snapshot of the displayed content. Features and format of the captured image are specified by
+     * imageType. Supported formats can be queried from System.getProperty with  video.snapshot.encodings
+     * as the key. The first format in the supported list is the default capture format.
+     * @param imageType - Format and resolution of the returned image.
+     *  If null is given, the default capture format is used.
+     *
+     * @return image as a byte array in required format.
+     * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called.
+     * @throws MediaException - Thrown if the requested format is not supported or the Player does not support snapshots.
+     * @throws java.lang.SecurityException - Thrown if the caller does not have the security permission to take the snapshot.
+     */
+    //TODO Implementation pending, need discussion with UI team
+    public byte[] getSnapshot(String aImageType) throws MediaException
+    {
+        checkState();
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        Image image=((AnimationPlayer)iPlayer).getCurrentFrame(aImageType);
+        byte bytArry[]= null;//getByteArray(image);
+        // TODO Enable the permission check
+        // Commented out below line, because I was getting exception
         // Check the permission here, so 'the moment' is not lost?
         //Security.ensurePermission(PERMISSION, PERMISSION, PERM_ARGS);
 //        ApplicationUtils appUtils = ApplicationUtils.getInstance();
 //        PlayerPermission per = new PlayerPermission("audio/video recording","snapshot");
 //        appUtils.checkPermission(per);
-		return bytArry;
-	}
+        return bytArry;
+    }
 
-	/**
-	 * Return the height of the source video. The height must be a positive number. 
-	 * @return the height of the source video. 
-	 */
-	public int getSourceHeight() {
-		checkState();
-		return ((AnimationPlayer)iPlayer).getSourceDimension().y;
-	}
+    /**
+     * Return the height of the source video. The height must be a positive number.
+     * @return the height of the source video.
+     */
+    public int getSourceHeight()
+    {
+        checkState();
+        return ((AnimationPlayer)iPlayer).getSourceDimension().y;
+    }
 
-	/**
-	 * Return the width of the source video. The width must be a positive number.  
-	 * @return the width of the source video
-	 */
-	public int getSourceWidth() {
-		checkState();
-		return ((AnimationPlayer)iPlayer).getSourceDimension().x;
-	}
+    /**
+     * Return the width of the source video. The width must be a positive number.
+     * @return the width of the source video
+     */
+    public int getSourceWidth()
+    {
+        checkState();
+        return ((AnimationPlayer)iPlayer).getSourceDimension().x;
+    }
 
-	/**
-	 * Initialize the mode on how the video is displayed. 
-	 * This method must be called before video can be displayed.
-	 * Two modes are defined:
+    /**
+     * Initialize the mode on how the video is displayed.
+     * This method must be called before video can be displayed.
+     * Two modes are defined:
      * USE_GUI_PRIMITIVE (inherited from GUIControl)
-     * USE_DIRECT_VIDEO   
-	 * @see javax.microedition.media.control.VideoControl#initDisplayMode(int, java.lang.Object)
-	 */
-	public Object initDisplayMode(int aMode, Object aArg) {
-		final String DEBUG_STRING = "VideoControl::initDisplayMode(int, Object)";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING + "+");
-		// To check if state is in not closed state
-		checkState();
-		if (iStatus != NOT_INITIALIZED) {
-			// IllegalStateException - Thrown if initDisplayMode is
-			// called again after it has previously been called successfully.
-			throw new IllegalStateException(
-					"initDisplayMode() already called successfully");
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING+"Mode = "+aMode+" Argument = "+aArg);
-		// if the aArg is equal to the name of eSWT Control class name
-		// create the Display object in following, assuming Display 
-		// object is already created in MIDlet. 
-		if(aArg!=null && aArg.equals(Control.class.getName())){
-			// Following line will return the same Display object
-			// Which is created in Midlet
-			iDisplay =Display.getDefault();	
-		}else{
-			// Get the Display object of ESWT
-			iDisplay = com.nokia.mj.impl.nokialcdui.LCDUIInvoker.getEswtDisplay();
-		}
-		if (aMode == USE_GUI_PRIMITIVE) {
-			Object guiObject = null;
-			if (aArg == null) {
-				guiObject = initNullMode();
-			} else {
-				if (aArg.equals(GUI_OBJECT_CLASS_NAME)) {
-					guiObject = initLCDUI();
-				} else // try load dynamic display mode
-				{
-					guiObject = initDynamicDisplayMode(aArg);
-					// Since it is eswtControl itself so no need of LCDUIInvoker here
-					// assign it in iControl and return immediately from here
-					iControl=(Control)guiObject;
-					// Now we will change the status, when MIDlet developer will call the setParent
-					iStatus = USE_GUI_PRIMITIVE;
-					return iControl;
-				}
-			}
-			// this will return the control as null, because the item might not
-			// have been appended in form
-			// Solution to this is as:- Add the listener through LCDUIInvoker
-			// and when item will be appended
-			// by midlet developer, notifyControlAvailable function of
-			// ItemStateChangeListener will be called
-			iControl = com.nokia.mj.impl.nokialcdui.LCDUIInvoker
-					.getEswtControl(guiObject);
-			// add this class as item state change listener
-			com.nokia.mj.impl.nokialcdui.LCDUIInvoker
-					.setItemControlStateChangeListener(this, (Item)guiObject);
-			iStatus = USE_GUI_PRIMITIVE;
-			return guiObject;
-		} else if (aMode == USE_DIRECT_VIDEO) {
-			if (aArg != null) {
-				if (!(aArg instanceof javax.microedition.lcdui.Canvas)) {
-					throw new java.lang.IllegalArgumentException(
-							"For USE_DIRECT_VIDEO mode argument should be of type Canvas");
-				}
-			} else {
-				throw new java.lang.IllegalArgumentException(
-						"For USE_DIRECT_VIDEO mode argument should not be null");
-			}
-			iControl = com.nokia.mj.impl.nokialcdui.LCDUIInvoker
-					.getEswtControl(aArg);
-			Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING
-					+ "This is USE_DIRECT_VIDEO mode, control is " + iControl);
-			iStatus = USE_DIRECT_VIDEO;
-		} else {
-			throw new java.lang.IllegalArgumentException(
-					"Mode not supported or invalid, "
-							+ "valid modes are USE_DIRECT_VIDEO and USE_GUI_PRIMITIVE");
-		}
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING + "-");
-		return null;
-	}
-	/**
-	 * Creates the VideoItem object of size of image(gif)
-	 * @return VideoItem(a CustomItem ) object
-	 */
-	private Object initLCDUI(){
-		final String DEBUG_STR="VideoControl::initLCDUI()";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
-		iVideoItem = new VideoItem(((AnimationPlayer)iPlayer).getImageDimension());
+     * USE_DIRECT_VIDEO
+     * @see javax.microedition.media.control.VideoControl#initDisplayMode(int, java.lang.Object)
+     */
+    public Object initDisplayMode(int aMode, Object aArg)
+    {
+        final String DEBUG_STRING = "VideoControl::initDisplayMode(int, Object)";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING + "+");
+        // To check if state is in not closed state
+        checkState();
+        if (iStatus != NOT_INITIALIZED)
+        {
+            // IllegalStateException - Thrown if initDisplayMode is
+            // called again after it has previously been called successfully.
+            throw new IllegalStateException(
+                "initDisplayMode() already called successfully");
+        }
+        // if the aArg is equal to the name of eSWT Control class name
+        // create the Display object in following, assuming Display
+        // object is already created in MIDlet.
+        if (aArg!=null && aArg.equals(Control.class.getName()))
+        {
+            // Following line will return the same Display object
+            // Which is created in Midlet
+            iDisplay =Display.getDefault();
+        }
+        else
+        {
+            // Get the Display object of ESWT
+            iDisplay = com.nokia.mj.impl.nokialcdui.LCDUIInvoker.getEswtDisplay();
+        }
+        if (aMode == USE_GUI_PRIMITIVE)
+        {
+            Object guiObject = null;
+            if (aArg == null)
+            {
+                guiObject = initNullMode();
+            }
+            else
+            {
+                if (aArg.equals(GUI_OBJECT_CLASS_NAME))
+                {
+                    guiObject = initLCDUI();
+                }
+                else // try load dynamic display mode
+                {
+                    guiObject = initDynamicDisplayMode(aArg);
+                    // Since it is eswtControl itself so no need of LCDUIInvoker here
+                    // assign it in iControl and return immediately from here
+                    iControl=(Control)guiObject;
+                    // Now we will change the status, when MIDlet developer will call the setParent
+                    iStatus = USE_GUI_PRIMITIVE;
+                    return iControl;
+                }
+            }
+            // this will return the control as null, because the item might not
+            // have been appended in form
+            // Solution to this is as:- Add the listener through LCDUIInvoker
+            // and when item will be appended
+            // by MIDlet developer, notifyControlAvailable function of
+            // ItemStateChangeListener will be called
+            iControl = com.nokia.mj.impl.nokialcdui.LCDUIInvoker
+                       .getEswtControl(guiObject);
+            // add this class as item state change listener
+            com.nokia.mj.impl.nokialcdui.LCDUIInvoker
+            .setItemControlStateChangeListener(this, (Item)guiObject);
+            iStatus = USE_GUI_PRIMITIVE;
+            return guiObject;
+        }
+        else if (aMode == USE_DIRECT_VIDEO)
+        {
+            if (aArg != null)
+            {
+                if (!(aArg instanceof javax.microedition.lcdui.Canvas))
+                {
+                    throw new java.lang.IllegalArgumentException(
+                        "For USE_DIRECT_VIDEO mode argument should be of type Canvas");
+                }
+            }
+            else
+            {
+                throw new java.lang.IllegalArgumentException(
+                    "For USE_DIRECT_VIDEO mode argument should not be null");
+            }
+            iControl = com.nokia.mj.impl.nokialcdui.LCDUIInvoker
+                       .getEswtControl(aArg);
+
+            //If USE_DIRECT_VIDEO is set, the video by default is not
+            //shown when the canvas is displayed until setVisible(true) is called
+            //iIsControlVisible variable of AnimationPlayer class decides, whether
+            //animation should be visible or not, and by default it is true;
+            //So making it false here.
+            ((AnimationPlayer)iPlayer).setiIsControlVisible(false);
+            iStatus = USE_DIRECT_VIDEO;
+        }
+        else
+        {
+            throw new java.lang.IllegalArgumentException(
+                "Mode not supported or invalid, "
+                + "valid modes are USE_DIRECT_VIDEO and USE_GUI_PRIMITIVE");
+        }
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STRING + "-");
+        return null;
+    }
+    /**
+     * Creates the VideoItem object of size of image(gif)
+     * @return VideoItem(a CustomItem ) object
+     */
+    private Object initLCDUI()
+    {
+        final String DEBUG_STR="VideoControl::initLCDUI()";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"+");
+        iVideoItem = new VideoItem(((AnimationPlayer)iPlayer).getImageDimension());
         iPlayer.addPlayerListener(iVideoItem);
         iStatus = USE_GUI_PRIMITIVE;
         Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR+"-");
         return iVideoItem;
-	}
+    }
+
+    /**
+    * Initializes USE_GUI_PRIMITIVE mode when null parameter is given to
+    * initDisplayMode method.
+    * UI toolkit gets selected when application uses UI toolkit
+    * first time. After this selection null parameter must be
+    * interpreted as the selected UI toolkit. initDisplayMode call
+    * with null parameter before the selection must cause
+    * IllegalArgumentException if there are several toolkits.
+    * @return GUI object
+    */
+    private Object initNullMode()
+    {
+        String DEBUG_STR = "VideoControl::initNullMode()";
+        // TODO remove this 'toolkit' variable
+        String toolkit = null;
+        Object guiObject = null;
 
-		/**
-	    * Initializes USE_GUI_PRIMITIVE mode when null parameter is given to
-	    * initDisplayMode method.
-	    * UI toolkit gets selected when application uses UI toolkit
-	    * first time. After this selection null parameter must be
-	    * interpreted as the selected UI toolkit. initDisplayMode call
-	    * with null parameter before the selection must cause
-	    * IllegalArgumentException if there are several toolkits.
-	    * @return GUI object
-	    */
-	private Object initNullMode() {
-		String DEBUG_STR = "VideoControl::initNullMode()";
-		// Removing following line as per new requirement. 
-		// there won't be any toolkit 
-//		UiToolkitRegister uiRegister = RuntimeInfoFactory.getRuntimeInfo()
-//				.getUiToolkitRegister();
-//		// returns always non null array with zero or more strings
-//		String[] toolkits = uiRegister.getRegisteredUiToolkits();
-		// selected toolkit or null if not selected
-		//String toolkit = (toolkits.length > 0) ? toolkits[0] : null;
-		// TODO remove this 'toolkit' variable 
-		String toolkit = null;
-		Object guiObject = null;
+        // If LCDUI was selected init it even if there might be several
+        // toolkits. This is done to support existing applications.
+        if ((LCDUI_PACKAGE + DISPLAY).equals(toolkit))
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "going to use initLCDUI function ");
+            guiObject = initLCDUI();
+        }
+        else
+        {
+            try
+            {
+                // Several UI toolkits are supported if there are eSWT classes
+                // and eSWT direct content component
+                // Trying to load eSWT Listener interface or eSWT GUI factory
+                // does not cause any initialization to eSWT.
+                Class.forName(ESWT_PACKAGE + LISTENER);
+                // check if eSWT was selected
+                if ((ESWT_PACKAGE + DISPLAY).equals(toolkit))
+                {
+                    Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR
+                               + "It is eswtPackage going to call initDynamicDisplay ");
+                    guiObject = initDynamicDisplayMode(ESWT_PACKAGE
+                                                       + ESWT_CONTROL);
 
-		// If lcdui was selected init it even if there might be several
-		// toolkits. This is done to support existing applications.
-		if ((LCDUI_PACKAGE + DISPLAY).equals(toolkit)) {
-			Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR + "going to use initLCDUI function ");
-			guiObject = initLCDUI();
-		} else {
-			try {
-				// Several UI toolkits are supported if there are eSWT classes
-				// and eSWT direct content component
-				// Trying to load eSWT Listener interface or eSWT GUI factory
-				// does not cause any initialization to eSWT.
-				Class.forName(ESWT_PACKAGE + LISTENER);
-				// check if eSWT was selected
-				if ((ESWT_PACKAGE + DISPLAY).equals(toolkit))
-				{
-					Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,DEBUG_STR
-									+ "It is eswtPackage going to call initDynamicDisplay ");
-					guiObject = initDynamicDisplayMode(ESWT_PACKAGE
-					+ ESWT_CONTROL);
+                }
+                else
+                {
+                    // If no toolkit is registered and if LCDUI library exists
+                    // select it
+                    try
+                    {
+                        Class.forName(LCDUI_PACKAGE + DISPLAY);
+                        guiObject = initLCDUI();
+                    }
+                    catch (ClassNotFoundException cnfe)
+                    {
+                        // If there are several toolkits and none is selected
+                        // IllegalArgumentException must be thrown
+                        throw new IllegalArgumentException(
+                            "UI toolkit is not available or found.");
+                    }
+                }
+            }
+            catch (ClassNotFoundException cnfe)
+            {
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EError,DEBUG_STR
+                           + "Exception caought, going to call initLCDUI funtion");
+                // Only lcdui is supported
+                guiObject = initLCDUI();
+            }
+        }
+        return guiObject;
+    }
 
-				} else {
-					// If no toolkit is registered and if LCDUI library exists
-					// select it
-					try {
-						Class.forName(LCDUI_PACKAGE + DISPLAY);
-						guiObject = initLCDUI();
-					} catch (ClassNotFoundException cnfe) {
-						// If there are several toolkits and none is selected
-						// IllegalArgumentException must be thrown
-						throw new IllegalArgumentException(
-								"UI toolkit is not available or found.");
-					}
-				}
-			} catch (ClassNotFoundException cnfe) {
-				Logger.LOG(Logger.EJavaMMAPI, Logger.EError,DEBUG_STR
-						+ "Exception caought, going to call initLCDUI funtion");
-				// Only lcdui is supported
-				guiObject = initLCDUI();
-			}
-		}
-		return guiObject;
-	}
-	    
-	    /**
-	     * 
-	     * @param aMode class name of the component 
-	     * @return
-	     */
-	// TODO this ProxyControl object should not be used as member variable of VC. 
-	private ProxyControl control=null;
-	private Object initDynamicDisplayMode(Object aMode) {
-		final String DEBUG_STR="VideoControl::initDynamicDisplayMode()";
-		try {
-			// Following line make sure that class name provided in aMode is proper
-			// TODO is it necessary to load the class name 
-			Class guiClass = Class.forName((String)aMode);
-			iDisplay.syncExec(new Runnable() {
-				public void run() {
-					control=new ProxyControl(((AnimationPlayer)iPlayer).getImageDimension());
-				}
-			});
-		} catch (ClassNotFoundException cnfe) {
-			// if the class could not be found
-			throw new IllegalArgumentException(
-					"Mode not supported or invalid, "
-							+ "valid modes are USE_DIRECT_VIDEO and USE_GUI_PRIMITIVE");
-//		} catch (IllegalAccessException iae) {
-//			// if the class or initializer is not accessible
-//			throw new IllegalArgumentException("Mode: " + aMode + " caused "
-//					+ iae);
-//		} catch (InstantiationException ie) {
-//			// if an application tries to instantiate an abstract class or an
-//			// interface, or if the instantiation fails for some other reason
-//			throw new IllegalArgumentException("Mode: " + aMode + " caused "
-//					+[= ie);
-		} catch (ClassCastException cce) {
-			// Thrown to indicate that the code has attempted to cast an
-			// object to a subclass of which it is not an instance.
-			throw new IllegalArgumentException("Mode: " + aMode + " caused "
-					+ cce);
-		}
-		// TODO remove this catch(Exception) block, it is added for testing purpose  
-		catch(Exception e){
-			Logger.LOG(Logger.EJavaMMAPI, Logger.EError,"Exception thrown while creating the control object"+e);
-			e.printStackTrace();
-		}
-		return control;
-	}
-	    
-	/* (non-Javadoc)
-	 * @see javax.microedition.media.control.VideoControl#setDisplayFullScreen(boolean)
-	 */
-	public void setDisplayFullScreen(final boolean aFullScreenMode)
-			throws MediaException {
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		//if this is in case of form, return silently 
-		//This is as per earlier NOKIA implementation, 
-		// however MMAPI documentation is saying something different 
-		// if Full screen mode is not supported, it should throw MediaException
-		// TODO further check and discuss....
-		if(iVideoItem!=null) {
-			return;
-		}
-		if(aFullScreenMode){
-			// Before going to full screen mode, we need to store the current display size;
-			// so that when user will exit from the full screen,
-			// it will return to it's previous size
-			iOldDisplaySize = ((AnimationPlayer)iPlayer).getImageDimension();
-			Rectangle displayDimension=calculateFullScreenDimension(); 
-			((AnimationPlayer)iPlayer).updateImageData(displayDimension.width, displayDimension.height);
-			setDisplayLocation(displayDimension.x, displayDimension.y);
-			((AnimationPlayer)iPlayer).getiPlayerListenerImpl().postEvent(PlayerListener.SIZE_CHANGED, this);
-		}else{
-			// user may call setFullScreen(false), prior to setting it full screen 
-			if(iOldDisplaySize!=null){
-				((AnimationPlayer)iPlayer).updateImageData(iOldDisplaySize);
-				// Do we need to make it null?
-				iOldDisplaySize=null;
-				// post event to player Listener 
-				((AnimationPlayer)iPlayer).getiPlayerListenerImpl().postEvent(PlayerListener.SIZE_CHANGED, this);
-			}
-		}
-	}
+    /**
+     *
+     * @param aMode class name of the component
+     * @return
+     */
+    // TODO this ProxyControl object should not be used as member variable of VC.
+    private ProxyControl control=null;
+    private Object initDynamicDisplayMode(Object aMode)
+    {
+        try
+        {
+            // Following line make sure that class name provided in aMode is proper
+            // TODO is it necessary to load the class name
+            Class guiClass = Class.forName((String)aMode);
+            iDisplay.syncExec(new Runnable()
+            {
+                public void run()
+                {
+                    control=new ProxyControl(((AnimationPlayer)iPlayer).getImageDimension());
+                }
+            });
+        }
+        catch (ClassNotFoundException cnfe)
+        {
+            // if the class could not be found
+            throw new IllegalArgumentException(
+                "Mode not supported or invalid, "
+                + "valid modes are USE_DIRECT_VIDEO and USE_GUI_PRIMITIVE");
+//      } catch (IllegalAccessException iae) {
+//          // if the class or initializer is not accessible
+//          throw new IllegalArgumentException("Mode: " + aMode + " caused "
+//                  + iae);
+//      } catch (InstantiationException ie) {
+//          // if an application tries to instantiate an abstract class or an
+//          // interface, or if the instantiation fails for some other reason
+//          throw new IllegalArgumentException("Mode: " + aMode + " caused "
+//                  +[= ie);
+        }
+        catch (ClassCastException cce)
+        {
+            // Thrown to indicate that the code has attempted to cast an
+            // object to a subclass of which it is not an instance.
+            throw new IllegalArgumentException("Mode: " + aMode + " caused "
+                                               + cce);
+        }
+        // TODO remove this catch(Exception) block, it is added for testing purpose
+        catch (Exception e)
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EError,"Exception thrown while creating the control object"+e);
+            e.printStackTrace();
+        }
+        return control;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.microedition.media.control.VideoControl#setDisplayFullScreen(boolean)
+     */
+    public void setDisplayFullScreen(final boolean aFullScreenMode)
+    throws MediaException
+    {
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        //if this is in case of form, return silently
+        //This is as per earlier NOKIA implementation,
+        if (iVideoItem!=null)
+        {
+            return;
+        }
+        if (aFullScreenMode)
+        {
+            // Before going to full screen mode, we need to store the current display size;
+            // so that when user will exit from the full screen,
+            // it will return to it's previous size
+            iOldDisplaySize = ((AnimationPlayer)iPlayer).getImageDimension();
+            Rectangle displayDimension=calculateFullScreenDimension();
+            ((AnimationPlayer)iPlayer).updateImageData(displayDimension.width, displayDimension.height);
+            setDisplayLocation(displayDimension.x, displayDimension.y);
+            ((AnimationPlayer)iPlayer).getiPlayerListenerImpl().postEvent(PlayerListener.SIZE_CHANGED, this);
+        }
+        else
+        {
+            // user may call setFullScreen(false), prior to setting it full screen
+            // so making it sure here that iOldDisplaySize is not null
+            if (iOldDisplaySize!=null)
+            {
+                ((AnimationPlayer)iPlayer).updateImageData(iOldDisplaySize);
+                // Do we need to make it null?
+                iOldDisplaySize=null;
+                // post event to player Listener
+                ((AnimationPlayer)iPlayer).getiPlayerListenerImpl().postEvent(PlayerListener.SIZE_CHANGED, this);
+            }
+        }
+    }
 
-	/* (non-Javadoc)
-	 * @see javax.microedition.media.control.VideoControl#setDisplayLocation(int, int)
-	 */
-	public void setDisplayLocation(int aX, int aY) {
-		// in case of customItem, we are getting canvasExtension as control 
-		// and in this case we need to ignore the setDisplayLocation call.
-		// it is also possible that iControl may be null( it will be null until and unless
-		// notifyControlAvailable function is not get called)
-		if(iControl==null || (iControl instanceof org.eclipse.swt.internal.extension.CanvasExtension))
-			return ;
-		((AnimationPlayer)iPlayer).setDisplayLocation(aX, aY);
-	}
+    /* (non-Javadoc)
+     * @see javax.microedition.media.control.VideoControl#setDisplayLocation(int, int)
+     */
+    public void setDisplayLocation(int aX, int aY)
+    {
+        // Need to ignore this call in case of USE_GUI_PRIMITIVE
+        // in case of customItem, we are getting canvasExtension as control
+        // and in this case we need to ignore the setDisplayLocation call.
+        // it is also possible that iControl may be null( it will be null until and unless
+        // notifyControlAvailable function is not get called)
+        System.out.println("VideoControl::setDisplayLocation() curretn status is "+iStatus);
+        if (iControl==null || (iControl instanceof org.eclipse.swt.internal.extension.CanvasExtension))
+            return ;
+        ((AnimationPlayer)iPlayer).setDisplayLocation(aX, aY);
+    }
 
-	/** 
-	 * (non-Javadoc)
-	 * @see javax.microedition.media.control.VideoControl#setDisplaySize(int, int)
-	 */
-	// TODO we need to handle here the following scenario
-	// if the player is in FULL_SCREEN mode, just change the display size in background(means do not exit from 
-	// the full screen mode and don't send event to player Listener the player size changed )
-	// and changed side should take effect 
-	public void setDisplaySize(int aWidth, int aHeight) throws MediaException {
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		if (aWidth <= 0 || aHeight <= 0) {
-			throw new IllegalArgumentException(
-					"Width and height must be positive");
-		}
-		// resize the all frames 
-		((AnimationPlayer) iPlayer).updateImageData(aWidth, aHeight);
-		// Since the DisplaySize is being changed, we need to change the
-		// size of VideoItem as well
-		// if the videoItem is not null, it means currently we are playing
-		// animation on form
-		if (iVideoItem != null)// means it is for customItem
-			iVideoItem.setPreferredSize(aWidth, aHeight);
-		// Notify to all player listener that video Size has been changed
-		((AnimationPlayer) iPlayer).getiPlayerListenerImpl().postEvent(
-				PlayerListener.SIZE_CHANGED, this);
-	}
+    /**
+     * (non-Javadoc)
+     * @see javax.microedition.media.control.VideoControl#setDisplaySize(int, int)
+     */
+    // TODO we need to handle here the following scenario
+    // if the player is in FULL_SCREEN mode, just change the display size in background(means do not exit from
+    // the full screen mode and don't send event to player Listener the player size changed )
+    // and changed side should take effect
+    public void setDisplaySize(int aWidth, int aHeight) throws MediaException
+    {
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        if (aWidth <= 0 || aHeight <= 0)
+        {
+            throw new IllegalArgumentException(
+                "Width and height must be positive");
+        }
+        // resize the all frames
+        ((AnimationPlayer) iPlayer).updateImageData(aWidth, aHeight);
+        // Since the DisplaySize is being changed, we need to change the
+        // size of VideoItem as well
+        // if the videoItem is not null, it means currently we are playing
+        // animation on form
+        if (iVideoItem != null)// means it is for customItem
+            iVideoItem.setPreferredSize(aWidth, aHeight);
+        // Notify to all player listener that video Size has been changed
+        ((AnimationPlayer) iPlayer).getiPlayerListenerImpl().postEvent(
+            PlayerListener.SIZE_CHANGED, this);
+    }
+
+    /**
+     * Show or hide the video.
+     * If USE_GUI_PRIMITIVE is set, the video by default is shown when the GUI primitive is displayed.
+     * If USE_DIRECT_VIDEO is set, the video by default is not shown when the canvas is displayed until
+     * setVisible(true) is called. If the canvas is removed from the screen, the video will not be displayed.
+     *
+     * @return visible - Show the video if true, hide it otherwise.
+     * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called.
+     */
+    public void setVisible(final boolean aVisible)
+    {
+        if (iStatus == NOT_INITIALIZED)
+        {
+            throw new IllegalStateException(
+                "VideoControl.initDisplayMode() not called yet");
+        }
+        if (iControl != null)
+        {
+            ((AnimationPlayer)iPlayer).setiIsControlVisible(aVisible);
+            // even if the player is stopped, need to give the effect of
+            // setVisible
+            iDisplay.syncExec(new Runnable()
+            {
+                public void run()
+                {
+                    iControl.redraw();//setVisible(aVisible);
+                }
+            });
+        }
+    }
+    /*******************************FOLLOWING FUNCTIONS ARE USED FOR INTERNAL PURPOSE***********************/
+    /**
+     *
+     * @return Display object retrieved from ESWT
+     */
+    Display getiDisplay()
+    {
+        return iDisplay;
+    }
 
-	/**
-	 * Show or hide the video.
-	 * If USE_GUI_PRIMITIVE is set, the video by default is shown when the GUI primitive is displayed.
- 	 * If USE_DIRECT_VIDEO is set, the video by default is not shown when the canvas is displayed until
- 	 * setVisible(true) is called. If the canvas is removed from the screen, the video will not be displayed.
- 	 * 
- 	 * @return visible - Show the video if true, hide it otherwise.
- 	 * @throws java.lang.IllegalStateException - Thrown if initDisplayMode has not been called. 
-	 */
-	public void setVisible(final boolean aVisible) {
-		if (iStatus == NOT_INITIALIZED) {
-			throw new IllegalStateException(
-					"VideoControl.initDisplayMode() not called yet");
-		}
-		// if this is in case of Form and eSWT Control then this implementation is OK
-		// but in case of Canvas, entire Canvas is getting invisible, which is not OK.
-		// TODO handle the case of Canvas case as well
-		//TODO in case of Canvas visiblity should be false by default
-		// while in case of Form it should be true. 
-		if (iControl != null) {
-			iDisplay.syncExec(new Runnable() {
-				public void run() {
-					iControl.setVisible(aVisible);
-				}
-			});
-		}
-	}
-	/*******************************FOLLOWING FUNCTIONS ARE USED FOR INTERNAL PURPOSE***********************/
-	/**
-	 * 
-	 * @return Display object retrieved from ESWT
-	 */
-	Display getiDisplay() {
-		return iDisplay;
-	}
-	
-	/**
-	 * 
-	 * @return
-	 */
-	Control getControl() {
-		return iControl;
-	}
-	/**
-	 * Function of ItemStateChangeListener
-	 * Notified by LCDUI implementation  
-	 * @param ctrl
-	 * @param item
-	 */
-	public void notifyControlAvailable(Control ctrl,Item item){
-		final String DEBUG_STR= "VideoControl::notifyControlAvailable(Control ctrl,Item item)";
-		iControl=ctrl;
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo, DEBUG_STR+"Control is "+ctrl.hashCode()+ " Item is "+item);
-		//TODO is it proper here to put the below line in try/catch?, remove if we can.
-		// Otherwise it may deteriorate the performance, as in case of CustomItem on each 
-		// repaint, eSWT control is getting destroyed, and reconstructed
-		try {
-			((AnimationPlayer)iPlayer).addPaintListener(iControl);
-		} catch (MediaException e) {
-			// TODO What to do here
-			e.printStackTrace();
-		}
-	}
-	/**
-	 * Function of ItemStateChangeListener
-	 * We don't need to do anything in this function
-	 * 
-	 * @param item
-	 */
-	 public void notifyControlDisposed(Item item){
-		final String DEBUG_STR= "VideoControl::notifyControlDisposed(Item item)";
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo, DEBUG_STR+"Item Disposed is "+item);
-	}
-	
-	/**
-	 * This function calculate the size and location of the image in case of full screen
-	 * So that Aspect ratio should be maintained 
-	 * @return Rectangle, After calculating the size of the Video(image) in full screen mode 
-	 */
-	// It is not the proper way to declare the variable as global variable 
-	// only for the reason that it should be accessible in inner class.
-	// Following variable(deviceDimension) declared shouldn't be the part of VideoControl object. 
-	// My suggestion:- Move it to some utility class 
-	// TODO let's discuss 
-	private Rectangle deviceDimension;
-	private Rectangle calculateFullScreenDimension(){
-		Point actualImageSize = ((AnimationPlayer)iPlayer).getImageDimension();
-		// initialize the deviceDimension, in local variable
-		iDisplay.syncExec(new Runnable() {
-			public void run() {
-				//deviceDimension=iDisplay.getBounds();
-				deviceDimension=iDisplay.getClientArea();
-			}
-		});
-		int deviceWidth=deviceDimension.width;
-		int deviceHeight=deviceDimension.height;
-		//Returning the following rectangle after alteration 
-		Rectangle rect= new Rectangle (0,0,deviceWidth,deviceHeight);
+    /**
+     *
+     * @return
+     */
+    Control getControl()
+    {
+        return iControl;
+    }
+    /**
+     * Function of ItemStateChangeListener
+     * Notified by LCDUI implementation
+     * @param ctrl
+     * @param item
+     */
+    public void notifyControlAvailable(Control ctrl,Item item)
+    {
+        final String DEBUG_STR= "VideoControl::notifyControlAvailable(Control ctrl,Item item)";
+        iControl=ctrl;
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo, DEBUG_STR+"Control is "+ctrl.hashCode()+ " Item is "+item);
+        //TODO is it proper here to put the below line in try/catch?, remove if we can.
+        // Otherwise it may deteriorate the performance, as in case of CustomItem on each
+        // repaint, eSWT control is getting destroyed, and reconstructed
+        ((AnimationPlayer)iPlayer).addPaintListener(iControl);
+    }
+    /**
+     * Function of ItemStateChangeListener
+     * We don't need to do anything in this function
+     *
+     * @param item
+     */
+    public void notifyControlDisposed(Item item)
+    {
+        final String DEBUG_STR= "VideoControl::notifyControlDisposed(Item item)";
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo, DEBUG_STR+"Item Disposed is "+item);
+    }
 
-		// to handle the divide by zero 
-		if(actualImageSize.x==0 && actualImageSize.y==0)
-			return rect;
-		// Following logic has been copied from 
-		 //earlier native implementation ( from cmmadisplay.cpp::ScaleToFullScreen)
-		// Smaller dimension scale ratio will be scaled.
-	    // Changed to area calculation to avoid reals and dimension
-	    // with smaller area will be scaled.
-		// remember that the argument received in this function is a point
-		// and it's x and y coordinate represent the width and height of the image respectively
-		int vDiff=(deviceWidth - actualImageSize.x)* actualImageSize.y;
-		int hDiff= (deviceHeight - actualImageSize.y) * actualImageSize.x;
-		// Check which side to scale to full screen size.
-		// Width or Height will be full size.
-		if(hDiff > vDiff){
-			rect.height = (deviceWidth * actualImageSize.y)/actualImageSize.x;
-			rect.y= (deviceHeight -  rect.height)>>1;// divide by 2
-		}else {
-			rect.width = (deviceHeight * actualImageSize.x)/actualImageSize.y;
-			rect.x= (deviceWidth - rect.width)>>1;
-		}
-		return rect; 
-	}
-	
+    /**
+     * This function calculate the size and location of the image in case of full screen
+     * So that Aspect ratio should be maintained
+     * @return Rectangle, After calculating the size of the Video(image) in full screen mode
+     */
+    // It is not the proper way to declare the variable as global variable
+    // only for the reason that it should be accessible in inner class.
+    // Following variable(deviceDimension) declared shouldn't be the part of VideoControl object.
+    // My suggestion:- Move it to some utility class
+    // TODO let's discuss
+    private Rectangle deviceDimension;
+    private Rectangle calculateFullScreenDimension()
+    {
+        Point actualImageSize = ((AnimationPlayer)iPlayer).getImageDimension();
+        // initialize the deviceDimension, in local variable
+        iDisplay.syncExec(new Runnable()
+        {
+            public void run()
+            {
+                //deviceDimension=iDisplay.getBounds();
+                deviceDimension=iDisplay.getClientArea();
+            }
+        });
+        int deviceWidth=deviceDimension.width;
+        int deviceHeight=deviceDimension.height;
+        //Returning the following rectangle after alteration
+        Rectangle rect= new Rectangle(0,0,deviceWidth,deviceHeight);
+
+        // to handle the divide by zero
+        if (actualImageSize.x==0 && actualImageSize.y==0)
+            return rect;
+        // Following logic has been copied from
+        //earlier native implementation ( from cmmadisplay.cpp::ScaleToFullScreen)
+        // Smaller dimension scale ratio will be scaled.
+        // Changed to area calculation to avoid reals and dimension
+        // with smaller area will be scaled.
+        // remember that the argument received in this function is a point
+        // and it's x and y coordinate represent the width and height of the image respectively
+        int vDiff=(deviceWidth - actualImageSize.x)* actualImageSize.y;
+        int hDiff= (deviceHeight - actualImageSize.y) * actualImageSize.x;
+        // Check which side to scale to full screen size.
+        // Width or Height will be full size.
+        if (hDiff > vDiff)
+        {
+            rect.height = (deviceWidth * actualImageSize.y)/actualImageSize.x;
+            rect.y= (deviceHeight -  rect.height)>>1;// divide by 2
+        }
+        else
+        {
+            rect.width = (deviceHeight * actualImageSize.x)/actualImageSize.y;
+            rect.x= (deviceWidth - rect.width)>>1;
+        }
+        return rect;
+    }
+
 }
--- a/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoItem.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/animation/VideoItem.java	Fri Jun 11 13:33:44 2010 +0300
@@ -25,87 +25,98 @@
 
 import com.nokia.mj.impl.utils.Logger;
 
-public class VideoItem extends CustomItem implements PlayerListener {
-	
-	/**
-	 * Width of this item  
-	 */
-	
-	int iWidth;
-	
-	/**
-	 * Height of this item
-	 */
-	int iHeight;
-	
-	/**
-	 * 
-	 * @param dimension
-	 */
-	protected VideoItem(Point dimension ) {
-		super("");
-		iWidth=dimension.x;
-		iHeight=dimension.y;
-	}
-	
-	/**
-	 * 
-	 * @param w
-	 * @param h
-	 */
-	protected VideoItem(int w, int h) {
-		super("");
-		iWidth=w;
-		iHeight=h;
-	}
-	/**
-	 * @return the minimum content width of the item, used by form while layouting the item  
-	 */
-	protected int getMinContentWidth() {
-		return iWidth;
-	}
+public class VideoItem extends CustomItem implements PlayerListener
+{
+
+    /**
+     * Width of this item
+     */
+
+    int iWidth;
+
+    /**
+     * Height of this item
+     */
+    int iHeight;
+
+    /**
+     *
+     * @param dimension
+     */
+    protected VideoItem(Point dimension)
+    {
+        super("");
+        iWidth=dimension.x;
+        iHeight=dimension.y;
+    }
+
+    /**
+     *
+     * @param w
+     * @param h
+     */
+    protected VideoItem(int w, int h)
+    {
+        super("");
+        iWidth=w;
+        iHeight=h;
+    }
+    /**
+     * @return the minimum content width of the item, used by form while layouting the item
+     */
+    protected int getMinContentWidth()
+    {
+        return iWidth;
+    }
 
-	/**
-	 * @return the minimum content height of the item, used by form while layouting the item 
-	 */
-	protected int getMinContentHeight() {
-		return iHeight;
-	}
-	
-	/**
-	 * @return the preferred content width of the item, used by form while layouting the item 
-	 */
-	protected int getPrefContentWidth(int height) {
-		return iWidth;
-	}
+    /**
+     * @return the minimum content height of the item, used by form while layouting the item
+     */
+    protected int getMinContentHeight()
+    {
+        return iHeight;
+    }
 
-	/**
-	 * @return the preferred content height of the item, used by form while layouting the item 
-	 */
+    /**
+     * @return the preferred content width of the item, used by form while layouting the item
+     */
+    protected int getPrefContentWidth(int height)
+    {
+        return iWidth;
+    }
+
+    /**
+     * @return the preferred content height of the item, used by form while layouting the item
+     */
 
-	protected int getPrefContentHeight(int width) {
-		return iHeight;
-	}
-	/**
-	 * This is dummy implementation of the paint method. 
-	 */
-	int count;
-	protected void paint(Graphics g, int w, int h) {
-		//TODO remove this code later
-		// this is added just for testing purpose 
-		g.setColor(0x00a000);
-		g.fillRect(0,0,w,h);
-		g.setColor(0xFFFFFF);
-		g.drawString("paint"+(count++), w>>1, h>>1, Graphics.BASELINE|Graphics.HCENTER);
-	}
-	
-	/**
-	 * Whenever player will be resized this function will be invoked and it will call the invalidate method of custom item 
-	 */
-	public void playerUpdate(Player aPlayer, String aEvent, Object aEventData) {
-		Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"VideoItem::playerUpdate() Event is "+aEvent+"Event Data is "+aEventData);
-		if (aEvent == SIZE_CHANGED) {
-			invalidate();
-		}
-	}
+    protected int getPrefContentHeight(int width)
+    {
+        return iHeight;
+    }
+    /**
+     * This is dummy implementation of the paint method.
+     */
+    int count;
+    protected void paint(Graphics g, int w, int h)
+    {
+        //TODO remove this code later
+        // this is added just for testing purpose
+        System.out.println("VideoItem::paint()");
+        g.setColor(0x00a000);
+        g.fillRect(0,0,w,h);
+        g.setColor(0xFFFFFF);
+        g.drawString("paint"+(count++), w>>1, h>>1, Graphics.BASELINE|Graphics.HCENTER);
+    }
+
+    /**
+     * Whenever player will be resized this function will be invoked and it will call the invalidate method of custom item
+     */
+    public void playerUpdate(Player aPlayer, String aEvent, Object aEventData)
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"VideoItem::playerUpdate() Event is "+aEvent+"Event Data is "+aEventData);
+        if (aEvent == SIZE_CHANGED)
+        {
+            invalidate();
+        }
+    }
 }
--- a/javauis/mmapi_qt/baseline/src/cmmacameraplayer.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/baseline/src/cmmacameraplayer.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -19,6 +19,7 @@
 //  INCLUDE FILES
 #include <logger.h>
 #include <fbs.h>
+#include <e32svr.h>
 #include "cmmacameraplayer.h"
 #include "tmmaparametervalidator.h"
 #include "mmmadisplay.h"
--- a/javauis/mmapi_qt/src_drmv2/src/cmmadrmplayerfactory.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/mmapi_qt/src_drmv2/src/cmmadrmplayerfactory.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -19,9 +19,10 @@
 //  INCLUDE FILES
 #include <logger.h>
 
+#include <caf/cafplatform.h>
+#include <caf/stringattributeset.h>
 #include <DRMCommon.h>
 #include <DRMHelper.h>
-#include <caf/stringattributeset.h>
 
 #include "cmmadrmplayerfactory.h"
 #include "cmmadrmaudioplayer.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/build/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,33 @@
+<!--
+#
+# Copyright (c) 2008-2009 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: 
+#
+-->
+
+<project name="javanokiasound" default="deploy" basedir=".">
+
+  <import file="../../../build/utilities.xml"/>
+
+    <!-- Needed by the utilities.xml. See the description form the utilities.xml
+       file -->
+  <property name="javah.classnames" 
+            value="com.nokia.mid.sound.Sound"/>
+            
+  <target name="create.public.api.jar">
+      <omj.public.apis includes="com/nokia/mid/sound/Sound.class,
+                                 com/nokia/mid/sound/SoundListener.class"/>
+  </target>
+  
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/build/bwins/javanokiasoundu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?jni_lookup@@YAP6AXXZPBD@Z @ 1 NONAME ; void (*)(void) jni_lookup(char const *)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/build/eabi/javanokiasoundu.def	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z10jni_lookupPKc @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/build/javanokiasound.pro	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 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: 
+#
+
+TEMPLATE=lib
+TARGET=javanokiasound
+CONFIG += omj java stl
+CONFIG -= qt
+
+LIBS += -lcenrepnotifhandler \
+        -lcentralrepository \
+        -lmediaclientaudio \
+        -lcommonengine \
+        -ljavautils
+
+include(../../../build/omj.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/CMIDClip.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,73 @@
+/*
+* Copyright (c) 2006-2007 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:  This class implements wav playing.
+*
+*/
+
+
+#ifndef CMIDCLIP_H
+#define CMIDCLIP_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <mdaaudiosampleplayer.h>
+
+#include "CMIDSoundImpl.h"
+
+// FORWARD DECLARATIONS
+class MMIDEventSender;
+
+//  CLASS DEFINITION
+/**
+ * This class implements wav playing.
+ *
+ */
+NONSHARABLE_CLASS(CMIDClip): public CMIDSoundImpl,
+        public MMdaAudioPlayerCallback
+{
+public:
+
+    static CMIDClip* NewL(const TDesC8* aData, MMIDEventSender* aEventSender);
+    //   Destructor
+    ~CMIDClip();
+
+protected:
+
+    //   C++ constructor
+    CMIDClip(MMIDEventSender* aEventSender);
+    //   Second phase
+    void ConstructL(const TDesC8* aData);
+
+public:
+
+    virtual TInt Play(TInt aLoop);
+    virtual void Stop();
+    virtual void SetVolume(TInt aVolume);
+    virtual TInt Volume();
+    virtual void Release();
+
+public: // from MMdaAudioPlayerCallback
+    void MapcInitComplete(TInt aError,
+                          const TTimeIntervalMicroSeconds& aDuration);
+    void MapcPlayComplete(TInt aError);
+
+private:
+
+    HBufC8* iClip;
+    CMdaAudioPlayerUtility* iMdaAudioPlayerUtility;
+    TInt iLoops;
+    TInt iVolume;
+};
+
+#endif // CMIDCLIP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/CMIDSound.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2006 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:  Wrapper for CMIDClip and CMIDTone class initialisations.
+*
+*/
+
+
+//  INCLUDES
+#include <mevents.h>
+#include <e32base.h>
+#include <cenrepnotifyhandler.h>
+#include "MMIDEventSender.h"
+#include "functionserver.h"
+
+// FORWARD DECLARATIONS
+class CMIDSoundImpl;
+
+// CLASS DEFINITION
+/**
+ * CMIDSound is a wrapper that handles which class is
+ * wanted to be initialised, CMIDClip or CMIDTone
+ *
+ */
+NONSHARABLE_CLASS(CMIDSound):
+        public CBase, MCenRepNotifyHandlerCallback, MMIDEventSender, java::util::FunctionServer
+{
+
+public:
+
+    //   Destructor
+    ~CMIDSound();
+
+public: // From MCenRepNotifyHandlerCallback
+    /**
+     * Notifies this class about changes in the audio enable status
+     */
+    void HandleNotifyInt(TUint32 aId, TInt aNewValue);
+
+public: // From MMIDEventSender
+    /**
+    * Sends event to Java SoundListener.
+    * @since 3.0
+    * @param aEventType Type of the event to send
+    */
+    void SendEvent(TInt aEventType);
+
+protected:
+
+    //  C++ default constructor
+    CMIDSound();
+
+private:
+    TBool IsAudioEnabled();
+
+public:
+
+    static CMIDSound* NewL(JNIEnv& aJni, jobject aSound);
+    void SetBeep(TInt aFreq, TInt64 aDuration);
+    TInt Init(TInt aType, const TDesC8* aData);
+    void InitL(TInt aType, const TDesC8* aData);
+    TInt InitProfileListener();
+    void InitProfileListenerL();
+    TInt Play(TInt aLoop);
+    TInt DoPlay(TInt aLoop);
+    void Resume();
+    void DoResume();
+    void Stop();
+    void DoStop();
+    TInt SoundVolume();
+    TInt Volume();
+    void SetVolume(TInt aVolume);
+    void DoSetVolume(TInt aVolume);
+    TInt State();
+    TInt PlayerState();
+    void Release();
+    void DoRelease();
+
+
+private:
+
+    CMIDSoundImpl* iMIDSound;
+    TInt iFreq;
+    TInt64 iDur;
+    TInt iSource;
+    TInt iRealVolume;
+
+    // owned, informs about changes in iRepository
+    CCenRepNotifyHandler* iProfileListener;
+
+    // owned, current profile
+    CRepository* iRepository;
+
+    TInt iHandle;
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/CMIDSoundEvent.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2006-2007 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:  Class for sound related events.
+*
+*/
+
+
+#ifndef CMIDSOUNDEVENT_H
+#define CMIDSOUNDEVENT_H
+
+#include <jni.h>
+
+//  CLASS DEFINITION
+
+/**
+ * Class for sound related events.
+ */
+NONSHARABLE_CLASS(CMIDSoundEvent)
+{
+public: // constructor
+    CMIDSoundEvent(TInt aEvent);
+
+public: // new methods
+    /**
+     * Setter for listener
+     * @param aListener this event will be sent to this listener
+     */
+    void SetListener(jobject aListener);
+
+    /**
+     * Setter for method ID
+     * @param aMethodID this event will be sent by calling this method
+     */
+    void SetMethodID(jmethodID aMethodID);
+
+    /**
+     * Adds a global reference to peer object, this reference is
+     * removed when the event is dispatched. This prevents peer
+     * object from being deleted by garbage collector before the
+     * event has been dispatched.
+     */
+    void AddGlobalRef(JavaVM* javaVM);
+
+
+private:
+    void Dispatch(JNIEnv& aJni);
+
+private:
+    jobject iListener;
+    jmethodID iMethodID;
+    TInt iEvent;
+    jobject iGlobalRef;
+    // Number of times the global reference has been added.
+    // The actual global reference is removed when the counter reaches zero.
+    TInt iRefCount;
+
+};
+
+
+#endif // CMIDSOUNDEVENT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/CMIDSoundImpl.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2006-2007 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:  Interface and a base class for CMIDClip and CMIDTone.
+*
+*/
+
+
+
+#ifndef CMIDSOUNDIMPL_H
+#define CMIDSOUNDIMPL_H
+
+//  INCLUDES
+#include <e32base.h>
+
+// FORWARD DECLARATIONS
+class MMIDEventSender;
+
+
+//  CLASS DEFINITION
+/**
+ * This class is interface and a base class for CMIDClip and CMIDTone
+ *
+ */
+NONSHARABLE_CLASS(CMIDSoundImpl): public CBase
+{
+
+public:
+
+    enum TState
+    {
+        ENotReady,
+        EReadyToPlay,
+        EPlaying,
+        ENotSupported,
+        EInitialising
+    };
+
+public:
+
+    // destructor
+    ~CMIDSoundImpl();
+
+protected:
+
+    void ConstructL();
+
+    // C++ constructor
+    CMIDSoundImpl(MMIDEventSender* aEventSender);
+
+public:
+
+    void Resume();
+
+    virtual TInt Play(TInt aLoop) = 0;
+    virtual void Stop() = 0;
+    virtual void SetVolume(TInt aVolume) = 0;
+    virtual TInt Volume() = 0;
+    virtual void Release() = 0;
+
+    inline TInt State() const;
+
+protected:
+
+
+    TInt iState;
+
+    // true if playback has been started.
+    TBool iPlayed;
+
+    CActiveSchedulerWait* iSchedulerWait;
+
+    // events are sent through this interface
+    MMIDEventSender* iEventSender;
+
+};
+
+inline TInt CMIDSoundImpl::State() const
+{
+    return iState;
+};
+
+#endif // CMIDSOUNDIMPL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/CMIDTone.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2006-2007 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:  This class implements beep playing and OTA ringingtone playing.
+*
+*/
+
+
+#ifndef CMIDTONE_H
+#define CMIDTONE_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <mdaaudiotoneplayer.h>
+
+#include "CMIDSoundImpl.h"
+
+// FORWARD DECLARATIONS
+class MMIDEventSender;
+
+//  CLASS DEFINITION
+/**
+ *  This class implements beep playing and OTA ringingtone playing.
+ *
+ */
+NONSHARABLE_CLASS(CMIDTone): public CMIDSoundImpl, public MMdaAudioToneObserver
+{
+public:
+
+    static CMIDTone* NewL(TInt aFreq, TInt64 aDuration,
+    MMIDEventSender* aEventSender);
+    static CMIDTone* NewL(const TDesC8& aData, MMIDEventSender* aEventSender);
+    //   Destructor
+    ~CMIDTone();
+
+protected:
+
+    //   C++  constructor
+    CMIDTone(MMIDEventSender* aEventSender);
+    //   Second phase
+    void ConstructL(TInt aFreq, TInt64 aDuration);
+    void ConstructL(const TDesC8& aData);
+
+public:
+
+    virtual TInt Play(TInt aLoop);
+    virtual void Stop();
+    virtual void SetVolume(TInt aVolume);
+    virtual TInt Volume();
+    virtual void Release();
+
+public: // from MMdaAudioToneObserver
+
+    void MatoPrepareComplete(TInt aError);
+    void MatoPlayComplete(TInt aError);
+
+private:
+
+    TInt iFreq;
+    TInt64 iDuration;
+    CMdaAudioToneUtility* iMdaAudioToneUtility;
+};
+
+#endif // CMIDTONE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/inc/MMIDEventSender.h	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2005 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:  SoundImpl instances can send events through this interface
+*
+*/
+
+
+
+#ifndef MMIDEVENTSENDER_H
+#define MMIDEVENTSENDER_H
+
+/**
+*  SoundImpl instances cand send events through this interface.
+*  This interface has only one method, SendEvent(), which can be used
+*  for sending all types of sound events.
+*
+*  @since 3.0
+*/
+NONSHARABLE_CLASS(MMIDEventSender)
+{
+
+public: // New functions
+
+    /**
+    * Sends event to Java SoundListener.
+    * @since 3.0
+    * @param aEventType Type of the event to send
+    */
+    virtual void SendEvent(TInt aEventType) = 0;
+
+protected:
+
+    /**
+    * C++ default constructor.
+    */
+    MMIDEventSender() { }
+
+private:
+
+    // Prohibit copy constructor if not deriving from CBase.
+    MMIDEventSender(const MMIDEventSender&) { }
+    // Prohibit assigment operator if not deriving from CBase.
+    MMIDEventSender& operator=(const MMIDEventSender&)
+    {
+        return *this;
+    }
+
+};
+
+#endif // MMIDEVENTSENDER_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/javasrc/com/nokia/mid/sound/Sound.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,698 @@
+/*
+* Copyright (c) 2006 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:  Provides Sound API for playing tones and digitized audio.
+*
+*/
+
+
+package com.nokia.mid.sound;
+
+import com.nokia.mj.impl.rt.support.Finalizer;
+import java.util.Vector;
+import com.nokia.mj.impl.utils.Logger;
+import java.lang.Thread;
+
+/**
+ * <p>
+ * Provides simple Sound API for playing tones and digitized audio.
+ * </p><p>
+ * Since MIDP doesn't have any Sound API for games there is a need
+ * for proprietary sound extension to support devices audio
+ * capabilities. Every implementation has capability to produce tone
+ * sounds (e.g. ringing tones), this is the minimum support. Currently
+ * some products support or will support also digitized audio formats.
+ * The Game sound API will support both buzzer and digitized audio.
+ * Buzzer must be supported by all implementations. If implementation
+ * doesn't have buzzer the buzzer tones are emulated.
+ * </p>
+ * Since implementations have different audio capabilities,
+ * application can query which audio formats are supported by
+ * implementation by calling {@link #getSupportedFormats()}.
+ * <p>
+ * All implementations need to support at least tone based sounds
+ * (type FORMAT_TONE) via {@link #Sound(int freq, long duration)} and
+ * {@link #init(int freq, long duration)}. In addition all implementations
+ * must support Smart messaging ringingtone format (type FORMAT_TONE)
+ * via {@link #Sound(byte[] data, int type)} and
+ * {@link #init(byte[] data, int type) }.
+ * <p>
+ * Note that there is also work going on with Multimedia API that
+ * is done in JCP as
+ * <a href="http://www.jcp.org/jsr/detail/135.jsp">JSR 135</a>.
+ * The standard Multimedia API
+ * will replace the proprietary Game Sound API when it is ready. However
+ * Sound API will be supported also later on but probably it will be
+ * stated as deprecated.
+ * </p>
+ * @version 1.1
+ * @see com.nokia.mid.ui.DeviceControl
+ * @since 1.0
+ */
+
+public class Sound
+{
+
+    /**
+     * Tone based format is used.
+     *
+     * init(int freq, int duration) puts sound into this format.
+     * @since 1.0
+     *
+     */
+    public static final int FORMAT_TONE = 1;
+
+    /**
+     * Content is in WAV format.
+     * @since 1.0
+     *
+     */
+    public static final int FORMAT_WAV = 5;
+
+    /**
+     * Sound is playing.
+     * @since 1.0
+     *
+     */
+    public static final int SOUND_PLAYING = 0;
+
+    /**
+     * Sound is stopped.
+     * @since 1.0
+     *
+     */
+    public static final int SOUND_STOPPED = 1;
+
+    /**
+     * Sound is uninitialized (released).
+     * @since 1.0
+     */
+    public static final int SOUND_UNINITIALIZED = 3;
+
+    /**
+     * Sound is reinitialising
+     */
+    private static final int SOUND_REINITIALISING = 4;
+
+    private static final int FORMAT_BEEP = 2;
+    private static final int NOT_SUPPORTED_ERROR = 3;
+
+    private static final int ERR_NOT_READY = -18;
+    private static final int ERR_ARGUMENT  = -6;
+
+    private int iHandle;
+
+    private Finalizer iFinalizer;
+    private int iCurrentType;
+    private int iState;
+    private int iGain = -1;
+
+    Vector iSoundListeners = new Vector();
+
+    private static Sound iPlayingSound;
+
+    static
+    {
+        com.nokia.mj.impl.rt.support.Jvm.loadSystemLibrary("javanokiasound");
+    }
+
+    /**
+     * Constructors initialize the Sound object so that it is ready for
+     * playback. This constructor is used for initializing Sound
+     * object based on byte array data. The data should contain the data
+     * presented in the data format specified by type parameter. The Sound
+     * class defines also generally supported types as constants.
+     * <p>
+     * All implementations need to support at least Nokia
+     * Smart Messaging, Over the Air (OTA) ringingtone format.
+     * The type of this format is FORMAT_TONE.
+     * <p>
+     * Note: some implementations can't throw exceptions about
+     * sound data being corrupted or illegal during construction.
+     * This will result that IllagalArgumentException is delayed until
+     * play(int loop) method is called. Applications thus need to except
+     * that IllegalArgumentException is thrown in this method or during
+     * play method call.
+     * <p>
+     * @throws java.lang.IllegalArgumentException if the data can not be
+     recognized to
+     * given type or the type is unsupported or unknown
+     * @throws java.lang.NullPointerException if the data is null
+     * @since 1.0
+     *
+     */
+    public Sound(byte[] data, int type)
+    {
+        Logger.LOG(Logger.EJavaUI, Logger.EInfo, "Sound Constructor");
+        iFinalizer = registerForFinalization();
+
+        iHandle = _create();
+
+        iState = SOUND_UNINITIALIZED;
+
+        init(data, type);
+    }
+
+    /**
+     * Constructors initialize the Sound object so that it is ready for
+     * playback. Sound is initialized as a simple tone based sound.
+     * <p>
+     * See method {@link #init(int freq, long duration)} for
+     * freq value descriptions. See also a note on exceptions semantics in
+     * {@link #init(int freq, long duration)}.
+     *
+     * @param freq a frequency value
+     * @param duration the duration of the tone in milliseconds
+     * @throws java.lang.IllegalArgumentException if parameter values are
+     * illegal, freq is not in given range or duration is negative or zero
+     * @since 1.0
+     */
+    public Sound(int freq, long duration)
+    {
+
+        iFinalizer = registerForFinalization();
+        iHandle = _create();
+
+        iState = SOUND_UNINITIALIZED;
+
+        init(freq, duration);
+    }
+
+    /**
+      * Called when this object is finalized, frees native resources
+      */
+
+    public Finalizer registerForFinalization()
+    {
+
+        return new Finalizer()
+        {
+            public void finalizeImpl()
+            {
+                doFinalize();
+            }
+        };
+    }
+
+    void doFinalize()
+    {
+
+        if (iFinalizer == null)
+        {
+            return;
+        }
+        iFinalizer = null;
+
+        if (iHandle > 0)
+        {
+            _dispose(iHandle);
+        }
+    }
+
+    /**
+     * Releases audio resources reserved by this object. After object
+     * is released it goes to uninitialized state. This method should
+     * be called when Sound object is not needed anymore.
+     * @since 1.0
+     */
+    public void release()
+    {
+        if ((iState != SOUND_UNINITIALIZED) &&
+                (iState != SOUND_REINITIALISING))
+        {
+            iState = SOUND_REINITIALISING;
+            soundStateChanged(SOUND_UNINITIALIZED);
+        }
+
+        _release(iHandle);
+
+        iState = SOUND_UNINITIALIZED;
+
+    }
+
+    /**
+     * Initializes Sound to play a simple beep.
+     * <p>
+     * Note: some implementations may not support the full frequency
+     * scale defined in table below. They will throw
+     * IllegalArgumentException instead for unsupported values. The
+     * exception may also be delayed
+     * until the play(int loop) method is called.
+     * <p>
+     * Following table describes some freq argument
+     * values:
+     * <pre>
+     * Description            Frequency
+     * Freq off               0
+     * Ring freq A0           220
+     * Ring freq B0b          233
+     * Ring freq B0           247
+     * Ring freq C0           262
+     * Ring freq D0b          277
+     * Ring freq D0           294
+     * Ring freq E0b          311
+     * Ring freq E0           330
+     * Ring freq F0           349
+     * Ring freq G0b          370
+     * Ring freq G0           392
+     * Ring freq A1b          416
+     * Ring freq A1           440
+     * Ring freq B1b          466
+     * Ring freq B1           494
+     * Ring freq C1           523
+     * Ring freq D1b          554
+     * Ring freq D1           587
+     * Ring freq E1b          622
+     * Ring freq E1           659
+     * Ring freq F1           698
+     * Ring freq G1b          740
+     * Ring freq G1           784
+     * Ring freq A2b          831
+     * Ring freq A2           880
+     * Ring freq B2b          932
+     * Ring freq B2           988
+     * Ring freq C2           1047
+     * Ring freq D2b          1109
+     * Ring freq D2           1175
+     * Ring freq E2b          1245
+     * Ring freq E2           1319
+     * Ring freq F2           1397
+     * Ring freq G2b          1480
+     * Ring freq G2           1568
+     * Ring freq A3b          1661
+     * Ring freq A3           1760
+     * Ring freq B3b          1865
+     * Ring freq B3           1976
+     * Ring freq C3           2093
+     * Ring freq D3b          2217
+     * Ring freq D3           2349
+     * Ring freq E3b          2489
+     * Ring freq E3           2637
+     * Ring freq F3           2794
+     * Ring freq G3b          2960
+     * Ring freq G3           3136
+     * Ring freq A4b          3322
+     * Ring freq A4           3520
+     * Ring freq B4b          3729
+     * Ring freq B4           3951
+     * Ring freq C4           4186
+     * Ring freq D4b          4434
+     * Ring freq D4           4698
+     * Ring freq E4b          4978
+     * Ring freq E4           5274
+     * Ring freq F4           5588
+     * Ring freq G4b          5920
+     * Ring freq G4           6272
+     * Ring freq A5b          6644
+     * Ring freq A5           7040
+     * Ring freq B5b          7458
+     * Ring freq B5           7902
+     * Ring freq C5           8372
+     * Ring freq D5b          8870
+     * Ring freq D5           9396
+     * Ring freq E5b          9956
+     * Ring freq E5           10548
+     * Ring freq F5           11176
+     * Ring freq G5b          11840
+     * Ring freq G5           12544
+     * Ring freq A6b          13288
+     *
+     * </pre>
+     *
+     * @param duration length of the beep in milliseconds
+     * @param freq frequency to be played
+     * @throws java.lang.IllegalArgumentException if parameter values are
+     * illegal, freq is not in given range or duration is negative or zero
+     * @since 1.0
+     */
+    public void init(int freq, long duration)
+    {
+        if (duration < 1 || duration > 10000000)
+        {
+            throw(new IllegalArgumentException(
+                      "Bad duration value, must be 1-10000000"));
+        }
+        if (freq < 0 || freq > 15000)
+        {
+            throw(new IllegalArgumentException(
+                      "Bad frequency value, must be 0-15000"));
+        }
+        // if the uninitialised event is sent from native side, it reaches
+        // listener too late in TCK test sound8004, thus we send the event
+        // already here
+        if ((iState != SOUND_UNINITIALIZED) &&
+                (iState != SOUND_REINITIALISING))
+        {
+            iState = SOUND_REINITIALISING;
+            soundStateChanged(SOUND_UNINITIALIZED);
+        } // end of if (iState != SOUND_UNINITIALIZED)
+
+        iCurrentType = FORMAT_BEEP;
+        int err = _init(iHandle, iCurrentType, null, freq, duration);
+        if (err == ERR_NOT_READY)
+        {
+            throw new RuntimeException(Integer.toString(err));
+        }
+        else if (err == ERR_ARGUMENT)
+        {
+            throw new IllegalArgumentException("Data is invalid");            
+        }
+        iState = SOUND_STOPPED;
+    }
+
+    /**
+     * Initializes Sound object based on byte
+     * array data. The data should contain the data presented in the data
+     * format specified by type parameter. The Sound class defines also
+     * generally supported types as constants.
+     * <p>
+     * All implementations need to support at least Nokia
+     * Smart Messaging, Over the Air (OTA) ringingtone format.
+     * The type of this format is FORMAT_TONE.
+     * <p>
+     * Note: some implementations can't throw exceptions about
+     * sound data being corrupted or illegal during this method call.
+     * This will result that IllagalArgumentException is delayed until
+     * play(int loop) method is called. Applications thus need to except
+     * that IllegalArgumentException is thrown in this method or during
+     * play method call.
+     * <p>
+     * @param data a byte array containing the data to be played
+     * @param type type of the audio
+     * @throws java.lang.IllegalArgumentException if the data can not be
+     recognized to
+     * given type or the type is unsupported or unknown
+     * @throws java.lang.NullPointerException if the data is null
+     * @since 1.0
+     */
+    public void init(byte[] data, int type)
+    {
+        if (!(type == FORMAT_WAV || type == FORMAT_TONE))
+        {
+            throw(new IllegalArgumentException("Type is not supported"));
+        }
+        if (data == null)
+        {
+            throw(new NullPointerException("Data is null"));
+        }
+
+        if ((iState != SOUND_UNINITIALIZED) &&
+                (iState != SOUND_REINITIALISING))
+        {
+            iState = SOUND_REINITIALISING;
+            soundStateChanged(SOUND_UNINITIALIZED);
+        } // end of if (iState != SOUND_UNINITIALIZED)
+
+        iCurrentType = type;
+        int err = _init(iHandle, iCurrentType, data, 0, 0);
+        if (err == ERR_NOT_READY || err == ERR_ARGUMENT )
+        {
+            throw new IllegalArgumentException("Data is invalid");
+        }
+
+        iState = SOUND_STOPPED;
+    }
+
+
+    /**
+     * Get the current state of the Sound object.
+     *
+     * @return current state, SOUND_PLAYING, SOUND_STOPPED or
+     SOUND_UNINITIALIZED
+     * @since 1.0
+     *
+     */
+    public int getState()
+    {
+        if (iState == SOUND_REINITIALISING)
+        {
+            return SOUND_UNINITIALIZED;
+        }
+
+        iState = _getState(iHandle);
+        switch (iState)
+        {
+        case(0):  // ENotReady
+        case(4):  // EInitialising
+            iState = SOUND_UNINITIALIZED;
+            break;
+        case(1):  // EReadyToPlay
+            iState = SOUND_STOPPED;
+            break;
+        case(2):  // EPlaying
+            iState = SOUND_PLAYING;
+            break;
+        default:
+        }
+        return iState;
+    }
+
+    /**
+     * This method is used for starting the playback from the beginning of a
+     * sound object. The loop parameter defined the loop count for playback.
+     * Argument zero (0) means continuos looping. For uninitialized sound the
+     * play method doesn't do anything and silently returns. For stopped and
+     * playing sounds the playback starts from beginning of the sound with new
+     * looping information.
+     * <p>
+     * This method will throw IllegalStateException if playback cannot be
+     * started since all channels are in use, or playback is not possible
+     * because there is more higher priority system sounds being played.
+     * <p>
+     * If Sound playback is possible this method will return immediately and
+     * thus will not block the calling thread during the playback. If any error
+     * that prevents the playback is encountered during the playback, the
+     * playback is silently stopped as if called to the stop method.
+     *
+     * @param number number of times audio is played. Value 0 plays audio in
+     * continous loop.
+     * @throws java.lang.IllegalStateException if the sound object cannot be
+     * played because all the channels are already in use.
+     * @throws java.lang.IllegalArgumentException if the loop value is negative,
+     * or if sound values/date is illegal or corrupted.
+     * @since 1.0
+     *
+     */
+    public void play(int loop) throws IllegalArgumentException
+    {
+        if (loop < 0)
+        {
+            throw(new IllegalArgumentException("Negative loop value"));
+        }
+        if (iState == SOUND_REINITIALISING)
+        {
+            return;
+        } // end of if (iState == SOUND_REINITIALISING)
+
+        if (iPlayingSound != null)
+        {
+            if (iPlayingSound.getState() == SOUND_PLAYING)
+            {
+                iPlayingSound.stop();
+            }
+        } // end of if (iPlayingSound != null)
+
+        int error = _play(iHandle, loop);
+        if ((error == NOT_SUPPORTED_ERROR))
+        {
+            throw(new IllegalArgumentException("Sound is not supported"));
+        }
+        iPlayingSound = this;
+    }
+
+    /**
+     *  The method will stop the sound playback, storing the current position.
+     *  For sound that has never been started (may be uninitialized), or is
+     *  currently being stopped the method call doesn't do anything and returns
+     *  silently.
+     *
+     *  Note that for tone based sounds it is not possible to resume from
+     *  position the sound was stopped at, to be specific, stop will reset
+     *  the position to the beginning of the sound.
+     *  @since 1.0
+     */
+    public void stop()
+    {
+        if (iState == SOUND_REINITIALISING)
+        {
+            return;
+        } // end of if (iState == SOUND_REINITIALISING)
+        _stop(iHandle);
+    }
+
+    /**
+     *  The method will continue the stopped sound object from the position it
+     *  was stopped to. For sound that has never been started (may be
+     *  uninitialized), or is currently being played the method call doesn't
+     *  do anything.
+     *  <p>
+     *  Note: For tone based sounds the resume starts the sound from the
+     *  beginning of the sound clip.
+     *  @since 1.0
+     *
+     */
+    public void resume()
+    {
+        if (iState == SOUND_REINITIALISING)
+        {
+            return;
+        } // end of if (iState == SOUND_REINITIALISING)
+        _resume(iHandle);
+    }
+
+    /**
+     * Sets the gain for the sound object. The gain is a value between
+     * 0 and 255. Implementation scales the gain value to the limits it
+     * supports. Notice that any gain value > 0 should result a gain
+     * value > 0. If the gain is smaller than this minimum value then
+     * gain is set to 0, if the gain greater than this maximum value
+     * then the gain is set to maximum value (255).
+     *
+     * @param gain gain value: 0 - 255
+     * @throws java.lang.IllegalArgumentException if the gain not 0 - 255
+     * @since 1.0
+     */
+    public void setGain(int gain)
+    {
+        if (iState == SOUND_REINITIALISING)
+        {
+            return;
+        } // end of if (iState == SOUND_REINITIALISING)
+        if (gain < 0)
+        {
+            gain = 0;
+        }
+        else if (gain > 255)
+        {
+            gain = 255;
+        }
+        iGain = gain;
+        _setVolume(iHandle, iGain);
+    }
+
+    /**
+     * Get the gain (or volume) of Sound object. The gain is a value
+     * between 0 and 255. System returns a scaled value based on the
+     * limits it supports. Notice that any system gain value > 0 should
+     * return a gain value > 0.
+     *
+     * @return gain value 0 - 255
+     * @since 1.0
+     *
+     */
+    public int getGain()
+    {
+        if (iGain == -1)
+        {
+            return _volume(iHandle);
+        }
+        // we have previously set gain
+        return iGain;
+    }
+
+    /**
+     * Returns number of concurrent sounds the device can play for
+     * specific audio type. Returns 1 if only one sound can be played
+     * at a time. Notice that most types use same channel resources.
+     * @return total number of available channels.
+     * @param type the media type
+     * @throws java.lang.IllegalArgumentException if the type is unsupported
+     * or unknown
+     * @since 1.0
+     */
+    public static int getConcurrentSoundCount(int type)
+    {
+        if ((type != FORMAT_TONE) && (type != FORMAT_WAV))
+        {
+            throw(new IllegalArgumentException("Type is not supported"));
+        }
+
+        return 1;
+    }
+
+    /**
+     *  Returns the supported audio formats as an int array.
+     *
+     *  @return an array containing supported audio formats as
+     *  int values (e.g. FORMAT_TONE, FORMAT_WAV),
+     *  or an empty array if no audio formats are supported.
+     *  @since 1.0
+     */
+    static public int[] getSupportedFormats()
+    {
+        return(new int[] { FORMAT_TONE, FORMAT_WAV });
+    }
+
+    /**
+     *  Registeres a listener for playback state notifications.
+     *  @see com.nokia.mid.sound.SoundListener
+     *  @param listener a listener that is notified when state
+     *  changes occur or null if listener is to be
+     *  removed.
+     *  @since 1.0
+     *
+     */
+    public void setSoundListener(SoundListener listener)
+    {
+        iSoundListeners.addElement(listener);
+    }
+
+    /**
+     * Callback method when sound state changes
+     *
+     */
+    public void soundStateChanged(final int event)
+    {
+        /*
+        for(int i = 0; i < iSoundListeners.size(); i++)
+        {
+          ((SoundListener)iSoundListeners.elementAt(i)).soundStateChanged(this, event);
+        }
+        */
+        //Notify SoundState Listeners in a separate thread, so that application doesn't
+        //block main thread
+        new Thread(new Runnable()
+        {
+            public void run()
+            {
+                notifySoundStateListeners(event);
+            }
+        }).start();
+    }
+
+    /**
+     * Notify Sound State Listeners
+     */
+    public synchronized void notifySoundStateListeners(int event)
+    {
+        for (int i = 0; i < iSoundListeners.size(); i++)
+        {
+            ((SoundListener)iSoundListeners.elementAt(i)).soundStateChanged(this, event);
+        }
+    }
+
+    private native void _dispose(int aHandle);
+    private native int _create();
+    private native int _init(int aHandle, int aType,
+                             byte[] aData,
+                             int aFrequency, long aDuration);
+    private native void _release(int aHandle);
+    private native int _play(int aHandle, int aLoop);
+    private native void _stop(int aHandle);
+    private native void _resume(int aHandle);
+    private native void _setVolume(int aHandle, int aVolume);
+    private native int _volume(int aHandle);
+    private native int _getState(int aHandle);
+
+} //End of Sound class
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/javasrc/com/nokia/mid/sound/SoundListener.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2006 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:  Interface indicating changes in the playback state.
+*
+*/
+
+
+package com.nokia.mid.sound;
+
+/**
+ * <p>
+ * This interface is used by applications which need to receive events
+ * that indicate changes in the playback state of the Sound objects.
+ * </p>
+ * @see com.nokia.mid.sound.Sound
+ * @version 1.1
+ * @since 1.0
+ */
+
+public interface SoundListener
+{
+
+    /**
+     *  Called when playback state of an Sound has been changed.
+     *  Listener will be notified when playback has been started
+     *  or stopped.
+     *  @see com.nokia.mid.sound.Sound#setSoundListener(SoundListener listener)
+     *  @see com.nokia.mid.sound.Sound#SOUND_PLAYING
+     *  @see com.nokia.mid.sound.Sound#SOUND_STOPPED
+     *  @param sound the sound object this event relates to
+     *  @param event the sound changed event, SOUND_PLAYING or SOUND_STOPPED
+     *  @since 1.0
+     */
+    public abstract void soundStateChanged(Sound sound, int event);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/src/CMIDSoundImpl.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2006 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:  Interface and a base class for CMIDClip and CMIDTone.
+*
+*/
+
+
+#include "CMIDSoundImpl.h"
+#include "CMIDSoundEvent.h"
+#include "com_nokia_mid_sound_Sound.h"
+
+CMIDSoundImpl::~CMIDSoundImpl()
+{
+
+}
+
+CMIDSoundImpl::CMIDSoundImpl(MMIDEventSender* aEventSender)
+{
+    iEventSender = aEventSender;
+}
+
+void CMIDSoundImpl::ConstructL()
+{
+
+}
+
+void CMIDSoundImpl::Resume()
+{
+    if (iPlayed && (iState == EReadyToPlay))
+    {
+        Play(1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/src/cmidclip.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2006-2007 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:  This class implements wav playing.
+*
+*/
+
+
+#include <e32std.h>
+#include <AudioPreference.h>
+
+#include "com_nokia_mid_sound_Sound.h"
+#include "CMIDClip.h"
+#include "MMIDEventSender.h"
+
+namespace
+{
+const TInt KMIDMaxJavaVolume = 255;
+const TInt KMIDMinNativeVolume = 1;
+const TInt KMIDHeaderLength = 4;
+_LIT8(KMIDHeaderWAV, "RIFF");
+_LIT8(KMIDHeaderAMR, "#!AM");
+const TInt KMIDClipForever = 999999;
+const TInt KMIDMinDataSize = 4;
+}
+
+CMIDClip* CMIDClip::NewL(const TDesC8* aData, MMIDEventSender* aEventSender)
+{
+    CMIDClip* self = new(ELeave) CMIDClip(aEventSender);
+    CleanupStack::PushL(self);
+    self->ConstructL(aData);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+CMIDClip::~CMIDClip()
+{
+    if (iMdaAudioPlayerUtility)
+    {
+        if (iState == EPlaying)
+        {
+            iMdaAudioPlayerUtility->Stop();
+        }
+    }
+    delete iMdaAudioPlayerUtility;
+    delete iClip;
+    delete iSchedulerWait;
+}
+
+CMIDClip::CMIDClip(MMIDEventSender* aEventSender)
+        : CMIDSoundImpl(aEventSender)
+{
+}
+
+void CMIDClip::ConstructL(const TDesC8* aData)
+{
+    CMIDSoundImpl::ConstructL();
+    iSchedulerWait = new(ELeave) CActiveSchedulerWait;
+
+    if (aData->Length() < KMIDMinDataSize)
+    {
+        iState = ENotSupported;
+        User::Leave(KErrArgument);
+    }
+
+    TPtrC8 header = aData->Left(KMIDHeaderLength);
+
+    if ((header != KMIDHeaderWAV()) && (header != KMIDHeaderAMR))
+    {
+        iState = ENotSupported;
+        User::Leave(KErrArgument);
+    }
+
+    iState = EInitialising;
+    iClip = aData->AllocL();
+    iMdaAudioPlayerUtility =
+        CMdaAudioPlayerUtility::
+        NewDesPlayerReadOnlyL(*iClip, *this,
+                              KAudioPriorityRecording);
+    iMdaAudioPlayerUtility->UseSharedHeap();
+    iSchedulerWait->Start();
+}
+
+TInt CMIDClip::Play(TInt aLoop)
+{
+    __ASSERT_DEBUG(iState == EReadyToPlay, User::Invariant());
+
+    if (aLoop == 0)
+    {
+        // There is no known working method to play clip forever, so we play
+        // it for a long time instead.
+        aLoop = KMIDClipForever;
+    }
+
+    --aLoop;
+
+    // Setting repeats to 1 causes sound played twice
+    if (aLoop > 0)
+    {
+        iMdaAudioPlayerUtility->SetRepeats(aLoop, TTimeIntervalMicroSeconds(0));
+    }
+
+    iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_PLAYING);
+
+    iMdaAudioPlayerUtility->Play();
+    iState = EPlaying;
+    iPlayed = ETrue;
+    return KErrNone;
+}
+
+void CMIDClip::Stop()
+{
+    if (iState == EPlaying)
+    {
+        iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED);
+        iMdaAudioPlayerUtility->Stop();
+        iState = EReadyToPlay;
+    }
+}
+
+void CMIDClip::SetVolume(TInt aVolume)
+{
+    iVolume = aVolume;
+    TInt volume = 0;
+    if (aVolume)
+    {
+        volume = (((iMdaAudioPlayerUtility->MaxVolume()
+                    - KMIDMinNativeVolume + 1)
+                   * aVolume)
+                  / (KMIDMaxJavaVolume + 1)) + KMIDMinNativeVolume;
+    }
+    iMdaAudioPlayerUtility->SetVolume(volume);
+}
+
+TInt CMIDClip::Volume()
+{
+    return iVolume;
+}
+
+void CMIDClip::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
+{
+    if (aError == KErrNone)
+    {
+        //Setting iVolume to max because
+        //CMdaAudioPlayerUtility doesn't have Volume()
+        iVolume = KMIDMaxJavaVolume;
+        iState = EReadyToPlay;
+    }
+    else
+    {
+        if (aError == KErrNotSupported)
+        {
+            iState = ENotSupported;
+        }
+        else
+        {
+            iState = ENotReady;
+        }
+    }
+    iSchedulerWait->AsyncStop();
+}
+
+void CMIDClip::MapcPlayComplete(TInt /*aError*/)
+{
+    iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED);
+    iState = EReadyToPlay;
+}
+
+void CMIDClip::Release()
+{
+    if (iMdaAudioPlayerUtility)
+    {
+        if (iState == EPlaying)
+        {
+            iMdaAudioPlayerUtility->Stop();
+        }
+    }
+    delete iMdaAudioPlayerUtility;
+    iMdaAudioPlayerUtility = NULL;
+    delete iClip;
+    iClip = NULL;
+    iState = ENotReady;
+}
+
+//End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/src/cmidsound.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,313 @@
+/*
+* Copyright (c) 2006-2007 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:  Wrapper for CMIDClip and CMIDTone class initialisations.
+*
+*/
+
+
+#include <e32std.h>
+#include <centralrepository.h>
+#include <ProfileEngineSDKCRKeys.h>
+
+#include "CMIDSound.h"
+#include "CMIDTone.h"
+#include "CMIDClip.h"
+#include "logger.h"
+#include "fs_methodcall.h"
+#include "com_nokia_mid_sound_Sound.h"
+
+
+CMIDSound* CMIDSound::NewL(JNIEnv& aJni, jobject aPeer)
+{
+    JELOG2(EJavaUI);
+
+    CMIDSound* self = new CMIDSound();
+    if (self != NULL)
+    {
+        self->attachToVm(aJni, aPeer);
+    }
+    return self;
+}
+
+CMIDSound::~CMIDSound()
+{
+    delete iMIDSound;
+
+    // CENREP
+    if (iProfileListener)
+    {
+        iProfileListener->StopListening();
+        delete iProfileListener;
+    }
+    delete iRepository;
+}
+
+void CMIDSound::HandleNotifyInt(TUint32 aId, TInt aNewValue)
+{
+    JELOG2(EJavaUI);
+    if (aId == KProEngActiveWarningTones)
+    {
+        if (iMIDSound)
+        {
+            iMIDSound->SetVolume(aNewValue == 0 ? 0 : iRealVolume);
+        }
+    }
+}
+
+void CMIDSound::SendEvent(TInt aEventType)
+{
+    /**
+     *Callback to Java
+     */
+    JELOG2(EJavaUI);
+
+    jclass javaPeerClass = mJniEnv->FindClass("com/nokia/mid/sound/Sound");
+
+    jmethodID soundStateChangeCallback = mJniEnv->GetMethodID(
+                                             javaPeerClass /*mJavaPeerClass */, "soundStateChanged", "(I)V");
+
+
+    mJniEnv->CallVoidMethod(mJavaPeerObject, soundStateChangeCallback,
+                            aEventType);
+}
+
+CMIDSound::CMIDSound()
+        : java::util::FunctionServer("CMIDSoundFunctionServer"),
+        iMIDSound(0)
+{
+    JELOG2(EJavaUI);
+    createServerToNewThread();
+}
+
+int CMIDSound::InitProfileListener()
+{
+    TRAPD(err, CallMethodL(this, &CMIDSound::InitProfileListenerL, this));
+    return err;
+}
+
+void CMIDSound::InitProfileListenerL()
+{
+    JELOG2(EJavaUI);
+    // repository for profile
+    iRepository = CRepository::NewL(KCRUidProfileEngine);
+
+    // get notifies about changes in KProEngActiveWarningTones
+    iProfileListener = CCenRepNotifyHandler::NewL(*this,
+                       *iRepository,
+                       CCenRepNotifyHandler::EIntKey,
+                       KProEngActiveWarningTones);
+
+    // Changes will be informed to HandleNotifyInt
+    iProfileListener->StartListeningL();
+}
+
+TBool CMIDSound::IsAudioEnabled(/*CMIDSound* aSelf*/)
+{
+    JELOG2(EJavaUI);
+    TInt isProfileOn = 0;
+    TInt error = iRepository->Get(KProEngActiveWarningTones, isProfileOn);
+    TBool retVal = EFalse;
+
+    // If getting profile status fails do not play any tones.
+    if ((isProfileOn == 1) &&
+            (error == KErrNone))
+    {
+        retVal = ETrue;
+    }
+    return retVal;
+}
+
+void CMIDSound::SetBeep(TInt aFreq, TInt64 aDuration)
+{
+    JELOG2(EJavaUI);
+    iFreq = aFreq;
+    iDur = aDuration;
+}
+
+TInt CMIDSound::Init(TInt aType, const TDesC8* aData)
+{
+    JELOG2(EJavaUI);
+    TRAPD(err, CallMethodL(this, &CMIDSound::InitL, aType, aData, this));
+    return err;
+}
+
+void CMIDSound::InitL(TInt aType, const TDesC8* aData)
+{
+    JELOG2(EJavaUI);
+
+    if (iMIDSound)
+    {
+        if (iMIDSound->State() == CMIDSoundImpl::EInitialising)
+        {
+            return;
+        }
+        if (iMIDSound->State() == CMIDSoundImpl::EReadyToPlay ||
+                iMIDSound->State() == CMIDSoundImpl::EPlaying)
+        {
+            iMIDSound->Release();
+        }
+    }
+
+    CMIDSoundImpl* soundImpl = NULL;
+    switch (aType)
+    {
+    case com_nokia_mid_sound_Sound_FORMAT_TONE: //Tone
+    {
+        soundImpl = CMIDTone::NewL(*aData, this);
+        break;
+    }
+    case com_nokia_mid_sound_Sound_FORMAT_BEEP: //Beep
+    {
+        soundImpl = CMIDTone::NewL(iFreq, iDur, this);
+        break;
+    }
+    case com_nokia_mid_sound_Sound_FORMAT_WAV:  //Wav
+    {
+        soundImpl = CMIDClip::NewL(aData, this);
+        break;
+    }
+    default:
+    {
+        break;
+    }
+    }
+
+    if (soundImpl)
+    {
+        if (soundImpl->State() != CMIDSoundImpl::EReadyToPlay)
+        {
+            TInt state = soundImpl->State();
+            delete soundImpl;
+            User::Leave(KErrNotReady);
+        }
+        iRealVolume = soundImpl->Volume();
+    }
+
+    delete iMIDSound;
+    iMIDSound = soundImpl;
+}
+
+TInt CMIDSound::Play(TInt aLoop)
+{
+    JELOG2(EJavaUI);
+    TInt err;
+    CallMethodL(err, this, &CMIDSound::DoPlay, aLoop, this);
+    return err;
+}
+
+TInt CMIDSound::DoPlay(TInt aLoop)
+{
+    JELOG2(EJavaUI);
+
+    if (iMIDSound)
+    {
+        TInt state = iMIDSound->State();
+        if (state != CMIDSoundImpl::EReadyToPlay)
+        {
+            return state;
+        }
+    }
+    else
+    {
+        return CMIDSoundImpl::ENotSupported;
+    }
+    if (!IsAudioEnabled())
+    {
+        iMIDSound->SetVolume(0);
+    }
+    return iMIDSound->Play(aLoop);
+}
+
+void CMIDSound::Resume()
+{
+    JELOG2(EJavaUI);
+    CallMethod(this, &CMIDSound::DoResume, this);
+}
+
+void CMIDSound::DoResume()
+{
+    JELOG2(EJavaUI);
+    iMIDSound->Resume();
+}
+
+void CMIDSound::Stop()
+{
+    JELOG2(EJavaUI);
+    CallMethod(this, &CMIDSound::DoStop, this);
+}
+
+void CMIDSound::DoStop()
+{
+    JELOG2(EJavaUI);
+    iMIDSound->Stop();
+}
+
+TInt CMIDSound::SoundVolume()
+{
+    JELOG2(EJavaUI);
+    TInt result;
+    CallMethodL(result, this, &CMIDSound::Volume, this);
+    return result;
+}
+
+TInt CMIDSound::Volume()
+{
+    JELOG2(EJavaUI);
+    return iMIDSound->Volume();
+}
+
+void CMIDSound::SetVolume(TInt aVolume)
+{
+    JELOG2(EJavaUI);
+    CallMethod(this, &CMIDSound::DoSetVolume, aVolume, this);
+}
+
+void CMIDSound::DoSetVolume(TInt aVolume)
+{
+    JELOG2(EJavaUI);
+    iRealVolume = aVolume;
+    TInt currentState = iMIDSound->State();
+    if ((currentState == CMIDSoundImpl::EReadyToPlay) ||
+            (currentState == CMIDSoundImpl::EPlaying))
+    {
+        iMIDSound->SetVolume(IsAudioEnabled() ? aVolume : 0);
+    }
+}
+
+
+TInt CMIDSound::PlayerState()
+{
+    JELOG2(EJavaUI);
+    TInt result;
+    CallMethodL(result, this, &CMIDSound::State, this);
+    return result;
+}
+
+TInt CMIDSound::State()
+{
+    JELOG2(EJavaUI);
+    return iMIDSound->State();
+}
+
+void CMIDSound::Release()
+{
+    JELOG2(EJavaUI);
+    CallMethod(this, &CMIDSound::DoRelease, this);
+}
+
+void CMIDSound::DoRelease()
+{
+    JELOG2(EJavaUI);
+    iMIDSound->Release();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/src/cmidtone.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2006-2007 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:  This class implements beep playing and OTA ringingtone playing.
+*
+*/
+
+
+#include <e32std.h>
+#include <e32svr.h>
+
+#include "com_nokia_mid_sound_Sound.h"
+#include "CMIDTone.h"
+#include "MMIDEventSender.h"
+
+namespace
+{
+const TInt KMIDMaxJavaVolume = 255;
+const TInt KMIDMinNativeVolume = 1;
+const TInt KMIDStopSleepTime = 10000;
+const TInt KMIDMicrosInMilli = 1000;
+const TInt KMIDMinDataLength = 4;
+const TInt KMIDLoopForever = 999999;
+}
+
+CMIDTone* CMIDTone::NewL(TInt aFreq, TInt64 aDuration,
+                         MMIDEventSender* aEventSender)
+{
+    CMIDTone* self = new(ELeave) CMIDTone(aEventSender);
+    CleanupStack::PushL(self);
+    self->ConstructL(aFreq, aDuration);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+CMIDTone* CMIDTone::NewL(const TDesC8& aData, MMIDEventSender* aEventSender)
+{
+    CMIDTone* self = new(ELeave) CMIDTone(aEventSender);
+    CleanupStack::PushL(self);
+    self->ConstructL(aData);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+
+CMIDTone::~CMIDTone()
+{
+    if (iMdaAudioToneUtility)
+    {
+        if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityNotReady)
+        {
+            iMdaAudioToneUtility->CancelPrepare();
+        }
+        else if (iMdaAudioToneUtility->State()
+                 == EMdaAudioToneUtilityPlaying)
+        {
+            iMdaAudioToneUtility->CancelPlay();
+        }
+    }
+    delete iMdaAudioToneUtility;
+    delete iSchedulerWait;
+}
+
+CMIDTone::CMIDTone(MMIDEventSender* aEventSender)
+        : CMIDSoundImpl(aEventSender)
+{
+}
+
+void CMIDTone::ConstructL(TInt aFreq, TInt64 aDuration)
+{
+    CMIDSoundImpl::ConstructL();
+    iSchedulerWait = new(ELeave) CActiveSchedulerWait;
+    iFreq = aFreq;
+    iDuration = aDuration;
+    iState = EInitialising;
+    iMdaAudioToneUtility = CMdaAudioToneUtility::NewL(*this);
+    iMdaAudioToneUtility->PrepareToPlayTone(iFreq,
+                                            TTimeIntervalMicroSeconds(iDuration * KMIDMicrosInMilli));
+    iSchedulerWait->Start();
+}
+
+void CMIDTone::ConstructL(const TDesC8& aData)
+{
+    CMIDSoundImpl::ConstructL();
+    iSchedulerWait = new(ELeave) CActiveSchedulerWait;
+    // first byte is the number of command parts
+    iFreq = 0;
+    iDuration = 0;
+    iState = EInitialising;
+
+    if (aData.Length() < KMIDMinDataLength)
+    {
+        iState = ENotSupported;
+        User::Leave(KErrArgument);
+    }
+
+    if (aData[0x000] == 0x02 && aData[0x001] == 0x4a && aData[0x002] == 0x3a)
+    {
+        iState = EInitialising;
+    }
+    else if (aData[0x000] == 0x03 && aData[0x001] == 0x4a && aData[0x002] ==
+             0x44 && aData[0x003] == 0x3a)
+    {
+        iState = EInitialising;
+    }
+    else if (aData[0] == 0x00 && aData[1] == 0x11)
+    {
+        iState = EInitialising;
+    }
+    else
+    {
+        iState = ENotSupported;
+        User::Leave(KErrArgument);
+    }
+    iMdaAudioToneUtility = CMdaAudioToneUtility::NewL(*this);
+    iMdaAudioToneUtility->PrepareToPlayDesSequence(aData);
+    iSchedulerWait->Start();
+
+}
+
+TInt CMIDTone::Play(TInt aLoop)
+{
+    __ASSERT_DEBUG(iState == EReadyToPlay, User::Invariant());
+
+    if (aLoop == 0)
+    {
+        // There is no known working method to play tone forever
+        aLoop = KMIDLoopForever;
+    }
+
+    // Setting repeats to 1 causes sound played twice
+    if (aLoop == 1)
+    {
+        iMdaAudioToneUtility->SetRepeats(0, TTimeIntervalMicroSeconds(0));
+    }
+    else if (aLoop > 1)
+    {
+        iMdaAudioToneUtility->SetRepeats(aLoop, TTimeIntervalMicroSeconds(0));
+    }
+
+    iMdaAudioToneUtility->Play();
+
+    iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_PLAYING);
+    iState = EPlaying;
+    iPlayed = ETrue;
+
+    return KErrNone;
+}
+
+void CMIDTone::Stop()
+{
+    if (iState == EPlaying)
+    {
+        iMdaAudioToneUtility->CancelPlay();
+        // sleep to make sure the device has time to stop
+        User::After(TTimeIntervalMicroSeconds32(KMIDStopSleepTime));      // CSI: 92 MdaAudioToneUtility does not send event when stopping has finished #
+        iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED);
+        iState = EReadyToPlay;
+    }
+}
+
+void CMIDTone::SetVolume(TInt aVolume)
+{
+    TInt maxVolume = iMdaAudioToneUtility->MaxVolume();
+    TInt volume = 0;
+    if (aVolume)
+    {
+        volume = (((maxVolume
+                    - KMIDMinNativeVolume + 1)
+                   * aVolume)
+                  / (KMIDMaxJavaVolume + 1)) + KMIDMinNativeVolume;
+    }
+    iMdaAudioToneUtility->SetVolume(volume);
+}
+
+TInt CMIDTone::Volume()
+{
+    TInt maxVolume = iMdaAudioToneUtility->MaxVolume();
+    TInt volume = (iMdaAudioToneUtility->Volume() *
+                   KMIDMaxJavaVolume) / maxVolume;
+
+    return volume;
+}
+
+void CMIDTone::MatoPrepareComplete(TInt aError)
+{
+    if (aError == KErrNone)
+    {
+        iState = EReadyToPlay;
+    }
+    else
+    {
+        if (aError == KErrNotSupported)
+        {
+            iState = ENotSupported;
+        }
+        else
+        {
+            iState = ENotReady;
+        }
+    }
+    iSchedulerWait->AsyncStop();
+}
+
+void CMIDTone::MatoPlayComplete(TInt aError)
+{
+    if (KErrNone == aError)
+    {
+        iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED);
+        iState = EReadyToPlay;
+    }
+}
+
+void CMIDTone::Release()
+{
+    iState = ENotReady;
+    if (iMdaAudioToneUtility)
+    {
+        if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityNotReady)
+        {
+            iMdaAudioToneUtility->CancelPrepare();
+        }
+        else if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityPlaying
+                 || iState == EPlaying)
+        {
+            iMdaAudioToneUtility->CancelPlay();
+        }
+    }
+    delete iMdaAudioToneUtility;
+    iMdaAudioToneUtility = NULL;
+    iState = ENotReady;
+}
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiasound/src/sound.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2006-2007 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:  JNI class for Sound.java.
+*
+*/
+
+
+#include <e32def.h> // MAKE_TINT64 Warning fix
+
+#include "com_nokia_mid_sound_Sound.h"
+#include "CMIDSound.h"
+#include "javajniutils.h"
+#include "javacommonutils.h"
+#include "logger.h"
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _dispose
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mid_sound_Sound__1dispose
+(JNIEnv* /* aJni */, jobject /* aSound */, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    delete sound;
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _create
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mid_sound_Sound__1create
+(JNIEnv* aJni, jobject aSound)
+{
+    JELOG2(EJavaUI);
+
+    TInt handle(0);
+    CMIDSound* sound = 0;
+    TRAPD(err,
+    {
+        sound = CMIDSound::NewL(*aJni, aSound);
+        if (sound != 0)
+        {
+            sound->InitProfileListener();
+        }
+    });
+
+    if (err != KErrNone)
+    {
+
+        java::util::JniUtils::throwNewException(aJni, "java/lang/RuntimeException" ,
+                                                "Failed to create Native Peer " +
+                                                java::util::JavaCommonUtils::intToString(err));
+    }
+    else
+    {
+
+        handle = reinterpret_cast<TInt>(sound);
+    }
+    return handle;
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _init
+ * Signature: (III[BIJ)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mid_sound_Sound__1init
+(JNIEnv* aJni, jobject, jint aHandle, jint aType, jbyteArray aData,
+ jint aFrequency, jlong aDuration)
+{
+    JELOG2(EJavaUI);
+    TInt freq(aFrequency);
+    TInt64 duration = *reinterpret_cast<TInt64*>(&aDuration);
+
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+
+    TPtrC8 ptr;
+    jbyte* data = NULL;
+
+    if (aType != com_nokia_mid_sound_Sound_FORMAT_BEEP)
+    {
+        if (!aData)
+        {
+            return KErrGeneral;
+        }
+        data = aJni->GetByteArrayElements(aData,0);
+        jint length = aJni->GetArrayLength(aData);
+        ptr.Set((TUint8*)data, length);
+    }
+
+    // Had to make SetBeep() due to number of maximum parameters in ExecuteTrap.
+    sound->SetBeep(freq, duration);
+    TInt err = sound->Init(aType, (const TDesC8*)&ptr);
+
+    if (aType != com_nokia_mid_sound_Sound_FORMAT_BEEP)
+    {
+        aJni->ReleaseByteArrayElements(aData, data, 0);
+    }
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _release
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mid_sound_Sound__1release
+(JNIEnv*, jobject, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    sound->Release();
+}
+
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _play
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mid_sound_Sound__1play
+(JNIEnv*, jobject, jint aHandle, jint aLoop)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    TInt err = sound->Play(aLoop);
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _stop
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mid_sound_Sound__1stop
+(JNIEnv*, jobject, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    sound->Stop();
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _resume
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mid_sound_Sound__1resume
+(JNIEnv*, jobject, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    sound->Resume();
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _setVolume
+ * Signature: (III)V
+ */
+JNIEXPORT void JNICALL Java_com_nokia_mid_sound_Sound__1setVolume
+(JNIEnv*, jobject, jint aHandle, jint aVolume)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    sound->SetVolume(aVolume);
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _volume
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mid_sound_Sound__1volume
+(JNIEnv*, jobject, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    TInt volume = sound->SoundVolume();
+    return(volume);
+}
+
+/*
+ * Class:     com_nokia_mid_sound_Sound
+ * Method:    _getState
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mid_sound_Sound__1getState
+(JNIEnv*, jobject, jint aHandle)
+{
+    JELOG2(EJavaUI);
+    CMIDSound* sound = reinterpret_cast<CMIDSound*>(aHandle);
+    TInt state = sound->PlayerState();
+    return state;
+}
--- a/javauis/subsystem.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/subsystem.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -23,13 +23,16 @@
 NONQTSUBSYSTEMS += \
 	coreui/build
 
+COMPONENTS += nokiasound/build
 
 #
 # Common legacy utilities
 #
 SUBSYSTEMS += javalegacyutils
 
-SYMBIAN_ONLY += javalegacyutils
+
+SYMBIAN_ONLY += javalegacyutils nokiasound/build
+
 
 
 #
--- a/javauis/subsystem_akn.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/subsystem_akn.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -22,7 +22,6 @@
 	m2g_akn/build \
 	m3g_akn/build \
 	mmapi_akn/build \
-	nokiasound_akn/build \
 	remconobserver_akn/build \
 	runtimeui_akn/build \
 	softnotification_akn/build
--- a/javauis/subsystem_qt.mk	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/subsystem_qt.mk	Fri Jun 11 13:33:44 2010 +0300
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009, 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"
@@ -14,6 +14,10 @@
 # Description: Makefile for Qt based components and subsystems
 #
 
-COMPONENTS   += eswt_qt/build lcdui_qt/build runtimeui_qt/build nokiauiapi_qt/build mmapi_qt/build amms_qt/build
+SUBSYSTEMS   += eswt_qt/build
+COMPONENTS   += lcdui_qt/build runtimeui_qt/build nokiauiapi_qt/build mmapi_qt/build amms_qt/build m3g_qt/build
 
 SYMBIAN_ONLY += mmapi_qt/build amms_qt/build m3g_qt/build
+
+# Build order dependency
+lcdui_qt/build runtimeui_qt/build nokiauiapi_qt/build mmapi_qt/build amms_qt/build m3g_qt/build: eswt_qt/build
--- a/javauis/tsrc/fute/lcdui/Midp_Form_01/build.xml	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/tsrc/fute/lcdui/Midp_Form_01/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -28,7 +28,7 @@
     <property name="midlet.permissions" value=""/>
     <property name="package.name" value="Midp_Form_01"/>
     <property name="company.name" value="Nokia"/>
-    <property name="midlet.version" value="1.1"/>
+    <property name="midlet.version" value="1.2"/>
     <property name="midlet.description" value=""/>
 
     <!-- Get settings for a basic MIDlet. -->
--- a/javauis/tsrc/fute/lcdui/Midp_Form_01/src/FormMethodsTests.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/tsrc/fute/lcdui/Midp_Form_01/src/FormMethodsTests.java	Fri Jun 11 13:33:44 2010 +0300
@@ -56,7 +56,7 @@
 
     private final String imgStr = "ImageItem";
 
-    private final String spacerStr = "Spacer";
+    private final String spacerStr = "Spacer (100x100)";
 
     private ChoiceGroup cg = null;
 
@@ -324,7 +324,7 @@
             else if (item.equals(imgStr))
                 addImageItem();
             else if (item.equals(spacerStr))
-                addSpacer(10,10);
+                addSpacer(100,100);
             else if (item.equals(tfStr))
             {
                 addTextField("ANY", TextField.ANY);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/build.xml	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,113 @@
+<!--
+#
+# 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: 
+#
+-->
+
+<project name="Midp_General" default="pack">
+
+    <!-- Get general settings for MIDlet projects. -->
+    <import file="../../properties.xml"/>
+
+    <!-- Set properties for this project. -->
+    <property name="midlet1.name" value="Midp_General_01"/>
+    <property name="midlet1.icon.name" value=""/>
+    <property name="midlet1.package.name" value="Midp_General_01"/>
+    <property name="midlet2.name" value="Midp_General_02"/>
+    <property name="midlet2.icon.name" value=""/>
+    <property name="midlet2.package.name" value="Midp_General_02"/>
+    <property name="midlet3.name" value="Midp_General_03"/>
+    <property name="midlet3.icon.name" value=""/>
+    <property name="midlet3.package.name" value="Midp_General_03"/>
+    <property name="midlet4.name" value="Midp_General_04"/>
+    <property name="midlet4.icon.name" value=""/>
+    <property name="midlet4.package.name" value="Midp_General_04"/>
+    <property name="midlet5.name" value="Midp_General_05"/>
+    <property name="midlet5.icon.name" value=""/>
+    <property name="midlet5.package.name" value="Midp_General_05"/>
+    <property name="midlet.permissions" value=""/>
+    <property name="package.name" value="Midp_General"/>
+    <property name="company.name" value="Nokia"/>
+    <property name="midlet.version" value="1.2"/>
+    <property name="midlet.description" value=""/>
+
+    <!-- Package Preverifed classes, resources and MANIFEST file -->
+    <target name="pack" depends="preverify">
+        <wtkjad jadfile="${bin}/${package.name}.jad"
+            jarfile="${bin}/${package.name}.jar"
+            update="true"
+            config="1.1"
+            profile="2.1"
+            manifest="${bin}/MANIFEST.MF"
+            name="${package.name}"
+            vendor="${company.name}">
+            <attribute name="MIDlet-Permissions" value="${midlet.permissions}"/>
+            <attribute name="MicroEdition-Profile" value="MIDP-2.1"/>
+            <attribute name="MicroEdition-Configuration" value="CLDC-1.1"/>
+            <attribute name="MIDlet-Version" value="${midlet.version}"/>
+            <attribute name="MIDlet-Description" value="${midlet.description}"/>
+            <attribute name="Nokia-UI-Enhancement" value="PopUpTextBox"/>
+            <midlet name="${midlet1.name}" icon="${midlet1.icon.name}" class="${midlet1.package.name}" />
+            <midlet name="${midlet2.name}" icon="${midlet2.icon.name}" class="${midlet2.package.name}" />
+            <midlet name="${midlet3.name}" icon="${midlet3.icon.name}" class="${midlet3.package.name}" />
+            <midlet name="${midlet4.name}" icon="${midlet4.icon.name}" class="${midlet4.package.name}" />
+            <midlet name="${midlet5.name}" icon="${midlet5.icon.name}" class="${midlet5.package.name}" />
+        </wtkjad>
+
+        <wtkjad jadfile="${bin}/${package.name}_fullscreen_textbox.jad"
+            jarfile="${bin}/${package.name}.jar"
+            update="true"
+            config="1.1"
+            profile="2.1"
+            manifest="${bin}/MANIFEST.MF"
+            name="${package.name}"
+            vendor="${company.name}">
+            <attribute name="MIDlet-Permissions" value="${midlet.permissions}"/>
+            <attribute name="MicroEdition-Profile" value="MIDP-2.1"/>
+            <attribute name="MicroEdition-Configuration" value="CLDC-1.1"/>
+            <attribute name="MIDlet-Version" value="${midlet.version}"/>
+            <attribute name="MIDlet-Description" value="${midlet.description}"/>
+            <attribute name="Nokia-UI-Enhancement" value="FullScreenTextBox"/>
+            <midlet name="${midlet1.name}" icon="${midlet1.icon.name}" class="${midlet1.package.name}" />
+            <midlet name="${midlet2.name}" icon="${midlet2.icon.name}" class="${midlet2.package.name}" />
+            <midlet name="${midlet3.name}" icon="${midlet3.icon.name}" class="${midlet3.package.name}" />
+            <midlet name="${midlet4.name}" icon="${midlet4.icon.name}" class="${midlet4.package.name}" />
+            <midlet name="${midlet5.name}" icon="${midlet5.icon.name}" class="${midlet5.package.name}" />
+        </wtkjad>
+
+        <wtkpackage
+            jarfile="${bin}/${package.name}.jar"
+            jadfile="${bin}/${package.name}.jad"
+            classpath="${project.class.path}"
+            basedir="${prever}"
+            autoversion="false">
+            <exclude_from_manifest name="Nokia-UI-Enhancement"/>
+            <fileset dir="${res}"
+                excludes="**/distribution.policy.s60" />
+        </wtkpackage>
+
+        <wtkpackage
+            jarfile="${bin}/${package.name}.jar"
+            jadfile="${bin}/${package.name}_fullscreen_textbox.jad"
+            classpath="${project.class.path}"
+            basedir="${prever}"
+            autoversion="false">
+            <exclude_from_manifest name="Nokia-UI-Enhancement"/>
+            <fileset dir="${res}"
+                excludes="**/distribution.policy.s60" />
+        </wtkpackage>
+    </target>
+
+</project>
\ No newline at end of file
Binary file javauis/tsrc/fute/lcdui/Midp_General/res/small.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/EmptyForm.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ * This is the main class for the empty Form.
+ */
+
+public class EmptyForm extends Form
+{
+
+    /**
+     *  The constructor creates and displays the Form.
+     *
+     *@param  parent  is the parent midlet.
+     */
+    public EmptyForm(MIDlet parent)
+    {
+        super(parent.getClass().getName());
+        Display.getDisplay(parent).setCurrent(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_01.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ * This is the main class for the Midp_General_01 tests.
+ */
+
+public class Midp_General_01 extends MIDlet implements CommandListener
+{
+    private Form theForm;
+    private Command cmdExit = new Command("Exit", Command.EXIT, 1);
+
+    /**
+     * Signals the MIDlet to start and enter the Active state.
+     */
+    protected void startApp()
+    {
+        theForm = new EmptyForm(this);
+        theForm.addCommand(cmdExit);
+        theForm.setCommandListener(this);
+    }
+
+    /**
+     *  Signals the MIDlet to terminate and enter the Destroyed state.
+     *
+     */
+    protected void destroyApp(boolean unconditional)
+    {
+    }
+
+    /**
+     *  Signals the MIDlet to stop and enter the Paused state.
+     */
+    protected void pauseApp()
+    {
+    }
+
+    /**
+     *  This method handles command invocations.
+     *
+     *@param  c  This is the command responsible for the event.
+     *@param  s  Should be equal to this.
+     */
+    public void commandAction(Command c, Displayable s)
+    {
+        if (c == cmdExit)
+        {
+            destroyApp(false);
+            notifyDestroyed();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_02.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ *  This is the main class for the Midp_General_02 tests.
+ */
+
+public class Midp_General_02 extends MIDlet implements CommandListener
+{
+
+    TextBox tb;
+    Display display;
+    private Command cmdExit = new Command("Exit", Command.EXIT, 1);
+
+    String theText = "This is a TextBox with very long text blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah" +
+                     "This is the last sentence.";
+
+    public Midp_General_02()
+    {
+        tb = new TextBox("TextBox", theText, 1000, TextField.ANY);
+        tb.addCommand(cmdExit);
+        tb.setCommandListener(this);
+        display = Display.getDisplay(this);
+    }
+
+    /**
+     * Signals the MIDlet to start and enter the Active state.
+     */
+    protected void startApp()
+    {
+        display.setCurrent(tb);
+    }
+
+    /**
+     *  Signals the MIDlet to terminate and enter the Destroyed state.
+     *
+     */
+    protected void destroyApp(boolean unconditional)
+    {
+    }
+
+    /**
+     *  Signals the MIDlet to stop and enter the Paused state.
+     */
+    protected void pauseApp()
+    {
+    }
+
+    /**
+     *  This method handles command invocations.
+     *
+     *@param  c  This is the command responsible for the event.
+     *@param  s  Should be equal to this.
+     */
+    public void commandAction(Command c, Displayable s)
+    {
+        if (c == cmdExit)
+        {
+            destroyApp(false);
+            notifyDestroyed();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_03.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ *  This is the main class for the Midp_General_03 tests.
+ */
+
+public class Midp_General_03 extends MIDlet implements CommandListener
+{
+
+    private List emptyList;
+    private Display display;
+    private Command cmdExit = new Command("Exit", Command.EXIT, 1);
+
+    public Midp_General_03()
+    {
+        emptyList = new List("List", List.EXCLUSIVE);
+        emptyList.addCommand(cmdExit);
+        emptyList.setCommandListener(this);
+        display = Display.getDisplay(this);
+    }
+
+    /**
+     * Signals the MIDlet to start and enter the Active state.
+     */
+    protected void startApp()
+    {
+        display.setCurrent(emptyList);
+    }
+
+    /**
+     *  Signals the MIDlet to terminate and enter the Destroyed state.
+     *
+     */
+    protected void destroyApp(boolean unconditional)
+    {
+    }
+
+    /**
+     *  Signals the MIDlet to stop and enter the Paused state.
+     */
+    protected void pauseApp()
+    {
+    }
+
+    /**
+     *  This method handles command invocations.
+     *
+     *@param  c  This is the command responsible for the event.
+     *@param  s  Should be equal to this.
+     */
+    public void commandAction(Command c, Displayable s)
+    {
+        if (c == cmdExit)
+        {
+            destroyApp(false);
+            notifyDestroyed();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_04.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,108 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ *  This is the main class for the Midp_General_04 tests.
+ */
+
+public class Midp_General_04 extends MIDlet implements CommandListener
+{
+
+    private Alert alert;
+    private Display display;
+    private Gauge indicator;
+    private Image image;
+    private Command cmdScreen = new Command("Screen cmd", Command.SCREEN, 1);
+    private Command cmdExit = new Command("Exit", Command.EXIT, 1);
+
+    private String alertText = "This is a modal alert with very long text blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah " +
+                               "blah blah blah blah blah blah blah blah blah blah blah blah blah blah";
+
+    public Midp_General_04()
+    {
+        alert = new Alert("Alert title", alertText, null, AlertType.INFO);
+        alert.addCommand(cmdExit);
+        alert.addCommand(cmdScreen);
+        alert.setCommandListener(this);
+        indicator = new Gauge(null, false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING);
+        alert.setIndicator(indicator);
+
+        try
+        {
+            image = Image.createImage("/small.png");
+        }
+        catch (java.io.IOException e)
+        {
+        }
+        alert.setImage(image);
+
+        display = Display.getDisplay(this);
+    }
+
+    /**
+     * Signals the MIDlet to start and enter the Active state.
+     */
+    protected void startApp()
+    {
+        display.setCurrent(alert);
+    }
+
+    /**
+     *  Signals the MIDlet to terminate and enter the Destroyed state.
+     *
+     */
+    protected void destroyApp(boolean unconditional)
+    {
+    }
+
+    /**
+     *  Signals the MIDlet to stop and enter the Paused state.
+     */
+    protected void pauseApp()
+    {
+    }
+
+    /**
+     *  This method handles command invocations.
+     *
+     *@param  c  This is the command responsible for the event.
+     *@param  s  Should be equal to this.
+     */
+    public void commandAction(Command c, Displayable s)
+    {
+        if (c == cmdExit)
+        {
+            destroyApp(false);
+            notifyDestroyed();
+        }
+        else if (c == cmdScreen)
+        {
+            alert.setTitle("Command run");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/tsrc/fute/lcdui/Midp_General/src/Midp_General_05.java	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2003-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:
+*
+*/
+
+/**
+ * import midp classes.
+ */
+import javax.microedition.midlet.*;
+import javax.microedition.lcdui.*;
+
+/**
+ *  This is the main class for the Midp_General_05 tests.
+ */
+
+public class Midp_General_05 extends MIDlet implements CommandListener
+{
+
+    private Canvas canvas;
+    private Display display;
+    private Command cmdExit = new Command("Exit", Command.EXIT, 1);
+
+    public Midp_General_05()
+    {
+        display = Display.getDisplay(this);
+        canvas = new EmptyCanvas();
+        canvas.addCommand(cmdExit);
+        canvas.setCommandListener(this);
+    }
+
+    /**
+     * Signals the MIDlet to start and enter the Active state.
+     */
+    protected void startApp()
+    {
+        display.setCurrent(canvas);
+    }
+
+    /**
+     *  Signals the MIDlet to terminate and enter the Destroyed state.
+     *
+     */
+    protected void destroyApp(boolean unconditional)
+    {
+    }
+
+    /**
+     *  Signals the MIDlet to stop and enter the Paused state.
+     */
+    protected void pauseApp()
+    {
+    }
+
+    /**
+     *  This method handles command invocations.
+     *
+     *@param  c  This is the command responsible for the event.
+     *@param  s  Should be equal to this.
+     */
+    public void commandAction(Command c, Displayable s)
+    {
+        if (c == cmdExit)
+        {
+            destroyApp(false);
+            notifyDestroyed();
+        }
+    }
+}
+
+class EmptyCanvas extends Canvas
+{
+    protected void paint(Graphics g)
+    {
+        g.setColor(0, 0, 0);
+        g.drawString("Empty Canvas", getWidth()/2, getHeight()/2, Graphics.TOP | Graphics.HCENTER);
+    }
+}
--- a/javauis/tsrc/fute/lcdui/Midp_General_02/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-<!--
-#
-# 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: 
-#
--->
-
-<project name="Midp_General_02" default="pack">
-
-    <!-- Get general settings for MIDlet projects. -->
-    <import file="../../properties.xml"/>
-
-    <!-- Set properties for this project. -->
-    <property name="midlet1.name" value="Midp_General_02"/>
-    <property name="midlet1.icon.name" value=""/>
-    <property name="midlet1.package.name" value="Midp_General_02"/>
-    <property name="midlet.permissions" value=""/>
-    <property name="package.name" value="Midp_General_02"/>
-    <property name="company.name" value="Nokia"/>
-    <property name="midlet.version" value="1.0"/>
-    <property name="midlet.description" value=""/>
-
-    <!-- Get settings for a basic MIDlet. -->
-    <import file="../../properties-basic-midlet.xml"/>
-
-</project>
\ No newline at end of file
--- a/javauis/tsrc/fute/lcdui/Midp_General_02/src/Midp_General_02.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2003-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:
-*
-*/
-
-/**
- * import midp classes.
- */
-import javax.microedition.midlet.*;
-import javax.microedition.lcdui.*;
-
-/**
- *
- */
-
-public class Midp_General_02 extends MIDlet
-{
-
-    TextBox tb;
-    Display display;
-
-    public Midp_General_02()
-    {
-        tb = new TextBox("TextBox", null, 1000, TextField.ANY);
-        display = Display.getDisplay(this);
-    }
-
-    /**
-     * Signals the MIDlet to start and enter the Active state.
-     */
-    protected void startApp()
-    {
-        display.setCurrent(tb);
-    }
-
-    /**
-     *  Signals the MIDlet to terminate and enter the Destroyed state.
-     *
-     */
-    protected void destroyApp(boolean unconditional)
-    {
-    }
-
-    /**
-     *  Signals the MIDlet to stop and enter the Paused state.
-     */
-    protected void pauseApp()
-    {
-    }
-}
-
--- a/javauis/tsrc/fute/lcdui/Midp_General_04/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-<!--
-#
-# 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: 
-#
--->
-
-<project name="Midp_General_04" default="pack">
-
-    <!-- Get general settings for MIDlet projects. -->
-    <import file="../../properties.xml"/>
-
-    <!-- Set properties for this project. -->
-    <property name="midlet1.name" value="Midp_General_04"/>
-    <property name="midlet1.icon.name" value=""/>
-    <property name="midlet1.package.name" value="Midp_General_04"/>
-    <property name="midlet.permissions" value=""/>
-    <property name="package.name" value="Midp_General_04"/>
-    <property name="company.name" value="Nokia"/>
-    <property name="midlet.version" value="1.0"/>
-    <property name="midlet.description" value=""/>
-
-    <!-- Get settings for a basic MIDlet. -->
-    <import file="../../properties-basic-midlet.xml"/>
-
-</project>
\ No newline at end of file
--- a/javauis/tsrc/fute/lcdui/Midp_General_04/src/Midp_General_04.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2003-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:
-*
-*/
-
-/**
- * import midp classes.
- */
-import javax.microedition.midlet.*;
-import javax.microedition.lcdui.*;
-
-/**
- *
- */
-
-public class Midp_General_04 extends MIDlet
-{
-
-    private Alert alert;
-    private Display display;
-
-    public Midp_General_04()
-    {
-        alert = new Alert("Alert title", "Alert Text", null, AlertType.INFO);
-        display = Display.getDisplay(this);
-    }
-
-    /**
-     * Signals the MIDlet to start and enter the Active state.
-     */
-    protected void startApp()
-    {
-        display.setCurrent(alert);
-    }
-
-    /**
-     *  Signals the MIDlet to terminate and enter the Destroyed state.
-     *
-     */
-    protected void destroyApp(boolean unconditional)
-    {
-    }
-
-    /**
-     *  Signals the MIDlet to stop and enter the Paused state.
-     */
-    protected void pauseApp()
-    {
-    }
-}
-
--- a/javauis/tsrc/fute/lcdui/Midp_General_05/build.xml	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-<!--
-#
-# 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: 
-#
--->
-
-<project name="Midp_General_05" default="pack">
-
-    <!-- Get general settings for MIDlet projects. -->
-    <import file="../../properties.xml"/>
-
-    <!-- Set properties for this project. -->
-    <property name="midlet1.name" value="Midp_General_05"/>
-    <property name="midlet1.icon.name" value=""/>
-    <property name="midlet1.package.name" value="Midp_General_05"/>
-    <property name="midlet.permissions" value=""/>
-    <property name="package.name" value="Midp_General_05"/>
-    <property name="company.name" value="Nokia"/>
-    <property name="midlet.version" value="1.0"/>
-    <property name="midlet.description" value=""/>
-
-    <!-- Get settings for a basic MIDlet. -->
-    <import file="../../properties-basic-midlet.xml"/>
-
-</project>
\ No newline at end of file
--- a/javauis/tsrc/fute/lcdui/Midp_General_05/src/Midp_General_05.java	Thu May 27 12:49:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/*
-* Copyright (c) 2003-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:
-*
-*/
-
-/**
- * import midp classes.
- */
-import javax.microedition.midlet.*;
-import javax.microedition.lcdui.*;
-
-/**
- *
- */
-
-public class Midp_General_05 extends MIDlet
-{
-
-    private Canvas canvas;
-    private Display display;
-
-    public Midp_General_05()
-    {
-        display = Display.getDisplay(this);
-        canvas = new EmptyCanvas();
-    }
-
-    /**
-     * Signals the MIDlet to start and enter the Active state.
-     */
-    protected void startApp()
-    {
-        display.setCurrent(canvas);
-    }
-
-    /**
-     *  Signals the MIDlet to terminate and enter the Destroyed state.
-     *
-     */
-    protected void destroyApp(boolean unconditional)
-    {
-    }
-
-    /**
-     *  Signals the MIDlet to stop and enter the Paused state.
-     */
-    protected void pauseApp()
-    {
-    }
-}
-
-class EmptyCanvas extends Canvas
-{
-    protected void paint(Graphics g)
-    {
-        g.setColor(0, 0, 0);
-        g.drawString("Empty Canvas", getWidth()/2, getHeight()/2, Graphics.TOP | Graphics.HCENTER);
-    }
-}
-
--- a/rom/java_2_1.iby	Thu May 27 12:49:31 2010 +0300
+++ b/rom/java_2_1.iby	Fri Jun 11 13:33:44 2010 +0300
@@ -354,6 +354,7 @@
 data=ZRESOURCE\java\midpOdcList                                             JAVA_RES_IMG\midpodclist
 data=ZRESOURCE\java\installerOdcList                                        JAVA_RES_IMG\installerodclist
 data=ZRESOURCE\java\tckRunnerOdcList                                        JAVA_RES_IMG\tckrunnerodclist
+data=ZRESOURCE\java\javacontrolpanelodclist                                 JAVA_RES_IMG\javacontrolpanelodclist
 
 // trust roots list
 data=ZRESOURCE\java\security\trustroots\midprootslist                       JAVA_RES_IMG\security\trustroots\midprootslist
--- a/rom/java_3_1.iby	Thu May 27 12:49:31 2010 +0300
+++ b/rom/java_3_1.iby	Fri Jun 11 13:33:44 2010 +0300
@@ -36,11 +36,9 @@
 // stub sis
 data=ZSYSTEM\install\java.sis    System\Install\java.sis
 
-#ifdef RD_JAVA_APPLICATION_SETTINGS_QT
 // Application settings
-//file=ABI_DIR\BUILD_DIR\javaapplicationsettingsview.dll             SHARED_LIB_DIR\javaapplicationsettingsview.dll
-//data=DATAZ_\resource\qt\plugins\appsettings\javaapplicationsettingsview.qtplugin 													resource\qt\plugins\appsettings\javaapplicationsettingsview.qtplugin
-#endif
+file=ABI_DIR\BUILD_DIR\javaapplicationsettingsview.dll                              SHARED_LIB_DIR\javaapplicationsettingsview.dll
+data=DATAZ_\resource\qt\plugins\appsettings\javaapplicationsettingsview.qtplugin 		resource\qt\plugins\appsettings\javaapplicationsettingsview.qtplugin
 
 // Captain
 file=ABI_DIR\BUILD_DIR\javacaptain_ext_btdeviceclassmanager.dll             SHARED_LIB_DIR\javacaptain_ext_btdeviceclassmanager.dll
@@ -61,8 +59,6 @@
 file=ABI_DIR\BUILD_DIR\javasizehelperserver.dll                             SHARED_LIB_DIR\javasizehelperserver.dll
 
 // Installer
-ECOM_PLUGIN(ifeui.dll,ifeui.rsc)
-data=ZRESOURCE\plugins\ifeui.rsc                                            ECOM_RESOURCE_DIR\ifeui.rsc
 data=ZPRIVATE\10003a3f\apps\javainstaller_reg.rsc                           \private\10003a3f\import\apps\javainstaller_reg.rsc
 data=ZRESOURCE\apps\javainstaller_loc.rsc                                   APP_RESOURCE_DIR\javainstaller_loc.rsc
 data=ZRESOURCE\apps\javainstaller_icon.mif                                  APP_BITMAP_DIR\javainstaller_icon.mif
@@ -117,6 +113,8 @@
 // eSWT
 file=ABI_DIR\BUILD_DIR\eswtqt.dll                                             SHARED_LIB_DIR\eswtqt.dll
 data=JAVA_VM_RES_BLD\eswtqt.odc                                               JAVA_VM_RES_IMG\eswtqt.odc
+file=ABI_DIR\BUILD_DIR\eswtqtwebkit.dll                                       SHARED_LIB_DIR\eswtqtwebkit.dll
+data=JAVA_VM_RES_BLD\eswtqtwebkit.odc                                         JAVA_VM_RES_IMG\eswtqtwebkit.odc
 
 // LCDUI
 file=ABI_DIR\BUILD_DIR\openlcdui.dll                                        SHARED_LIB_DIR\openlcdui.dll
@@ -146,22 +144,21 @@
 data=JAVA_VM_RES_BLD\javasoftnotification.odc                               JAVA_VM_RES_IMG\javasoftnotification.odc
 */
 
-// 2G API
+// M2G API
 /*file=ABI_DIR\BUILD_DIR\javam2g.dll                                          SHARED_LIB_DIR\javam2g.dll
 data=JAVA_VM_RES_BLD\javam2g.odc                                            JAVA_VM_RES_IMG\javam2g.odc
 */
-// 3G API
-/*file=ABI_DIR\BUILD_DIR\javam3g.dll                                          SHARED_LIB_DIR\javam3g.dll
+// M3G API
+file=ABI_DIR\BUILD_DIR\javam3g.dll                                          SHARED_LIB_DIR\javam3g.dll
 data=JAVA_VM_RES_BLD\javam3g.odc                                            JAVA_VM_RES_IMG\javam3g.odc
-*/
+
 // Nokia UI API
 file=ABI_DIR\BUILD_DIR\javanokiaui.dll                                     SHARED_LIB_DIR\javanokiaui.dll
 data=JAVA_VM_RES_BLD\javanokiaui.odc                                       JAVA_VM_RES_IMG\javanokiaui.odc
 
 // Nokia Sound API
-/*file=ABI_DIR\BUILD_DIR\javanokiasound.dll                                   SHARED_LIB_DIR\javanokiasound.dll
+file=ABI_DIR\BUILD_DIR\javanokiasound.dll                                   SHARED_LIB_DIR\javanokiasound.dll
 data=JAVA_VM_RES_BLD\javanokiasound.odc                                     JAVA_VM_RES_IMG\javanokiasound.odc
-*/
 
 // Remote Connection Observer
 /*file=ABI_DIR\BUILD_DIR\javaremconobserver.dll                               SHARED_LIB_DIR\javaremconobserver.dll
@@ -356,6 +353,7 @@
 data=ZRESOURCE\java\midpOdcList                                             JAVA_RES_IMG\midpodclist
 data=ZRESOURCE\java\installerOdcList                                        JAVA_RES_IMG\installerodclist
 data=ZRESOURCE\java\tckRunnerOdcList                                        JAVA_RES_IMG\tckrunnerodclist
+data=ZRESOURCE\java\javacontrolpanelodclist                                 JAVA_RES_IMG\javacontrolpanelodclist
 
 // trust roots list
 data=ZRESOURCE\java\security\trustroots\midprootslist                       JAVA_RES_IMG\security\trustroots\midprootslist
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rom/javacontrolpanelodclist	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,7 @@
+javautils.odc
+javacomms.odc
+javalegacyutils.odc
+eswt.odc
+eswtdirectcontent.odc
+resources.jar
+javacontrolpanel.odc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rom/javacontrolpanelodclist30	Fri Jun 11 13:33:44 2010 +0300
@@ -0,0 +1,5 @@
+javautils.odc
+javacomms.odc
+eswtqt.odc
+resources.jar
+javacontrolpanel.odc
--- a/rom/javatest.iby	Thu May 27 12:49:31 2010 +0300
+++ b/rom/javatest.iby	Fri Jun 11 13:33:44 2010 +0300
@@ -46,9 +46,10 @@
 data=JAVA_CERT_BLD\test_trustedthirdparty.der        JAVA_CERT_IMG\test_trustedthirdparty.der
 data=JAVA_CERT_BLD\test_trustedthirdparty.metadata   JAVA_CERT_IMG\test_trustedthirdparty.metadata
 
-// JavaCap App test utility
-file=ABI_DIR\BUILD_DIR\JavaCap.exe              PROGRAMS_DIR\JavaCap.exe
-data=ZPRIVATE\10003a3f\apps\JavaCap_reg.rsc     \private\10003a3f\import\apps\JavaCap_reg.rsc
-data=\epoc32\data\z\resource\apps\JavaCap.rsc   \resource\apps\JavaCap.rsc
+// Java Control Panel test utility
+file=ABI_DIR\BUILD_DIR\javacontrolpanel.exe             PROGRAMS_DIR\javacontrolpanel.exe
+file=ABI_DIR\BUILD_DIR\javacontrolpanel.dll             SHARED_LIB_DIR\javacontrolpanel.dll
+data=JAVA_VM_ODC_BLD\javacontrolpanel.odc               JAVA_VM_ODC_IMG\javacontrolpanel.odc
+data=ZPRIVATE\10003a3f\apps\javacontrolpanel_reg.rsc    \private\10003a3f\import\apps\javacontrolpanel_reg.rsc
 
 #endif
--- a/rom/midpodclist30	Thu May 27 12:49:31 2010 +0300
+++ b/rom/midpodclist30	Fri Jun 11 13:33:44 2010 +0300
@@ -1,4 +1,5 @@
 eswtqt.odc
+javaamms.odc
 javabluecove.odc
 javabluetooth.odc
 javabluetoothcommons.odc
@@ -17,6 +18,7 @@
 javam3g.odc
 javamidpruntime.odc
 javamobinfo.odc
+javamobilemedia.odc
 javanokiasound.odc
 javapim.odc
 javapushregistry.odc