From a129444bb0156c936900dbd2f12bd9f427ff366c Mon Sep 17 00:00:00 2001
From: Qt by Nokia <qt-info@nokia.com>
Date: Wed, 27 Apr 2011 14:13:26 +0200
Subject: [PATCH] Initial import from qtquick2.

Branched from the monolithic repo, Qt qtquick2 branch, at commit
a4a585d2ee907746682846ae6e8a48e19deef469
---
 .../plasmapatrol/PlasmaPatrol.qmlproject      |   18 +
 demos/declarative/plasmapatrol/TODO           |   10 +
 .../plasmapatrol/content/BlasterHardpoint.qml |  133 +
 .../plasmapatrol/content/Button.qml           |   66 +
 .../plasmapatrol/content/CannonHardpoint.qml  |   97 +
 .../plasmapatrol/content/ChoiceBox.qml        |  105 +
 .../plasmapatrol/content/Cruiser.qml          |  146 +
 .../plasmapatrol/content/Frigate.qml          |  114 +
 .../plasmapatrol/content/Hardpoint.qml        |  112 +
 .../plasmapatrol/content/HelpScreens.qml      |  268 ++
 .../plasmapatrol/content/LaserHardpoint.qml   |  108 +
 .../content/PlasmaPatrolParticles.qml         |  173 +
 .../plasmapatrol/content/SequentialLoader.qml |   54 +
 .../declarative/plasmapatrol/content/Ship.qml |  113 +
 .../plasmapatrol/content/Sloop.qml            |  108 +
 .../plasmapatrol/content/pics/TitleText.png   |  Bin 0 -> 1109 bytes
 .../content/pics/blur-circle2.png             |  Bin 0 -> 3627 bytes
 .../content/pics/blur-circle3.png             |  Bin 0 -> 5148 bytes
 .../content/pics/finalfrontier.png            |  Bin 0 -> 695061 bytes
 .../plasmapatrol/content/pics/meteor.png      |  Bin 0 -> 83169 bytes
 .../content/pics/meteor_explo.png             |  Bin 0 -> 81528 bytes
 .../plasmapatrol/content/pics/nullRock.png    |  Bin 0 -> 140 bytes
 .../plasmapatrol/content/pics/particle.png    |  Bin 0 -> 861 bytes
 .../plasmapatrol/content/pics/star.png        |  Bin 0 -> 1550 bytes
 .../plasmapatrol/content/pics/star2.png       |  Bin 0 -> 6507 bytes
 .../plasmapatrol/content/pics/star3.png       |  Bin 0 -> 4602 bytes
 .../declarative/plasmapatrol/plasmapatrol.qml |  386 ++
 .../samegame/SamegameCore/BoomBlock.qml       |   36 +-
 .../samegame/SamegameCore/Button.qml          |    2 +-
 .../samegame/SamegameCore/Dialog.qml          |    7 +-
 .../samegame/SamegameCore/pics/blueStar.png   |  Bin 278 -> 0 bytes
 .../samegame/SamegameCore/pics/greenStar.png  |  Bin 273 -> 0 bytes
 .../samegame/SamegameCore/pics/particle.png   |  Bin 0 -> 861 bytes
 .../samegame/SamegameCore/pics/redStar.png    |  Bin 274 -> 0 bytes
 .../samegame/SamegameCore/pics/star.png       |  Bin 262 -> 0 bytes
 .../samegame/SamegameCore/samegame.js         |   43 +-
 demos/declarative/samegame/samegame.qml       |   35 +-
 demos/declarative/shadereffects/Slider.qml    |   93 +
 .../declarative/shadereffects/face-smile.png  |  Bin 0 -> 15408 bytes
 demos/declarative/shadereffects/qt-logo.png   |  Bin 0 -> 13923 bytes
 .../declarative/shadereffects/shader-demo.qml |  295 ++
 doc/src/declarative/modules.qdoc              |  123 +
 doc/src/declarative/qdeclarativeintro.qdoc    |    8 +
 .../models/views-models-delegates.qml         |    1 +
 .../models/visual-model-and-view.qml          |    1 +
 .../mousearea/mousearea-snippet.qml           |    2 -
 .../declarative/states/statechangescript.qml  |    1 +
 examples/declarative/declarative.pro          |    3 +-
 .../inputmethods/inputmethods.qmlproject      |   16 +
 .../inputmethods/spellcheck/Key.qml           |   85 +
 .../inputmethods/spellcheck/Keyboard.qml      |  141 +
 .../spellcheck/WordSuggestions.qml            |  100 +
 .../inputmethods/spellcheck/spellcheck.qml    |  137 +
 examples/declarative/painteditem/main.cpp     |   80 +
 examples/declarative/painteditem/myfile.qml   |   57 +
 .../declarative/painteditem/painteditem.pro   |   14 +
 .../particles/allsmiles/content/particle.png  |  Bin 0 -> 861 bytes
 .../allsmiles/content/singlesmile.png         |  Bin 0 -> 269 bytes
 .../particles/allsmiles/content/sizeInOut.png |  Bin 0 -> 251 bytes
 .../particles/allsmiles/content/smileMask.png |  Bin 0 -> 259 bytes
 .../allsmiles/content/squarefacesprite.png    |  Bin 0 -> 496 bytes
 .../allsmiles/content/squarefacesprite2.png   |  Bin 0 -> 459 bytes
 .../allsmiles/content/squarefacesprite3.png   |  Bin 0 -> 476 bytes
 .../allsmiles/content/squarefacesprite4.png   |  Bin 0 -> 553 bytes
 .../allsmiles/content/squarefacesprite5.png   |  Bin 0 -> 623 bytes
 .../allsmiles/content/squarefacesprite6.png   |  Bin 0 -> 615 bytes
 .../allsmiles/content/squarefacesprite7.png   |  Bin 0 -> 581 bytes
 .../allsmiles/content/squarefacespriteX.png   |  Bin 0 -> 474 bytes
 .../allsmiles/content/squarefacespriteXX.png  |  Bin 0 -> 255 bytes
 .../declarative/particles/allsmiles/smile.qml |   77 +
 .../particles/allsmiles/smilefactory.qml      |  117 +
 .../particles/allsmiles/spriteparticles.qml   |  103 +
 .../allsmiles/spritestateparticles.qml        |  190 +
 .../allsmiles/spritevariedparticles.qml       |  117 +
 .../particles/asteroid/asteroid.qml           |  213 ++
 .../particles/asteroid/blackhole.qml          |  200 ++
 .../particles/asteroid/content/_explo.png     |  Bin 0 -> 81528 bytes
 .../asteroid/content/finalfrontier.png        |  Bin 0 -> 695061 bytes
 .../particles/asteroid/content/meteor.png     |  Bin 0 -> 83169 bytes
 .../asteroid/content/meteor_explo.png         |  Bin 0 -> 219946 bytes
 .../particles/asteroid/content/meteors.png    |  Bin 0 -> 132137 bytes
 .../particles/asteroid/content/nullRock.png   |  Bin 0 -> 140 bytes
 .../particles/asteroid/content/particle4.png  |  Bin 0 -> 1799 bytes
 .../particles/asteroid/content/rocket.png     |  Bin 0 -> 7315 bytes
 .../particles/asteroid/content/rocket2.png    |  Bin 0 -> 1918 bytes
 .../particles/asteroid/content/star.png       |  Bin 0 -> 1550 bytes
 .../particles/modelparticles/bubbles.qml      |   81 +
 .../modelparticles/content/Delegate.qml       |   88 +
 .../modelparticles/content/Delegate2.qml      |   79 +
 .../content/ExpandingDelegate.qml             |  204 ++
 .../modelparticles/content/RssModel.qml       |   53 +
 .../modelparticles/content/bubble.png         |  Bin 0 -> 3413 bytes
 .../modelparticles/content/script.js          |   27 +
 .../particles/modelparticles/gridsplosion.qml |  146 +
 .../particles/modelparticles/package.qml      |   91 +
 .../particles/modelparticles/stream.qml       |  280 ++
 .../particles/snow/content/flake-01.png       |  Bin 0 -> 189327 bytes
 examples/declarative/particles/snow/snow.qml  |   75 +
 examples/declarative/particles/snow/snow2.qml |   74 +
 examples/declarative/particles/snow/snow3.qml |   80 +
 .../spaceexplorer/content/helpers.js          |    8 +
 .../spaceexplorer/content/particle4.png       |  Bin 0 -> 1799 bytes
 .../spaceexplorer/content/powerupScore.png    |  Bin 0 -> 83169 bytes
 .../content/powerupScore_gone.png             |  Bin 0 -> 140 bytes
 .../content/powerupScore_got.png              |  Bin 0 -> 81528 bytes
 .../spaceexplorer/content/rocket.png          |  Bin 0 -> 7315 bytes
 .../spaceexplorer/content/rocket2.png         |  Bin 0 -> 1918 bytes
 .../spaceexplorer/content/rocketEye.png       |  Bin 0 -> 2073 bytes
 .../particles/spaceexplorer/content/star.png  |  Bin 0 -> 1550 bytes
 .../particles/spaceexplorer/spaceexplorer.qml |  412 +++
 .../particles/trails/content/PetsModel.qml    |   98 +
 .../particles/trails/content/candle.png       |  Bin 0 -> 1348 bytes
 .../particles/trails/content/colortable.png   |  Bin 0 -> 704 bytes
 .../particles/trails/content/particle.png     |  Bin 0 -> 861 bytes
 .../particles/trails/content/particle2.png    |  Bin 0 -> 3909 bytes
 .../particles/trails/content/particle3.png    |  Bin 0 -> 3186 bytes
 .../particles/trails/content/particleA.png    |  Bin 0 -> 3541 bytes
 .../particles/trails/content/portal_bg.png    |  Bin 0 -> 96858 bytes
 .../particles/trails/content/sparkleSize.png  |  Bin 0 -> 378 bytes
 .../particles/trails/content/star.png         |  Bin 0 -> 1550 bytes
 .../particles/trails/dynamicemitters.qml      |  121 +
 .../particles/trails/fireballs.qml            |  174 +
 .../declarative/particles/trails/layered.qml  |   93 +
 .../declarative/particles/trails/list.qml     |  120 +
 .../particles/trails/overburst.qml            |   85 +
 .../declarative/particles/trails/portal.qml   |  110 +
 .../declarative/particles/trails/rainbow.qml  |   82 +
 .../declarative/particles/trails/shimmer.qml  |   73 +
 .../declarative/particles/trails/swarm.qml    |   78 +
 .../declarative/particles/trails/trails.qml   |   87 +
 .../particles/trails/turbulence.qml           |  129 +
 .../particles/trails/velocityfrommotion.qml   |  327 ++
 .../debugger/qdeclarativedebug.cpp            |   46 +
 .../debugger/qdeclarativedebugserver.cpp      |   50 +-
 .../debugger/qdeclarativedebugserver_p.h      |    3 +
 .../qdeclarativedebugserverconnection_p.h     |    1 +
 .../debugger/qdeclarativedebugservice.cpp     |   10 +
 .../debugger/qdeclarativedebugservice_p.h     |    2 +
 .../debugger/qdeclarativedebugtrace.cpp       |    9 +-
 .../debugger/qdeclarativedebugtrace_p.h       |    1 +
 src/declarative/debugger/qpacketprotocol.cpp  |   49 +-
 src/declarative/debugger/qpacketprotocol_p.h  |    2 +
 src/declarative/declarative.pro               |    2 +
 .../graphicsitems/qdeclarativeitem.cpp        |   48 +
 .../graphicsitems/qdeclarativeitem_p.h        |   11 +-
 .../graphicsitems/qdeclarativetextedit.cpp    |    3 +-
 src/declarative/items/checksync.pl            |  108 +
 src/declarative/items/items.pri               |  109 +
 src/declarative/items/qsganchors.cpp          | 1111 ++++++
 src/declarative/items/qsganchors_p.h          |  201 ++
 src/declarative/items/qsganchors_p_p.h        |  173 +
 src/declarative/items/qsganimatedimage.cpp    |  304 ++
 src/declarative/items/qsganimatedimage_p.h    |  117 +
 src/declarative/items/qsganimatedimage_p_p.h  |   88 +
 src/declarative/items/qsganimation.cpp        |  442 +++
 src/declarative/items/qsganimation_p.h        |  132 +
 src/declarative/items/qsganimation_p_p.h      |   97 +
 src/declarative/items/qsgborderimage.cpp      |  359 ++
 src/declarative/items/qsgborderimage_p.h      |  110 +
 src/declarative/items/qsgborderimage_p_p.h    |  109 +
 src/declarative/items/qsgcanvas.cpp           | 1890 ++++++++++
 src/declarative/items/qsgcanvas.h             |  118 +
 src/declarative/items/qsgcanvas_p.h           |  195 +
 src/declarative/items/qsgclipnode.cpp         |  121 +
 src/declarative/items/qsgclipnode_p.h         |   71 +
 src/declarative/items/qsgevents.cpp           |   47 +
 src/declarative/items/qsgevents_p_p.h         |  142 +
 src/declarative/items/qsgflickable.cpp        | 1397 ++++++++
 src/declarative/items/qsgflickable_p.h        |  230 ++
 src/declarative/items/qsgflickable_p_p.h      |  231 ++
 src/declarative/items/qsgflipable.cpp         |  255 ++
 src/declarative/items/qsgflipable_p.h         |  104 +
 src/declarative/items/qsgfocusscope.cpp       |   57 +
 src/declarative/items/qsgfocusscope_p.h       |   68 +
 src/declarative/items/qsggridview.cpp         | 2634 ++++++++++++++
 src/declarative/items/qsggridview_p.h         |  290 ++
 src/declarative/items/qsgimage.cpp            |  288 ++
 src/declarative/items/qsgimage_p.h            |  104 +
 src/declarative/items/qsgimage_p_p.h          |   81 +
 src/declarative/items/qsgimagebase.cpp        |  273 ++
 src/declarative/items/qsgimagebase_p.h        |  116 +
 src/declarative/items/qsgimagebase_p_p.h      |   93 +
 src/declarative/items/qsgimplicitsizeitem.cpp |   93 +
 src/declarative/items/qsgimplicitsizeitem_p.h |  101 +
 .../items/qsgimplicitsizeitem_p_p.h           |   92 +
 src/declarative/items/qsgitem.cpp             | 3143 +++++++++++++++++
 src/declarative/items/qsgitem.h               |  399 +++
 src/declarative/items/qsgitem_p.h             |  710 ++++
 .../items/qsgitemchangelistener_p.h           |   82 +
 src/declarative/items/qsgitemsmodule.cpp      |  205 ++
 src/declarative/items/qsgitemsmodule_p.h      |   65 +
 src/declarative/items/qsglistview.cpp         | 3032 ++++++++++++++++
 src/declarative/items/qsglistview_p.h         |  374 ++
 src/declarative/items/qsgloader.cpp           |  340 ++
 src/declarative/items/qsgloader_p.h           |  107 +
 src/declarative/items/qsgloader_p_p.h         |   91 +
 src/declarative/items/qsgmousearea.cpp        |  771 ++++
 src/declarative/items/qsgmousearea_p.h        |  216 ++
 src/declarative/items/qsgmousearea_p_p.h      |  112 +
 src/declarative/items/qsgninepatchnode.cpp    |  273 ++
 src/declarative/items/qsgninepatchnode_p.h    |   94 +
 src/declarative/items/qsgpainteditem.cpp      |  354 ++
 src/declarative/items/qsgpainteditem.h        |  119 +
 src/declarative/items/qsgpainteditem_p.h      |   67 +
 src/declarative/items/qsgpathview.cpp         | 1410 ++++++++
 src/declarative/items/qsgpathview_p.h         |  254 ++
 src/declarative/items/qsgpathview_p_p.h       |  193 +
 src/declarative/items/qsgpincharea.cpp        |  407 +++
 src/declarative/items/qsgpincharea_p.h        |  310 ++
 src/declarative/items/qsgpincharea_p_p.h      |  112 +
 src/declarative/items/qsgpositioners.cpp      |  788 +++++
 src/declarative/items/qsgpositioners_p.h      |  242 ++
 src/declarative/items/qsgpositioners_p_p.h    |  173 +
 src/declarative/items/qsgrectangle.cpp        |  286 ++
 src/declarative/items/qsgrectangle_p.h        |  184 +
 src/declarative/items/qsgrectangle_p_p.h      |  109 +
 src/declarative/items/qsgrepeater.cpp         |  294 ++
 src/declarative/items/qsgrepeater_p.h         |  111 +
 src/declarative/items/qsgrepeater_p_p.h       |   83 +
 src/declarative/items/qsgscalegrid.cpp        |  213 ++
 src/declarative/items/qsgscalegrid_p_p.h      |  134 +
 src/declarative/items/qsgshadereffectitem.cpp |  449 +++
 src/declarative/items/qsgshadereffectitem_p.h |  159 +
 src/declarative/items/qsgshadereffectmesh.cpp |  167 +
 src/declarative/items/qsgshadereffectmesh_p.h |  102 +
 src/declarative/items/qsgshadereffectnode.cpp |  322 ++
 src/declarative/items/qsgshadereffectnode_p.h |  148 +
 .../items/qsgshadereffectsource.cpp           |  526 +++
 .../items/qsgshadereffectsource_p.h           |  219 ++
 src/declarative/items/qsgstateoperations.cpp  | 1347 +++++++
 src/declarative/items/qsgstateoperations_p.h  |  275 ++
 src/declarative/items/qsgtext.cpp             | 1240 +++++++
 src/declarative/items/qsgtext_p.h             |  214 ++
 src/declarative/items/qsgtext_p_p.h           |  154 +
 src/declarative/items/qsgtextedit.cpp         | 1235 +++++++
 src/declarative/items/qsgtextedit_p.h         |  303 ++
 src/declarative/items/qsgtextedit_p_p.h       |  143 +
 src/declarative/items/qsgtextinput.cpp        | 1265 +++++++
 src/declarative/items/qsgtextinput_p.h        |  299 ++
 src/declarative/items/qsgtextinput_p_p.h      |  150 +
 src/declarative/items/qsgtextnode.cpp         |  457 +++
 src/declarative/items/qsgtextnode_p.h         |   84 +
 src/declarative/items/qsgtranslate.cpp        |  297 ++
 src/declarative/items/qsgtranslate_p.h        |  162 +
 src/declarative/items/qsgview.cpp             |  466 +++
 src/declarative/items/qsgview.h               |  120 +
 src/declarative/items/qsgvisualitemmodel.cpp  | 1247 +++++++
 src/declarative/items/qsgvisualitemmodel_p.h  |  257 ++
 src/declarative/items/syncexcludes            |   11 +
 src/declarative/qml/qdeclarative.h            |   33 +
 src/declarative/qml/qdeclarativebinding.cpp   |   19 +-
 .../qml/qdeclarativecompiledbindings.cpp      | 2906 ---------------
 .../qml/qdeclarativecompileddata.cpp          |    3 +
 src/declarative/qml/qdeclarativecompiler.cpp  |  149 +-
 src/declarative/qml/qdeclarativecompiler_p.h  |    5 +-
 src/declarative/qml/qdeclarativecomponent.cpp |   39 +-
 src/declarative/qml/qdeclarativecomponent.h   |    1 -
 src/declarative/qml/qdeclarativecontext.cpp   |   84 +-
 src/declarative/qml/qdeclarativecontext_p.h   |   11 +-
 src/declarative/qml/qdeclarativedirparser.cpp |   23 +-
 src/declarative/qml/qdeclarativedirparser_p.h |   16 +
 src/declarative/qml/qdeclarativedom.cpp       | 1835 ----------
 src/declarative/qml/qdeclarativedom_p.h       |  362 --
 src/declarative/qml/qdeclarativedom_p_p.h     |  157 -
 src/declarative/qml/qdeclarativeengine.cpp    |  132 +-
 src/declarative/qml/qdeclarativeengine.h      |    3 +-
 src/declarative/qml/qdeclarativeengine_p.h    |   25 +-
 .../qml/qdeclarativeexpression.cpp            |    7 +-
 .../qml/qdeclarativeimageprovider.cpp         |   33 +
 .../qml/qdeclarativeimageprovider.h           |    5 +-
 src/declarative/qml/qdeclarativeimport.cpp    |  208 +-
 src/declarative/qml/qdeclarativeimport_p.h    |    6 +-
 src/declarative/qml/qdeclarativeinfo.cpp      |   12 +
 .../qml/qdeclarativeinstruction.cpp           |    3 +
 .../qml/qdeclarativeinstruction_p.h           |    7 +
 src/declarative/qml/qdeclarativemetatype.cpp  |   96 +-
 src/declarative/qml/qdeclarativemetatype_p.h  |   39 +
 .../qml/qdeclarativeobjectscriptclass.cpp     |   27 +
 src/declarative/qml/qdeclarativeprivate.h     |   17 +-
 .../qml/qdeclarativepropertycache.cpp         |    2 +
 .../qml/qdeclarativepropertycache_p.h         |   21 +-
 .../qdeclarativescarceresourcescriptclass.cpp |  193 +
 .../qdeclarativescarceresourcescriptclass_p.h |  163 +
 .../qml/qdeclarativescriptparser.cpp          |   47 +-
 .../qml/qdeclarativescriptparser_p.h          |    2 +
 .../qml/qdeclarativetypeloader.cpp            |  244 +-
 .../qml/qdeclarativetypeloader_p.h            |   62 +-
 .../qml/qdeclarativetypenamecache.cpp         |    8 +-
 .../qml/qdeclarativetypenamecache_p.h         |   16 +
 .../qml/qdeclarativetypenamescriptclass.cpp   |   38 +-
 .../qml/qdeclarativetypenamescriptclass_p.h   |    1 +
 src/declarative/qml/qdeclarativevme.cpp       |   82 +-
 src/declarative/qml/qdeclarativevme_p.h       |    4 +
 .../qml/qdeclarativevmemetaobject.cpp         |   10 +
 .../qml/qdeclarativexmlhttprequest.cpp        |   21 +
 src/declarative/qml/qintrusivelist.cpp        |  173 +
 src/declarative/qml/qintrusivelist_p.h        |  254 ++
 src/declarative/qml/qmetaobjectbuilder.cpp    |   57 +-
 src/declarative/qml/qmetaobjectbuilder_p.h    |    4 +
 src/declarative/qml/qml.pri                   |   14 +-
 .../qml/v4/qdeclarativev4bindings.cpp         | 1530 ++++++++
 .../qml/v4/qdeclarativev4bindings_p.h         |   92 +
 .../qml/v4/qdeclarativev4compiler.cpp         | 1340 +++++++
 .../qdeclarativev4compiler_p.h}               |   38 +-
 .../qml/v4/qdeclarativev4compiler_p_p.h       |  184 +
 .../qml/v4/qdeclarativev4instruction.cpp      |  559 +++
 .../qml/v4/qdeclarativev4instruction_p.h      |  444 +++
 src/declarative/qml/v4/qdeclarativev4ir.cpp   |  832 +++++
 src/declarative/qml/v4/qdeclarativev4ir_p.h   |  546 +++
 .../qml/v4/qdeclarativev4irbuilder.cpp        | 1315 +++++++
 .../qml/v4/qdeclarativev4irbuilder_p.h        |  242 ++
 .../qml/v4/qdeclarativev4program_p.h          |  122 +
 src/declarative/qml/v4/v4.pri                 |   17 +
 .../scenegraph/coreapi/qsgdefaultrenderer.cpp |  458 +++
 .../scenegraph/coreapi/qsgdefaultrenderer_p.h |   96 +
 .../scenegraph/coreapi/qsggeometry.cpp        |  310 ++
 .../scenegraph/coreapi/qsggeometry.h          |  254 ++
 .../scenegraph/coreapi/qsgmaterial.cpp        |  199 ++
 .../scenegraph/coreapi/qsgmaterial.h          |  141 +
 .../scenegraph/coreapi/qsgmatrix4x4stack.cpp  |  380 ++
 .../scenegraph/coreapi/qsgmatrix4x4stack.h    |  104 +
 .../scenegraph/coreapi/qsgmatrix4x4stack_p.h  |   73 +
 .../scenegraph/coreapi/qsgnode.cpp            |  837 +++++
 src/declarative/scenegraph/coreapi/qsgnode.h  |  363 ++
 .../scenegraph/coreapi/qsgnodeupdater.cpp     |  243 ++
 .../scenegraph/coreapi/qsgnodeupdater_p.h     |   87 +
 .../scenegraph/coreapi/qsgrenderer.cpp        |  545 +++
 .../scenegraph/coreapi/qsgrenderer_p.h        |  219 ++
 .../scenegraph/qsgadaptationlayer.cpp         |   42 +
 .../scenegraph/qsgadaptationlayer_p.h         |  123 +
 src/declarative/scenegraph/qsgcontext.cpp     |  428 +++
 src/declarative/scenegraph/qsgcontext_p.h     |  124 +
 .../scenegraph/qsgcontextplugin.cpp           |  104 +
 .../scenegraph/qsgcontextplugin_p.h           |   81 +
 .../scenegraph/qsgdefaultglyphnode.cpp        |   95 +
 .../scenegraph/qsgdefaultglyphnode_p.cpp      |  313 ++
 .../scenegraph/qsgdefaultglyphnode_p.h        |   83 +
 .../scenegraph/qsgdefaultglyphnode_p_p.h      |   95 +
 .../scenegraph/qsgdefaultimagenode.cpp        |  181 +
 .../scenegraph/qsgdefaultimagenode_p.h        |   90 +
 .../scenegraph/qsgdefaultrectanglenode.cpp    |  550 +++
 .../scenegraph/qsgdefaultrectanglenode_p.h    |  106 +
 .../scenegraph/qsgdistancefieldglyphcache.cpp |  956 +++++
 .../scenegraph/qsgdistancefieldglyphcache_p.h |  159 +
 .../scenegraph/qsgdistancefieldglyphnode.cpp  |  223 ++
 .../qsgdistancefieldglyphnode_p.cpp           |  656 ++++
 .../scenegraph/qsgdistancefieldglyphnode_p.h  |   93 +
 .../qsgdistancefieldglyphnode_p_p.h           |  128 +
 src/declarative/scenegraph/qsgflashnode.cpp   |   62 +
 src/declarative/scenegraph/qsgflashnode_p.h   |   69 +
 src/declarative/scenegraph/scenegraph.pri     |   80 +
 .../scenegraph/util/qsgareaallocator.cpp      |  290 ++
 .../scenegraph/util/qsgareaallocator_p.h      |   73 +
 src/declarative/scenegraph/util/qsgengine.cpp |  244 ++
 src/declarative/scenegraph/util/qsgengine.h   |  100 +
 .../scenegraph/util/qsgflatcolormaterial.cpp  |  140 +
 .../scenegraph/util/qsgflatcolormaterial.h    |   71 +
 .../scenegraph/util/qsgpainternode.cpp        |  379 ++
 .../scenegraph/util/qsgpainternode_p.h        |  140 +
 .../scenegraph/util/qsgsimplerectnode.cpp     |  132 +
 .../scenegraph/util/qsgsimplerectnode.h       |   77 +
 .../scenegraph/util/qsgsimpletexturenode.cpp  |  152 +
 .../scenegraph/util/qsgsimpletexturenode.h    |   82 +
 .../scenegraph/util/qsgtexture.cpp            |  403 +++
 src/declarative/scenegraph/util/qsgtexture.h  |  135 +
 .../scenegraph/util/qsgtexture_p.h            |  111 +
 .../scenegraph/util/qsgtexturematerial.cpp    |  200 ++
 .../scenegraph/util/qsgtexturematerial.h      |  100 +
 .../scenegraph/util/qsgtexturematerial_p.h    |   73 +
 .../scenegraph/util/qsgtextureprovider.cpp    |   65 +
 .../scenegraph/util/qsgtextureprovider_p.h    |   70 +
 .../util/qsgvertexcolormaterial.cpp           |  136 +
 .../util/qsgvertexcolormaterial_p.h           |   73 +
 .../util/qdeclarativepixmapcache.cpp          |  197 +-
 .../util/qdeclarativepixmapcache_p.h          |    4 +
 src/imports/etcprovider/etcprovider.pro       |   19 +
 src/imports/etcprovider/plugin.cpp            |   72 +
 .../particles.cpp => etcprovider/plugin.h}    |   31 +-
 src/imports/etcprovider/qetcprovider.cpp      |  185 +
 src/imports/etcprovider/qetcprovider.h        |  100 +
 src/imports/etcprovider/qmldir                |    1 +
 src/imports/imports.pro                       |    2 +-
 .../inputcontext/declarativeinputcontext.cpp  |  199 ++
 .../inputcontext/declarativeinputcontext.h    |  104 +
 src/imports/inputcontext/inputcontext.pro     |   38 +
 .../inputcontext/inputcontextfilter.cpp       |  352 ++
 src/imports/inputcontext/inputcontextfilter.h |  162 +
 .../inputcontext/inputcontextmodule.cpp       |  413 +++
 src/imports/inputcontext/inputcontextmodule.h |  121 +
 src/imports/inputcontext/plugin.cpp           |   79 +
 src/imports/inputcontext/qmldir               |    1 +
 .../{ => V1}/qdeclarativeparticles.cpp        |    0
 .../{ => V1}/qdeclarativeparticles_p.h        |    0
 src/imports/particles/angledvector.cpp        |   66 +
 src/imports/particles/angledvector.h          |  133 +
 src/imports/particles/attractoraffector.cpp   |   66 +
 src/imports/particles/attractoraffector.h     |  120 +
 src/imports/particles/coloredparticle.cpp     |  540 +++
 src/imports/particles/coloredparticle.h       |  254 ++
 src/imports/particles/deformableparticle.cpp  |  432 +++
 src/imports/particles/deformableparticle.h    |  202 ++
 src/imports/particles/directedvector.cpp      |   93 +
 src/imports/particles/directedvector.h        |  190 +
 src/imports/particles/driftaffector.cpp       |   67 +
 src/imports/particles/driftaffector.h         |  104 +
 src/imports/particles/ellipseextruder.cpp     |   64 +
 src/imports/particles/ellipseextruder.h       |   86 +
 src/imports/particles/eternalaffector.cpp     |   60 +
 src/imports/particles/eternalaffector.h       |   88 +
 src/imports/particles/followemitter.cpp       |  195 +
 src/imports/particles/followemitter.h         |  168 +
 src/imports/particles/frictionaffector.cpp    |   59 +
 src/imports/particles/frictionaffector.h      |   86 +
 .../gravitationalsingularityaffector.cpp      |  179 +
 .../gravitationalsingularityaffector.h        |  121 +
 src/imports/particles/gravityaffector.cpp     |   77 +
 src/imports/particles/gravityaffector.h       |  106 +
 src/imports/particles/killaffector.cpp        |   57 +
 src/imports/particles/killaffector.h          |   68 +
 src/imports/particles/lineextruder.cpp        |   66 +
 src/imports/particles/lineextruder.h          |   77 +
 src/imports/particles/main.cpp                |  150 +
 src/imports/particles/maskextruder.cpp        |   91 +
 src/imports/particles/maskextruder.h          |   95 +
 src/imports/particles/meanderaffector.cpp     |   65 +
 src/imports/particles/meanderaffector.h       |  103 +
 src/imports/particles/modelparticle.cpp       |  287 ++
 src/imports/particles/modelparticle.h         |  136 +
 src/imports/particles/particle.cpp            |  135 +
 src/imports/particles/particle.h              |  120 +
 src/imports/particles/particleaffector.cpp    |  115 +
 src/imports/particles/particleaffector.h      |  155 +
 src/imports/particles/particleemitter.cpp     |  149 +
 src/imports/particles/particleemitter.h       |  301 ++
 src/imports/particles/particleextruder.cpp    |   78 +
 src/imports/particles/particleextruder.h      |   90 +
 src/imports/particles/particles.pro           |  102 +-
 src/imports/particles/particlesystem.cpp      |  392 ++
 src/imports/particles/particlesystem.h        |  219 ++
 src/imports/particles/pictureaffector.cpp     |   97 +
 src/imports/particles/pictureaffector.h       |   97 +
 src/imports/particles/pluginmain.h            |   65 +
 src/imports/particles/pointvector.cpp         |   62 +
 src/imports/particles/pointvector.h           |  135 +
 src/imports/particles/resetaffector.cpp       |   78 +
 src/imports/particles/resetaffector.h         |   75 +
 .../particles/resources/ctfragment.shader     |   11 +
 .../particles/resources/ctvertex.shader       |   38 +
 .../particles/resources/defaultFadeInOut.png  |  Bin 0 -> 286 bytes
 .../resources/deformablefragment.shader       |    8 +
 .../resources/deformablevertex.shader         |   57 +
 .../particles/resources/identitytable.png     |  Bin 0 -> 90 bytes
 .../particles/resources/spritefragment.shader |   10 +
 .../resources/spriteimagefragment.shader      |    9 +
 .../resources/spriteimagevertex.shader        |   52 +
 .../particles/resources/spritevertex.shader   |   77 +
 .../particles/resources/trailsfragment.shader |    8 +
 .../particles/resources/trailsvertex.shader   |   37 +
 src/imports/particles/speedlimitaffector.cpp  |   77 +
 src/imports/particles/speedlimitaffector.h    |   89 +
 src/imports/particles/spriteengine.cpp        |  333 ++
 src/imports/particles/spriteengine.h          |  155 +
 src/imports/particles/spritegoalaffector.cpp  |  100 +
 src/imports/particles/spritegoalaffector.h    |  104 +
 src/imports/particles/spriteimage.cpp         |  354 ++
 src/imports/particles/spriteimage.h           |  114 +
 src/imports/particles/spriteparticle.cpp      |  450 +++
 src/imports/particles/spriteparticle.h        |  100 +
 src/imports/particles/spriteparticles.qrc     |   16 +
 src/imports/particles/spritestate.cpp         |   53 +
 src/imports/particles/spritestate.h           |  193 +
 src/imports/particles/swarmaffector.cpp       |  114 +
 src/imports/particles/swarmaffector.h         |  116 +
 src/imports/particles/toggleaffector.cpp      |   59 +
 src/imports/particles/toggleaffector.h        |  102 +
 src/imports/particles/trailsemitter.cpp       |  194 +
 src/imports/particles/trailsemitter.h         |  105 +
 src/imports/particles/turbulenceaffector.cpp  |  159 +
 src/imports/particles/turbulenceaffector.h    |  125 +
 src/imports/particles/varyingvector.cpp       |   56 +
 src/imports/particles/varyingvector.h         |   72 +
 src/imports/particles/wanderaffector.cpp      |  110 +
 src/imports/particles/wanderaffector.h        |  136 +
 src/imports/particles/zoneaffector.cpp        |   68 +
 src/imports/particles/zoneaffector.h          |  159 +
 .../qmldbg_tcp/qtcpserverconnection.cpp       |   14 +-
 .../qmldbg_tcp/qtcpserverconnection.h         |    1 +
 tests/auto/declarative/declarative.pro        |   24 +-
 .../declarative/examples/tst_examples.cpp     |   42 +-
 tests/auto/declarative/geometry/geometry.pro  |   10 +
 .../declarative/geometry/tst_geometry.cpp     |  181 +
 tests/auto/declarative/node/nodes.pro         |   10 +
 tests/auto/declarative/node/tst_nodestest.cpp |  354 ++
 .../tst_qdeclarativedebug.cpp                 |   30 +-
 .../qdeclarativedom/data/MyItem.qml           |    4 -
 .../qdeclarativedom/data/import/Bar.qml       |    2 -
 .../data/importlib/sublib/Foo.qml             |    2 -
 .../data/importlib/sublib/qmldir              |    2 -
 .../declarative/qdeclarativedom/data/top.qml  |    6 -
 .../qdeclarativedom/tst_qdeclarativedom.cpp   | 1326 -------
 .../data/Scope6Nested.qml                     |    7 +
 .../data/jsimport/SpecialRectangleOne.qml     |    9 +
 .../data/jsimport/SpecialRectangleTwo.qml     |    9 +
 .../data/jsimport/importFive.js               |    3 +
 .../data/jsimport/importFour.js               |    9 +
 .../data/jsimport/importOne.js                |   13 +
 .../data/jsimport/importPragmaLibrary.js      |    9 +
 .../data/jsimport/importThree.js              |    9 +
 .../data/jsimport/importTwo.js                |   10 +
 .../data/jsimport/importWithNoImports.js      |   11 +
 .../data/jsimport/testImport.qml              |   14 +
 .../data/jsimport/testImportPragmaLibrary.qml |   20 +
 .../data/jsimport/testImportScoping.qml       |   11 +
 .../data/jsimport/testModuleImport.js         |    8 +
 .../data/jsimport/testScriptImport.js         |   11 +
 .../data/jsimportfail/failFive.qml            |   11 +
 .../data/jsimportfail/failFour.qml            |    7 +
 .../data/jsimportfail/failOne.qml             |    7 +
 .../data/jsimportfail/failThree.qml           |    8 +
 .../data/jsimportfail/failTwo.qml             |    7 +
 .../data/jsimportfail/importOne.js            |    7 +
 .../data/jsimportfail/importPragmaLibrary.js  |   11 +
 .../data/jsimportfail/importWithImports.js    |   13 +
 .../jsimportfail/testImportPragmaLibrary.qml  |    8 +
 .../data/jsimportfail/testModuleImport.js     |    8 +
 .../data/jsimportfail/testScriptImport.js     |   11 +
 .../qdeclarativeecmascript/data/moduleApi.qml |   18 +
 .../data/moduleApiCaching.qml                 |   12 +
 .../data/moduleApiMajorVersionFail.qml        |   10 +
 .../data/moduleApiMinorVersionFail.qml        |   10 +
 .../data/moduleApiWriting.qml                 |   27 +
 .../qdeclarativeecmascript/data/realToInt.qml |   11 +
 .../ScarceResourceSignalComponent.qml         |    9 +
 .../scarceresources/scarceResourceCopy.qml    |   15 +
 .../scarceResourceCopyFromJs.qml              |   15 +
 .../scarceResourceCopyImport.js               |   24 +
 .../scarceResourceCopyImport.qml              |   18 +
 .../scarceResourceCopyImportFail.js           |   18 +
 .../scarceResourceCopyImportFail.qml          |    8 +
 .../scarceResourceCopyImportNoBinding.js      |   14 +
 .../scarceResourceCopyImportNoBinding.qml     |   12 +
 .../scarceResourceCopyNoBinding.qml           |   14 +
 .../scarceResourceDestroyedCopy.qml           |   14 +
 .../scarceResourceFunction.qml                |   23 +
 .../scarceResourceFunctionFail.qml            |   23 +
 .../scarceresources/scarceResourceSignal.qml  |   29 +
 .../scarceresources/scarceResourceTest.js     |   48 +
 .../scarceresources/scarceResourceTest.qml    |   14 +
 .../scarceResourceTestMultiple.qml            |   16 +
 .../scarceResourceTestPreserve.qml            |   15 +
 .../qdeclarativeecmascript/data/scope.5.qml   |   27 +
 .../qdeclarativeecmascript/data/scope.6.qml   |   10 +
 .../qdeclarativeecmascript/testtypes.cpp      |   45 +
 .../qdeclarativeecmascript/testtypes.h        |   51 +
 .../tst_qdeclarativeecmascript.cpp            |  409 +++
 .../tst_qdeclarativegridview.cpp              |   12 +
 .../tst_qdeclarativeimage.cpp                 |    8 +
 .../qdeclarativeinfo/data/NestedComponent.qml |   23 +
 .../qdeclarativeinfo/tst_qdeclarativeinfo.cpp |   24 +-
 .../data/keynavigationtest_implicit.qml       |   68 +
 .../qdeclarativeitem/tst_qdeclarativeitem.cpp |  127 +
 .../data/wrongType.17.errors.txt              |    1 +
 .../data/wrongType.17.qml                     |    5 +
 .../tst_qdeclarativelanguage.cpp              |    1 +
 .../tst_qdeclarativelistmodel.cpp             |    8 +
 .../tst_qdeclarativelistview.cpp              |   15 +
 .../data/implicit1/qmldir                     |    2 +
 .../data/implicit1/temptest.qml               |   14 +
 .../data/implicit2/Test.qml}                  |    1 +
 .../data/implicit2/qmldir                     |    3 +
 .../data/implicit2/temptest2.qml              |    8 +
 .../tst_qdeclarativemoduleplugin.cpp          |   49 +-
 .../tst_qdeclarativeparticles.cpp             |    8 +
 .../tst_qdeclarativepathview.cpp              |    3 +
 .../tst_qdeclarativepixmapcache.cpp           |    9 +-
 .../tst_qdeclarativepositioners.cpp           |   14 +
 .../tst_qdeclarativesmoothedanimation.cpp     |    4 +
 .../qdeclarativetext/tst_qdeclarativetext.cpp |  110 +
 .../tst_qdeclarativetextinput.cpp             |    8 +
 .../qdeclarativev4/data/doubleBoolJump.qml    |   18 +
 .../qdeclarativev4/data/fetchException.qml    |    6 +
 .../qdeclarativev4/data/logicalOr.2.qml       |    6 +
 .../qdeclarativev4/data/logicalOr.qml         |    6 +
 .../data/nestedObjectAccess.qml               |    5 +
 .../qdeclarativev4/data/nullQObject.qml       |    7 +
 .../data/qrealToIntRounding.qml               |   10 +
 .../subscriptionsInConditionalExpressions.qml |   11 +
 .../qdeclarativev4/data/unaryMinus.qml        |   18 +
 .../qdeclarativev4/data/unnecessaryReeval.qml |    7 +
 .../qdeclarativev4/qdeclarativev4.pro         |   18 +
 .../declarative/qdeclarativev4/testtypes.cpp  |   49 +
 .../declarative/qdeclarativev4/testtypes.h    |   83 +
 .../qdeclarativev4/tst_qdeclarativev4.cpp     |  226 ++
 .../qdeclarativeview/tst_qdeclarativeview.cpp |    2 +
 .../tst_qdeclarativexmlhttprequest.cpp        |    2 +-
 .../tst_qmetaobjectbuilder.cpp                |   22 +-
 .../data/dynamic.0.png                        |  Bin 263 -> 343 bytes
 .../data/dynamic.1.png                        |  Bin 280 -> 349 bytes
 .../data/dynamic.2.png                        |  Bin 270 -> 345 bytes
 .../data/dynamic.3.png                        |  Bin 280 -> 349 bytes
 .../data/dynamic.4.png                        |  Bin 280 -> 353 bytes
 .../data/dynamic.5.png                        |  Bin 283 -> 351 bytes
 .../data/dynamic.6.png                        |  Bin 281 -> 349 bytes
 .../qdeclarativepositioners/data/dynamic.qml  |  784 ++--
 .../qdeclarativepositioners/dynamic.qml       |   13 +-
 .../qsganimatedimage/data/colors.gif          |  Bin 0 -> 505 bytes
 .../qsganimatedimage/data/colors.qml          |    5 +
 .../qsganimatedimage/data/hearts.gif          |  Bin 0 -> 6524 bytes
 .../qsganimatedimage/data/hearts.qml          |    6 +
 .../declarative/qsganimatedimage/data/qmldir  |    1 +
 .../qsganimatedimage/data/qtbug-16520.qml     |   17 +
 .../qsganimatedimage/data/stickman.gif        |  Bin 0 -> 164923 bytes
 .../qsganimatedimage/data/stickman.qml        |    5 +
 .../qsganimatedimage/data/stickmanerror1.qml  |    6 +
 .../qsganimatedimage/data/stickmanpause.qml   |    7 +
 .../qsganimatedimage/data/stickmanscaled.qml  |    7 +
 .../qsganimatedimage/data/stickmanstopped.qml |    6 +
 .../qsganimatedimage/qsganimatedimage.pro     |   16 +
 .../qsganimatedimage/tst_qsganimatedimage.cpp |  387 ++
 .../data/colors-round-remote.sci              |    7 +
 .../qsgborderimage/data/colors-round.sci      |    7 +
 .../qsgborderimage/data/colors.png            |  Bin 0 -> 1655 bytes
 .../qsgborderimage/data/heart200.png          |  Bin 0 -> 7943 bytes
 .../qsgborderimage/data/invalid.sci           |    7 +
 .../qsgborderimage/qsgborderimage.pro         |   17 +
 .../qsgborderimage/tst_qsgborderimage.cpp     |  426 +++
 .../auto/declarative/qsgcanvas/qsgcanvas.pro  |    7 +
 .../declarative/qsgcanvas/tst_qsgcanvas.cpp   |  437 +++
 .../qsgflickable/data/disabledcontent.qml     |    8 +
 .../qsgflickable/data/flickable01.qml         |    4 +
 .../qsgflickable/data/flickable02.qml         |   14 +
 .../qsgflickable/data/flickable03.qml         |   14 +
 .../qsgflickable/data/flickable04.qml         |   22 +
 .../data/flickableqgraphicswidget.qml         |    7 +
 .../qsgflickable/data/nestedPressDelay.qml    |   33 +
 .../declarative/qsgflickable/data/resize.qml  |   27 +
 .../declarative/qsgflickable/data/wheel.qml   |   25 +
 .../declarative/qsgflickable/qsgflickable.pro |   16 +
 .../qsgflickable/tst_qsgflickable.cpp         |  450 +++
 .../declarative/qsgflipable/data/crash.qml    |    9 +
 .../qsgflipable/data/flipable-abort.qml       |   10 +
 .../qsgflipable/data/test-flipable.qml        |    9 +
 .../declarative/qsgflipable/qsgflipable.pro   |   16 +
 .../qsgflipable/tst_qsgflipable.cpp           |  143 +
 .../declarative/qsgfocusscope/data/chain.qml  |   28 +
 .../qsgfocusscope/data/forceActiveFocus.qml   |   26 +
 .../qsgfocusscope/data/forcefocus.qml         |   81 +
 .../qsgfocusscope/data/qtBug13380.qml         |   24 +
 .../qsgfocusscope/data/signalEmission.qml     |   33 +
 .../declarative/qsgfocusscope/data/test.qml   |   77 +
 .../declarative/qsgfocusscope/data/test2.qml  |   39 +
 .../declarative/qsgfocusscope/data/test3.qml  |   52 +
 .../declarative/qsgfocusscope/data/test4.qml  |   76 +
 .../declarative/qsgfocusscope/data/test5.qml  |   84 +
 .../qsgfocusscope/qsgfocusscope.pro           |   13 +
 .../qsgfocusscope/tst_qsgfocusscope.cpp       |  540 +++
 .../qsggridview/data/attachedSignals.qml      |   27 +
 .../qsggridview/data/displaygrid.qml          |   39 +
 .../declarative/qsggridview/data/footer.qml   |   40 +
 .../data/gridview-enforcerange.qml            |   58 +
 .../qsggridview/data/gridview-initCurrent.qml |   52 +
 .../qsggridview/data/gridview-noCurrent.qml   |   52 +
 .../qsggridview/data/gridview1.qml            |   65 +
 .../qsggridview/data/gridview2.qml            |   26 +
 .../qsggridview/data/gridview3.qml            |    6 +
 .../declarative/qsggridview/data/header.qml   |   40 +
 .../qsggridview/data/manual-highlight.qml     |   48 +
 .../qsggridview/data/mirroring.qml            |   43 +
 .../qsggridview/data/propertychangestest.qml  |   69 +
 .../declarative/qsggridview/data/setindex.qml |   29 +
 .../qsggridview.pro}                          |    2 +-
 .../qsggridview/tst_qsggridview.cpp           | 2171 ++++++++++++
 .../declarative/qsgimage/data/aspectratio.qml |    6 +
 tests/auto/declarative/qsgimage/data/big.jpeg |  Bin 0 -> 1700081 bytes
 .../auto/declarative/qsgimage/data/big256.png |  Bin 0 -> 3566 bytes
 .../auto/declarative/qsgimage/data/colors.png |  Bin 0 -> 1655 bytes
 .../declarative/qsgimage/data/colors1.png     |  Bin 0 -> 1655 bytes
 .../auto/declarative/qsgimage/data/green.png  |  Bin 0 -> 314 bytes
 .../declarative/qsgimage/data/heart-win32.png |  Bin 0 -> 12621 bytes
 .../auto/declarative/qsgimage/data/heart.png  |  Bin 0 -> 12577 bytes
 .../auto/declarative/qsgimage/data/heart.svg  |   55 +
 .../qsgimage/data/heart200-win32.png          |  Bin 0 -> 8062 bytes
 .../declarative/qsgimage/data/heart200.png    |  Bin 0 -> 8063 bytes
 .../declarative/qsgimage/data/qtbug_16389.qml |   30 +
 tests/auto/declarative/qsgimage/data/rect.png |  Bin 0 -> 171 bytes
 .../auto/declarative/qsgimage/data/tiling.qml |   16 +
 tests/auto/declarative/qsgimage/qsgimage.pro  |   17 +
 .../declarative/qsgimage/tst_qsgimage.cpp     |  776 ++++
 tests/auto/declarative/qsgitem/qsgitem.pro    |    7 +
 .../auto/declarative/qsgitem/tst_qsgitem.cpp  |  787 +++++
 .../qsgitem2/data/childrenProperty.qml        |   14 +
 .../qsgitem2/data/childrenRect.qml            |   27 +
 .../qsgitem2/data/childrenRectBug.qml         |   23 +
 .../qsgitem2/data/childrenRectBug2.qml        |   53 +
 .../qsgitem2/data/childrenRectBug3.qml        |   15 +
 .../qsgitem2/data/implicitsize.qml            |   19 +
 .../qsgitem2/data/keynavigationtest.qml       |   87 +
 .../data/keynavigationtest_implicit.qml       |   68 +
 .../qsgitem2/data/keyspriority.qml            |    9 +
 .../declarative/qsgitem2/data/keystest.qml    |   24 +
 .../qsgitem2/data/layoutmirroring.qml         |   54 +
 .../qsgitem2/data/mapCoordinates.qml          |   43 +
 .../declarative/qsgitem2/data/mouseFocus.qml  |   20 +
 .../qsgitem2/data/propertychanges.qml         |   10 +
 .../declarative/qsgitem2/data/qtbug_16871.qml |    5 +
 .../qsgitem2/data/resourcesProperty.qml       |   21 +
 .../qsgitem2/data/transformCrash.qml          |   13 +
 tests/auto/declarative/qsgitem2/qsgitem.pro   |   16 +
 .../auto/declarative/qsgitem2/tst_qsgitem.cpp | 1322 +++++++
 .../qsglistview/data/attachedSignals.qml      |   24 +
 .../qsglistview/data/displaylist.qml          |   50 +
 .../declarative/qsglistview/data/footer.qml   |   38 +
 .../declarative/qsglistview/data/header.qml   |   38 +
 .../declarative/qsglistview/data/header1.qml  |   33 +
 .../qsglistview/data/headerfooter.qml         |   26 +
 .../declarative/qsglistview/data/itemlist.qml |   43 +
 .../data/listview-enforcerange.qml            |   55 +
 .../qsglistview/data/listview-initCurrent.qml |   51 +
 .../qsglistview/data/listview-noCurrent.qml   |   50 +
 .../qsglistview/data/listview-sections.qml    |   64 +
 .../data/listview-sections_delegate.qml       |   69 +
 .../qsglistview/data/listviewtest.qml         |  132 +
 .../qsglistview/data/manual-highlight.qml     |   47 +
 .../qsglistview/data/propertychangestest.qml  |   71 +
 .../qsglistview/data/qtbug14821.qml           |   31 +
 .../qsglistview/data/qtbug16037.qml           |   37 +
 .../qsglistview/data/rightToLeft.qml          |   42 +
 .../qsglistview/data/sizelessthan1.qml        |   26 +
 .../qsglistview/data/strictlyenforcerange.qml |   29 +
 .../qsglistview/incrementalmodel.cpp          |   89 +
 .../qsglistview/incrementalmodel.h            |   68 +
 .../declarative/qsglistview/qsglistview.pro   |   16 +
 .../qsglistview/tst_qsglistview.cpp           | 2698 ++++++++++++++
 .../qsgloader/data/AnchoredLoader.qml         |   14 +
 .../declarative/qsgloader/data/BlueRect.qml   |    8 +
 .../qsgloader/data/CreationContextLoader.qml  |   15 +
 .../qsgloader/data/GraphicsWidget250x250.qml  |    5 +
 .../declarative/qsgloader/data/GreenRect.qml  |    7 +
 .../declarative/qsgloader/data/NoResize.qml   |    8 +
 .../qsgloader/data/NoResizeGraphicsWidget.qml |    9 +
 .../qsgloader/data/QTBUG_16928.qml            |   23 +
 .../qsgloader/data/QTBUG_17114.qml            |   18 +
 .../declarative/qsgloader/data/Rect120x60.qml |    6 +
 .../qsgloader/data/SetSourceComponent.qml     |    9 +
 .../data/SizeGraphicsWidgetToLoader.qml       |    7 +
 .../data/SizeLoaderToGraphicsWidget.qml       |    5 +
 .../declarative/qsgloader/data/SizeToItem.qml |    5 +
 .../qsgloader/data/SizeToLoader.qml           |    6 +
 .../declarative/qsgloader/data/VmeError.qml   |    7 +
 .../auto/declarative/qsgloader/data/crash.qml |   14 +
 .../qsgloader/data/creationContext.qml        |    8 +
 .../qsgloader/data/differentorigin.qml        |    3 +
 .../qsgloader/data/implicitSize.qml           |   28 +
 .../declarative/qsgloader/data/nonItem.qml    |    5 +
 tests/auto/declarative/qsgloader/data/qmldir  |    1 +
 .../qsgloader/data/sameorigin-load.qml        |    3 +
 .../declarative/qsgloader/data/sameorigin.qml |    3 +
 .../declarative/qsgloader/data/vmeErrors.qml  |    6 +
 .../auto/declarative/qsgloader/qsgloader.pro  |   19 +
 .../declarative/qsgloader/tst_qsgloader.cpp   |  559 +++
 .../qsgmousearea/data/clickThrough.qml        |   23 +
 .../qsgmousearea/data/clickThrough2.qml       |   32 +
 .../qsgmousearea/data/clickandhold.qml        |   13 +
 .../qsgmousearea/data/clicktwice.qml          |   16 +
 .../qsgmousearea/data/doubleclick.qml         |   16 +
 .../qsgmousearea/data/dragging.qml            |   28 +
 .../qsgmousearea/data/dragproperties.qml      |   28 +
 .../qsgmousearea/data/dragreset.qml           |   28 +
 .../qsgmousearea/data/hoverPosition.qml       |   17 +
 .../qsgmousearea/data/pressedOrdering.qml     |   28 +
 .../qsgmousearea/data/preventstealing.qml     |   24 +
 .../qsgmousearea/data/rejectEvent.qml         |   28 +
 .../data/updateMousePosOnClick.qml            |   20 +
 .../data/updateMousePosOnResize.qml           |   38 +
 .../declarative/qsgmousearea/qsgmousearea.pro |   17 +
 .../qsgmousearea/tst_qsgmousearea.cpp         |  705 ++++
 .../qsgpathview/data/closedPath.qml           |   24 +
 .../qsgpathview/data/datamodel.qml            |   37 +
 .../qsgpathview/data/displaypath.qml          |   59 +
 .../declarative/qsgpathview/data/dragpath.qml |   19 +
 .../qsgpathview/data/emptymodel.qml           |    5 +
 .../declarative/qsgpathview/data/openPath.qml |   10 +
 .../qsgpathview/data/pathUpdate.qml           |   18 +
 .../data/pathUpdateOnStartChanged.qml         |   38 +
 .../declarative/qsgpathview/data/pathtest.qml |   14 +
 .../qsgpathview/data/pathview0.qml            |   83 +
 .../qsgpathview/data/pathview1.qml            |    4 +
 .../qsgpathview/data/pathview2.qml            |   57 +
 .../qsgpathview/data/pathview3.qml            |   59 +
 .../qsgpathview/data/pathview_package.qml     |   88 +
 .../qsgpathview/data/propertychanges.qml      |  116 +
 .../qsgpathview/data/treemodel.qml            |   19 +
 .../qsgpathview/data/undefinedpath.qml        |   17 +
 .../auto/declarative/qsgpathview/data/vdm.qml |   28 +
 .../declarative/qsgpathview/qsgpathview.pro   |   16 +
 .../qsgpathview/tst_qsgpathview.cpp           | 1058 ++++++
 .../qsgpincharea/data/pinchproperties.qml     |   46 +
 .../declarative/qsgpincharea/qsgpincharea.pro |   16 +
 .../qsgpincharea/tst_qsgpincharea.cpp         |  311 ++
 .../data/flow-testimplicitsize.qml            |   19 +
 .../data/flowtest-toptobottom.qml             |   44 +
 .../qsgpositioners/data/flowtest.qml          |   43 +
 .../qsgpositioners/data/grid-animated.qml     |   64 +
 .../qsgpositioners/data/grid-spacing.qml      |   41 +
 .../qsgpositioners/data/grid-toptobottom.qml  |   41 +
 .../qsgpositioners/data/gridtest.qml          |   42 +
 .../qsgpositioners/data/gridzerocolumns.qml   |   40 +
 .../data/horizontal-animated.qml              |   44 +
 .../data/horizontal-spacing.qml               |   31 +
 .../qsgpositioners/data/horizontal.qml        |   29 +
 .../data/propertychangestest.qml              |   39 +
 .../qsgpositioners/data/repeatertest.qml      |   38 +
 .../qsgpositioners/data/vertical-animated.qml |   41 +
 .../qsgpositioners/data/vertical-spacing.qml  |   28 +
 .../qsgpositioners/data/vertical.qml          |   27 +
 .../qsgpositioners/qsgpositioners.pro         |   15 +
 .../qsgpositioners/tst_qsgpositioners.cpp     | 1268 +++++++
 .../declarative/qsgrepeater/data/intmodel.qml |   29 +
 .../declarative/qsgrepeater/data/itemlist.qml |   68 +
 .../qsgrepeater/data/modelChanged.qml         |   26 +
 .../declarative/qsgrepeater/data/objlist.qml  |   21 +
 .../qsgrepeater/data/properties.qml           |   11 +
 .../qsgrepeater/data/repeater1.qml            |   28 +
 .../qsgrepeater/data/repeater2.qml            |   36 +
 .../declarative/qsgrepeater/qsgrepeater.pro   |   15 +
 .../qsgrepeater/tst_qsgrepeater.cpp           |  697 ++++
 .../declarative/qsgtext/data/alignments.qml   |   41 +
 .../qsgtext/data/alignments_cb.png            |  Bin 0 -> 496 bytes
 .../qsgtext/data/alignments_cc.png            |  Bin 0 -> 556 bytes
 .../qsgtext/data/alignments_ct.png            |  Bin 0 -> 533 bytes
 .../qsgtext/data/alignments_lb.png            |  Bin 0 -> 496 bytes
 .../qsgtext/data/alignments_lc.png            |  Bin 0 -> 535 bytes
 .../qsgtext/data/alignments_lt.png            |  Bin 0 -> 514 bytes
 .../qsgtext/data/alignments_rb.png            |  Bin 0 -> 505 bytes
 .../qsgtext/data/alignments_rc.png            |  Bin 0 -> 559 bytes
 .../qsgtext/data/alignments_rt.png            |  Bin 0 -> 539 bytes
 .../qsgtext/data/embeddedImagesLocal.qml      |    5 +
 .../qsgtext/data/embeddedImagesLocalError.qml |    5 +
 .../qsgtext/data/embeddedImagesRemote.qml     |    5 +
 .../data/embeddedImagesRemoteError.qml        |    5 +
 .../data/horizontalAlignment_RightToLeft.qml  |   23 +
 .../declarative/qsgtext/data/http/exists.png  |  Bin 0 -> 2738 bytes
 .../declarative/qsgtext/data/lineCount.qml    |   15 +
 .../declarative/qsgtext/data/lineHeight.qml   |   15 +
 .../declarative/qsgtext/data/qtbug_14734.qml  |   10 +
 .../auto/declarative/qsgtext/data/rotated.qml |   18 +
 tests/auto/declarative/qsgtext/qsgtext.pro    |   21 +
 .../auto/declarative/qsgtext/tst_qsgtext.cpp  | 1432 ++++++++
 .../qsgtextedit/data/CursorRect.qml           |    8 +
 .../qsgtextedit/data/alignments.qml           |   41 +
 .../qsgtextedit/data/alignments_cb.png        |  Bin 0 -> 496 bytes
 .../qsgtextedit/data/alignments_cc.png        |  Bin 0 -> 556 bytes
 .../qsgtextedit/data/alignments_ct.png        |  Bin 0 -> 533 bytes
 .../qsgtextedit/data/alignments_lb.png        |  Bin 0 -> 496 bytes
 .../qsgtextedit/data/alignments_lc.png        |  Bin 0 -> 535 bytes
 .../qsgtextedit/data/alignments_lt.png        |  Bin 0 -> 514 bytes
 .../qsgtextedit/data/alignments_rb.png        |  Bin 0 -> 505 bytes
 .../qsgtextedit/data/alignments_rc.png        |  Bin 0 -> 559 bytes
 .../qsgtextedit/data/alignments_rt.png        |  Bin 0 -> 539 bytes
 .../qsgtextedit/data/cursorTest.qml           |    8 +
 .../qsgtextedit/data/cursorVisible.qml        |    6 +
 .../qsgtextedit/data/geometrySignals.qml      |   12 +
 .../data/horizontalAlignment_RightToLeft.qml  |   23 +
 .../qsgtextedit/data/http/ErrItem.qml         |    7 +
 .../qsgtextedit/data/http/NormItem.qml        |    6 +
 .../qsgtextedit/data/http/cursorHttpTest.qml  |   22 +
 .../data/http/cursorHttpTestFail1.qml         |   18 +
 .../data/http/cursorHttpTestFail2.qml         |   18 +
 .../data/http/cursorHttpTestPass.qml          |   18 +
 .../declarative/qsgtextedit/data/http/qmldir  |    4 +
 .../qsgtextedit/data/httpfail/FailItem.qml    |    5 +
 .../qsgtextedit/data/httpslow/WaitItem.qml    |    5 +
 .../qsgtextedit/data/inputContext.qml         |    7 +
 .../qsgtextedit/data/inputMethodEvent.qml     |    5 +
 .../qsgtextedit/data/inputmethodhints.qml     |    6 +
 .../data/mouseselection_default.qml           |    7 +
 .../qsgtextedit/data/mouseselection_false.qml |    7 +
 .../data/mouseselection_false_words.qml       |    7 +
 .../qsgtextedit/data/mouseselection_true.qml  |    7 +
 .../data/mouseselection_true_words.qml        |    7 +
 .../data/mouseselectionmode_characters.qml    |    8 +
 .../data/mouseselectionmode_default.qml       |    7 +
 .../data/mouseselectionmode_words.qml         |    8 +
 .../qsgtextedit/data/navigation.qml           |   24 +
 .../qsgtextedit/data/openInputPanel.qml       |    6 +
 .../qsgtextedit/data/positionAt.qml           |    9 +
 .../declarative/qsgtextedit/data/readOnly.qml |   12 +
 .../declarative/qsgtextedit/qsgtextedit.pro   |   14 +
 .../qsgtextedit/tst_qsgtextedit.cpp           | 2388 +++++++++++++
 .../qsgtextinput/data/cursorTest.qml          |    8 +
 .../qsgtextinput/data/cursorVisible.qml       |    6 +
 .../qsgtextinput/data/echoMode.qml            |   11 +
 .../qsgtextinput/data/geometrySignals.qml     |   12 +
 .../qsgtextinput/data/halign_center.png       |  Bin 0 -> 293 bytes
 .../qsgtextinput/data/halign_left.png         |  Bin 0 -> 291 bytes
 .../qsgtextinput/data/halign_right.png        |  Bin 0 -> 292 bytes
 .../qsgtextinput/data/horizontalAlignment.qml |   22 +
 .../data/horizontalAlignment_RightToLeft.qml  |   23 +
 .../qsgtextinput/data/inputContext.qml        |    8 +
 .../qsgtextinput/data/inputMethodEvent.qml    |    5 +
 .../qsgtextinput/data/inputmethods.qml        |    7 +
 .../declarative/qsgtextinput/data/masks.qml   |    7 +
 .../qsgtextinput/data/maxLength.qml           |    7 +
 .../qsgtextinput/data/mouseselection_true.qml |    7 +
 .../data/mouseselectionmode_characters.qml    |    8 +
 .../data/mouseselectionmode_default.qml       |    7 +
 .../data/mouseselectionmode_words.qml         |    8 +
 .../qsgtextinput/data/navigation.qml          |   24 +
 .../qsgtextinput/data/openInputPanel.qml      |    6 +
 .../qsgtextinput/data/positionAt.qml          |    8 +
 .../qsgtextinput/data/preeditAutoScroll.qml   |    7 +
 .../qsgtextinput/data/readOnly.qml            |   12 +
 .../qsgtextinput/data/validators.qml          |   22 +
 .../declarative/qsgtextinput/qsgtextinput.pro |   14 +
 .../qsgtextinput/tst_qsgtextinput.cpp         | 2471 +++++++++++++
 .../qsgvisualdatamodel/data/datalist.qml      |   18 +
 .../data/modelproperties.qml                  |   19 +
 .../data/modelproperties2.qml                 |   19 +
 .../qsgvisualdatamodel/data/objectlist.qml    |   19 +
 .../qsgvisualdatamodel/data/singlerole1.qml   |   10 +
 .../qsgvisualdatamodel/data/singlerole2.qml   |   10 +
 .../data/visualdatamodel.qml                  |   11 +
 .../qsgvisualdatamodel/qsgvisualdatamodel.pro |   16 +
 .../tst_qsgvisualdatamodel.cpp                |  531 +++
 tests/benchmarks/declarative/declarative.pro  |    1 +
 .../data/dynamicTargets/DynamicFour.qml       |   78 +
 .../data/dynamicTargets/DynamicOne.qml        |   56 +
 .../data/dynamicTargets/DynamicThree.qml      |   61 +
 .../data/dynamicTargets/DynamicTwo.qml        |   68 +
 .../holistic/data/jsImports/Mlbsi.qml         |   49 +
 .../holistic/data/jsImports/Mldsi.qml         |   49 +
 .../holistic/data/jsImports/Mlsi.qml          |   49 +
 .../holistic/data/jsImports/ModuleBm.qml      |   49 +
 .../holistic/data/jsImports/Msbsi.qml         |   49 +
 .../holistic/data/jsImports/Msdsi.qml         |   49 +
 .../holistic/data/jsImports/Mssi.qml          |   49 +
 .../holistic/data/jsImports/PragmaBm.qml      |   55 +
 .../data/jsImports/PragmaModuleBm.qml         |   51 +
 .../holistic/data/jsImports/Slsi.qml          |   49 +
 .../holistic/data/jsImports/Sssi.qml          |   49 +
 .../holistic/data/jsImports/mlbsi.js          |  133 +
 .../holistic/data/jsImports/mlbsi1.js         |  108 +
 .../holistic/data/jsImports/mlbsi10.js        |  108 +
 .../holistic/data/jsImports/mlbsi11.js        |  108 +
 .../holistic/data/jsImports/mlbsi12.js        |  108 +
 .../holistic/data/jsImports/mlbsi13.js        |  108 +
 .../holistic/data/jsImports/mlbsi14.js        |  108 +
 .../holistic/data/jsImports/mlbsi15.js        |  108 +
 .../holistic/data/jsImports/mlbsi2.js         |  108 +
 .../holistic/data/jsImports/mlbsi3.js         |  108 +
 .../holistic/data/jsImports/mlbsi4.js         |  108 +
 .../holistic/data/jsImports/mlbsi5.js         |  108 +
 .../holistic/data/jsImports/mlbsi6.js         |  108 +
 .../holistic/data/jsImports/mlbsi7.js         |  108 +
 .../holistic/data/jsImports/mlbsi8.js         |  108 +
 .../holistic/data/jsImports/mlbsi9.js         |  108 +
 .../holistic/data/jsImports/mldsi.js          |  105 +
 .../holistic/data/jsImports/mldsi1.js         |  107 +
 .../holistic/data/jsImports/mldsi10.js        |  107 +
 .../holistic/data/jsImports/mldsi11.js        |  107 +
 .../holistic/data/jsImports/mldsi12.js        |  107 +
 .../holistic/data/jsImports/mldsi13.js        |  107 +
 .../holistic/data/jsImports/mldsi14.js        |  107 +
 .../holistic/data/jsImports/mldsi15.js        |  104 +
 .../holistic/data/jsImports/mldsi2.js         |  107 +
 .../holistic/data/jsImports/mldsi3.js         |  107 +
 .../holistic/data/jsImports/mldsi4.js         |  107 +
 .../holistic/data/jsImports/mldsi5.js         |  107 +
 .../holistic/data/jsImports/mldsi6.js         |  107 +
 .../holistic/data/jsImports/mldsi7.js         |  107 +
 .../holistic/data/jsImports/mldsi8.js         |  107 +
 .../holistic/data/jsImports/mldsi9.js         |  107 +
 .../holistic/data/jsImports/mlsi.js           |  138 +
 .../holistic/data/jsImports/moduleBm.js       |  109 +
 .../holistic/data/jsImports/msbsi.js          |   79 +
 .../holistic/data/jsImports/msbsi1.js         |   53 +
 .../holistic/data/jsImports/msbsi10.js        |   53 +
 .../holistic/data/jsImports/msbsi11.js        |   53 +
 .../holistic/data/jsImports/msbsi12.js        |   53 +
 .../holistic/data/jsImports/msbsi13.js        |   53 +
 .../holistic/data/jsImports/msbsi14.js        |   53 +
 .../holistic/data/jsImports/msbsi15.js        |   53 +
 .../holistic/data/jsImports/msbsi2.js         |   53 +
 .../holistic/data/jsImports/msbsi3.js         |   53 +
 .../holistic/data/jsImports/msbsi4.js         |   53 +
 .../holistic/data/jsImports/msbsi5.js         |   53 +
 .../holistic/data/jsImports/msbsi6.js         |   53 +
 .../holistic/data/jsImports/msbsi7.js         |   53 +
 .../holistic/data/jsImports/msbsi8.js         |   53 +
 .../holistic/data/jsImports/msbsi9.js         |   53 +
 .../holistic/data/jsImports/msdsi.js          |   51 +
 .../holistic/data/jsImports/msdsi1.js         |   52 +
 .../holistic/data/jsImports/msdsi10.js        |   52 +
 .../holistic/data/jsImports/msdsi11.js        |   52 +
 .../holistic/data/jsImports/msdsi12.js        |   52 +
 .../holistic/data/jsImports/msdsi13.js        |   52 +
 .../holistic/data/jsImports/msdsi14.js        |   52 +
 .../holistic/data/jsImports/msdsi15.js        |   49 +
 .../holistic/data/jsImports/msdsi2.js         |   52 +
 .../holistic/data/jsImports/msdsi3.js         |   52 +
 .../holistic/data/jsImports/msdsi4.js         |   52 +
 .../holistic/data/jsImports/msdsi5.js         |   52 +
 .../holistic/data/jsImports/msdsi6.js         |   52 +
 .../holistic/data/jsImports/msdsi7.js         |   52 +
 .../holistic/data/jsImports/msdsi8.js         |   52 +
 .../holistic/data/jsImports/msdsi9.js         |   52 +
 .../holistic/data/jsImports/mssi.js           |   84 +
 .../holistic/data/jsImports/pragmaBmOne.js    |   50 +
 .../holistic/data/jsImports/pragmaBmTwo.js    |   50 +
 .../holistic/data/jsImports/pragmaLib.js      |  119 +
 .../holistic/data/jsImports/pragmaModuleBm.js |   57 +
 .../holistic/data/jsImports/slsi.js           |  108 +
 .../holistic/data/jsImports/sssi.js           |   52 +
 .../holistic/data/jsTargets/JsOne.qml         |   61 +
 .../holistic/data/jsTargets/JsTwo.qml         |  118 +
 .../data/largeTargets/gridview-example.qml    |   91 +
 .../data/largeTargets/layoutdirection.qml     |  151 +
 .../data/largeTargets/mousearea-example.qml   |  112 +
 .../data/resolutionTargets/ResolveOne.qml     |  111 +
 .../holistic/data/scopeSwitching/CppToJs.qml  |   52 +
 .../holistic/data/scopeSwitching/CppToQml.qml |   48 +
 .../data/scopeSwitching/JsToCppEight.qml      |   54 +
 .../data/scopeSwitching/JsToCppEleven.qml     |   57 +
 .../data/scopeSwitching/JsToCppFive.qml       |   54 +
 .../data/scopeSwitching/JsToCppFour.qml       |   55 +
 .../data/scopeSwitching/JsToCppNine.qml       |   56 +
 .../data/scopeSwitching/JsToCppOne.qml        |   55 +
 .../data/scopeSwitching/JsToCppSeven.qml      |   54 +
 .../data/scopeSwitching/JsToCppSix.qml        |   54 +
 .../data/scopeSwitching/JsToCppTen.qml        |   56 +
 .../data/scopeSwitching/JsToCppThree.qml      |   55 +
 .../data/scopeSwitching/JsToCppTwo.qml        |   55 +
 .../data/scopeSwitching/ScarceOne.qml         |   57 +
 .../data/scopeSwitching/ScarceTwo.qml         |   52 +
 .../holistic/data/scopeSwitching/cppToJs.js   |   49 +
 .../holistic/data/smallTargets/SmallFour.qml  |   49 +
 .../holistic/data/smallTargets/SmallOne.qml   |   51 +
 .../holistic/data/smallTargets/SmallThree.qml |   51 +
 .../holistic/data/smallTargets/SmallTwo.qml   |   51 +
 .../declarative/holistic/holistic.pro         |   19 +
 .../declarative/holistic/testtypes.cpp        |   98 +
 .../declarative/holistic/testtypes.h          |  355 ++
 .../declarative/holistic/tst_holistic.cpp     |  612 ++++
 .../declarative/script/data/enums.qml         |   51 +
 .../script/data/namespacedEnums.qml           |   52 +
 .../declarative/script/data/script.js         |    1 +
 .../declarative/script/data/script2.js        |    2 +
 .../declarative/script/data/scriptCall.qml    |   54 +
 .../declarative/script/tst_script.cpp         |  107 +-
 tools/distfieldgen/distfieldgen.pro           |   12 +
 tools/distfieldgen/main.cpp                   |  262 ++
 tools/qmlplugindump/Info.plist                |   16 +
 tools/qmlplugindump/main.cpp                  |  597 ++++
 tools/qmlplugindump/qmlplugindump.pro         |   20 +
 tools/qmlplugindump/qmlstreamwriter.cpp       |  183 +
 tools/qmlplugindump/qmlstreamwriter.h         |   79 +
 tools/qmlscene/main.cpp                       |  574 +++
 tools/qmlscene/qmlscene.pro                   |   20 +
 tools/qmlviewer/main.cpp                      |    7 +-
 tools/qmlviewer/qmlruntime.cpp                |    1 +
 tools/tools.pro                               |    2 +-
 1061 files changed, 125729 insertions(+), 7477 deletions(-)
 create mode 100644 demos/declarative/plasmapatrol/PlasmaPatrol.qmlproject
 create mode 100644 demos/declarative/plasmapatrol/TODO
 create mode 100644 demos/declarative/plasmapatrol/content/BlasterHardpoint.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Button.qml
 create mode 100644 demos/declarative/plasmapatrol/content/CannonHardpoint.qml
 create mode 100644 demos/declarative/plasmapatrol/content/ChoiceBox.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Cruiser.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Frigate.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Hardpoint.qml
 create mode 100644 demos/declarative/plasmapatrol/content/HelpScreens.qml
 create mode 100644 demos/declarative/plasmapatrol/content/LaserHardpoint.qml
 create mode 100644 demos/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml
 create mode 100644 demos/declarative/plasmapatrol/content/SequentialLoader.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Ship.qml
 create mode 100644 demos/declarative/plasmapatrol/content/Sloop.qml
 create mode 100644 demos/declarative/plasmapatrol/content/pics/TitleText.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/blur-circle2.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/blur-circle3.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/finalfrontier.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/meteor.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/meteor_explo.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/nullRock.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/particle.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/star.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/star2.png
 create mode 100644 demos/declarative/plasmapatrol/content/pics/star3.png
 create mode 100644 demos/declarative/plasmapatrol/plasmapatrol.qml
 delete mode 100644 demos/declarative/samegame/SamegameCore/pics/blueStar.png
 delete mode 100644 demos/declarative/samegame/SamegameCore/pics/greenStar.png
 create mode 100644 demos/declarative/samegame/SamegameCore/pics/particle.png
 delete mode 100644 demos/declarative/samegame/SamegameCore/pics/redStar.png
 delete mode 100644 demos/declarative/samegame/SamegameCore/pics/star.png
 create mode 100644 demos/declarative/shadereffects/Slider.qml
 create mode 100644 demos/declarative/shadereffects/face-smile.png
 create mode 100644 demos/declarative/shadereffects/qt-logo.png
 create mode 100644 demos/declarative/shadereffects/shader-demo.qml
 create mode 100644 examples/declarative/inputmethods/inputmethods.qmlproject
 create mode 100644 examples/declarative/inputmethods/spellcheck/Key.qml
 create mode 100644 examples/declarative/inputmethods/spellcheck/Keyboard.qml
 create mode 100644 examples/declarative/inputmethods/spellcheck/WordSuggestions.qml
 create mode 100644 examples/declarative/inputmethods/spellcheck/spellcheck.qml
 create mode 100644 examples/declarative/painteditem/main.cpp
 create mode 100644 examples/declarative/painteditem/myfile.qml
 create mode 100644 examples/declarative/painteditem/painteditem.pro
 create mode 100644 examples/declarative/particles/allsmiles/content/particle.png
 create mode 100644 examples/declarative/particles/allsmiles/content/singlesmile.png
 create mode 100644 examples/declarative/particles/allsmiles/content/sizeInOut.png
 create mode 100644 examples/declarative/particles/allsmiles/content/smileMask.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite2.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite3.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite4.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite5.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite6.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacesprite7.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacespriteX.png
 create mode 100644 examples/declarative/particles/allsmiles/content/squarefacespriteXX.png
 create mode 100644 examples/declarative/particles/allsmiles/smile.qml
 create mode 100644 examples/declarative/particles/allsmiles/smilefactory.qml
 create mode 100644 examples/declarative/particles/allsmiles/spriteparticles.qml
 create mode 100644 examples/declarative/particles/allsmiles/spritestateparticles.qml
 create mode 100644 examples/declarative/particles/allsmiles/spritevariedparticles.qml
 create mode 100644 examples/declarative/particles/asteroid/asteroid.qml
 create mode 100644 examples/declarative/particles/asteroid/blackhole.qml
 create mode 100644 examples/declarative/particles/asteroid/content/_explo.png
 create mode 100644 examples/declarative/particles/asteroid/content/finalfrontier.png
 create mode 100644 examples/declarative/particles/asteroid/content/meteor.png
 create mode 100644 examples/declarative/particles/asteroid/content/meteor_explo.png
 create mode 100644 examples/declarative/particles/asteroid/content/meteors.png
 create mode 100644 examples/declarative/particles/asteroid/content/nullRock.png
 create mode 100644 examples/declarative/particles/asteroid/content/particle4.png
 create mode 100644 examples/declarative/particles/asteroid/content/rocket.png
 create mode 100644 examples/declarative/particles/asteroid/content/rocket2.png
 create mode 100644 examples/declarative/particles/asteroid/content/star.png
 create mode 100644 examples/declarative/particles/modelparticles/bubbles.qml
 create mode 100644 examples/declarative/particles/modelparticles/content/Delegate.qml
 create mode 100644 examples/declarative/particles/modelparticles/content/Delegate2.qml
 create mode 100644 examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml
 create mode 100644 examples/declarative/particles/modelparticles/content/RssModel.qml
 create mode 100644 examples/declarative/particles/modelparticles/content/bubble.png
 create mode 100644 examples/declarative/particles/modelparticles/content/script.js
 create mode 100644 examples/declarative/particles/modelparticles/gridsplosion.qml
 create mode 100644 examples/declarative/particles/modelparticles/package.qml
 create mode 100644 examples/declarative/particles/modelparticles/stream.qml
 create mode 100644 examples/declarative/particles/snow/content/flake-01.png
 create mode 100644 examples/declarative/particles/snow/snow.qml
 create mode 100644 examples/declarative/particles/snow/snow2.qml
 create mode 100644 examples/declarative/particles/snow/snow3.qml
 create mode 100644 examples/declarative/particles/spaceexplorer/content/helpers.js
 create mode 100644 examples/declarative/particles/spaceexplorer/content/particle4.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore_got.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/rocket.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/rocket2.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/rocketEye.png
 create mode 100644 examples/declarative/particles/spaceexplorer/content/star.png
 create mode 100644 examples/declarative/particles/spaceexplorer/spaceexplorer.qml
 create mode 100644 examples/declarative/particles/trails/content/PetsModel.qml
 create mode 100644 examples/declarative/particles/trails/content/candle.png
 create mode 100644 examples/declarative/particles/trails/content/colortable.png
 create mode 100644 examples/declarative/particles/trails/content/particle.png
 create mode 100644 examples/declarative/particles/trails/content/particle2.png
 create mode 100644 examples/declarative/particles/trails/content/particle3.png
 create mode 100644 examples/declarative/particles/trails/content/particleA.png
 create mode 100644 examples/declarative/particles/trails/content/portal_bg.png
 create mode 100644 examples/declarative/particles/trails/content/sparkleSize.png
 create mode 100644 examples/declarative/particles/trails/content/star.png
 create mode 100644 examples/declarative/particles/trails/dynamicemitters.qml
 create mode 100644 examples/declarative/particles/trails/fireballs.qml
 create mode 100644 examples/declarative/particles/trails/layered.qml
 create mode 100644 examples/declarative/particles/trails/list.qml
 create mode 100644 examples/declarative/particles/trails/overburst.qml
 create mode 100644 examples/declarative/particles/trails/portal.qml
 create mode 100644 examples/declarative/particles/trails/rainbow.qml
 create mode 100644 examples/declarative/particles/trails/shimmer.qml
 create mode 100644 examples/declarative/particles/trails/swarm.qml
 create mode 100644 examples/declarative/particles/trails/trails.qml
 create mode 100644 examples/declarative/particles/trails/turbulence.qml
 create mode 100644 examples/declarative/particles/trails/velocityfrommotion.qml
 create mode 100755 src/declarative/items/checksync.pl
 create mode 100644 src/declarative/items/items.pri
 create mode 100644 src/declarative/items/qsganchors.cpp
 create mode 100644 src/declarative/items/qsganchors_p.h
 create mode 100644 src/declarative/items/qsganchors_p_p.h
 create mode 100644 src/declarative/items/qsganimatedimage.cpp
 create mode 100644 src/declarative/items/qsganimatedimage_p.h
 create mode 100644 src/declarative/items/qsganimatedimage_p_p.h
 create mode 100644 src/declarative/items/qsganimation.cpp
 create mode 100644 src/declarative/items/qsganimation_p.h
 create mode 100644 src/declarative/items/qsganimation_p_p.h
 create mode 100644 src/declarative/items/qsgborderimage.cpp
 create mode 100644 src/declarative/items/qsgborderimage_p.h
 create mode 100644 src/declarative/items/qsgborderimage_p_p.h
 create mode 100644 src/declarative/items/qsgcanvas.cpp
 create mode 100644 src/declarative/items/qsgcanvas.h
 create mode 100644 src/declarative/items/qsgcanvas_p.h
 create mode 100644 src/declarative/items/qsgclipnode.cpp
 create mode 100644 src/declarative/items/qsgclipnode_p.h
 create mode 100644 src/declarative/items/qsgevents.cpp
 create mode 100644 src/declarative/items/qsgevents_p_p.h
 create mode 100644 src/declarative/items/qsgflickable.cpp
 create mode 100644 src/declarative/items/qsgflickable_p.h
 create mode 100644 src/declarative/items/qsgflickable_p_p.h
 create mode 100644 src/declarative/items/qsgflipable.cpp
 create mode 100644 src/declarative/items/qsgflipable_p.h
 create mode 100644 src/declarative/items/qsgfocusscope.cpp
 create mode 100644 src/declarative/items/qsgfocusscope_p.h
 create mode 100644 src/declarative/items/qsggridview.cpp
 create mode 100644 src/declarative/items/qsggridview_p.h
 create mode 100644 src/declarative/items/qsgimage.cpp
 create mode 100644 src/declarative/items/qsgimage_p.h
 create mode 100644 src/declarative/items/qsgimage_p_p.h
 create mode 100644 src/declarative/items/qsgimagebase.cpp
 create mode 100644 src/declarative/items/qsgimagebase_p.h
 create mode 100644 src/declarative/items/qsgimagebase_p_p.h
 create mode 100644 src/declarative/items/qsgimplicitsizeitem.cpp
 create mode 100644 src/declarative/items/qsgimplicitsizeitem_p.h
 create mode 100644 src/declarative/items/qsgimplicitsizeitem_p_p.h
 create mode 100644 src/declarative/items/qsgitem.cpp
 create mode 100644 src/declarative/items/qsgitem.h
 create mode 100644 src/declarative/items/qsgitem_p.h
 create mode 100644 src/declarative/items/qsgitemchangelistener_p.h
 create mode 100644 src/declarative/items/qsgitemsmodule.cpp
 create mode 100644 src/declarative/items/qsgitemsmodule_p.h
 create mode 100644 src/declarative/items/qsglistview.cpp
 create mode 100644 src/declarative/items/qsglistview_p.h
 create mode 100644 src/declarative/items/qsgloader.cpp
 create mode 100644 src/declarative/items/qsgloader_p.h
 create mode 100644 src/declarative/items/qsgloader_p_p.h
 create mode 100644 src/declarative/items/qsgmousearea.cpp
 create mode 100644 src/declarative/items/qsgmousearea_p.h
 create mode 100644 src/declarative/items/qsgmousearea_p_p.h
 create mode 100644 src/declarative/items/qsgninepatchnode.cpp
 create mode 100644 src/declarative/items/qsgninepatchnode_p.h
 create mode 100644 src/declarative/items/qsgpainteditem.cpp
 create mode 100644 src/declarative/items/qsgpainteditem.h
 create mode 100644 src/declarative/items/qsgpainteditem_p.h
 create mode 100644 src/declarative/items/qsgpathview.cpp
 create mode 100644 src/declarative/items/qsgpathview_p.h
 create mode 100644 src/declarative/items/qsgpathview_p_p.h
 create mode 100644 src/declarative/items/qsgpincharea.cpp
 create mode 100644 src/declarative/items/qsgpincharea_p.h
 create mode 100644 src/declarative/items/qsgpincharea_p_p.h
 create mode 100644 src/declarative/items/qsgpositioners.cpp
 create mode 100644 src/declarative/items/qsgpositioners_p.h
 create mode 100644 src/declarative/items/qsgpositioners_p_p.h
 create mode 100644 src/declarative/items/qsgrectangle.cpp
 create mode 100644 src/declarative/items/qsgrectangle_p.h
 create mode 100644 src/declarative/items/qsgrectangle_p_p.h
 create mode 100644 src/declarative/items/qsgrepeater.cpp
 create mode 100644 src/declarative/items/qsgrepeater_p.h
 create mode 100644 src/declarative/items/qsgrepeater_p_p.h
 create mode 100644 src/declarative/items/qsgscalegrid.cpp
 create mode 100644 src/declarative/items/qsgscalegrid_p_p.h
 create mode 100644 src/declarative/items/qsgshadereffectitem.cpp
 create mode 100644 src/declarative/items/qsgshadereffectitem_p.h
 create mode 100644 src/declarative/items/qsgshadereffectmesh.cpp
 create mode 100644 src/declarative/items/qsgshadereffectmesh_p.h
 create mode 100644 src/declarative/items/qsgshadereffectnode.cpp
 create mode 100644 src/declarative/items/qsgshadereffectnode_p.h
 create mode 100644 src/declarative/items/qsgshadereffectsource.cpp
 create mode 100644 src/declarative/items/qsgshadereffectsource_p.h
 create mode 100644 src/declarative/items/qsgstateoperations.cpp
 create mode 100644 src/declarative/items/qsgstateoperations_p.h
 create mode 100644 src/declarative/items/qsgtext.cpp
 create mode 100644 src/declarative/items/qsgtext_p.h
 create mode 100644 src/declarative/items/qsgtext_p_p.h
 create mode 100644 src/declarative/items/qsgtextedit.cpp
 create mode 100644 src/declarative/items/qsgtextedit_p.h
 create mode 100644 src/declarative/items/qsgtextedit_p_p.h
 create mode 100644 src/declarative/items/qsgtextinput.cpp
 create mode 100644 src/declarative/items/qsgtextinput_p.h
 create mode 100644 src/declarative/items/qsgtextinput_p_p.h
 create mode 100644 src/declarative/items/qsgtextnode.cpp
 create mode 100644 src/declarative/items/qsgtextnode_p.h
 create mode 100644 src/declarative/items/qsgtranslate.cpp
 create mode 100644 src/declarative/items/qsgtranslate_p.h
 create mode 100644 src/declarative/items/qsgview.cpp
 create mode 100644 src/declarative/items/qsgview.h
 create mode 100644 src/declarative/items/qsgvisualitemmodel.cpp
 create mode 100644 src/declarative/items/qsgvisualitemmodel_p.h
 create mode 100644 src/declarative/items/syncexcludes
 delete mode 100644 src/declarative/qml/qdeclarativecompiledbindings.cpp
 delete mode 100644 src/declarative/qml/qdeclarativedom.cpp
 delete mode 100644 src/declarative/qml/qdeclarativedom_p.h
 delete mode 100644 src/declarative/qml/qdeclarativedom_p_p.h
 create mode 100644 src/declarative/qml/qdeclarativescarceresourcescriptclass.cpp
 create mode 100644 src/declarative/qml/qdeclarativescarceresourcescriptclass_p.h
 create mode 100644 src/declarative/qml/qintrusivelist.cpp
 create mode 100644 src/declarative/qml/qintrusivelist_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4bindings.cpp
 create mode 100644 src/declarative/qml/v4/qdeclarativev4bindings_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4compiler.cpp
 rename src/declarative/qml/{qdeclarativecompiledbindings_p.h => v4/qdeclarativev4compiler_p.h} (73%)
 create mode 100644 src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4instruction.cpp
 create mode 100644 src/declarative/qml/v4/qdeclarativev4instruction_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4ir.cpp
 create mode 100644 src/declarative/qml/v4/qdeclarativev4ir_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
 create mode 100644 src/declarative/qml/v4/qdeclarativev4irbuilder_p.h
 create mode 100644 src/declarative/qml/v4/qdeclarativev4program_p.h
 create mode 100644 src/declarative/qml/v4/v4.pri
 create mode 100644 src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsggeometry.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsggeometry.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgmaterial.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgmaterial.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgmatrix4x4stack_p.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgnode.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgnode.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h
 create mode 100644 src/declarative/scenegraph/coreapi/qsgrenderer.cpp
 create mode 100644 src/declarative/scenegraph/coreapi/qsgrenderer_p.h
 create mode 100644 src/declarative/scenegraph/qsgadaptationlayer.cpp
 create mode 100644 src/declarative/scenegraph/qsgadaptationlayer_p.h
 create mode 100644 src/declarative/scenegraph/qsgcontext.cpp
 create mode 100644 src/declarative/scenegraph/qsgcontext_p.h
 create mode 100644 src/declarative/scenegraph/qsgcontextplugin.cpp
 create mode 100644 src/declarative/scenegraph/qsgcontextplugin_p.h
 create mode 100644 src/declarative/scenegraph/qsgdefaultglyphnode.cpp
 create mode 100644 src/declarative/scenegraph/qsgdefaultglyphnode_p.cpp
 create mode 100644 src/declarative/scenegraph/qsgdefaultglyphnode_p.h
 create mode 100644 src/declarative/scenegraph/qsgdefaultglyphnode_p_p.h
 create mode 100644 src/declarative/scenegraph/qsgdefaultimagenode.cpp
 create mode 100644 src/declarative/scenegraph/qsgdefaultimagenode_p.h
 create mode 100644 src/declarative/scenegraph/qsgdefaultrectanglenode.cpp
 create mode 100644 src/declarative/scenegraph/qsgdefaultrectanglenode_p.h
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphnode.cpp
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphnode_p.cpp
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphnode_p.h
 create mode 100644 src/declarative/scenegraph/qsgdistancefieldglyphnode_p_p.h
 create mode 100644 src/declarative/scenegraph/qsgflashnode.cpp
 create mode 100644 src/declarative/scenegraph/qsgflashnode_p.h
 create mode 100644 src/declarative/scenegraph/scenegraph.pri
 create mode 100644 src/declarative/scenegraph/util/qsgareaallocator.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgareaallocator_p.h
 create mode 100644 src/declarative/scenegraph/util/qsgengine.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgengine.h
 create mode 100644 src/declarative/scenegraph/util/qsgflatcolormaterial.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgflatcolormaterial.h
 create mode 100644 src/declarative/scenegraph/util/qsgpainternode.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgpainternode_p.h
 create mode 100644 src/declarative/scenegraph/util/qsgsimplerectnode.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgsimplerectnode.h
 create mode 100644 src/declarative/scenegraph/util/qsgsimpletexturenode.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgsimpletexturenode.h
 create mode 100644 src/declarative/scenegraph/util/qsgtexture.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgtexture.h
 create mode 100644 src/declarative/scenegraph/util/qsgtexture_p.h
 create mode 100644 src/declarative/scenegraph/util/qsgtexturematerial.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgtexturematerial.h
 create mode 100644 src/declarative/scenegraph/util/qsgtexturematerial_p.h
 create mode 100644 src/declarative/scenegraph/util/qsgtextureprovider.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgtextureprovider_p.h
 create mode 100644 src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp
 create mode 100644 src/declarative/scenegraph/util/qsgvertexcolormaterial_p.h
 create mode 100644 src/imports/etcprovider/etcprovider.pro
 create mode 100644 src/imports/etcprovider/plugin.cpp
 rename src/imports/{particles/particles.cpp => etcprovider/plugin.h} (61%)
 create mode 100644 src/imports/etcprovider/qetcprovider.cpp
 create mode 100644 src/imports/etcprovider/qetcprovider.h
 create mode 100644 src/imports/etcprovider/qmldir
 create mode 100644 src/imports/inputcontext/declarativeinputcontext.cpp
 create mode 100644 src/imports/inputcontext/declarativeinputcontext.h
 create mode 100755 src/imports/inputcontext/inputcontext.pro
 create mode 100644 src/imports/inputcontext/inputcontextfilter.cpp
 create mode 100644 src/imports/inputcontext/inputcontextfilter.h
 create mode 100644 src/imports/inputcontext/inputcontextmodule.cpp
 create mode 100644 src/imports/inputcontext/inputcontextmodule.h
 create mode 100644 src/imports/inputcontext/plugin.cpp
 create mode 100644 src/imports/inputcontext/qmldir
 rename src/imports/particles/{ => V1}/qdeclarativeparticles.cpp (100%)
 rename src/imports/particles/{ => V1}/qdeclarativeparticles_p.h (100%)
 create mode 100644 src/imports/particles/angledvector.cpp
 create mode 100644 src/imports/particles/angledvector.h
 create mode 100644 src/imports/particles/attractoraffector.cpp
 create mode 100644 src/imports/particles/attractoraffector.h
 create mode 100644 src/imports/particles/coloredparticle.cpp
 create mode 100644 src/imports/particles/coloredparticle.h
 create mode 100644 src/imports/particles/deformableparticle.cpp
 create mode 100644 src/imports/particles/deformableparticle.h
 create mode 100644 src/imports/particles/directedvector.cpp
 create mode 100644 src/imports/particles/directedvector.h
 create mode 100644 src/imports/particles/driftaffector.cpp
 create mode 100644 src/imports/particles/driftaffector.h
 create mode 100644 src/imports/particles/ellipseextruder.cpp
 create mode 100644 src/imports/particles/ellipseextruder.h
 create mode 100644 src/imports/particles/eternalaffector.cpp
 create mode 100644 src/imports/particles/eternalaffector.h
 create mode 100644 src/imports/particles/followemitter.cpp
 create mode 100644 src/imports/particles/followemitter.h
 create mode 100644 src/imports/particles/frictionaffector.cpp
 create mode 100644 src/imports/particles/frictionaffector.h
 create mode 100644 src/imports/particles/gravitationalsingularityaffector.cpp
 create mode 100644 src/imports/particles/gravitationalsingularityaffector.h
 create mode 100644 src/imports/particles/gravityaffector.cpp
 create mode 100644 src/imports/particles/gravityaffector.h
 create mode 100644 src/imports/particles/killaffector.cpp
 create mode 100644 src/imports/particles/killaffector.h
 create mode 100644 src/imports/particles/lineextruder.cpp
 create mode 100644 src/imports/particles/lineextruder.h
 create mode 100644 src/imports/particles/main.cpp
 create mode 100644 src/imports/particles/maskextruder.cpp
 create mode 100644 src/imports/particles/maskextruder.h
 create mode 100644 src/imports/particles/meanderaffector.cpp
 create mode 100644 src/imports/particles/meanderaffector.h
 create mode 100644 src/imports/particles/modelparticle.cpp
 create mode 100644 src/imports/particles/modelparticle.h
 create mode 100644 src/imports/particles/particle.cpp
 create mode 100644 src/imports/particles/particle.h
 create mode 100644 src/imports/particles/particleaffector.cpp
 create mode 100644 src/imports/particles/particleaffector.h
 create mode 100644 src/imports/particles/particleemitter.cpp
 create mode 100644 src/imports/particles/particleemitter.h
 create mode 100644 src/imports/particles/particleextruder.cpp
 create mode 100644 src/imports/particles/particleextruder.h
 create mode 100644 src/imports/particles/particlesystem.cpp
 create mode 100644 src/imports/particles/particlesystem.h
 create mode 100644 src/imports/particles/pictureaffector.cpp
 create mode 100644 src/imports/particles/pictureaffector.h
 create mode 100644 src/imports/particles/pluginmain.h
 create mode 100644 src/imports/particles/pointvector.cpp
 create mode 100644 src/imports/particles/pointvector.h
 create mode 100644 src/imports/particles/resetaffector.cpp
 create mode 100644 src/imports/particles/resetaffector.h
 create mode 100644 src/imports/particles/resources/ctfragment.shader
 create mode 100644 src/imports/particles/resources/ctvertex.shader
 create mode 100644 src/imports/particles/resources/defaultFadeInOut.png
 create mode 100644 src/imports/particles/resources/deformablefragment.shader
 create mode 100644 src/imports/particles/resources/deformablevertex.shader
 create mode 100644 src/imports/particles/resources/identitytable.png
 create mode 100644 src/imports/particles/resources/spritefragment.shader
 create mode 100644 src/imports/particles/resources/spriteimagefragment.shader
 create mode 100644 src/imports/particles/resources/spriteimagevertex.shader
 create mode 100644 src/imports/particles/resources/spritevertex.shader
 create mode 100644 src/imports/particles/resources/trailsfragment.shader
 create mode 100644 src/imports/particles/resources/trailsvertex.shader
 create mode 100644 src/imports/particles/speedlimitaffector.cpp
 create mode 100644 src/imports/particles/speedlimitaffector.h
 create mode 100644 src/imports/particles/spriteengine.cpp
 create mode 100644 src/imports/particles/spriteengine.h
 create mode 100644 src/imports/particles/spritegoalaffector.cpp
 create mode 100644 src/imports/particles/spritegoalaffector.h
 create mode 100644 src/imports/particles/spriteimage.cpp
 create mode 100644 src/imports/particles/spriteimage.h
 create mode 100644 src/imports/particles/spriteparticle.cpp
 create mode 100644 src/imports/particles/spriteparticle.h
 create mode 100644 src/imports/particles/spriteparticles.qrc
 create mode 100644 src/imports/particles/spritestate.cpp
 create mode 100644 src/imports/particles/spritestate.h
 create mode 100644 src/imports/particles/swarmaffector.cpp
 create mode 100644 src/imports/particles/swarmaffector.h
 create mode 100644 src/imports/particles/toggleaffector.cpp
 create mode 100644 src/imports/particles/toggleaffector.h
 create mode 100644 src/imports/particles/trailsemitter.cpp
 create mode 100644 src/imports/particles/trailsemitter.h
 create mode 100644 src/imports/particles/turbulenceaffector.cpp
 create mode 100644 src/imports/particles/turbulenceaffector.h
 create mode 100644 src/imports/particles/varyingvector.cpp
 create mode 100644 src/imports/particles/varyingvector.h
 create mode 100644 src/imports/particles/wanderaffector.cpp
 create mode 100644 src/imports/particles/wanderaffector.h
 create mode 100644 src/imports/particles/zoneaffector.cpp
 create mode 100644 src/imports/particles/zoneaffector.h
 create mode 100644 tests/auto/declarative/geometry/geometry.pro
 create mode 100644 tests/auto/declarative/geometry/tst_geometry.cpp
 create mode 100644 tests/auto/declarative/node/nodes.pro
 create mode 100644 tests/auto/declarative/node/tst_nodestest.cpp
 delete mode 100644 tests/auto/declarative/qdeclarativedom/data/MyItem.qml
 delete mode 100644 tests/auto/declarative/qdeclarativedom/data/import/Bar.qml
 delete mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml
 delete mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
 delete mode 100644 tests/auto/declarative/qdeclarativedom/data/top.qml
 delete mode 100644 tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/Scope6Nested.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleOne.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleTwo.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFive.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFour.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importOne.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importPragmaLibrary.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importThree.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importTwo.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importWithNoImports.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImport.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportPragmaLibrary.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportScoping.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testModuleImport.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testScriptImport.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFive.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFour.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failOne.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failThree.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failTwo.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importOne.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importPragmaLibrary.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importWithImports.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testImportPragmaLibrary.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testModuleImport.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testScriptImport.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/moduleApi.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/moduleApiCaching.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMajorVersionFail.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMinorVersionFail.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/moduleApiWriting.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/ScarceResourceSignalComponent.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopy.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyFromJs.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyNoBinding.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceDestroyedCopy.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunction.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunctionFail.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceSignal.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.js
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestMultiple.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestPreserve.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.5.qml
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.6.qml
 create mode 100644 tests/auto/declarative/qdeclarativeinfo/data/NestedComponent.qml
 create mode 100644 tests/auto/declarative/qdeclarativeitem/data/keynavigationtest_implicit.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.qml
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/qmldir
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/temptest.qml
 rename tests/auto/declarative/{qdeclarativedom/data/MyComponent.qml => qdeclarativemoduleplugin/data/implicit2/Test.qml} (60%)
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/qmldir
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/temptest2.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/doubleBoolJump.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/fetchException.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/logicalOr.2.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/logicalOr.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/nestedObjectAccess.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/nullQObject.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/qrealToIntRounding.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/subscriptionsInConditionalExpressions.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/unaryMinus.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/data/unnecessaryReeval.qml
 create mode 100644 tests/auto/declarative/qdeclarativev4/qdeclarativev4.pro
 create mode 100644 tests/auto/declarative/qdeclarativev4/testtypes.cpp
 create mode 100644 tests/auto/declarative/qdeclarativev4/testtypes.h
 create mode 100644 tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/colors.gif
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/colors.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/hearts.gif
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/hearts.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/qmldir
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/qtbug-16520.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickman.gif
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickman.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickmanerror1.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickmanpause.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickmanscaled.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/data/stickmanstopped.qml
 create mode 100644 tests/auto/declarative/qsganimatedimage/qsganimatedimage.pro
 create mode 100644 tests/auto/declarative/qsganimatedimage/tst_qsganimatedimage.cpp
 create mode 100644 tests/auto/declarative/qsgborderimage/data/colors-round-remote.sci
 create mode 100644 tests/auto/declarative/qsgborderimage/data/colors-round.sci
 create mode 100644 tests/auto/declarative/qsgborderimage/data/colors.png
 create mode 100644 tests/auto/declarative/qsgborderimage/data/heart200.png
 create mode 100644 tests/auto/declarative/qsgborderimage/data/invalid.sci
 create mode 100644 tests/auto/declarative/qsgborderimage/qsgborderimage.pro
 create mode 100644 tests/auto/declarative/qsgborderimage/tst_qsgborderimage.cpp
 create mode 100644 tests/auto/declarative/qsgcanvas/qsgcanvas.pro
 create mode 100644 tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
 create mode 100644 tests/auto/declarative/qsgflickable/data/disabledcontent.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/flickable01.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/flickable02.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/flickable03.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/flickable04.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/flickableqgraphicswidget.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/nestedPressDelay.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/resize.qml
 create mode 100644 tests/auto/declarative/qsgflickable/data/wheel.qml
 create mode 100644 tests/auto/declarative/qsgflickable/qsgflickable.pro
 create mode 100644 tests/auto/declarative/qsgflickable/tst_qsgflickable.cpp
 create mode 100644 tests/auto/declarative/qsgflipable/data/crash.qml
 create mode 100644 tests/auto/declarative/qsgflipable/data/flipable-abort.qml
 create mode 100644 tests/auto/declarative/qsgflipable/data/test-flipable.qml
 create mode 100644 tests/auto/declarative/qsgflipable/qsgflipable.pro
 create mode 100644 tests/auto/declarative/qsgflipable/tst_qsgflipable.cpp
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/chain.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/forceActiveFocus.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/forcefocus.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/qtBug13380.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/signalEmission.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/test.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/test2.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/test3.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/test4.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/data/test5.qml
 create mode 100644 tests/auto/declarative/qsgfocusscope/qsgfocusscope.pro
 create mode 100644 tests/auto/declarative/qsgfocusscope/tst_qsgfocusscope.cpp
 create mode 100644 tests/auto/declarative/qsggridview/data/attachedSignals.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/displaygrid.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/footer.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview-enforcerange.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview-initCurrent.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview-noCurrent.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview1.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview2.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/gridview3.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/header.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/manual-highlight.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/mirroring.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/propertychangestest.qml
 create mode 100644 tests/auto/declarative/qsggridview/data/setindex.qml
 rename tests/auto/declarative/{qdeclarativedom/qdeclarativedom.pro => qsggridview/qsggridview.pro} (88%)
 create mode 100644 tests/auto/declarative/qsggridview/tst_qsggridview.cpp
 create mode 100644 tests/auto/declarative/qsgimage/data/aspectratio.qml
 create mode 100644 tests/auto/declarative/qsgimage/data/big.jpeg
 create mode 100644 tests/auto/declarative/qsgimage/data/big256.png
 create mode 100644 tests/auto/declarative/qsgimage/data/colors.png
 create mode 100644 tests/auto/declarative/qsgimage/data/colors1.png
 create mode 100644 tests/auto/declarative/qsgimage/data/green.png
 create mode 100644 tests/auto/declarative/qsgimage/data/heart-win32.png
 create mode 100644 tests/auto/declarative/qsgimage/data/heart.png
 create mode 100644 tests/auto/declarative/qsgimage/data/heart.svg
 create mode 100644 tests/auto/declarative/qsgimage/data/heart200-win32.png
 create mode 100644 tests/auto/declarative/qsgimage/data/heart200.png
 create mode 100644 tests/auto/declarative/qsgimage/data/qtbug_16389.qml
 create mode 100644 tests/auto/declarative/qsgimage/data/rect.png
 create mode 100644 tests/auto/declarative/qsgimage/data/tiling.qml
 create mode 100644 tests/auto/declarative/qsgimage/qsgimage.pro
 create mode 100644 tests/auto/declarative/qsgimage/tst_qsgimage.cpp
 create mode 100644 tests/auto/declarative/qsgitem/qsgitem.pro
 create mode 100644 tests/auto/declarative/qsgitem/tst_qsgitem.cpp
 create mode 100644 tests/auto/declarative/qsgitem2/data/childrenProperty.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/childrenRect.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/childrenRectBug.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/childrenRectBug2.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/childrenRectBug3.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/implicitsize.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/keynavigationtest.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/keynavigationtest_implicit.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/keyspriority.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/keystest.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/layoutmirroring.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/mapCoordinates.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/mouseFocus.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/propertychanges.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/qtbug_16871.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/resourcesProperty.qml
 create mode 100644 tests/auto/declarative/qsgitem2/data/transformCrash.qml
 create mode 100644 tests/auto/declarative/qsgitem2/qsgitem.pro
 create mode 100644 tests/auto/declarative/qsgitem2/tst_qsgitem.cpp
 create mode 100644 tests/auto/declarative/qsglistview/data/attachedSignals.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/displaylist.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/footer.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/header.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/header1.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/headerfooter.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/itemlist.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listview-enforcerange.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listview-initCurrent.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listview-noCurrent.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listview-sections.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listview-sections_delegate.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/listviewtest.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/manual-highlight.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/propertychangestest.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/qtbug14821.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/qtbug16037.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/rightToLeft.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/sizelessthan1.qml
 create mode 100644 tests/auto/declarative/qsglistview/data/strictlyenforcerange.qml
 create mode 100644 tests/auto/declarative/qsglistview/incrementalmodel.cpp
 create mode 100644 tests/auto/declarative/qsglistview/incrementalmodel.h
 create mode 100644 tests/auto/declarative/qsglistview/qsglistview.pro
 create mode 100644 tests/auto/declarative/qsglistview/tst_qsglistview.cpp
 create mode 100644 tests/auto/declarative/qsgloader/data/AnchoredLoader.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/BlueRect.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/CreationContextLoader.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/GraphicsWidget250x250.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/GreenRect.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/NoResize.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/NoResizeGraphicsWidget.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/QTBUG_16928.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/QTBUG_17114.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/Rect120x60.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/SetSourceComponent.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/SizeGraphicsWidgetToLoader.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/SizeLoaderToGraphicsWidget.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/SizeToItem.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/SizeToLoader.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/VmeError.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/crash.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/creationContext.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/differentorigin.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/implicitSize.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/nonItem.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/qmldir
 create mode 100644 tests/auto/declarative/qsgloader/data/sameorigin-load.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/sameorigin.qml
 create mode 100644 tests/auto/declarative/qsgloader/data/vmeErrors.qml
 create mode 100644 tests/auto/declarative/qsgloader/qsgloader.pro
 create mode 100644 tests/auto/declarative/qsgloader/tst_qsgloader.cpp
 create mode 100644 tests/auto/declarative/qsgmousearea/data/clickThrough.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/clickThrough2.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/clickandhold.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/clicktwice.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/doubleclick.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/dragging.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/dragproperties.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/dragreset.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/hoverPosition.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/pressedOrdering.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/preventstealing.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/rejectEvent.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/updateMousePosOnClick.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/data/updateMousePosOnResize.qml
 create mode 100644 tests/auto/declarative/qsgmousearea/qsgmousearea.pro
 create mode 100644 tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp
 create mode 100644 tests/auto/declarative/qsgpathview/data/closedPath.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/datamodel.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/displaypath.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/dragpath.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/emptymodel.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/openPath.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathUpdate.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathUpdateOnStartChanged.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathtest.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathview0.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathview1.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathview2.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathview3.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/pathview_package.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/propertychanges.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/treemodel.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/undefinedpath.qml
 create mode 100644 tests/auto/declarative/qsgpathview/data/vdm.qml
 create mode 100644 tests/auto/declarative/qsgpathview/qsgpathview.pro
 create mode 100644 tests/auto/declarative/qsgpathview/tst_qsgpathview.cpp
 create mode 100644 tests/auto/declarative/qsgpincharea/data/pinchproperties.qml
 create mode 100644 tests/auto/declarative/qsgpincharea/qsgpincharea.pro
 create mode 100644 tests/auto/declarative/qsgpincharea/tst_qsgpincharea.cpp
 create mode 100644 tests/auto/declarative/qsgpositioners/data/flow-testimplicitsize.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/flowtest-toptobottom.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/flowtest.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/grid-animated.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/grid-spacing.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/grid-toptobottom.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/gridtest.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/gridzerocolumns.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/horizontal-animated.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/horizontal-spacing.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/horizontal.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/propertychangestest.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/repeatertest.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/vertical-animated.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/vertical-spacing.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/data/vertical.qml
 create mode 100644 tests/auto/declarative/qsgpositioners/qsgpositioners.pro
 create mode 100644 tests/auto/declarative/qsgpositioners/tst_qsgpositioners.cpp
 create mode 100644 tests/auto/declarative/qsgrepeater/data/intmodel.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/itemlist.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/modelChanged.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/objlist.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/properties.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/repeater1.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/data/repeater2.qml
 create mode 100644 tests/auto/declarative/qsgrepeater/qsgrepeater.pro
 create mode 100644 tests/auto/declarative/qsgrepeater/tst_qsgrepeater.cpp
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_cb.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_cc.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_ct.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_lb.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_lc.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_lt.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_rb.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_rc.png
 create mode 100644 tests/auto/declarative/qsgtext/data/alignments_rt.png
 create mode 100644 tests/auto/declarative/qsgtext/data/embeddedImagesLocal.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/embeddedImagesLocalError.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/embeddedImagesRemote.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/embeddedImagesRemoteError.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/horizontalAlignment_RightToLeft.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/http/exists.png
 create mode 100644 tests/auto/declarative/qsgtext/data/lineCount.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/lineHeight.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/qtbug_14734.qml
 create mode 100644 tests/auto/declarative/qsgtext/data/rotated.qml
 create mode 100644 tests/auto/declarative/qsgtext/qsgtext.pro
 create mode 100644 tests/auto/declarative/qsgtext/tst_qsgtext.cpp
 create mode 100644 tests/auto/declarative/qsgtextedit/data/CursorRect.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_cb.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_cc.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_ct.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_lb.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_lc.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_lt.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_rb.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_rc.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/alignments_rt.png
 create mode 100644 tests/auto/declarative/qsgtextedit/data/cursorTest.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/cursorVisible.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/geometrySignals.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/horizontalAlignment_RightToLeft.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/ErrItem.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/NormItem.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/cursorHttpTest.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail1.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail2.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestPass.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/http/qmldir
 create mode 100644 tests/auto/declarative/qsgtextedit/data/httpfail/FailItem.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/httpslow/WaitItem.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/inputContext.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/inputMethodEvent.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/inputmethodhints.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselection_default.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselection_false.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselection_false_words.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselection_true.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselection_true_words.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselectionmode_characters.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselectionmode_default.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/mouseselectionmode_words.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/navigation.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/openInputPanel.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/positionAt.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/data/readOnly.qml
 create mode 100644 tests/auto/declarative/qsgtextedit/qsgtextedit.pro
 create mode 100644 tests/auto/declarative/qsgtextedit/tst_qsgtextedit.cpp
 create mode 100644 tests/auto/declarative/qsgtextinput/data/cursorTest.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/cursorVisible.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/echoMode.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/geometrySignals.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/halign_center.png
 create mode 100644 tests/auto/declarative/qsgtextinput/data/halign_left.png
 create mode 100644 tests/auto/declarative/qsgtextinput/data/halign_right.png
 create mode 100644 tests/auto/declarative/qsgtextinput/data/horizontalAlignment.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/horizontalAlignment_RightToLeft.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/inputContext.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/inputMethodEvent.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/inputmethods.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/masks.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/maxLength.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/mouseselection_true.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/mouseselectionmode_characters.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/mouseselectionmode_default.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/mouseselectionmode_words.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/navigation.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/openInputPanel.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/positionAt.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/preeditAutoScroll.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/readOnly.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/data/validators.qml
 create mode 100644 tests/auto/declarative/qsgtextinput/qsgtextinput.pro
 create mode 100644 tests/auto/declarative/qsgtextinput/tst_qsgtextinput.cpp
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/datalist.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/modelproperties.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/modelproperties2.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/objectlist.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/singlerole1.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/singlerole2.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/data/visualdatamodel.qml
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/qsgvisualdatamodel.pro
 create mode 100644 tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp
 create mode 100644 tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicFour.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicThree.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicTwo.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Mlbsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Mldsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Mlsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/ModuleBm.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Msbsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Msdsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Mssi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/PragmaBm.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/PragmaModuleBm.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Slsi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/Sssi.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi1.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi10.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi11.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi12.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi13.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi14.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi15.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi2.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi3.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi4.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi5.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi6.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi7.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi8.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlbsi9.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi1.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi10.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi11.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi12.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi13.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi14.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi15.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi2.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi3.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi4.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi5.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi6.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi7.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi8.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mldsi9.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mlsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/moduleBm.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi1.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi10.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi11.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi12.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi13.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi14.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi15.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi2.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi3.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi4.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi5.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi6.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi7.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi8.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msbsi9.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi1.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi10.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi11.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi12.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi13.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi14.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi15.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi2.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi3.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi4.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi5.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi6.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi7.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi8.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/msdsi9.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/mssi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmOne.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmTwo.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/pragmaLib.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/pragmaModuleBm.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/slsi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsImports/sssi.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsTargets/JsOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/jsTargets/JsTwo.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/largeTargets/gridview-example.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/largeTargets/layoutdirection.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/largeTargets/mousearea-example.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/resolutionTargets/ResolveOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToJs.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToQml.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEight.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEleven.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFive.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFour.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppNine.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSeven.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSix.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTen.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppThree.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTwo.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceTwo.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/scopeSwitching/cppToJs.js
 create mode 100644 tests/benchmarks/declarative/holistic/data/smallTargets/SmallFour.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/smallTargets/SmallOne.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/smallTargets/SmallThree.qml
 create mode 100644 tests/benchmarks/declarative/holistic/data/smallTargets/SmallTwo.qml
 create mode 100644 tests/benchmarks/declarative/holistic/holistic.pro
 create mode 100644 tests/benchmarks/declarative/holistic/testtypes.cpp
 create mode 100644 tests/benchmarks/declarative/holistic/testtypes.h
 create mode 100644 tests/benchmarks/declarative/holistic/tst_holistic.cpp
 create mode 100644 tests/benchmarks/declarative/script/data/enums.qml
 create mode 100644 tests/benchmarks/declarative/script/data/namespacedEnums.qml
 create mode 100644 tests/benchmarks/declarative/script/data/script.js
 create mode 100644 tests/benchmarks/declarative/script/data/script2.js
 create mode 100644 tests/benchmarks/declarative/script/data/scriptCall.qml
 create mode 100644 tools/distfieldgen/distfieldgen.pro
 create mode 100644 tools/distfieldgen/main.cpp
 create mode 100644 tools/qmlplugindump/Info.plist
 create mode 100644 tools/qmlplugindump/main.cpp
 create mode 100644 tools/qmlplugindump/qmlplugindump.pro
 create mode 100644 tools/qmlplugindump/qmlstreamwriter.cpp
 create mode 100644 tools/qmlplugindump/qmlstreamwriter.h
 create mode 100644 tools/qmlscene/main.cpp
 create mode 100644 tools/qmlscene/qmlscene.pro

diff --git a/demos/declarative/plasmapatrol/PlasmaPatrol.qmlproject b/demos/declarative/plasmapatrol/PlasmaPatrol.qmlproject
new file mode 100644
index 0000000000..53f5ecb8d2
--- /dev/null
+++ b/demos/declarative/plasmapatrol/PlasmaPatrol.qmlproject
@@ -0,0 +1,18 @@
+/* File generated by QtCreator */
+
+import QmlProject 1.0
+
+Project {
+    /* Include .qml, .js, and image files from current directory and subdirectories */
+    QmlFiles {
+        directory: "."
+    }
+    JavaScriptFiles {
+        directory: "."
+    }
+    ImageFiles {
+        directory: "."
+    }
+    /* List of plugin directories passed to QML runtime */
+    // importPaths: [ "../exampleplugin" ]
+}
diff --git a/demos/declarative/plasmapatrol/TODO b/demos/declarative/plasmapatrol/TODO
new file mode 100644
index 0000000000..ef9d21a73d
--- /dev/null
+++ b/demos/declarative/plasmapatrol/TODO
@@ -0,0 +1,10 @@
+Realistic Tasks:
+Particle explosions on ship death.
+Better help text (both content and styled a little nicer).
+Hardpoint help showing them firing across the screen.
+Endless Demo Mode
+
+Nice-but-i-doubt-it-will-get-done Tasks:
+Particle Text for the winner.
+Particle-based buttons.
+Single player mode that is challenges (known opponents) to master the game with and earn achievements (in addition to 'skirmish').
diff --git a/demos/declarative/plasmapatrol/content/BlasterHardpoint.qml b/demos/declarative/plasmapatrol/content/BlasterHardpoint.qml
new file mode 100644
index 0000000000..8d36cdfb13
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/BlasterHardpoint.qml
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property variant target: {"y": -90, "x":12}
+    property Item targetObj: container
+    property Item hardpoint: container
+    property ParticleSystem system
+    property int blasts: 16
+    property int bonusBlasts: 12
+    property bool show: true
+
+    width: 24
+    height: 24
+    TrailEmitter{
+        id: visualization
+        particle: "blaster"
+        system: container.system
+        emitting: show
+        anchors.fill: parent
+        shape: Ellipse{}
+        speed: DirectedVector{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true}
+        particleDuration: 1000
+        particlesPerSecond: 64 
+
+        particleSize: 24
+        particleSizeVariation: 24
+        particleEndSize: 0
+    }
+
+    property int blastsLeft: 0
+    function fireAt(targetArg, container){
+        target = container.mapFromItem(targetArg, targetArg.width/2, targetArg.height/2);
+        targetObj = targetArg;
+        hardpoint = container;
+        blastsLeft = blasts;
+        rofTimer.repeat = true;
+        rofTimer.start();
+    }
+    Timer{
+        id: rofTimer
+        interval: 30;//Has to be greater than 1 frame or they stack up
+        running: false
+        repeat: false
+        onTriggered:{
+            if(targetObj.hp <= 0)
+                return;
+            //TODO: calculate hit and damage at target, which must be a Ship
+            var hit;
+            if(blastsLeft >= bonusBlasts)
+                hit = Math.random() > targetObj.dodge;
+            else
+                hit = false; //purely aesthetic shots, because the damage isn't that fine grained
+            if(hit == true){
+                switch(targetObj.shipType){
+                case 1: hardpoint.damageDealt += 4; break;
+                case 2: hardpoint.damageDealt += 5; break;
+                case 3: hardpoint.damageDealt += 1; break;
+                default: hardpoint.damageDealt += 100;
+                }
+            }
+            blastVector.targetX = target.x;
+            blastVector.targetY = target.y;
+            if(!hit){//TODO: Actual targetVariation
+                blastVector.targetX += (128 * Math.random() - 64);
+                blastVector.targetY += (128 * Math.random() - 64);
+            }
+            emitter.burst(1);
+            blastsLeft--;
+            if(!blastsLeft)
+                rofTimer.repeat = false;
+        }
+    }
+    TrailEmitter{
+        id: emitter
+        particle: "blaster"
+        emitting: false
+        system: container.system
+        anchors.centerIn: parent
+
+        particleDuration: 1000
+        particlesPerSecond: 16
+        maxParticles: blasts
+        particleSize: 24
+        particleEndSize:16
+        particleSizeVariation: 8
+        speed: DirectedVector{
+            id: blastVector
+            targetX: target.x; targetY: target.y; magnitude: 1.1; proportionalMagnitude: true
+        }
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Button.qml b/demos/declarative/plasmapatrol/content/Button.qml
new file mode 100644
index 0000000000..0d810e3b75
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Button.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+
+//TODO: Add particles to this component too
+Rectangle{
+    id: container
+    property alias text: txt.text
+    signal clicked
+    //color: "lightsteelblue"
+    gradient: Gradient{
+        GradientStop{ position: 0.0; color: "lightsteelblue" }
+        GradientStop{ position: 1.0; color: "steelblue" }
+    }
+    height: 64
+    radius: 16
+    width: 128
+    Text{
+        id: txt
+        anchors.centerIn: parent
+        font.pixelSize: 24
+        color: "white"
+    }
+    MouseArea{
+        anchors.fill: parent
+        onClicked: container.clicked()
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/CannonHardpoint.qml b/demos/declarative/plasmapatrol/content/CannonHardpoint.qml
new file mode 100644
index 0000000000..d9a307cc64
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/CannonHardpoint.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property variant target: {"y": -90, "x":12}
+    property ParticleSystem system
+    property bool show: true
+
+    width: 24
+    height: 24
+    TrailEmitter{
+        id: visualization
+        particle: "cannon"
+        emitting: container.show
+        system: container.system
+        anchors.centerIn: parent
+        particleDuration: 2000
+        particlesPerSecond: 1
+
+        particleSize: 4
+        particleEndSize: 0
+    }
+
+    function fireAt(targetArg, hardpoint){
+        target = container.mapFromItem(targetArg, targetArg.width/2, targetArg.height/2);
+        if(container.hp <= 0 || targetArg.hp <= 0)
+            return;
+        //TODO: calculate hit and damage at target, which must be a Ship
+        var hit = Math.random() > targetArg.dodge
+        if(hit){
+            switch(targetArg.shipType){
+            case 1: hardpoint.damageDealt += 8; break;
+            case 2: hardpoint.damageDealt += 10; break;
+            case 3: hardpoint.damageDealt += 16; break;
+            default: hardpoint.damageDealt += 1000;
+            }
+        }
+        emitter.burst(1);
+    }
+    TrailEmitter{
+        id: emitter
+        particle: "cannon"
+        emitting: false
+        system: container.system
+        anchors.centerIn: parent
+
+        particleDuration: 1000
+        particlesPerSecond: 1
+        particleSize: 8
+        particleEndSize: 4
+        speed: DirectedVector{
+            id: blastVector
+            targetX: target.x; targetY: target.y; magnitude: 1.1; proportionalMagnitude: true
+        }
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/ChoiceBox.qml b/demos/declarative/plasmapatrol/content/ChoiceBox.qml
new file mode 100644
index 0000000000..6bdc4288ee
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/ChoiceBox.qml
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item{
+    id: container
+    width: 360
+    height: 160
+    property ParticleSystem system
+    Ship{
+        id: nully
+        system: system
+    }
+    property Item target: nully
+    /*
+    Component.onCompleted:{
+        container.target.shipType = 1
+        container.target.gunType = 1
+    }
+    */
+    Row{
+        anchors.horizontalCenter: parent.horizontalCenter
+        height: parent.height
+        spacing: 8
+        Button{
+            width: 80
+            height: 80
+            anchors.verticalCenter: parent.verticalCenter
+            text: "Cycle\nShip"
+            onClicked: {
+                var nextVal = container.target.shipType;
+                if(nextVal == 3)
+                    nextVal = 1;
+                else 
+                    nextVal++;
+                container.target.shipType = nextVal;
+            }
+        }
+        Item{
+            width: 128
+            height: 128
+            anchors.verticalCenter: parent.verticalCenter
+            Ship{
+                hp: 20
+                anchors.centerIn: parent
+                shipType: container.target.shipType
+                gunType: container.target.gunType
+                system: container.system
+            }
+        }
+        Button{
+            width: 80
+            height: 80
+            anchors.verticalCenter: parent.verticalCenter
+            text: "Cycle\nGun"
+            onClicked: {
+                var nextVal = container.target.gunType;
+                if(nextVal == 3)
+                    nextVal = 1;
+                else 
+                    nextVal++;
+                container.target.gunType = nextVal;
+            }
+        }
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Cruiser.qml b/demos/declarative/plasmapatrol/content/Cruiser.qml
new file mode 100644
index 0000000000..8b8073328e
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Cruiser.qml
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property int maxHP: 100
+    property int hp: maxHP
+    property real initialDodge: 0.01
+    property real dodge: initialDodge
+    onHpChanged: if(hp <= 0) target = container;
+    property ParticleSystem system//TODO: Ship abstraction
+    property Item target: container
+    property string shipParticle: "default"//Per team colors?
+    property int gunType: 0
+    width: 128
+    height: 128
+    TrailEmitter{
+        //TODO: Cooler would be an 'orbiting' affector
+        //TODO: On the subject, opacity and size should be grouped type 'overLife' if we can cram that in the particles
+        system: container.system
+        particle: container.shipParticle
+        anchors.centerIn: parent
+        width: 64
+        height: 64
+        shape: Ellipse{}
+
+        particlesPerSecond: hp > 0 ?  hp * 1 + 20 : 0 
+        particleDuration: 2400
+        maxParticles: (maxHP * 1 + 20)*2.4
+
+        particleSize: 48
+        particleSizeVariation: 16
+        particleEndSize: 16
+
+        speed: AngleVector{angleVariation:360; magnitudeVariation: 32}
+    }
+    TrailEmitter{
+        system: container.system
+        particle: "cruiserArmor"
+        anchors.fill: parent
+        shape: Ellipse{ fill: false }
+        emitting: hp>0
+        
+        particlesPerSecond: 16
+        particleDuration: 2000
+
+        particleSize: 48
+        particleSizeVariation: 24
+
+        SpriteGoal{
+            id: destructor
+            system: container.system
+            active: container.hp <=0
+            anchors.fill: parent
+            particles: ["cruiserArmor"]
+            goalState: "death"
+//            jump: true
+            onceOff: true
+        }
+    }
+
+    Timer{
+        id: fireControl
+        property int next: Math.floor(Math.random() * 3) + 1
+        interval: 800
+        running: root.readySetGo
+        repeat: true
+        onTriggered:{
+            if(next == 1){
+                gun1.fireAt(container.target);
+                next = Math.floor(Math.random() * 3) + 1;
+            }else if(next == 2){
+                gun2.fireAt(container.target);
+                next = Math.floor(Math.random() * 3) + 1;
+            }else if(next == 3){
+                gun3.fireAt(container.target);
+                next = Math.floor(Math.random() * 3) + 1;
+            }
+        }
+    }
+
+    Hardpoint{//TODO: Hardpoint abstraction
+        x: 112 - 12 - 8*2
+        y: 128 - 12 - 12*2
+        id: gun1
+        system: container.system
+        show: hp > 0
+        hardpointType: gunType
+    }
+    Hardpoint{
+        x: 64 - 12
+        y: 0 - 12 + 12*2
+        id: gun2
+        system: container.system
+        show: hp > 0
+        hardpointType: gunType
+    }
+    Hardpoint{
+        x: 16 - 12 + 8*2
+        y: 128 - 12 - 12*2
+        id: gun3
+        system: container.system
+        show: hp > 0
+        hardpointType: gunType
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Frigate.qml b/demos/declarative/plasmapatrol/content/Frigate.qml
new file mode 100644
index 0000000000..54f629268f
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Frigate.qml
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property int maxHP: 100
+    property int hp: maxHP
+    property real initialDodge: 0.2
+    property real dodge: initialDodge
+    onHpChanged: if(hp <= 0) target = container;
+    property ParticleSystem system//TODO: Ship abstraction
+    property Item target: container
+    property string shipParticle: "default"//Per team colors?
+    property int gunType: 0
+    width: 128
+    height: 128
+    TrailEmitter{
+        system: container.system
+        particle: "frigateShield"
+        anchors.centerIn: parent
+        particleSize: 92
+        particlesPerSecond: 1
+        particleDuration: 4800
+        emitting: hp > 0
+    }
+    TrailEmitter{
+        system: container.system
+        particle: container.shipParticle
+        anchors.centerIn: parent
+        width: 64 
+        height: 16
+        shape: Ellipse{}
+
+        particleSize: 16
+        particleSizeVariation: 8
+        particleEndSize: 8
+        particlesPerSecond: hp > 0 ?  hp * 1 + 20 : 0 
+        particleDuration: 1200
+        maxParticles: (maxHP * 1 + 20)*2
+    }
+    Timer{
+        id: fireControl
+        property int next: Math.floor(Math.random() * 2) + 1
+        interval: 800
+        running: root.readySetGo
+        repeat: true
+        onTriggered:{
+            if(next == 1){
+                gun1.fireAt(container.target);
+                next = Math.floor(Math.random() * 2) + 1;
+            }else if(next == 2){
+                gun2.fireAt(container.target);
+                next = Math.floor(Math.random() * 2) + 1;
+            }
+        }
+    }
+
+    Hardpoint{
+        x: 128 - 32 - 12
+        y: 64 - 12
+        id: gun1
+        system: container.system
+        show: hp > 0
+        hardpointType: gunType
+    }
+    Hardpoint{
+        x: 0 + 32 - 12
+        y: 64 - 12
+        id: gun2
+        system: container.system
+        show: hp > 0
+        hardpointType: gunType
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Hardpoint.qml b/demos/declarative/plasmapatrol/content/Hardpoint.qml
new file mode 100644
index 0000000000..184c750a79
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Hardpoint.qml
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    //ReflectiveProperties
+    //TransferredProperties
+    property variant target: {"y": -90, "x":12}
+    property ParticleSystem system
+    property bool show: true
+    property int hardpointType: 0 //default is pea shooter - always bad.
+
+    property Item targetObj: null
+    property int damageDealt: 0
+    onDamageDealtChanged: dealDamageTimer.start();
+    Timer{
+        id: dealDamageTimer
+        interval: 16
+        running: false
+        repeat: false
+        onTriggered: {targetObj.hp -= damageDealt; damageDealt = 0;}
+    }
+    width: 24
+    height: 24
+    function fireAt(targetArg){//Each implement own
+        if(targetArg != null){
+            hardpointLoader.item.fireAt(targetArg, container);
+            targetObj = targetArg;
+        }
+    }
+    Loader{
+        id: hardpointLoader
+        sourceComponent: {switch(hardpointType){
+        case 1: laserComponent; break;
+        case 2: blasterComponent; break;
+        case 3: cannonComponent; break;
+        default: emptyComponent;
+        }}
+    }
+    Component{
+        id: laserComponent
+        LaserHardpoint{
+            target: container.target
+            system: container.system
+            show: container.show
+        }
+    }
+    Component{
+        id: blasterComponent
+        BlasterHardpoint{
+            target: container.target
+            system: container.system
+            show: container.show
+        }
+    }
+    Component{
+        id: cannonComponent
+        CannonHardpoint{
+            target: container.target
+            system: container.system
+            show: container.show
+        }
+    }
+    Component{
+        id: emptyComponent
+        Item {
+            function fireAt(obj){
+                console.log("Firing null weapon. It hurts.");
+            }
+        }
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/HelpScreens.qml b/demos/declarative/plasmapatrol/content/HelpScreens.qml
new file mode 100644
index 0000000000..8896aeee4a
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/HelpScreens.qml
@@ -0,0 +1,268 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+SequentialLoader {
+    id: hLdr
+    signal exitDesired
+    Component.onCompleted: advance();
+    ParticleSystem{ id: helpSystem }
+    PlasmaPatrolParticles{ sys: helpSystem }
+    pages: [
+        Component{Item{
+            id: story
+            Text{
+                color: "white"
+                text: "Story"
+                font.pixelSize: 48
+            }
+            /*
+            Flickable{
+                y: 60
+                width: 360
+                height: 500
+                contentHeight: txt1.height
+                contentWidth: 360//TODO: Less magic numbers?
+                */
+                Text{
+                    id: txt1
+                    color: "white"
+                    y: 60
+                    font.pixelSize: 18
+                    text: "
+In a remote nebula, a race of energy beings formed and lived prosperous lives for millenia. Until the schism - when they became constantly at each other's energy-throats. War soon followed, crippling both sides, until a truce was formed. But while governments knew the desparate need for peace, the soldiers in the ion-field were still filled with rampant bloodlust. On the border, patrols are constantly engaging in minor skirmishes whenever they cross paths. 
+
+You must select one such patrol unit for the border, heading into an inevitable skirmish, in Plasma Patrol: the game of energy being spaceship combat!
+                    "
+                    width: 360
+                    wrapMode: Text.WordWrap
+                }
+           // }
+            Button{
+                x: 20
+                y: 560
+                height: 40
+                width: 120
+                text: "Next"
+                onClicked: hLdr.advance();
+            }
+            Button{
+                x: 220
+                y: 560
+                height: 40
+                width: 120
+                text: "Menu"
+                onClicked: hLdr.exitDesired();
+            }
+        }},
+        Component{Item{
+            id: ships
+            Text{
+                color: "white"
+                text: "Vessels"
+                font.pixelSize: 48
+            }
+            Column{
+                spacing: 16
+                y: 60
+                Row{
+                    height: 128
+                    Sloop{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The nimble sloop"
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+                Row{
+                    height: 128
+                    Frigate{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The versitile shield frigate"
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+                Row{
+                    height: 128
+                    Cruiser{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The armored cruiser"
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+            }
+            Button{
+                x: 20
+                y: 560
+                height: 40
+                width: 120
+                text: "Next"
+                onClicked: hLdr.advance();
+            }
+            Button{
+                x: 220
+                y: 560
+                height: 40
+                width: 120
+                text: "Menu"
+                onClicked: hLdr.exitDesired();
+            }
+        }},
+        Component{Item{
+            id: guns
+            Text{
+                color: "white"
+                text: "Hardpoints"
+                font.pixelSize: 48
+            }
+            Column{
+                spacing: 16
+                y: 60
+                Row{
+                    height: 128
+                    LaserHardpoint{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The laser hardpoint almost always hits the target, even the nimble sloop, but loses much of its potency against the frigate's shields"
+                        width: 332
+                        wrapMode: Text.WordWrap
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+                Row{
+                    height: 128
+                    BlasterHardpoint{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The blaster passes right through the frigate's shields but loses much of its impact against the armor of the cruiser"
+                        width: 332
+                        wrapMode: Text.WordWrap
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+                Row{
+                    height: 128
+                    CannonHardpoint{
+                        system: helpSystem
+                    }
+                    Text{
+                        text: "The cannon has poor accuracy, often missing the nimble sloop, but can punch right through the armor of the cruiser"
+                        width: 332
+                        wrapMode: Text.WordWrap
+                        color: "white"
+                        font.pixelSize: 18
+                    }
+                }
+            }
+            Button{
+                x: 20
+                y: 560
+                height: 40
+                width: 120
+                text: "Next"
+                onClicked: hLdr.advance();
+            }
+            Button{
+                x: 220
+                y: 560
+                height: 40
+                width: 120
+                text: "Menu"
+                onClicked: hLdr.exitDesired();
+            }
+        }},
+        Component{Item{
+            id: strategy
+            Text{
+                color: "white"
+                text: "Strategy"
+                font.pixelSize: 48
+            }
+            Flickable{
+                y: 60
+                width: 360
+                height: 500
+                contentHeight: txt1.height
+                contentWidth: 360//TODO: Less magic numbers?
+                Text{
+                    id: txt1
+                    color: "white"
+                    font.pixelSize: 18
+                    text: "
+Basic Strategy: Good luck, have fun - don't die.
+More to come after thorough playtesting.
+                    "
+                    width: 360
+                    wrapMode: Text.WordWrap
+                }
+            }
+            Button{
+                x: 20
+                y: 560
+                height: 40
+                width: 120
+                text: "Story"
+                onClicked: {hLdr.at=0; hLdr.advance();}
+            }
+            Button{
+                x: 220
+                y: 560
+                height: 40
+                width: 120
+                text: "Menu"
+                onClicked: hLdr.exitDesired();
+            }
+        }}
+    ]
+}
diff --git a/demos/declarative/plasmapatrol/content/LaserHardpoint.qml b/demos/declarative/plasmapatrol/content/LaserHardpoint.qml
new file mode 100644
index 0000000000..d6d470a15b
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/LaserHardpoint.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property variant target: {"y": -90, "x":12}
+    property ParticleSystem system
+    property bool show: true
+
+    width: 24
+    height: 24
+    TrailEmitter{
+        id: visualization
+        particle: "laser"
+        system: container.system
+        anchors.fill: parent
+        emitting: container.show
+        shape: Ellipse{}
+        speed: DirectedVector{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true }
+        particleDuration: 1000
+        particlesPerSecond: 64
+
+        particleSize: 24
+        particleSizeVariation: 8
+        particleEndSize: 8
+    }
+
+    function fireAt(targetArg, hardpoint){
+        if(targetArg.hp <= 0)
+            return;
+        //TODO: calculate hit and damage at target, which must be a Ship
+        var offset = 0;
+        if(Math.random() < 0.99){
+            switch(targetArg.shipType){
+            case 1: hardpoint.damageDealt += 16; break;
+            case 2: hardpoint.damageDealt += 4; break;
+            case 3: hardpoint.damageDealt += 8; break;
+            default: hardpoint.damageDealt += 500; //Really effective against unregistered vessels
+            }
+        }else{//Misses with Lasers are really rare
+            offset = Math.random() * 100;
+        }
+        target = container.mapFromItem(targetArg, offset + targetArg.width/2, offset + targetArg.height/2);
+        emitter.pulse(0.10);
+ //       console.log("Fire box: " +  Math.min(container.width/2, target.x) + "," + Math.min(container.height/2, target.y) + " " + (Math.max(container.width/2, target.x) - Math.min(container.width/2, target.x)) + "," + (Math.max(container.height/2, target.y) - Math.min(container.height/2, target.y)));
+    }
+    TrailEmitter{
+        id: emitter
+        particle: "laser"
+        emitting: false
+        system: container.system
+        x: Math.min(container.width/2, target.x);
+        width: Math.max(container.width/2, target.x) - x;
+        y: Math.min(container.height/2, target.y);
+        height: Math.max(container.height/2, target.y) - y;
+        shape: Line{
+            mirrored: (emitter.y < 0 || emitter.x < 0) && !(emitter.y < 0 && emitter.x < 0 )//I just want XOR
+        }
+
+        particleDuration: 1000
+        particlesPerSecond: 8000
+        maxParticles: 800
+        particleSize: 16
+        particleEndSize: 0
+
+        speed: PointVector{xVariation: 4; yVariation: 4}
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml b/demos/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml
new file mode 100644
index 0000000000..7a6fcb96d0
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item{
+    property ParticleSystem sys
+    ColoredParticle{
+        system: sys
+        particles: ["default"]
+        image: "pics/blur-circle3.png"
+        color: "#003A3A3A"
+        colorVariation: 0.1
+        z: 0
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["redTeam"]
+        image: "pics/blur-circle3.png"
+        color: "#0028060A"
+        colorVariation: 0.1
+        z: 0
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["greenTeam"]
+        image: "pics/blur-circle3.png"
+        color: "#0006280A"
+        colorVariation: 0.1
+       z: 0
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["blaster"]
+        image: "pics/star2.png"
+        //color: "#0F282406"
+        color: "#0F484416"
+        colorVariation: 0.2
+        z: 2
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["laser"]
+        image: "pics/star3.png"
+        //color: "#00123F68"
+        color: "#00428FF8"
+        colorVariation: 0.2
+        z: 2
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["cannon"]
+        image: "pics/particle.png"
+        color: "#80FFAAFF"
+        colorVariation: 0.1
+        z: 2
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["cannonCore"]
+        image: "pics/particle.png"
+        color: "#00666666"
+        colorVariation: 0.8
+        z: 1
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["cannonWake"]
+        image: "pics/star.png"
+        color: "#00CCCCCC"
+        colorVariation: 0.2
+        z: 1
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["frigateShield"]
+        image: "pics/blur-circle2.png"
+        color: "#00000000"
+        colorVariation: 0.05
+        blueVariation: 0.5
+        greenVariation: 0.1
+        z: 3
+    }
+    SpriteParticle{
+        system: sys
+        particles: ["cruiserArmor"]
+        z: 1
+        sprites:[Sprite{
+                id: spinState
+                name: "spinning"
+                source: "pics/meteor.png"
+                frames: 35
+                duration: 40
+                to: {"death":0, "spinning":1}
+            },Sprite{
+                name: "death"
+                source: "pics/meteor_explo.png"
+                frames: 22
+                duration: 40
+                to: {"null":1}
+            }, Sprite{
+                name: "null"
+                source: "pics/nullRock.png"
+                frames: 1
+                duration: 1000
+            }
+        ]
+    }
+    FollowEmitter{
+        system: sys
+        particle: "cannonWake"
+        follow: "cannon"
+        particlesPerParticlePerSecond: 64
+        particleDuration: 600
+        speed: AngleVector{ angleVariation: 360; magnitude: 48}
+        particleSize: 16
+        particleEndSize: 8
+        particleSizeVariation: 2
+        emitting: true
+        width: 1000//XXX: Terrible hack
+        height: 1000
+    }
+    FollowEmitter{
+        system: sys
+        particle: "cannonCore"
+        follow: "cannon"
+        particlesPerParticlePerSecond: 256
+        particleDuration: 128
+        particleSize: 24
+        particleEndSize: 8
+        emitting: true
+        width: 1000//XXX: Terrible hack
+        height: 1000
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/SequentialLoader.qml b/demos/declarative/plasmapatrol/content/SequentialLoader.qml
new file mode 100644
index 0000000000..85a979b222
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/SequentialLoader.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+
+Item{
+    id: container
+    //TODO: Somehow get particles into this?
+    property list<Component> pages
+    property Item cur: null
+    property int at: 0
+    function advance(){
+        if(cur != null)
+            cur.destroy();
+        cur = pages[at++].createObject(container);
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Ship.qml b/demos/declarative/plasmapatrol/content/Ship.qml
new file mode 100644
index 0000000000..0ccea94221
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Ship.qml
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: me
+    //Reflective Properties
+    width: shipLoader.width
+    height: shipLoader.height
+    //Transfered Properties
+    property int hp: 100//shipLoader.item.maxHP
+    property real dodge: shipLoader.item.initialDodge
+    property ParticleSystem system
+    property int targetIdx: 0
+    property Item target: targets[targetIdx] == undefined?null:targets[targetIdx]
+    Connections{
+        target: me.target
+        onHpChanged: if(me.target.hp<=0) me.targetIdx++;
+    }
+    property list<Item> targets
+    property string shipParticle: "default"//Per team colors?
+    property int gunType: 0
+    property int shipType: 0
+    Component{
+        id: sloopComp
+        Sloop{
+            system: me.system
+            target: me.target
+            shipParticle: me.shipParticle
+            gunType: me.gunType
+            hp: me.hp
+            dodge: me.dodge
+        }
+    }
+    Component{
+        id: frigateComp
+        Frigate{
+            system: me.system
+            target: me.target
+            shipParticle: me.shipParticle
+            gunType: me.gunType
+            hp: me.hp
+            dodge: me.dodge
+        }
+    }
+    Component{
+        id: cruiserComp
+        Cruiser{
+            system: me.system
+            target: me.target
+            shipParticle: me.shipParticle
+            gunType: me.gunType
+            hp: me.hp
+            dodge: me.dodge
+        }
+    }
+    Component{
+        id: dumbComp
+        Item{
+            property int maxHP: 0
+            property int initialDodge: 0
+        }
+    }
+    Loader{
+        id: shipLoader
+        sourceComponent:{ switch(shipType){
+            case 1: sloopComp; break;
+            case 2: frigateComp; break;
+            case 3: cruiserComp; break;
+            default: dumbComp;
+        }
+        }
+    }
+}
diff --git a/demos/declarative/plasmapatrol/content/Sloop.qml b/demos/declarative/plasmapatrol/content/Sloop.qml
new file mode 100644
index 0000000000..1b9bce7333
--- /dev/null
+++ b/demos/declarative/plasmapatrol/content/Sloop.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Item {
+    id: container
+    property int maxHP: 100
+    property int hp: maxHP
+    property real initialDodge: 0.5
+    property real dodge: initialDodge
+    property int blinkInterval: 800
+    onHpChanged: if(hp <= 0) target = container;
+    property ParticleSystem system//TODO: Ship abstraction
+    property Item target: container
+    property string shipParticle: "default"//Per team colors?
+    property int gunType: 0
+    width: 128
+    height: 128
+    TrailEmitter{
+        id: emitter
+        //TODO: Cooler would be an 'orbiting' affector
+        //TODO: On the subject, opacity and size should be grouped type 'overLife' if we can cram that in the particles
+        system: container.system
+        particle: container.shipParticle
+        shape: Ellipse{}
+
+        particlesPerSecond: hp > 0 ?  hp + 20 : 0 
+        particleDuration: blinkInterval
+        maxParticles: (maxHP + 20)
+
+        acceleration: AngleVector{angleVariation: 360; magnitude: 8}
+
+        particleSize: 24
+        particleEndSize: 4
+        particleSizeVariation: 8
+        width: 16
+        height: 16
+        x: 64
+        y: 64
+        Behavior on x{NumberAnimation{duration:blinkInterval}}
+        Behavior on y{NumberAnimation{duration:blinkInterval}}
+        Timer{
+            interval: blinkInterval
+            running: true
+            repeat: true
+            onTriggered: {
+                emitter.x = Math.random() * 48 + 32
+                emitter.y = Math.random() * 48 + 32
+            }
+        }
+    }
+    Hardpoint{
+        anchors.centerIn: parent
+        id: gun2
+        system: container.system
+        show: container.hp > 0
+        hardpointType: gunType
+    }
+    Timer{
+        id: fireControl
+        interval: 800
+        running: root.readySetGo
+        repeat: true
+        onTriggered:{
+                gun2.fireAt(container.target);
+        }
+    }
+
+}
diff --git a/demos/declarative/plasmapatrol/content/pics/TitleText.png b/demos/declarative/plasmapatrol/content/pics/TitleText.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc3acebe3912279295b72c4ca6590580911d3600
GIT binary patch
literal 1109
zcmV-b1giUqP)<h;3K|Lk000e1NJLTq00C$K002!01^@s6i}U{E00009a7bBm000fw
z000eP0r0nyMgRZ=2T4RhRCt{2-P>;CAP@jhceVfj%iV|FYNIGlV7LwTIZ~ynb-)?M
zgkVCB0{{R300000000000000000000004lIz9!Z4{ieR}7k`VK*Sk8P#f<zVzv+F<
zjEbHU`0K^r&Xk_tt2&^E8Tm_oOZu2!Gb(vfn%qCf)*KI`$zP^f(LqN@a&{(v3HiPH
z1dj4~z3-D_VI}#?Fsnz<X9+8j*@66JsFfY`rz9>NnZOG2m*G}*(4`{`BM~yXdj7h(
znZ$|?de@|d<G6nQexLl#0;}hsOFUl?l7^kgU&40ipaE`42Mv&v4jLe-3?EbhuIX%Z
zA$#W(+OdNk-I!-Lan9=PvBOnuowenb+^G6g*UVkpR<yw^(G9>pJ-##swKpkCj{mgg
z`%@W@|L@U;qpqjvR_tb1TW`s$ZR;y?P0~J=-BNGlZvN=<U)3>d=e8AXP+~^@zN_m@
zBnBf_kn~)w(z4y~tnx3rn_Z0=OOhfZik9<gdHn2n)b8BYqt4RfcUZ1AGJd<nAY#NQ
z|M~bWVz;V;?lrn=HM3J`t?#jn(a9C9V|GkdU1YuUcgGk!s=Y41o_<~_eO|lA?yZ$`
z(6!%EF{=J&quw4y=fy_EqSrLW?3iS_pnB!+%os%Gzk3ggUX@q#B?ymt#4hzNgBflT
zuK0F}$h=}SiK6vAANO2FG_j%=Na^EB&uexYjM9?7SBXKXch9Z%dG(B4+D>}*6h|}&
zt2^h%<9eJ+ua32686*C8CPN!U^vvH~V-QtxzNPQbZWFuN9dzWCYIHESX{<((3ncou
z+7aF^Z7?!_cZoqpBbVkawQ{@BlD8vSlQ!#l-O0)}$dbSEFm8+3t)7FP9i%LuU}~K|
zPCI8-AWIwc5Iy%R#bCBu#V-3g=*(&o<7^Hxx}5FONm)T0t`~!^lix?zbsPz&IaZIL
z`75%50<KEF|6>F_PfOCZjJBbM97{w8Jy(w#M>=Y_2_5trpFZYVLMIIuXAXM3mXCVx
zyqW{};BF)6o_B3$?V#0Tw4KSyHpoH@;zq_U-8FW%4tka77M{=2B@i%<4tm|Tq5P)}
z#Gplw*rgo&+_8fmwLN5w%p3O4kf9A$6N9+h#O{tA^l`lZWZ#*V<!zDrdexoP>^8_q
z4B~pmF6HR?IPSfQ<K5n{t!31>^PF^+Hdsjv;(Em{t-Fq(f3!4C?M2Z$5mF~sg_&)T
zl^Dde#xAwHchJW%ck}!n%jK@L<nG6+FEGeN4B{>uyV+A5GlJ5(jc2s%=<aqUqn{p~
zdiKZ7Zi9$f<!6aOud-%d_wQo2)AIoU00000000000000000000000000000000000
bfSdROP<`@mFGcl700000NkvXXu0mjfK%E|d

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/blur-circle2.png b/demos/declarative/plasmapatrol/content/pics/blur-circle2.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7c9f3e98ebca1b5513e36871ebf7ca40b67ed4a
GIT binary patch
literal 3627
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
S?~kwlzPUKKVan}-e*8Bxh|k^t

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/blur-circle3.png b/demos/declarative/plasmapatrol/content/pics/blur-circle3.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbc39cb16eec43d80546f79ade596d2b0bf5bc3e
GIT binary patch
literal 5148
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

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/finalfrontier.png b/demos/declarative/plasmapatrol/content/pics/finalfrontier.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ba18152308c27acb5348526df713b2896d13a0e
GIT binary patch
literal 695061
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%0DvX?df~bxNeC5vzXGkwc7(GMIWb_6TbMMBhQ-fO
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%0DDb
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

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/meteor.png b/demos/declarative/plasmapatrol/content/pics/meteor.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8c368aea745f7035734e6145b7e970945acd3e9
GIT binary patch
literal 83169
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
a+Y!>K7RknWW>f!r$r`FUD&<O6VgCb<kRSB`

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/meteor_explo.png b/demos/declarative/plasmapatrol/content/pics/meteor_explo.png
new file mode 100644
index 0000000000000000000000000000000000000000..4297245d49b087348d737b4ce4fb3761a62c2f0f
GIT binary patch
literal 81528
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

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/nullRock.png b/demos/declarative/plasmapatrol/content/pics/nullRock.png
new file mode 100644
index 0000000000000000000000000000000000000000..4076327a1aa5ef44bd38a1ac1f78b2fca5738633
GIT binary patch
literal 140
zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$`B3oCO|{#S9F5zCb*O@!q#N;Xpw<
yPZ!6KiaBo&8ZrWThZcPG&*j!%0AvyY8kRH8S;D}$taNH0NVTV{pUXO@geCxeb{iuA

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/particle.png b/demos/declarative/plasmapatrol/content/pics/particle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c83896d22cdc3c352ff8db97b0b1f2cd2b27125
GIT binary patch
literal 861
zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!|4BqaRCwByS51%9Fbqx7be0e8!eRFS
z2Yvzn|DSN;zy*YakXV7l4%;>+uAJ)4!|9fhtYq5Mes-Q6Cx`#|iAbtLlW1enS0*|y
zF-AG6Gn?YQHEL+EwV9p=GaO)E)yZ7P#iXw|#tVf#fLG>e0M8MG5RhWevjLdwSw8|D
zuhsAfhEd!df^ArA-nL0W%try}N6#(n2}a&~HjZ3K1|mYlq5;_jfW`*`(KwJuF^0aF
zr|o?q9tcN*0bGIM4C4r3BJqHu(7x$~T@X|zFe7+8*#8m!?`2AGwkkTtGl1Oy=)z}^
za?OjA&6)WL6h>fq1P)}{8Ug2Y{)hlFC`Rwu^8|a|n->6<ftUj8wj$O5jPNi4;n;Yj
zRE(5<V&5$At~pUCGgbh}$}6YZKt|Yj+DTI{IvKXNjcPmQj-kP+dT2yb^<9-)WBd0i
zpR4>P9tZ))^CJcdb95FnFqIco-dA~TBvoZEtK3xiQ00Nnht$!z>dj77iw^4%*jqDp
zZD1CAt~vjv$|vGRaP<8{tX^>mj-pqPqBoYlt$tiP2UO4awgu8L>g9a^HftXLG|wl<
z_dubRj^6csCNE_t0!@Bc=vDb2Gx}h14<LlLf{$%!0E%;{VBx?zuL{2!>1K;yv1t6N
z@~vY~yv9W(!@+<H7vcwkQ%^ruxidaYW?WP8+%Z&W+}>w;iAO4L4;GiR<^30@7ZB=z
zn!ZBk!aAnfmthA}fMheB<pugYp0f@i<1>+Tv7T@{3nr@9t&K{~=@$rCk7(@3;zVH!
zvloHbj!dUC%TCG`;L#&_FJ$XtpU+m~XD1CuI<k8$nNXd;2zVU0=!n`!C+O=qoP$%>
zc@2l1<)Sa-o^Ue7qb+KR6O3Nz=1lO&iqE=DX=|0Rn@J7;KJ%G;oE1#M-Frdf!wD`X
z?0tf5l1|YPARrR`(9I|SiAL&X!V~vHCYyK{k|O{Dgl?cqi8vhSmEQ8??O1QAM}TM#
nN5v_UffYd2w;a8m{}o^W-^qmk*A=;y00000NkvXXu0mjf5*>;S

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/star.png b/demos/declarative/plasmapatrol/content/pics/star.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d592cfa8752ac8a75f92614369011812be88639
GIT binary patch
literal 1550
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W}skZsAp(w
zVs37(qhMrUXrOOkq;F`XYiMp|Y-D9%pa2C*K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1U
zu~h=P6yk;40=Thx#n4~^2AF<DVu8M)o&m^9FonLp_?717!c`ZS1f?R}i`C%bkjjEo
z{h-w1{L-RiV8o><gRCmBaxO|uEXgkl$<NP$g<?QPeo20DMt*^UbFis`Z(?$09*7TC
z@9S&jnO9trn3tUD>0+w{G(j&jGsViu#lY3g$;Hsn#lXza(AB`g+{MiW80;?2=H^aD
zE=DlDF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2aTIr+HAl
zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CH6P#S^9&43O`a}}Ar-f_
zgy;5MHV`<ga<fkNP0$1OZWi$e5_8%ff9Uo;DCrROmOsL7+g-J#t!Wb8`X^>p<(R*9
ztIE23WZv_c-;e1T78`z0dT;&s--DB{7!M|$H(fbdV1aO|M#WTq5u0i`ZD!Gk;<Q~~
zy__GPW3hIeeyZX3+ldLQnkG0+EW97De9+QE#rVOE|Hl~21GCr6={d8Z{5;1yvCV>i
zF6OQ5waWeYQ$jM+c6FfAU%QE&32G6^fwS(^GcDwlz3o=O=xf3$wCkU6%0^a3xunCo
zO!kbOp$@_e-Ar2hq*&Cw=cFDnvyFK*t;t(Jv1j#$207JvJ45Y{?odlTYjt_QpMyPX
zxWH9ejvv!EUyt~}^WKbe?F`8cYn}#GYF98Su?VHlIL`Ual<9u@m!3CaF{_I1aNJv<
za^E3|C+T_<>#;YQc3W;(9rDxOyMA}@*YtzY=Wn0Wl%M#^?uVb?0%tD)<q*XU${+nc
z$Q_DSSiCWAqj`Ph0l9OH@1@sgiZVYlj5c&-dw=0>9H$+}KdyP)&zjyh`u4QXV=qa6
zE$~O^p#8#UdpY8pPK56{y>aStqX3DuWnA2Kf`2|7yMM4Myx`Q@jdR~mRG7ngQXuAK
zW-8n2yUqnuzt0I({>2(J*S*F0=}Kc3=Nl2vJbng6cH1yT-zehC)d>yQ=5=7A@g0`f
zyvDN~SC%Yc+H&C(tH+uoC!f>=p8oZFdYAg#n0#@Yb<f?#5OJw+_c!KFcYpug6Q7%&
zbNp9v?}O(OoB5_LGRv}Sdvsl^V&SE8ZFzs(uI^s`!DzD1L5`*@-lm*6%+9tc%?pe(
zl7u%cEDf-Hx^a(_r$zgLmH%h({7XN=FKN?$V57>U<k!mTi;_G42`4a=UU<;6N?oZM
PR6={Y`njxgN@xNA$LK`L

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/star2.png b/demos/declarative/plasmapatrol/content/pics/star2.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb55c447880e4b9d144a28bbf2728b1172b7da3e
GIT binary patch
literal 6507
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

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/content/pics/star3.png b/demos/declarative/plasmapatrol/content/pics/star3.png
new file mode 100644
index 0000000000000000000000000000000000000000..636a25f4807c4ce0d1899a19d45ed45bb41e900c
GIT binary patch
literal 4602
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
MW@JUIB6uYJ7m{wr?f?J)

literal 0
HcmV?d00001

diff --git a/demos/declarative/plasmapatrol/plasmapatrol.qml b/demos/declarative/plasmapatrol/plasmapatrol.qml
new file mode 100644
index 0000000000..3a7b217618
--- /dev/null
+++ b/demos/declarative/plasmapatrol/plasmapatrol.qml
@@ -0,0 +1,386 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content"
+
+Rectangle {
+    id: root
+    property bool readySetGo: false
+    //Debugging
+    property int hits: 0
+    property int misses: 0
+    property real ratio: hits/(misses?misses:1)
+    //Move to JS file?
+    property Ship redVar1: Ship{shipType: 1; gunType: 1}
+    property Ship redVar2: Ship{shipType: 1; gunType: 2}
+    property Ship redVar3: Ship{shipType: 1; gunType: 3}
+    property Ship greenVar1: Ship{shipType: 3; gunType: 1}
+    property Ship greenVar2: Ship{shipType: 2; gunType: 2}
+    property Ship greenVar3: Ship{shipType: 1; gunType: 3}
+    property string winner: "0"
+    property int players: 0
+    function aiSet(ship){
+        ship.gunType = Math.floor(Math.random() * 3) + 1
+        ship.shipType = Math.floor(Math.random() * 3) + 1
+    }
+
+    width: 360
+    height: 600
+    color: "black"
+    SequentialLoader{
+        anchors.fill: parent
+        //General Children
+        Image{
+            anchors.centerIn: parent
+            source: "content/pics/finalfrontier.png"
+        }
+        ParticleSystem{
+            id: particles
+        }
+        PlasmaPatrolParticles{ sys: particles; z: 100 }//Renders all particles on the one plane
+        //Component parts
+        id: pageControl
+        Component.onCompleted: advance();
+        pages:[
+        Component{Item{
+            id: menu
+            width: root.width
+            height: root.height
+            Column{
+                anchors.verticalCenter: parent.verticalCenter
+                width: parent.width
+                spacing: 8
+                Item{
+                    id: title
+                    width: root.width
+                    height: 240
+                    TrailEmitter{
+                        anchors.fill: parent
+                        system: particles
+                        emitting: true
+                        particle: "default"
+                        particlesPerSecond: 1200
+                        particleDuration: 1200
+                        shape: Mask{source:"content/pics/TitleText.png"}
+                        particleSize: 16
+                        particleEndSize: 0
+                        particleSizeVariation: 8
+                        speed: AngleVector{angleVariation:360; magnitudeVariation: 6}
+                    }
+                }
+                Button{
+                    text: "1P"
+                    onClicked: {root.players = 1; pageControl.advance();}
+                    anchors.horizontalCenter: parent.horizontalCenter
+                }
+                Button{
+                    text: "2P"
+                    onClicked: {root.players = 2; pageControl.advance();}
+                    anchors.horizontalCenter: parent.horizontalCenter
+                }
+                Button{
+                    text: "Demo"
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    onClicked: {root.players = 0; 
+                        aiSet(redVar1);
+                        aiSet(redVar2);
+                        aiSet(redVar3);
+                        aiSet(greenVar1);
+                        aiSet(greenVar2);
+                        aiSet(greenVar3);
+                        pageControl.at = 5;//TODO: Not a magic number
+                        pageControl.advance();}
+                }
+                Button{
+                    text: "Help"
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    onClicked: {
+                        pageControl.at = 7;//TODO: Not a magic number
+                        pageControl.advance();
+                    }
+                }
+                Button{
+                    text: "Quit"
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    onClicked: Qt.quit();
+                }
+            }
+        }},
+        Component{Item{
+            id: p1Screen
+            z: 101
+            width: root.width
+            height: root.height
+            Rectangle{
+                anchors.fill: parent
+                color: "red"
+            }
+            Text{
+                anchors.centerIn: parent
+                color: "white"
+                font.pixelSize: 64
+                font.bold: true
+                text: "Player\n    1"
+                horizontalAlignment: Text.AlignHCenter
+            }
+            MouseArea{
+                anchors.fill: parent
+                onClicked: pageControl.advance()
+            }
+        }},
+        Component{Item{
+            id: p1Choices
+            z: 3
+            width: root.width
+            height: root.height
+            Rectangle{
+                color: "black"
+                anchors.fill: parent
+            }
+            Column{
+                spacing: 16
+                width: root.width
+                anchors.horizontalCenter: parent.horizontalCenter
+                ChoiceBox{
+                    target: redVar1
+                    system: particles
+                }
+                ChoiceBox{
+                    target: redVar2
+                    system: particles
+                }
+                ChoiceBox{
+                    target: redVar3
+                    system: particles
+                }
+                Button{
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    text: "Next"
+                    onClicked: {
+                        if(root.players < 2){
+                            aiSet(greenVar1);
+                            aiSet(greenVar2);
+                            aiSet(greenVar3);
+                            pageControl.at = 5;//TODO: Not a magic number
+                        }
+                        pageControl.advance();
+                    }
+                }
+            }
+        }},
+        Component{Item{
+            id: p2Screen
+            z: 101
+            width: root.width
+            height: root.height
+            Rectangle{
+                anchors.fill: parent
+                color: "green"
+            }
+            Text{
+                anchors.centerIn: parent
+                color: "white"
+                font.pixelSize: 64
+                font.bold: true
+                text: "Player\n    2"
+                horizontalAlignment: Text.AlignHCenter
+            }
+            MouseArea{
+                anchors.fill: parent
+                onClicked: pageControl.advance()
+            }
+        }},
+        Component{Item{
+            id: p2Choices
+            z: 1
+            width: root.width
+            height: root.height
+            Rectangle{
+                color: "black"
+                anchors.fill: parent
+            }
+            Column{
+                spacing: 16
+                width: root.width
+                anchors.horizontalCenter: parent.horizontalCenter
+                ChoiceBox{
+                    target: greenVar1
+                    system: particles
+                }
+                ChoiceBox{
+                    target: greenVar2
+                    system: particles
+                }
+                ChoiceBox{
+                    target: greenVar3
+                    system: particles
+                }
+                Button{
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    text: "Next"
+                    onClicked: pageControl.advance()
+                }
+            }
+        }},
+        Component{Item{
+            id: arena
+            width: root.width
+            height: root.height
+            z: 0
+            Component.onCompleted: root.readySetGo = true
+            Component.onDestruction: root.readySetGo = false
+            property bool victory: redShip3.hp <= 0 || greenShip3.hp <=0
+            onVictoryChanged: {
+                if(redShip3.hp <= 0){
+                    if(greenShip3.hp <= 0){
+                        root.winner = "1&2"
+                    }else{
+                        root.winner = "2"
+                    }
+                }else{
+                    root.winner = "1"
+                }
+                winTimer.start()
+            }
+            Timer{
+                id: winTimer
+                interval: 1200
+                repeat: false
+                running: false
+                onTriggered: pageControl.advance();
+            }
+            Ship{
+                id: redShip1
+                shipParticle: "redTeam"
+                system: particles
+                x: 180-64
+                y: 128
+                shipType: redVar1.shipType
+                gunType: redVar1.gunType
+                targets: [greenShip1, greenShip2, greenShip3]
+            }
+            Ship{
+                id: redShip2
+                shipParticle: "redTeam"
+                system: particles
+                x: 0
+                y: 0
+                shipType: redVar2.shipType
+                gunType: redVar2.gunType
+                targets: [greenShip1, greenShip2, greenShip3]
+            }
+            Ship{
+                id: redShip3
+                shipParticle: "redTeam"
+                system: particles
+                x: 360-128
+                y: 0
+                shipType: redVar3.shipType
+                gunType: redVar3.gunType
+                targets: [greenShip1, greenShip2, greenShip3]
+            }
+
+            Ship{
+                id: greenShip1
+                shipParticle: "greenTeam"
+                system: particles
+                x: 180-64
+                y: 600 - 128 - 128
+                shipType: greenVar1.shipType
+                gunType: greenVar1.gunType
+                targets: [redShip1, redShip2, redShip3]
+            }
+            Ship{
+                id: greenShip2
+                shipParticle: "greenTeam"
+                system: particles
+                x: 0
+                y: 600-128
+                shipType: greenVar2.shipType
+                gunType: greenVar2.gunType
+                targets: [redShip1, redShip2, redShip3]
+            }
+            Ship{
+                id: greenShip3
+                shipParticle: "greenTeam"
+                system: particles
+                x: 360 - 128
+                y: 600 - 128
+                shipType: greenVar3.shipType
+                gunType: greenVar3.gunType
+                targets: [redShip1, redShip2, redShip3]
+            }
+        }},
+        Component{Item{
+            id: winScreen
+            z: 101
+            width: root.width
+            height: root.height
+            /*
+            Rectangle{
+                anchors.fill: parent
+                color: "black"
+            }
+            */
+            Text{//TODO: Particle Text?
+                anchors.fill: parent
+                color: "white"
+                font.pixelSize: 64
+                font.bold: true
+                text: "Player " + root.winner + " wins!"
+                wrapMode: Text.WordWrap
+                horizontalAlignment: Text.AlignHCenter
+                verticalAlignment: Text.AlignVCenter
+            }
+            MouseArea{
+                anchors.fill: parent
+                onClicked: {pageControl.at = 0; pageControl.advance();}
+            }
+        }},
+        Component{
+            HelpScreens{
+                onExitDesired: {pageControl.at = 0; pageControl.advance();}
+            }
+        }
+        ]
+    }
+}
diff --git a/demos/declarative/samegame/SamegameCore/BoomBlock.qml b/demos/declarative/samegame/SamegameCore/BoomBlock.qml
index 009aeca2c6..3d11fb9df2 100644
--- a/demos/declarative/samegame/SamegameCore/BoomBlock.qml
+++ b/demos/declarative/samegame/SamegameCore/BoomBlock.qml
@@ -39,8 +39,8 @@
 **
 ****************************************************************************/
 
-import QtQuick 1.1
-import Qt.labs.particles 1.0
+import QtQuick 2.0
+import Qt.labs.particles 2.0
 
 Item {
     id: block
@@ -71,26 +71,28 @@ Item {
         Behavior on opacity { NumberAnimation { duration: 200 } }
         anchors.fill: parent
     }
-
-    Particles {
+    TrailEmitter {
         id: particles
-
-        width: 1; height: 1
-        anchors.centerIn: parent
-
-        emissionRate: 0
-        lifeSpan: 700; lifeSpanDeviation: 600
-        angle: 0; angleDeviation: 360;
-        velocity: 100; velocityDeviation: 30
-        source: {
+        system: particleSystem
+        particle: { 
             if(type == 0){
-                "pics/redStar.png";
+                "red";
             } else if (type == 1) {
-                "pics/blueStar.png";
+                "blue";
             } else {
-                "pics/greenStar.png";
+                "green";
             }
         }
+        anchors.fill: parent
+
+        speed: DirectedVector{targetX: block.width/2; targetY: block.height/2; magnitude: -60; magnitudeVariation: 60}
+        shape: Ellipse{fill:true}
+        emitting: false;
+        particleDuration: 700; particleDurationVariation: 100
+        particlesPerSecond: 1000
+        maxParticles: 100 //only fires 0.1s bursts (still 2x old number, ColoredParticle wants less than 16000 max though)
+        particleSize: 28
+        particleEndSize: 14
     }
 
     states: [
@@ -101,7 +103,7 @@ Item {
 
         State {
             name: "DeathState"; when: dying == true
-            StateChangeScript { script: particles.burst(50); }
+            StateChangeScript { script: particles.pulse(0.1); }
             PropertyChanges { target: img; opacity: 0 }
             StateChangeScript { script: block.destroy(1000); }
         }
diff --git a/demos/declarative/samegame/SamegameCore/Button.qml b/demos/declarative/samegame/SamegameCore/Button.qml
index b2b232ca8e..8bcca5b5d5 100644
--- a/demos/declarative/samegame/SamegameCore/Button.qml
+++ b/demos/declarative/samegame/SamegameCore/Button.qml
@@ -39,7 +39,7 @@
 **
 ****************************************************************************/
 
-import QtQuick 1.1
+import QtQuick 2.0
 
 Rectangle {
     id: container
diff --git a/demos/declarative/samegame/SamegameCore/Dialog.qml b/demos/declarative/samegame/SamegameCore/Dialog.qml
index ecac475826..ee1b51006a 100644
--- a/demos/declarative/samegame/SamegameCore/Dialog.qml
+++ b/demos/declarative/samegame/SamegameCore/Dialog.qml
@@ -39,23 +39,26 @@
 **
 ****************************************************************************/
 
-import QtQuick 1.1
+import QtQuick 2.0
 
 Rectangle {
     id: page
 
     property Item text: dialogText
+    property bool open: false
 
     signal closed
     signal opened
     function forceClose() {
-        if(page.opacity == 0)
+        if(!open)
             return; //already closed
+        page.open = false;
         page.closed();
         page.opacity = 0;
     }
 
     function show(txt) {
+        page.open = true;
         page.opened();
         dialogText.text = txt;
         page.opacity = 1;
diff --git a/demos/declarative/samegame/SamegameCore/pics/blueStar.png b/demos/declarative/samegame/SamegameCore/pics/blueStar.png
deleted file mode 100644
index ff9588f80a1350c099359bdc618b8f6a2c6a1b7c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 278
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggab^#VK=9w-El|Z3so-U3d7N_rC
zQsg@nAi#2gy-8t#_yO@0VHvi=oK>A%=bB%rzABJeBo*YzBo*#x5HG;=r|He9n{)5Z
zJbCH8*6J#;*^+L*F5hT6IQ_NqngZA0Cy}=!9Tk>GB=njj6tbp<s?SL7%xx&Y@i^|u
z&7X^#9NJEwzGtYmqx95+lZVtC*k$fNy`Xx8?fQJD76%K~`)~L6PkB*q%TR2tBY1Xl
S=0%_j89ZJ6T-G@yGywqlw`Cjv

diff --git a/demos/declarative/samegame/SamegameCore/pics/greenStar.png b/demos/declarative/samegame/SamegameCore/pics/greenStar.png
deleted file mode 100644
index cd068547198be068e337176857026a1f29e7202b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 273
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggab^#V~1tp6FFQCvwPZ!4!i_>>6
zDe@f(5Ma5$-lVWVe1(364BO$vTLp5L;#iJ*DopiVaV*qihCT;lonzV4H|O4+Ns%lM
z^__VvZP~<sM%xlTJ^jTKy=BGcEic%#IiB!jznQ?Qvu;7wDHiRV0*()Y>R&3OOyosb
zjPAsJJGb#bZ2+6U*f&P2$Dj1t6&0^#)N=_kJ(Q{`|8EzR^ye!>B##b9*@MOLK*uq7
My85}Sb4q9e09G(v)c^nh

diff --git a/demos/declarative/samegame/SamegameCore/pics/particle.png b/demos/declarative/samegame/SamegameCore/pics/particle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c83896d22cdc3c352ff8db97b0b1f2cd2b27125
GIT binary patch
literal 861
zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!|4BqaRCwByS51%9Fbqx7be0e8!eRFS
z2Yvzn|DSN;zy*YakXV7l4%;>+uAJ)4!|9fhtYq5Mes-Q6Cx`#|iAbtLlW1enS0*|y
zF-AG6Gn?YQHEL+EwV9p=GaO)E)yZ7P#iXw|#tVf#fLG>e0M8MG5RhWevjLdwSw8|D
zuhsAfhEd!df^ArA-nL0W%try}N6#(n2}a&~HjZ3K1|mYlq5;_jfW`*`(KwJuF^0aF
zr|o?q9tcN*0bGIM4C4r3BJqHu(7x$~T@X|zFe7+8*#8m!?`2AGwkkTtGl1Oy=)z}^
za?OjA&6)WL6h>fq1P)}{8Ug2Y{)hlFC`Rwu^8|a|n->6<ftUj8wj$O5jPNi4;n;Yj
zRE(5<V&5$At~pUCGgbh}$}6YZKt|Yj+DTI{IvKXNjcPmQj-kP+dT2yb^<9-)WBd0i
zpR4>P9tZ))^CJcdb95FnFqIco-dA~TBvoZEtK3xiQ00Nnht$!z>dj77iw^4%*jqDp
zZD1CAt~vjv$|vGRaP<8{tX^>mj-pqPqBoYlt$tiP2UO4awgu8L>g9a^HftXLG|wl<
z_dubRj^6csCNE_t0!@Bc=vDb2Gx}h14<LlLf{$%!0E%;{VBx?zuL{2!>1K;yv1t6N
z@~vY~yv9W(!@+<H7vcwkQ%^ruxidaYW?WP8+%Z&W+}>w;iAO4L4;GiR<^30@7ZB=z
zn!ZBk!aAnfmthA}fMheB<pugYp0f@i<1>+Tv7T@{3nr@9t&K{~=@$rCk7(@3;zVH!
zvloHbj!dUC%TCG`;L#&_FJ$XtpU+m~XD1CuI<k8$nNXd;2zVU0=!n`!C+O=qoP$%>
zc@2l1<)Sa-o^Ue7qb+KR6O3Nz=1lO&iqE=DX=|0Rn@J7;KJ%G;oE1#M-Frdf!wD`X
z?0tf5l1|YPARrR`(9I|SiAL&X!V~vHCYyK{k|O{Dgl?cqi8vhSmEQ8??O1QAM}TM#
nN5v_UffYd2w;a8m{}o^W-^qmk*A=;y00000NkvXXu0mjf5*>;S

literal 0
HcmV?d00001

diff --git a/demos/declarative/samegame/SamegameCore/pics/redStar.png b/demos/declarative/samegame/SamegameCore/pics/redStar.png
deleted file mode 100644
index 0a4dffe5839645aaf42749fe2cdfaf8003013c64..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 274
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggab^#U%!}9_$<v^iHo-U3d7N_rC
zQsg@nAi#1VoW;>Wzd^r3hV5|fh0v>^S7lg_dn!y-33;rg@r>K4A$~%v<?hYa#*uBY
zv7u*@jTd{=i$zbU*=cu7iuaX@{_T5QOqPd*q*EBXwO_1KI?AN|hH1}n#_uZn`tqVI
zMltc<{0xq+4QKNg+s0`1=!;&vo#M5OIxaz`hcY$W|Jwy+{rJjoC0+YA`<$*XK-V#N
My85}Sb4q9e0G-BJI{*Lx

diff --git a/demos/declarative/samegame/SamegameCore/pics/star.png b/demos/declarative/samegame/SamegameCore/pics/star.png
deleted file mode 100644
index defbde53ca489900adbd2eb6b6c83a97cab11e80..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 262
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE<hRxemd{22U45`9+AZi
z4BWyX%*Zfnjs#GUy~NYkmHh?>52LDFw4%EPP-wEJi(`nz>AMp*@-aG!xSmf{=2|_i
zLu{}72m9aMUh$4ogmk3>-(20}l#+gI+wVy$@7*a@Pfxg!TphW~SnJJep#`V5_&2oX
zGKzb?-_Ix*$9&r&`Sx->kE??7n57fgP2yMYej9el^rgZfhVAn2L}oCaf5WX}%k+h*
zPmsmpiH(Ztt$VlQS|``tm&i?D@b>DQ0;4BC86G^hUGg<V4dhD(Pgg&ebxsLQ03$Y9
ALjV8(

diff --git a/demos/declarative/samegame/SamegameCore/samegame.js b/demos/declarative/samegame/SamegameCore/samegame.js
index bb587bc6f3..4c5cbe5bb3 100755
--- a/demos/declarative/samegame/SamegameCore/samegame.js
+++ b/demos/declarative/samegame/SamegameCore/samegame.js
@@ -4,10 +4,11 @@ var maxColumn = 10;
 var maxRow = 15;
 var maxIndex = maxColumn*maxRow;
 var board = new Array(maxIndex);
-var blockSrc = "SamegameCore/BoomBlock.qml";
+var blockSrc = "BoomBlock.qml";
 var scoresURL = "";
 var gameDuration;
 var component = Qt.createComponent(blockSrc);
+var highScoreBar = 0;
 
 // Index function used instead of a 2D array
 function index(column, row)
@@ -152,11 +153,15 @@ function victoryCheck()
     // Checks for game over
     if (deservesBonus || !(floodMoveCheck(0, maxRow - 1, -1))) {
         gameDuration = new Date() - gameDuration;
-        nameInputDialog.show("You won! Please enter your name:                 ");
-        nameInputDialog.initialWidth = nameInputDialog.text.width + 20;
-        if (nameInputDialog.name == "")
-            nameInputDialog.width = nameInputDialog.initialWidth;
-        nameInputDialog.text.opacity = 0; // Just a spacer
+        if(gameCanvas.score > highScoreBar){
+            nameInputDialog.show("You won! Please enter your name:                 ");
+            nameInputDialog.initialWidth = nameInputDialog.text.width + 20;
+            if (nameInputDialog.name == "")
+                nameInputDialog.width = nameInputDialog.initialWidth;
+            nameInputDialog.text.opacity = 0; // Just a spacer
+        }else{
+            dialog.show("You won!");
+        }
     }
 }
 
@@ -203,6 +208,30 @@ function createBlock(column,row)
     return true;
 }
 
+function initHighScoreBar()
+{
+    if(scoresURL != "")
+        return true;//don't query remote scores
+    var db = openDatabaseSync(
+        "SameGameScores",
+        "1.0",
+        "Local SameGame High Scores",
+        100
+    );
+    db.transaction(
+        function(tx) {
+            tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)');
+            // Only show results for the current grid size
+            var rs = tx.executeSql('SELECT * FROM Scores WHERE gridSize = "'
+                + maxColumn + "x" + maxRow + '" ORDER BY score desc LIMIT 10');
+            if(rs.rows.length < 10)
+                highScoreBar = 0;
+            else 
+                highScoreBar = rs.rows.item(rs.rows.length - 1).score;
+        }
+    );
+}
+
 function saveHighScore(name)
 {
     if (scoresURL != "")
@@ -235,6 +264,8 @@ function saveHighScore(name)
                     + rs.rows.item(i).score + ' points in '
                     + rs.rows.item(i).time + ' seconds.\n';
             }
+            if(rs.rows.length == 10)
+                highScoreBar = rs.rows.item(9).score;
             dialog.show(r);
         }
     );
diff --git a/demos/declarative/samegame/samegame.qml b/demos/declarative/samegame/samegame.qml
index ab64156278..0defdeec3c 100644
--- a/demos/declarative/samegame/samegame.qml
+++ b/demos/declarative/samegame/samegame.qml
@@ -39,13 +39,14 @@
 **
 ****************************************************************************/
 
-import QtQuick 1.1
+import QtQuick 2.0
+import Qt.labs.particles 2.0
 import "SamegameCore"
 import "SamegameCore/samegame.js" as Logic
 
 Rectangle {
     id: screen
-    width: 490; height: 720
+    width: 360; height: 640
     property bool inAnotherDemo: false //Samegame often is just plonked straight into other demos
 
     SystemPalette { id: activePalette }
@@ -74,6 +75,36 @@ Rectangle {
                 anchors.fill: parent; onClicked: Logic.handleClick(mouse.x,mouse.y);
             }
         }
+        Item{
+            ParticleSystem{ id: particleSystem; }
+            ColoredParticle {
+                system: particleSystem
+                particles: ["red"]
+                color: Qt.darker("red");//Actually want desaturated...
+                image: "SamegameCore/pics/particle.png"
+                colorVariation: 0.4
+                alpha: 0.1
+            }
+            ColoredParticle {
+                system: particleSystem
+                particles: ["green"]
+                color: Qt.darker("green");//Actually want desaturated...
+                image: "SamegameCore/pics/particle.png"
+                colorVariation: 0.4
+                alpha: 0.1
+            }
+            ColoredParticle {
+                system: particleSystem
+                particles: ["blue"]
+                color: Qt.darker("blue");//Actually want desaturated...
+                image: "SamegameCore/pics/particle.png"
+                colorVariation: 0.4
+                alpha: 0.1
+            }
+            id: aboveGameCanvas
+            anchors.fill: gameCanvas
+            z: gameCanvas.z + 1
+        }
     }
 
     Dialog { id: dialog; anchors.centerIn: parent; z: 21 }
diff --git a/demos/declarative/shadereffects/Slider.qml b/demos/declarative/shadereffects/Slider.qml
new file mode 100644
index 0000000000..e31335d984
--- /dev/null
+++ b/demos/declarative/shadereffects/Slider.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Item {
+    property real value: bar.x / (foo.width - bar.width)
+    Item {
+        id: foo
+        width: parent.width - 4
+        height: 6
+        anchors.centerIn: parent
+
+        Rectangle {
+            height: parent.height
+            anchors.left: parent.left
+            anchors.right: bar.horizontalCenter
+            color: "blue"
+            radius: 3
+        }
+        Rectangle {
+            height: parent.height
+            anchors.left: bar.horizontalCenter
+            anchors.right: parent.right
+            color: "gray"
+            radius: 3
+        }
+        Rectangle {
+            anchors.fill: parent
+            color: "transparent"
+            radius: 3
+            border.width: 2
+            border.color: "black"
+        }
+
+        Rectangle {
+            id: bar
+            y: -7
+            width: 20
+            height: 20
+            radius: 15
+            color: "white"
+            border.width: 2
+            border.color: "black"
+            MouseArea {
+                anchors.fill: parent
+                drag.target: parent
+                drag.axis: Drag.XAxis
+                drag.minimumX: 0
+                drag.maximumX: foo.width - parent.width
+            }
+        }
+    }
+}
+
diff --git a/demos/declarative/shadereffects/face-smile.png b/demos/declarative/shadereffects/face-smile.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d66d725781730c7a9376a25113164f8882d9795
GIT binary patch
literal 15408
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
SNxgs4ATkn);&q}%LH`e8$k9yz

literal 0
HcmV?d00001

diff --git a/demos/declarative/shadereffects/qt-logo.png b/demos/declarative/shadereffects/qt-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d3e97eb36e9df80d7d7a4086c8fb8cae68dda68
GIT binary patch
literal 13923
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

literal 0
HcmV?d00001

diff --git a/demos/declarative/shadereffects/shader-demo.qml b/demos/declarative/shadereffects/shader-demo.qml
new file mode 100644
index 0000000000..1226064a5d
--- /dev/null
+++ b/demos/declarative/shadereffects/shader-demo.qml
@@ -0,0 +1,295 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Image {
+    width: 640
+    height: 360
+    source: "../snake/content/pics/background.png"
+
+    ShaderEffectSource {
+        id: theSource
+        sourceItem: theItem
+        smooth: true
+    }
+
+    function saturate(x) {
+        return Math.min(Math.max(x, 0), 1)
+    }
+
+    function sliderToColor(x) {
+        return Qt.rgba(saturate(Math.max(2 - 6 * x, 6 * x - 4)),
+                        saturate(Math.min(6 * x, 4 - 6 * x)),
+                        saturate(Math.min(6 * x - 2, 6 - 6 * x)))
+    }
+
+    Grid {
+        anchors.centerIn: parent
+        columns: 3
+
+        Item {
+            id: theItem
+            width: 180
+            height: 180
+            ListView {
+                anchors.centerIn: parent
+                width: 160
+                height: 140
+                clip: true
+                snapMode: ListView.SnapOneItem
+                model: VisualItemModel {
+                    Text {
+                        width: 160
+                        height: 140
+                        horizontalAlignment: Text.AlignHCenter
+                        verticalAlignment: Text.AlignVCenter
+                        font.pixelSize: 120
+                        font.family: "Times"
+                        color: "blue"
+                        text: "Qt"
+                    }
+                    Image {
+                        width: 160
+                        height: 140
+                        source: "qt-logo.png"
+                        smooth: true
+                    }
+                    Image {
+                        width: 160
+                        height: 140
+                        source: "face-smile.png"
+                        smooth: true
+                    }
+                }
+            }
+        }
+        ShaderEffectItem {
+            width: 180
+            height: 180
+            property variant source: theSource
+            property real amplitude: 0.04 * wobbleSlider.value
+            property real frequency: 20
+            property real time: 0
+            NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 }
+            fragmentShader:
+                "uniform highp float amplitude;" +
+                "uniform highp float frequency;" +
+                "uniform highp float time;" +
+                "uniform sampler2D source;" +
+                "varying highp vec2 qt_TexCoord0;" +
+                "void main() {" +
+                "    highp vec2 p = sin(time + frequency * qt_TexCoord0);" +
+                "    gl_FragColor = texture2D(source, qt_TexCoord0 + amplitude * vec2(p.y, -p.x));" +
+                "}"
+            Slider {
+                id: wobbleSlider
+                anchors.left: parent.left
+                anchors.right: parent.right
+                anchors.bottom: parent.bottom
+                height: 40
+            }
+        }
+        ShaderEffectItem {
+            width: 180
+            height: 180
+            property variant source: theSource
+            property variant shadow: ShaderEffectSource {
+                smooth: true
+                sourceItem: ShaderEffectItem {
+                    width: theItem.width
+                    height: theItem.height
+                    property variant delta: Qt.size(0.0, 1.0 / height)
+                    property variant source: ShaderEffectSource {
+                        smooth: true
+                        sourceItem: ShaderEffectItem {
+                            width: theItem.width
+                            height: theItem.height
+                            property variant delta: Qt.size(1.0 / width, 0.0)
+                            property variant source: theSource
+                            fragmentShader: "
+                                uniform sampler2D source;
+                                uniform highp vec2 delta;
+                                varying highp vec2 qt_TexCoord0;
+                                void main() {
+                                    gl_FragColor = 0.0538 * texture2D(source, qt_TexCoord0 - 3.182 * delta)
+                                                 + 0.3229 * texture2D(source, qt_TexCoord0 - 1.364 * delta)
+                                                 + 0.2466 * texture2D(source, qt_TexCoord0)
+                                                 + 0.3229 * texture2D(source, qt_TexCoord0 + 1.364 * delta)
+                                                 + 0.0538 * texture2D(source, qt_TexCoord0 + 3.182 * delta);
+                                }"
+                        }
+                    }
+                    fragmentShader: "
+                        uniform sampler2D source;
+                        uniform highp vec2 delta;
+                        varying highp vec2 qt_TexCoord0;
+                        void main() {
+                            gl_FragColor = 0.0538 * texture2D(source, qt_TexCoord0 - 3.182 * delta)
+                                         + 0.3229 * texture2D(source, qt_TexCoord0 - 1.364 * delta)
+                                         + 0.2466 * texture2D(source, qt_TexCoord0)
+                                         + 0.3229 * texture2D(source, qt_TexCoord0 + 1.364 * delta)
+                                         + 0.0538 * texture2D(source, qt_TexCoord0 + 3.182 * delta);
+                        }"
+                }
+            }
+            property real angle: 0
+            property variant offset: Qt.point(15.0 * Math.cos(angle), 15.0 * Math.sin(angle))
+            NumberAnimation on angle { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 6000 }
+            property variant delta: Qt.size(offset.x / width, offset.y / height)
+            property real darkness: shadowSlider.value
+            fragmentShader: "
+                uniform highp vec2 offset;
+                uniform sampler2D source;
+                uniform sampler2D shadow;
+                uniform highp float darkness;
+                uniform highp vec2 delta;
+                varying highp vec2 qt_TexCoord0;
+                void main() {
+                    lowp vec4 fg = texture2D(source, qt_TexCoord0);
+                    lowp vec4 bg = texture2D(shadow, qt_TexCoord0 + delta);
+                    gl_FragColor = fg + vec4(0., 0., 0., darkness * bg.a) * (1. - fg.a);
+                }"
+            Slider {
+                id: shadowSlider
+                anchors.left: parent.left
+                anchors.right: parent.right
+                anchors.bottom: parent.bottom
+                height: 40
+            }
+        }
+        ShaderEffectItem {
+            width: 180
+            height: 180
+            property variant source: theSource
+            property variant delta: Qt.size(0.5 / width, 0.5 / height)
+            fragmentShader: "
+                uniform sampler2D source;
+                uniform highp vec2 delta;
+                uniform highp float qt_Opacity;
+                varying highp vec2 qt_TexCoord0;
+                void main() {
+                    lowp vec4 tl = texture2D(source, qt_TexCoord0 - delta);
+                    lowp vec4 tr = texture2D(source, qt_TexCoord0 + vec2(delta.x, -delta.y));
+                    lowp vec4 bl = texture2D(source, qt_TexCoord0 - vec2(delta.x, -delta.y));
+                    lowp vec4 br = texture2D(source, qt_TexCoord0 + delta);
+                    lowp vec4 gx = (tl + bl) - (tr + br);
+                    lowp vec4 gy = (tl + tr) - (bl + br);
+                    gl_FragColor.xyz = vec3(0.);
+                    gl_FragColor.w = clamp(dot(sqrt(gx * gx + gy * gy), vec4(1.)), 0., 1.) * qt_Opacity;
+                }"
+        }
+        ShaderEffectItem {
+            width: 180
+            height: 180
+            property variant source: theSource
+            property color tint: sliderToColor(colorizeSlider.value)
+            fragmentShader: "
+                uniform sampler2D source;
+                uniform lowp vec4 tint;
+                uniform lowp float qt_Opacity;
+                varying highp vec2 qt_TexCoord0;
+                void main() {
+                    lowp vec4 c = texture2D(source, qt_TexCoord0);
+                    lowp float lo = min(min(c.x, c.y), c.z);
+                    lowp float hi = max(max(c.x, c.y), c.z);
+                    gl_FragColor = qt_Opacity * vec4(mix(vec3(lo), vec3(hi), tint.xyz), c.w);
+                }"
+            Slider {
+                id: colorizeSlider
+                anchors.left: parent.left
+                anchors.right: parent.right
+                anchors.bottom: parent.bottom
+                height: 40
+            }
+        }
+        ShaderEffectItem {
+            width: 180
+            height: 180
+            mesh: GridMesh { resolution: Qt.size(10, 10) }
+            property variant source: theSource
+            property real bend: 0
+            property real minimize: 0
+            property real side: genieSlider.value
+            SequentialAnimation on bend {
+                loops: Animation.Infinite
+                NumberAnimation { to: 1; duration: 700; easing.type: Easing.InOutSine }
+                PauseAnimation { duration: 1600 }
+                NumberAnimation { to: 0; duration: 700; easing.type: Easing.InOutSine }
+                PauseAnimation { duration: 1000 }
+            }
+            SequentialAnimation on minimize {
+                loops: Animation.Infinite
+                PauseAnimation { duration: 300 }
+                NumberAnimation { to: 1; duration: 700; easing.type: Easing.InOutSine }
+                PauseAnimation { duration: 1000 }
+                NumberAnimation { to: 0; duration: 700; easing.type: Easing.InOutSine }
+                PauseAnimation { duration: 1300 }
+            }
+            vertexShader: "
+                uniform highp mat4 qt_ModelViewProjectionMatrix;
+                uniform highp float bend;
+                uniform highp float minimize;
+                uniform highp float side;
+                uniform highp float width;
+                uniform highp float height;
+                attribute highp vec4 qt_Vertex;
+                attribute highp vec2 qt_MultiTexCoord0;
+                varying highp vec2 qt_TexCoord0;
+                void main() {
+                    qt_TexCoord0 = qt_MultiTexCoord0;
+                    highp vec4 pos = qt_Vertex;
+                    pos.y = mix(qt_Vertex.y, height, minimize);
+                    highp float t = pos.y / height;
+                    t = (3. - 2. * t) * t * t;
+                    pos.x = mix(qt_Vertex.x, side * width, t * bend);
+                    gl_Position = qt_ModelViewProjectionMatrix * pos;
+                }"
+            Slider {
+                id: genieSlider
+                anchors.left: parent.left
+                anchors.right: parent.right
+                anchors.bottom: parent.bottom
+                height: 40
+            }
+        }
+    }
+}
diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc
index dbc8806742..f2e24f2fa7 100644
--- a/doc/src/declarative/modules.qdoc
+++ b/doc/src/declarative/modules.qdoc
@@ -310,6 +310,7 @@ It is defined by a plain text file named "qmldir" that contains one or more line
 <TypeName> [<InitialVersion>] <File>
 internal <TypeName> <File>
 plugin <Name> [<Path>]
+typeinfo <File>
 \endcode
 
 \bold {# <Comment>} lines are used for comments. They are ignored by the QML engine.
@@ -350,6 +351,14 @@ plugin file, or a relative path from the directory containing the \c qmldir file
 containing the plugin file. By default the engine searches for the plugin library in the directory that contains the \c qmldir
 file. The plugin search path can be queried with QDeclarativeEngine::pluginPathList() and modified using QDeclarativeEngine::addPluginPath(). When running the \l {QML Viewer}, use the \c -P option to add paths to the plugin search path.
 
+\bold {typeinfo <File>} lines add \l{Writing a qmltypes file}{type description files} to
+the module that can be read by QML tools such as Qt Creator to get information about the
+types defined by the module's plugins. <File> is the (relative) file name of a .qmltypes
+file.
+
+Without such a file QML tools may be unable to offer features such as code completion
+for the types defined in your plugins.
+
 
 \section1 Debugging
 
@@ -358,5 +367,119 @@ when there are problems with finding and loading modules. See
 \l{Debugging module imports} for more information.
 
 
+\section1 Writing a qmltypes file
+
+QML modules may refer to one or more type information files in their
+\l{Writing a qmldir file}{qmldir} file. These usually have the .qmltypes
+extension and are read by external tools to gain information about
+types defined in plugins.
+
+As such qmltypes files have no effect on the functionality of a QML module.
+Their only use is to allow tools such as Qt Creator to provide code completion,
+error checking and other functionality to users of your module.
+
+Any module that uses plugins should also ship a type description file.
+
+The best way to create a qmltypes file for your module is to generate it
+using the \c qmlplugindump tool that is provided with Qt.
+
+Example:
+If your module is in \c /tmp/imports/My/Module, you could run
+\code
+qmlplugindump My.Module 1.0 /tmp/imports > /tmp/imports/My/Module/mymodule.qmltypes
+\endcode
+to generate type information for your module. Afterwards, add the line
+\code
+typeinfo mymodule.qmltypes
+\endcode
+to \c /tmp/imports/My/Module/qmldir to register it.
+
+While the qmldump tool covers most cases, it does not work if:
+\list
+\o The plugin uses a \l{QDeclarativeCustomParser}. The component that uses
+   the custom parser will not get its members documented.
+\o The plugin can not be loaded. In particular if you cross-compiled
+   the plugin for a different architecture, qmldump will not be able to
+   load it.
+\endlist
+
+In case you have to create a qmltypes file manually or need to adjust
+an existing one, this is the file format:
+
+\qml
+import QtQuick.tooling 1.0
+
+// There always is a single Module object that contains all
+// Component objects.
+Module {
+    // A Component object directly corresponds to a type exported
+    // in a plugin with a call to qmlRegisterType.
+    Component {
+
+        // The name is a unique identifier used to refer to this type.
+        // It is recommended you simply use the C++ type name.
+        name: "QDeclarativeAbstractAnimation"
+
+        // The name of the prototype Component.
+        prototype: "QObject"
+
+        // The name of the default property.
+        defaultProperty: "animations"
+
+        // The name of the type containing attached properties
+        // and methods.
+        attachedType: "QDeclarativeAnimationAttached"
+
+        // The list of exports determines how a type can be imported.
+        // Each string has the format "URI/Name version" and matches the
+        // arguments to qmlRegisterType. Usually types are only exported
+        // once, if at all.
+        // If the "URI/" part of the string is missing that means the
+        // type should be put into the package defined by the URI the
+        // module was imported with.
+        // For example if this module was imported with 'import Foo 4.8'
+        // the Animation object would be found in the package Foo and
+        // QtQuick.
+        exports: [
+            "Animation 4.7",
+            "QtQuick/Animation 1.0"
+        ]
+
+        Property {
+            name: "animations";
+            type: "QDeclarativeAbstractAnimation"
+            // defaults to false, whether this property is read only
+            isReadonly: true
+            // defaults to false, whether the type of this property was a pointer in C++
+            isPointer: true
+            // defaults to false: whether the type actually is a QDeclarativeListProperty<type>
+            isList: true
+        }
+        Property { name: "loops"; type: "int" }
+        Property { name: "name"; type: "string" }
+        Property { name: "loopsEnum"; type: "Loops" }
+
+        Enum {
+            name: "Loops"
+            values: {
+                "Infinite": -2,
+                "OnceOnly": 1
+            }
+        }
+
+        // Signal and Method work the same way. The inner Parameter
+        // declarations also support the isReadonly, isPointer and isList
+        // attributes which mean the same as for Property
+        Method { name: "restart" }
+        Signal { name: "started" }
+        Signal {
+            name: "runningChanged"
+            Parameter { type: "bool" }
+            Parameter { name: "foo"; type: "bool" }
+        }
+    }
+}
+\endqml
+
 */
 /
diff --git a/doc/src/declarative/qdeclarativeintro.qdoc b/doc/src/declarative/qdeclarativeintro.qdoc
index 02692de92c..ea2403ee76 100644
--- a/doc/src/declarative/qdeclarativeintro.qdoc
+++ b/doc/src/declarative/qdeclarativeintro.qdoc
@@ -320,6 +320,14 @@ Text {
 
 In the element documentation grouped properties are shown using the 'dot' notation.
 
+While you can bind the entire group at once, like below, note that setting any of the
+grouped properties will result in setting the group and thus invalidate the binding.
+\qml
+Text {
+    font: otherText.font
+}
+\endqml
+
 \section2 Attached Properties
 \target attached-properties
 
diff --git a/doc/src/snippets/declarative/models/views-models-delegates.qml b/doc/src/snippets/declarative/models/views-models-delegates.qml
index 2f76856ca6..e02cb1a11f 100644
--- a/doc/src/snippets/declarative/models/views-models-delegates.qml
+++ b/doc/src/snippets/declarative/models/views-models-delegates.qml
@@ -37,6 +37,7 @@
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
+import QtQuick 1.0
 
 //! [rectangle]
 Rectangle {
diff --git a/doc/src/snippets/declarative/models/visual-model-and-view.qml b/doc/src/snippets/declarative/models/visual-model-and-view.qml
index 4d42b6585c..824d57230f 100644
--- a/doc/src/snippets/declarative/models/visual-model-and-view.qml
+++ b/doc/src/snippets/declarative/models/visual-model-and-view.qml
@@ -37,6 +37,7 @@
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
+import QtQuick 1.0
 
 Rectangle {
     width: 200; height: 200
diff --git a/doc/src/snippets/declarative/mousearea/mousearea-snippet.qml b/doc/src/snippets/declarative/mousearea/mousearea-snippet.qml
index 03473bafda..6f5b61a0b3 100644
--- a/doc/src/snippets/declarative/mousearea/mousearea-snippet.qml
+++ b/doc/src/snippets/declarative/mousearea/mousearea-snippet.qml
@@ -65,7 +65,6 @@ Rectangle {
 //! [anchor fill]
 
 Rectangle {
-    id: button
     width: 100; height: 100
 
 //! [enable handlers]
@@ -79,7 +78,6 @@ Rectangle {
 }
 
 Rectangle {
-    id: button
     width: 100; height: 100
 
 //! [mouse handlers]
diff --git a/doc/src/snippets/declarative/states/statechangescript.qml b/doc/src/snippets/declarative/states/statechangescript.qml
index aa1246d3fc..03d03f8a98 100644
--- a/doc/src/snippets/declarative/states/statechangescript.qml
+++ b/doc/src/snippets/declarative/states/statechangescript.qml
@@ -37,6 +37,7 @@
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
+
 import QtQuick 1.0
 
 Item {
diff --git a/examples/declarative/declarative.pro b/examples/declarative/declarative.pro
index 927294ade6..cbeb7e9e26 100644
--- a/examples/declarative/declarative.pro
+++ b/examples/declarative/declarative.pro
@@ -4,7 +4,8 @@ TEMPLATE = subdirs
 SUBDIRS = \
    cppextensions \
    modelviews \
-   tutorials 
+   tutorials \
+   painteditem
 
 # plugins uses a 'Time' class that conflicts with symbian e32std.h also defining a class of the same name
 symbian:SUBDIRS -= plugins
diff --git a/examples/declarative/inputmethods/inputmethods.qmlproject b/examples/declarative/inputmethods/inputmethods.qmlproject
new file mode 100644
index 0000000000..d4909f8685
--- /dev/null
+++ b/examples/declarative/inputmethods/inputmethods.qmlproject
@@ -0,0 +1,16 @@
+import QmlProject 1.0
+
+Project {
+    /* Include .qml, .js, and image files from current directory and subdirectories */
+    QmlFiles {
+        directory: "."
+    }
+    JavaScriptFiles {
+        directory: "."
+    }
+    ImageFiles {
+        directory: "."
+    }
+    /* List of plugin directories passed to QML runtime */
+    // importPaths: [ " ../exampleplugin " ]
+}
diff --git a/examples/declarative/inputmethods/spellcheck/Key.qml b/examples/declarative/inputmethods/spellcheck/Key.qml
new file mode 100644
index 0000000000..c95a3f0b2c
--- /dev/null
+++ b/examples/declarative/inputmethods/spellcheck/Key.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+    property string text
+    property string displayText
+    property alias font: keyText.font
+    property int key: 0
+
+    id: root
+    radius: 2
+
+    width: 28
+    height: 28
+
+    gradient: Gradient {
+        GradientStop { position: 0.0; color: "darkgrey" }
+        GradientStop { position: 1.0; color: "grey" }
+    }
+
+    Text {
+        id: keyText
+
+        anchors.fill: parent
+
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+
+        font.pixelSize: 18
+        font.capitalization: keyboard.shift && displayText == "" ? Font.AllUppercase : Font.MixedCase
+
+        text: root.displayText != "" ? root.displayText : root.text
+
+        style: !mouseArea.pressed ? Text.Raised : Text.Normal
+        color: "white"
+        styleColor: "grey"
+    }
+
+    MouseArea {
+        id: mouseArea
+
+        anchors.fill: parent
+        onPressed: keyboard.keyPress(key, text)
+        onReleased: keyboard.keyRelease(key, text)
+    }
+}
diff --git a/examples/declarative/inputmethods/spellcheck/Keyboard.qml b/examples/declarative/inputmethods/spellcheck/Keyboard.qml
new file mode 100644
index 0000000000..533762e7ba
--- /dev/null
+++ b/examples/declarative/inputmethods/spellcheck/Keyboard.qml
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.inputcontext 1.0 as InputContext
+
+
+Rectangle {
+    id: keyboard
+
+    radius: 5
+    height: 122
+    width: 324
+
+    property bool shift: false
+
+    gradient: Gradient {
+        GradientStop { position: 0.0; color: "lightgrey" }
+        GradientStop { position: 1.0; color: "white" }
+    }
+
+    Column {
+        anchors.left: parent.left; anchors.right: parent.right
+        anchors.verticalCenter: parent.verticalCenter
+
+        spacing: 2
+
+        Row {
+            spacing: 2
+            anchors.horizontalCenter: parent.horizontalCenter
+
+            Key { key: Qt.Key_Q; text: "q"; }
+            Key { key: Qt.Key_W; text: "w"; }
+            Key { key: Qt.Key_E; text: "e"; }
+            Key { key: Qt.Key_R; text: "r"; }
+            Key { key: Qt.Key_T; text: "t"; }
+            Key { key: Qt.Key_Y; text: "y"; }
+            Key { key: Qt.Key_U; text: "u"; }
+            Key { key: Qt.Key_I; text: "i"; }
+            Key { key: Qt.Key_O; text: "o"; }
+            Key { key: Qt.Key_P; text: "p"; }
+        }
+        Row {
+            spacing: 2
+            anchors.horizontalCenter: parent.horizontalCenter
+
+            Key { key: Qt.Key_A; text: "a"; }
+            Key { key: Qt.Key_S; text: "s"; }
+            Key { key: Qt.Key_D; text: "d"; }
+            Key { key: Qt.Key_F; text: "f"; }
+            Key { key: Qt.Key_G; text: "g"; }
+            Key { key: Qt.Key_H; text: "h"; }
+            Key { key: Qt.Key_J; text: "j"; }
+            Key { key: Qt.Key_K; text: "k"; }
+            Key { key: Qt.Key_L; text: "l"; }
+        }
+        Row {
+            spacing: 2
+            anchors.horizontalCenter: parent.horizontalCenter
+
+            Key { key: Qt.Key_Shift; displayText: "shift"; width: 50 }
+            Key { key: Qt.Key_Z; text: "z"; }
+            Key { key: Qt.Key_X; text: "x"; }
+            Key { key: Qt.Key_C; text: "c"; }
+            Key { key: Qt.Key_V; text: "v"; }
+            Key { key: Qt.Key_B; text: "b"; }
+            Key { key: Qt.Key_N; text: "n"; }
+            Key { key: Qt.Key_M; text: "m"; }
+            Key { key: Qt.Key_Comma; text: ","; }
+            Key { key: Qt.Key_Period; text: "."; }
+        }
+
+        Row {
+            spacing: 2
+            anchors.horizontalCenter: parent.horizontalCenter
+
+            Key { key: Qt.Key_Enter; text: "\n"; displayText: "enter"; width: 90 }
+            Key { key: Qt.Key_Space; text: " "; displayText: "space"; width: 138}
+            Key { key: Qt.Key_Backspace; displayText: "backspace"; width: 90 }
+        }
+    }
+
+    function keyPress(key, text)
+    {
+        if (key == Qt.Key_Shift)
+            keyboard.shift = !keyboard.shift
+        else if (keyboard.shift)
+            InputContext.sendKeyPress(key, text.toUpperCase(), Qt.ShiftModifier)
+        else
+            InputContext.sendKeyPress(key, text)
+    }
+
+    function keyRelease(key, text)
+    {
+        if (key != Qt.Key_Shift) {
+            if (keyboard.shift) {
+                InputContext.sendKeyRelease(key, text.toUpperCase(), Qt.ShiftModifier)
+                keyboard.shift = false
+            } else {
+                InputContext.sendKeyRelease(key, text)
+            }
+        }
+    }
+}
diff --git a/examples/declarative/inputmethods/spellcheck/WordSuggestions.qml b/examples/declarative/inputmethods/spellcheck/WordSuggestions.qml
new file mode 100644
index 0000000000..5c4e9cb4a2
--- /dev/null
+++ b/examples/declarative/inputmethods/spellcheck/WordSuggestions.qml
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.inputcontext 1.0 as InputContext
+
+ListView {
+    property int globalX: InputContext.microFocus.x + ((InputContext.microFocus.width - width) / 2)
+    property int globalY: InputContext.microFocus.y + InputContext.microFocus.height
+
+    x: parent.mapToItem(null, globalX, globalY).x
+    y: parent.mapToItem(null, globalX, globalY).y
+
+    visible: suggestionModel.count > 0
+
+    width: 200
+    height: 70
+
+    InputContext.KeyFilter {
+        onPressed: event.accepted = filterKeyPress(event.key, event.text)
+    }
+
+    InputContext.MouseHandler {
+        onPressed: {
+            if (cursor < 0 || cursor >= InputContext.preeditText.length)
+                InputContext.commit()
+        }
+    }
+
+    model: XmlListModel {
+        id: suggestionModel
+
+        query: "/query/results/s:suggestion"
+        namespaceDeclarations: "declare namespace s=\"http://www.inktomi.com/\";"
+        source: InputContext.preeditText.length > 4 ? "http://query.yahooapis.com/v1/public/yql?q=select * from search.spelling where query=\"" + InputContext.preeditText + "\"" : ""
+
+        XmlRole { name: "suggestion"; query: "string()" }
+    }
+
+    delegate: Rectangle {
+        radius: 2
+        color: "lightsteelblue"
+
+        anchors.horizontalCenter: parent.horizontalCenter
+
+        width: suggestionText.implicitWidth + 2
+        height: suggestionText.implicitHeight + 2
+
+        Text {
+            id: suggestionText
+
+            font: InputContext.font
+            text: suggestion
+
+            anchors.fill: parent
+            anchors.margins: 1
+        }
+        MouseArea {
+            anchors.fill: parent
+            onClicked: InputContext.commit(suggestion)
+        }
+    }
+}
diff --git a/examples/declarative/inputmethods/spellcheck/spellcheck.qml b/examples/declarative/inputmethods/spellcheck/spellcheck.qml
new file mode 100644
index 0000000000..57e81451a6
--- /dev/null
+++ b/examples/declarative/inputmethods/spellcheck/spellcheck.qml
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.inputcontext 1.0 as InputContext
+
+Item {
+    width: 360
+    height: 240
+
+    function filterKeyPress(key, text)
+    {
+        switch (key) {
+        case Qt.Key_Enter:
+        case Qt.Key_Return:
+        case Qt.Key_Space:
+        case Qt.Key_Tab:
+            if (InputContext.preeditText != "")
+                InputContext.commit();
+            break;
+        case Qt.Key_Backspace:
+            if (InputContext.preeditText != "") {
+                InputContext.preeditText = InputContext.preeditText.substr(0, InputContext.preeditText.length - 1);
+                return true;
+            }
+            break;
+        default:
+            if (text != "") {
+                InputContext.preeditText += text
+                return true;
+            } else if (InputContext.preeditText != "") {
+                InputContext.commit();
+            }
+            break;
+        }
+        return false;
+    }
+
+    Rectangle {
+        anchors.left: parent.left; anchors.top: parent.top; anchors.right: parent.right;
+        anchors.bottom: keyboard.top
+        anchors.margins: 2
+
+        border.width: 1
+        radius: 2
+
+        TextEdit {
+            id: textEdit
+
+            wrapMode: TextEdit.WordWrap
+
+            anchors.fill: parent
+            anchors.margins: 2
+        }
+
+        MouseArea {
+            anchors.fill: textEdit
+
+            onPressed: {
+                mouse.accepted = false
+                var position = textEdit.positionAt(mouse.x, mouse.y);
+                if (position != textEdit.cursorPosition) {
+                    InputContext.commit()
+                    textEdit.cursorPosition = textEdit.positionAt(mouse.x, mouse.y)
+                    textEdit.selectWord()
+                    var word = textEdit.selectedText
+                    if (word != "") {
+                        InputContext.commit("");
+                        InputContext.preeditText = word;
+                    }
+                }
+            }
+        }
+    }
+
+    WordSuggestions {}
+
+    Keyboard {
+        id: keyboard
+        anchors.horizontalCenter: parent.horizontalCenter
+
+        y: parent.height
+
+        states: [
+            State {
+                name: "visible"
+                PropertyChanges { target: keyboard; y: parent.height - height }
+                when: InputContext.softwareInputPanelVisible
+            },
+            State {
+                name: "hidden"
+                PropertyChanges { target: keyboard; y: parent.height }
+                when: !InputContext.softwareInputPanelVisible
+            }
+        ]
+        transitions: Transition {
+            NumberAnimation { properties: "y"; easing.type: Easing.InOutQuad; duration: 100 }
+        }
+    }
+}
diff --git a/examples/declarative/painteditem/main.cpp b/examples/declarative/painteditem/main.cpp
new file mode 100644
index 0000000000..1308325ca3
--- /dev/null
+++ b/examples/declarative/painteditem/main.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/qapplication.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qsgpainteditem.h>
+
+class MyPaintItem : public QSGPaintedItem
+{
+    Q_OBJECT
+public:
+    virtual void paint(QPainter *p)
+    {
+        QRectF rect(0, 0, width(), height());
+        rect.adjust(10, 10, -10, -10);
+        p->setPen(QPen(Qt::black, 20));
+        p->setBrush(Qt::yellow);
+        p->drawEllipse(rect);
+        p->setPen(Qt::black);
+        p->setFont(QFont(QLatin1String("Times"), qRound(rect.height() / 2)));
+        p->drawText(rect, Qt::AlignCenter, QLatin1String(":-)"));
+    }
+};
+
+int main(int argc, char ** argv)
+{
+    QApplication app(argc, argv);
+
+    qmlRegisterType<MyPaintItem>("MyModule", 1, 0, "MyPaintItem");
+
+    QGLFormat f = QGLFormat::defaultFormat();
+    f.setSampleBuffers(true);
+    QSGView view(f);
+    view.setResizeMode(QSGView::SizeRootObjectToView);
+    view.setSource(QUrl::fromLocalFile("myfile.qml"));
+    view.show();
+    view.raise();
+
+    return app.exec();
+}
+
+#include "main.moc"
diff --git a/examples/declarative/painteditem/myfile.qml b/examples/declarative/painteditem/myfile.qml
new file mode 100644
index 0000000000..bc4bd2664b
--- /dev/null
+++ b/examples/declarative/painteditem/myfile.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import MyModule 1.0
+
+Rectangle {
+    width: 480
+    height: 480
+    gradient: Gradient {
+        GradientStop { position: 0.0; color: "#00249a" }
+        GradientStop { position: 0.7; color: "#ffd94f" }
+        GradientStop { position: 1.0; color: "#ffa322" }
+    }
+    MyPaintItem {
+        anchors.fill: parent
+        anchors.margins: 10
+        smooth: true
+    }
+}
diff --git a/examples/declarative/painteditem/painteditem.pro b/examples/declarative/painteditem/painteditem.pro
new file mode 100644
index 0000000000..5d7b9df074
--- /dev/null
+++ b/examples/declarative/painteditem/painteditem.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = painteditem
+
+QT += declarative
+
+macx: CONFIG -= app_bundle
+
+SOURCES += main.cpp
+
+CONFIG += console
+
+symbian {
+    TARGET.EPOCHEAPSIZE = 0x20000 0x5000000
+}
diff --git a/examples/declarative/particles/allsmiles/content/particle.png b/examples/declarative/particles/allsmiles/content/particle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c83896d22cdc3c352ff8db97b0b1f2cd2b27125
GIT binary patch
literal 861
zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!|4BqaRCwByS51%9Fbqx7be0e8!eRFS
z2Yvzn|DSN;zy*YakXV7l4%;>+uAJ)4!|9fhtYq5Mes-Q6Cx`#|iAbtLlW1enS0*|y
zF-AG6Gn?YQHEL+EwV9p=GaO)E)yZ7P#iXw|#tVf#fLG>e0M8MG5RhWevjLdwSw8|D
zuhsAfhEd!df^ArA-nL0W%try}N6#(n2}a&~HjZ3K1|mYlq5;_jfW`*`(KwJuF^0aF
zr|o?q9tcN*0bGIM4C4r3BJqHu(7x$~T@X|zFe7+8*#8m!?`2AGwkkTtGl1Oy=)z}^
za?OjA&6)WL6h>fq1P)}{8Ug2Y{)hlFC`Rwu^8|a|n->6<ftUj8wj$O5jPNi4;n;Yj
zRE(5<V&5$At~pUCGgbh}$}6YZKt|Yj+DTI{IvKXNjcPmQj-kP+dT2yb^<9-)WBd0i
zpR4>P9tZ))^CJcdb95FnFqIco-dA~TBvoZEtK3xiQ00Nnht$!z>dj77iw^4%*jqDp
zZD1CAt~vjv$|vGRaP<8{tX^>mj-pqPqBoYlt$tiP2UO4awgu8L>g9a^HftXLG|wl<
z_dubRj^6csCNE_t0!@Bc=vDb2Gx}h14<LlLf{$%!0E%;{VBx?zuL{2!>1K;yv1t6N
z@~vY~yv9W(!@+<H7vcwkQ%^ruxidaYW?WP8+%Z&W+}>w;iAO4L4;GiR<^30@7ZB=z
zn!ZBk!aAnfmthA}fMheB<pugYp0f@i<1>+Tv7T@{3nr@9t&K{~=@$rCk7(@3;zVH!
zvloHbj!dUC%TCG`;L#&_FJ$XtpU+m~XD1CuI<k8$nNXd;2zVU0=!n`!C+O=qoP$%>
zc@2l1<)Sa-o^Ue7qb+KR6O3Nz=1lO&iqE=DX=|0Rn@J7;KJ%G;oE1#M-Frdf!wD`X
z?0tf5l1|YPARrR`(9I|SiAL&X!V~vHCYyK{k|O{Dgl?cqi8vhSmEQ8??O1QAM}TM#
nN5v_UffYd2w;a8m{}o^W-^qmk*A=;y00000NkvXXu0mjf5*>;S

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/singlesmile.png b/examples/declarative/particles/allsmiles/content/singlesmile.png
new file mode 100644
index 0000000000000000000000000000000000000000..4087fa6b7f4b2373aa2e8c0debeed7735f666b18
GIT binary patch
literal 269
zcmeAS@N?(olHy`uVBq!ia0vp^@<1%d!3HF+d^$P@NO2Z;L>4nJ@c9Dq9L9U!=7a+U
z_j|fHhIn*7oqmw-umX?s+|2*~Pv7j+N}aNAffN6akj745p%8<)4`=cJ{vDxGb4mA+
zb}K)#SZi$~EBDTSXQuByw(n8AQ&;JvTYDWXO!La)*mHXY{i61WFE}H3ZbC)N?$h~2
zo)*rJj2oo<Ch>?&EKu5I{XTUANb*N$Lsd^fltZR^quW337jx9TJFh<|_Tx>t_8{-P
z!~%(TWlfrQ|FvwG@}_Lkx1O6JXXo!rds{vEX8514?#>6Z&o7<I#&=de_@=dOQCpZQ
P&?^j{u6{1-oD!M<P`7b0

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/sizeInOut.png b/examples/declarative/particles/allsmiles/content/sizeInOut.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a306ea21a2c78258ee015fa5d2669d1dc578f5e
GIT binary patch
literal 251
zcmeAS@N?(olHy`uVBq!ia0vp^4nWMv!3HGra#x6hIK@HkP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)77-Rj9+__!1As!3C9V-A&iT2y
zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&AiKgmT^vIsF1Ma`=WAvVU^#e*v7o{H!~f@k
zJ-v@pC+w(P8Wf+#U1G7&PhXmMU8c0}n%Twww5C`*YOpN}JhK1yG4*>D4?9`;&+JI-
lQv4-hu<Y`&p6Xp|>J(UI1>!6|9|YRK;OXk;vd$@?2>><9Q0xEz

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/smileMask.png b/examples/declarative/particles/allsmiles/content/smileMask.png
new file mode 100644
index 0000000000000000000000000000000000000000..65a0143e9ecde82605a4046e4afb4c04f4fe36b4
GIT binary patch
literal 259
zcmV+e0sQ`nP)<h;3K|Lk000e1NJLTq0018V0015c1^@s6)bhog00009a7bBm000h6
z000i00p9kUR{#J2wMj%lR7i>Kmq`x5AP7aV>HV*4SDK(G-vM;dzcL1SpyCjSE0VoJ
z)o=ncZi0J)a{!?M4np6mD$e5s7X6lRE3oKa%G^yy;V)=cZWd{I5E~{WbEz82KE!4U
zZl)jJleBS=^FXyhcf00j>TtS#+9QqMde9gR9vkf~W6(7p4FHms`RXm#9Y0%Y%V47M
zQbVR44t8|Sw>~zmuX8uJ^%I);mom2spz?eC(~xxRyW|-_W`1Qi96hv`eSH7`002ov
JPDHLkV1h1hXf^-<

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite.png b/examples/declarative/particles/allsmiles/content/squarefacesprite.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9a5d5fccebbabbf83c5a36b67752bd1234846d3
GIT binary patch
literal 496
zcmV<M0T2F(P)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J3qDe$SRCt{2+wE?IAP|M&q3M0sy>j-Ki4wqJn88@zlQhjD`j9Tl
zM{JUFvcxAf%CWJ->|-NVz%>^eJKWwIuo6Bs02_OSosMu`(1g?&$gr^^?Vos#ko!YN
zC$9({oxCEyno8w7t2V#V)UgB`+rz$mqSqD^WtpaqCD_<rcDJMVF0dcd)UgB`+tXIh
z(R0p{FUAN>9ZRsWXKfav<P}jZMny!DVqDVHu>>1?*6u#hdn3bsOjE}aY-~^aa_UmM
zKv|}#V+l64m#vz*Xf71>?gBQphppO2ADxO>&cVixwAK6Q+6Gw8!N!iZ)w?bu4TuOf
z_DsyXE}BHG!m+VO&%b=4=WM&XyjJ0*y;bU!Ws&yQ`5a|$#qU<xf3r)YRp!3yqUrG7
ztMSs_r2a==VV7R5F1D||iO=^v^a?=E*FRBd87uA4V_x>m@h97!-**z>e?~{_&*2(>
z1Lw`!pUU}K|H<}DPP;NfM}Lfc*G+b}Z4DhA`*k+2>5^Au@AC`pFKq1l?Bl?)vH|6Q
mhK(I+-_d~9Zag-2nEeG?V91at6Cb$%0000<MNUMnLSTYVnDajX

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite2.png b/examples/declarative/particles/allsmiles/content/squarefacesprite2.png
new file mode 100644
index 0000000000000000000000000000000000000000..7106a520a4cc4eb7960953b83dfaabda8753c7df
GIT binary patch
literal 459
zcmV;+0W|)JP)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J3eMv+?RCt{2n!%F7AP@z?+W-IMcrjH(6L>)$tk8Y52tAQ8nVH=f
zj%>kCy!ae9Zksy|qKEj*iyODyy$8@!d<XzH?jG)#ink6S#ETahZro1y!><Dv4~Y&-
zK%&DE{3(mx>#Vc-N?GFqH|`R}L_cdLVmxlHtf@h1WL$0q+-=>?^Ufyvl{np8SyRJ*
zb%)?}E6jM`?(>#Pmk>hOUc1DMO<Ch&7PpdYF85u2$xSl~OCUedm0!+?U-oS7yRZIP
z?%VCoCVH+e+7CooQ^RPtvS!p@{bsyx_jwne=x3XM)`^~RQ|%YuYt)6it=oCtQt6@w
zFbdqbOB9>Y7|WA@7T4g$?Q~}oJ>5VJpynFfxZQ4f>T)Ll2e@&6L-vXOZ5`&G0N}>0
zUSF)yYXj)jh2zHEeCndSPFi>4xN)~|->T7nZKQ-7_YVK-0!u)m!xE6_ummJJEWzH}
zj%Yh@<L>58hd4b0cpo0&#%*<v2;gc$iW|4h{RDg*Dtn)h+sps}002ovPDHLkV1lgG
B*2n+=

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite3.png b/examples/declarative/particles/allsmiles/content/squarefacesprite3.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4e6f26856b969aee741feafa2c521dfe0385329
GIT binary patch
literal 476
zcmV<20VDp2P)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J3j!8s8RCt{2oY9ViAPhxeGyng~>=TJ&6fYgx?kwj#YUR{`0*$ej
zcUtkM-W<n`+s%DUB0_xS#f{tD-4louza@YhcZ9nh#VsI(dNYyX#_j3;@z(+5!$5~E
zV4%Ymyp*8xI_qkErNmgkjeCXr@r{19nK&O)Vl3dsy~;ft=%WVuIVHvdZrm%~@*2Ih
zR@%cHp~P6gjr&tKn^D*TX){_%DOH%4lo$)RaewL_zR^cBLqDg)Sip^YrTcN|a@D~3
zm=a?FH||w#Y3ZUg<n`?WZrm%}QXPGEDQ39_z!SNSt`1zwHBar$xOu?78?XMBt1i9a
zNURS{t!t)M%l)pN(v=)CoE|xN_P4p}q7d=Tu@}~ddgaT&GK)qzJ#+BDRCQ7C+J#5C
zv$5=pz8%m0o~pWJOru%u*8axQC7SH}_UiAcHF{<zX1KHOw|Dj^4<*Lp&SrHEQv)4h
z$*gDpH~6Rvwt#^STfjhvE!g&lHn{h4AB#AV37m^ZxN*C>GZMI~kmAPe=Kcjvj!Py=
S(&)$l0000<MNUMnLSTX?fakyf

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite4.png b/examples/declarative/particles/allsmiles/content/squarefacesprite4.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e094eed4a3780f1edeb003eadf588a2a6c7854b
GIT binary patch
literal 553
zcmV+^0@nSBP)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J3+et)0RCt{2oKbJXAPj_I+W-H{-OH%b2*}}Z_7>ksc}dBA5EF3R
zs<nLTRrsod^J0rlV;?)=0q$|d7Msp)9q<HybU<veJ=paKemQiZ4mL8e#b&a<_&7<5
zmnOQDLYnAO3VkDu&UscZze3trHS=b2XMONsUhyMyY$l%(@5>dvH_-Drq>WW0?{=`b
zE1nD{;vdCj@>%hoPV|{c`wVGgmG%0a0YJT2lP>BZix@XE-cagNN-3}3J)%xrkv3M%
zyqVk)$BWtHM{zyJy*u7|8I@89UeS@KhxwGxyuDVpBgb<^jaJ0CcgK6WqR-xF+h<4{
ztE|_1R3jo(YkeP26f@qJsY}n~d=6=2)yTUYEbgiw>*2ccjpDNStawAI3u4AxMVY$>
z%8#t0kN8nsHlGpi%Zc6wx&p9V^Vivk-!67fUg=omxS8>W>*$uc>YY?FEBow;)X^DV
z&OPm(!&R4+4ltCBy&Cvh_pka-y65Jq3!*#MXJtp~$@kn;b=d)Cdi-~`#V3lplh0%?
zRb7zngjH_J#%`Y3#?4|c<>--Hve;tZk$&qUrI04NltP;5QVMCJODUB04{gNG#Xc5s
rJUehM9*HeBl^xN6QH4}&v1#ldO8g*c4wt1d00000NkvXXu0mjf850ZD

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite5.png b/examples/declarative/particles/allsmiles/content/squarefacesprite5.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cfc5c7f8c2078601c10cc3f78a111ec1f3ae1ce
GIT binary patch
literal 623
zcmV-#0+9WQP)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J4AxT6*RCt{2n%i!~APhvI>i_>TeM%M(gn@W~Ei+Q3Zen~)Odwpm
zOBEbnzH(h`v1#l$h#BA#S8TEA>??qo;3NRC#h$_TF*r;J!B++{vBhSxfB3lXl=t-{
zS(Xudj?~Z_LKDbH^r>uy)X*!6ht^gy<NFpv@~Ld5ei5U*!lg<fHX~Ze4&me5`!<_Z
zXN3J^*Q-_a&i&SWkL0`AqnF<5(gQ}y^=dV{#VY-N%f8A7mo85{v13~c{)&2+{37hy
zwOo%4{mDW6#*dV5X%}{_!67ylLfBSXS#Nf};cxU1f(wl?0<jrU{y;}<M!2Q_du=S^
zU^Vg@Z$-Ts`PO9gOLQgm>PI%8`)wy^GU}Xj9vGJpn-L*i8RU33t>z!G>CrV2Om^}B
z-P?`^Z@`Lr=e{j$Vm<cgPY><xSpb_6?ZWmheW)dN&E_rNXMeFu_pG?F|NI`S-t2rg
zKV3==@@t6Ah)!j<e6Qm6*zCrJK3xz;tPO)x*)89zxNJU)4XvZ=+=Vnl%zVS^=p$zz
ztkzX$v!(fB=Nn#i=?Q?L+3YvGx5N6WY^yj*8eVll#F~Y(%Uf;Zi;at&@1a!}3oz5i
z?kDM_vY7dXc1A<MgXpo{m3`_+wvrwDVC1{&8+~O@Ih%b_U3X!}vW`P%U8EzVhAtf;
zHFW6+si8|p=sx%+w%Grfot(0q3C@0tEjE?CB7oZdnb=~}*nc~&R8NEay7vG8002ov
JPDHLkV1f#cFV6q~

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite6.png b/examples/declarative/particles/allsmiles/content/squarefacesprite6.png
new file mode 100644
index 0000000000000000000000000000000000000000..b040139a9e3278954a0baebc5d86ce1b85eb3293
GIT binary patch
literal 615
zcmV-t0+{`YP)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J48A(JzRCt{2n%i>2APhuNr~m)U^d(A&%Vj059`9y49@0ezjA9J7
zgm1+#UsCv<Y_g}Z(?+ZS=eT5(J)Nx$SPA}W0NG@(U`q;)3z{H>iHvNrXR?3h<0xvs
znCR3a#6+)1r@qqkYxSW_{mYfDK5rY+W3TT7{UWAoM{@U9h{vN{Y>^ORh(Sa?#{wJi
zS(u-){4Yn`*VBfT{l3OcHEO(@SM=PkHFtGE>RF{R;_Fjm*E}As#!8PlHsZ4~Rk^ao
z*VBeo{l3Q4Sfj_gn&`Cv$h6hd@w7v#YsU}|bq~!RZ}=WP#u#E_jzByVwL`}*MkRTu
zCWWWTi05?0*lxQ7G5PMOS>p{Sx`+g6%nyjiBYAy#JyvF|Z1o|kC2^X(sL!Jv{m#W6
zJ>Jzsubr^;q<iYObOKvXq#my^QJ<BaOQIYb@mbj#Cq1s}ck6#W<K4WX=K_>EZUG}Y
zf!!KJ)MsU<NmOGaJ}X<}rDd<r!>)bj9dEwtaxhy29K?q2ZvCFYZay%2Z|N8s=BY!r
zKaM^`+QIhLS<Qy`(a|-grw-X<&t^lf09YF^Lu8ZPBloTgqFJkOvdOmAckQ~20MCp;
zHrZD}w=VCkBw#ujy_zPQ>=A6!J^Iea%4Cz>qvPLop{NmJqEn9$6P<d5nCR3aq-)z9
z%MP;1UdB#0aaK0qx_Lx4*;Cm&8c^CHC7bMN>_0bAo^Iqg*mwW{002ovPDHLkV1lPI
BC8+=a

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacesprite7.png b/examples/declarative/particles/allsmiles/content/squarefacesprite7.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1e5e4e3393d2f1b70f1d64d7a996f5a8d4a7a0f
GIT binary patch
literal 581
zcmV-L0=oT)P)<h;3K|Lk000e1NJLTq006oG0015c1^@s6n}Y-i00009a7bBm000h6
z000i00p9kUR{#J3_en%SRCt{2n(MBFAPj_Iv+w`P?hm)I5-x>O5Sd9%a#l+}!0|%W
zySol&FQ3>BHrQrt-iZ<57#D1?&Dqp}k>Fbgzy^B++jH<SpbI{6BLf?3OZL|u2el|P
zNX!_L80Zv?p3y9`dGFj2B=X+ha!X<~e6BZ~WRExcOtYQ2j{k4}H&<Ou3pX?{G04c0
z7!99toxjJ7JIqb$b-X`PIR9&nsTH5lYf|fDG+a`cTN2a4jTxBdm&Ua6DF@HT_gRcP
z#_xT+i$;$nNx@6oYBYP&Q&-H|nAJ3E+}6iCYxG>>5MJ9Jf<{X8=;GY{R-uVmQND1-
zmiBA761F8@v;RpF8+~U<PVhJCP2(0DefHI5v|{53w@G3&nsFC>!niGzHF|FTXrCme
zMbws0ApIY*b1^Hi&(dMqFjsl89Mj6D96TT2x9XgWJ^|=i+pK*hyd%5!3!_!WZOO*B
zE)QkTG+R$Sg<X6zdetuL0ouWUosSEz@IBs6t}yPFHsU(Ebgj|S25hjc*;U`V%v@N5
z4Yo$jRTqhRtir(tyGQ$C9bH?h(g<v@d$kiix?J_kKF}J04R#N9)ie6cH@;wltr5O;
zfwmBg4s9VA9oj-LI<$poZ98Mx0XEpf*u01{vIAl92yC!T*)uwjs*r*Wwi){eyI<Q>
TRmK)?00000NkvXXu0mjfdI1XM

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacespriteX.png b/examples/declarative/particles/allsmiles/content/squarefacespriteX.png
new file mode 100644
index 0000000000000000000000000000000000000000..93a0181dd05e280365d72e92d074af0dbfcc50e5
GIT binary patch
literal 474
zcmV<00VV#4P)<h;3K|Lk000e1NJLTq004Xd0015c1^@s6?jm~c00009a7bBm000h6
z000i00p9kUR{#J3j7da6RA_<io6!!#AP7Ze+5i8tdul>Wl`BOwgPZKdAcu*g=r$^M
z)v{jH8BewYn+M?me&QzEk$nZ=3BCo8Y+p8UaCHcQI)yFSKJ3qWT<Roc!h<Oj9!yZe
ziS940jYizph%MR7GN1hLam40CwwUmq<5?SxcCuSPUYl(-d)TE*PHM$$5T7TpQCn+&
z9&Gp-UTZB?I71*dIPW=lK91PD;Y(wP&1vjx+Jfne8WQl3Kx}Z{czjgSxs4^CNG_|b
z&1vl6Cww%SmsQPtNqlZwqMz738;$s4wtji1EZLmM7EAiSKFenLJ)c&a%!{3O>A~30
zIefN6Szo@S>@-Zc>R|75>-E+)s^BiY6#vE4ZXSzHd6s#}szk41tGjfo08W*5bFaEm
zwwkBv(h;rd(!JQb^mfBY^P!S{Eg%w%^<wX0^NStCuf=7Lho+w4JKxL>_6*bV?6288
z=$xs9r+lQ@Jm{SK@+6ot;lY#%52mm`$dAhAhn-M=xrxf&5kT)mooom84~z8mOMy<v
QS^xk507*qoM6N<$f*Gvj+yDRo

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/content/squarefacespriteXX.png b/examples/declarative/particles/allsmiles/content/squarefacespriteXX.png
new file mode 100644
index 0000000000000000000000000000000000000000..3159efe2469623e469254804d08882eb3e75c49d
GIT binary patch
literal 255
zcmV<b0094qP)<h;3K|Lk000e1NJLTq0018V0015c1^@s6)bhog00009a7bBm000h6
z000i00p9kUR{#J2u}MThR7i>KmrD-7AP7XE>HV)vS6WnzgQ=gS&dQj9M=O}fluBs4
zxL8aAC)@y^362G@2FrvJSpDm3Jg%+-H^rQuk+qL_y5KsIwf1_77;1ETEs^#j9?RSO
zaw|c;hj=XQ+i*nnX7YO6aGgNJK4-+!1=mTfwbzsD-0e$rBPR65()wi1d%$QMJZd8f
z*!Rpu-s(MLh{iM<u4neqnE%fCQuy*mL(sD4(#!%P^8tKzH%Yc233&hj002ovPDHLk
FV1guRZ{Gj_

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/allsmiles/smile.qml b/examples/declarative/particles/allsmiles/smile.qml
new file mode 100644
index 0000000000..e37e8fa98e
--- /dev/null
+++ b/examples/declarative/particles/allsmiles/smile.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "white"
+    width: 310
+    height: 300
+    ParticleSystem{ id: sys }
+    Picture{
+        system: sys
+        anchors.fill: parent
+        image: "content/singlesmile.png"
+        onceOff: true
+    }
+    ColoredParticle{
+        system: sys
+        image: "content/particle.png"
+        color: "black"
+        alpha: 0.4
+        sizeTable: "content/sizeInOut.png"
+    }
+    TrailEmitter{
+        id: emitter
+        system: sys
+        emitting: false
+        particleDuration: 4000
+        maxParticles: 1200
+        anchors.fill: parent
+        particleSize: 32
+        speed: PointVector{ xVariation: 12; yVariation: 12 }
+    }
+    MouseArea{
+        anchors.fill: parent
+        onClicked: emitter.burst(1200);
+    }
+}
+
diff --git a/examples/declarative/particles/allsmiles/smilefactory.qml b/examples/declarative/particles/allsmiles/smilefactory.qml
new file mode 100644
index 0000000000..1b43adb1da
--- /dev/null
+++ b/examples/declarative/particles/allsmiles/smilefactory.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "goldenrod"
+    width: 400
+    height: 400
+    ParticleSystem{id:sys}
+    DeformableParticle{
+        system: sys
+        particles: ["goingLeft", "goingRight"]
+        image: "content/singlesmile.png"
+        rotation: 90
+        autoRotation: true
+    }
+    DeformableParticle{
+        system: sys
+        particles: ["goingDown"]
+        image: "content/squarefacespriteXX.png"
+        rotation: 180
+        yVector: PointVector{ y: 0.5; yVariation: 0.25; xVariation: 0.25; }
+    }
+    Timer{
+        running: true
+        repeat: false
+        interval: 100
+        onTriggered: emitA.emitting = true;
+    }
+    Timer{
+        running: true
+        repeat: false
+        interval: 4200
+        onTriggered: emitB.emitting = true;
+    }
+    Timer{
+        running: true
+        repeat: false
+        interval: 8400
+        onTriggered: emitC.emitting = true;
+    }
+    TrailEmitter{
+        id: emitA
+        x: 0
+        y: 120
+        system: sys
+        emitting: false
+        particle: "goingRight"
+        speed: PointVector{ x: 100 }
+        particleDuration: 4000
+        particlesPerSecond: 2
+        particleSize: 32
+    }
+    TrailEmitter{
+        id: emitB
+        x: 400
+        y: 240
+        system: sys
+        emitting: false
+        particle: "goingLeft"
+        speed: PointVector{ x: -100 }
+        particleDuration: 4000
+        particlesPerSecond: 2
+        particleSize: 32
+    }
+    TrailEmitter{
+        id: emitC
+        x: 0
+        y: 360
+        system: sys
+        emitting: false
+        particle: "goingDown"
+        speed: PointVector{ x: 100 }
+        particleDuration: 4000
+        particlesPerSecond: 2
+        particleSize: 32
+    }
+}
diff --git a/examples/declarative/particles/allsmiles/spriteparticles.qml b/examples/declarative/particles/allsmiles/spriteparticles.qml
new file mode 100644
index 0000000000..4bcb7081b8
--- /dev/null
+++ b/examples/declarative/particles/allsmiles/spriteparticles.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "goldenrod"
+    width: 400
+    height: 400
+    ColoredParticle{
+        id: test
+        particles: ["Test"]
+        image: "content/particle.png"
+        system: sys
+        z: 2
+        anchors.fill: parent
+        color: "#336666CC"
+        colorVariation: 0.0
+    }
+    SpriteParticle{
+        id: single
+        particles: ["Face"]
+        system: sys
+        z: 2
+        anchors.fill: parent
+        Sprite{
+            source: "content/squarefacesprite.png"
+            frames: 6
+            duration: 120
+        }
+    }
+    Mask{
+        id: mask
+        source: "content/smileMask.png"
+    }
+    TrailEmitter{
+        system: sys
+        particle: "Test"
+        anchors.fill: parent
+        id: particles2
+        particlesPerSecond: 6000
+        particleDuration: 720
+        emitting: true
+        particleSize: 10
+        shape: mask
+    }
+    TrailEmitter{
+        system: sys
+        particle: "Face"
+        anchors.fill: parent
+        id: particles
+        particlesPerSecond: 60
+        particleDuration: 1440
+        emitting: true
+        speed: PointVector{xVariation: 10; yVariation: 10;}
+        particleSize: 30
+        particleSizeVariation: 10
+        shape: mask
+    }
+    ParticleSystem{
+        id: sys
+        anchors.fill: parent
+    }
+
+}
diff --git a/examples/declarative/particles/allsmiles/spritestateparticles.qml b/examples/declarative/particles/allsmiles/spritestateparticles.qml
new file mode 100644
index 0000000000..6a61487a89
--- /dev/null
+++ b/examples/declarative/particles/allsmiles/spritestateparticles.qml
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "goldenrod"
+    width: 800
+    height: 800
+    id: root
+    SpriteImage{
+        sprites: [Sprite{
+            name: "happy"
+            source: "content/squarefacesprite2.png"
+            frames: 6
+            duration: 120
+            to: {"silly": 0.4, "sad": 0.2, "cyclops":0.1, "boggled":0.3, "dying":0.0}
+        }, Sprite{
+            name: "silly"
+            source: "content/squarefacesprite.png"
+            frames: 6
+            duration: 120
+            to: {"love": 0.4, "happy": 0.1, "evil": 0.2, "cyclops":0.1, "boggled":0.2}
+        }, Sprite{
+            name: "sad"
+            source: "content/squarefacesprite3.png"
+            frames: 6
+            duration: 120
+            to: {"love" : 0.2, "evil": 0.2, "silly": 0.2, "cyclops":0.2, "boggled":0.2}
+        }, Sprite{
+            name: "cyclops"
+            source: "content/squarefacesprite4.png"
+            frames: 6
+            duration: 120
+            to: {"love": 0.1, "evil": 0.1, "silly":0.1, "boggled":0.1, "cyclops" : 1.0}
+        }, Sprite{
+            name: "evil"
+            source: "content/squarefacesprite5.png"
+            frames: 6
+            duration: 120
+            to: {"happy": 1.0}
+        }, Sprite{
+            name: "love"
+            source: "content/squarefacesprite6.png"
+            frames: 6
+            duration: 120
+            to: {"sad": 0.6, "evil":0.4, "boggled":0.2}
+        }, Sprite{
+            name: "boggled"
+            source: "content/squarefacesprite7.png"
+            frames: 6
+            duration: 120
+            to: {"love" : 0.2, "evil": 0.2, "silly": 0.2, "cyclops":0.1, "sad":0.2}
+        }, Sprite{
+            name: "dying"
+            source: "content/squarefacespriteX.png"
+            frames: 4
+            duration: 120
+            to: {"dead":1.0}
+        }, Sprite{
+            name: "dead"
+            source: "content/squarefacespriteXX.png"
+            frames: 1
+            duration: 10000
+        }]
+
+        width: 100
+        height: 100
+        x: 20
+        y: 20
+        z:4
+    }
+    ParticleSystem{ id: sys }
+    SpriteParticle{
+        anchors.fill: parent
+        id: particles
+        system: sys
+        sprites: [Sprite{
+            name: "happy"
+            source: "content/squarefacesprite2.png"
+            frames: 6
+            duration: 120
+            to: {"silly": 0.4, "sad": 0.2, "cyclops":0.1, "boggled":0.3, "dying":0.0}
+        }, Sprite{
+            name: "silly"
+            source: "content/squarefacesprite.png"
+            frames: 6
+            duration: 120
+            to: {"love": 0.4, "happy": 0.1, "evil": 0.2, "cyclops":0.1, "boggled":0.2}
+        }, Sprite{
+            name: "sad"
+            source: "content/squarefacesprite3.png"
+            frames: 6
+            duration: 120
+            to: {"love" : 0.2, "evil": 0.2, "silly": 0.2, "cyclops":0.2, "boggled":0.2}
+        }, Sprite{
+            name: "cyclops"
+            source: "content/squarefacesprite4.png"
+            frames: 6
+            duration: 120
+            to: {"love": 0.1, "evil": 0.1, "silly":0.1, "boggled":0.1, "cyclops" : 1.0}
+        }, Sprite{
+            name: "evil"
+            source: "content/squarefacesprite5.png"
+            frames: 6
+            duration: 120
+            to: {"happy": 1.0}
+        }, Sprite{
+            name: "love"
+            source: "content/squarefacesprite6.png"
+            frames: 6
+            duration: 120
+            to: {"sad": 0.6, "evil":0.4, "boggled":0.2}
+        }, Sprite{
+            name: "boggled"
+            source: "content/squarefacesprite7.png"
+            frames: 6
+            duration: 120
+            to: {"love" : 0.2, "evil": 0.2, "silly": 0.2, "cyclops":0.1, "sad":0.2}
+        }, Sprite{
+            name: "dying"
+            source: "content/squarefacespriteX.png"
+            frames: 4
+            duration: 120
+            to: {"dead":1.0}
+        }, Sprite{
+            name: "dead"
+            source: "content/squarefacespriteXX.png"
+            frames: 1
+            duration: 10000
+        }]
+    }
+    TrailEmitter{
+        system: sys
+        particlesPerSecond: 16
+        particleDuration: 10000
+        emitting: true
+        speed: AngleVector{angle: 90; magnitude: 60; angleVariation: 5}
+        acceleration: PointVector{ y: 10 }
+        particleSize: 30
+        particleSizeVariation: 10
+        width: parent.width
+        height: 100
+    }
+    SpriteGoal{
+        system: sys
+        width: root.width;
+        height: root.height/2;
+        y: root.height/2;
+        goalState:"dead"
+    }
+}
diff --git a/examples/declarative/particles/allsmiles/spritevariedparticles.qml b/examples/declarative/particles/allsmiles/spritevariedparticles.qml
new file mode 100644
index 0000000000..c1b773093f
--- /dev/null
+++ b/examples/declarative/particles/allsmiles/spritevariedparticles.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "goldenrod"
+    width: 800
+    height: 800
+    ParticleSystem{ id: sys }
+    SpriteParticle{
+        system: sys
+        anchors.fill: parent
+        sprites: [Sprite{
+            name: "initial"
+            source: "content/squarefacesprite.png"
+            frames: 6
+            duration: 0
+            to: {"happy":0.2, "silly":0.2, "sad":0.2, "cyclops":0.1, "evil":0.1, "love":0.1, "boggled":0.1}
+        }, Sprite{
+            name: "silly"
+            source: "content/squarefacesprite.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "happy"
+            source: "content/squarefacesprite2.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "sad"
+            source: "content/squarefacesprite3.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "cyclops"
+            source: "content/squarefacesprite4.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "evil"
+            source: "content/squarefacesprite5.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "love"
+            source: "content/squarefacesprite6.png"
+            frames: 6
+            duration: 120
+        }, Sprite{
+            name: "boggled"
+            source: "content/squarefacesprite7.png"
+            frames: 6
+            duration: 120
+        }]
+    }
+    TrailEmitter{
+        id: particleEmitter
+        system: sys
+        width: parent.width
+        particlesPerSecond: 16
+        particleDuration: 8000
+        emitting: true
+        speed: AngleVector{angle: 90; magnitude: 300; magnitudeVariation: 100; angleVariation: 5}
+        acceleration: PointVector{ y: 10 }
+        particleSize: 30
+        particleSizeVariation: 10
+    }
+    Binding{
+        target: particleEmitter
+        property: "y"
+        value: ma.mouseY
+        when: ma.mouseX !=0 || ma.mouseY!=0
+    }
+    MouseArea{
+        id: ma
+        anchors.fill: parent
+    }
+}
diff --git a/examples/declarative/particles/asteroid/asteroid.qml b/examples/declarative/particles/asteroid/asteroid.qml
new file mode 100644
index 0000000000..b5b4f672c2
--- /dev/null
+++ b/examples/declarative/particles/asteroid/asteroid.qml
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt.labs.particles 2.0
+import Qt.labs.particles 2.0 as Qlp
+import QtQuick 2.0
+
+Item {
+    id: root
+    width: 360
+    height: 540
+    MouseArea{
+        id: ma
+        anchors.fill: parent
+    }
+
+    ParticleSystem { id: sys }
+    Image {
+        source: "content/finalfrontier.png"
+        transformOrigin: Item.Center
+        anchors.centerIn: parent
+        smooth: true
+        NumberAnimation on rotation {
+            from: 0
+            to: 360
+            duration: 200000
+            loops: Animation.Infinite
+        }
+
+    }
+    ColoredParticle {
+        system: sys
+        particles: ["starfield"]
+        image: "content/star.png"
+        colorVariation: 0.3
+        color: "white"
+    }
+    TrailEmitter {
+        id: starField
+        system: sys
+        particle: "starfield"
+
+        particlesPerSecond: 80
+        particleDuration: 2500
+
+        anchors.centerIn: parent
+
+        //acceleration: AngleVector{angleVariation: 360; magnitude: 200}//Is this a better effect, more consistent speed?
+        acceleration: PointVector{ xVariation: 200; yVariation: 200; }
+
+        particleSize: 0
+        particleEndSize: 80
+        particleSizeVariation: 10
+    }
+    TrailEmitter{
+        system: sys
+        particle: "meteor"
+        particlesPerSecond: 12
+        particleDuration: 5000
+        emitting: true
+        acceleration: PointVector{ xVariation: 80; yVariation: 80; }
+        particleSize: 15
+        particleEndSize: 300
+        anchors.centerIn: parent
+     }
+    SpriteParticle{
+        system: sys
+        particles: ["meteor"]
+        sprites:[Sprite{
+                id: spinState
+                name: "spinning"
+                source: "content/meteor.png"
+                frames: 35
+                duration: 40
+                speedModifiesDuration: -0.1
+                to: {"explode":0, "spinning":1}
+            },Sprite{
+                name: "explode"
+                source: "content/_explo.png"
+                frames: 22
+                duration: 40
+                speedModifiesDuration: -0.1
+                to: {"nullFrame":1}
+            },Sprite{//Not sure if this is needed, but seemed easiest
+                name: "nullFrame"
+                source: "content/nullRock.png"
+                frames: 1
+                duration: 1000
+            }
+        ]
+    }
+    SpriteGoal{
+        particles: ["meteor"]
+        system: sys
+        goalState: "explode"
+        jump: true
+        anchors.centerIn: holder//A bug in affectors currently isn't compensating for relative x,y. when that's fixed this can just anchors.fill: rocketShip
+        width: 60
+        height: 60
+    }
+    Image {
+        id: rocketShip
+        source: "content/rocket.png"
+        smooth: true
+        anchors.centerIn: holder
+        rotation: (circle.percent+0.25) * 360
+        z: 2
+    }
+    Item {
+        id: holder
+        x: circle.x - Math.sin(circle.percent * 6.28316530714)*200
+        y: circle.y + Math.cos(circle.percent * 6.28316530714)*200
+        z: 1
+    }
+
+    Item {
+        id: circle
+        x: root.width / 1.2 
+        y: root.height / 1.7
+        property real percent: 0
+
+        SequentialAnimation on percent {
+            id: circleAnim1
+            loops: Animation.Infinite
+            running: true
+            NumberAnimation {
+            duration: 4000
+            from: 1
+            to: 0
+            }
+
+        }
+    }
+    ColoredParticle{
+        z:0 
+        system: sys
+        particles: ["exhaust"]
+        image: "content/particle4.png"
+
+        color: "orange"
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "red"
+                to: "cyan"
+                duration: 1000
+            }
+            ColorAnimation {
+                from: "cyan"
+                to: "red"
+                duration: 1000
+            }
+        }
+
+        colorVariation: 0.2
+    }
+    TrailEmitter{
+        id: trailsNormal2
+        system: sys
+        particle: "exhaust"
+
+        particlesPerSecond: 300
+        particleDuration: 500
+
+        y: holder.y
+        x: holder.x 
+
+        speed: PointVector{ xVariation: 40; yVariation: 40; }
+        speedFromMovement: 16
+
+        acceleration: PointVector{ xVariation: 10; yVariation: 10; }
+
+        particleSize: 4
+        particleSizeVariation: 4
+    }
+}
diff --git a/examples/declarative/particles/asteroid/blackhole.qml b/examples/declarative/particles/asteroid/blackhole.qml
new file mode 100644
index 0000000000..68d5835880
--- /dev/null
+++ b/examples/declarative/particles/asteroid/blackhole.qml
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    id: root
+    width: 360
+    height: 540
+    color: "black"
+    property bool spacePressed: false
+    focus: true
+    Image{
+        source: "content/finalfrontier.png"
+        anchors.centerIn:parent
+    }
+    Keys.onPressed: {
+        if (event.key == Qt.Key_Space) {
+            spacePressed = true;
+            event.accepted = true;
+        }
+    }
+    Keys.onReleased: {
+        if (event.key == Qt.Key_Space) {
+            spacePressed = false;
+            event.accepted = true;
+        }
+    }
+
+    TrailEmitter{
+        particle: "stars"
+        system: particles
+        particlesPerSecond: 40
+        particleDuration: 4000
+        emitting: true
+        particleSize: 30
+        particleSizeVariation: 10
+        speed: PointVector{ x: 220; xVariation: 40 }
+        height: parent.height
+    }
+    TrailEmitter{
+        particle: "roids"
+        system: particles
+        particlesPerSecond: 10
+        particleDuration: 4000
+        emitting: true
+        particleSize: 30
+        particleSizeVariation: 10
+        speed: PointVector{ x: 220; xVariation: 40 }
+        height: parent.height
+    }
+    ParticleSystem{
+        id: particles
+        anchors.fill: parent
+    }
+    ColoredParticle{
+        id: stars
+        particles: ["stars"]
+        system: particles
+        image: "content/star.png"
+        color: "white"
+        colorVariation: 0.1
+    }
+    SpriteParticle{
+        id: roids
+        particles: ["roids"]
+        system: particles
+        sprites: Sprite{
+            id: spinState
+            name: "spinning"
+            source: "content/meteor.png"
+            frames: 35
+            duration: 60
+            speedModifiesDuration: -0.1
+        }
+    }
+    ColoredParticle{
+        id: shot
+        particles: ["shot"]
+        system: particles
+        image: "content/star.png"
+
+        color: "#0FF06600"
+        colorVariation: 0.3
+    }
+    ColoredParticle{
+        id: engine
+        particles: ["engine"]
+        system: particles
+        image: "content/particle4.png"
+
+        color: "orange"
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "red"
+                to: "cyan"
+                duration: 1000
+            }
+            ColorAnimation {
+                from: "cyan"
+                to: "red"
+                duration: 1000
+            }
+        }
+
+        colorVariation: 0.2
+    }
+    GravitationalSingularity{
+        id: gs; x: root.width/2; y: root.height/2; strength: 4000000;
+        system: particles
+    }
+    Kill{
+        system: particles
+        x: gs.x - 8;
+        y: gs.y - 8;
+        width: 16
+        height: 16
+    }
+    Image{
+        source:"content/rocket2.png"
+        id: ship
+        width: 45
+        height: 22
+        MouseArea{
+            id: ma
+            anchors.fill: parent;
+            drag.axis: Drag.XandYAxis
+            drag.target: ship
+        }
+        TrailEmitter{
+            particle: "engine"
+            system: particles
+            particlesPerSecond: 200
+            particleDuration: 1000
+            emitting: true
+            particleSize: 10
+            particleEndSize: 4
+            particleSizeVariation: 4
+            speed: PointVector{ x: -128; xVariation: 32 }
+            height: parent.height
+            width: 20
+        }
+        TrailEmitter{
+            particle: "shot"
+            system: particles
+            particlesPerSecond: 32
+            particleDuration: 2000
+            emitting: spacePressed
+            particleSize: 40
+            speed: PointVector{ x: 256; }
+            x: parent.width
+            y: parent.height/2
+        }
+    }
+    Text{
+        color: "white"
+        anchors.bottom: parent.bottom
+        text:"Drag the ship, Spacebar to fire."
+    }
+}
+
diff --git a/examples/declarative/particles/asteroid/content/_explo.png b/examples/declarative/particles/asteroid/content/_explo.png
new file mode 100644
index 0000000000000000000000000000000000000000..4297245d49b087348d737b4ce4fb3761a62c2f0f
GIT binary patch
literal 81528
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/finalfrontier.png b/examples/declarative/particles/asteroid/content/finalfrontier.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ba18152308c27acb5348526df713b2896d13a0e
GIT binary patch
literal 695061
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%0DvX?df~bxNeC5vzXGkwc7(GMIWb_6TbMMBhQ-fO
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%0DDb
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/meteor.png b/examples/declarative/particles/asteroid/content/meteor.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8c368aea745f7035734e6145b7e970945acd3e9
GIT binary patch
literal 83169
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
a+Y!>K7RknWW>f!r$r`FUD&<O6VgCb<kRSB`

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/meteor_explo.png b/examples/declarative/particles/asteroid/content/meteor_explo.png
new file mode 100644
index 0000000000000000000000000000000000000000..e659bfe2cf0a70bb8f938ca6e57152212aba05df
GIT binary patch
literal 219946
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%0DlUx2<J&kW%jvLetu?V
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
KT-G@yGywo-iD)$d

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/meteors.png b/examples/declarative/particles/asteroid/content/meteors.png
new file mode 100644
index 0000000000000000000000000000000000000000..bada8a1407e9a5af188e95023d17f74f93616587
GIT binary patch
literal 132137
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/nullRock.png b/examples/declarative/particles/asteroid/content/nullRock.png
new file mode 100644
index 0000000000000000000000000000000000000000..4076327a1aa5ef44bd38a1ac1f78b2fca5738633
GIT binary patch
literal 140
zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$`B3oCO|{#S9F5zCb*O@!q#N;Xpw<
yPZ!6KiaBo&8ZrWThZcPG&*j!%0AvyY8kRH8S;D}$taNH0NVTV{pUXO@geCxeb{iuA

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/particle4.png b/examples/declarative/particles/asteroid/content/particle4.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc95b703c1da0dffae27cd4a2a35d26ef73decdd
GIT binary patch
literal 1799
zcmaJ?dsIw$9G~4H37Hy_!gZV0qULF4nyb-c?jV}UPEk%HO*6N;YVN(=xufYpHDoK~
zaXKl<#@ZH39)&C$wU*L`l0$^mqT&#?C9muq#Qw4EJ?Gxv@B2HS&*%I6otwKrHD~1T
z@xvJm#>k+#u$o>0>pN^H{WYeh_R@<hrHG(H@mMNZOCpQ_JsyJqK?ZFcqDHj(l%xj4
zm%*?B(Xa?ALKzI{a05qc#c<39f@U)qzJ6vxt4lyAAO?v;F&Wr%;uHv=dKnllQu369
z9EnHgrjkf#swzyEnxK>FLBCmmuNk5R3<#wK%!WkF2$^NzdtHd$TaURQ@E$@X$iNRl
zMJN{la-2i}5r^lk<B55In9t!0XGkOxFF?TK^SC?#moM<<OCX^D;_-lw4@i3>^|6o|
zp8e4mZOOoRiXtE`H#s?(lPu)mWE__-l}fD|0)aP;@HVDkl-BHx89fFRV8o~+QG!Bo
z46rI{V{j8C1L;UVq+lRE$zsNjWugnlHERhjpTo1JGyqg8{~u~Fd_o&3HS#&${}eWc
zr4R^LjTmtgsiPYg>tS_8Kynh%QaBlg<B0=RTo8{_xG^3l0C}hgP-=B3X0_krl}acG
zGg4YihXlbgkXGQJs2&QCC`2$U^x?@xQa)e7lk((ZsYE37fhA&*Tqqgf!nn?4Krm{6
ztN+ZUDT8pWqhKIt&oDxw%Mtx-5;p+vQ-;vNV-XLk_mQg~JQm5ITrM39*V@>BHG1HP
zo*wJ=)7a9+r@==sdfG{PtV^of0_fY476b=`nXm8L5{X~-AD#V6zA-_4oz;5D0;6}b
z?4tVKo%+I_ZDu5eGQBUcHjB{;ab>gQiav>>Oz1wd$f-waTpk;DRWUtkaiMhLgq+`H
z!WZ3@MouK6IR+k@GomieQ)LtUo0oG3=C5HDWM-)PZY_1Ljo`7?Rd0B?a>wXnneC2I
znft)q_7B=+=W}v^M-Hi$`2jAyFAai_)sg;>?G6kV54mA^T{iXFo!3sxQMN9Y+hv|U
z&Q;9TIq>*A!dSne)y=XdI{Zll@wGWGN2xh9N@EWV>+|Yk`!L@G&gF){f+=K3zyFiD
z1lv5-Y$@_y8Bzo`Wld&h*rr)l)VgU}G~I3UikX>iLlSZS{=g@BT_qdCU8|zqgPHse
zzZ-WO*A$oM-nX1;&1Ro_r37V`H`3-AKuECt&t?6MWiit{J?yFi(@neTq@{W6oEpok
z6^VX#Q_fwRxOvWO*nJ<<^~{85XL1^3zw-e9#l@n(zS?y4%V#N`hU_cAc>n&=2VJ{|
zUEJTm6o#7)zd6m;j7jcTxJdP9tW#J^R?^|!x#%M=FxtiCD0x5q%6vruQ5W)1Zrl3D
z)@Ns>8PD&&2p)R7pgr$kXqsd4PdjWj?Rh8Q#E*5k&u-tlB|p+qjg39%YFFoXd&u#|
zhFsDIb1(RY_5AOdHT`Z9@zQcHmd%Y?Y%*I|RCFlr?D{4(R6c9wjIocpkB#Ar_rI#E
z>gq1{6gMXb(c;G<!HE)6y{Vm(Ra%@RobJCR_*B^T7WKPl9S|s}93CYo#G5*6i>}@z
zVr;9r?xlIn9wS_sJ!Ws+g_JE%Rc#*IBJIkX>NEP*9&d4}xs?B~;0GN)x6muNP_ydk
zrVN&QWq7q9*Ze56=GwW6NtR==ZLKe>9-5<Ostzr&dAe(oZ4a@dsi%7#Lvv|fwcc%^
z;B9*S+L0bRH-;*<5}mep8kRcL6x+JrFf4Y8*zI{)yvlLvcjEQS+?e;GBP%wgm1M-c
zPOA;y*~44ZzkRd|b#QxbBI70B`$$8@o@MTbOIn=Cu5lg0O1p92Ub$Pi&A!+7VD{UY
zWm!4kf$pOxvu!%tO|s)rtz)r9qe^ido(7-HDqD7e)tj`#0lf{ER;2S9r0e#&4XJD%
zu_1QrYL8XaEv^3MuX`NMb9;#Kx4u8(_~ZQi&gN}Pp03Zo-~VdLX@)PO(C#tgIcfbh
M1u0Z;MPRh$A2}Ss-2eap

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/rocket.png b/examples/declarative/particles/asteroid/content/rocket.png
new file mode 100644
index 0000000000000000000000000000000000000000..a171610b03e3a0e2aaa6e681fc590afce841e929
GIT binary patch
literal 7315
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
AX8-^I

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/rocket2.png b/examples/declarative/particles/asteroid/content/rocket2.png
new file mode 100644
index 0000000000000000000000000000000000000000..7110f8fdc6b11752b0d7beadcb4a13046003cb3a
GIT binary patch
literal 1918
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
Ef;-%<XaE2J

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/asteroid/content/star.png b/examples/declarative/particles/asteroid/content/star.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d592cfa8752ac8a75f92614369011812be88639
GIT binary patch
literal 1550
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W}skZsAp(w
zVs37(qhMrUXrOOkq;F`XYiMp|Y-D9%pa2C*K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1U
zu~h=P6yk;40=Thx#n4~^2AF<DVu8M)o&m^9FonLp_?717!c`ZS1f?R}i`C%bkjjEo
z{h-w1{L-RiV8o><gRCmBaxO|uEXgkl$<NP$g<?QPeo20DMt*^UbFis`Z(?$09*7TC
z@9S&jnO9trn3tUD>0+w{G(j&jGsViu#lY3g$;Hsn#lXza(AB`g+{MiW80;?2=H^aD
zE=DlDF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2aTIr+HAl
zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CH6P#S^9&43O`a}}Ar-f_
zgy;5MHV`<ga<fkNP0$1OZWi$e5_8%ff9Uo;DCrROmOsL7+g-J#t!Wb8`X^>p<(R*9
ztIE23WZv_c-;e1T78`z0dT;&s--DB{7!M|$H(fbdV1aO|M#WTq5u0i`ZD!Gk;<Q~~
zy__GPW3hIeeyZX3+ldLQnkG0+EW97De9+QE#rVOE|Hl~21GCr6={d8Z{5;1yvCV>i
zF6OQ5waWeYQ$jM+c6FfAU%QE&32G6^fwS(^GcDwlz3o=O=xf3$wCkU6%0^a3xunCo
zO!kbOp$@_e-Ar2hq*&Cw=cFDnvyFK*t;t(Jv1j#$207JvJ45Y{?odlTYjt_QpMyPX
zxWH9ejvv!EUyt~}^WKbe?F`8cYn}#GYF98Su?VHlIL`Ual<9u@m!3CaF{_I1aNJv<
za^E3|C+T_<>#;YQc3W;(9rDxOyMA}@*YtzY=Wn0Wl%M#^?uVb?0%tD)<q*XU${+nc
z$Q_DSSiCWAqj`Ph0l9OH@1@sgiZVYlj5c&-dw=0>9H$+}KdyP)&zjyh`u4QXV=qa6
zE$~O^p#8#UdpY8pPK56{y>aStqX3DuWnA2Kf`2|7yMM4Myx`Q@jdR~mRG7ngQXuAK
zW-8n2yUqnuzt0I({>2(J*S*F0=}Kc3=Nl2vJbng6cH1yT-zehC)d>yQ=5=7A@g0`f
zyvDN~SC%Yc+H&C(tH+uoC!f>=p8oZFdYAg#n0#@Yb<f?#5OJw+_c!KFcYpug6Q7%&
zbNp9v?}O(OoB5_LGRv}Sdvsl^V&SE8ZFzs(uI^s`!DzD1L5`*@-lm*6%+9tc%?pe(
zl7u%cEDf-Hx^a(_r$zgLmH%h({7XN=FKN?$V57>U<k!mTi;_G42`4a=UU<;6N?oZM
PR6={Y`njxgN@xNA$LK`L

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/modelparticles/bubbles.qml b/examples/declarative/particles/modelparticles/bubbles.qml
new file mode 100644
index 0000000000..711d52d522
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/bubbles.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "../../modelviews/listview/content" as OtherDemo
+import "content/script.js" as Script
+import "content"
+//Needs OtherDemo to be updated to QtQuick 2.0
+
+Item{
+    id: root
+    width: 400
+    height: 400
+    Rectangle{
+        anchors.fill: parent
+        color: "lightsteelblue"
+    }
+    ParticleSystem{ 
+        id: sys;
+    }
+    TrailEmitter{
+        system: sys
+        particle: "A"
+        width: parent.width/2
+        x: parent.width/4
+        y:parent.height
+        speed: PointVector{ y: -64; yVariation: 16 }
+        particlesPerSecond: 1
+        particleDuration: 8000
+    }
+    Drift{
+        system: sys
+        xDrift: 200
+    }
+    ModelParticle{
+        id: mp
+        z: 0
+        system: sys
+        particles: ["A"]
+        model: OtherDemo.RecipesModel{}
+        delegate: ExpandingDelegate{}
+    }
+}
diff --git a/examples/declarative/particles/modelparticles/content/Delegate.qml b/examples/declarative/particles/modelparticles/content/Delegate.qml
new file mode 100644
index 0000000000..ae1dffb63b
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/content/Delegate.qml
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+//![0]
+Package {
+    Text { id: listDelegate; width: 200; height: 25; text: 'Empty'; Package.name: 'list' }
+    Text { id: gridDelegate; width: 100; height: 50; text: 'Empty'; Package.name: 'grid' }
+
+    Rectangle {
+        id: wrapper
+        width: 200; height: 25
+        color: 'lightsteelblue'
+
+        Text { text: display; anchors.centerIn: parent }
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                if (wrapper.state == 'inList')
+                    wrapper.state = 'inGrid';
+                else
+                    wrapper.state = 'inList';
+            }
+        }
+
+        state: 'inList'
+        states: [
+            State {
+                name: 'inList'
+                ParentChange { target: wrapper; parent: listDelegate }
+            },
+            State {
+                name: 'inGrid'
+                ParentChange {
+                    target: wrapper; parent: gridDelegate
+                    x: 0; y: 0; width: gridDelegate.width; height: gridDelegate.height
+                }
+            }
+        ]
+
+        transitions: [
+            Transition {
+                ParentAnimation {
+                    NumberAnimation { properties: 'x,y,width,height'; duration: 300 }
+                }
+            }
+        ]
+    }
+}
+//![0]
diff --git a/examples/declarative/particles/modelparticles/content/Delegate2.qml b/examples/declarative/particles/modelparticles/content/Delegate2.qml
new file mode 100644
index 0000000000..a05fa348b9
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/content/Delegate2.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+//![0]
+Package {
+    Item { id: gridDelegate; width: w; height: h; Package.name: 'grid' }
+    Item { id: particleDelegate; width: w; height: h; Package.name: 'particles' 
+
+        Rectangle {
+            id: wrapper
+            width: w; height: h;
+            color: col
+            rotation: Math.random()*360
+            Behavior on rotation{RotationAnimation{}}
+
+            states: State{
+                name: "gridded"
+                when: root.inGrid
+                PropertyChanges{
+                    target: wrapper
+                    rotation: 0
+                }
+                ParentChange{
+                    target: wrapper
+                    parent: gridDelegate
+                    x:0
+                    y:0
+                }
+            }
+            transitions: [
+                Transition {
+                    ParentAnimation {
+                        NumberAnimation { properties: 'x,y,width,height'; duration: 300 }
+                    }
+                }
+            ]
+        }
+    }
+}
+//![0]
diff --git a/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml b/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml
new file mode 100644
index 0000000000..e6fcb6dcf7
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml
@@ -0,0 +1,204 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import "../../../modelviews/listview/content"
+
+// This example illustrates expanding a list item to show a more detailed view.
+
+    // Delegate for the recipes.  This delegate has two modes:
+    // 1. List mode (default), which just shows the picture and title of the recipe.
+    // 2. Details mode, which also shows the ingredients and method.
+    Component {
+        id: recipeDelegate
+
+        Item {
+            id: recipe
+
+            // Create a property to contain the visibility of the details.
+            // We can bind multiple element's opacity to this one property,
+            // rather than having a "PropertyChanges" line for each element we
+            // want to fade.
+            property real detailsOpacity : 0
+
+            //this bit changed for aesthetics
+            width: 70
+            height: 70
+            // A simple rounded rectangle for the background
+            Rectangle {
+                id: background
+                x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2
+                color: "ivory"
+                border.color: "orange"
+                radius: 5
+            }
+            Image{
+                anchors.fill:parent
+                anchors.margins: -32
+                source: "bubble.png"
+            }
+
+
+            // This mouse region covers the entire delegate.
+            // When clicked it changes mode to 'Details'.  If we are already
+            // in Details mode, then no change will happen.
+            MouseArea {
+                anchors.fill: parent
+                onClicked: recipe.state = 'Details';
+            }
+
+            // Lay out the page: picture, title and ingredients at the top, and method at the
+            // bottom.  Note that elements that should not be visible in the list
+            // mode have their opacity set to recipe.detailsOpacity.
+            Row {
+                id: topLayout
+                x: 10; y: 10; height: recipeImage.height; width: parent.width
+                spacing: 10
+
+                Image {
+                    id: recipeImage
+                    width: 50; height: 50
+                    source: "../../modelviews/listview/" + picture
+                }
+
+                Column {
+                    width: background.width - recipeImage.width - 20; height: recipeImage.height
+                    spacing: 5
+
+                    Text { 
+                        text: title
+                        font.bold: true; font.pointSize: 16
+                    }
+
+                    Text {
+                        text: "Ingredients"
+                        font.pointSize: 12; font.bold: true
+                        opacity: recipe.detailsOpacity
+                    }
+
+                    Text {
+                        text: ingredients
+                        wrapMode: Text.WordWrap
+                        width: parent.width
+                        opacity: recipe.detailsOpacity
+                    }
+                }
+            }
+
+            Item {
+                id: details
+                x: 10; width: parent.width - 20
+                anchors { top: topLayout.bottom; topMargin: 10; bottom: parent.bottom; bottomMargin: 10 }
+                opacity: recipe.detailsOpacity
+
+                Text {
+                    id: methodTitle
+                    anchors.top: parent.top
+                    text: "Method"
+                    font.pointSize: 12; font.bold: true
+                }
+
+                Flickable {
+                    id: flick
+                    width: parent.width
+                    anchors { top: methodTitle.bottom; bottom: parent.bottom }
+                    contentHeight: methodText.height
+                    clip: true
+
+                    Text { id: methodText; text: method; wrapMode: Text.WordWrap; width: details.width }
+                }
+
+                Image {
+                    anchors { right: flick.right; top: flick.top }
+                    source: "../../modelviews/listview/" + "content/pics/moreUp.png"
+                    opacity: flick.atYBeginning ? 0 : 1
+                }
+
+                Image {
+                    anchors { right: flick.right; bottom: flick.bottom }
+                    source: "../../modelviews/listview/" + "content/pics/moreDown.png"
+                    opacity: flick.atYEnd ? 0 : 1
+                }
+            }
+
+            // A button to close the detailed view, i.e. set the state back to default ('').
+            TextButton {
+                y: 10
+                anchors { right: background.right; rightMargin: 10 }
+                opacity: recipe.detailsOpacity
+                text: "Close"
+
+                onClicked: recipe.state = '';
+            }
+
+            states: State {
+                name: "Details"
+
+                PropertyChanges { target: background; color: "white" }
+                PropertyChanges { target: recipeImage; width: 130; height: 130 } // Make picture bigger
+                PropertyChanges { target: recipe; detailsOpacity: 1; x: 0; opacity: 1 } // Make details visible
+                PropertyChanges { target: recipe; height: root.height; width: root.height; x:0; y:0; z:100} // Fill the entire list area with the detailed view
+
+                // Move the list so that this item is at the top.
+                //PropertyChanges { target: recipe.ListView.view; explicit: true; contentY: recipe.y }
+
+                // Disallow flicking while we're in detailed view
+                //PropertyChanges { target: recipe.ListView.view; interactive: false }
+            }
+
+            transitions: Transition {
+                //The only strictly necessary particle specific lines 
+                to: "Details"
+                reversible: true
+                ScriptAction{script:{
+                    if(state == "Details")
+                        mp.freeze(index);
+                    else
+                        mp.unfreeze(index);
+                    }
+                }
+                // Make the state changes smooth
+                ParallelAnimation {
+                    ColorAnimation { property: "color"; duration: 500 }
+                    NumberAnimation { duration: 300; properties: "detailsOpacity,opacity,x,y,height,width" }
+                }
+            }
+        }
+    }
diff --git a/examples/declarative/particles/modelparticles/content/RssModel.qml b/examples/declarative/particles/modelparticles/content/RssModel.qml
new file mode 100644
index 0000000000..603a157de5
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/content/RssModel.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+XmlListModel {
+    property string tags : ""
+
+    source: "http://api.flickr.com/services/feeds/photos_public.gne?"+(tags ? "tags="+tags+"&" : "")
+    query: "/feed/entry"
+    namespaceDeclarations: "declare default element namespace 'http://www.w3.org/2005/Atom';"
+
+    XmlRole { name: "title"; query: "title/string()" }
+    XmlRole { name: "content"; query: "content/string()" }
+    XmlRole { name: "hq"; query: "link[@rel='enclosure']/@href/string()" }
+}
diff --git a/examples/declarative/particles/modelparticles/content/bubble.png b/examples/declarative/particles/modelparticles/content/bubble.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7f479e9e39ee1d4db3d17783bfc206afd6d953a
GIT binary patch
literal 3413
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/modelparticles/content/script.js b/examples/declarative/particles/modelparticles/content/script.js
new file mode 100644
index 0000000000..e8ef93a847
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/content/script.js
@@ -0,0 +1,27 @@
+.pragma library
+
+function getWidth(string) {
+    return (string.match(/width=\"([0-9]+)\"/))[1]
+}
+
+function getHeight(string) {
+    return (string.match(/height=\"([0-9]+)\"/))[1]
+}
+
+function getImagePath(string) {
+    var pattern = /src=\"http:\/\/(\S+)\"/
+    return (string.match(pattern))[1]
+}
+
+function calculateScale(width, height, cellSize) {
+    var widthScale = (cellSize * 1.0) / width
+    var heightScale = (cellSize * 1.0) / height
+    var scale = 0
+
+    if (widthScale <= heightScale) {
+        scale = widthScale;
+    } else if (heightScale < widthScale) {
+        scale = heightScale;
+    }
+    return scale;
+}
diff --git a/examples/declarative/particles/modelparticles/gridsplosion.qml b/examples/declarative/particles/modelparticles/gridsplosion.qml
new file mode 100644
index 0000000000..a654124587
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/gridsplosion.qml
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content"
+
+Item{
+    id: root
+    width: 240
+    height: 240
+    property bool inGrid: false
+    ParticleSystem{ id: sys }
+    TrailEmitter{
+        system: sys
+        id: burster;
+        emitting: false
+        particlesPerSecond: 1000
+        particleDuration: 500
+        speed: PointVector{xVariation: 400; yVariation: 400}
+        anchors.centerIn: parent
+        Timer{
+            interval: 1000
+            running: true
+            repeat: false
+            onTriggered: burster.pulse(0.1);
+        }
+        Timer{
+            interval: 2000
+            running: true
+            repeat: false
+            onTriggered: {inGrid = true;}// sys.running = false;}
+        }
+    }
+    ColoredParticle{
+        system: sys
+        image: "../trails/content/particle.png"
+        color: "black"
+        colorVariation: 0.0
+    }
+    GridView{ id: grid; cellWidth: 40; cellHeight: 40
+        model: theModel.parts.grid
+        width: 120
+        height: 120
+    }
+    ModelParticle{
+        system: sys
+        model: theModel.parts.particles
+    }
+    Friction{
+        system: sys
+        factor: 1
+    }
+    Stasis{
+        system: sys
+        targetLife: 400
+    }
+    VisualDataModel{
+        id: theModel
+        delegate: Delegate2{}
+        model: ListModel{
+            ListElement{
+                w: 40
+                h: 20
+                col: "forestgreen"
+            }
+            ListElement{
+                w: 20
+                h: 40
+                col: "salmon"
+            }
+            ListElement{
+                w: 20
+                h: 20
+                col: "lightsteelblue"
+            }
+            ListElement{
+                w: 40
+                h: 40
+                col: "goldenrod"
+            }
+            ListElement{
+                w: 40
+                h: 20
+                col: "forestgreen"
+            }
+            ListElement{
+                w: 20
+                h: 40
+                col: "salmon"
+            }
+            ListElement{
+                w: 20
+                h: 20
+                col: "lightsteelblue"
+            }
+            ListElement{
+                w: 40
+                h: 40
+                col: "goldenrod"
+            }
+            ListElement{
+                w: 0
+                h: 0
+                col: "white"//Hack because add isn't working well with old stuff
+            }
+        }
+    }
+}
diff --git a/examples/declarative/particles/modelparticles/package.qml b/examples/declarative/particles/modelparticles/package.qml
new file mode 100644
index 0000000000..402cdea84a
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/package.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content"
+
+Rectangle {
+    color: "white"
+    width: 400
+    height: 200
+
+    ListModel {
+        id: myModel
+        ListElement { display: "One" }
+        ListElement { display: "Two" }
+        ListElement { display: "Three" }
+        ListElement { display: "Four" }
+        ListElement { display: "Five" }
+        ListElement { display: "Six" }
+        ListElement { display: "Seven" }
+        ListElement { display: "Eight" }
+    }
+    //![0]
+    VisualDataModel {
+        id: visualModel
+        delegate: Delegate {}
+        model: myModel
+    }
+
+    ListView {
+        width: 200; height:200
+        model: visualModel.parts.list
+    }
+    ModelParticle{
+        x: 200; width: 200; height:200
+        model: visualModel.parts.grid
+        system: sys
+        clip: true;
+    }
+    //![0]
+    ParticleSystem{
+        id: sys
+        anchors.fill: parent
+    }
+    TrailEmitter{
+        system: sys
+        width: 100
+        x: 50
+        speed: PointVector{ y: 40 }
+        particleDuration: 5000
+        particlesPerSecond: 1.6
+    }
+}
diff --git a/examples/declarative/particles/modelparticles/stream.qml b/examples/declarative/particles/modelparticles/stream.qml
new file mode 100644
index 0000000000..b67d6c42af
--- /dev/null
+++ b/examples/declarative/particles/modelparticles/stream.qml
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content/script.js" as Script
+import "content"
+
+Item{
+    id: root
+    width: 640
+    height: 480
+    Rectangle{
+        anchors.fill: parent
+        color: "black"
+        z: -1
+    }
+    Item{
+        id: loading
+        Behavior on opacity{NumberAnimation{}}
+        anchors.fill: parent
+        Text{
+            anchors.centerIn: parent
+            text: "Loading"
+            color: "white"
+        }
+    }
+    ParticleSystem{ 
+        id: sys;
+        running: true
+        overwrite: false
+        startTime: 12000//Doesn't actually work with the loading time though...
+    }
+    TrailEmitter{
+        id: emitter
+        system: sys
+        height: parent.height - 132/2
+        x: -132/2
+        y: 132/2
+        speed: PointVector{ x: 32; xVariation: 8 }
+        particlesPerSecond: 0.5
+        particleDuration: 120000 //TODO: A -1 or something which does 'infinite'? (but need disable fade first)
+        particle: "photos"
+    }
+    Kill{
+        system: sys
+        x: parent.width + 132/2
+        height: parent.height
+        width: 1000
+    }
+    ColoredParticle{
+        system: sys
+        particles: ["fireworks"]
+        image: "../trails/content/star.png"
+        color: "lightsteelblue"
+        alpha: 0
+        colorVariation: 0
+        z: 1000
+    }
+    ModelParticle{
+        id: mp
+        z: 0
+        system: sys
+        fade: false
+        particles: ["photos"]
+    }
+    Component{
+        id: alertDelegate
+        Rectangle{
+            width: 132
+            height: 132
+            NumberAnimation on scale{
+                running: true
+                loops: 1
+                from: 0.2
+                to: 1
+            }
+            Image{
+                source: "../asteroid/content/rocket.png"
+                anchors.centerIn: parent
+            }
+            Text{
+                anchors.bottom: parent.bottom
+                anchors.horizontalCenter: parent.horizontalCenter
+                text: "A new ship has arrived!"
+            }
+        }
+    }
+    property Item alertItem;
+    function alert(){
+        resetter.active = false
+        force.active = true;
+        alertItem = alertDelegate.createObject(root);
+        alertItem.x = root.width/2 - alertItem.width/2
+        alertItem.y = root.height/2 - alertItem.height/2
+        spawnFireworks.pulse(0.2);
+        stopAlert.start();
+    }
+    focus: true
+    Keys.onSpacePressed: alert();
+    Timer{
+        id: stopAlert
+        running: false
+        repeat: false
+        interval: 800
+        onTriggered: {
+            force.active = false
+            resetter.active = true;
+            mp.take(alertItem, true);
+            centerEmitter.burst(1);
+        }
+    }
+    Attractor{
+        id: force
+        system: sys
+        x: root.width/2
+        y: root.height/2
+        strength: -30000
+        active: false
+        anchors.centerIn: parent
+        width: parent.width/2
+        height: parent.height/2
+        particles:["photos"]
+    }
+    Reset{
+        id: resetter
+        system: sys
+        particles:["photos"]
+    }
+    TrailEmitter{
+        id: centerEmitter
+        speed: PointVector{ x: 32; xVariation: 8;}
+        particlesPerSecond: 0.5
+        particleDuration: 12000 //TODO: A -1 or something which does 'infinite'? (but need disable fade first)
+        maxParticles: 20
+        particle: "photos"
+        system: sys
+        anchors.centerIn: parent
+        emitting: false
+
+        //TODO: Zoom in effect
+    }
+    TrailEmitter{
+        id: spawnFireworks
+        particle: "fireworks"
+        system: sys
+        maxParticles: 400
+        particlesPerSecond: 400
+        particleDuration: 2800
+        x: parent.width/2
+        y: parent.height/2 - 64
+        width: 8
+        height: 8
+        emitting: false
+        particleSize: 32
+        particleEndSize: 8
+        speed: AngleVector{ magnitude: 160; magnitudeVariation: 120; angleVariation: 90; angle: 270 }
+        acceleration: PointVector{ y: 160 }
+    }
+    Item{ x: -1000; y: -1000 //offscreen
+        Repeater{//Load them here, add to system on completed
+            model: theModel
+            delegate: theDelegate
+        }
+    }
+    RssModel{id: theModel; tags:"particle,particles"}
+    Component {
+        id: theDelegate
+        Rectangle {
+            id: container
+            border.width: 2
+            property real myRand: Math.random();//'depth'
+            z: Math.floor(myRand * 100)
+            scale: (myRand + 1.0)/2;
+            //TODO: Darken based on 'depth'
+            width: 132
+            height: 132
+            //ModelParticle.onAttached: console.log("I'm in"  + x + "," + y + ":" + opacity);
+            ModelParticle.onDetached: mp.take(container);//respawns
+            function manage()
+            {
+                if(state == "selected"){
+             //       console.log("Taking " + index);
+                    mp.freeze(container);
+                }else{
+               //     console.log("Returning " +index);
+                    mp.unfreeze(container);
+                }
+            }
+            Image{
+                id: img
+                anchors.centerIn: parent
+                smooth: true; source: "http://" + Script.getImagePath(content); cache: true
+                fillMode: Image.PreserveAspectFit; 
+                width: parent.width-4; height: parent.height-4
+                onStatusChanged: if(img.status == Image.Ready){
+                    loading.opacity = 0;
+                    mp.take(container);
+                }
+            }
+            Text{
+                anchors.bottom: parent.bottom
+                width: parent.width
+                horizontalAlignment: Text.AlignHCenter
+                elide: Text.ElideRight
+                text: title
+                color: "black"
+            }
+            MouseArea{
+                anchors.fill: parent
+                onClicked: container.state == "selected" ? container.state = "" : container.state = "selected"
+            }
+            states: State{
+                name: "selected"
+                ParentChange{
+                    target: container
+                    parent: root
+                    x: 0
+                    y: 0
+                }
+                PropertyChanges{
+                    target: container
+                    width: root.width
+                    height: root.height
+                    z: 101
+                    opacity: 1
+                    rotation: 0
+                }
+            }
+            transitions: Transition{
+                to: "selected"
+                reversible: true
+                SequentialAnimation{
+                    ScriptAction{script: container.manage();}
+                    ParallelAnimation{
+                        ParentAnimation{NumberAnimation{ properties: "x,y" }}//Doesn't work, particles takes control of x,y instantly
+                        NumberAnimation{ properties: "width, height, z, rotation" }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/examples/declarative/particles/snow/content/flake-01.png b/examples/declarative/particles/snow/content/flake-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..490887a82fa8eea922af0293ca309c3522606c26
GIT binary patch
literal 189327
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%0AR%?
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
RA(&{-3k-sMtdKPc`5!heebxW~

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/snow/snow.qml b/examples/declarative/particles/snow/snow.qml
new file mode 100644
index 0000000000..25d2e1468b
--- /dev/null
+++ b/examples/declarative/particles/snow/snow.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    width: 360
+    height: 540
+    ParticleSystem { id: particles }
+    SpriteParticle {
+        system: particles
+        Sprite{
+            name: "snow"
+            source: "content/flake-01.png"
+            frames: 51
+            duration: 40
+        }
+    }
+    Wander { 
+        system: particles
+        anchors.fill: parent
+        xVariance: 40;
+        pace: 40;
+    }
+    TrailEmitter {
+        system: particles
+        particlesPerSecond: 20
+        particleDuration: 7000
+        emitting: true
+        speed: PointVector{ y:80; yVariation: 40; }
+        acceleration: PointVector{ y: 4 }
+        particleSize: 20
+        particleSizeVariation: 10
+        width: parent.width
+        height: 100
+    }
+}
diff --git a/examples/declarative/particles/snow/snow2.qml b/examples/declarative/particles/snow/snow2.qml
new file mode 100644
index 0000000000..c016ba2934
--- /dev/null
+++ b/examples/declarative/particles/snow/snow2.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    width: 360
+    height: 540
+    ParticleSystem{ id: particles }
+    SpriteParticle{
+        system: particles
+        Sprite{
+            name: "snow"
+            source: "content/flake-01.png"
+            frames: 51
+            duration: 40
+        }
+    }
+    Drift{ 
+        system: particles
+        anchors.fill: parent
+        xDrift: 400;
+    }
+    TrailEmitter{
+        system: particles
+        particlesPerSecond: 20
+        particleDuration: 7000
+        emitting: true
+        speed: PointVector{ y:80; yVariation: 40; }
+        acceleration: PointVector{ y: 4 }
+        particleSize: 20
+        particleSizeVariation: 10
+        width: parent.width
+        height: 100
+    }
+}
diff --git a/examples/declarative/particles/snow/snow3.qml b/examples/declarative/particles/snow/snow3.qml
new file mode 100644
index 0000000000..080bc4d1af
--- /dev/null
+++ b/examples/declarative/particles/snow/snow3.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    width: 360
+    height: 540
+    id: root
+    ParticleSystem{ id: particles }
+    SpriteParticle{
+        system: particles
+        sprites: Sprite{
+            name: "snow"
+            source: "content/flake-01.png"
+            frames: 51
+            duration: 40
+        }
+    }
+    Drift{
+        system: particles
+        anchors.fill: parent
+        xDrift: 200
+    } 
+    SpeedLimit{
+        system: particles
+        anchors.fill: parent
+        speedLimit: 100
+    }
+    TrailEmitter{
+        system: particles
+        particlesPerSecond: 20
+        particleDuration: 7000
+        emitting: true
+        speed: PointVector{ y:80; yVariation: 40; }
+        acceleration: PointVector{ y: 4 }
+        particleSize: 20
+        particleSizeVariation: 10
+        width: parent.width
+        height: 40
+    }
+}
diff --git a/examples/declarative/particles/spaceexplorer/content/helpers.js b/examples/declarative/particles/spaceexplorer/content/helpers.js
new file mode 100644
index 0000000000..c38c4c0eed
--- /dev/null
+++ b/examples/declarative/particles/spaceexplorer/content/helpers.js
@@ -0,0 +1,8 @@
+function intersects(item, x, y, e){
+    return x+e >= item.x && x-e <= item.x + item.width && y+e >= item.y && y-e <= item.y + item.height;
+}
+
+function direction(x1, y1, x2, y2){
+    return Math.atan2(y2-y1, x2-x1) * (180/Math.PI);
+}
+
diff --git a/examples/declarative/particles/spaceexplorer/content/particle4.png b/examples/declarative/particles/spaceexplorer/content/particle4.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc95b703c1da0dffae27cd4a2a35d26ef73decdd
GIT binary patch
literal 1799
zcmaJ?dsIw$9G~4H37Hy_!gZV0qULF4nyb-c?jV}UPEk%HO*6N;YVN(=xufYpHDoK~
zaXKl<#@ZH39)&C$wU*L`l0$^mqT&#?C9muq#Qw4EJ?Gxv@B2HS&*%I6otwKrHD~1T
z@xvJm#>k+#u$o>0>pN^H{WYeh_R@<hrHG(H@mMNZOCpQ_JsyJqK?ZFcqDHj(l%xj4
zm%*?B(Xa?ALKzI{a05qc#c<39f@U)qzJ6vxt4lyAAO?v;F&Wr%;uHv=dKnllQu369
z9EnHgrjkf#swzyEnxK>FLBCmmuNk5R3<#wK%!WkF2$^NzdtHd$TaURQ@E$@X$iNRl
zMJN{la-2i}5r^lk<B55In9t!0XGkOxFF?TK^SC?#moM<<OCX^D;_-lw4@i3>^|6o|
zp8e4mZOOoRiXtE`H#s?(lPu)mWE__-l}fD|0)aP;@HVDkl-BHx89fFRV8o~+QG!Bo
z46rI{V{j8C1L;UVq+lRE$zsNjWugnlHERhjpTo1JGyqg8{~u~Fd_o&3HS#&${}eWc
zr4R^LjTmtgsiPYg>tS_8Kynh%QaBlg<B0=RTo8{_xG^3l0C}hgP-=B3X0_krl}acG
zGg4YihXlbgkXGQJs2&QCC`2$U^x?@xQa)e7lk((ZsYE37fhA&*Tqqgf!nn?4Krm{6
ztN+ZUDT8pWqhKIt&oDxw%Mtx-5;p+vQ-;vNV-XLk_mQg~JQm5ITrM39*V@>BHG1HP
zo*wJ=)7a9+r@==sdfG{PtV^of0_fY476b=`nXm8L5{X~-AD#V6zA-_4oz;5D0;6}b
z?4tVKo%+I_ZDu5eGQBUcHjB{;ab>gQiav>>Oz1wd$f-waTpk;DRWUtkaiMhLgq+`H
z!WZ3@MouK6IR+k@GomieQ)LtUo0oG3=C5HDWM-)PZY_1Ljo`7?Rd0B?a>wXnneC2I
znft)q_7B=+=W}v^M-Hi$`2jAyFAai_)sg;>?G6kV54mA^T{iXFo!3sxQMN9Y+hv|U
z&Q;9TIq>*A!dSne)y=XdI{Zll@wGWGN2xh9N@EWV>+|Yk`!L@G&gF){f+=K3zyFiD
z1lv5-Y$@_y8Bzo`Wld&h*rr)l)VgU}G~I3UikX>iLlSZS{=g@BT_qdCU8|zqgPHse
zzZ-WO*A$oM-nX1;&1Ro_r37V`H`3-AKuECt&t?6MWiit{J?yFi(@neTq@{W6oEpok
z6^VX#Q_fwRxOvWO*nJ<<^~{85XL1^3zw-e9#l@n(zS?y4%V#N`hU_cAc>n&=2VJ{|
zUEJTm6o#7)zd6m;j7jcTxJdP9tW#J^R?^|!x#%M=FxtiCD0x5q%6vruQ5W)1Zrl3D
z)@Ns>8PD&&2p)R7pgr$kXqsd4PdjWj?Rh8Q#E*5k&u-tlB|p+qjg39%YFFoXd&u#|
zhFsDIb1(RY_5AOdHT`Z9@zQcHmd%Y?Y%*I|RCFlr?D{4(R6c9wjIocpkB#Ar_rI#E
z>gq1{6gMXb(c;G<!HE)6y{Vm(Ra%@RobJCR_*B^T7WKPl9S|s}93CYo#G5*6i>}@z
zVr;9r?xlIn9wS_sJ!Ws+g_JE%Rc#*IBJIkX>NEP*9&d4}xs?B~;0GN)x6muNP_ydk
zrVN&QWq7q9*Ze56=GwW6NtR==ZLKe>9-5<Ostzr&dAe(oZ4a@dsi%7#Lvv|fwcc%^
z;B9*S+L0bRH-;*<5}mep8kRcL6x+JrFf4Y8*zI{)yvlLvcjEQS+?e;GBP%wgm1M-c
zPOA;y*~44ZzkRd|b#QxbBI70B`$$8@o@MTbOIn=Cu5lg0O1p92Ub$Pi&A!+7VD{UY
zWm!4kf$pOxvu!%tO|s)rtz)r9qe^ido(7-HDqD7e)tj`#0lf{ER;2S9r0e#&4XJD%
zu_1QrYL8XaEv^3MuX`NMb9;#Kx4u8(_~ZQi&gN}Pp03Zo-~VdLX@)PO(C#tgIcfbh
M1u0Z;MPRh$A2}Ss-2eap

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore.png b/examples/declarative/particles/spaceexplorer/content/powerupScore.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8c368aea745f7035734e6145b7e970945acd3e9
GIT binary patch
literal 83169
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
a+Y!>K7RknWW>f!r$r`FUD&<O6VgCb<kRSB`

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png b/examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png
new file mode 100644
index 0000000000000000000000000000000000000000..4076327a1aa5ef44bd38a1ac1f78b2fca5738633
GIT binary patch
literal 140
zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$`B3oCO|{#S9F5zCb*O@!q#N;Xpw<
yPZ!6KiaBo&8ZrWThZcPG&*j!%0AvyY8kRH8S;D}$taNH0NVTV{pUXO@geCxeb{iuA

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore_got.png b/examples/declarative/particles/spaceexplorer/content/powerupScore_got.png
new file mode 100644
index 0000000000000000000000000000000000000000..4297245d49b087348d737b4ce4fb3761a62c2f0f
GIT binary patch
literal 81528
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/rocket.png b/examples/declarative/particles/spaceexplorer/content/rocket.png
new file mode 100644
index 0000000000000000000000000000000000000000..a171610b03e3a0e2aaa6e681fc590afce841e929
GIT binary patch
literal 7315
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
AX8-^I

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/rocket2.png b/examples/declarative/particles/spaceexplorer/content/rocket2.png
new file mode 100644
index 0000000000000000000000000000000000000000..7110f8fdc6b11752b0d7beadcb4a13046003cb3a
GIT binary patch
literal 1918
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
Ef;-%<XaE2J

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/rocketEye.png b/examples/declarative/particles/spaceexplorer/content/rocketEye.png
new file mode 100644
index 0000000000000000000000000000000000000000..20005937d2fe79da543a6ebe8353de5facd9ded2
GIT binary patch
literal 2073
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
S$G>-64?v^rPgWuSi1{z)KKSVX

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/content/star.png b/examples/declarative/particles/spaceexplorer/content/star.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d592cfa8752ac8a75f92614369011812be88639
GIT binary patch
literal 1550
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W}skZsAp(w
zVs37(qhMrUXrOOkq;F`XYiMp|Y-D9%pa2C*K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1U
zu~h=P6yk;40=Thx#n4~^2AF<DVu8M)o&m^9FonLp_?717!c`ZS1f?R}i`C%bkjjEo
z{h-w1{L-RiV8o><gRCmBaxO|uEXgkl$<NP$g<?QPeo20DMt*^UbFis`Z(?$09*7TC
z@9S&jnO9trn3tUD>0+w{G(j&jGsViu#lY3g$;Hsn#lXza(AB`g+{MiW80;?2=H^aD
zE=DlDF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2aTIr+HAl
zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CH6P#S^9&43O`a}}Ar-f_
zgy;5MHV`<ga<fkNP0$1OZWi$e5_8%ff9Uo;DCrROmOsL7+g-J#t!Wb8`X^>p<(R*9
ztIE23WZv_c-;e1T78`z0dT;&s--DB{7!M|$H(fbdV1aO|M#WTq5u0i`ZD!Gk;<Q~~
zy__GPW3hIeeyZX3+ldLQnkG0+EW97De9+QE#rVOE|Hl~21GCr6={d8Z{5;1yvCV>i
zF6OQ5waWeYQ$jM+c6FfAU%QE&32G6^fwS(^GcDwlz3o=O=xf3$wCkU6%0^a3xunCo
zO!kbOp$@_e-Ar2hq*&Cw=cFDnvyFK*t;t(Jv1j#$207JvJ45Y{?odlTYjt_QpMyPX
zxWH9ejvv!EUyt~}^WKbe?F`8cYn}#GYF98Su?VHlIL`Ual<9u@m!3CaF{_I1aNJv<
za^E3|C+T_<>#;YQc3W;(9rDxOyMA}@*YtzY=Wn0Wl%M#^?uVb?0%tD)<q*XU${+nc
z$Q_DSSiCWAqj`Ph0l9OH@1@sgiZVYlj5c&-dw=0>9H$+}KdyP)&zjyh`u4QXV=qa6
zE$~O^p#8#UdpY8pPK56{y>aStqX3DuWnA2Kf`2|7yMM4Myx`Q@jdR~mRG7ngQXuAK
zW-8n2yUqnuzt0I({>2(J*S*F0=}Kc3=Nl2vJbng6cH1yT-zehC)d>yQ=5=7A@g0`f
zyvDN~SC%Yc+H&C(tH+uoC!f>=p8oZFdYAg#n0#@Yb<f?#5OJw+_c!KFcYpug6Q7%&
zbNp9v?}O(OoB5_LGRv}Sdvsl^V&SE8ZFzs(uI^s`!DzD1L5`*@-lm*6%+9tc%?pe(
zl7u%cEDf-Hx^a(_r$zgLmH%h({7XN=FKN?$V57>U<k!mTi;_G42`4a=UU<;6N?oZM
PR6={Y`njxgN@xNA$LK`L

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/spaceexplorer/spaceexplorer.qml b/examples/declarative/particles/spaceexplorer/spaceexplorer.qml
new file mode 100644
index 0000000000..091ca0a8b5
--- /dev/null
+++ b/examples/declarative/particles/spaceexplorer/spaceexplorer.qml
@@ -0,0 +1,412 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content/helpers.js" as Helpers
+
+Rectangle{
+    id: root
+    width: 360
+    height: 540
+    color: "black"
+    Image{
+        anchors.centerIn: parent
+        source: "../asteroid/content/finalfrontier.png"
+    }
+    property bool spacePressed: false
+    property int holeSize: 4
+    focus: true
+    Keys.onPressed: {
+        if (event.key == Qt.Key_Space) {
+            spacePressed = true;
+            event.accepted = true;
+        }
+    }
+    Keys.onReleased: {
+        if (event.key == Qt.Key_Space) {
+            spacePressed = false;
+            event.accepted = true;
+        }
+    }
+
+    function fakeMove(){
+        fakeMoving = rocket.x < 80 || rocket.x+rocket.width-root.width > -80 || rocket.y < 80 || rocket.y+rocket.height-root.height > -80;
+        if(fakeMoving)
+            fakeMovementDir = Helpers.direction(root.width/2, root.height/2, rocket.x, rocket.y) + 180;
+    }
+    property bool fakeMoving: false
+    property real fakeMovementDir: 0
+
+    TrailEmitter{
+        particle: "stars2"
+        system: background
+        particlesPerSecond: 60
+        particleDuration: 4000
+        emitting: true
+        particleSize: 10
+        particleSizeVariation: 10
+        anchors.fill: parent
+    }
+    ParticleSystem{ id: background }
+    ColoredParticle{
+        particles: ["stars2"]
+        system: background
+        anchors.fill: parent
+        image: "content/star.png"
+        color: "white"
+        colorVariation: 0.1
+    }
+    Gravity{
+        system: background
+        anchors.fill: parent
+        acceleration: fakeMoving?10:0
+        angle: fakeMovementDir
+    }
+    Text{
+        color: "white"
+        anchors.bottom: parent.bottom
+        anchors.right: parent.right
+        text:"Drag the ship, but don't hit a black hole!"
+        font.pixelSize: 10
+    }
+    Text{
+        color: "white"
+        font.pixelSize: 36
+        anchors.centerIn: parent
+        text: "GAME OVER"
+        opacity: gameOver ? 1 : 0
+        Behavior on opacity{NumberAnimation{}}
+    }
+    Text{
+        color: "white"
+        font.pixelSize: 18
+        anchors.left: parent.left
+        anchors.bottom: parent.bottom
+        anchors.margins: 8
+        text: "Score: " + score
+    }
+    Image{
+        source: "content/star.png"
+        width: 40
+        height: 40
+        anchors.right: parent.right
+        anchors.top: parent.top
+        MouseArea{
+            anchors.fill: parent
+            anchors.margins: -20
+            onClicked: shoot = !shoot
+        }
+    }
+    property int score: 0
+    property bool gameOver: false
+    property bool shoot: true
+    property int maxLives: 3
+    property int lives: maxLives
+    property bool alive: !Helpers.intersects(rocket, gs1.x, gs1.y, holeSize) && !Helpers.intersects(rocket, gs2.x, gs2.y, holeSize) && !Helpers.intersects(rocket, gs3.x, gs3.y, holeSize)  && !Helpers.intersects(rocket, gs4.x, gs4.y, holeSize);
+    onAliveChanged: if(!alive){
+        lives -= 1;
+        if(lives == -1){
+            console.log("game over");
+            gameOver = true;
+        }
+    }
+    Row{
+        Repeater{
+            model: maxLives
+            delegate: Image{ 
+                opacity: index < lives ? 1 : 0
+                Behavior on opacity{NumberAnimation{}}
+                source: "content/rocket.png" 
+            }
+        }
+    }
+
+    property real courseDur: 10000
+    property real vorteX: width/4
+    property real vorteY: height/4
+    Behavior on vorteX{NumberAnimation{duration: courseDur}}
+    Behavior on vorteY{NumberAnimation{duration: courseDur}}
+    property real vorteX2: width/4
+    property real vorteY2: 3*height/4
+    Behavior on vorteX2{NumberAnimation{duration: courseDur}}
+    Behavior on vorteY2{NumberAnimation{duration: courseDur}}
+    property real vorteX3: 3*width/4
+    property real vorteY3: height/4
+    Behavior on vorteX3{NumberAnimation{duration: courseDur}}
+    Behavior on vorteY3{NumberAnimation{duration: courseDur}}
+    property real vorteX4: 3*width/4
+    property real vorteY4: 3*height/4
+    Behavior on vorteX4{NumberAnimation{duration: courseDur}}
+    Behavior on vorteY4{NumberAnimation{duration: courseDur}}
+    Timer{
+        id: vorTimer
+        interval: courseDur
+        running: true
+        repeat: true
+        triggeredOnStart: true
+        onTriggered: {
+            vorteX = Math.random() * width * 2 - width * 0.5;
+            vorteY = Math.random() * height * 2 - height * 0.5;
+            vorteX2 = Math.random() * width * 2 - width * 0.5;
+            vorteY2 = Math.random() * height * 2 - height * 0.5;
+            vorteX3 = Math.random() * width * 2 - width * 0.5;
+            vorteY3 = Math.random() * height * 2 - height * 0.5;
+            vorteX4 = Math.random() * width * 2 - width * 0.5;
+            vorteY4 = Math.random() * height * 2 - height * 0.5;
+        }
+    }
+
+
+
+    ParticleSystem{ id: foreground }
+    ColoredParticle{
+        particles: ["stars"]
+        anchors.fill: parent
+        system: foreground
+        image: "content/star.png"
+        color: "white"
+        colorVariation: 0.1
+    }
+    ColoredParticle{
+        particles: ["shot"]
+        anchors.fill: parent
+        system: foreground
+        image: "content/star.png"
+
+        color: "orange"
+        colorVariation: 0.3
+    }
+    ColoredParticle{
+        id: engine
+        particles: ["engine"]
+        anchors.fill: parent
+        system: foreground
+        image: "content/particle4.png"
+
+        color: "orange"
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "red"
+                to: "cyan"
+                duration: 1000
+            }
+            ColorAnimation {
+                from: "cyan"
+                to: "red"
+                duration: 1000
+            }
+        }
+
+        colorVariation: 0.2
+    }
+    SpriteParticle{
+        particles: ["powerups"]
+        anchors.fill: parent
+        system: foreground
+        Sprite{
+            name: "norm"
+            source: "content/powerupScore.png"
+            frames: 35
+            duration: 40
+            to: {"norm":1, "got":0}
+        }
+        Sprite{
+            name: "got"
+            source: "content/powerupScore_got.png"
+            frames: 22
+            duration: 40
+            to: {"null":1}
+        }
+        Sprite{
+            name: "null"
+            source: "content/powerupScore_gone.png"
+            frames: 1
+            duration: 1000
+        }
+    }
+    SpriteGoal{
+        x: rocket.x - 30
+        y: rocket.y - 30
+        width: 60
+        height: 60
+        goalState: "got"
+        jump: true
+        onAffected: if(!gameOver) score += 1000
+        system: foreground
+    }
+    GravitationalSingularity{
+        id: gs1; x: vorteX; y: vorteY; strength: 800000;
+        system: foreground
+    }
+    Kill{
+        x: gs1.x - holeSize;
+        y: gs1.y - holeSize;
+        width: holeSize * 2
+        height: holeSize * 2
+        system: foreground
+    }
+
+    GravitationalSingularity{
+        id: gs2; x: vorteX2; y: vorteY2; strength: 800000;
+        system: foreground
+    }
+    Kill{
+        x: gs2.x - holeSize;
+        y: gs2.y - holeSize;
+        width: holeSize * 2
+        height: holeSize * 2
+        system: foreground
+    }
+
+    GravitationalSingularity{
+        id: gs3; x: vorteX3; y: vorteY3; strength: 800000;
+        system: foreground
+    }
+    Kill{
+        x: gs3.x - holeSize;
+        y: gs3.y - holeSize;
+        width: holeSize * 2
+        height: holeSize * 2
+        system: foreground
+    }
+    GravitationalSingularity{
+        id: gs4; x: vorteX4; y: vorteY4; strength: 800000;
+        system: foreground
+    }
+    Kill{
+        x: gs4.x - holeSize;
+        y: gs4.y - holeSize;
+        width: holeSize * 2
+        height: holeSize * 2
+        system: foreground
+    }        
+    TrailEmitter{
+        particle: "powerups"
+        system: foreground
+        particlesPerSecond: 1
+        particleDuration: 6000
+        emitting: !gameOver
+        particleSize: 60
+        particleSizeVariation: 10
+        anchors.fill: parent
+    }
+    TrailEmitter{
+        particle: "stars"
+        system: foreground
+        particlesPerSecond: 40
+        particleDuration: 4000
+        emitting: !gameOver
+        particleSize: 30
+        particleSizeVariation: 10
+        anchors.fill: parent
+    }
+    SpriteImage{
+        id: rocket
+        //Sprites or children for default?
+        Sprite{
+            name: "normal"
+            source: "content/rocket2.png"
+            frames: 1
+            duration: 1000
+            to: {"normal": 0.9, "winking" : 0.1}
+        }
+        Sprite{
+            name: "winking"
+            source: "content/rocketEye.png"
+            frames: 10
+            duration: 40
+                to: {"normal" : 1}
+        }
+        x: root.width/2
+        y: root.height/2
+        property int lx: 0
+        property int ly: 0
+        property int lastX: 0
+        property int lastY: 0
+        width: 45
+        height: 22
+        onXChanged:{ lastX = lx; lx = x; fakeMove()}
+        onYChanged:{ lastY = ly; ly = y; fakeMove()}
+        rotation: Helpers.direction(lastX, lastY, x, y)
+        data:[
+        MouseArea{
+            id: ma
+            anchors.fill: parent;
+            drag.axis: Drag.XandYAxis
+            drag.target: rocket
+        },
+        TrailEmitter{
+            system: foreground
+            particle: "engine"
+            particlesPerSecond: 100
+            particleDuration: 1000
+            emitting: !gameOver 
+            particleSize: 10
+            particleEndSize: 4
+            particleSizeVariation: 4
+            speed: PointVector{
+                x: -128 * Math.cos(rocket.rotation * (Math.PI / 180))
+                y: -128 * Math.sin(rocket.rotation * (Math.PI / 180))
+            }
+            anchors.verticalCenter: parent.verticalCenter
+            height: 4
+            width: 4
+            
+        }, 
+        TrailEmitter{
+            system: foreground
+            particle: "shot"
+            particlesPerSecond: 16
+            particleDuration: 1600
+            emitting: !gameOver && shoot
+            particleSize: 40
+            speed: PointVector{
+                x: 256 * Math.cos(rocket.rotation * (Math.PI / 180))
+                y: 256 * Math.sin(rocket.rotation * (Math.PI / 180))
+            }
+            x: parent.width - 4
+            y: parent.height/2
+        }
+        ]
+    }
+}
+
diff --git a/examples/declarative/particles/trails/content/PetsModel.qml b/examples/declarative/particles/trails/content/PetsModel.qml
new file mode 100644
index 0000000000..d7375a73af
--- /dev/null
+++ b/examples/declarative/particles/trails/content/PetsModel.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+ListModel {
+    ListElement {
+        name: "Polly"
+        type: "Parrot"
+        age: 12
+        size: "Small"
+    }
+    ListElement {
+        name: "Penny"
+        type: "Turtle"
+        age: 4
+        size: "Small"
+    }
+    ListElement {
+        name: "Warren"
+        type: "Rabbit"
+        age: 2
+        size: "Small"
+    }
+    ListElement {
+        name: "Spot"
+        type: "Dog"
+        age: 9
+        size: "Medium"
+    }
+    ListElement {
+        name: "Schrödinger"
+        type: "Cat"
+        age: 2
+        size: "Medium"
+    }
+    ListElement {
+        name: "Joey"
+        type: "Kangaroo"
+        age: 1
+        size: "Medium"
+    }
+    ListElement {
+        name: "Kimba"
+        type: "Bunny"
+        age: 65
+        size: "Large"
+    }
+    ListElement {
+        name: "Rover"
+        type: "Dog"
+        age: 5
+        size: "Large"
+    }
+    ListElement {
+        name: "Tiny"
+        type: "Elephant"
+        age: 15
+        size: "Large"
+    }
+}
diff --git a/examples/declarative/particles/trails/content/candle.png b/examples/declarative/particles/trails/content/candle.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fa31937199e17bb755d5051d1f34d8cc4f434df
GIT binary patch
literal 1348
zcmeAS@N?(olHy`uVBq!ia0vp^6$}iF860dt)|{jEe}NQdfk$L90|TEg5YJ(}_iau%
z0|U!9PZ!6KiaBrZ9xQs~CeeCPZR+>>)O5k>M;6<XuOxlBf7&wiW{TmK--}(nIU=}$
zrr-q)y!z|^+pfKRmAPU;f8y-_*Yy7uer2f8X*|st<M*J5X}a)^IR~Dy=&2W2LWR~g
z&i^I5<a-qJ=U0(T_D`c*vu*t!ELSbqX}@0Xz^^*zFI(ELZH|%sk-BzkT%28g&F;H*
z$~M0|#rfOpU3%X3dfxB5H&!R@+4YLQey92ycYBUnlMlAdT@{yN3{R}xAzv%_`#)2?
zWyAcQw|&YdpFU#VUuphw``5|`@&DhiIsX5{4CSjVaj)&QUq5cP`(^0vw$6(GpVp(r
zkL-Tkw{s4Cu=U@(58o%-*&bNz`fkzkN?RXmm(Rc9KDiUxn14TZ$^)CQ56ez2_sEWw
zxuI3JN1J)|Z|Ru2j%{7?uU{Q_Wp`r=XWt$(+uG)>*S>215O05Ve1?$4y1Y}uMP3iK
z8tK>d$bVRJAbV}k)QKN%{Z5N|(BbKAr28T2F#pxb$G^?&Y`h-zSiR`WgL|{3EYg^k
z&$gSmSg%1Pcilao*n@LYY92gXfAq00|C)EpUN+uT0fuV5MybBShuTM4+?WCG%Hp@T
z%f!(sq10T3C9N445&O>1kv>xA@j!l7$>;mFpm^Ci<-lV5b4HO~34B7}xY`$g<>#aW
z<sLTTVmo4j5|(?htFS&}fW)5l-girqw_Qew*8c7rp4>GKmuB-ZP50)qc~z|)4AoE*
zaLP0jq)|`x!w=_&A)1Yg_4Is%gl8lJE&kBf61=qKfL>sp2gjMVmyNo2eJ?Xx+uky<
zGpJT$-?r20;FAM$60#Cje^&`+E}qocm>iaWi2af}o1gKnO+cU6X*_*?Z#ipU<zHVz
z-GY{uvsa}X`@2`@6znW)TrU4F$Sgd68EfCn9U_;Rij6>y$V++fQhKe5F!So_MV*b7
z6XD6ym-h|3g`bhBfw~|fvG#ZF{2Khgdg<M3+MuNC%l9Vh8mAijGZvWN?Gzq*d)()U
z$*Tee(d=dHX_LW@N?i<0$}I=XqNIhGHak8j(ri?hU*?{_C5WkiO2KcxkOv1>SFBlb
z;Fa72kr~X;e6f^uUX7hiP*lP@P=uPR?1|ynlV6ew%`i;zQ$9VGfmy3JUF^pC$@esM
z4ay<Wg_O0J<R=uYJ_ieiB?s0y%OlwWPsX4OX{YdX_oC}UJLUn|_l*A;=zeh2e4n$F
z<=l+3jX_Mu*UZQiVya$T@9gy8rJMb4mU|NlQfA8CcvyM)%Yht-z4uK1&Q*muak{j;
z#mmh*grN!Zder9dk6+&R`f=EleG-BuJ!FTX6bnmP_W9PGF4#2XfU>I1%V+%`<m>M@
z*gV+m_5M)b{QV!9|2(*KLOv|#$Q@UnPs00EzlgU#SYg>M^+vr;^j_!Rv)P%y{yh25
mxc*$kDcxd5Y^9aW;{6Pbr%rv&Trf2UB=70!=d#Wzp$Pz&n_$=g

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/colortable.png b/examples/declarative/particles/trails/content/colortable.png
new file mode 100644
index 0000000000000000000000000000000000000000..a62ceeb4a0ce3c23ca231217ede7b2960a758659
GIT binary patch
literal 704
zcmV;x0zdtUP)<h;3K|Lk000e1NJLTq00961000391^@s6F<EeT00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipM{
z6&o@B<+`^3001I%MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakAa8CUVIWOmV~41B
zLjV8*5=lfsR5;5ujmwQ)IS@lh>VBk)X*(D%9EpQ4FwxA;Avlg%PXZH2OZOwvi`Ts<
zoC6k$MF9B!4gnB^0*JtppnzBrtROZ3D}vq5Zll_%Nve&OnL3jrPP1_&sh&A(9RBcE
zhUTQ^<K9k<vpLvoY<4y~OPs~V5=Ra+rx}yBkpOmVXWDUs>6zQX6X&*bdE&HvIygOZ
zCK%J{nHhGvgKp#9Gu=s#^KPfx=yrOXZf8uR#~F6c7^j`n&Sm5B>(^uFi8F0XJF$`9
z|9lGo{P_7Vkz4UC<SFn|;Cqdq1-Uo)*^+0Y?>)J9csBUj<EJ4{d+~1YbHGnc&LeX)
z%+WIYf!SN;sCY(;N5$+F&#0Mw$2`}TWv?!4^RhOVrDa(TFFL%G=Av2)TN7$i+M%?j
z)T;T{TbXZP%Y6H~++V(wd);+G%LVa@%7DuGq6S`kM=2dFJyM6tJER_!Pak-Bk2E3;
zXz3`rpmKsbqjE#KLER+pNE4Jp8kF1jzXJgMzh8vNP$H>Ng1CUCfLuVXkTy^&$Su?k
za)Y#k+(T7JmEaz!f~pYrK$TRDxPz>qc1U}uo#X~;i}=y26=VVUNfFcsiPr#NNIF1B
zPKFcU1ayOZ06d^B1~<S9<VolPFaVw)2f~x!0674j3_HXV;UIA)`rKax#;Y3_pbNoG
m@B#IJoCF^P6O<W*D)|E^cDoUmQEOQM0000<MNUMnLSTZ%?k#Qr

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/particle.png b/examples/declarative/particles/trails/content/particle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c83896d22cdc3c352ff8db97b0b1f2cd2b27125
GIT binary patch
literal 861
zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!|4BqaRCwByS51%9Fbqx7be0e8!eRFS
z2Yvzn|DSN;zy*YakXV7l4%;>+uAJ)4!|9fhtYq5Mes-Q6Cx`#|iAbtLlW1enS0*|y
zF-AG6Gn?YQHEL+EwV9p=GaO)E)yZ7P#iXw|#tVf#fLG>e0M8MG5RhWevjLdwSw8|D
zuhsAfhEd!df^ArA-nL0W%try}N6#(n2}a&~HjZ3K1|mYlq5;_jfW`*`(KwJuF^0aF
zr|o?q9tcN*0bGIM4C4r3BJqHu(7x$~T@X|zFe7+8*#8m!?`2AGwkkTtGl1Oy=)z}^
za?OjA&6)WL6h>fq1P)}{8Ug2Y{)hlFC`Rwu^8|a|n->6<ftUj8wj$O5jPNi4;n;Yj
zRE(5<V&5$At~pUCGgbh}$}6YZKt|Yj+DTI{IvKXNjcPmQj-kP+dT2yb^<9-)WBd0i
zpR4>P9tZ))^CJcdb95FnFqIco-dA~TBvoZEtK3xiQ00Nnht$!z>dj77iw^4%*jqDp
zZD1CAt~vjv$|vGRaP<8{tX^>mj-pqPqBoYlt$tiP2UO4awgu8L>g9a^HftXLG|wl<
z_dubRj^6csCNE_t0!@Bc=vDb2Gx}h14<LlLf{$%!0E%;{VBx?zuL{2!>1K;yv1t6N
z@~vY~yv9W(!@+<H7vcwkQ%^ruxidaYW?WP8+%Z&W+}>w;iAO4L4;GiR<^30@7ZB=z
zn!ZBk!aAnfmthA}fMheB<pugYp0f@i<1>+Tv7T@{3nr@9t&K{~=@$rCk7(@3;zVH!
zvloHbj!dUC%TCG`;L#&_FJ$XtpU+m~XD1CuI<k8$nNXd;2zVU0=!n`!C+O=qoP$%>
zc@2l1<)Sa-o^Ue7qb+KR6O3Nz=1lO&iqE=DX=|0Rn@J7;KJ%G;oE1#M-Frdf!wD`X
z?0tf5l1|YPARrR`(9I|SiAL&X!V~vHCYyK{k|O{Dgl?cqi8vhSmEQ8??O1QAM}TM#
nN5v_UffYd2w;a8m{}o^W-^qmk*A=;y00000NkvXXu0mjf5*>;S

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/particle2.png b/examples/declarative/particles/trails/content/particle2.png
new file mode 100644
index 0000000000000000000000000000000000000000..36349c6c6eb8e2479ba1edce3fc581370610b14e
GIT binary patch
literal 3909
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
TEOdA100000NkvXXu0mjfODtI(

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/particle3.png b/examples/declarative/particles/trails/content/particle3.png
new file mode 100644
index 0000000000000000000000000000000000000000..905d8f37b8d5689fdb6fcba1f366e85f6f320b7d
GIT binary patch
literal 3186
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
Y8bHZrBN2IdQUCw|07*qoM6N<$f^s1g7ytkO

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/particleA.png b/examples/declarative/particles/trails/content/particleA.png
new file mode 100644
index 0000000000000000000000000000000000000000..c63acdee1f17e00ef7b1b99bdc46c00dffa9b1e2
GIT binary patch
literal 3541
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
P00000NkvXXu0mjf?XjMG

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/portal_bg.png b/examples/declarative/particles/trails/content/portal_bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c59eeabb96d2d0a8329ed67b54aef51c34c79a0
GIT binary patch
literal 96858
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

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/sparkleSize.png b/examples/declarative/particles/trails/content/sparkleSize.png
new file mode 100644
index 0000000000000000000000000000000000000000..752056541b087ca383d1683c4d952992f68f0760
GIT binary patch
literal 378
zcmV-=0fqjFP)<h;3K|Lk000e1NJLTq006`Q000391^@s6fr9~T00009a7bBm000fw
z000eP0r0nyMgRZ+8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0S8G$
zK~yM_-H@?L!%!54zu$yXDWS>IcIeRJA_z``lapH?Kpe%zxr@7liw|LDaduLC0S6JB
zL`bDWp@WT~LP^uaC09a-ZY~};+;ji)ou7NIhOV3O4<dA3{L$zytWzMhBwIj|WgkFd
z^mWT>D+eX<nIvyO>ezN)647$`lCvwXR@)Nr9><SHE1sQteNVt-vA8YuR>k{9qj4yS
z*ZJHxy-mkCk;EDx;5mvewwujUNj!z&nc;Rk?_9vcY&OjIsLcIV>sr9wbUHBFpwqdR
z#LZ-~oBJh&w|&<K-R?*dSL1QJv_o3R)lsh(1NcE;zL4X7KLfZ70#(&NMVYVi`)%HE
YU&E(-qITV=WB>pF07*qoM6N<$g1<MV8UO$Q

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/content/star.png b/examples/declarative/particles/trails/content/star.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d592cfa8752ac8a75f92614369011812be88639
GIT binary patch
literal 1550
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W}skZsAp(w
zVs37(qhMrUXrOOkq;F`XYiMp|Y-D9%pa2C*K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1U
zu~h=P6yk;40=Thx#n4~^2AF<DVu8M)o&m^9FonLp_?717!c`ZS1f?R}i`C%bkjjEo
z{h-w1{L-RiV8o><gRCmBaxO|uEXgkl$<NP$g<?QPeo20DMt*^UbFis`Z(?$09*7TC
z@9S&jnO9trn3tUD>0+w{G(j&jGsViu#lY3g$;Hsn#lXza(AB`g+{MiW80;?2=H^aD
zE=DlDF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2aTIr+HAl
zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CH6P#S^9&43O`a}}Ar-f_
zgy;5MHV`<ga<fkNP0$1OZWi$e5_8%ff9Uo;DCrROmOsL7+g-J#t!Wb8`X^>p<(R*9
ztIE23WZv_c-;e1T78`z0dT;&s--DB{7!M|$H(fbdV1aO|M#WTq5u0i`ZD!Gk;<Q~~
zy__GPW3hIeeyZX3+ldLQnkG0+EW97De9+QE#rVOE|Hl~21GCr6={d8Z{5;1yvCV>i
zF6OQ5waWeYQ$jM+c6FfAU%QE&32G6^fwS(^GcDwlz3o=O=xf3$wCkU6%0^a3xunCo
zO!kbOp$@_e-Ar2hq*&Cw=cFDnvyFK*t;t(Jv1j#$207JvJ45Y{?odlTYjt_QpMyPX
zxWH9ejvv!EUyt~}^WKbe?F`8cYn}#GYF98Su?VHlIL`Ual<9u@m!3CaF{_I1aNJv<
za^E3|C+T_<>#;YQc3W;(9rDxOyMA}@*YtzY=Wn0Wl%M#^?uVb?0%tD)<q*XU${+nc
z$Q_DSSiCWAqj`Ph0l9OH@1@sgiZVYlj5c&-dw=0>9H$+}KdyP)&zjyh`u4QXV=qa6
zE$~O^p#8#UdpY8pPK56{y>aStqX3DuWnA2Kf`2|7yMM4Myx`Q@jdR~mRG7ngQXuAK
zW-8n2yUqnuzt0I({>2(J*S*F0=}Kc3=Nl2vJbng6cH1yT-zehC)d>yQ=5=7A@g0`f
zyvDN~SC%Yc+H&C(tH+uoC!f>=p8oZFdYAg#n0#@Yb<f?#5OJw+_c!KFcYpug6Q7%&
zbNp9v?}O(OoB5_LGRv}Sdvsl^V&SE8ZFzs(uI^s`!DzD1L5`*@-lm*6%+9tc%?pe(
zl7u%cEDf-Hx^a(_r$zgLmH%h({7XN=FKN?$V57>U<k!mTi;_G42`4a=UU<;6N?oZM
PR6={Y`njxgN@xNA$LK`L

literal 0
HcmV?d00001

diff --git a/examples/declarative/particles/trails/dynamicemitters.qml b/examples/declarative/particles/trails/dynamicemitters.qml
new file mode 100644
index 0000000000..8ea0272d94
--- /dev/null
+++ b/examples/declarative/particles/trails/dynamicemitters.qml
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    id: root
+    color: "black"
+    width: 640
+    height: 480
+    ParticleSystem{
+        id: sys
+    }
+    ColoredParticle{
+        system: sys
+        image: "content/particle.png"
+        color: "white"
+        colorVariation: 1.0
+        alpha: 0.1
+    }
+    Component{
+        id: emitterComp
+        TrailEmitter{
+            id: container
+            TrailEmitter{
+                id: emitMore
+                system: sys
+                emitting: true
+                particlesPerSecond: 128
+                particleDuration: 600
+                particleSize: 16
+                particleEndSize: 8
+                speed: AngleVector{angleVariation:360; magnitude: 60}
+            }
+
+            property int life: 2600
+            property real targetX: 0
+            property real targetY: 0
+            function go(){
+                xAnim.start();
+                yAnim.start();
+                container.emitting = true
+            }
+            system: sys
+            emitting: true
+            particlesPerSecond: 64
+            particleDuration: 600
+            particleSize: 24
+            particleEndSize: 8
+            NumberAnimation on x{
+                id: xAnim;
+                to: targetX
+                duration: life
+                running: false
+            }
+            NumberAnimation on y{
+                id: yAnim;
+                to: targetY
+                duration: life
+                running: false
+            }
+            Timer{
+                interval: life
+                running: true
+                onTriggered: container.destroy();
+            }
+        }
+    }
+    MouseArea{
+        anchors.fill: parent
+        onClicked:{
+            for(var i=0; i<16; i++){
+                var obj = emitterComp.createObject(root);
+                obj.x = mouse.x
+                obj.y = mouse.y
+                obj.targetX = Math.random() * 640
+                obj.targetY = Math.random() * 480
+                obj.life = Math.round(Math.random() * 2400) + 200
+                obj.go();
+            }
+        }
+    }
+}
diff --git a/examples/declarative/particles/trails/fireballs.qml b/examples/declarative/particles/trails/fireballs.qml
new file mode 100644
index 0000000000..116a2334dc
--- /dev/null
+++ b/examples/declarative/particles/trails/fireballs.qml
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle {
+    id: root
+    width: 360
+    height: 540
+    color: "black"
+
+    ParticleSystem{
+        id: particles
+    }
+
+    /*
+    ColoredParticle{
+        id: fireball
+        anchors.fill: parent
+        particles: ["E"]
+        system: particles
+        image: "content/particleA.png"
+        colorVariation: 0.2
+        color: "#00ff400f"
+    }
+    */
+    ColoredParticle{
+        id: smoke
+        system: particles
+        anchors.fill: parent
+        particles: ["A", "B"]
+        image: "content/particle.png"
+        colorVariation: 0
+        color: "#00111111"
+    }
+    ColoredParticle{
+        id: flame
+        anchors.fill: parent
+        system: particles
+        particles: ["C", "D"]
+        image: "content/particle.png"
+        colorVariation: 0.1
+        color: "#00ff400f"
+    }
+    TrailEmitter{
+        id: fire
+        system: particles
+        particle: "C"
+
+        y: parent.height
+        width: parent.width
+
+        particlesPerSecond: 350
+        particleDuration: 3500
+
+        acceleration: PointVector{ y: -17; xVariation: 3 }
+        speed: PointVector{xVariation: 3}
+
+        particleSize: 24
+        particleSizeVariation: 8
+        particleEndSize: 4
+    }
+    FollowEmitter{
+        id: fireSmoke
+        particle: "B"
+        system: particles
+        follow: "C"
+        width: root.width
+        height: root.height - 68
+
+        particlesPerParticlePerSecond: 1
+        particleDuration: 2000
+
+        speed: PointVector{y:-17*6; yVariation: -17; xVariation: 3}
+        acceleration: PointVector{xVariation: 3}
+
+        particleSize: 36
+        particleSizeVariation: 8
+        particleEndSize: 16
+    }
+    FollowEmitter{
+        id: fireballFlame
+        anchors.fill: parent
+        system: particles
+        particle: "D"
+        follow: "E"
+
+        particlesPerParticlePerSecond: 120
+        particleDuration: 180
+        emissionWidth: 8
+        emissionHeight: 8
+
+        particleSize: 16
+        particleSizeVariation: 4
+        particleEndSize: 4
+    }
+    
+    FollowEmitter{
+        id: fireballSmoke
+        anchors.fill: parent
+        system: particles
+        particle: "A"
+        follow: "E"
+
+        particlesPerParticlePerSecond: 128
+        particleDuration: 2400
+        emissionWidth: 16
+        emissionHeight: 16
+
+        speed: PointVector{yVariation: 16; xVariation: 16}
+        acceleration: PointVector{y: -16}
+
+        particleSize: 24
+        particleSizeVariation: 8
+        particleEndSize: 8
+    }
+    TrailEmitter{
+        id: balls
+        system: particles
+        particle: "E"
+
+        y: parent.height
+        width: parent.width
+
+        particlesPerSecond: 2
+        particleDuration: 7000
+
+        speed: PointVector{y:-17*4*2; xVariation: 6*6}
+        acceleration: PointVector{y: 17*2; xVariation: 6*6}
+
+        particleSize: 12
+        particleSizeVariation: 4
+    }
+
+}
+
diff --git a/examples/declarative/particles/trails/layered.qml b/examples/declarative/particles/trails/layered.qml
new file mode 100644
index 0000000000..38eb8e67dc
--- /dev/null
+++ b/examples/declarative/particles/trails/layered.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    id: root
+    width: 360
+    height: 600
+    color: "darkblue"
+    property bool cloneMode: false
+    MouseArea{
+        anchors.fill: parent
+        onClicked: cloneMode = !cloneMode;
+    }
+    ParticleSystem{
+        id: sys
+        startTime: 4000
+    }
+    TrailEmitter{
+        system: sys
+        y:root.height + 20
+        width: root.width
+        particlesPerSecond: 200
+        particleDuration: 4000
+        speed: PointVector{ y: -120; }
+    }
+    SpriteParticle{
+        system: sys
+        visible: !cloneMode
+        Sprite{
+            source: "content/particle2.png"
+        }
+    }
+    SpriteParticle{
+        system: sys
+        visible: cloneMode
+        z: 0
+        Sprite{
+            source: "content/particle3.png"
+        }
+    }
+    SpriteParticle{
+        system: sys
+        clip: true
+        visible: cloneMode
+        y: 120
+        height: 240
+        width: root.width
+        z: 1
+        Sprite{
+            source: "content/particle.png"
+        }
+    }
+}
diff --git a/examples/declarative/particles/trails/list.qml b/examples/declarative/particles/trails/list.qml
new file mode 100644
index 0000000000..2ab579f126
--- /dev/null
+++ b/examples/declarative/particles/trails/list.qml
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This example shows how to create your own highlight delegate for a ListView
+// that uses a SpringAnimation to provide custom movement when the
+// highlight bar is moved between items. + Particles.
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+import "content"
+
+Rectangle {
+    width: 200; height: 300
+    color: "black"
+    ParticleSystem{ id: particles }
+    ColoredParticle{
+        anchors.fill: parent
+        system: particles
+        z: 10
+        image: "content/star.png"
+        color: "white"
+        colorVariation: 0.0
+    }
+
+    // Define a delegate component.  A component will be
+    // instantiated for each visible item in the list.
+    Component {
+        id: petDelegate
+        Item {
+            id: wrapper
+            width: 200; height: 55
+            Column {
+                Text { text: 'Name: ' + name; color: "white" }
+                Text { text: 'Type: ' + type; color: "white" }
+                Text { text: 'Age: ' + age; color: "white" }
+            }
+            // indent the item if it is the current item
+            states: State {
+                name: "Current"
+                when: wrapper.ListView.isCurrentItem
+                PropertyChanges { target: wrapper; x: 20 }
+            }
+            transitions: Transition {
+                NumberAnimation { properties: "x"; duration: 200 } 
+            }
+        }
+    }
+
+    // Define a highlight with customised movement between items.
+    Component {
+        id: highlightBar
+        Rectangle {
+            width: 200; height: 50
+            color: "#333366"
+            y: listView.currentItem.y;
+            //Behavior on y { SpringAnimation { spring: 2; damping: 0.1 } }
+            Behavior on y { NumberAnimation {id: anim} }
+            TrailEmitter{
+                anchors.fill: parent
+                system: particles;
+                emitting: anim.running
+                particlesPerSecond: 600
+                particleDuration: 600
+                particleSize: 16
+                particleEndSize: 8
+            }
+        }
+    }
+
+    ListView {
+        id: listView
+        width: 200; height: parent.height
+
+        model: PetsModel {}
+        delegate: petDelegate
+        focus: true
+
+        // Set the highlight delegate. Note we must also set highlightFollowsCurrentItem
+        // to false so the highlight delegate can control how the highlight is moved.
+        highlight: highlightBar
+        highlightFollowsCurrentItem: false
+    }
+}
diff --git a/examples/declarative/particles/trails/overburst.qml b/examples/declarative/particles/trails/overburst.qml
new file mode 100644
index 0000000000..6ca15972a4
--- /dev/null
+++ b/examples/declarative/particles/trails/overburst.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "black"
+    width: 360
+    height: 540
+    ParticleSystem{ id: sys }
+    ColoredParticle{
+        system: sys
+        id: cp
+        image: "content/particle.png"
+        colorVariation: 0.4
+        color: "#000000FF"
+    }
+    TrailEmitter{
+        //burst on click
+        id: bursty
+        system: sys
+        emitting: ma.pressed
+        x: ma.mouseX
+        y: ma.mouseY
+        particlesPerSecond: 16000
+        particleDuration: 1000
+        maxParticles: 4000
+        acceleration: AngleVector{angleVariation: 360; magnitude: 360; }
+        particleSize: 8
+        particleEndSize: 16
+        particleSizeVariation: 4
+    }
+    MouseArea{
+        anchors.fill: parent
+        id: ma
+    }
+    MouseArea{
+        width: 100
+        height: 100
+        onClicked: sys.overwrite = !sys.overwrite
+        id: ma2
+        Rectangle{
+            anchors.fill: parent
+            color: "lightsteelblue"
+        }
+    }
+}
diff --git a/examples/declarative/particles/trails/portal.qml b/examples/declarative/particles/trails/portal.qml
new file mode 100644
index 0000000000..dba2e59513
--- /dev/null
+++ b/examples/declarative/particles/trails/portal.qml
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    id: root
+    width: 360
+    height: 540
+    color: "black"
+    Image{
+        anchors.fill: parent
+        source: "content/portal_bg.png"
+    }
+    ParticleSystem{ 
+        id: particles 
+        startTime: 2000
+    }
+    ColoredParticle{
+        particles: ["center","edge"]
+        anchors.fill: parent
+        system: particles
+        image: "content/particle.png"
+        colorVariation: 0.1
+        color: "#009999FF"
+    }
+    TrailEmitter{
+        anchors.fill: parent
+        particle: "center"
+        system: particles
+        particlesPerSecond: 200
+        particleDuration: 2000
+        emitting: true
+        particleSize: 20
+        particleSizeVariation: 2
+        particleEndSize: 0
+        shape: Ellipse{fill: false}
+        speed: DirectedVector{
+            targetX: root.width/2 
+            targetY: root.height/2
+            proportionalMagnitude: true
+            magnitude: 0.5
+        }
+    }
+    TrailEmitter{
+        anchors.fill: parent
+        particle: "edge"
+        system: particles
+        particlesPerSecond: 4000
+        particleDuration: 2000
+        emitting: true
+        particleSize: 20
+        particleSizeVariation: 2
+        particleEndSize: 0
+        shape: Ellipse{fill: false}
+        speed: DirectedVector{
+            targetX: root.width/2 
+            targetY: root.height/2
+            proportionalMagnitude: true
+            magnitude: 0.1
+            magnitudeVariation: 0.1
+        }
+        acceleration: DirectedVector{
+            targetX: root.width/2 
+            targetY: root.height/2
+            targetVariation: 200
+            proportionalMagnitude: true
+            magnitude: 0.1
+            magnitudeVariation: 0.1
+        }
+    }
+}
diff --git a/examples/declarative/particles/trails/rainbow.qml b/examples/declarative/particles/trails/rainbow.qml
new file mode 100644
index 0000000000..6c64929668
--- /dev/null
+++ b/examples/declarative/particles/trails/rainbow.qml
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt.labs.particles 2.0
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    width: 360
+    height: 540
+    color: "black"
+
+    ParticleSystem{ id: particles }
+    ColoredParticle{
+        system: particles
+        colorVariation: 0.5
+        alpha: 0
+
+        image: "content/particle.png"
+        colorTable: "content/colortable.png"
+        sizeTable: "content/colortable.png"
+    }
+    TrailEmitter{
+        system: particles
+        particlesPerSecond: 500
+        particleDuration: 2000
+
+        y: root.height / 2 + Math.sin(t * 2) * root.height * 0.3
+        x: root.width / 2 + Math.cos(t) * root.width * 0.3
+        property real t;
+
+        NumberAnimation on t {
+            from: 0; to: Math.PI * 2; duration: 10000; loops: Animation.Infinite
+        }
+
+        speedFromMovement: 20
+
+        speed: PointVector{ xVariation: 5; yVariation: 5;}
+        acceleration: PointVector{ xVariation: 5; yVariation: 5;}
+
+        particleSize: 16
+        //particleEndSize: 8
+        //particleSizeVariation: 8
+    }
+}
diff --git a/examples/declarative/particles/trails/shimmer.qml b/examples/declarative/particles/trails/shimmer.qml
new file mode 100644
index 0000000000..06f599d97a
--- /dev/null
+++ b/examples/declarative/particles/trails/shimmer.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    width: 360
+    height: 540
+    color: "black"
+    MouseArea{
+        anchors.fill: parent
+        onClicked: particles.running = !particles.running
+    }
+    ParticleSystem{ 
+        id: particles 
+        running: false
+    }
+    ColoredParticle{
+        anchors.fill: parent
+        system: particles
+        image: "content/star.png"
+        sizeTable: "content/sparkleSize.png"
+        alpha: 0
+        colorVariation: 0.6
+    }
+    TrailEmitter{
+        anchors.fill: parent
+        system: particles
+        particlesPerSecond: 2000
+        particleDuration: 2000
+        emitting: true
+        particleSize: 30
+        particleSizeVariation: 10
+    }
+}
diff --git a/examples/declarative/particles/trails/swarm.qml b/examples/declarative/particles/trails/swarm.qml
new file mode 100644
index 0000000000..083f9e816d
--- /dev/null
+++ b/examples/declarative/particles/trails/swarm.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0 as QLP
+
+Rectangle{
+    width: 200
+    height: 200
+    color: "black"
+    QLP.ParticleSystem{ id: ps }
+    QLP.ColoredParticle{
+        system: ps
+        particles: ["star1","star2"]
+        anchors.fill: parent
+        clip: true
+        image: "content/star.png"
+    }
+    QLP.Swarm{ 
+        system: ps
+        leaders: ["star2"]; 
+        anchors.fill: parent
+        strength: 128
+    }
+    QLP.TrailEmitter{
+        anchors.fill: parent
+        system: ps
+        particle: "star1"
+        particlesPerSecond: 100
+        particleDuration: 2000
+    }
+    QLP.TrailEmitter{
+        anchors.fill: parent
+        system: ps
+        particle: "star2"
+        particlesPerSecond: 0.4
+        particleDuration: 10000
+        particleSize: 64
+        particleEndSize: 32
+    }
+}
diff --git a/examples/declarative/particles/trails/trails.qml b/examples/declarative/particles/trails/trails.qml
new file mode 100644
index 0000000000..58d369c8d5
--- /dev/null
+++ b/examples/declarative/particles/trails/trails.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    color: "black"
+    width: 360
+    height: 540
+    ParticleSystem{ id: sys }
+    ColoredParticle{
+        system: sys
+        id: cp
+        image: "content/particle.png"
+        color: "#00FFFFFF"
+        colorVariation: 0.4
+    }
+    TrailEmitter{
+    //burst on click
+        id: bursty
+        system: sys
+        emitting: false
+        particlesPerSecond: 2000
+        particleDuration: 500
+        acceleration: AngleVector{ angle: 90; angleVariation: 360; magnitude: 640; }
+        particleSize: 8
+        particleEndSize: 16
+        particleSizeVariation: 4
+    }
+    TrailEmitter{
+        system: sys
+        speedFromMovement: 4.0
+        emitting: ma.pressed
+        x: ma.mouseX
+        y: ma.mouseY
+        particlesPerSecond: 400
+        particleDuration: 2000
+        acceleration: AngleVector{ angle: 90; angleVariation: 22; magnitude: 32; }
+        particleSize: 8
+        particleEndSize: 16
+        particleSizeVariation: 8
+    }
+    MouseArea{
+        id: ma
+        anchors.fill: parent
+        onPressed: {bursty.x = mouse.x; bursty.y = mouse.y; bursty.pulse(0.1);}//uses both for comparison
+        onReleased: {bursty.x = mouse.x; bursty.y = mouse.y; bursty.burst(200);}
+    }
+}
diff --git a/examples/declarative/particles/trails/turbulence.qml b/examples/declarative/particles/trails/turbulence.qml
new file mode 100644
index 0000000000..7da50464c2
--- /dev/null
+++ b/examples/declarative/particles/trails/turbulence.qml
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle{
+    width: 360
+    height: 540
+    color: "#222222"
+    id: root
+    Image{
+        source: "content/candle.png"
+        anchors.bottom: parent.bottom
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.bottomMargin: -8
+        anchors.horizontalCenterOffset: 2
+    }
+    ParticleSystem{
+        id: ps
+    }
+    Turbulence{
+        system: ps
+        height: (parent.height / 2)
+        width: parent.width / 2
+        x: parent. width / 4
+        anchors.fill: parent
+        strength: 16
+        frequency: 64
+        gridSize: 16
+    }
+    ColoredParticle{
+        particles: ["smoke"]
+        system: ps
+        image: "content/particle.png"
+        color: "#11111111"
+        colorVariation: 0
+    }
+    ColoredParticle{
+        particles: ["flame"]
+        system: ps
+        image: "content/particle.png"
+        color: "#11ff400f"
+        colorVariation: 0.1
+        }
+    TrailEmitter{
+        anchors.centerIn: parent
+        system: ps
+        particle: "flame"
+        
+        particlesPerSecond: 120
+        particleDuration: 1200
+        particleSize: 20
+        particleEndSize: 10
+        particleSizeVariation: 10
+        acceleration: PointVector{ y: -40 }
+        speed: AngleVector{ angle: 270; magnitude: 20; angleVariation: 22; magnitudeVariation: 5 }
+    }
+    FollowEmitter{
+        id: smoke1
+        width: root.width
+        height: 232
+        system: ps
+        particle: "smoke"
+        follow: "flame"
+
+        particlesPerParticlePerSecond: 4
+        particleDuration: 2400
+        particleDurationVariation: 400
+        particleSize: 16
+        particleEndSize: 8
+        particleSizeVariation: 8
+        acceleration: PointVector{ y: -40 }
+        speed: AngleVector{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 }
+    }
+    FollowEmitter{
+        id: smoke2
+        width: root.width
+        height: 232
+        system: ps
+        particle: "smoke"
+        follow: "flame"
+        
+        particlesPerParticlePerSecond: 1
+        particleDuration: 2400
+        particleSize: 36
+        particleEndSize: 24
+        particleSizeVariation: 8
+        acceleration: PointVector{ y: -40 }
+        speed: AngleVector{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 }
+    }
+}
diff --git a/examples/declarative/particles/trails/velocityfrommotion.qml b/examples/declarative/particles/trails/velocityfrommotion.qml
new file mode 100644
index 0000000000..3692410853
--- /dev/null
+++ b/examples/declarative/particles/trails/velocityfrommotion.qml
@@ -0,0 +1,327 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.particles 2.0
+
+Rectangle {
+
+    id: root
+
+    height: 540
+    width: 360
+
+    gradient: Gradient {
+        GradientStop { position: 0; color: "#000020" }
+        GradientStop { position: 1; color: "#000000" }
+    }
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: root
+
+/*
+        onPressed: stopAndStart()
+        onReleased: stopAndStart()
+        function stopAndStart() {
+            trailsNormal.emitting = false;
+            trailsNormal.emitting = true;
+            trailsStars.emitting = false;
+            trailsStars.emitting = true;
+            trailsNormal2.emitting = false;
+            trailsNormal2.emitting = true;
+            trailsStars2.emitting = false;
+            trailsStars2.emitting = true;
+            print("stop and start")
+        }
+*/
+    }
+
+    ParticleSystem{ id: sys1 }
+    ColoredParticle{
+        system: sys1
+        image: "content/particle.png"
+        color: "cyan"
+        alpha: 0
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "cyan"
+                to: "magenta"
+                duration: 1000
+            }
+            ColorAnimation {
+                from: "magenta"
+                to: "blue"
+                duration: 2000
+            }
+            ColorAnimation {
+                from: "blue"
+                to: "violet"
+                duration: 2000
+            }
+            ColorAnimation {
+                from: "violet"
+                to: "cyan"
+                duration: 2000
+            }
+        }
+        colorVariation: 0.3
+    }
+    TrailEmitter{
+        id: trailsNormal
+        system: sys1
+
+        particlesPerSecond: 500
+        particleDuration: 2000
+
+
+        y: mouseArea.pressed ? mouseArea.mouseY : circle.cy
+        x: mouseArea.pressed ? mouseArea.mouseX : circle.cx
+
+        speed: PointVector{xVariation: 4; yVariation: 4;}
+        acceleration: PointVector{xVariation: 10; yVariation: 10;}
+        speedFromMovement: 8
+
+        particleSize: 8
+        particleSizeVariation: 4
+    }
+    ParticleSystem { id: sys2 }
+    ColoredParticle{
+        color: "cyan"
+        system: sys2
+        alpha: 0
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "magenta"
+                to: "cyan"
+                duration: 1000
+            }
+            ColorAnimation {
+                from: "cyan"
+                to: "magenta"
+                duration: 2000
+            }
+        }
+        colorVariation: 0.5
+        image: "content/star.png"
+    }
+    TrailEmitter{
+        id: trailsStars
+        system: sys2
+
+        particlesPerSecond: 100
+        particleDuration: 2200
+
+
+        y: mouseArea.pressed ? mouseArea.mouseY : circle.cy
+        x: mouseArea.pressed ? mouseArea.mouseX : circle.cx
+
+        speed: PointVector{xVariation: 4; yVariation: 4;}
+        acceleration: PointVector{xVariation: 10; yVariation: 10;}
+        speedFromMovement: 8
+
+        particleSize: 22
+        particleSizeVariation: 4
+    }
+    ParticleSystem { id: sys3; }
+    ColoredParticle{
+        image: "content/particle.png"
+        system: sys3
+        color: "orange"
+        alpha: 0
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "red"
+                to: "green"
+                duration: 2000
+            }
+            ColorAnimation {
+                from: "green"
+                to: "red"
+                duration: 2000
+            }
+        }
+
+        colorVariation: 0.2
+
+    }
+    TrailEmitter{
+        id: trailsNormal2
+        system: sys3
+
+        particlesPerSecond: 300
+        particleDuration: 2000
+
+        y: mouseArea.pressed ? mouseArea.mouseY : circle2.cy
+        x: mouseArea.pressed ? mouseArea.mouseX : circle2.cx
+
+        speedFromMovement: 16
+
+        speed: PointVector{xVariation: 4; yVariation: 4;}
+        acceleration: PointVector{xVariation: 10; yVariation: 10;}
+
+        particleSize: 12
+        particleSizeVariation: 4
+    }
+    ParticleSystem { id: sys4; }
+    ColoredParticle{
+        system: sys4
+        image: "content/star.png"
+        color: "green"
+        alpha: 0
+        SequentialAnimation on color {
+            loops: Animation.Infinite
+            ColorAnimation {
+                from: "green"
+                to: "red"
+                duration: 2000
+            }
+            ColorAnimation {
+                from: "red"
+                to: "green"
+                duration: 2000
+            }
+        }
+
+        colorVariation: 0.5
+    }
+    TrailEmitter{
+        id: trailsStars2
+        system: sys4
+
+        particlesPerSecond: 50
+        particleDuration: 2200
+
+
+        y: mouseArea.pressed ? mouseArea.mouseY : circle2.cy
+        x: mouseArea.pressed ? mouseArea.mouseX : circle2.cx
+
+        speedFromMovement: 16
+        speed: PointVector{xVariation: 2; yVariation: 2;}
+        acceleration: PointVector{xVariation: 10; yVariation: 10;}
+
+        particleSize: 22
+        particleSizeVariation: 4
+    }
+
+
+
+    color: "white"
+
+    Item {
+        id: circle
+        //anchors.fill: parent
+        property real radius: 0
+        property real dx: root.width / 2
+        property real dy: root.height / 2
+        property real cx: radius * Math.sin(percent*6.283185307179) + dx
+        property real cy: radius * Math.cos(percent*6.283185307179) + dy
+        property real percent: 0
+
+        SequentialAnimation on percent {
+            loops: Animation.Infinite
+            running: true
+            NumberAnimation {
+            duration: 1000
+            from: 1
+            to: 0
+            loops: 8
+            }
+            NumberAnimation {
+            duration: 1000
+            from: 0
+            to: 1
+            loops: 8
+            }
+
+        }
+
+        SequentialAnimation on radius {
+            loops: Animation.Infinite
+            running: true
+            NumberAnimation {
+                duration: 4000
+                from: 0
+                to: 100
+            }
+            NumberAnimation {
+                duration: 4000
+                from: 100
+                to: 0
+            }
+        }
+    }
+
+    Item {
+        id: circle3
+        property real radius: 100
+        property real dx: root.width / 2
+        property real dy: root.height / 2
+        property real cx: radius * Math.sin(percent*6.283185307179) + dx
+        property real cy: radius * Math.cos(percent*6.283185307179) + dy
+        property real percent: 0
+
+        SequentialAnimation on percent {
+            loops: Animation.Infinite
+            running: true
+            NumberAnimation { from: 0.0; to: 1 ; duration: 10000;  }
+        }
+    }
+
+    Item {
+        id: circle2
+        property real radius: 30
+        property real dx: circle3.cx
+        property real dy: circle3.cy
+        property real cx: radius * Math.sin(percent*6.283185307179) + dx
+        property real cy: radius * Math.cos(percent*6.283185307179) + dy
+        property real percent: 0
+
+        SequentialAnimation on percent {
+            loops: Animation.Infinite
+            running: true
+            NumberAnimation { from: 0.0; to: 1 ; duration: 1000; }
+        }
+    }
+
+}
diff --git a/src/declarative/debugger/qdeclarativedebug.cpp b/src/declarative/debugger/qdeclarativedebug.cpp
index 62eb8fea3e..049e05ea06 100644
--- a/src/declarative/debugger/qdeclarativedebug.cpp
+++ b/src/declarative/debugger/qdeclarativedebug.cpp
@@ -84,6 +84,7 @@ public:
     static void remove(QDeclarativeEngineDebug *, QDeclarativeDebugRootContextQuery *);
     static void remove(QDeclarativeEngineDebug *, QDeclarativeDebugObjectQuery *);
     static void remove(QDeclarativeEngineDebug *, QDeclarativeDebugExpressionQuery *);
+    static void remove(QDeclarativeEngineDebug *, QDeclarativeDebugWatch *);
 
     QHash<int, QDeclarativeDebugEnginesQuery *> enginesQuery;
     QHash<int, QDeclarativeDebugRootContextQuery *> rootContextQuery;
@@ -120,6 +121,41 @@ QDeclarativeEngineDebugPrivate::~QDeclarativeEngineDebugPrivate()
 {
     if (client)
         client->priv = 0;
+    delete client;
+
+    QHash<int, QDeclarativeDebugEnginesQuery*>::iterator enginesIter = enginesQuery.begin();
+    for (; enginesIter != enginesQuery.end(); ++enginesIter) {
+        enginesIter.value()->m_client = 0;
+        if (enginesIter.value()->state() == QDeclarativeDebugQuery::Waiting)
+            enginesIter.value()->setState(QDeclarativeDebugQuery::Error);
+    }
+
+    QHash<int, QDeclarativeDebugRootContextQuery*>::iterator rootContextIter = rootContextQuery.begin();
+    for (; rootContextIter != rootContextQuery.end(); ++rootContextIter) {
+        rootContextIter.value()->m_client = 0;
+        if (rootContextIter.value()->state() == QDeclarativeDebugQuery::Waiting)
+            rootContextIter.value()->setState(QDeclarativeDebugQuery::Error);
+    }
+
+    QHash<int, QDeclarativeDebugObjectQuery*>::iterator objectIter = objectQuery.begin();
+    for (; objectIter != objectQuery.end(); ++objectIter) {
+        objectIter.value()->m_client = 0;
+        if (objectIter.value()->state() == QDeclarativeDebugQuery::Waiting)
+            objectIter.value()->setState(QDeclarativeDebugQuery::Error);
+    }
+
+    QHash<int, QDeclarativeDebugExpressionQuery*>::iterator exprIter = expressionQuery.begin();
+    for (; exprIter != expressionQuery.end(); ++exprIter) {
+        exprIter.value()->m_client = 0;
+        if (exprIter.value()->state() == QDeclarativeDebugQuery::Waiting)
+            exprIter.value()->setState(QDeclarativeDebugQuery::Error);
+    }
+
+    QHash<int, QDeclarativeDebugWatch*>::iterator watchIter = watched.begin();
+    for (; watchIter != watched.end(); ++watchIter) {
+        watchIter.value()->m_client = 0;
+        watchIter.value()->setState(QDeclarativeDebugWatch::Dead);
+    }
 }
 
 int QDeclarativeEngineDebugPrivate::getId()
@@ -160,6 +196,14 @@ void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclara
     }
 }
 
+void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclarativeDebugWatch *w)
+{
+    if (c && w) {
+        QDeclarativeEngineDebugPrivate *p = (QDeclarativeEngineDebugPrivate *)QObjectPrivate::get(c);
+        p->watched.remove(w->m_queryId);
+    }
+}
+
 void QDeclarativeEngineDebugPrivate::decode(QDataStream &ds, QDeclarativeDebugObjectReference &o,
                                    bool simple)
 {
@@ -647,6 +691,8 @@ QDeclarativeDebugWatch::QDeclarativeDebugWatch(QObject *parent)
 
 QDeclarativeDebugWatch::~QDeclarativeDebugWatch()
 {
+    if (m_client && m_queryId != -1)
+        QDeclarativeEngineDebugPrivate::remove(m_client, this);
 }
 
 int QDeclarativeDebugWatch::queryId() const
diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp
index 6f46354a49..208f77ea95 100644
--- a/src/declarative/debugger/qdeclarativedebugserver.cpp
+++ b/src/declarative/debugger/qdeclarativedebugserver.cpp
@@ -90,7 +90,11 @@ public:
     QHash<QString, QDeclarativeDebugService *> plugins;
     QStringList clientPlugins;
     bool gotHello;
+    QString waitingForMsgFromService;
 
+private:
+    // private slot
+    void _q_deliverMessage(const QString &serviceName, const QByteArray &message);
     static QDeclarativeDebugServerConnection *loadConnectionPlugin(const QString &pluginName);
 };
 
@@ -235,7 +239,6 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
 
     QDataStream in(message);
     if (!d->gotHello) {
-
         QString name;
         int op;
         in >> name >> op;
@@ -304,17 +307,33 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
             QByteArray message;
             in >> message;
 
-            QHash<QString, QDeclarativeDebugService *>::Iterator iter =
-                d->plugins.find(name);
-            if (iter == d->plugins.end()) {
-                qWarning() << "QDeclarativeDebugServer: Message received for missing plugin" << name;
+            if (d->waitingForMsgFromService == name) {
+                // deliver directly so that it is delivered before waitForMessage is returning.
+                d->_q_deliverMessage(name, message);
+                d->waitingForMsgFromService.clear();
             } else {
-                (*iter)->messageReceived(message);
+                // deliver message in next event loop run.
+                // Fixes the case that the service does start it's own event loop ...,
+                // but the networking code doesn't deliver any new messages because readyRead
+                // hasn't returned.
+                QMetaObject::invokeMethod(this, "_q_deliverMessage", Qt::QueuedConnection,
+                                          Q_ARG(QString, name),
+                                          Q_ARG(QByteArray, message));
             }
         }
     }
 }
 
+void QDeclarativeDebugServerPrivate::_q_deliverMessage(const QString &serviceName, const QByteArray &message)
+{
+    QHash<QString, QDeclarativeDebugService *>::Iterator iter = plugins.find(serviceName);
+    if (iter == plugins.end()) {
+        qWarning() << "QDeclarativeDebugServer: Message received for missing plugin" << serviceName;
+    } else {
+        (*iter)->messageReceived(message);
+    }
+}
+
 QList<QDeclarativeDebugService*> QDeclarativeDebugServer::services() const
 {
     const Q_D(QDeclarativeDebugServer);
@@ -372,4 +391,23 @@ void QDeclarativeDebugServer::sendMessage(QDeclarativeDebugService *service,
     d->connection->send(msg);
 }
 
+bool QDeclarativeDebugServer::waitForMessage(QDeclarativeDebugService *service)
+{
+    Q_D(QDeclarativeDebugServer);
+
+    if (!service
+            || !d->plugins.contains(service->name())
+            || !d->waitingForMsgFromService.isEmpty())
+        return false;
+
+    d->waitingForMsgFromService = service->name();
+
+    do {
+        d->connection->waitForMessage();
+    } while (!d->waitingForMsgFromService.isEmpty());
+    return true;
+}
+
 QT_END_NAMESPACE
+
+#include "moc_qdeclarativedebugserver_p.cpp"
diff --git a/src/declarative/debugger/qdeclarativedebugserver_p.h b/src/declarative/debugger/qdeclarativedebugserver_p.h
index 68ea4d8531..72c664c768 100644
--- a/src/declarative/debugger/qdeclarativedebugserver_p.h
+++ b/src/declarative/debugger/qdeclarativedebugserver_p.h
@@ -75,10 +75,13 @@ public:
     void sendMessage(QDeclarativeDebugService *service, const QByteArray &message);
     void receiveMessage(const QByteArray &message);
 
+    bool waitForMessage(QDeclarativeDebugService *service);
+
 private:
     friend class QDeclarativeDebugService;
     friend class QDeclarativeDebugServicePrivate;
     QDeclarativeDebugServer();
+    Q_PRIVATE_SLOT(d_func(), void _q_deliverMessage(QString, QByteArray))
 };
 
 QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qdeclarativedebugserverconnection_p.h b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h
index 0c2bdb4ef2..ca267e0662 100644
--- a/src/declarative/debugger/qdeclarativedebugserverconnection_p.h
+++ b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h
@@ -62,6 +62,7 @@ public:
     virtual bool isConnected() const = 0;
     virtual void send(const QByteArray &message) = 0;
     virtual void disconnect() = 0;
+    virtual bool waitForMessage() = 0;
 };
 
 Q_DECLARE_INTERFACE(QDeclarativeDebugServerConnection, "com.trolltech.Qt.QDeclarativeDebugServerConnection/1.0")
diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp
index 1b39f1c269..c7e6615d52 100644
--- a/src/declarative/debugger/qdeclarativedebugservice.cpp
+++ b/src/declarative/debugger/qdeclarativedebugservice.cpp
@@ -209,6 +209,16 @@ void QDeclarativeDebugService::sendMessage(const QByteArray &message)
     d->server->sendMessage(this, message);
 }
 
+bool QDeclarativeDebugService::waitForMessage()
+{
+    Q_D(QDeclarativeDebugService);
+
+    if (status() != Enabled)
+        return false;
+
+    return d->server->waitForMessage(this);
+}
+
 void QDeclarativeDebugService::statusChanged(Status)
 {
 }
diff --git a/src/declarative/debugger/qdeclarativedebugservice_p.h b/src/declarative/debugger/qdeclarativedebugservice_p.h
index 5e30350abf..f3d191995f 100644
--- a/src/declarative/debugger/qdeclarativedebugservice_p.h
+++ b/src/declarative/debugger/qdeclarativedebugservice_p.h
@@ -69,6 +69,7 @@ public:
     Status status() const;
 
     void sendMessage(const QByteArray &);
+    bool waitForMessage();
 
     static int idForObject(QObject *);
     static QObject *objectForId(int);
@@ -84,6 +85,7 @@ protected:
 
 private:
     friend class QDeclarativeDebugServer;
+    friend class QDeclarativeDebugServerPrivate;
 };
 
 QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp
index 6f28736f52..edbbe78761 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace.cpp
+++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp
@@ -65,9 +65,14 @@ QByteArray QDeclarativeDebugData::toByteArray() const
 
 QDeclarativeDebugTrace::QDeclarativeDebugTrace()
 : QDeclarativeDebugService(QLatin1String("CanvasFrameRate")),
-  m_enabled(false), m_deferredSend(true)
+  m_enabled(false), m_deferredSend(true), m_messageReceived(false)
 {
     m_timer.start();
+    if (status() == Enabled) {
+        // wait for first message indicating whether to trace or not
+        while (!m_messageReceived)
+            waitForMessage();
+    }
 }
 
 void QDeclarativeDebugTrace::addEvent(EventType t)
@@ -213,6 +218,8 @@ void QDeclarativeDebugTrace::messageReceived(const QByteArray &message)
 
     stream >> m_enabled;
 
+    m_messageReceived = true;
+
     if (!m_enabled)
         sendMessages();
 }
diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h
index ae0653ee71..c74cbe0120 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace_p.h
+++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h
@@ -120,6 +120,7 @@ private:
     QPerformanceTimer m_timer;
     bool m_enabled;
     bool m_deferredSend;
+    bool m_messageReceived;
     QList<QDeclarativeDebugData> m_data;
 };
 
diff --git a/src/declarative/debugger/qpacketprotocol.cpp b/src/declarative/debugger/qpacketprotocol.cpp
index 15a14cf9f4..c1034a79e4 100644
--- a/src/declarative/debugger/qpacketprotocol.cpp
+++ b/src/declarative/debugger/qpacketprotocol.cpp
@@ -42,6 +42,7 @@
 #include "private/qpacketprotocol_p.h"
 
 #include <QBuffer>
+#include <QElapsedTimer>
 
 QT_BEGIN_NAMESPACE
 
@@ -114,7 +115,7 @@ Q_OBJECT
 public:
     QPacketProtocolPrivate(QPacketProtocol * parent, QIODevice * _dev)
     : QObject(parent), inProgressSize(-1), maxPacketSize(MAX_PACKET_SIZE),
-      dev(_dev)
+      waitingForPacket(false), dev(_dev)
     {
         Q_ASSERT(4 == sizeof(qint32));
 
@@ -125,7 +126,7 @@ public:
         QObject::connect(this, SIGNAL(invalidPacket()),
                          parent, SIGNAL(invalidPacket()));
         QObject::connect(dev, SIGNAL(readyRead()),
-                         this, SLOT(readyToRead()), Qt::QueuedConnection);
+                         this, SLOT(readyToRead()));
         QObject::connect(dev, SIGNAL(aboutToClose()),
                          this, SLOT(aboutToClose()));
         QObject::connect(dev, SIGNAL(bytesWritten(qint64)),
@@ -200,6 +201,7 @@ public Q_SLOTS:
                 inProgress.clear();
 
                 emit readyRead();
+                waitingForPacket = false;
 
                 // Need to get trailing data
                 readyToRead();
@@ -213,6 +215,7 @@ public:
     QByteArray inProgress;
     qint32 inProgressSize;
     qint32 maxPacketSize;
+    bool waitingForPacket;
     QIODevice * dev;
 };
 
@@ -324,6 +327,48 @@ QPacket QPacketProtocol::read()
     return rv;
 }
 
+/*
+   Returns the difference between msecs and elapsed. If msecs is -1,
+   however, -1 is returned.
+*/
+static int qt_timeout_value(int msecs, int elapsed)
+{
+    if (msecs == -1)
+        return -1;
+
+    int timeout = msecs - elapsed;
+    return timeout < 0 ? 0 : timeout;
+}
+
+/*!
+  This function locks until a new packet is available for reading and the
+  \l{QIODevice::}{readyRead()} signal has been emitted. The function
+  will timeout after \a msecs milliseconds; the default timeout is
+  30000 milliseconds.
+
+  The function returns true if the readyRead() signal is emitted and
+  there is new data available for reading; otherwise it returns false
+  (if an error occurred or the operation timed out).
+  */
+
+bool QPacketProtocol::waitForReadyRead(int msecs)
+{
+    if (!d->packets.isEmpty())
+        return true;
+
+    QElapsedTimer stopWatch;
+    stopWatch.start();
+
+    d->waitingForPacket = true;
+    do {
+        if (!d->dev->waitForReadyRead(msecs))
+            return false;
+        if (!d->waitingForPacket)
+            return true;
+        msecs = qt_timeout_value(msecs, stopWatch.elapsed());
+    } while (true);
+}
+
 /*!
   Return the QIODevice passed to the QPacketProtocol constructor.
 */
diff --git a/src/declarative/debugger/qpacketprotocol_p.h b/src/declarative/debugger/qpacketprotocol_p.h
index accb8efa67..22bc3c250b 100644
--- a/src/declarative/debugger/qpacketprotocol_p.h
+++ b/src/declarative/debugger/qpacketprotocol_p.h
@@ -75,6 +75,8 @@ public:
     qint64 packetsAvailable() const;
     QPacket read();
 
+    bool waitForReadyRead(int msecs = 3000);
+
     void clear();
 
     QIODevice * device();
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index b74b18c090..8c59ee6f74 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -23,6 +23,8 @@ include(util/util.pri)
 include(graphicsitems/graphicsitems.pri)
 include(qml/qml.pri)
 include(debugger/debugger.pri)
+include(scenegraph/scenegraph.pri)
+include(items/items.pri)
 
 symbian: {
     TARGET.UID3=0x2001E623
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 6602dda28b..d3132deced 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -449,6 +449,12 @@ void QDeclarativeItemKeyFilter::componentComplete()
     a chain of items with the same KeyNavigation handler. If multiple items in a row are not enabled
     or visible, they will also be skipped.
 
+    KeyNavigation will implicitly set the other direction to return focus to this item. So if you set
+    \l left to another item, \l right will be set on that item's KeyNavigation to set focus back to this
+    item. However, if that item's KeyNavigation has had right explicitly set then no change will occur.
+    This means that the above example could have been written, with the same behaviour, without specifing
+    KeyNavigation.right or KeyNavigation.down for any of the items.
+
     \sa {Keys}{Keys attached property}
 */
 
@@ -498,6 +504,13 @@ void QDeclarativeKeyNavigationAttached::setLeft(QDeclarativeItem *i)
     if (d->left == i)
         return;
     d->left = i;
+    d->leftSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->rightSet){
+        other->d_func()->right = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->rightChanged();
+    }
     emit leftChanged();
 }
 
@@ -513,6 +526,13 @@ void QDeclarativeKeyNavigationAttached::setRight(QDeclarativeItem *i)
     if (d->right == i)
         return;
     d->right = i;
+    d->rightSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->leftSet){
+        other->d_func()->left = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->leftChanged();
+    }
     emit rightChanged();
 }
 
@@ -528,6 +548,13 @@ void QDeclarativeKeyNavigationAttached::setUp(QDeclarativeItem *i)
     if (d->up == i)
         return;
     d->up = i;
+    d->upSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->downSet){
+        other->d_func()->down = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->downChanged();
+    }
     emit upChanged();
 }
 
@@ -543,6 +570,13 @@ void QDeclarativeKeyNavigationAttached::setDown(QDeclarativeItem *i)
     if (d->down == i)
         return;
     d->down = i;
+    d->downSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->upSet){
+        other->d_func()->up = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->upChanged();
+    }
     emit downChanged();
 }
 
@@ -558,6 +592,13 @@ void QDeclarativeKeyNavigationAttached::setTab(QDeclarativeItem *i)
     if (d->tab == i)
         return;
     d->tab = i;
+    d->tabSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->backtabSet){
+        other->d_func()->backtab = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->backtabChanged();
+    }
     emit tabChanged();
 }
 
@@ -573,6 +614,13 @@ void QDeclarativeKeyNavigationAttached::setBacktab(QDeclarativeItem *i)
     if (d->backtab == i)
         return;
     d->backtab = i;
+    d->backtabSet = true;
+    QDeclarativeKeyNavigationAttached* other =
+            qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
+    if(other && !other->d_func()->tabSet){
+        other->d_func()->tab = qobject_cast<QDeclarativeItem*>(parent());
+        emit other->tabChanged();
+    }
     emit backtabChanged();
 }
 
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h
index dae581c94f..3ad67c6b5e 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeitem_p.h
@@ -382,7 +382,10 @@ class QDeclarativeKeyNavigationAttachedPrivate : public QObjectPrivate
 {
 public:
     QDeclarativeKeyNavigationAttachedPrivate()
-        : QObjectPrivate(), left(0), right(0), up(0), down(0), tab(0), backtab(0) {}
+        : QObjectPrivate(),
+          left(0), right(0), up(0), down(0), tab(0), backtab(0),
+          leftSet(false), rightSet(false), upSet(false), downSet(false),
+          tabSet(false), backtabSet(false) {}
 
     QDeclarativeItem *left;
     QDeclarativeItem *right;
@@ -390,6 +393,12 @@ public:
     QDeclarativeItem *down;
     QDeclarativeItem *tab;
     QDeclarativeItem *backtab;
+    bool leftSet : 1;
+    bool rightSet : 1;
+    bool upSet : 1;
+    bool downSet : 1;
+    bool tabSet : 1;
+    bool backtabSet : 1;
 };
 
 class QDeclarativeKeyNavigationAttached : public QObject, public QDeclarativeItemKeyFilter
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index af2c8f38d7..932e0740cd 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -273,7 +273,6 @@ void QDeclarativeTextEdit::setText(const QString &text)
     \o TextEdit.AutoText
     \o TextEdit.PlainText
     \o TextEdit.RichText
-    \o TextEdit.StyledText
     \endlist
 
     The default is TextEdit.AutoText.  If the text format is TextEdit.AutoText the text edit
@@ -1110,7 +1109,7 @@ void QDeclarativeTextEdit::setMouseSelectionMode(SelectionMode mode)
 /*!
     \qmlproperty bool TextEdit::readOnly
 
-    Whether the user an interact with the TextEdit item. If this
+    Whether the user can interact with the TextEdit item. If this
     property is set to true the text cannot be edited by user interaction.
 
     By default this property is false.
diff --git a/src/declarative/items/checksync.pl b/src/declarative/items/checksync.pl
new file mode 100755
index 0000000000..26288bf1f4
--- /dev/null
+++ b/src/declarative/items/checksync.pl
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+#############################################################################
+##
+## Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+## All rights reserved.
+## Contact: Nokia Corporation (qt-info@nokia.com)
+##
+## This file is part of the Declarative module of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## No Commercial Usage
+## This file contains pre-release code and may not be distributed.
+## You may use this file in accordance with the terms and conditions
+## contained in the Technology Preview License Agreement accompanying
+## this package.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 2.1 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL included in the
+## packaging of this file.  Please review the following information to
+## ensure the GNU Lesser General Public License version 2.1 requirements
+## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+##
+## In addition, as a special exception, Nokia gives you certain additional
+## rights.  These rights are described in the Nokia Qt LGPL Exception
+## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+##
+## If you have questions regarding the use of this file, please contact
+## Nokia at qt-info@nokia.com.
+##
+##
+##
+##
+##
+##
+##
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+use strict;
+use warnings;
+
+die "Usage: $0 <QML directory>" if (@ARGV != 1);
+
+my @excludes;
+open (SYNCEXCLUDES, "<", "syncexcludes");
+while (<SYNCEXCLUDES>) {
+    if (/^([a-zA-Z0-9\._]+)/) {
+        my $exclude = $1;
+        push (@excludes, $exclude);
+    }
+}
+
+my $portdir = ".";
+my $qmldir = $ARGV[0];
+
+opendir (PORTDIR, $portdir) or die "Cannot open port directory";
+opendir (QMLDIR, $qmldir) or die "Cannot open QML directory";
+
+my @portfiles = readdir(PORTDIR);
+my @qmlfiles = readdir(QMLDIR);
+
+closedir(PORTDIR);
+closedir(QMLDIR);
+
+foreach my $qmlfile (@qmlfiles) {
+    if ($qmlfile =~ /^qdeclarative.*\.cpp$/ or $qmlfile =~ /qdeclarative.*\.h$/) {
+
+        if (grep { $_ eq $qmlfile} @excludes) {
+            next;
+        }
+
+        my $portfile = $qmlfile;
+        $portfile =~ s/^qdeclarative/qsg/;
+
+        if (grep { $_ eq $portfile} @portfiles) {
+
+            open (PORTFILE, "<", "$portdir/$portfile") or die("Cannot open $portdir/$portfile for reading");
+
+            my $firstline = <PORTFILE>;
+
+            close (PORTFILE);
+
+            if ($firstline and $firstline =~ /^\/\/ Commit: ([a-z0-9]+)/) {
+                my $sha1 = $1;
+                my $commitSha1 = "";
+
+                my $output = `cd $qmldir; git log $qmlfile | head -n 1`;
+                if ($output =~ /commit ([a-z0-9]+)/) {
+                    $commitSha1 = $1;
+                }
+
+                if ($commitSha1 eq $sha1) {
+                    print ("$portfile: OK\n");
+                } else {
+                    print ("$portfile: OUT OF DATE\n");
+                }
+            } else {
+                print ("$portfile: OUT OF DATE\n");
+            }
+        } else {
+            print ("$portfile: MISSING\n");
+        }
+    }
+}
diff --git a/src/declarative/items/items.pri b/src/declarative/items/items.pri
new file mode 100644
index 0000000000..3dbb4fa910
--- /dev/null
+++ b/src/declarative/items/items.pri
@@ -0,0 +1,109 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+    $$PWD/qsgevents_p_p.h \
+    $$PWD/qsgitemchangelistener_p.h \
+    $$PWD/qsganchors_p.h \
+    $$PWD/qsganchors_p_p.h \
+    $$PWD/qsgitem.h \
+    $$PWD/qsgitem_p.h \
+    $$PWD/qsgrectangle_p.h \
+    $$PWD/qsgrectangle_p_p.h \
+    $$PWD/qsgcanvas.h \
+    $$PWD/qsgcanvas_p.h \
+    $$PWD/qsgfocusscope_p.h \
+    $$PWD/qsgitemsmodule_p.h \
+    $$PWD/qsgpainteditem.h \
+    $$PWD/qsgpainteditem_p.h \
+    $$PWD/qsgtext_p.h \
+    $$PWD/qsgtext_p_p.h \
+    $$PWD/qsgtextnode_p.h \
+    $$PWD/qsgtextinput_p.h \
+    $$PWD/qsgtextinput_p_p.h \
+    $$PWD/qsgtextedit_p.h \
+    $$PWD/qsgtextedit_p_p.h \
+    $$PWD/qsgimagebase_p.h \
+    $$PWD/qsgimagebase_p_p.h \
+    $$PWD/qsgimage_p.h \
+    $$PWD/qsgimage_p_p.h \
+    $$PWD/qsgborderimage_p.h \
+    $$PWD/qsgborderimage_p_p.h \
+    $$PWD/qsgninepatchnode_p.h \
+    $$PWD/qsgscalegrid_p_p.h \
+    $$PWD/qsgmousearea_p.h \
+    $$PWD/qsgmousearea_p_p.h \
+    $$PWD/qsgpincharea_p.h \
+    $$PWD/qsgpincharea_p_p.h \
+    $$PWD/qsgflickable_p.h \
+    $$PWD/qsgflickable_p_p.h \
+    $$PWD/qsglistview_p.h \
+    $$PWD/qsgvisualitemmodel_p.h \
+    $$PWD/qsgrepeater_p.h \
+    $$PWD/qsgrepeater_p_p.h \
+    $$PWD/qsggridview_p.h \
+    $$PWD/qsgpathview_p.h \
+    $$PWD/qsgpathview_p_p.h \
+    $$PWD/qsgpositioners_p.h \
+    $$PWD/qsgpositioners_p_p.h \
+    $$PWD/qsgloader_p.h \
+    $$PWD/qsgloader_p_p.h \
+    $$PWD/qsganimatedimage_p.h \
+    $$PWD/qsganimatedimage_p_p.h \
+    $$PWD/qsgflipable_p.h \
+    $$PWD/qsgtranslate_p.h \
+    $$PWD/qsgclipnode_p.h \
+    $$PWD/qsgview.h \
+    $$PWD/qsganimation_p.h \
+    $$PWD/qsganimation_p_p.h \
+    $$PWD/qsgstateoperations_p.h \
+    $$PWD/qsgimplicitsizeitem_p.h \
+    $$PWD/qsgimplicitsizeitem_p_p.h \
+
+SOURCES += \
+    $$PWD/qsgevents.cpp \
+    $$PWD/qsganchors.cpp \
+    $$PWD/qsgitem.cpp \
+    $$PWD/qsgrectangle.cpp \
+    $$PWD/qsgcanvas.cpp \
+    $$PWD/qsgfocusscope.cpp \
+    $$PWD/qsgitemsmodule.cpp \
+    $$PWD/qsgpainteditem.cpp \
+    $$PWD/qsgtext.cpp \
+    $$PWD/qsgtextnode.cpp \
+    $$PWD/qsgtextinput.cpp \
+    $$PWD/qsgtextedit.cpp \
+    $$PWD/qsgimagebase.cpp \
+    $$PWD/qsgimage.cpp \
+    $$PWD/qsgborderimage.cpp \
+    $$PWD/qsgninepatchnode.cpp \
+    $$PWD/qsgscalegrid.cpp \
+    $$PWD/qsgmousearea.cpp \
+    $$PWD/qsgpincharea.cpp \
+    $$PWD/qsgflickable.cpp \
+    $$PWD/qsglistview.cpp \
+    $$PWD/qsgvisualitemmodel.cpp \
+    $$PWD/qsgrepeater.cpp \
+    $$PWD/qsggridview.cpp \
+    $$PWD/qsgpathview.cpp \
+    $$PWD/qsgpositioners.cpp \
+    $$PWD/qsgloader.cpp \
+    $$PWD/qsganimatedimage.cpp \
+    $$PWD/qsgflipable.cpp \
+    $$PWD/qsgtranslate.cpp \
+    $$PWD/qsgclipnode.cpp \
+    $$PWD/qsgview.cpp \
+    $$PWD/qsganimation.cpp \
+    $$PWD/qsgstateoperations.cpp \
+    $$PWD/qsgimplicitsizeitem.cpp \
+
+SOURCES += \
+    $$PWD/qsgshadereffectitem.cpp \
+    $$PWD/qsgshadereffectmesh.cpp \
+    $$PWD/qsgshadereffectnode.cpp \
+    $$PWD/qsgshadereffectsource.cpp \
+
+HEADERS += \
+    $$PWD/qsgshadereffectitem_p.h \
+    $$PWD/qsgshadereffectmesh_p.h \
+    $$PWD/qsgshadereffectnode_p.h \
+    $$PWD/qsgshadereffectsource_p.h \
diff --git a/src/declarative/items/qsganchors.cpp b/src/declarative/items/qsganchors.cpp
new file mode 100644
index 0000000000..ff9351edbc
--- /dev/null
+++ b/src/declarative/items/qsganchors.cpp
@@ -0,0 +1,1111 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsganchors_p_p.h"
+
+#include "qsgitem.h"
+#include "qsgitem_p.h"
+
+#include <qdeclarativeinfo.h>
+
+QT_BEGIN_NAMESPACE
+
+//TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
+//TODO: support non-parent, non-sibling (need to find lowest common ancestor)
+
+static qreal hcenter(QSGItem *item)
+{
+    qreal width = item->width();
+    int iw = width;
+    if (iw % 2)
+        return (width + 1) / 2;
+    else
+        return width / 2;
+}
+
+static qreal vcenter(QSGItem *item)
+{
+    qreal height = item->height();
+    int ih = height;
+    if (ih % 2)
+        return (height + 1) / 2;
+    else
+        return height / 2;
+}
+
+//### const item?
+//local position
+static qreal position(QSGItem *item, QSGAnchorLine::AnchorLine anchorLine)
+{
+    qreal ret = 0.0;
+    switch(anchorLine) {
+    case QSGAnchorLine::Left:
+        ret = item->x();
+        break;
+    case QSGAnchorLine::Right:
+        ret = item->x() + item->width();
+        break;
+    case QSGAnchorLine::Top:
+        ret = item->y();
+        break;
+    case QSGAnchorLine::Bottom:
+        ret = item->y() + item->height();
+        break;
+    case QSGAnchorLine::HCenter:
+        ret = item->x() + hcenter(item);
+        break;
+    case QSGAnchorLine::VCenter:
+        ret = item->y() + vcenter(item);
+        break;
+    case QSGAnchorLine::Baseline:
+        ret = item->y() + item->baselineOffset();
+        break;
+    default:
+        break;
+    }
+
+    return ret;
+}
+
+//position when origin is 0,0
+static qreal adjustedPosition(QSGItem *item, QSGAnchorLine::AnchorLine anchorLine)
+{
+    qreal ret = 0.0;
+    switch(anchorLine) {
+    case QSGAnchorLine::Left:
+        ret = 0.0;
+        break;
+    case QSGAnchorLine::Right:
+        ret = item->width();
+        break;
+    case QSGAnchorLine::Top:
+        ret = 0.0;
+        break;
+    case QSGAnchorLine::Bottom:
+        ret = item->height();
+        break;
+    case QSGAnchorLine::HCenter:
+        ret = hcenter(item);
+        break;
+    case QSGAnchorLine::VCenter:
+        ret = vcenter(item);
+        break;
+    case QSGAnchorLine::Baseline:
+        ret = item->baselineOffset();
+        break;
+    default:
+        break;
+    }
+
+    return ret;
+}
+
+QSGAnchors::QSGAnchors(QSGItem *item, QObject *parent)
+: QObject(*new QSGAnchorsPrivate(item), parent)
+{
+}
+
+QSGAnchors::~QSGAnchors()
+{
+    Q_D(QSGAnchors);
+    d->remDepend(d->fill);
+    d->remDepend(d->centerIn);
+    d->remDepend(d->left.item);
+    d->remDepend(d->right.item);
+    d->remDepend(d->top.item);
+    d->remDepend(d->bottom.item);
+    d->remDepend(d->vCenter.item);
+    d->remDepend(d->hCenter.item);
+    d->remDepend(d->baseline.item);
+}
+
+void QSGAnchorsPrivate::fillChanged()
+{
+    Q_Q(QSGAnchors);
+    if (!fill || !isItemComplete())
+        return;
+
+    if (updatingFill < 2) {
+        ++updatingFill;
+
+        qreal horizontalMargin = q->mirrored() ? rightMargin : leftMargin;
+
+        if (fill == item->parentItem()) {                         //child-parent
+            setItemPos(QPointF(horizontalMargin, topMargin));
+        } else if (fill->parentItem() == item->parentItem()) {   //siblings
+            setItemPos(QPointF(fill->x()+horizontalMargin, fill->y()+topMargin));
+        }
+        setItemSize(QSizeF(fill->width()-leftMargin-rightMargin, fill->height()-topMargin-bottomMargin));
+
+        --updatingFill;
+    } else {
+        // ### Make this certain :)
+        qmlInfo(item) << QSGAnchors::tr("Possible anchor loop detected on fill.");
+    }
+
+}
+
+void QSGAnchorsPrivate::centerInChanged()
+{
+    Q_Q(QSGAnchors);
+    if (!centerIn || fill || !isItemComplete())
+        return;
+
+    if (updatingCenterIn < 2) {
+        ++updatingCenterIn;
+
+        qreal effectiveHCenterOffset = q->mirrored() ? -hCenterOffset : hCenterOffset;
+        if (centerIn == item->parentItem()) {
+            QPointF p(hcenter(item->parentItem()) - hcenter(item) + effectiveHCenterOffset,
+                      vcenter(item->parentItem()) - vcenter(item) + vCenterOffset);
+            setItemPos(p);
+
+        } else if (centerIn->parentItem() == item->parentItem()) {
+            QPointF p(centerIn->x() + hcenter(centerIn) - hcenter(item) + effectiveHCenterOffset,
+                      centerIn->y() + vcenter(centerIn) - vcenter(item) + vCenterOffset);
+            setItemPos(p);
+        }
+
+        --updatingCenterIn;
+    } else {
+        // ### Make this certain :)
+        qmlInfo(item) << QSGAnchors::tr("Possible anchor loop detected on centerIn.");
+    }
+}
+
+void QSGAnchorsPrivate::clearItem(QSGItem *item)
+{
+    if (!item)
+        return;
+    if (fill == item)
+        fill = 0;
+    if (centerIn == item)
+        centerIn = 0;
+    if (left.item == item) {
+        left.item = 0;
+        usedAnchors &= ~QSGAnchors::LeftAnchor;
+    }
+    if (right.item == item) {
+        right.item = 0;
+        usedAnchors &= ~QSGAnchors::RightAnchor;
+    }
+    if (top.item == item) {
+        top.item = 0;
+        usedAnchors &= ~QSGAnchors::TopAnchor;
+    }
+    if (bottom.item == item) {
+        bottom.item = 0;
+        usedAnchors &= ~QSGAnchors::BottomAnchor;
+    }
+    if (vCenter.item == item) {
+        vCenter.item = 0;
+        usedAnchors &= ~QSGAnchors::VCenterAnchor;
+    }
+    if (hCenter.item == item) {
+        hCenter.item = 0;
+        usedAnchors &= ~QSGAnchors::HCenterAnchor;
+    }
+    if (baseline.item == item) {
+        baseline.item = 0;
+        usedAnchors &= ~QSGAnchors::BaselineAnchor;
+    }
+}
+
+void QSGAnchorsPrivate::addDepend(QSGItem *item)
+{
+    if (!item)
+        return;
+    
+    QSGItemPrivate *p = QSGItemPrivate::get(item);
+    p->addItemChangeListener(this, QSGItemPrivate::Geometry);
+}
+
+void QSGAnchorsPrivate::remDepend(QSGItem *item)
+{
+    if (!item)
+        return;
+
+    QSGItemPrivate *p = QSGItemPrivate::get(item);
+    p->removeItemChangeListener(this, QSGItemPrivate::Geometry);
+}
+
+bool QSGAnchors::mirrored()
+{
+    Q_D(QSGAnchors);
+    return QSGItemPrivate::get(d->item)->effectiveLayoutMirror;
+}
+
+bool QSGAnchorsPrivate::isItemComplete() const
+{
+    return componentComplete;
+}
+
+void QSGAnchors::classBegin()
+{
+    Q_D(QSGAnchors);
+    d->componentComplete = false;
+}
+
+void QSGAnchors::componentComplete()
+{
+    Q_D(QSGAnchors);
+    d->componentComplete = true;
+}
+
+void QSGAnchorsPrivate::setItemHeight(qreal v)
+{
+    updatingMe = true;
+    item->setHeight(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::setItemWidth(qreal v)
+{
+    updatingMe = true;
+    item->setWidth(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::setItemX(qreal v)
+{
+    updatingMe = true;
+    item->setX(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::setItemY(qreal v)
+{
+    updatingMe = true;
+    item->setY(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::setItemPos(const QPointF &v)
+{
+    updatingMe = true;
+    item->setPos(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::setItemSize(const QSizeF &v)
+{
+    updatingMe = true;
+    item->setSize(v);
+    updatingMe = false;
+}
+
+void QSGAnchorsPrivate::updateMe()
+{
+    if (updatingMe) {
+        updatingMe = false;
+        return;
+    }
+
+    fillChanged();
+    centerInChanged();
+    updateHorizontalAnchors();
+    updateVerticalAnchors();
+}
+
+void QSGAnchorsPrivate::updateOnComplete()
+{
+    fillChanged();
+    centerInChanged();
+    updateHorizontalAnchors();
+    updateVerticalAnchors();
+}
+
+void QSGAnchorsPrivate::itemGeometryChanged(QSGItem *, const QRectF &newG, const QRectF &oldG)
+{
+    fillChanged();
+    centerInChanged();
+    if (newG.x() != oldG.x() || newG.width() != oldG.width())
+        updateHorizontalAnchors();
+    if (newG.y() != oldG.y() || newG.height() != oldG.height())
+        updateVerticalAnchors();
+}
+
+QSGItem *QSGAnchors::fill() const
+{
+    Q_D(const QSGAnchors);
+    return d->fill;
+}
+
+void QSGAnchors::setFill(QSGItem *f)
+{
+    Q_D(QSGAnchors);
+    if (d->fill == f)
+        return;
+
+    if (!f) {
+        d->remDepend(d->fill);
+        d->fill = f;
+        emit fillChanged();
+        return;
+    }
+    if (f != d->item->parentItem() && f->parentItem() != d->item->parentItem()){
+        qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
+        return;
+    }
+    d->remDepend(d->fill);
+    d->fill = f;
+    d->addDepend(d->fill);
+    emit fillChanged();
+    d->fillChanged();
+}
+
+void QSGAnchors::resetFill()
+{
+    setFill(0);
+}
+
+QSGItem *QSGAnchors::centerIn() const
+{
+    Q_D(const QSGAnchors);
+    return d->centerIn;
+}
+
+void QSGAnchors::setCenterIn(QSGItem* c)
+{
+    Q_D(QSGAnchors);
+    if (d->centerIn == c)
+        return;
+
+    if (!c) {
+        d->remDepend(d->centerIn);
+        d->centerIn = c;
+        emit centerInChanged();
+        return;
+    }
+    if (c != d->item->parentItem() && c->parentItem() != d->item->parentItem()){
+        qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
+        return;
+    }
+
+    d->remDepend(d->centerIn);
+    d->centerIn = c;
+    d->addDepend(d->centerIn);
+    emit centerInChanged();
+    d->centerInChanged();
+}
+
+void QSGAnchors::resetCenterIn()
+{
+    setCenterIn(0);
+}
+
+bool QSGAnchorsPrivate::calcStretch(const QSGAnchorLine &edge1,
+                                    const QSGAnchorLine &edge2,
+                                    qreal offset1,
+                                    qreal offset2,
+                                    QSGAnchorLine::AnchorLine line,
+                                    qreal &stretch)
+{
+    bool edge1IsParent = (edge1.item == item->parentItem());
+    bool edge2IsParent = (edge2.item == item->parentItem());
+    bool edge1IsSibling = (edge1.item->parentItem() == item->parentItem());
+    bool edge2IsSibling = (edge2.item->parentItem() == item->parentItem());
+
+    bool invalid = false;
+    if ((edge2IsParent && edge1IsParent) || (edge2IsSibling && edge1IsSibling)) {
+        stretch = (position(edge2.item, edge2.anchorLine) + offset2)
+                    - (position(edge1.item, edge1.anchorLine) + offset1);
+    } else if (edge2IsParent && edge1IsSibling) {
+        stretch = (position(edge2.item, edge2.anchorLine) + offset2)
+                    - (position(item->parentItem(), line)
+                    + position(edge1.item, edge1.anchorLine) + offset1);
+    } else if (edge2IsSibling && edge1IsParent) {
+        stretch = (position(item->parentItem(), line) + position(edge2.item, edge2.anchorLine) + offset2)
+                    - (position(edge1.item, edge1.anchorLine) + offset1);
+    } else
+        invalid = true;
+
+    return invalid;
+}
+
+void QSGAnchorsPrivate::updateVerticalAnchors()
+{
+    if (fill || centerIn || !isItemComplete())
+        return;
+
+    if (updatingVerticalAnchor < 2) {
+        ++updatingVerticalAnchor;
+        if (usedAnchors & QSGAnchors::TopAnchor) {
+            //Handle stretching
+            bool invalid = true;
+            qreal height = 0.0;
+            if (usedAnchors & QSGAnchors::BottomAnchor) {
+                invalid = calcStretch(top, bottom, topMargin, -bottomMargin, QSGAnchorLine::Top, height);
+            } else if (usedAnchors & QSGAnchors::VCenterAnchor) {
+                invalid = calcStretch(top, vCenter, topMargin, vCenterOffset, QSGAnchorLine::Top, height);
+                height *= 2;
+            }
+            if (!invalid)
+                setItemHeight(height);
+
+            //Handle top
+            if (top.item == item->parentItem()) {
+                setItemY(adjustedPosition(top.item, top.anchorLine) + topMargin);
+            } else if (top.item->parentItem() == item->parentItem()) {
+                setItemY(position(top.item, top.anchorLine) + topMargin);
+            }
+        } else if (usedAnchors & QSGAnchors::BottomAnchor) {
+            //Handle stretching (top + bottom case is handled above)
+            if (usedAnchors & QSGAnchors::VCenterAnchor) {
+                qreal height = 0.0;
+                bool invalid = calcStretch(vCenter, bottom, vCenterOffset, -bottomMargin,
+                                              QSGAnchorLine::Top, height);
+                if (!invalid)
+                    setItemHeight(height*2);
+            }
+
+            //Handle bottom
+            if (bottom.item == item->parentItem()) {
+                setItemY(adjustedPosition(bottom.item, bottom.anchorLine) - item->height() - bottomMargin);
+            } else if (bottom.item->parentItem() == item->parentItem()) {
+                setItemY(position(bottom.item, bottom.anchorLine) - item->height() - bottomMargin);
+            }
+        } else if (usedAnchors & QSGAnchors::VCenterAnchor) {
+            //(stetching handled above)
+
+            //Handle vCenter
+            if (vCenter.item == item->parentItem()) {
+                setItemY(adjustedPosition(vCenter.item, vCenter.anchorLine)
+                              - vcenter(item) + vCenterOffset);
+            } else if (vCenter.item->parentItem() == item->parentItem()) {
+                setItemY(position(vCenter.item, vCenter.anchorLine) - vcenter(item) + vCenterOffset);
+            }
+        } else if (usedAnchors & QSGAnchors::BaselineAnchor) {
+            //Handle baseline
+            if (baseline.item == item->parentItem()) {
+                setItemY(adjustedPosition(baseline.item, baseline.anchorLine) - item->baselineOffset() + baselineOffset);
+            } else if (baseline.item->parentItem() == item->parentItem()) {
+                setItemY(position(baseline.item, baseline.anchorLine) - item->baselineOffset() + baselineOffset);
+            }
+        }
+        --updatingVerticalAnchor;
+    } else {
+        // ### Make this certain :)
+        qmlInfo(item) << QSGAnchors::tr("Possible anchor loop detected on vertical anchor.");
+    }
+}
+
+inline QSGAnchorLine::AnchorLine reverseAnchorLine(QSGAnchorLine::AnchorLine anchorLine)
+{
+    if (anchorLine == QSGAnchorLine::Left) {
+        return QSGAnchorLine::Right;
+    } else if (anchorLine == QSGAnchorLine::Right) {
+        return QSGAnchorLine::Left;
+    } else {
+        return anchorLine;
+    }
+}
+
+void QSGAnchorsPrivate::updateHorizontalAnchors()
+{
+    Q_Q(QSGAnchors);
+    if (fill || centerIn || !isItemComplete())
+        return;
+
+    if (updatingHorizontalAnchor < 3) {
+        ++updatingHorizontalAnchor;
+        qreal effectiveRightMargin, effectiveLeftMargin, effectiveHorizontalCenterOffset;
+        QSGAnchorLine effectiveLeft, effectiveRight, effectiveHorizontalCenter;
+        QSGAnchors::Anchor effectiveLeftAnchor, effectiveRightAnchor;
+        if (q->mirrored()) {
+            effectiveLeftAnchor = QSGAnchors::RightAnchor;
+            effectiveRightAnchor = QSGAnchors::LeftAnchor;
+            effectiveLeft.item = right.item;
+            effectiveLeft.anchorLine = reverseAnchorLine(right.anchorLine);
+            effectiveRight.item = left.item;
+            effectiveRight.anchorLine = reverseAnchorLine(left.anchorLine);
+            effectiveHorizontalCenter.item = hCenter.item;
+            effectiveHorizontalCenter.anchorLine = reverseAnchorLine(hCenter.anchorLine);
+            effectiveLeftMargin = rightMargin;
+            effectiveRightMargin = leftMargin;
+            effectiveHorizontalCenterOffset = -hCenterOffset;
+        } else {
+            effectiveLeftAnchor = QSGAnchors::LeftAnchor;
+            effectiveRightAnchor = QSGAnchors::RightAnchor;
+            effectiveLeft = left;
+            effectiveRight = right;
+            effectiveHorizontalCenter = hCenter;
+            effectiveLeftMargin = leftMargin;
+            effectiveRightMargin = rightMargin;
+            effectiveHorizontalCenterOffset = hCenterOffset;
+        }
+
+        if (usedAnchors & effectiveLeftAnchor) {
+            //Handle stretching
+            bool invalid = true;
+            qreal width = 0.0;
+            if (usedAnchors & effectiveRightAnchor) {
+                invalid = calcStretch(effectiveLeft, effectiveRight, effectiveLeftMargin, -effectiveRightMargin, QSGAnchorLine::Left, width);
+            } else if (usedAnchors & QSGAnchors::HCenterAnchor) {
+                invalid = calcStretch(effectiveLeft, effectiveHorizontalCenter, effectiveLeftMargin, effectiveHorizontalCenterOffset, QSGAnchorLine::Left, width);
+                width *= 2;
+            }
+            if (!invalid)
+                setItemWidth(width);
+
+            //Handle left
+            if (effectiveLeft.item == item->parentItem()) {
+                setItemX(adjustedPosition(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
+            } else if (effectiveLeft.item->parentItem() == item->parentItem()) {
+                setItemX(position(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
+            }
+        } else if (usedAnchors & effectiveRightAnchor) {
+            //Handle stretching (left + right case is handled in updateLeftAnchor)
+            if (usedAnchors & QSGAnchors::HCenterAnchor) {
+                qreal width = 0.0;
+                bool invalid = calcStretch(effectiveHorizontalCenter, effectiveRight, effectiveHorizontalCenterOffset, -effectiveRightMargin,
+                                              QSGAnchorLine::Left, width);
+                if (!invalid)
+                    setItemWidth(width*2);
+            }
+
+            //Handle right
+            if (effectiveRight.item == item->parentItem()) {
+                setItemX(adjustedPosition(effectiveRight.item, effectiveRight.anchorLine) - item->width() - effectiveRightMargin);
+            } else if (effectiveRight.item->parentItem() == item->parentItem()) {
+                setItemX(position(effectiveRight.item, effectiveRight.anchorLine) - item->width() - effectiveRightMargin);
+            }
+        } else if (usedAnchors & QSGAnchors::HCenterAnchor) {
+            //Handle hCenter
+            if (effectiveHorizontalCenter.item == item->parentItem()) {
+                setItemX(adjustedPosition(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
+            } else if (effectiveHorizontalCenter.item->parentItem() == item->parentItem()) {
+                setItemX(position(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
+            }
+        }
+        --updatingHorizontalAnchor;
+    } else {
+        // ### Make this certain :)
+        qmlInfo(item) << QSGAnchors::tr("Possible anchor loop detected on horizontal anchor.");
+    }
+}
+
+QSGAnchorLine QSGAnchors::top() const
+{
+    Q_D(const QSGAnchors);
+    return d->top;
+}
+
+void QSGAnchors::setTop(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkVAnchorValid(edge) || d->top == edge)
+        return;
+
+    d->usedAnchors |= TopAnchor;
+
+    if (!d->checkVValid()) {
+        d->usedAnchors &= ~TopAnchor;
+        return;
+    }
+
+    d->remDepend(d->top.item);
+    d->top = edge;
+    d->addDepend(d->top.item);
+    emit topChanged();
+    d->updateVerticalAnchors();
+}
+
+void QSGAnchors::resetTop()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~TopAnchor;
+    d->remDepend(d->top.item);
+    d->top = QSGAnchorLine();
+    emit topChanged();
+    d->updateVerticalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::bottom() const
+{
+    Q_D(const QSGAnchors);
+    return d->bottom;
+}
+
+void QSGAnchors::setBottom(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkVAnchorValid(edge) || d->bottom == edge)
+        return;
+
+    d->usedAnchors |= BottomAnchor;
+
+    if (!d->checkVValid()) {
+        d->usedAnchors &= ~BottomAnchor;
+        return;
+    }
+
+    d->remDepend(d->bottom.item);
+    d->bottom = edge;
+    d->addDepend(d->bottom.item);
+    emit bottomChanged();
+    d->updateVerticalAnchors();
+}
+
+void QSGAnchors::resetBottom()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~BottomAnchor;
+    d->remDepend(d->bottom.item);
+    d->bottom = QSGAnchorLine();
+    emit bottomChanged();
+    d->updateVerticalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::verticalCenter() const
+{
+    Q_D(const QSGAnchors);
+    return d->vCenter;
+}
+
+void QSGAnchors::setVerticalCenter(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkVAnchorValid(edge) || d->vCenter == edge)
+        return;
+
+    d->usedAnchors |= VCenterAnchor;
+
+    if (!d->checkVValid()) {
+        d->usedAnchors &= ~VCenterAnchor;
+        return;
+    }
+
+    d->remDepend(d->vCenter.item);
+    d->vCenter = edge;
+    d->addDepend(d->vCenter.item);
+    emit verticalCenterChanged();
+    d->updateVerticalAnchors();
+}
+
+void QSGAnchors::resetVerticalCenter()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~VCenterAnchor;
+    d->remDepend(d->vCenter.item);
+    d->vCenter = QSGAnchorLine();
+    emit verticalCenterChanged();
+    d->updateVerticalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::baseline() const
+{
+    Q_D(const QSGAnchors);
+    return d->baseline;
+}
+
+void QSGAnchors::setBaseline(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkVAnchorValid(edge) || d->baseline == edge)
+        return;
+
+    d->usedAnchors |= BaselineAnchor;
+
+    if (!d->checkVValid()) {
+        d->usedAnchors &= ~BaselineAnchor;
+        return;
+    }
+
+    d->remDepend(d->baseline.item);
+    d->baseline = edge;
+    d->addDepend(d->baseline.item);
+    emit baselineChanged();
+    d->updateVerticalAnchors();
+}
+
+void QSGAnchors::resetBaseline()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~BaselineAnchor;
+    d->remDepend(d->baseline.item);
+    d->baseline = QSGAnchorLine();
+    emit baselineChanged();
+    d->updateVerticalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::left() const
+{
+    Q_D(const QSGAnchors);
+    return d->left;
+}
+
+void QSGAnchors::setLeft(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkHAnchorValid(edge) || d->left == edge)
+        return;
+
+    d->usedAnchors |= LeftAnchor;
+
+    if (!d->checkHValid()) {
+        d->usedAnchors &= ~LeftAnchor;
+        return;
+    }
+
+    d->remDepend(d->left.item);
+    d->left = edge;
+    d->addDepend(d->left.item);
+    emit leftChanged();
+    d->updateHorizontalAnchors();
+}
+
+void QSGAnchors::resetLeft()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~LeftAnchor;
+    d->remDepend(d->left.item);
+    d->left = QSGAnchorLine();
+    emit leftChanged();
+    d->updateHorizontalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::right() const
+{
+    Q_D(const QSGAnchors);
+    return d->right;
+}
+
+void QSGAnchors::setRight(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkHAnchorValid(edge) || d->right == edge)
+        return;
+
+    d->usedAnchors |= RightAnchor;
+
+    if (!d->checkHValid()) {
+        d->usedAnchors &= ~RightAnchor;
+        return;
+    }
+
+    d->remDepend(d->right.item);
+    d->right = edge;
+    d->addDepend(d->right.item);
+    emit rightChanged();
+    d->updateHorizontalAnchors();
+}
+
+void QSGAnchors::resetRight()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~RightAnchor;
+    d->remDepend(d->right.item);
+    d->right = QSGAnchorLine();
+    emit rightChanged();
+    d->updateHorizontalAnchors();
+}
+
+QSGAnchorLine QSGAnchors::horizontalCenter() const
+{
+    Q_D(const QSGAnchors);
+    return d->hCenter;
+}
+
+void QSGAnchors::setHorizontalCenter(const QSGAnchorLine &edge)
+{
+    Q_D(QSGAnchors);
+    if (!d->checkHAnchorValid(edge) || d->hCenter == edge)
+        return;
+
+    d->usedAnchors |= HCenterAnchor;
+
+    if (!d->checkHValid()) {
+        d->usedAnchors &= ~HCenterAnchor;
+        return;
+    }
+
+    d->remDepend(d->hCenter.item);
+    d->hCenter = edge;
+    d->addDepend(d->hCenter.item);
+    emit horizontalCenterChanged();
+    d->updateHorizontalAnchors();
+}
+
+void QSGAnchors::resetHorizontalCenter()
+{
+    Q_D(QSGAnchors);
+    d->usedAnchors &= ~HCenterAnchor;
+    d->remDepend(d->hCenter.item);
+    d->hCenter = QSGAnchorLine();
+    emit horizontalCenterChanged();
+    d->updateHorizontalAnchors();
+}
+
+qreal QSGAnchors::leftMargin() const
+{
+    Q_D(const QSGAnchors);
+    return d->leftMargin;
+}
+
+void QSGAnchors::setLeftMargin(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->leftMargin == offset)
+        return;
+    d->leftMargin = offset;
+    if(d->fill)
+        d->fillChanged();
+    else
+        d->updateHorizontalAnchors();
+    emit leftMarginChanged();
+}
+
+qreal QSGAnchors::rightMargin() const
+{
+    Q_D(const QSGAnchors);
+    return d->rightMargin;
+}
+
+void QSGAnchors::setRightMargin(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->rightMargin == offset)
+        return;
+    d->rightMargin = offset;
+    if(d->fill)
+        d->fillChanged();
+    else
+        d->updateHorizontalAnchors();
+    emit rightMarginChanged();
+}
+
+qreal QSGAnchors::margins() const
+{
+    Q_D(const QSGAnchors);
+    return d->margins;
+}
+
+void QSGAnchors::setMargins(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->margins == offset)
+        return;
+    //###Is it significantly faster to set them directly so we can call fillChanged only once?
+    if(!d->rightMargin || d->rightMargin == d->margins)
+        setRightMargin(offset);
+    if(!d->leftMargin || d->leftMargin == d->margins)
+        setLeftMargin(offset);
+    if(!d->topMargin || d->topMargin == d->margins)
+        setTopMargin(offset);
+    if(!d->bottomMargin || d->bottomMargin == d->margins)
+        setBottomMargin(offset);
+    d->margins = offset;
+    emit marginsChanged();
+
+}
+
+qreal QSGAnchors::horizontalCenterOffset() const
+{
+    Q_D(const QSGAnchors);
+    return d->hCenterOffset;
+}
+
+void QSGAnchors::setHorizontalCenterOffset(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->hCenterOffset == offset)
+        return;
+    d->hCenterOffset = offset;
+    if(d->centerIn)
+        d->centerInChanged();
+    else
+        d->updateHorizontalAnchors();
+    emit horizontalCenterOffsetChanged();
+}
+
+qreal QSGAnchors::topMargin() const
+{
+    Q_D(const QSGAnchors);
+    return d->topMargin;
+}
+
+void QSGAnchors::setTopMargin(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->topMargin == offset)
+        return;
+    d->topMargin = offset;
+    if(d->fill)
+        d->fillChanged();
+    else
+        d->updateVerticalAnchors();
+    emit topMarginChanged();
+}
+
+qreal QSGAnchors::bottomMargin() const
+{
+    Q_D(const QSGAnchors);
+    return d->bottomMargin;
+}
+
+void QSGAnchors::setBottomMargin(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->bottomMargin == offset)
+        return;
+    d->bottomMargin = offset;
+    if(d->fill)
+        d->fillChanged();
+    else
+        d->updateVerticalAnchors();
+    emit bottomMarginChanged();
+}
+
+qreal QSGAnchors::verticalCenterOffset() const
+{
+    Q_D(const QSGAnchors);
+    return d->vCenterOffset;
+}
+
+void QSGAnchors::setVerticalCenterOffset(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->vCenterOffset == offset)
+        return;
+    d->vCenterOffset = offset;
+    if(d->centerIn)
+        d->centerInChanged();
+    else
+        d->updateVerticalAnchors();
+    emit verticalCenterOffsetChanged();
+}
+
+qreal QSGAnchors::baselineOffset() const
+{
+    Q_D(const QSGAnchors);
+    return d->baselineOffset;
+}
+
+void QSGAnchors::setBaselineOffset(qreal offset)
+{
+    Q_D(QSGAnchors);
+    if (d->baselineOffset == offset)
+        return;
+    d->baselineOffset = offset;
+    d->updateVerticalAnchors();
+    emit baselineOffsetChanged();
+}
+
+QSGAnchors::Anchors QSGAnchors::usedAnchors() const
+{
+    Q_D(const QSGAnchors);
+    return d->usedAnchors;
+}
+
+bool QSGAnchorsPrivate::checkHValid() const
+{
+    if (usedAnchors & QSGAnchors::LeftAnchor &&
+        usedAnchors & QSGAnchors::RightAnchor &&
+        usedAnchors & QSGAnchors::HCenterAnchor) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot specify left, right, and hcenter anchors.");
+        return false;
+    }
+
+    return true;
+}
+
+bool QSGAnchorsPrivate::checkHAnchorValid(QSGAnchorLine anchor) const
+{
+    if (!anchor.item) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor to a null item.");
+        return false;
+    } else if (anchor.anchorLine & QSGAnchorLine::Vertical_Mask) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor a horizontal edge to a vertical edge.");
+        return false;
+    } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
+        return false;
+    } else if (anchor.item == item) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor item to self.");
+        return false;
+    }
+
+    return true;
+}
+
+bool QSGAnchorsPrivate::checkVValid() const
+{
+    if (usedAnchors & QSGAnchors::TopAnchor &&
+        usedAnchors & QSGAnchors::BottomAnchor &&
+        usedAnchors & QSGAnchors::VCenterAnchor) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot specify top, bottom, and vcenter anchors.");
+        return false;
+    } else if (usedAnchors & QSGAnchors::BaselineAnchor &&
+               (usedAnchors & QSGAnchors::TopAnchor ||
+                usedAnchors & QSGAnchors::BottomAnchor ||
+                usedAnchors & QSGAnchors::VCenterAnchor)) {
+        qmlInfo(item) << QSGAnchors::tr("Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.");
+        return false;
+    }
+
+    return true;
+}
+
+bool QSGAnchorsPrivate::checkVAnchorValid(QSGAnchorLine anchor) const
+{
+    if (!anchor.item) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor to a null item.");
+        return false;
+    } else if (anchor.anchorLine & QSGAnchorLine::Horizontal_Mask) {
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor a vertical edge to a horizontal edge.");
+        return false;
+    } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
+        return false;
+    } else if (anchor.item == item){
+        qmlInfo(item) << QSGAnchors::tr("Cannot anchor item to self.");
+        return false;
+    }
+
+    return true;
+}
+
+QT_END_NAMESPACE
+
+#include <moc_qsganchors_p.cpp>
+
diff --git a/src/declarative/items/qsganchors_p.h b/src/declarative/items/qsganchors_p.h
new file mode 100644
index 0000000000..d26fb57961
--- /dev/null
+++ b/src/declarative/items/qsganchors_p.h
@@ -0,0 +1,201 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANCHORS_P_H
+#define QSGANCHORS_P_H
+
+#include <qdeclarative.h>
+
+#include <QtCore/QObject>
+
+#include <private/qdeclarativeglobal_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItem;
+class QSGAnchorsPrivate;
+class QSGAnchorLine;
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGAnchors : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QSGAnchorLine left READ left WRITE setLeft RESET resetLeft NOTIFY leftChanged)
+    Q_PROPERTY(QSGAnchorLine right READ right WRITE setRight RESET resetRight NOTIFY rightChanged)
+    Q_PROPERTY(QSGAnchorLine horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter NOTIFY horizontalCenterChanged)
+    Q_PROPERTY(QSGAnchorLine top READ top WRITE setTop RESET resetTop NOTIFY topChanged)
+    Q_PROPERTY(QSGAnchorLine bottom READ bottom WRITE setBottom RESET resetBottom NOTIFY bottomChanged)
+    Q_PROPERTY(QSGAnchorLine verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter NOTIFY verticalCenterChanged)
+    Q_PROPERTY(QSGAnchorLine baseline READ baseline WRITE setBaseline RESET resetBaseline NOTIFY baselineChanged)
+    Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged)
+    Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
+    Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
+    Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged)
+    Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin NOTIFY topMarginChanged)
+    Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
+    Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged)
+    Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged)
+    Q_PROPERTY(QSGItem *fill READ fill WRITE setFill RESET resetFill NOTIFY fillChanged)
+    Q_PROPERTY(QSGItem *centerIn READ centerIn WRITE setCenterIn RESET resetCenterIn NOTIFY centerInChanged)
+    Q_PROPERTY(bool mirrored READ mirrored NOTIFY mirroredChanged)
+
+public:
+    QSGAnchors(QSGItem *item, QObject *parent=0);
+    virtual ~QSGAnchors();
+
+    enum Anchor {
+        LeftAnchor = 0x01,
+        RightAnchor = 0x02,
+        TopAnchor = 0x04,
+        BottomAnchor = 0x08,
+        HCenterAnchor = 0x10,
+        VCenterAnchor = 0x20,
+        BaselineAnchor = 0x40,
+        Horizontal_Mask = LeftAnchor | RightAnchor | HCenterAnchor,
+        Vertical_Mask = TopAnchor | BottomAnchor | VCenterAnchor | BaselineAnchor
+    };
+    Q_DECLARE_FLAGS(Anchors, Anchor)
+
+    QSGAnchorLine left() const;
+    void setLeft(const QSGAnchorLine &edge);
+    void resetLeft();
+
+    QSGAnchorLine right() const;
+    void setRight(const QSGAnchorLine &edge);
+    void resetRight();
+
+    QSGAnchorLine horizontalCenter() const;
+    void setHorizontalCenter(const QSGAnchorLine &edge);
+    void resetHorizontalCenter();
+
+    QSGAnchorLine top() const;
+    void setTop(const QSGAnchorLine &edge);
+    void resetTop();
+
+    QSGAnchorLine bottom() const;
+    void setBottom(const QSGAnchorLine &edge);
+    void resetBottom();
+
+    QSGAnchorLine verticalCenter() const;
+    void setVerticalCenter(const QSGAnchorLine &edge);
+    void resetVerticalCenter();
+
+    QSGAnchorLine baseline() const;
+    void setBaseline(const QSGAnchorLine &edge);
+    void resetBaseline();
+
+    qreal leftMargin() const;
+    void setLeftMargin(qreal);
+
+    qreal rightMargin() const;
+    void setRightMargin(qreal);
+
+    qreal horizontalCenterOffset() const;
+    void setHorizontalCenterOffset(qreal);
+
+    qreal topMargin() const;
+    void setTopMargin(qreal);
+
+    qreal bottomMargin() const;
+    void setBottomMargin(qreal);
+
+    qreal margins() const;
+    void setMargins(qreal);
+
+    qreal verticalCenterOffset() const;
+    void setVerticalCenterOffset(qreal);
+
+    qreal baselineOffset() const;
+    void setBaselineOffset(qreal);
+
+    QSGItem *fill() const;
+    void setFill(QSGItem *);
+    void resetFill();
+
+    QSGItem *centerIn() const;
+    void setCenterIn(QSGItem *);
+    void resetCenterIn();
+
+    Anchors usedAnchors() const;
+
+    bool mirrored();
+
+    void classBegin();
+    void componentComplete();
+
+Q_SIGNALS:
+    void leftChanged();
+    void rightChanged();
+    void topChanged();
+    void bottomChanged();
+    void verticalCenterChanged();
+    void horizontalCenterChanged();
+    void baselineChanged();
+    void fillChanged();
+    void centerInChanged();
+    void leftMarginChanged();
+    void rightMarginChanged();
+    void topMarginChanged();
+    void bottomMarginChanged();
+    void marginsChanged();
+    void verticalCenterOffsetChanged();
+    void horizontalCenterOffsetChanged();
+    void baselineOffsetChanged();
+    void mirroredChanged();
+
+private:
+    friend class QSGItemPrivate;
+    Q_DISABLE_COPY(QSGAnchors)
+    Q_DECLARE_PRIVATE(QSGAnchors)
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGAnchors::Anchors)
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGAnchors)
+
+QT_END_HEADER
+
+#endif // QSGANCHORS_P_H
diff --git a/src/declarative/items/qsganchors_p_p.h b/src/declarative/items/qsganchors_p_p.h
new file mode 100644
index 0000000000..cb9b950c8f
--- /dev/null
+++ b/src/declarative/items/qsganchors_p_p.h
@@ -0,0 +1,173 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANCHORS_P_P_H
+#define QSGANCHORS_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsganchors_p.h"
+#include "qsgitemchangelistener_p.h"
+#include <private/qobject_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGAnchorLine
+{
+public:
+    QSGAnchorLine() : item(0), anchorLine(Invalid) {}
+
+    enum AnchorLine {
+        Invalid = 0x0,
+        Left = 0x01,
+        Right = 0x02,
+        Top = 0x04,
+        Bottom = 0x08,
+        HCenter = 0x10,
+        VCenter = 0x20,
+        Baseline = 0x40,
+        Horizontal_Mask = Left | Right | HCenter,
+        Vertical_Mask = Top | Bottom | VCenter | Baseline
+    };
+
+    QSGItem *item;
+    AnchorLine anchorLine;
+};
+
+inline bool operator==(const QSGAnchorLine& a, const QSGAnchorLine& b)
+{
+    return a.item == b.item && a.anchorLine == b.anchorLine;
+}
+
+class QSGAnchorsPrivate : public QObjectPrivate, public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGAnchors)
+public:
+    QSGAnchorsPrivate(QSGItem *i)
+      : componentComplete(true), updatingMe(false), updatingHorizontalAnchor(0),
+        updatingVerticalAnchor(0), updatingFill(0), updatingCenterIn(0), item(i), usedAnchors(0), fill(0),
+        centerIn(0), leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
+        margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)
+    {
+    }
+
+    void clearItem(QSGItem *);
+
+    void addDepend(QSGItem *);
+    void remDepend(QSGItem *);
+    bool isItemComplete() const;
+
+    bool componentComplete:1;
+    bool updatingMe:1;
+    uint updatingHorizontalAnchor:2;
+    uint updatingVerticalAnchor:2;
+    uint updatingFill:2;
+    uint updatingCenterIn:2;
+
+    void setItemHeight(qreal);
+    void setItemWidth(qreal);
+    void setItemX(qreal);
+    void setItemY(qreal);
+    void setItemPos(const QPointF &);
+    void setItemSize(const QSizeF &);
+
+    void updateOnComplete();
+    void updateMe();
+
+    // QSGItemGeometryListener interface
+    void itemGeometryChanged(QSGItem *, const QRectF &, const QRectF &);
+    QSGAnchorsPrivate *anchorPrivate() { return this; }
+
+    bool checkHValid() const;
+    bool checkVValid() const;
+    bool checkHAnchorValid(QSGAnchorLine anchor) const;
+    bool checkVAnchorValid(QSGAnchorLine anchor) const;
+    bool calcStretch(const QSGAnchorLine &edge1, const QSGAnchorLine &edge2, qreal offset1, qreal offset2, QSGAnchorLine::AnchorLine line, qreal &stretch);
+
+    bool isMirrored() const;
+    void updateHorizontalAnchors();
+    void updateVerticalAnchors();
+    void fillChanged();
+    void centerInChanged();
+
+    QSGItem *item;
+    QSGAnchors::Anchors usedAnchors;
+
+    QSGItem *fill;
+    QSGItem *centerIn;
+
+    QSGAnchorLine left;
+    QSGAnchorLine right;
+    QSGAnchorLine top;
+    QSGAnchorLine bottom;
+    QSGAnchorLine vCenter;
+    QSGAnchorLine hCenter;
+    QSGAnchorLine baseline;
+
+    qreal leftMargin;
+    qreal rightMargin;
+    qreal topMargin;
+    qreal bottomMargin;
+    qreal margins;
+    qreal vCenterOffset;
+    qreal hCenterOffset;
+    qreal baselineOffset;
+
+    static inline QSGAnchorsPrivate *get(QSGAnchors *o) {
+        return static_cast<QSGAnchorsPrivate *>(QObjectPrivate::get(o));
+    }
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QSGAnchorLine)
+
+#endif
diff --git a/src/declarative/items/qsganimatedimage.cpp b/src/declarative/items/qsganimatedimage.cpp
new file mode 100644
index 0000000000..f036042ce2
--- /dev/null
+++ b/src/declarative/items/qsganimatedimage.cpp
@@ -0,0 +1,304 @@
+// Commit: af33f9f2e7ec433b81f5c18e3e7395db4a56c5fe
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsganimatedimage_p.h"
+#include "qsganimatedimage_p_p.h"
+
+#ifndef QT_NO_MOVIE
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qmovie.h>
+#include <QtNetwork/qnetworkrequest.h>
+#include <QtNetwork/qnetworkreply.h>
+
+#include <private/qdeclarativeengine_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGAnimatedImage::QSGAnimatedImage(QSGItem *parent)
+    : QSGImage(*(new QSGAnimatedImagePrivate), parent)
+{
+}
+
+QSGAnimatedImage::~QSGAnimatedImage()
+{
+    Q_D(QSGAnimatedImage);
+    delete d->_movie;
+}
+
+bool QSGAnimatedImage::isPaused() const
+{
+    Q_D(const QSGAnimatedImage);
+    if(!d->_movie)
+        return false;
+    return d->_movie->state()==QMovie::Paused;
+}
+
+void QSGAnimatedImage::setPaused(bool pause)
+{
+    Q_D(QSGAnimatedImage);
+    if(pause == d->paused)
+        return;
+    d->paused = pause;
+    if(!d->_movie)
+        return;
+    d->_movie->setPaused(pause);
+}
+
+bool QSGAnimatedImage::isPlaying() const
+{
+    Q_D(const QSGAnimatedImage);
+    if (!d->_movie)
+        return false;
+    return d->_movie->state()!=QMovie::NotRunning;
+}
+
+void QSGAnimatedImage::setPlaying(bool play)
+{
+    Q_D(QSGAnimatedImage);
+    if(play == d->playing)
+        return;
+    d->playing = play;
+    if (!d->_movie)
+        return;
+    if (play)
+        d->_movie->start();
+    else
+        d->_movie->stop();
+}
+
+int QSGAnimatedImage::currentFrame() const
+{
+    Q_D(const QSGAnimatedImage);
+    if (!d->_movie)
+        return d->preset_currentframe;
+    return d->_movie->currentFrameNumber();
+}
+
+void QSGAnimatedImage::setCurrentFrame(int frame)
+{
+    Q_D(QSGAnimatedImage);
+    if (!d->_movie) {
+        d->preset_currentframe = frame;
+        return;
+    }
+    d->_movie->jumpToFrame(frame);
+}
+
+int QSGAnimatedImage::frameCount() const
+{
+    Q_D(const QSGAnimatedImage);
+    if (!d->_movie)
+        return 0;
+    return d->_movie->frameCount();
+}
+
+void QSGAnimatedImage::setSource(const QUrl &url)
+{
+    Q_D(QSGAnimatedImage);
+    if (url == d->url)
+        return;
+
+    delete d->_movie;
+    d->_movie = 0;
+
+    if (d->reply) {
+        d->reply->deleteLater();
+        d->reply = 0;
+    }
+
+    d->url = url;
+    emit sourceChanged(d->url);
+
+    if (isComponentComplete())
+        load();
+}
+
+void QSGAnimatedImage::load()
+{
+    Q_D(QSGAnimatedImage);
+
+    QSGImageBase::Status oldStatus = d->status;
+    qreal oldProgress = d->progress;
+
+    if (d->url.isEmpty()) {
+        delete d->_movie;
+        d->setPixmap(QPixmap());
+        d->progress = 0;
+        d->status = Null;
+        if (d->status != oldStatus)
+            emit statusChanged(d->status);
+        if (d->progress != oldProgress)
+            emit progressChanged(d->progress);
+    } else {
+#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML
+        QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(d->url);
+        if (!lf.isEmpty()) {
+            //### should be unified with movieRequestFinished
+            d->_movie = new QMovie(lf);
+            if (!d->_movie->isValid()){
+                qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
+                delete d->_movie;
+                d->_movie = 0;
+                d->status = Error;
+                if (d->status != oldStatus)
+                    emit statusChanged(d->status);
+                return;
+            }
+            connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
+                    this, SLOT(playingStatusChanged()));
+            connect(d->_movie, SIGNAL(frameChanged(int)),
+                    this, SLOT(movieUpdate()));
+            d->_movie->setCacheMode(QMovie::CacheAll);
+            if(d->playing)
+                d->_movie->start();
+            else
+                d->_movie->jumpToFrame(0);
+            if(d->paused)
+                d->_movie->setPaused(true);
+            d->setPixmap(d->_movie->currentPixmap());
+            d->status = Ready;
+            d->progress = 1.0;
+            if (d->status != oldStatus)
+                emit statusChanged(d->status);
+            if (d->progress != oldProgress)
+                emit progressChanged(d->progress);
+            return;
+        }
+#endif
+        d->status = Loading;
+        d->progress = 0;
+        emit statusChanged(d->status);
+        emit progressChanged(d->progress);
+        QNetworkRequest req(d->url);
+        req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
+        d->reply = qmlEngine(this)->networkAccessManager()->get(req);
+        QObject::connect(d->reply, SIGNAL(finished()),
+                         this, SLOT(movieRequestFinished()));
+        QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
+                         this, SLOT(requestProgress(qint64,qint64)));
+    }
+}
+
+#define ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION 16
+
+void QSGAnimatedImage::movieRequestFinished()
+{
+    Q_D(QSGAnimatedImage);
+
+    d->redirectCount++;
+    if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
+        QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+        if (redirect.isValid()) {
+            QUrl url = d->reply->url().resolved(redirect.toUrl());
+            d->reply->deleteLater();
+            d->reply = 0;
+            setSource(url);
+            return;
+        }
+    }
+    d->redirectCount=0;
+
+    d->_movie = new QMovie(d->reply);
+    if (!d->_movie->isValid()){
+#ifndef QT_NO_DEBUG_STREAM
+        qmlInfo(this) << "Error Reading Animated Image File " << d->url;
+#endif
+        delete d->_movie;
+        d->_movie = 0;
+        d->status = Error;
+        emit statusChanged(d->status);
+        return;
+    }
+    connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
+            this, SLOT(playingStatusChanged()));
+    connect(d->_movie, SIGNAL(frameChanged(int)),
+            this, SLOT(movieUpdate()));
+    d->_movie->setCacheMode(QMovie::CacheAll);
+    if(d->playing)
+        d->_movie->start();
+    if (d->paused || !d->playing) {
+        d->_movie->jumpToFrame(d->preset_currentframe);
+        d->preset_currentframe = 0;
+    }
+    if(d->paused)
+        d->_movie->setPaused(true);
+    d->setPixmap(d->_movie->currentPixmap());
+    d->status = Ready;
+    emit statusChanged(d->status);
+}
+
+void QSGAnimatedImage::movieUpdate()
+{
+    Q_D(QSGAnimatedImage);
+    d->setPixmap(d->_movie->currentPixmap());
+    emit frameChanged();
+}
+
+void QSGAnimatedImage::playingStatusChanged()
+{
+    Q_D(QSGAnimatedImage);
+    if((d->_movie->state() != QMovie::NotRunning) != d->playing){
+        d->playing = (d->_movie->state() != QMovie::NotRunning);
+        emit playingChanged();
+    }
+    if((d->_movie->state() == QMovie::Paused) != d->paused){
+        d->playing = (d->_movie->state() == QMovie::Paused);
+        emit pausedChanged();
+    }
+}
+
+void QSGAnimatedImage::componentComplete()
+{
+    Q_D(QSGAnimatedImage);
+    QSGItem::componentComplete(); // NOT QSGImage
+    if (d->url.isValid())
+        load();
+    if (!d->reply) {
+        setCurrentFrame(d->preset_currentframe);
+        d->preset_currentframe = 0;
+    }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_MOVIE
diff --git a/src/declarative/items/qsganimatedimage_p.h b/src/declarative/items/qsganimatedimage_p.h
new file mode 100644
index 0000000000..64319a0f0d
--- /dev/null
+++ b/src/declarative/items/qsganimatedimage_p.h
@@ -0,0 +1,117 @@
+// Commit: 80d0fe9cbd92288a08d5ced8767f1edb651dae37
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANIMATEDIMAGE_P_H
+#define QSGANIMATEDIMAGE_P_H
+
+#include "qsgimage_p.h"
+
+#ifndef QT_NO_MOVIE
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QMovie;
+class QSGAnimatedImagePrivate;
+
+class Q_AUTOTEST_EXPORT QSGAnimatedImage : public QSGImage
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool playing READ isPlaying WRITE setPlaying NOTIFY playingChanged)
+    Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged)
+    Q_PROPERTY(int currentFrame READ currentFrame WRITE setCurrentFrame NOTIFY frameChanged)
+    Q_PROPERTY(int frameCount READ frameCount)
+
+    // read-only for AnimatedImage
+    Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
+
+public:
+    QSGAnimatedImage(QSGItem *parent=0);
+    ~QSGAnimatedImage();
+
+    bool isPlaying() const;
+    void setPlaying(bool play);
+
+    bool isPaused() const;
+    void setPaused(bool pause);
+
+    int currentFrame() const;
+    void setCurrentFrame(int frame);
+
+    int frameCount() const;
+
+    // Extends QSGImage's src property*/
+    virtual void setSource(const QUrl&);
+
+Q_SIGNALS:
+    void playingChanged();
+    void pausedChanged();
+    void frameChanged();
+    void sourceSizeChanged();
+
+private Q_SLOTS:
+    void movieUpdate();
+    void movieRequestFinished();
+    void playingStatusChanged();
+
+protected:
+    virtual void load();
+    void componentComplete();
+
+private:
+    Q_DISABLE_COPY(QSGAnimatedImage)
+    Q_DECLARE_PRIVATE(QSGAnimatedImage)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGAnimatedImage)
+
+QT_END_HEADER
+
+#endif // QT_NO_MOVIE
+
+#endif // QSGANIMATEDIMAGE_P_H
diff --git a/src/declarative/items/qsganimatedimage_p_p.h b/src/declarative/items/qsganimatedimage_p_p.h
new file mode 100644
index 0000000000..560c8c1d43
--- /dev/null
+++ b/src/declarative/items/qsganimatedimage_p_p.h
@@ -0,0 +1,88 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANIMATEDIMAGE_P_P_H
+#define QSGANIMATEDIMAGE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgimage_p_p.h"
+
+#ifndef QT_NO_MOVIE
+
+QT_BEGIN_NAMESPACE
+
+class QMovie;
+class QNetworkReply;
+
+class QSGAnimatedImagePrivate : public QSGImagePrivate
+{
+    Q_DECLARE_PUBLIC(QSGAnimatedImage)
+
+public:
+    QSGAnimatedImagePrivate()
+      : playing(true), paused(false), preset_currentframe(0), _movie(0), reply(0), redirectCount(0)
+    {
+    }
+
+    bool playing;
+    bool paused;
+    int preset_currentframe;
+    QMovie *_movie;
+    QNetworkReply *reply;
+    int redirectCount;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_MOVIE
+
+#endif // QSGANIMATEDIMAGE_P_P_H
diff --git a/src/declarative/items/qsganimation.cpp b/src/declarative/items/qsganimation.cpp
new file mode 100644
index 0000000000..ad6ed030fd
--- /dev/null
+++ b/src/declarative/items/qsganimation.cpp
@@ -0,0 +1,442 @@
+// Commit: 91501cc9b542de644cd70098a6bc5ff738cdeb49
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsganimation_p.h"
+#include "qsganimation_p_p.h"
+#include "qsgstateoperations_p.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qsequentialanimationgroup.h>
+#include <QtCore/qparallelanimationgroup.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGParentAnimation::QSGParentAnimation(QObject *parent)
+    : QDeclarativeAnimationGroup(*(new QSGParentAnimationPrivate), parent)
+{
+    Q_D(QSGParentAnimation);
+    d->topLevelGroup = new QSequentialAnimationGroup;
+    QDeclarative_setParent_noEvent(d->topLevelGroup, this);
+
+    d->startAction = new QActionAnimation;
+    QDeclarative_setParent_noEvent(d->startAction, d->topLevelGroup);
+    d->topLevelGroup->addAnimation(d->startAction);
+
+    d->ag = new QParallelAnimationGroup;
+    QDeclarative_setParent_noEvent(d->ag, d->topLevelGroup);
+    d->topLevelGroup->addAnimation(d->ag);
+
+    d->endAction = new QActionAnimation;
+    QDeclarative_setParent_noEvent(d->endAction, d->topLevelGroup);
+    d->topLevelGroup->addAnimation(d->endAction);
+}
+
+QSGParentAnimation::~QSGParentAnimation()
+{
+}
+
+QSGItem *QSGParentAnimation::target() const
+{
+    Q_D(const QSGParentAnimation);
+    return d->target;
+}
+
+void QSGParentAnimation::setTarget(QSGItem *target)
+{
+    Q_D(QSGParentAnimation);
+    if (target == d->target)
+        return;
+
+    d->target = target;
+    emit targetChanged();
+}
+
+QSGItem *QSGParentAnimation::newParent() const
+{
+    Q_D(const QSGParentAnimation);
+    return d->newParent;
+}
+
+void QSGParentAnimation::setNewParent(QSGItem *newParent)
+{
+    Q_D(QSGParentAnimation);
+    if (newParent == d->newParent)
+        return;
+
+    d->newParent = newParent;
+    emit newParentChanged();
+}
+
+QSGItem *QSGParentAnimation::via() const
+{
+    Q_D(const QSGParentAnimation);
+    return d->via;
+}
+
+void QSGParentAnimation::setVia(QSGItem *via)
+{
+    Q_D(QSGParentAnimation);
+    if (via == d->via)
+        return;
+
+    d->via = via;
+    emit viaChanged();
+}
+
+//### mirrors same-named function in QSGItem
+QPointF QSGParentAnimationPrivate::computeTransformOrigin(QSGItem::TransformOrigin origin, qreal width, qreal height) const
+{
+    switch(origin) {
+    default:
+    case QSGItem::TopLeft:
+        return QPointF(0, 0);
+    case QSGItem::Top:
+        return QPointF(width / 2., 0);
+    case QSGItem::TopRight:
+        return QPointF(width, 0);
+    case QSGItem::Left:
+        return QPointF(0, height / 2.);
+    case QSGItem::Center:
+        return QPointF(width / 2., height / 2.);
+    case QSGItem::Right:
+        return QPointF(width, height / 2.);
+    case QSGItem::BottomLeft:
+        return QPointF(0, height);
+    case QSGItem::Bottom:
+        return QPointF(width / 2., height);
+    case QSGItem::BottomRight:
+        return QPointF(width, height);
+    }
+}
+
+void QSGParentAnimation::transition(QDeclarativeStateActions &actions,
+                        QDeclarativeProperties &modified,
+                        TransitionDirection direction)
+{
+    Q_D(QSGParentAnimation);
+
+    struct QSGParentAnimationData : public QAbstractAnimationAction
+    {
+        QSGParentAnimationData() {}
+        ~QSGParentAnimationData() { qDeleteAll(pc); }
+
+        QDeclarativeStateActions actions;
+        //### reverse should probably apply on a per-action basis
+        bool reverse;
+        QList<QSGParentChange *> pc;
+        virtual void doAction()
+        {
+            for (int ii = 0; ii < actions.count(); ++ii) {
+                const QDeclarativeAction &action = actions.at(ii);
+                if (reverse)
+                    action.event->reverse();
+                else
+                    action.event->execute();
+            }
+        }
+    };
+
+    QSGParentAnimationData *data = new QSGParentAnimationData;
+    QSGParentAnimationData *viaData = new QSGParentAnimationData;
+
+    bool hasExplicit = false;
+    if (d->target && d->newParent) {
+        data->reverse = false;
+        QDeclarativeAction myAction;
+        QSGParentChange *pc = new QSGParentChange;
+        pc->setObject(d->target);
+        pc->setParent(d->newParent);
+        myAction.event = pc;
+        data->pc << pc;
+        data->actions << myAction;
+        hasExplicit = true;
+        if (d->via) {
+            viaData->reverse = false;
+            QDeclarativeAction myVAction;
+            QSGParentChange *vpc = new QSGParentChange;
+            vpc->setObject(d->target);
+            vpc->setParent(d->via);
+            myVAction.event = vpc;
+            viaData->pc << vpc;
+            viaData->actions << myVAction;
+        }
+        //### once actions have concept of modified,
+        //    loop to match appropriate ParentChanges and mark as modified
+    }
+
+    if (!hasExplicit)
+    for (int i = 0; i < actions.size(); ++i) {
+        QDeclarativeAction &action = actions[i];
+        if (action.event && action.event->typeName() == QLatin1String("ParentChange")
+            && (!d->target || static_cast<QSGParentChange*>(action.event)->object() == d->target)) {
+
+            QSGParentChange *pc = static_cast<QSGParentChange*>(action.event);
+            QDeclarativeAction myAction = action;
+            data->reverse = action.reverseEvent;
+
+            //### this logic differs from PropertyAnimation
+            //    (probably a result of modified vs. done)
+            if (d->newParent) {
+                QSGParentChange *epc = new QSGParentChange;
+                epc->setObject(static_cast<QSGParentChange*>(action.event)->object());
+                epc->setParent(d->newParent);
+                myAction.event = epc;
+                data->pc << epc;
+                data->actions << myAction;
+                pc = epc;
+            } else {
+                action.actionDone = true;
+                data->actions << myAction;
+            }
+
+            if (d->via) {
+                viaData->reverse = false;
+                QDeclarativeAction myAction;
+                QSGParentChange *vpc = new QSGParentChange;
+                vpc->setObject(pc->object());
+                vpc->setParent(d->via);
+                myAction.event = vpc;
+                viaData->pc << vpc;
+                viaData->actions << myAction;
+                QDeclarativeAction dummyAction;
+                QDeclarativeAction &xAction = pc->xIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
+                QDeclarativeAction &yAction = pc->yIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
+                QDeclarativeAction &sAction = pc->scaleIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
+                QDeclarativeAction &rAction = pc->rotationIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
+                QSGItem *target = pc->object();
+                QSGItem *targetParent = action.reverseEvent ? pc->originalParent() : pc->parent();
+
+                //### this mirrors the logic in QSGParentChange.
+                bool ok;
+                const QTransform &transform = targetParent->itemTransform(d->via, &ok);
+                if (transform.type() >= QTransform::TxShear || !ok) {
+                    qmlInfo(this) << QSGParentAnimation::tr("Unable to preserve appearance under complex transform");
+                    ok = false;
+                }
+
+                qreal scale = 1;
+                qreal rotation = 0;
+                bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0);
+                if (ok && !isRotate) {
+                    if (transform.m11() == transform.m22())
+                        scale = transform.m11();
+                    else {
+                        qmlInfo(this) << QSGParentAnimation::tr("Unable to preserve appearance under non-uniform scale");
+                        ok = false;
+                    }
+                } else if (ok && isRotate) {
+                    if (transform.m11() == transform.m22())
+                        scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
+                    else {
+                        qmlInfo(this) << QSGParentAnimation::tr("Unable to preserve appearance under non-uniform scale");
+                        ok = false;
+                    }
+
+                    if (scale != 0)
+                        rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
+                    else {
+                        qmlInfo(this) << QSGParentAnimation::tr("Unable to preserve appearance under scale of 0");
+                        ok = false;
+                    }
+                }
+
+                const QPointF &point = transform.map(QPointF(xAction.toValue.toReal(),yAction.toValue.toReal()));
+                qreal x = point.x();
+                qreal y = point.y();
+                if (ok && target->transformOrigin() != QSGItem::TopLeft) {
+                    qreal w = target->width();
+                    qreal h = target->height();
+                    if (pc->widthIsSet() && i < actions.size() - 1)
+                        w = actions[++i].toValue.toReal();
+                    if (pc->heightIsSet() && i < actions.size() - 1)
+                        h = actions[++i].toValue.toReal();
+                    const QPointF &transformOrigin
+                            = d->computeTransformOrigin(target->transformOrigin(), w,h);
+                    qreal tempxt = transformOrigin.x();
+                    qreal tempyt = transformOrigin.y();
+                    QTransform t;
+                    t.translate(-tempxt, -tempyt);
+                    t.rotate(rotation);
+                    t.scale(scale, scale);
+                    t.translate(tempxt, tempyt);
+                    const QPointF &offset = t.map(QPointF(0,0));
+                    x += offset.x();
+                    y += offset.y();
+                }
+
+                if (ok) {
+                    //qDebug() << x << y << rotation << scale;
+                    xAction.toValue = x;
+                    yAction.toValue = y;
+                    sAction.toValue = sAction.toValue.toReal() * scale;
+                    rAction.toValue = rAction.toValue.toReal() + rotation;
+                }
+            }
+        }
+    }
+
+    if (data->actions.count()) {
+        if (direction == QDeclarativeAbstractAnimation::Forward) {
+            d->startAction->setAnimAction(d->via ? viaData : data, QActionAnimation::DeleteWhenStopped);
+            d->endAction->setAnimAction(d->via ? data : 0, QActionAnimation::DeleteWhenStopped);
+        } else {
+            d->endAction->setAnimAction(d->via ? viaData : data, QActionAnimation::DeleteWhenStopped);
+            d->startAction->setAnimAction(d->via ? data : 0, QActionAnimation::DeleteWhenStopped);
+        }
+    } else {
+        delete data;
+        delete viaData;
+    }
+
+    //take care of any child animations
+    bool valid = d->defaultProperty.isValid();
+    for (int ii = 0; ii < d->animations.count(); ++ii) {
+        if (valid)
+            d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
+        d->animations.at(ii)->transition(actions, modified, direction);
+    }
+
+}
+
+QAbstractAnimation *QSGParentAnimation::qtAnimation()
+{
+    Q_D(QSGParentAnimation);
+    return d->topLevelGroup;
+}
+
+QSGAnchorAnimation::QSGAnchorAnimation(QObject *parent)
+: QDeclarativeAbstractAnimation(*(new QSGAnchorAnimationPrivate), parent)
+{
+    Q_D(QSGAnchorAnimation);
+    d->va = new QDeclarativeBulkValueAnimator;
+    QDeclarative_setParent_noEvent(d->va, this);
+}
+
+QSGAnchorAnimation::~QSGAnchorAnimation()
+{
+}
+
+QAbstractAnimation *QSGAnchorAnimation::qtAnimation()
+{
+    Q_D(QSGAnchorAnimation);
+    return d->va;
+}
+
+QDeclarativeListProperty<QSGItem> QSGAnchorAnimation::targets()
+{
+    Q_D(QSGAnchorAnimation);
+    return QDeclarativeListProperty<QSGItem>(this, d->targets);
+}
+
+int QSGAnchorAnimation::duration() const
+{
+    Q_D(const QSGAnchorAnimation);
+    return d->va->duration();
+}
+
+void QSGAnchorAnimation::setDuration(int duration)
+{
+    if (duration < 0) {
+        qmlInfo(this) << tr("Cannot set a duration of < 0");
+        return;
+    }
+
+    Q_D(QSGAnchorAnimation);
+    if (d->va->duration() == duration)
+        return;
+    d->va->setDuration(duration);
+    emit durationChanged(duration);
+}
+
+QEasingCurve QSGAnchorAnimation::easing() const
+{
+    Q_D(const QSGAnchorAnimation);
+    return d->va->easingCurve();
+}
+
+void QSGAnchorAnimation::setEasing(const QEasingCurve &e)
+{
+    Q_D(QSGAnchorAnimation);
+    if (d->va->easingCurve() == e)
+        return;
+
+    d->va->setEasingCurve(e);
+    emit easingChanged(e);
+}
+
+void QSGAnchorAnimation::transition(QDeclarativeStateActions &actions,
+                        QDeclarativeProperties &modified,
+                        TransitionDirection direction)
+{
+    Q_UNUSED(modified);
+    Q_D(QSGAnchorAnimation);
+    QDeclarativeAnimationPropertyUpdater *data = new QDeclarativeAnimationPropertyUpdater;
+    data->interpolatorType = QMetaType::QReal;
+    data->interpolator = d->interpolator;
+
+    data->reverse = direction == Backward ? true : false;
+    data->fromSourced = false;
+    data->fromDefined = false;
+
+    for (int ii = 0; ii < actions.count(); ++ii) {
+        QDeclarativeAction &action = actions[ii];
+        if (action.event && action.event->typeName() == QLatin1String("AnchorChanges")
+            && (d->targets.isEmpty() || d->targets.contains(static_cast<QSGAnchorChanges*>(action.event)->object()))) {
+            data->actions << static_cast<QSGAnchorChanges*>(action.event)->additionalActions();
+        }
+    }
+
+    if (data->actions.count()) {
+        if (!d->rangeIsSet) {
+            d->va->setStartValue(qreal(0));
+            d->va->setEndValue(qreal(1));
+            d->rangeIsSet = true;
+        }
+        d->va->setAnimValue(data, QAbstractAnimation::DeleteWhenStopped);
+        d->va->setFromSourcedValue(&data->fromSourced);
+    } else {
+        delete data;
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsganimation_p.h b/src/declarative/items/qsganimation_p.h
new file mode 100644
index 0000000000..7c63331cfe
--- /dev/null
+++ b/src/declarative/items/qsganimation_p.h
@@ -0,0 +1,132 @@
+// Commit: e39a2e39451bf106a9845f8a60fc571faaa4dde5
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANIMATION_H
+#define QSGANIMATION_H
+
+#include "qsgitem.h"
+
+#include <private/qdeclarativeanimation_p.h>
+
+#include <QtCore/qabstractanimation.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGParentAnimationPrivate;
+class QSGParentAnimation : public QDeclarativeAnimationGroup
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGParentAnimation)
+
+    Q_PROPERTY(QSGItem *target READ target WRITE setTarget NOTIFY targetChanged)
+    Q_PROPERTY(QSGItem *newParent READ newParent WRITE setNewParent NOTIFY newParentChanged)
+    Q_PROPERTY(QSGItem *via READ via WRITE setVia NOTIFY viaChanged)
+
+public:
+    QSGParentAnimation(QObject *parent=0);
+    virtual ~QSGParentAnimation();
+
+    QSGItem *target() const;
+    void setTarget(QSGItem *);
+
+    QSGItem *newParent() const;
+    void setNewParent(QSGItem *);
+
+    QSGItem *via() const;
+    void setVia(QSGItem *);
+
+Q_SIGNALS:
+    void targetChanged();
+    void newParentChanged();
+    void viaChanged();
+
+protected:
+    virtual void transition(QDeclarativeStateActions &actions,
+                            QDeclarativeProperties &modified,
+                            TransitionDirection direction);
+    virtual QAbstractAnimation *qtAnimation();
+};
+
+class QSGAnchorAnimationPrivate;
+class QSGAnchorAnimation : public QDeclarativeAbstractAnimation
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGAnchorAnimation)
+    Q_PROPERTY(QDeclarativeListProperty<QSGItem> targets READ targets)
+    Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged)
+    Q_PROPERTY(QEasingCurve easing READ easing WRITE setEasing NOTIFY easingChanged)
+
+public:
+    QSGAnchorAnimation(QObject *parent=0);
+    virtual ~QSGAnchorAnimation();
+
+    QDeclarativeListProperty<QSGItem> targets();
+
+    int duration() const;
+    void setDuration(int);
+
+    QEasingCurve easing() const;
+    void setEasing(const QEasingCurve &);
+
+Q_SIGNALS:
+    void durationChanged(int);
+    void easingChanged(const QEasingCurve&);
+
+protected:
+    virtual void transition(QDeclarativeStateActions &actions,
+                            QDeclarativeProperties &modified,
+                            TransitionDirection direction);
+    virtual QAbstractAnimation *qtAnimation();
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGParentAnimation)
+QML_DECLARE_TYPE(QSGAnchorAnimation)
+
+QT_END_HEADER
+
+#endif // QSGANIMATION_H
diff --git a/src/declarative/items/qsganimation_p_p.h b/src/declarative/items/qsganimation_p_p.h
new file mode 100644
index 0000000000..10457d6b52
--- /dev/null
+++ b/src/declarative/items/qsganimation_p_p.h
@@ -0,0 +1,97 @@
+// Commit: 0ade09152067324f74678f2de4d447b6e0280600
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGANIMATION_P_H
+#define QSGANIMATION_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsganimation_p.h"
+
+#include <private/qdeclarativeanimation_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGParentAnimationPrivate : public QDeclarativeAnimationGroupPrivate
+{
+    Q_DECLARE_PUBLIC(QSGParentAnimation)
+public:
+    QSGParentAnimationPrivate()
+    : QDeclarativeAnimationGroupPrivate(), target(0), newParent(0),
+       via(0), topLevelGroup(0), startAction(0), endAction(0) {}
+
+    QSGItem *target;
+    QSGItem *newParent;
+    QSGItem *via;
+
+    QSequentialAnimationGroup *topLevelGroup;
+    QActionAnimation *startAction;
+    QActionAnimation *endAction;
+
+    QPointF computeTransformOrigin(QSGItem::TransformOrigin origin, qreal width, qreal height) const;
+};
+
+class QSGAnchorAnimationPrivate : public QDeclarativeAbstractAnimationPrivate
+{
+    Q_DECLARE_PUBLIC(QSGAnchorAnimation)
+public:
+    QSGAnchorAnimationPrivate() : rangeIsSet(false), va(0),
+        interpolator(QVariantAnimationPrivate::getInterpolator(QMetaType::QReal)) {}
+
+    bool rangeIsSet;
+    QDeclarativeBulkValueAnimator *va;
+    QVariantAnimation::Interpolator interpolator;
+    QList<QSGItem*> targets;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGANIMATION_P_H
diff --git a/src/declarative/items/qsgborderimage.cpp b/src/declarative/items/qsgborderimage.cpp
new file mode 100644
index 0000000000..108d87ef28
--- /dev/null
+++ b/src/declarative/items/qsgborderimage.cpp
@@ -0,0 +1,359 @@
+// Commit: 462429f5692f810bdd4e04b916db5f9af428d9e4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgborderimage_p.h"
+#include "qsgborderimage_p_p.h"
+#include "qsgninepatchnode_p.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtCore/qfile.h>
+
+#include <private/qdeclarativeengine_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGBorderImage::QSGBorderImage(QSGItem *parent)
+: QSGImageBase(*(new QSGBorderImagePrivate), parent)
+{
+}
+
+QSGBorderImage::~QSGBorderImage()
+{
+    Q_D(QSGBorderImage);
+    if (d->sciReply)
+        d->sciReply->deleteLater();
+}
+
+void QSGBorderImage::setSource(const QUrl &url)
+{
+    Q_D(QSGBorderImage);
+    //equality is fairly expensive, so we bypass for simple, common case
+    if ((d->url.isEmpty() == url.isEmpty()) && url == d->url)
+        return;
+
+    if (d->sciReply) {
+        d->sciReply->deleteLater();
+        d->sciReply = 0;
+    }
+
+    d->url = url;
+    d->sciurl = QUrl();
+    emit sourceChanged(d->url);
+
+    if (isComponentComplete())
+        load();
+}
+
+void QSGBorderImage::load()
+{
+    Q_D(QSGBorderImage);
+    if (d->progress != 0.0) {
+        d->progress = 0.0;
+        emit progressChanged(d->progress);
+    }
+
+    if (d->url.isEmpty()) {
+        d->pix.clear(this);
+        d->status = Null;
+        setImplicitWidth(0);
+        setImplicitHeight(0);
+        emit statusChanged(d->status);
+        update();
+    } else {
+        d->status = Loading;
+        if (d->url.path().endsWith(QLatin1String("sci"))) {
+#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML
+            QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(d->url);
+            if (!lf.isEmpty()) {
+                QFile file(lf);
+                file.open(QIODevice::ReadOnly);
+                setGridScaledImage(QSGGridScaledImage(&file));
+            } else
+#endif
+            {
+                QNetworkRequest req(d->url);
+                d->sciReply = qmlEngine(this)->networkAccessManager()->get(req);
+
+                static int sciReplyFinished = -1;
+                static int thisSciRequestFinished = -1;
+                if (sciReplyFinished == -1) {
+                    sciReplyFinished =
+                        QNetworkReply::staticMetaObject.indexOfSignal("finished()");
+                    thisSciRequestFinished =
+                        QSGBorderImage::staticMetaObject.indexOfSlot("sciRequestFinished()");
+                }
+
+                QMetaObject::connect(d->sciReply, sciReplyFinished, this,
+                                     thisSciRequestFinished, Qt::DirectConnection);
+            }
+        } else {
+
+            QDeclarativePixmap::Options options;
+            if (d->async)
+                options |= QDeclarativePixmap::Asynchronous;
+            if (d->cache)
+                options |= QDeclarativePixmap::Cache;
+            d->pix.clear(this);
+            d->pix.load(qmlEngine(this), d->url, options);
+
+            if (d->pix.isLoading()) {
+                d->pix.connectFinished(this, SLOT(requestFinished()));
+                d->pix.connectDownloadProgress(this, SLOT(requestProgress(qint64,qint64)));
+            } else {
+                QSize impsize = d->pix.implicitSize();
+                setImplicitWidth(impsize.width());
+                setImplicitHeight(impsize.height());
+
+                if (d->pix.isReady()) {
+                    d->status = Ready;
+                } else {
+                    d->status = Error;
+                    qmlInfo(this) << d->pix.error();
+                }
+
+                d->progress = 1.0;
+                emit statusChanged(d->status);
+                emit progressChanged(d->progress);
+                update();
+            }
+        }
+    }
+
+    emit statusChanged(d->status);
+}
+
+QSGScaleGrid *QSGBorderImage::border()
+{
+    Q_D(QSGBorderImage);
+    return d->getScaleGrid();
+}
+
+QSGBorderImage::TileMode QSGBorderImage::horizontalTileMode() const
+{
+    Q_D(const QSGBorderImage);
+    return d->horizontalTileMode;
+}
+
+void QSGBorderImage::setHorizontalTileMode(TileMode t)
+{
+    Q_D(QSGBorderImage);
+    if (t != d->horizontalTileMode) {
+        d->horizontalTileMode = t;
+        emit horizontalTileModeChanged();
+        update();
+    }
+}
+
+QSGBorderImage::TileMode QSGBorderImage::verticalTileMode() const
+{
+    Q_D(const QSGBorderImage);
+    return d->verticalTileMode;
+}
+
+void QSGBorderImage::setVerticalTileMode(TileMode t)
+{
+    Q_D(QSGBorderImage);
+    if (t != d->verticalTileMode) {
+        d->verticalTileMode = t;
+        emit verticalTileModeChanged();
+        update();
+    }
+}
+
+void QSGBorderImage::setGridScaledImage(const QSGGridScaledImage& sci)
+{
+    Q_D(QSGBorderImage);
+    if (!sci.isValid()) {
+        d->status = Error;
+        emit statusChanged(d->status);
+    } else {
+        QSGScaleGrid *sg = border();
+        sg->setTop(sci.gridTop());
+        sg->setBottom(sci.gridBottom());
+        sg->setLeft(sci.gridLeft());
+        sg->setRight(sci.gridRight());
+        d->horizontalTileMode = sci.horizontalTileRule();
+        d->verticalTileMode = sci.verticalTileRule();
+
+        d->sciurl = d->url.resolved(QUrl(sci.pixmapUrl()));
+
+        QDeclarativePixmap::Options options;
+        if (d->async)
+            options |= QDeclarativePixmap::Asynchronous;
+        if (d->cache)
+            options |= QDeclarativePixmap::Cache;
+        d->pix.clear(this);
+        d->pix.load(qmlEngine(this), d->sciurl, options);
+
+        if (d->pix.isLoading()) {
+            static int thisRequestProgress = -1;
+            static int thisRequestFinished = -1;
+            if (thisRequestProgress == -1) {
+                thisRequestProgress =
+                    QSGBorderImage::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)");
+                thisRequestFinished =
+                    QSGBorderImage::staticMetaObject.indexOfSlot("requestFinished()");
+            }
+
+            d->pix.connectFinished(this, thisRequestFinished);
+            d->pix.connectDownloadProgress(this, thisRequestProgress);
+
+        } else {
+
+            QSize impsize = d->pix.implicitSize();
+            setImplicitWidth(impsize.width());
+            setImplicitHeight(impsize.height());
+
+            if (d->pix.isReady()) {
+                d->status = Ready;
+            } else {
+                d->status = Error;
+                qmlInfo(this) << d->pix.error();
+            }
+
+            d->progress = 1.0;
+            emit statusChanged(d->status);
+            emit progressChanged(1.0);
+            update();
+
+        }
+    }
+}
+
+void QSGBorderImage::requestFinished()
+{
+    Q_D(QSGBorderImage);
+
+    QSize impsize = d->pix.implicitSize();
+    if (d->pix.isError()) {
+        d->status = Error;
+        qmlInfo(this) << d->pix.error();
+    } else {
+        d->status = Ready;
+    }
+
+    setImplicitWidth(impsize.width());
+    setImplicitHeight(impsize.height());
+
+    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
+        emit sourceSizeChanged();
+
+    d->progress = 1.0;
+    emit statusChanged(d->status);
+    emit progressChanged(1.0);
+    update();
+}
+
+#define BORDERIMAGE_MAX_REDIRECT 16
+
+void QSGBorderImage::sciRequestFinished()
+{
+    Q_D(QSGBorderImage);
+
+    d->redirectCount++;
+    if (d->redirectCount < BORDERIMAGE_MAX_REDIRECT) {
+        QVariant redirect = d->sciReply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+        if (redirect.isValid()) {
+            QUrl url = d->sciReply->url().resolved(redirect.toUrl());
+            setSource(url);
+            return;
+        }
+    }
+    d->redirectCount=0;
+
+    if (d->sciReply->error() != QNetworkReply::NoError) {
+        d->status = Error;
+        d->sciReply->deleteLater();
+        d->sciReply = 0;
+        emit statusChanged(d->status);
+    } else {
+        QSGGridScaledImage sci(d->sciReply);
+        d->sciReply->deleteLater();
+        d->sciReply = 0;
+        setGridScaledImage(sci);
+    }
+}
+
+void QSGBorderImage::doUpdate()
+{
+    update();
+}
+
+QSGNode *QSGBorderImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+    Q_D(QSGBorderImage);
+
+    if (!d->pix.texture() || width() <= 0 || height() <= 0) {
+        delete oldNode;
+        return 0;
+    }
+
+    QSGNinePatchNode *node = static_cast<QSGNinePatchNode *>(oldNode);
+
+    if (!node) {
+        node = new QSGNinePatchNode();
+    }
+
+    node->setTexture(d->pix.texture());
+
+    const QSGScaleGrid *border = d->getScaleGrid();
+    node->setInnerRect(QRectF(border->left(),
+                              border->top(),
+                              d->pix.width() - border->right() - border->left(),
+                              d->pix.height() - border->bottom() - border->top()));
+    node->setRect(QRectF(0, 0, width(), height()));
+    node->setFiltering(d->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
+    node->setHorzontalTileMode(d->horizontalTileMode);
+    node->setVerticalTileMode(d->verticalTileMode);
+    node->update();
+
+    return node;
+}
+
+void QSGBorderImage::pixmapChange()
+{
+    Q_D(QSGBorderImage);
+
+    d->pixmapChanged = true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgborderimage_p.h b/src/declarative/items/qsgborderimage_p.h
new file mode 100644
index 0000000000..1386264779
--- /dev/null
+++ b/src/declarative/items/qsgborderimage_p.h
@@ -0,0 +1,110 @@
+// Commit: ebd4bc73c46c2962742a682b6a391fb68c482aec
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGBORDERIMAGE_P_H
+#define QSGBORDERIMAGE_P_H
+
+#include "qsgimagebase_p.h"
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGScaleGrid;
+class QSGGridScaledImage;
+class QSGBorderImagePrivate;
+class Q_AUTOTEST_EXPORT QSGBorderImage : public QSGImageBase
+{
+    Q_OBJECT
+    Q_ENUMS(TileMode)
+
+    Q_PROPERTY(QSGScaleGrid *border READ border CONSTANT)
+    Q_PROPERTY(TileMode horizontalTileMode READ horizontalTileMode WRITE setHorizontalTileMode NOTIFY horizontalTileModeChanged)
+    Q_PROPERTY(TileMode verticalTileMode READ verticalTileMode WRITE setVerticalTileMode NOTIFY verticalTileModeChanged)
+    // read-only for BorderImage
+    Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
+
+public:
+    QSGBorderImage(QSGItem *parent=0);
+    ~QSGBorderImage();
+
+    QSGScaleGrid *border();
+
+    enum TileMode { Stretch = Qt::StretchTile, Repeat = Qt::RepeatTile, Round = Qt::RoundTile };
+
+    TileMode horizontalTileMode() const;
+    void setHorizontalTileMode(TileMode);
+
+    TileMode verticalTileMode() const;
+    void setVerticalTileMode(TileMode);
+
+    void setSource(const QUrl &url);
+
+Q_SIGNALS:
+    void horizontalTileModeChanged();
+    void verticalTileModeChanged();
+    void sourceSizeChanged();
+
+protected:
+    virtual void load();
+    virtual void pixmapChange();
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private:
+    void setGridScaledImage(const QSGGridScaledImage& sci);
+
+private Q_SLOTS:
+    void doUpdate();
+    void requestFinished();
+    void sciRequestFinished();
+
+private:
+    Q_DISABLE_COPY(QSGBorderImage)
+    Q_DECLARE_PRIVATE(QSGBorderImage)
+};
+
+QT_END_NAMESPACE
+QML_DECLARE_TYPE(QSGBorderImage)
+QT_END_HEADER
+
+#endif // QSGBORDERIMAGE_P_H
diff --git a/src/declarative/items/qsgborderimage_p_p.h b/src/declarative/items/qsgborderimage_p_p.h
new file mode 100644
index 0000000000..2fb88d9ffd
--- /dev/null
+++ b/src/declarative/items/qsgborderimage_p_p.h
@@ -0,0 +1,109 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGBORDERIMAGE_P_P_H
+#define QSGBORDERIMAGE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgimagebase_p_p.h"
+#include "qsgscalegrid_p_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkReply;
+class QSGBorderImagePrivate : public QSGImageBasePrivate
+{
+    Q_DECLARE_PUBLIC(QSGBorderImage)
+
+public:
+    QSGBorderImagePrivate()
+      : border(0), sciReply(0),
+        horizontalTileMode(QSGBorderImage::Stretch),
+        verticalTileMode(QSGBorderImage::Stretch),
+        redirectCount(0), pixmapChanged(false)
+    {
+    }
+
+    ~QSGBorderImagePrivate()
+    {
+    }
+
+
+    QSGScaleGrid *getScaleGrid()
+    {
+        Q_Q(QSGBorderImage);
+        if (!border) {
+            border = new QSGScaleGrid(q);
+            static int borderChangedSignalIdx = -1;
+            static int doUpdateSlotIdx = -1;
+            if (borderChangedSignalIdx < 0)
+                borderChangedSignalIdx = QSGScaleGrid::staticMetaObject.indexOfSignal("borderChanged()");
+            if (doUpdateSlotIdx < 0)
+                doUpdateSlotIdx = QSGBorderImage::staticMetaObject.indexOfSlot("doUpdate()");
+            QMetaObject::connect(border, borderChangedSignalIdx, q, doUpdateSlotIdx);
+        }
+        return border;
+    }
+
+    QSGScaleGrid *border;
+    QUrl sciurl;
+    QNetworkReply *sciReply;
+    QSGBorderImage::TileMode horizontalTileMode;
+    QSGBorderImage::TileMode verticalTileMode;
+    int redirectCount;
+
+    bool pixmapChanged : 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGBORDERIMAGE_P_P_H
diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp
new file mode 100644
index 0000000000..a325f0dac1
--- /dev/null
+++ b/src/declarative/items/qsgcanvas.cpp
@@ -0,0 +1,1890 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgcanvas.h"
+#include "qsgcanvas_p.h"
+
+#include "qsgitem.h"
+#include "qsgitem_p.h"
+
+#include <private/qsgrenderer_p.h>
+#include <private/qsgflashnode_p.h>
+
+#include <QtGui/qpainter.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qmatrix4x4.h>
+#include <QtGui/qinputcontext.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qabstractanimation.h>
+
+#include <private/qdeclarativedebugtrace_p.h>
+
+QT_BEGIN_NAMESPACE
+
+DEFINE_BOOL_CONFIG_OPTION(qmlThreadedRenderer, QML_THREADED_RENDERER)
+
+/*
+Focus behavior
+==============
+
+Prior to being added to a valid canvas items can set and clear focus with no 
+effect.  Only once items are added to a canvas (by way of having a parent set that
+already belongs to a canvas) do the focus rules apply.  Focus goes back to 
+having no effect if an item is removed from a canvas.
+
+When an item is moved into a new focus scope (either being added to a canvas
+for the first time, or having its parent changed), if the focus scope already has 
+a scope focused item that takes precedence over the item being added.  Otherwise,
+the focus of the added tree is used.  In the case of of a tree of items being 
+added to a canvas for the first time, which may have a conflicted focus state (two
+or more items in one scope having focus set), the same rule is applied item by item - 
+thus the first item that has focus will get it (assuming the scope doesn't already 
+have a scope focused item), and the other items will have their focus cleared.
+*/
+
+// #define FOCUS_DEBUG
+// #define MOUSE_DEBUG
+// #define TOUCH_DEBUG
+// #define DIRTY_DEBUG
+// #define THREAD_DEBUG
+
+// #define FRAME_TIMING
+
+#ifdef FRAME_TIMING
+static QTime frameTimer;
+int sceneGraphRenderTime;
+int readbackTime;
+#endif
+
+
+class QSGAnimationDriver : public QAnimationDriver
+{
+public:
+    QSGAnimationDriver(QWidget *w, QObject *parent)
+        : QAnimationDriver(parent), widget(w)
+    {
+        Q_ASSERT(w);
+    }
+
+    void started()
+    {
+        widget->update();
+    }
+
+    QWidget *widget;
+};
+
+QSGItem::UpdatePaintNodeData::UpdatePaintNodeData()
+: transformNode(0)
+{
+}
+
+QSGRootItem::QSGRootItem()
+{
+}
+
+QSGThreadedRendererAnimationDriver::QSGThreadedRendererAnimationDriver(QSGCanvasPrivate *r, QObject *parent)
+    : QAnimationDriver(parent)
+    , renderer(r)
+{
+}
+
+void QSGThreadedRendererAnimationDriver::started()
+{
+#ifdef THREAD_DEBUG
+    qWarning("AnimationDriver: Main Thread: started");
+#endif
+    renderer->mutex.lock();
+    renderer->animationRunning = true;
+    if (renderer->idle)
+        renderer->wait.wakeOne();
+    renderer->mutex.unlock();
+
+
+}
+
+void QSGThreadedRendererAnimationDriver::stopped()
+{
+#ifdef THREAD_DEBUG
+    qWarning("AnimationDriver: Main Thread: stopped");
+#endif
+    renderer->mutex.lock();
+    renderer->animationRunning = false;
+    renderer->mutex.unlock();
+}
+
+void QSGCanvas::paintEvent(QPaintEvent *)
+{
+    Q_D(QSGCanvas);
+
+    if (!d->threadedRendering) {
+#ifdef FRAME_TIMING
+        int lastFrame = frameTimer.restart();
+#endif
+
+        if (d->animationDriver->isRunning())
+            d->animationDriver->advance();
+
+#ifdef FRAME_TIMING
+        int animationTime = frameTimer.elapsed();
+#endif
+
+        Q_ASSERT(d->context);
+
+        d->polishItems();
+
+        QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::FramePaint);
+        QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Painting);
+
+#ifdef FRAME_TIMING
+        int polishTime = frameTimer.elapsed();
+#endif
+
+        makeCurrent();
+
+#ifdef FRAME_TIMING
+        int makecurrentTime = frameTimer.elapsed();
+#endif
+
+        d->syncSceneGraph();
+
+#ifdef FRAME_TIMING
+        int syncTime = frameTimer.elapsed();
+#endif
+
+        d->renderSceneGraph();
+
+#ifdef FRAME_TIMING
+        printf("FrameTimes, last=%d, animations=%d, polish=%d, makeCurrent=%d, sync=%d, sgrender=%d, readback=%d, total=%d\n",
+               lastFrame,
+               animationTime,
+               polishTime - animationTime,
+               makecurrentTime - polishTime,
+               syncTime - makecurrentTime,
+               sceneGraphRenderTime - syncTime,
+               readbackTime - sceneGraphRenderTime,
+               frameTimer.elapsed());
+#endif
+
+        QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Painting);
+
+        if (d->animationDriver->isRunning())
+            update();
+    }
+}
+
+void QSGCanvas::resizeEvent(QResizeEvent *e)
+{
+    Q_D(QSGCanvas);
+    if (d->threadedRendering) {
+        d->mutex.lock();
+        QGLWidget::resizeEvent(e);
+        d->widgetSize = e->size();
+        d->mutex.unlock();
+    } else {
+        d->widgetSize = e->size();
+        d->viewportSize = d->widgetSize;
+        QGLWidget::resizeEvent(e);
+    }
+}
+
+void QSGCanvas::showEvent(QShowEvent *e)
+{
+    Q_D(QSGCanvas);
+
+    QGLWidget::showEvent(e);
+
+    if (d->threadedRendering) {
+        d->contextInThread = true;
+        doneCurrent();
+        if (!d->animationDriver)
+            d->animationDriver = new QSGThreadedRendererAnimationDriver(d, this);
+        d->animationDriver->install();
+        d->mutex.lock();
+        d->thread->start();
+        d->wait.wait(&d->mutex);
+        d->mutex.unlock();
+    } else {
+        makeCurrent();
+
+        if (!d->context || !d->context->isReady()) {
+            d->initializeSceneGraph();
+            d->animationDriver = new QSGAnimationDriver(this, this);
+        }
+
+        d->animationDriver->install();
+    }
+}
+
+void QSGCanvas::hideEvent(QHideEvent *e)
+{
+    Q_D(QSGCanvas);
+
+    if (d->threadedRendering) {
+        d->mutex.lock();
+        d->exitThread = true;
+        d->wait.wakeOne();
+        d->wait.wait(&d->mutex);
+        d->exitThread = false;
+        d->mutex.unlock();
+        d->thread->wait();
+    }
+
+    d->animationDriver->uninstall();
+
+    QGLWidget::hideEvent(e);
+}
+
+
+void QSGCanvasPrivate::initializeSceneGraph()
+{
+    if (!context)
+        context = QSGContext::createDefaultContext();
+
+    if (context->isReady())
+        return;
+
+    QGLContext *glctx = const_cast<QGLContext *>(QGLContext::currentContext());
+    context->initialize(glctx);
+
+    if (!threadedRendering) {
+        Q_Q(QSGCanvas);
+        QObject::connect(context->renderer(), SIGNAL(sceneGraphChanged()), q, SLOT(maybeUpdate()),
+                         Qt::DirectConnection);
+    }
+
+    if (!QSGItemPrivate::get(rootItem)->itemNode()->parent()) {
+        context->rootNode()->appendChildNode(QSGItemPrivate::get(rootItem)->itemNode());
+    }
+
+    emit q_func()->sceneGraphInitialized();
+}
+
+void QSGCanvasPrivate::polishItems()
+{
+    while (!itemsToPolish.isEmpty()) {
+        QSet<QSGItem *>::Iterator iter = itemsToPolish.begin();
+        QSGItem *item = *iter;
+        itemsToPolish.erase(iter);
+        QSGItemPrivate::get(item)->polishScheduled = false;
+        item->updatePolish();
+    }
+}
+
+
+void QSGCanvasPrivate::syncSceneGraph()
+{
+    updateDirtyNodes();
+}
+
+
+void QSGCanvasPrivate::renderSceneGraph()
+{
+    QGLContext *glctx = const_cast<QGLContext *>(QGLContext::currentContext());
+
+    context->renderer()->setDeviceRect(QRect(QPoint(0, 0), viewportSize));
+    context->renderer()->setViewportRect(QRect(QPoint(0, 0), viewportSize));
+    context->renderer()->setProjectMatrixToDeviceRect();
+
+    context->renderNextFrame();
+
+#ifdef FRAME_TIMING
+    sceneGraphRenderTime = frameTimer.elapsed();
+#endif
+
+
+#ifdef FRAME_TIMING
+    int pixel;
+    glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel);
+    readbackTime = frameTimer.elapsed();
+#endif
+
+    glctx->swapBuffers();
+}
+
+
+void QSGCanvas::sceneGraphChanged()
+{
+    Q_D(QSGCanvas);
+    d->needsRepaint = true;
+}
+
+
+void QSGCanvasPrivate::runThread()
+{
+#ifdef THREAD_DEBUG
+    qWarning("QSGRenderer: Render thread running");
+#endif
+    Q_Q(QSGCanvas);
+
+    printf("QSGCanvas::runThread(), rendering in a thread...\n");
+
+    q->makeCurrent();
+    initializeSceneGraph();
+
+    QObject::connect(context->renderer(), SIGNAL(sceneGraphChanged()),
+                      q, SLOT(sceneGraphChanged()),
+                      Qt::DirectConnection);
+
+    mutex.lock();
+    wait.wakeOne(); // Wake the main thread waiting for us to start
+
+    while (true) {
+        QSize s;
+        s = widgetSize;
+
+        if (exitThread)
+            break;
+
+        if (s != viewportSize) {
+            glViewport(0, 0, s.width(), s.height());
+            viewportSize = s;
+        }
+
+#ifdef THREAD_DEBUG
+        qWarning("QSGRenderer: Render Thread: Waiting for main thread to stop");
+#endif
+        QCoreApplication::postEvent(q, new QEvent(QEvent::User));
+        wait.wait(&mutex);
+
+        if (exitThread) {
+#ifdef THREAD_DEBUG
+            qWarning("QSGRenderer: Render Thread: Shutting down...");
+#endif
+            break;
+        }
+
+#ifdef THREAD_DEBUG
+        qWarning("QSGRenderer: Render Thread: Main thread has stopped, syncing scene");
+#endif
+
+        // Do processing while main thread is frozen
+        syncSceneGraph();
+
+#ifdef THREAD_DEBUG
+        qWarning("QSGRenderer: Render Thread: Resuming main thread");
+#endif
+
+        // Read animationRunning while inside the locked section
+        bool continous = animationRunning;
+
+        wait.wakeOne();
+        mutex.unlock();
+
+        bool enterIdle = false;
+        if (needsRepaint) {
+#ifdef THREAD_DEBUG
+            qWarning("QSGRenderer: Render Thread: rendering scene");
+#endif
+            renderSceneGraph();
+            needsRepaint = false;
+        } else if (continous) {
+#ifdef THREAD_DEBUG
+            qWarning("QSGRenderer: Render Thread: waiting a while...");
+#endif
+            MyThread::doWait();
+        } else {
+            enterIdle = true;
+        }
+
+        mutex.lock();
+
+        if (enterIdle) {
+#ifdef THREAD_DEBUG
+            qWarning("QSGRenderer: Render Thread: Nothing has changed, going idle...");
+#endif
+            idle = true;
+            wait.wait(&mutex);
+            idle = false;
+#ifdef THREAD_DEBUG
+            qWarning("QSGRenderer: Render Thread: waking up from idle");
+#endif
+        }
+
+    }
+
+
+#ifdef THREAD_DEBUG
+    qWarning("QSGRenderer: Render Thread: shutting down, waking up main thread");
+#endif
+    wait.wakeOne();
+    mutex.unlock();
+
+    q->doneCurrent();
+}
+
+QSGCanvasPrivate::QSGCanvasPrivate()
+    : rootItem(0)
+    , activeFocusItem(0)
+    , mouseGrabberItem(0)
+    , hoverItem(0)
+    , dirtyItemList(0)
+    , context(0)
+    , contextInThread(false)
+    , threadedRendering(false)
+    , exitThread(false)
+    , animationRunning(false)
+    , idle(false)
+    , needsRepaint(true)
+    , renderThreadAwakened(false)
+    , thread(new MyThread(this))
+    , animationDriver(0)
+{
+    threadedRendering = qmlThreadedRenderer();
+}
+
+QSGCanvasPrivate::~QSGCanvasPrivate()
+{
+}
+
+void QSGCanvasPrivate::init(QSGCanvas *c)
+{
+    q_ptr = c;
+
+    Q_Q(QSGCanvas);
+
+    q->setAttribute(Qt::WA_AcceptTouchEvents);
+    q->setFocusPolicy(Qt::StrongFocus);
+
+    rootItem = new QSGRootItem;
+    QSGItemPrivate *rootItemPrivate = QSGItemPrivate::get(rootItem);
+    rootItemPrivate->canvas = q;
+    rootItemPrivate->flags |= QSGItem::ItemIsFocusScope;
+    rootItemPrivate->focus = true;
+    rootItemPrivate->activeFocus = true;
+    activeFocusItem = rootItem;
+
+    context = QSGContext::createDefaultContext();
+}
+
+void QSGCanvasPrivate::sceneMouseEventForTransform(QGraphicsSceneMouseEvent &sceneEvent,
+                                                   const QTransform &transform)
+{
+    sceneEvent.setPos(transform.map(sceneEvent.scenePos()));
+    sceneEvent.setLastPos(transform.map(sceneEvent.lastScenePos()));
+    for (int ii = 0; ii < 5; ++ii) {
+        if (sceneEvent.buttons() & (1 << ii)) {
+            sceneEvent.setButtonDownPos((Qt::MouseButton)(1 << ii), 
+                                        transform.map(sceneEvent.buttonDownScenePos((Qt::MouseButton)(1 << ii))));
+        }
+    }
+}
+
+void QSGCanvasPrivate::transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform)
+{
+    for (int i=0; i<touchPoints.count(); i++) {
+        QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
+        touchPoint.setRect(transform.mapRect(touchPoint.sceneRect()));
+        touchPoint.setStartPos(transform.map(touchPoint.startScenePos()));
+        touchPoint.setLastPos(transform.map(touchPoint.lastScenePos()));
+    }
+}
+
+QEvent::Type QSGCanvasPrivate::sceneMouseEventTypeFromMouseEvent(QMouseEvent *event)
+{
+    switch(event->type()) {
+    default:
+        Q_ASSERT(!"Unknown event type");
+    case QEvent::MouseButtonPress:
+        return QEvent::GraphicsSceneMousePress;
+    case QEvent::MouseButtonRelease:
+        return QEvent::GraphicsSceneMouseRelease;
+    case QEvent::MouseButtonDblClick:
+        return QEvent::GraphicsSceneMouseDoubleClick;
+    case QEvent::MouseMove:
+        return QEvent::GraphicsSceneMouseMove;
+    }
+}
+
+/*!
+Fill in the data in \a sceneEvent based on \a event.  This method leaves the item local positions in
+\a sceneEvent untouched.  Use sceneMouseEventForTransform() to fill in those details.
+*/
+void QSGCanvasPrivate::sceneMouseEventFromMouseEvent(QGraphicsSceneMouseEvent &sceneEvent, QMouseEvent *event)
+{
+    Q_Q(QSGCanvas);
+
+    Q_ASSERT(event);
+
+    if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick) {
+        if ((event->button() & event->buttons()) == event->buttons()) {
+            lastMousePosition = event->pos();
+        }
+
+        switch (event->button()) {
+        default:
+            Q_ASSERT(!"Unknown button");
+        case Qt::LeftButton:
+            buttonDownPositions[0] = event->pos();
+            break;
+        case Qt::RightButton:
+            buttonDownPositions[1] = event->pos();
+            break;
+        case Qt::MiddleButton:
+            buttonDownPositions[2] = event->pos();
+            break;
+        case Qt::XButton1:
+            buttonDownPositions[3] = event->pos();
+            break;
+        case Qt::XButton2:
+            buttonDownPositions[4] = event->pos();
+            break;
+        }
+    }
+
+    sceneEvent.setScenePos(event->pos());
+    sceneEvent.setScreenPos(event->globalPos());
+    sceneEvent.setLastScenePos(lastMousePosition);
+    sceneEvent.setLastScreenPos(q->mapToGlobal(lastMousePosition));
+    sceneEvent.setButtons(event->buttons());
+    sceneEvent.setButton(event->button());
+    sceneEvent.setModifiers(event->modifiers());
+    sceneEvent.setWidget(q);
+
+    for (int ii = 0; ii < 5; ++ii) {
+        if (sceneEvent.buttons() & (1 << ii)) {
+            sceneEvent.setButtonDownScenePos((Qt::MouseButton)(1 << ii), buttonDownPositions[ii]);
+            sceneEvent.setButtonDownScreenPos((Qt::MouseButton)(1 << ii), q->mapToGlobal(buttonDownPositions[ii]));
+        }
+    }
+
+    lastMousePosition = event->pos();
+}
+
+/*!
+Fill in the data in \a hoverEvent based on \a mouseEvent.  This method leaves the item local positions in
+\a hoverEvent untouched (these are filled in later).
+*/
+void QSGCanvasPrivate::sceneHoverEventFromMouseEvent(QGraphicsSceneHoverEvent &hoverEvent, QMouseEvent *mouseEvent)
+{
+    Q_Q(QSGCanvas);
+    hoverEvent.setWidget(q);
+    hoverEvent.setScenePos(mouseEvent->pos());
+    hoverEvent.setScreenPos(mouseEvent->globalPos());
+    if (lastMousePosition.isNull()) lastMousePosition = mouseEvent->pos();
+    hoverEvent.setLastScenePos(lastMousePosition);
+    hoverEvent.setLastScreenPos(q->mapToGlobal(lastMousePosition));
+    hoverEvent.setModifiers(mouseEvent->modifiers());
+    hoverEvent.setAccepted(mouseEvent->isAccepted());
+
+    lastMousePosition = mouseEvent->pos();
+}
+
+/*!
+Translates the data in \a touchEvent to this canvas.  This method leaves the item local positions in
+\a touchEvent untouched (these are filled in later).
+*/
+void QSGCanvasPrivate::translateTouchEvent(QTouchEvent *touchEvent)
+{
+    Q_Q(QSGCanvas);
+
+    touchEvent->setWidget(q);
+
+    QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
+    for (int i = 0; i < touchPoints.count(); ++i) {
+        QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
+
+        touchPoint.setScreenRect(touchPoint.sceneRect());
+        touchPoint.setStartScreenPos(touchPoint.startScenePos());
+        touchPoint.setLastScreenPos(touchPoint.lastScenePos());
+
+        touchPoint.setSceneRect(touchPoint.rect());
+        touchPoint.setStartScenePos(touchPoint.startPos());
+        touchPoint.setLastScenePos(touchPoint.lastPos());
+
+        if (touchPoint.isPrimary())
+            lastMousePosition = touchPoint.pos().toPoint();
+    }
+    touchEvent->setTouchPoints(touchPoints);
+}
+
+void QSGCanvasPrivate::setFocusInScope(QSGItem *scope, QSGItem *item, FocusOptions options)
+{
+    Q_Q(QSGCanvas);
+
+    Q_ASSERT(item);
+    Q_ASSERT(scope);
+
+#ifdef FOCUS_DEBUG
+    qWarning() << "QSGCanvasPrivate::setFocusInScope():";
+    qWarning() << "    scope:" << (QObject *)scope;
+    qWarning() << "    scopeSubFocusItem:" << (QObject *)QSGItemPrivate::get(scope)->subFocusItem;
+    qWarning() << "    item:" << (QObject *)item;
+    qWarning() << "    activeFocusItem:" << (QObject *)activeFocusItem;
+#endif
+
+    QSGItemPrivate *scopePrivate = QSGItemPrivate::get(scope);
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+
+    QSGItem *oldActiveFocusItem = 0;
+    QSGItem *newActiveFocusItem = 0;
+
+    QVarLengthArray<QSGItem *, 20> changed;
+
+    // Does this change the active focus?
+    if (scopePrivate->activeFocus) {
+        oldActiveFocusItem = activeFocusItem;
+        newActiveFocusItem = item;
+        while (newActiveFocusItem->isFocusScope() && newActiveFocusItem->scopedFocusItem())
+            newActiveFocusItem = newActiveFocusItem->scopedFocusItem();
+
+        Q_ASSERT(oldActiveFocusItem);
+
+#ifndef QT_NO_IM
+        if (QInputContext *ic = inputContext())
+            ic->reset();
+#endif
+
+        activeFocusItem = 0;
+        QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason);
+        q->sendEvent(oldActiveFocusItem, &event);
+
+        QSGItem *afi = oldActiveFocusItem;
+        while (afi != scope) {
+            if (QSGItemPrivate::get(afi)->activeFocus) {
+                QSGItemPrivate::get(afi)->activeFocus = false;
+                changed << afi;
+            }
+            afi = afi->parentItem();
+        }
+    }
+
+    QSGItem *oldSubFocusItem = scopePrivate->subFocusItem;
+    // Correct focus chain in scope
+    if (oldSubFocusItem) {
+        QSGItem *sfi = scopePrivate->subFocusItem->parentItem();
+        while (sfi != scope) {
+            QSGItemPrivate::get(sfi)->subFocusItem = 0;
+            sfi = sfi->parentItem();
+        }
+    }
+    {
+        scopePrivate->subFocusItem = item;
+        QSGItem *sfi = scopePrivate->subFocusItem->parentItem();
+        while (sfi != scope) {
+            QSGItemPrivate::get(sfi)->subFocusItem = item;
+            sfi = sfi->parentItem();
+        }
+    }
+
+    if (oldSubFocusItem) {
+        QSGItemPrivate::get(oldSubFocusItem)->focus = false;
+        changed << oldSubFocusItem;
+    }
+
+    if (!(options & DontChangeFocusProperty)) {
+        itemPrivate->focus = true;
+        changed << item;
+    }
+
+    if (newActiveFocusItem) {
+        activeFocusItem = newActiveFocusItem;
+
+        QSGItemPrivate::get(newActiveFocusItem)->activeFocus = true;
+        changed << newActiveFocusItem;
+
+        QSGItem *afi = newActiveFocusItem->parentItem();
+        while (afi != scope) {
+            if (afi->isFocusScope()) {
+                QSGItemPrivate::get(afi)->activeFocus = true;
+                changed << afi;
+            }
+            afi = afi->parentItem();
+        }
+
+        updateInputMethodData();
+
+        QFocusEvent event(QEvent::FocusIn, Qt::OtherFocusReason);
+        q->sendEvent(newActiveFocusItem, &event); 
+    } else {
+        updateInputMethodData();
+    }
+
+    if (!changed.isEmpty()) 
+        notifyFocusChangesRecur(changed.data(), changed.count() - 1);
+}
+
+void QSGCanvasPrivate::clearFocusInScope(QSGItem *scope, QSGItem *item, FocusOptions options)
+{
+    Q_Q(QSGCanvas);
+
+    Q_ASSERT(item);
+    Q_ASSERT(scope);
+
+#ifdef FOCUS_DEBUG
+    qWarning() << "QSGCanvasPrivate::clearFocusInScope():";
+    qWarning() << "    scope:" << (QObject *)scope;
+    qWarning() << "    item:" << (QObject *)item;
+    qWarning() << "    activeFocusItem:" << (QObject *)activeFocusItem;
+#endif
+
+    QSGItemPrivate *scopePrivate = QSGItemPrivate::get(scope);
+
+    QSGItem *oldActiveFocusItem = 0;
+    QSGItem *newActiveFocusItem = 0;
+
+    QVarLengthArray<QSGItem *, 20> changed;
+
+    Q_ASSERT(item == scopePrivate->subFocusItem);
+
+    // Does this change the active focus?
+    if (scopePrivate->activeFocus) {
+        oldActiveFocusItem = activeFocusItem;
+        newActiveFocusItem = scope;
+        
+        Q_ASSERT(oldActiveFocusItem);
+
+#ifndef QT_NO_IM
+        if (QInputContext *ic = inputContext())
+            ic->reset();
+#endif
+
+        activeFocusItem = 0;
+        QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason);
+        q->sendEvent(oldActiveFocusItem, &event);
+
+        QSGItem *afi = oldActiveFocusItem;
+        while (afi != scope) {
+            if (QSGItemPrivate::get(afi)->activeFocus) {
+                QSGItemPrivate::get(afi)->activeFocus = false;
+                changed << afi;
+            }
+            afi = afi->parentItem();
+        }
+    }
+
+    QSGItem *oldSubFocusItem = scopePrivate->subFocusItem;
+    // Correct focus chain in scope
+    if (oldSubFocusItem) {
+        QSGItem *sfi = scopePrivate->subFocusItem->parentItem();
+        while (sfi != scope) {
+            QSGItemPrivate::get(sfi)->subFocusItem = 0;
+            sfi = sfi->parentItem();
+        }
+    }
+    scopePrivate->subFocusItem = 0;
+
+    if (oldSubFocusItem && !(options & DontChangeFocusProperty)) {
+        QSGItemPrivate::get(oldSubFocusItem)->focus = false;
+        changed << oldSubFocusItem;
+    }
+
+    if (newActiveFocusItem) {
+        Q_ASSERT(newActiveFocusItem == scope);
+        activeFocusItem = scope;
+
+        updateInputMethodData();
+
+        QFocusEvent event(QEvent::FocusIn, Qt::OtherFocusReason);
+        q->sendEvent(newActiveFocusItem, &event); 
+    } else {
+        updateInputMethodData();
+    }
+
+    if (!changed.isEmpty()) 
+        notifyFocusChangesRecur(changed.data(), changed.count() - 1);
+}
+
+void QSGCanvasPrivate::notifyFocusChangesRecur(QSGItem **items, int remaining)
+{
+    QDeclarativeGuard<QSGItem> item(*items);
+
+    if (remaining)
+        notifyFocusChangesRecur(items + 1, remaining - 1);
+
+    if (item) {
+        QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+
+        if (itemPrivate->notifiedFocus != itemPrivate->focus) {
+            itemPrivate->notifiedFocus = itemPrivate->focus;
+            emit item->focusChanged(itemPrivate->focus);
+        }
+
+        if (item && itemPrivate->notifiedActiveFocus != itemPrivate->activeFocus) {
+            itemPrivate->notifiedActiveFocus = itemPrivate->activeFocus;
+            itemPrivate->itemChange(QSGItem::ItemActiveFocusHasChanged, itemPrivate->activeFocus);
+            emit item->activeFocusChanged(itemPrivate->activeFocus);
+        }
+    } 
+}
+
+void QSGCanvasPrivate::updateInputMethodData()
+{
+    Q_Q(QSGCanvas);
+    bool enabled = activeFocusItem
+                   && (QSGItemPrivate::get(activeFocusItem)->flags & QSGItem::ItemAcceptsInputMethod);
+    q->setAttribute(Qt::WA_InputMethodEnabled, enabled);
+    q->setInputMethodHints(enabled ? activeFocusItem->inputMethodHints() : Qt::ImhNone);
+}
+
+QVariant QSGCanvas::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+    Q_D(const QSGCanvas);
+    if (!d->activeFocusItem || !(QSGItemPrivate::get(d->activeFocusItem)->flags & QSGItem::ItemAcceptsInputMethod))
+        return QVariant();
+    QVariant value = d->activeFocusItem->inputMethodQuery(query);
+
+    //map geometry types
+    QVariant::Type type = value.type();
+    if (type == QVariant::RectF || type == QVariant::Rect) {
+        const QTransform transform = QSGItemPrivate::get(d->activeFocusItem)->itemToCanvasTransform();
+        value = transform.mapRect(value.toRectF());
+    } else if (type == QVariant::PointF || type == QVariant::Point) {
+        const QTransform transform = QSGItemPrivate::get(d->activeFocusItem)->itemToCanvasTransform();
+        value = transform.map(value.toPointF());
+    }
+    return value;
+}
+
+void QSGCanvasPrivate::dirtyItem(QSGItem *)
+{
+    Q_Q(QSGCanvas);
+    q->maybeUpdate();
+}
+
+void QSGCanvasPrivate::cleanup(QSGNode *n)
+{
+    Q_Q(QSGCanvas);
+
+    Q_ASSERT(!cleanupNodeList.contains(n));
+    cleanupNodeList.append(n);
+    q->maybeUpdate();
+}
+
+static QGLFormat tweakFormat(const QGLFormat &format = QGLFormat::defaultFormat())
+{
+    QGLFormat f = format;
+    f.setSwapInterval(1);
+    return f;
+}
+
+QSGCanvas::QSGCanvas(QWidget *parent, Qt::WindowFlags f)
+    : QGLWidget(*(new QSGCanvasPrivate), tweakFormat(), parent, (QGLWidget *) 0, f)
+{
+    Q_D(QSGCanvas);
+
+    d->init(this);
+}
+
+QSGCanvas::QSGCanvas(const QGLFormat &format, QWidget *parent, Qt::WindowFlags f)
+    : QGLWidget(*(new QSGCanvasPrivate), tweakFormat(format), parent, (QGLWidget *) 0, f)
+{
+    Q_D(QSGCanvas);
+
+    d->init(this);
+}
+
+QSGCanvas::QSGCanvas(QSGCanvasPrivate &dd, QWidget *parent, Qt::WindowFlags f)
+: QGLWidget(dd, tweakFormat(), parent, 0, f)
+{
+    Q_D(QSGCanvas);
+
+    d->init(this);
+}
+
+QSGCanvas::QSGCanvas(QSGCanvasPrivate &dd, const QGLFormat &format, QWidget *parent, Qt::WindowFlags f)
+: QGLWidget(dd, tweakFormat(format), parent, 0, f)
+{
+    Q_D(QSGCanvas);
+
+    d->init(this);
+}
+
+QSGCanvas::~QSGCanvas()
+{
+    Q_D(QSGCanvas);
+
+    // ### should we change ~QSGItem to handle this better?
+    // manually cleanup for the root item (item destructor only handles these when an item is parented)
+    QSGItemPrivate *rootItemPrivate = QSGItemPrivate::get(d->rootItem);
+    rootItemPrivate->removeFromDirtyList();
+    rootItemPrivate->canvas = 0;
+
+    delete d->rootItem; d->rootItem = 0;
+    d->cleanupNodes();
+
+    delete d->context;
+}
+
+QSGItem *QSGCanvas::rootItem() const
+{
+    Q_D(const QSGCanvas);
+    
+    return d->rootItem;
+}
+
+QSGItem *QSGCanvas::activeFocusItem() const
+{
+    Q_D(const QSGCanvas);
+    
+    return d->activeFocusItem;
+}
+
+QSGItem *QSGCanvas::mouseGrabberItem() const
+{
+    Q_D(const QSGCanvas);
+    
+    return d->mouseGrabberItem;
+}
+
+
+void QSGCanvasPrivate::clearHover()
+{
+    Q_Q(QSGCanvas);
+    if (!hoverItem)
+        return;
+
+    QGraphicsSceneHoverEvent hoverEvent;
+    hoverEvent.setWidget(q);
+
+    QPoint cursorPos = QCursor::pos();
+    hoverEvent.setScenePos(q->mapFromGlobal(cursorPos));
+    hoverEvent.setLastScenePos(hoverEvent.scenePos());
+    hoverEvent.setScreenPos(cursorPos);
+    hoverEvent.setLastScreenPos(hoverEvent.screenPos());
+
+    QSGItem *item = hoverItem;
+    hoverItem = 0;
+    sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, &hoverEvent);
+}
+
+
+bool QSGCanvas::event(QEvent *e)
+{
+    Q_D(QSGCanvas);
+
+    if (e->type() == QEvent::User) {
+        Q_ASSERT(d->threadedRendering);
+
+        d->mutex.lock();
+#ifdef THREAD_DEBUG
+        qWarning("QSGRenderer: Main Thread: Stopped");
+#endif
+
+        d->polishItems();
+
+        d->renderThreadAwakened = false;
+
+        d->wait.wakeOne();
+
+        // The thread is exited when the widget has been hidden. We then need to
+        // skip the waiting, otherwise we would be waiting for a wakeup that never
+        // comes.
+        if (d->thread->isRunning())
+            d->wait.wait(&d->mutex);
+#ifdef THREAD_DEBUG
+        qWarning("QSGRenderer: Main Thread: Resumed");
+#endif
+        d->mutex.unlock();
+
+        if (d->animationRunning)
+            d->animationDriver->advance();
+    }
+
+    switch (e->type()) {
+
+    case QEvent::TouchBegin:
+    case QEvent::TouchUpdate:
+    case QEvent::TouchEnd:
+    {
+        QTouchEvent *touch = static_cast<QTouchEvent *>(e);
+        d->translateTouchEvent(touch);
+        d->deliverTouchEvent(touch);
+        if (!touch->isAccepted())
+            return false;
+    }
+    case QEvent::Leave:
+        d->clearHover();
+        d->lastMousePosition = QPoint();
+        break;
+    default:
+        break;
+    }
+
+    return QGLWidget::event(e);
+}
+
+void QSGCanvas::keyPressEvent(QKeyEvent *e)
+{
+    Q_D(QSGCanvas);
+    
+    sendEvent(d->activeFocusItem, e);
+}
+
+void QSGCanvas::keyReleaseEvent(QKeyEvent *e)
+{
+    Q_D(QSGCanvas);
+    
+    sendEvent(d->activeFocusItem, e);
+}
+
+void QSGCanvas::inputMethodEvent(QInputMethodEvent *e)
+{
+    Q_D(QSGCanvas);
+
+    sendEvent(d->activeFocusItem, e);
+}
+
+bool QSGCanvasPrivate::deliverInitialMousePressEvent(QSGItem *item, QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGCanvas);
+
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+    if (itemPrivate->opacity == 0.0)
+        return false;
+
+    if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) {
+        QPointF p = item->mapFromScene(event->scenePos());
+        if (!QRectF(0, 0, item->width(), item->height()).contains(p))
+            return false;
+    }
+
+    QList<QSGItem *> children = itemPrivate->paintOrderChildItems();
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        QSGItem *child = children.at(ii);
+        if (!child->isVisible() || !child->isEnabled())
+            continue;
+        if (deliverInitialMousePressEvent(child, event))
+            return true;
+    }
+
+    if (itemPrivate->acceptedMouseButtons & event->button()) {
+        QPointF p = item->mapFromScene(event->scenePos());
+        if (QRectF(0, 0, item->width(), item->height()).contains(p)) {
+            sceneMouseEventForTransform(*event, itemPrivate->canvasToItemTransform());
+            event->accept();
+            mouseGrabberItem = item;
+            q->sendEvent(item, event);
+            if (event->isAccepted()) 
+                return true;
+            mouseGrabberItem->ungrabMouse();
+            mouseGrabberItem = 0;
+        }
+    }
+
+    return false;
+}
+
+bool QSGCanvasPrivate::deliverMouseEvent(QGraphicsSceneMouseEvent *sceneEvent)
+{
+    Q_Q(QSGCanvas);
+
+    if (!mouseGrabberItem && 
+         sceneEvent->type() == QEvent::GraphicsSceneMousePress &&
+         (sceneEvent->button() & sceneEvent->buttons()) == sceneEvent->buttons()) {
+        
+        return deliverInitialMousePressEvent(rootItem, sceneEvent);
+    }
+
+    if (mouseGrabberItem) {
+        QSGItemPrivate *mgPrivate = QSGItemPrivate::get(mouseGrabberItem);
+        sceneMouseEventForTransform(*sceneEvent, mgPrivate->canvasToItemTransform());
+
+        sceneEvent->accept();
+        q->sendEvent(mouseGrabberItem, sceneEvent);
+        if (sceneEvent->isAccepted())
+            return true;
+    }
+
+    return false;
+}
+
+void QSGCanvas::mousePressEvent(QMouseEvent *event)
+{
+    Q_D(QSGCanvas);
+    
+#ifdef MOUSE_DEBUG
+    qWarning() << "QSGCanvas::mousePressEvent()" << event->pos() << event->button() << event->buttons();
+#endif
+
+    QGraphicsSceneMouseEvent sceneEvent(d->sceneMouseEventTypeFromMouseEvent(event));
+    d->sceneMouseEventFromMouseEvent(sceneEvent, event);
+
+    d->deliverMouseEvent(&sceneEvent);
+    event->setAccepted(sceneEvent.isAccepted());
+}
+
+void QSGCanvas::mouseReleaseEvent(QMouseEvent *event)
+{
+    Q_D(QSGCanvas);
+    
+#ifdef MOUSE_DEBUG
+    qWarning() << "QSGCanvas::mouseReleaseEvent()" << event->pos() << event->button() << event->buttons();
+#endif
+
+    if (!d->mouseGrabberItem) {
+        QGLWidget::mouseReleaseEvent(event);
+        return;
+    }
+
+    QGraphicsSceneMouseEvent sceneEvent(d->sceneMouseEventTypeFromMouseEvent(event));
+    d->sceneMouseEventFromMouseEvent(sceneEvent, event);
+
+    d->deliverMouseEvent(&sceneEvent);
+    event->setAccepted(sceneEvent.isAccepted());
+
+    d->mouseGrabberItem = 0;
+}
+
+void QSGCanvas::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    Q_D(QSGCanvas);
+    
+#ifdef MOUSE_DEBUG
+    qWarning() << "QSGCanvas::mouseDoubleClickEvent()" << event->pos() << event->button() << event->buttons();
+#endif
+
+    QGraphicsSceneMouseEvent sceneEvent(d->sceneMouseEventTypeFromMouseEvent(event));
+    d->sceneMouseEventFromMouseEvent(sceneEvent, event);
+
+    if (!d->mouseGrabberItem && (event->button() & event->buttons()) == event->buttons()) {
+        if (d->deliverInitialMousePressEvent(d->rootItem, &sceneEvent))
+            event->accept();
+        else
+            event->ignore();
+        return;
+    } 
+
+    d->deliverMouseEvent(&sceneEvent);
+    event->setAccepted(sceneEvent.isAccepted());
+}
+
+void QSGCanvasPrivate::sendHoverEvent(QEvent::Type type, QSGItem *item,
+                                      QGraphicsSceneHoverEvent *event)
+{
+    Q_Q(QSGCanvas);
+    const QTransform transform = QSGItemPrivate::get(item)->canvasToItemTransform();
+
+    //create copy of event
+    QGraphicsSceneHoverEvent hoverEvent(type);
+    hoverEvent.setWidget(event->widget());
+    hoverEvent.setPos(transform.map(event->scenePos()));
+    hoverEvent.setScenePos(event->scenePos());
+    hoverEvent.setScreenPos(event->screenPos());
+    hoverEvent.setLastPos(transform.map(event->lastScenePos()));
+    hoverEvent.setLastScenePos(event->lastScenePos());
+    hoverEvent.setLastScreenPos(event->lastScreenPos());
+    hoverEvent.setModifiers(event->modifiers());
+    hoverEvent.setAccepted(event->isAccepted());
+
+    q->sendEvent(item, &hoverEvent);
+}
+
+void QSGCanvas::mouseMoveEvent(QMouseEvent *event)
+{
+    Q_D(QSGCanvas);
+    
+#ifdef MOUSE_DEBUG
+    qWarning() << "QSGCanvas::mouseMoveEvent()" << event->pos() << event->button() << event->buttons();
+#endif
+
+    if (!d->mouseGrabberItem) {
+        QGraphicsSceneHoverEvent hoverEvent;
+        d->sceneHoverEventFromMouseEvent(hoverEvent, event);
+
+        bool delivered = d->deliverHoverEvent(d->rootItem, &hoverEvent);
+        if (!delivered) {
+            //take care of any exits
+            if (d->hoverItem) {
+                QSGItem *item = d->hoverItem;
+                d->hoverItem = 0;
+                d->sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, &hoverEvent);
+            }
+        }
+        event->setAccepted(hoverEvent.isAccepted());
+        return;
+    }
+
+    QGraphicsSceneMouseEvent sceneEvent(d->sceneMouseEventTypeFromMouseEvent(event));
+    d->sceneMouseEventFromMouseEvent(sceneEvent, event);
+
+    d->deliverMouseEvent(&sceneEvent);
+    event->setAccepted(sceneEvent.isAccepted());
+}
+
+bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, QGraphicsSceneHoverEvent *event)
+{
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+    if (itemPrivate->opacity == 0.0)
+        return false;
+
+    if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) {
+        QPointF p = item->mapFromScene(event->scenePos());
+        if (!QRectF(0, 0, item->width(), item->height()).contains(p))
+            return false;
+    }
+
+    QList<QSGItem *> children = itemPrivate->paintOrderChildItems();
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        QSGItem *child = children.at(ii);
+        if (!child->isEnabled())
+            continue;
+        if (deliverHoverEvent(child, event))
+            return true;
+    }
+
+    if (itemPrivate->hoverEnabled) {
+        QPointF p = item->mapFromScene(event->scenePos());
+        if (QRectF(0, 0, item->width(), item->height()).contains(p)) {
+            if (hoverItem == item) {
+                //move
+                sendHoverEvent(QEvent::GraphicsSceneHoverMove, item, event);
+            } else {
+                //exit from previous
+                if (hoverItem) {
+                    QSGItem *item = hoverItem;
+                    hoverItem = 0;
+                    sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, event);
+                }
+
+                //enter new item
+                hoverItem = item;
+                sendHoverEvent(QEvent::GraphicsSceneHoverEnter, item, event);
+            }
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool QSGCanvasPrivate::deliverWheelEvent(QSGItem *item, QGraphicsSceneWheelEvent *event)
+{
+    Q_Q(QSGCanvas);
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+    if (itemPrivate->opacity == 0.0)
+        return false;
+
+    if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) {
+        QPointF p = item->mapFromScene(event->scenePos());
+        if (!QRectF(0, 0, item->width(), item->height()).contains(p))
+            return false;
+    }
+
+    QList<QSGItem *> children = itemPrivate->paintOrderChildItems();
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        QSGItem *child = children.at(ii);
+        if (!child->isEnabled())
+            continue;
+        if (deliverWheelEvent(child, event))
+            return true;
+    }
+
+    QPointF p = item->mapFromScene(event->scenePos());
+    if (QRectF(0, 0, item->width(), item->height()).contains(p)) {
+        event->setPos(itemPrivate->canvasToItemTransform().map(event->scenePos()));
+        event->accept();
+        q->sendEvent(item, event);
+        if (event->isAccepted())
+            return true;
+    }
+
+    return false;
+}
+
+#ifndef QT_NO_WHEELEVENT
+void QSGCanvas::wheelEvent(QWheelEvent *event)
+{
+    Q_D(QSGCanvas);
+#ifdef MOUSE_DEBUG
+    qWarning() << "QSGCanvas::wheelEvent()" << event->pos() << event->delta() << event->orientation();
+#endif
+    QGraphicsSceneWheelEvent wheelEvent(QEvent::GraphicsSceneWheel);
+    wheelEvent.setWidget(this);
+    wheelEvent.setScenePos(event->pos());
+    wheelEvent.setScreenPos(event->globalPos());
+    wheelEvent.setButtons(event->buttons());
+    wheelEvent.setModifiers(event->modifiers());
+    wheelEvent.setDelta(event->delta());
+    wheelEvent.setOrientation(event->orientation());
+    wheelEvent.setAccepted(false);
+
+    d->deliverWheelEvent(d->rootItem, &wheelEvent);
+    event->setAccepted(wheelEvent.isAccepted());
+}
+#endif // QT_NO_WHEELEVENT
+
+bool QSGCanvasPrivate::deliverTouchEvent(QTouchEvent *event)
+{
+#ifdef TOUCH_DEBUG
+    if (event->type() == QEvent::TouchBegin)
+        qWarning("touchBeginEvent");
+    else if (event->type() == QEvent::TouchUpdate)
+        qWarning("touchUpdateEvent");
+    else if (event->type() == QEvent::TouchEnd)
+        qWarning("touchEndEvent");
+#endif
+
+    QHash<QSGItem *, QList<QTouchEvent::TouchPoint> > updatedPoints;
+
+    if (event->type() == QTouchEvent::TouchBegin) {     // all points are new touch points
+        QSet<int> acceptedNewPoints;
+        deliverTouchPoints(rootItem, event, event->touchPoints(), &acceptedNewPoints, &updatedPoints);
+        if (acceptedNewPoints.count() > 0)
+            event->accept();
+        return event->isAccepted();
+    }
+
+    const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
+    QList<QTouchEvent::TouchPoint> newPoints;
+    QSGItem *item = 0;
+    for (int i=0; i<touchPoints.count(); i++) {
+        const QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
+        switch (touchPoint.state()) {
+            case Qt::TouchPointPressed:
+                newPoints << touchPoint;
+                break;
+            case Qt::TouchPointMoved:
+            case Qt::TouchPointStationary:
+            case Qt::TouchPointReleased:
+                if (itemForTouchPointId.contains(touchPoint.id())) {
+                    item = itemForTouchPointId[touchPoint.id()];
+                    if (item)
+                        updatedPoints[item].append(touchPoint);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (newPoints.count() > 0 || updatedPoints.count() > 0) {
+        QSet<int> acceptedNewPoints;
+        int prevCount = updatedPoints.count();
+        deliverTouchPoints(rootItem, event, newPoints, &acceptedNewPoints, &updatedPoints);
+        if (acceptedNewPoints.count() > 0 || updatedPoints.count() != prevCount)
+            event->accept();
+    }
+
+    if (event->touchPointStates() & Qt::TouchPointReleased) {
+        for (int i=0; i<touchPoints.count(); i++) {
+            if (touchPoints[i].state() == Qt::TouchPointReleased)
+                itemForTouchPointId.remove(touchPoints[i].id());
+        }
+    }
+
+    return event->isAccepted();
+}
+
+bool QSGCanvasPrivate::deliverTouchPoints(QSGItem *item, QTouchEvent *event, const QList<QTouchEvent::TouchPoint> &newPoints, QSet<int> *acceptedNewPoints, QHash<QSGItem *, QList<QTouchEvent::TouchPoint> > *updatedPoints)
+{
+    Q_Q(QSGCanvas);
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+
+    if (itemPrivate->opacity == 0.0)
+        return false;
+
+    if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) {
+        QRectF bounds(0, 0, item->width(), item->height());
+        for (int i=0; i<newPoints.count(); i++) {
+            QPointF p = item->mapFromScene(newPoints[i].scenePos());
+            if (!bounds.contains(p))
+                return false;
+        }
+    }
+
+    QList<QSGItem *> children = itemPrivate->paintOrderChildItems();
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        QSGItem *child = children.at(ii);
+        if (!child->isEnabled())
+            continue;
+        if (deliverTouchPoints(child, event, newPoints, acceptedNewPoints, updatedPoints))
+            return true;
+    }
+
+    QList<QTouchEvent::TouchPoint> matchingPoints;
+    if (newPoints.count() > 0 && acceptedNewPoints->count() < newPoints.count()) {
+        QRectF bounds(0, 0, item->width(), item->height());
+        for (int i=0; i<newPoints.count(); i++) {
+            if (acceptedNewPoints->contains(newPoints[i].id()))
+                continue;
+            QPointF p = item->mapFromScene(newPoints[i].scenePos());
+            if (bounds.contains(p))
+                matchingPoints << newPoints[i];
+        }
+    }
+
+    if (matchingPoints.count() > 0 || (*updatedPoints)[item].count() > 0) {
+        QList<QTouchEvent::TouchPoint> &eventPoints = (*updatedPoints)[item];
+        eventPoints.append(matchingPoints);
+        transformTouchPoints(eventPoints, itemPrivate->canvasToItemTransform());
+
+        Qt::TouchPointStates eventStates;
+        for (int i=0; i<eventPoints.count(); i++)
+            eventStates |= eventPoints[i].state();
+        // if all points have the same state, set the event type accordingly
+        QEvent::Type eventType;
+        switch (eventStates) {
+            case Qt::TouchPointPressed:
+                eventType = QEvent::TouchBegin;
+                break;
+            case Qt::TouchPointReleased:
+                eventType = QEvent::TouchEnd;
+                break;
+            default:
+                eventType = QEvent::TouchUpdate;
+                break;
+        }
+
+        if (eventStates != Qt::TouchPointStationary) {
+            QTouchEvent touchEvent(eventType);
+            touchEvent.setWidget(q);
+            touchEvent.setDeviceType(event->deviceType());
+            touchEvent.setModifiers(event->modifiers());
+            touchEvent.setTouchPointStates(eventStates);
+            touchEvent.setTouchPoints(eventPoints);
+
+            touchEvent.accept();
+            q->sendEvent(item, &touchEvent);
+
+            if (touchEvent.isAccepted()) {
+                for (int i=0; i<matchingPoints.count(); i++) {
+                    itemForTouchPointId[matchingPoints[i].id()] = item;
+                    acceptedNewPoints->insert(matchingPoints[i].id());
+                }
+            }
+        }
+    }
+
+    updatedPoints->remove(item);
+    if (acceptedNewPoints->count() == newPoints.count() && updatedPoints->isEmpty())
+        return true;
+
+    return false;
+}
+
+bool QSGCanvasPrivate::sendFilteredMouseEvent(QSGItem *target, QSGItem *item, QGraphicsSceneMouseEvent *event)
+{
+    if (!target)
+        return false;
+
+    if (sendFilteredMouseEvent(target->parentItem(), item, event))
+        return true;
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(target);
+    if (targetPrivate->filtersChildMouseEvents) 
+        if (target->childMouseEventFilter(item, event))
+            return true;
+
+    return false;
+}
+
+bool QSGCanvas::sendEvent(QSGItem *item, QEvent *e) 
+{ 
+    Q_D(QSGCanvas);
+    
+    if (!item) {
+        qWarning("QSGCanvas::sendEvent: Cannot send event to a null item");
+        return false;
+    }
+
+    Q_ASSERT(e);
+
+    switch (e->type()) {
+    case QEvent::KeyPress:
+    case QEvent::KeyRelease:
+        QSGItemPrivate::get(item)->deliverKeyEvent(static_cast<QKeyEvent *>(e));
+        while (!e->isAccepted() && (item = item->parentItem())) {
+            e->accept();
+            QSGItemPrivate::get(item)->deliverKeyEvent(static_cast<QKeyEvent *>(e));
+        }
+        break;
+    case QEvent::InputMethod:
+        QSGItemPrivate::get(item)->deliverInputMethodEvent(static_cast<QInputMethodEvent *>(e));
+        while (!e->isAccepted() && (item = item->parentItem())) {
+            e->accept();
+            QSGItemPrivate::get(item)->deliverInputMethodEvent(static_cast<QInputMethodEvent *>(e));
+        }
+        break;
+    case QEvent::FocusIn:
+    case QEvent::FocusOut:
+        QSGItemPrivate::get(item)->deliverFocusEvent(static_cast<QFocusEvent *>(e));
+        break;
+    case QEvent::GraphicsSceneMousePress:
+    case QEvent::GraphicsSceneMouseRelease:
+    case QEvent::GraphicsSceneMouseDoubleClick:
+    case QEvent::GraphicsSceneMouseMove:
+        // XXX todo - should sendEvent be doing this?  how does it relate to forwarded events? 
+        {
+            QGraphicsSceneMouseEvent *se = static_cast<QGraphicsSceneMouseEvent *>(e);
+            if (!d->sendFilteredMouseEvent(item->parentItem(), item, se)) {
+                se->accept();
+                QSGItemPrivate::get(item)->deliverMouseEvent(se);
+            }
+        }
+        break;
+    case QEvent::GraphicsSceneWheel:
+        QSGItemPrivate::get(item)->deliverWheelEvent(static_cast<QGraphicsSceneWheelEvent *>(e));
+        break;
+    case QEvent::GraphicsSceneHoverEnter:
+    case QEvent::GraphicsSceneHoverLeave:
+    case QEvent::GraphicsSceneHoverMove:
+        QSGItemPrivate::get(item)->deliverHoverEvent(static_cast<QGraphicsSceneHoverEvent *>(e));
+        break;
+    case QEvent::TouchBegin:
+    case QEvent::TouchUpdate:
+    case QEvent::TouchEnd:
+        QSGItemPrivate::get(item)->deliverTouchEvent(static_cast<QTouchEvent *>(e));
+        break;
+    default:
+        break;
+    }
+
+    return false; 
+}
+
+void QSGCanvasPrivate::cleanupNodes()
+{
+    for (int ii = 0; ii < cleanupNodeList.count(); ++ii)
+        delete cleanupNodeList.at(ii);
+    cleanupNodeList.clear();
+}
+
+void QSGCanvasPrivate::updateDirtyNodes()
+{
+#ifdef DIRTY_DEBUG
+    qWarning() << "QSGCanvasPrivate::updateDirtyNodes():";
+#endif
+
+    cleanupNodes();
+
+    QSGItem *updateList = dirtyItemList;
+    dirtyItemList = 0;
+    if (updateList) QSGItemPrivate::get(updateList)->prevDirtyItem = &updateList;
+
+    while (updateList) {
+        QSGItem *item = updateList;
+        QSGItemPrivate *itemPriv = QSGItemPrivate::get(item);
+        itemPriv->removeFromDirtyList();
+
+#ifdef DIRTY_DEBUG
+        qWarning() << "   QSGNode:" << item << qPrintable(itemPriv->dirtyToString());
+#endif
+        updateDirtyNode(item);
+    }
+}
+
+void QSGCanvasPrivate::updateDirtyNode(QSGItem *item)
+{
+#ifdef QML_RUNTIME_TESTING
+    bool didFlash = false;
+#endif
+
+    QSGItemPrivate *itemPriv = QSGItemPrivate::get(item);
+    quint32 dirty = itemPriv->dirtyAttributes;
+    itemPriv->dirtyAttributes = 0;
+
+    if ((dirty & QSGItemPrivate::TransformUpdateMask) ||
+        (dirty & QSGItemPrivate::Size && itemPriv->origin != QSGItem::TopLeft && 
+         (itemPriv->scale != 1. || itemPriv->rotation != 0.))) {
+
+        QMatrix4x4 matrix;
+
+        if (itemPriv->x != 0. || itemPriv->y != 0.) 
+            matrix.translate(itemPriv->x, itemPriv->y);
+
+        if (dirty & QSGItemPrivate::ComplexTransformUpdateMask) {
+            for (int ii = itemPriv->transforms.count() - 1; ii >= 0; --ii)
+                itemPriv->transforms.at(ii)->applyTo(&matrix);
+        }
+
+        if (itemPriv->scale != 1. || itemPriv->rotation != 0.) {
+            QPointF origin = itemPriv->computeTransformOrigin();
+            matrix.translate(origin.x(), origin.y());
+            if (itemPriv->scale != 1.)
+                matrix.scale(itemPriv->scale, itemPriv->scale);
+            if (itemPriv->rotation != 0.)
+                matrix.rotate(itemPriv->rotation, 0, 0, 1);
+            matrix.translate(-origin.x(), -origin.y());
+        }
+
+        itemPriv->itemNode()->setMatrix(matrix);
+    }
+
+    bool clipEffectivelyChanged = dirty & QSGItemPrivate::Clip &&
+                                  ((item->clip() == false) != (itemPriv->clipNode == 0));
+    bool effectRefEffectivelyChanged = dirty & QSGItemPrivate::EffectReference &&
+                                  ((itemPriv->effectRefCount == 0) != (itemPriv->rootNode == 0));
+
+    if (clipEffectivelyChanged) {
+        QSGNode *parent = itemPriv->opacityNode ? (QSGNode *) itemPriv->opacityNode : (QSGNode *)itemPriv->itemNode();
+        QSGNode *child = itemPriv->rootNode ? (QSGNode *)itemPriv->rootNode : (QSGNode *)itemPriv->groupNode;
+
+        if (item->clip()) {
+            Q_ASSERT(itemPriv->clipNode == 0);
+            itemPriv->clipNode = new QSGDefaultClipNode(QRectF(0, 0, itemPriv->width, itemPriv->height));
+
+            if (child)
+                parent->removeChildNode(child);
+            parent->appendChildNode(itemPriv->clipNode);
+            if (child)
+                itemPriv->clipNode->appendChildNode(child);
+
+        } else {
+            Q_ASSERT(itemPriv->clipNode != 0);
+            parent->removeChildNode(itemPriv->clipNode);
+            if (child)
+                itemPriv->clipNode->removeChildNode(child);
+            delete itemPriv->clipNode;
+            itemPriv->clipNode = 0;
+            if (child)
+                parent->appendChildNode(child);
+        }
+    }
+
+    if (dirty & QSGItemPrivate::ChildrenUpdateMask) {
+        while (itemPriv->childContainerNode()->childCount())
+            itemPriv->childContainerNode()->removeChildNode(itemPriv->childContainerNode()->childAtIndex(0));
+    }
+
+    if (effectRefEffectivelyChanged) {
+        QSGNode *parent = itemPriv->clipNode;
+        if (!parent)
+            parent = itemPriv->opacityNode;
+        if (!parent)
+            parent = itemPriv->itemNode();
+        QSGNode *child = itemPriv->groupNode;
+
+        if (itemPriv->effectRefCount) {
+            Q_ASSERT(itemPriv->rootNode == 0);
+            itemPriv->rootNode = new QSGRootNode;
+
+            if (child)
+                parent->removeChildNode(child);
+            parent->appendChildNode(itemPriv->rootNode);
+            if (child)
+                itemPriv->rootNode->appendChildNode(child);
+        } else {
+            Q_ASSERT(itemPriv->rootNode != 0);
+            parent->removeChildNode(itemPriv->rootNode);
+            if (child)
+                itemPriv->rootNode->removeChildNode(child);
+            delete itemPriv->rootNode;
+            itemPriv->rootNode = 0;
+            if (child)
+                parent->appendChildNode(child);
+        }
+    }
+
+    if (dirty & QSGItemPrivate::ChildrenUpdateMask) {
+        QSGNode *groupNode = itemPriv->groupNode;
+        if (groupNode) {
+            for (int count = groupNode->childCount(); count; --count)
+                groupNode->removeChildNode(groupNode->childAtIndex(0));
+        }
+
+        QList<QSGItem *> orderedChildren = itemPriv->paintOrderChildItems();
+        int ii = 0;
+
+        itemPriv->paintNodeIndex = 0;
+        for (; ii < orderedChildren.count() && orderedChildren.at(ii)->z() < 0; ++ii) {
+            QSGItemPrivate *childPrivate = QSGItemPrivate::get(orderedChildren.at(ii));
+            if (!childPrivate->explicitVisible && !childPrivate->effectRefCount)
+                continue;
+            if (childPrivate->itemNode()->parent())
+                childPrivate->itemNode()->parent()->removeChildNode(childPrivate->itemNode());
+
+            itemPriv->childContainerNode()->appendChildNode(childPrivate->itemNode());
+            itemPriv->paintNodeIndex++;
+        }
+
+        if (itemPriv->paintNode)
+            itemPriv->childContainerNode()->appendChildNode(itemPriv->paintNode);
+
+        for (; ii < orderedChildren.count(); ++ii) {
+            QSGItemPrivate *childPrivate = QSGItemPrivate::get(orderedChildren.at(ii));
+            if (!childPrivate->explicitVisible && !childPrivate->effectRefCount)
+                continue;
+            if (childPrivate->itemNode()->parent())
+                childPrivate->itemNode()->parent()->removeChildNode(childPrivate->itemNode());
+
+            itemPriv->childContainerNode()->appendChildNode(childPrivate->itemNode());
+        }
+    }
+
+    if ((dirty & QSGItemPrivate::Size || clipEffectivelyChanged) && itemPriv->clipNode) {
+        itemPriv->clipNode->setRect(QRectF(0, 0, itemPriv->width, itemPriv->height));
+        itemPriv->clipNode->update();
+    }
+
+    if (dirty & (QSGItemPrivate::OpacityValue | QSGItemPrivate::Visible | QSGItemPrivate::HideReference)) {
+        qreal opacity = itemPriv->explicitVisible && itemPriv->hideRefCount == 0
+                      ? itemPriv->opacity : qreal(0);
+
+        if (opacity != 1 && !itemPriv->opacityNode) {
+            itemPriv->opacityNode = new QSGOpacityNode;
+
+            QSGNode *parent = itemPriv->itemNode();
+            QSGNode *child = itemPriv->clipNode;
+            if (!child)
+                child = itemPriv->rootNode;
+            if (!child)
+                child = itemPriv->groupNode;
+
+            if (child)
+                parent->removeChildNode(child);
+            parent->appendChildNode(itemPriv->opacityNode);
+            if (child)
+                itemPriv->opacityNode->appendChildNode(child);
+        }
+        if (itemPriv->opacityNode)
+            itemPriv->opacityNode->setOpacity(opacity);
+    }
+
+    if (dirty & QSGItemPrivate::ContentUpdateMask) {
+
+        if (itemPriv->flags & QSGItem::ItemHasContents) {
+            updatePaintNodeData.transformNode = itemPriv->itemNode(); 
+            itemPriv->paintNode = item->updatePaintNode(itemPriv->paintNode, &updatePaintNodeData);
+
+            Q_ASSERT(itemPriv->paintNode == 0 || 
+                     itemPriv->paintNode->parent() == 0 ||
+                     itemPriv->paintNode->parent() == itemPriv->childContainerNode());
+
+            if (itemPriv->paintNode && itemPriv->paintNode->parent() == 0) {
+                if (itemPriv->childContainerNode()->childCount() == itemPriv->paintNodeIndex)
+                    itemPriv->childContainerNode()->appendChildNode(itemPriv->paintNode);
+                else 
+                    itemPriv->childContainerNode()->insertChildNodeBefore(itemPriv->paintNode, itemPriv->childContainerNode()->childAtIndex(itemPriv->paintNodeIndex));
+            }
+        } else if (itemPriv->paintNode) {
+            delete itemPriv->paintNode;
+        }
+    }
+
+#ifndef QT_NO_DEBUG
+    // Check consistency.
+    const QSGNode *nodeChain[] = {
+        itemPriv->itemNodeInstance,
+        itemPriv->opacityNode,
+        itemPriv->clipNode,
+        itemPriv->rootNode,
+        itemPriv->groupNode,
+        itemPriv->paintNode,
+    };
+
+    int ip = 0;
+    for (;;) {
+        while (ip < 5 && nodeChain[ip] == 0)
+            ++ip;
+        if (ip == 5)
+            break;
+        int ic = ip + 1;
+        while (ic < 5 && nodeChain[ic] == 0)
+            ++ic;
+        const QSGNode *parent = nodeChain[ip];
+        const QSGNode *child = nodeChain[ic];
+        if (child == 0) {
+            Q_ASSERT(parent == itemPriv->groupNode || parent->childCount() == 0);
+        } else {
+            Q_ASSERT(parent == itemPriv->groupNode || parent->childCount() == 1);
+            Q_ASSERT(child->parent() == parent);
+            bool containsChild = false;
+            for (int i = 0; i < parent->childCount(); ++i)
+                containsChild |= (parent->childAtIndex(i) == child);
+            Q_ASSERT(containsChild);
+        }
+        ip = ic;
+    }
+#endif
+
+#ifdef QML_RUNTIME_TESTING
+    if (itemPriv->sceneGraphContext()->isFlashModeEnabled()) {
+        QSGFlashNode *flash = new QSGFlashNode();
+        flash->setRect(item->boundingRect());
+        itemPriv->childContainerNode()->appendChildNode(flash);
+        didFlash = true;
+    }
+    Q_Q(QSGCanvas);
+    if (didFlash) {
+        q->maybeUpdate();
+    }
+#endif
+
+}
+
+void QSGCanvas::maybeUpdate()
+{
+    Q_D(QSGCanvas);
+
+    if (d->threadedRendering) {
+        if (!d->renderThreadAwakened) {
+            d->renderThreadAwakened = true;
+            bool locked = d->mutex.tryLock();
+            if (d->idle && locked) {
+#ifdef THREAD_DEBUG
+                qWarning("QSGRenderer: now maybe I should update...");
+#endif
+                d->wait.wakeOne();
+            }
+            if (locked)
+                d->mutex.unlock();
+        }
+    } else if (!d->animationDriver || !d->animationDriver->isRunning()) {
+        update();
+    }
+}
+
+/*!
+    \fn void QSGEngine::sceneGraphInitialized();
+
+    This signal is emitted when the scene graph has been initialized.
+
+    This signal will be emitted from the scene graph rendering thread.
+ */
+
+/*!
+    Returns the QSGEngine used for this scene.
+
+    The engine will only be available once the scene graph has been
+    initialized. Register for the sceneGraphEngine() signal to get
+    notification about this.
+ */
+
+QSGEngine *QSGCanvas::sceneGraphEngine() const
+{
+    Q_D(const QSGCanvas);
+    if (d->context->isReady())
+        return d->context->engine();
+    return 0;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgcanvas.h b/src/declarative/items/qsgcanvas.h
new file mode 100644
index 0000000000..8f3b3038f8
--- /dev/null
+++ b/src/declarative/items/qsgcanvas.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGCANVAS_H
+#define QSGCANVAS_H
+
+#include <QtCore/qmetatype.h>
+#include <QtOpenGL/qgl.h>
+#include <QtGui/qwidget.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItem;
+class QSGEngine;
+class QSGCanvasPrivate;
+class Q_DECLARATIVE_EXPORT QSGCanvas : public QGLWidget
+{
+Q_OBJECT
+Q_DECLARE_PRIVATE(QSGCanvas)
+public:
+    QSGCanvas(QWidget *parent = 0, Qt::WindowFlags f = 0);
+    QSGCanvas(const QGLFormat &format, QWidget *parent = 0, Qt::WindowFlags f = 0);
+    virtual ~QSGCanvas();
+
+    QSGItem *rootItem() const;
+    QSGItem *activeFocusItem() const;
+
+    QSGItem *mouseGrabberItem() const;
+
+    bool sendEvent(QSGItem *, QEvent *);
+
+    QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+
+    QSGEngine *sceneGraphEngine() const;
+
+signals:
+    void sceneGraphInitialized();
+
+protected:
+    QSGCanvas(QSGCanvasPrivate &dd, QWidget *parent = 0, Qt::WindowFlags f = 0);
+    QSGCanvas(QSGCanvasPrivate &dd, const QGLFormat &format, QWidget *parent = 0, Qt::WindowFlags f = 0);
+
+    virtual void paintEvent(QPaintEvent *);
+    virtual void resizeEvent(QResizeEvent *);
+
+    virtual void showEvent(QShowEvent *);
+    virtual void hideEvent(QHideEvent *);
+
+    virtual bool event(QEvent *);
+    virtual void keyPressEvent(QKeyEvent *);
+    virtual void keyReleaseEvent(QKeyEvent *);
+    virtual void inputMethodEvent(QInputMethodEvent *);
+    virtual void mousePressEvent(QMouseEvent *);
+    virtual void mouseReleaseEvent(QMouseEvent *);
+    virtual void mouseDoubleClickEvent(QMouseEvent *);
+    virtual void mouseMoveEvent(QMouseEvent *);
+#ifndef QT_NO_WHEELEVENT
+    virtual void wheelEvent(QWheelEvent *);
+#endif
+
+private slots:
+    void sceneGraphChanged();
+    void maybeUpdate();
+
+private:
+    Q_DISABLE_COPY(QSGCanvas);
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QSGCanvas *);
+
+QT_END_HEADER
+
+#endif // QSGCANVAS_H
+
diff --git a/src/declarative/items/qsgcanvas_p.h b/src/declarative/items/qsgcanvas_p.h
new file mode 100644
index 0000000000..63bd2dfb28
--- /dev/null
+++ b/src/declarative/items/qsgcanvas_p.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGCANVAS_P_H
+#define QSGCANVAS_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgitem.h"
+#include "qsgcanvas.h"
+#include <private/qdeclarativeguard_p.h>
+
+#include <private/qsgcontext_p.h>
+
+#include <QtCore/qthread.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qwaitcondition.h>
+#include <private/qwidget_p.h>
+#include <private/qgl_p.h>
+
+QT_BEGIN_NAMESPACE
+
+//Make it easy to identify and customize the root item if needed
+class QSGRootItem : public QSGItem
+{
+    Q_OBJECT
+public:
+    QSGRootItem();
+};
+
+class QSGCanvasPrivate;
+
+class QSGThreadedRendererAnimationDriver : public QAnimationDriver
+{
+public:
+    QSGThreadedRendererAnimationDriver(QSGCanvasPrivate *r, QObject *parent);
+
+protected:
+    virtual void started();
+    virtual void stopped();
+
+    QSGCanvasPrivate *renderer;
+};
+
+class QTouchEvent;
+class QSGCanvasPrivate : public QGLWidgetPrivate
+{
+public:
+    Q_DECLARE_PUBLIC(QSGCanvas)
+
+    static inline QSGCanvasPrivate *get(QSGCanvas *c) { return c->d_func(); }
+
+    QSGCanvasPrivate();
+    virtual ~QSGCanvasPrivate();
+
+    void init(QSGCanvas *);
+
+    QSGRootItem *rootItem;
+
+    QSGItem *activeFocusItem;
+    QSGItem *mouseGrabberItem;
+
+    // Mouse positions are saved in widget coordinates
+    QPoint lastMousePosition;
+    QPoint buttonDownPositions[5]; // Left, Right, Middle, XButton1, XButton2
+    void sceneMouseEventFromMouseEvent(QGraphicsSceneMouseEvent &, QMouseEvent *);
+    void translateTouchEvent(QTouchEvent *touchEvent);
+    static QEvent::Type sceneMouseEventTypeFromMouseEvent(QMouseEvent *);
+    static void sceneMouseEventForTransform(QGraphicsSceneMouseEvent &, const QTransform &);
+    static void transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform);
+    bool deliverInitialMousePressEvent(QSGItem *, QGraphicsSceneMouseEvent *);
+    bool deliverMouseEvent(QGraphicsSceneMouseEvent *);
+    bool sendFilteredMouseEvent(QSGItem *, QSGItem *, QGraphicsSceneMouseEvent *);
+    bool deliverWheelEvent(QSGItem *, QGraphicsSceneWheelEvent *);
+    bool deliverTouchPoints(QSGItem *, QTouchEvent *, const QList<QTouchEvent::TouchPoint> &, QSet<int> *,
+            QHash<QSGItem *, QList<QTouchEvent::TouchPoint> > *);
+    bool deliverTouchEvent(QTouchEvent *);
+    void sceneHoverEventFromMouseEvent(QGraphicsSceneHoverEvent &, QMouseEvent *);
+    bool deliverHoverEvent(QSGItem *, QGraphicsSceneHoverEvent *);
+    void sendHoverEvent(QEvent::Type, QSGItem *, QGraphicsSceneHoverEvent *);
+    void clearHover();
+
+    QDeclarativeGuard<QSGItem> hoverItem;
+    enum FocusOption {
+        DontChangeFocusProperty = 0x01,
+    };
+    Q_DECLARE_FLAGS(FocusOptions, FocusOption)
+
+    void setFocusInScope(QSGItem *scope, QSGItem *item, FocusOptions = 0);
+    void clearFocusInScope(QSGItem *scope, QSGItem *item, FocusOptions = 0);
+    void notifyFocusChangesRecur(QSGItem **item, int remaining);
+
+    void updateInputMethodData();
+
+    void dirtyItem(QSGItem *);
+    void cleanup(QSGNode *);
+
+    void initializeSceneGraph();
+    void polishItems();
+    void syncSceneGraph();
+    void renderSceneGraph();
+    void runThread();
+
+    QSGItem::UpdatePaintNodeData updatePaintNodeData;
+
+    QSGItem *dirtyItemList;
+    QList<QSGNode *> cleanupNodeList;
+
+    QSet<QSGItem *> itemsToPolish;
+
+    void updateDirtyNodes();
+    void cleanupNodes();
+    bool updateEffectiveOpacity(QSGItem *);
+    void updateEffectiveOpacityRoot(QSGItem *, qreal);
+    void updateDirtyNode(QSGItem *);
+
+    QSGContext *context;
+
+    uint contextInThread : 1;
+    uint threadedRendering : 1;
+    uint exitThread : 1;
+    uint animationRunning: 1;
+    uint idle : 1;              // Set to true when render thread sees no change and enters a wait()
+    uint needsRepaint : 1;      // Set by callback from render if scene needs repainting.
+    uint renderThreadAwakened : 1;
+
+    struct MyThread : public QThread {
+        MyThread(QSGCanvasPrivate *r) : renderer(r) {}
+        virtual void run() { renderer->runThread(); }
+        static void doWait() { QThread::msleep(16); }
+        QSGCanvasPrivate *renderer;
+    };
+    MyThread *thread;
+    QMutex mutex;
+    QWaitCondition wait;
+    QSize widgetSize;
+    QSize viewportSize;
+
+    QAnimationDriver *animationDriver;
+
+    QHash<int, QSGItem *> itemForTouchPointId;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGCanvasPrivate::FocusOptions)
+
+QT_END_NAMESPACE
+
+#endif // QSGCANVAS_P_H
diff --git a/src/declarative/items/qsgclipnode.cpp b/src/declarative/items/qsgclipnode.cpp
new file mode 100644
index 0000000000..2e40972620
--- /dev/null
+++ b/src/declarative/items/qsgclipnode.cpp
@@ -0,0 +1,121 @@
+
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qsgclipnode_p.h"
+
+#include <QtGui/qvector2d.h>
+#include <QtCore/qmath.h>
+
+QSGDefaultClipNode::QSGDefaultClipNode(const QRectF &rect)
+    : m_rect(rect)
+    , m_radius(0)
+    , m_dirty_geometry(true)
+    , m_geometry(QSGGeometry::defaultAttributes_Point2D(), 0)
+{
+    setGeometry(&m_geometry);
+    setIsRectangular(true);
+}
+
+void QSGDefaultClipNode::setRect(const QRectF &rect)
+{
+    m_rect = rect;
+    m_dirty_geometry = true;
+}
+
+void QSGDefaultClipNode::setRadius(qreal radius)
+{
+    m_radius = radius;
+    m_dirty_geometry = true;
+    setIsRectangular(radius == 0);
+}
+
+void QSGDefaultClipNode::update()
+{
+    if (m_dirty_geometry) {
+        updateGeometry();
+        m_dirty_geometry = false;
+    }
+}
+
+void QSGDefaultClipNode::updateGeometry()
+{
+    QSGGeometry *g = geometry();
+
+    if (qFuzzyIsNull(m_radius)) {
+        g->allocate(4);
+        QSGGeometry::updateRectGeometry(g, m_rect);
+
+    } else {
+        int vertexCount = 0;
+
+        // Radius should never exceeds half of the width or half of the height
+        qreal radius = qMin(qMin(m_rect.width() / 2, m_rect.height() / 2), m_radius);
+        QRectF rect = m_rect;
+        rect.adjust(radius, radius, -radius, -radius);
+
+        int segments = qMin(30, qCeil(radius)); // Number of segments per corner.
+
+        g->allocate((segments + 1) * 2);
+
+        QVector2D *vertices = (QVector2D *)g->vertexData();
+
+        for (int part = 0; part < 2; ++part) {
+            for (int i = 0; i <= segments; ++i) {
+                //### Should change to calculate sin/cos only once.
+                qreal angle = qreal(0.5 * M_PI) * (part + i / qreal(segments));
+                qreal s = qFastSin(angle);
+                qreal c = qFastCos(angle);
+                qreal y = (part ? rect.bottom() : rect.top()) - radius * c; // current inner y-coordinate.
+                qreal lx = rect.left() - radius * s; // current inner left x-coordinate.
+                qreal rx = rect.right() + radius * s; // current inner right x-coordinate.
+
+                vertices[vertexCount++] = QVector2D(rx, y);
+                vertices[vertexCount++] = QVector2D(lx, y);
+            }
+        }
+
+        markDirty(DirtyGeometry);
+    }
+    setClipRect(m_rect);
+}
+
diff --git a/src/declarative/items/qsgclipnode_p.h b/src/declarative/items/qsgclipnode_p.h
new file mode 100644
index 0000000000..aa1d01efdd
--- /dev/null
+++ b/src/declarative/items/qsgclipnode_p.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGCLIPNODE_P_H
+#define QSGCLIPNODE_P_H
+
+#include <qsgnode.h>
+
+class QSGDefaultClipNode : public QSGClipNode
+{
+public:
+    QSGDefaultClipNode(const QRectF &);
+
+    void setRect(const QRectF &);
+    QRectF rect() const { return m_rect; }
+
+    void setRadius(qreal radius);
+    qreal radius() const { return m_radius; }
+
+    virtual void update();
+
+private:
+    void updateGeometry();
+    QRectF m_rect;
+    qreal m_radius;
+
+    uint m_dirty_geometry : 1;
+    uint m_reserved : 31;
+
+    QSGGeometry m_geometry;
+};
+
+#endif // QSGCLIPNODE_P_H
diff --git a/src/declarative/items/qsgevents.cpp b/src/declarative/items/qsgevents.cpp
new file mode 100644
index 0000000000..44ef38b037
--- /dev/null
+++ b/src/declarative/items/qsgevents.cpp
@@ -0,0 +1,47 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgevents_p_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgevents_p_p.h b/src/declarative/items/qsgevents_p_p.h
new file mode 100644
index 0000000000..f0d434db32
--- /dev/null
+++ b/src/declarative/items/qsgevents_p_p.h
@@ -0,0 +1,142 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGEVENTS_P_P_H
+#define QSGEVENTS_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qdeclarative.h>
+
+#include <QtCore/qobject.h>
+#include <QtGui/qevent.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGKeyEvent : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int key READ key)
+    Q_PROPERTY(QString text READ text)
+    Q_PROPERTY(int modifiers READ modifiers)
+    Q_PROPERTY(bool isAutoRepeat READ isAutoRepeat)
+    Q_PROPERTY(int count READ count)
+    Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
+
+public:
+    QSGKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text=QString(), bool autorep=false, ushort count=1)
+        : event(type, key, modifiers, text, autorep, count) { event.setAccepted(false); }
+    QSGKeyEvent(const QKeyEvent &ke)
+        : event(ke) { event.setAccepted(false); }
+
+    int key() const { return event.key(); }
+    QString text() const { return event.text(); }
+    int modifiers() const { return event.modifiers(); }
+    bool isAutoRepeat() const { return event.isAutoRepeat(); }
+    int count() const { return event.count(); }
+
+    bool isAccepted() { return event.isAccepted(); }
+    void setAccepted(bool accepted) { event.setAccepted(accepted); }
+
+private:
+    QKeyEvent event;
+};
+
+class QSGMouseEvent : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int x READ x)
+    Q_PROPERTY(int y READ y)
+    Q_PROPERTY(int button READ button)
+    Q_PROPERTY(int buttons READ buttons)
+    Q_PROPERTY(int modifiers READ modifiers)
+    Q_PROPERTY(bool wasHeld READ wasHeld)
+    Q_PROPERTY(bool isClick READ isClick)
+    Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
+
+public:
+    QSGMouseEvent(int x, int y, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers
+                  , bool isClick=false, bool wasHeld=false)
+        : _x(x), _y(y), _button(button), _buttons(buttons), _modifiers(modifiers)
+          , _wasHeld(wasHeld), _isClick(isClick), _accepted(true) {}
+
+    int x() const { return _x; }
+    int y() const { return _y; }
+    int button() const { return _button; }
+    int buttons() const { return _buttons; }
+    int modifiers() const { return _modifiers; }
+    bool wasHeld() const { return _wasHeld; }
+    bool isClick() const { return _isClick; }
+
+    // only for internal usage
+    void setX(int x) { _x = x; }
+    void setY(int y) { _y = y; }
+
+    bool isAccepted() { return _accepted; }
+    void setAccepted(bool accepted) { _accepted = accepted; }
+
+private:
+    int _x;
+    int _y;
+    Qt::MouseButton _button;
+    Qt::MouseButtons _buttons;
+    Qt::KeyboardModifiers _modifiers;
+    bool _wasHeld;
+    bool _isClick;
+    bool _accepted;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGKeyEvent)
+QML_DECLARE_TYPE(QSGMouseEvent)
+
+#endif // QSGEVENTS_P_P_H
diff --git a/src/declarative/items/qsgflickable.cpp b/src/declarative/items/qsgflickable.cpp
new file mode 100644
index 0000000000..e2f6fff71b
--- /dev/null
+++ b/src/declarative/items/qsgflickable.cpp
@@ -0,0 +1,1397 @@
+// Commit: ee767e8c16742316068e83323374ea54f2b939cb
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgflickable_p.h"
+#include "qsgflickable_p_p.h"
+#include "qsgcanvas.h"
+#include "qsgcanvas_p.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+// FlickThreshold determines how far the "mouse" must have moved
+// before we perform a flick.
+static const int FlickThreshold = 20;
+
+// RetainGrabVelocity is the maxmimum instantaneous velocity that
+// will ensure the Flickable retains the grab on consecutive flicks.
+static const int RetainGrabVelocity = 15;
+
+QSGFlickableVisibleArea::QSGFlickableVisibleArea(QSGFlickable *parent)
+    : QObject(parent), flickable(parent), m_xPosition(0.), m_widthRatio(0.)
+    , m_yPosition(0.), m_heightRatio(0.)
+{
+}
+
+qreal QSGFlickableVisibleArea::widthRatio() const
+{
+    return m_widthRatio;
+}
+
+qreal QSGFlickableVisibleArea::xPosition() const
+{
+    return m_xPosition;
+}
+
+qreal QSGFlickableVisibleArea::heightRatio() const
+{
+    return m_heightRatio;
+}
+
+qreal QSGFlickableVisibleArea::yPosition() const
+{
+    return m_yPosition;
+}
+
+void QSGFlickableVisibleArea::updateVisible()
+{
+    QSGFlickablePrivate *p = QSGFlickablePrivate::get(flickable);
+
+    bool changeX = false;
+    bool changeY = false;
+    bool changeWidth = false;
+    bool changeHeight = false;
+
+    // Vertical
+    const qreal viewheight = flickable->height();
+    const qreal maxyextent = -flickable->maxYExtent() + flickable->minYExtent();
+    qreal pagePos = (-p->vData.move.value() + flickable->minYExtent()) / (maxyextent + viewheight);
+    qreal pageSize = viewheight / (maxyextent + viewheight);
+
+    if (pageSize != m_heightRatio) {
+        m_heightRatio = pageSize;
+        changeHeight = true;
+    }
+    if (pagePos != m_yPosition) {
+        m_yPosition = pagePos;
+        changeY = true;
+    }
+
+    // Horizontal
+    const qreal viewwidth = flickable->width();
+    const qreal maxxextent = -flickable->maxXExtent() + flickable->minXExtent();
+    pagePos = (-p->hData.move.value() + flickable->minXExtent()) / (maxxextent + viewwidth);
+    pageSize = viewwidth / (maxxextent + viewwidth);
+
+    if (pageSize != m_widthRatio) {
+        m_widthRatio = pageSize;
+        changeWidth = true;
+    }
+    if (pagePos != m_xPosition) {
+        m_xPosition = pagePos;
+        changeX = true;
+    }
+
+    if (changeX)
+        emit xPositionChanged(m_xPosition);
+    if (changeY)
+        emit yPositionChanged(m_yPosition);
+    if (changeWidth)
+        emit widthRatioChanged(m_widthRatio);
+    if (changeHeight)
+        emit heightRatioChanged(m_heightRatio);
+}
+
+
+QSGFlickablePrivate::QSGFlickablePrivate()
+  : contentItem(new QSGItem)
+    , hData(this, &QSGFlickablePrivate::setRoundedViewportX)
+    , vData(this, &QSGFlickablePrivate::setRoundedViewportY)
+    , flickingHorizontally(false), flickingVertically(false)
+    , hMoved(false), vMoved(false)
+    , movingHorizontally(false), movingVertically(false)
+    , stealMouse(false), pressed(false), interactive(true), calcVelocity(false)
+    , deceleration(500), maxVelocity(2000), reportedVelocitySmoothing(100)
+    , delayedPressEvent(0), delayedPressTarget(0), pressDelay(0), fixupDuration(600)
+    , fixupMode(Normal), vTime(0), visibleArea(0)
+    , flickableDirection(QSGFlickable::AutoFlickDirection)
+    , boundsBehavior(QSGFlickable::DragAndOvershootBounds)
+{
+}
+
+void QSGFlickablePrivate::init()
+{
+    Q_Q(QSGFlickable);
+    QDeclarative_setParent_noEvent(contentItem, q);
+    contentItem->setParentItem(q);
+    static int timelineUpdatedIdx = -1;
+    static int timelineCompletedIdx = -1;
+    static int flickableTickedIdx = -1;
+    static int flickableMovementEndingIdx = -1;
+    if (timelineUpdatedIdx == -1) {
+        timelineUpdatedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("updated()");
+        timelineCompletedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("completed()");
+        flickableTickedIdx = QSGFlickable::staticMetaObject.indexOfSlot("ticked()");
+        flickableMovementEndingIdx = QSGFlickable::staticMetaObject.indexOfSlot("movementEnding()");
+    }
+    QMetaObject::connect(&timeline, timelineUpdatedIdx,
+                         q, flickableTickedIdx, Qt::DirectConnection);
+    QMetaObject::connect(&timeline, timelineCompletedIdx,
+                         q, flickableMovementEndingIdx, Qt::DirectConnection);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFiltersChildMouseEvents(true);
+    QSGItemPrivate *viewportPrivate = QSGItemPrivate::get(contentItem);
+    viewportPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+    lastPosTime.invalidate();
+}
+
+/*
+    Returns the amount to overshoot by given a velocity.
+    Will be roughly in range 0 - size/4
+*/
+qreal QSGFlickablePrivate::overShootDistance(qreal velocity, qreal size)
+{
+    if (maxVelocity <= 0)
+        return 0.0;
+
+    velocity = qAbs(velocity);
+    if (velocity > maxVelocity)
+        velocity = maxVelocity;
+    qreal dist = size / 4 * velocity / maxVelocity;
+    return dist;
+}
+
+void QSGFlickablePrivate::itemGeometryChanged(QSGItem *item, const QRectF &newGeom, const QRectF &oldGeom)
+{
+    Q_Q(QSGFlickable);
+    if (item == contentItem) {
+        if (newGeom.x() != oldGeom.x())
+            emit q->contentXChanged();
+        if (newGeom.y() != oldGeom.y())
+            emit q->contentYChanged();
+    }
+}
+
+void QSGFlickablePrivate::flickX(qreal velocity)
+{
+    Q_Q(QSGFlickable);
+    flick(hData, q->minXExtent(), q->maxXExtent(), q->width(), fixupX_callback, velocity);
+}
+
+void QSGFlickablePrivate::flickY(qreal velocity)
+{
+    Q_Q(QSGFlickable);
+    flick(vData, q->minYExtent(), q->maxYExtent(), q->height(), fixupY_callback, velocity);
+}
+
+void QSGFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                                         QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
+{
+    Q_Q(QSGFlickable);
+    qreal maxDistance = -1;
+    data.fixingUp = false;
+    bool overShoot = boundsBehavior == QSGFlickable::DragAndOvershootBounds;
+    // -ve velocity means list is moving up
+    if (velocity > 0) {
+        if (data.move.value() < minExtent)
+            maxDistance = qAbs(minExtent - data.move.value() + (overShoot?overShootDistance(velocity,vSize):0));
+        data.flickTarget = minExtent;
+    } else {
+        if (data.move.value() > maxExtent)
+            maxDistance = qAbs(maxExtent - data.move.value()) + (overShoot?overShootDistance(velocity,vSize):0);
+        data.flickTarget = maxExtent;
+    }
+    if (maxDistance > 0) {
+        qreal v = velocity;
+        if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
+            if (v < 0)
+                v = -maxVelocity;
+            else
+                v = maxVelocity;
+        }
+        timeline.reset(data.move);
+        timeline.accel(data.move, v, deceleration, maxDistance);
+        timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
+        if (!flickingHorizontally && q->xflick()) {
+            flickingHorizontally = true;
+            emit q->flickingChanged();
+            emit q->flickingHorizontallyChanged();
+            if (!flickingVertically)
+                emit q->flickStarted();
+        }
+        if (!flickingVertically && q->yflick()) {
+            flickingVertically = true;
+            emit q->flickingChanged();
+            emit q->flickingVerticallyChanged();
+            if (!flickingHorizontally)
+                emit q->flickStarted();
+        }
+    } else {
+        timeline.reset(data.move);
+        fixup(data, minExtent, maxExtent);
+    }
+}
+
+void QSGFlickablePrivate::fixupY_callback(void *data)
+{
+    ((QSGFlickablePrivate *)data)->fixupY();
+}
+
+void QSGFlickablePrivate::fixupX_callback(void *data)
+{
+    ((QSGFlickablePrivate *)data)->fixupX();
+}
+
+void QSGFlickablePrivate::fixupX()
+{
+    Q_Q(QSGFlickable);
+    fixup(hData, q->minXExtent(), q->maxXExtent());
+}
+
+void QSGFlickablePrivate::fixupY()
+{
+    Q_Q(QSGFlickable);
+    fixup(vData, q->minYExtent(), q->maxYExtent());
+}
+
+void QSGFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
+{
+    if (data.move.value() > minExtent || maxExtent > minExtent) {
+        timeline.reset(data.move);
+        if (data.move.value() != minExtent) {
+            switch (fixupMode) {
+            case Immediate:
+                timeline.set(data.move, minExtent);
+                break;
+            case ExtentChanged:
+                // The target has changed. Don't start from the beginning; just complete the
+                // second half of the animation using the new extent.
+                timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
+                data.fixingUp = true;
+                break;
+            default: {
+                    qreal dist = minExtent - data.move;
+                    timeline.move(data.move, minExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
+                    timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
+                    data.fixingUp = true;
+                }
+            }
+        }
+    } else if (data.move.value() < maxExtent) {
+        timeline.reset(data.move);
+        switch (fixupMode) {
+        case Immediate:
+            timeline.set(data.move, maxExtent);
+            break;
+        case ExtentChanged:
+            // The target has changed. Don't start from the beginning; just complete the
+            // second half of the animation using the new extent.
+            timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
+            data.fixingUp = true;
+            break;
+        default: {
+                qreal dist = maxExtent - data.move;
+                timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
+                timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
+                data.fixingUp = true;
+            }
+        }
+    }
+    fixupMode = Normal;
+    vTime = timeline.time();
+}
+
+void QSGFlickablePrivate::updateBeginningEnd()
+{
+    Q_Q(QSGFlickable);
+    bool atBoundaryChange = false;
+
+    // Vertical
+    const int maxyextent = int(-q->maxYExtent());
+    const qreal ypos = -vData.move.value();
+    bool atBeginning = (ypos <= -q->minYExtent());
+    bool atEnd = (maxyextent <= ypos);
+
+    if (atBeginning != vData.atBeginning) {
+        vData.atBeginning = atBeginning;
+        atBoundaryChange = true;
+    }
+    if (atEnd != vData.atEnd) {
+        vData.atEnd = atEnd;
+        atBoundaryChange = true;
+    }
+
+    // Horizontal
+    const int maxxextent = int(-q->maxXExtent());
+    const qreal xpos = -hData.move.value();
+    atBeginning = (xpos <= -q->minXExtent());
+    atEnd = (maxxextent <= xpos);
+
+    if (atBeginning != hData.atBeginning) {
+        hData.atBeginning = atBeginning;
+        atBoundaryChange = true;
+    }
+    if (atEnd != hData.atEnd) {
+        hData.atEnd = atEnd;
+        atBoundaryChange = true;
+    }
+
+    if (atBoundaryChange)
+        emit q->isAtBoundaryChanged();
+
+    if (visibleArea)
+        visibleArea->updateVisible();
+}
+
+QSGFlickable::QSGFlickable(QSGItem *parent)
+  : QSGItem(*(new QSGFlickablePrivate), parent)
+{
+    Q_D(QSGFlickable);
+    d->init();
+}
+
+QSGFlickable::QSGFlickable(QSGFlickablePrivate &dd, QSGItem *parent)
+  : QSGItem(dd, parent)
+{
+    Q_D(QSGFlickable);
+    d->init();
+}
+
+QSGFlickable::~QSGFlickable()
+{
+}
+
+qreal QSGFlickable::contentX() const
+{
+    Q_D(const QSGFlickable);
+    return -d->contentItem->x();
+}
+
+void QSGFlickable::setContentX(qreal pos)
+{
+    Q_D(QSGFlickable);
+    d->timeline.reset(d->hData.move);
+    d->vTime = d->timeline.time();
+    movementXEnding();
+    if (-pos != d->hData.move.value()) {
+        d->hData.move.setValue(-pos);
+        viewportMoved();
+    }
+}
+
+qreal QSGFlickable::contentY() const
+{
+    Q_D(const QSGFlickable);
+    return -d->contentItem->y();
+}
+
+void QSGFlickable::setContentY(qreal pos)
+{
+    Q_D(QSGFlickable);
+    d->timeline.reset(d->vData.move);
+    d->vTime = d->timeline.time();
+    movementYEnding();
+    if (-pos != d->vData.move.value()) {
+        d->vData.move.setValue(-pos);
+        viewportMoved();
+    }
+}
+
+bool QSGFlickable::isInteractive() const
+{
+    Q_D(const QSGFlickable);
+    return d->interactive;
+}
+
+void QSGFlickable::setInteractive(bool interactive)
+{
+    Q_D(QSGFlickable);
+    if (interactive != d->interactive) {
+        d->interactive = interactive;
+        if (!interactive && (d->flickingHorizontally || d->flickingVertically)) {
+            d->timeline.clear();
+            d->vTime = d->timeline.time();
+            d->flickingHorizontally = false;
+            d->flickingVertically = false;
+            emit flickingChanged();
+            emit flickingHorizontallyChanged();
+            emit flickingVerticallyChanged();
+            emit flickEnded();
+        }
+        emit interactiveChanged();
+    }
+}
+
+qreal QSGFlickable::horizontalVelocity() const
+{
+    Q_D(const QSGFlickable);
+    return d->hData.smoothVelocity.value();
+}
+
+qreal QSGFlickable::verticalVelocity() const
+{
+    Q_D(const QSGFlickable);
+    return d->vData.smoothVelocity.value();
+}
+
+bool QSGFlickable::isAtXEnd() const
+{
+    Q_D(const QSGFlickable);
+    return d->hData.atEnd;
+}
+
+bool QSGFlickable::isAtXBeginning() const
+{
+    Q_D(const QSGFlickable);
+    return d->hData.atBeginning;
+}
+
+bool QSGFlickable::isAtYEnd() const
+{
+    Q_D(const QSGFlickable);
+    return d->vData.atEnd;
+}
+
+bool QSGFlickable::isAtYBeginning() const
+{
+    Q_D(const QSGFlickable);
+    return d->vData.atBeginning;
+}
+
+void QSGFlickable::ticked()
+{
+    viewportMoved();
+}
+
+QSGItem *QSGFlickable::contentItem()
+{
+    Q_D(QSGFlickable);
+    return d->contentItem;
+}
+
+QSGFlickableVisibleArea *QSGFlickable::visibleArea()
+{
+    Q_D(QSGFlickable);
+    if (!d->visibleArea)
+        d->visibleArea = new QSGFlickableVisibleArea(this);
+    return d->visibleArea;
+}
+
+QSGFlickable::FlickableDirection QSGFlickable::flickableDirection() const
+{
+    Q_D(const QSGFlickable);
+    return d->flickableDirection;
+}
+
+void QSGFlickable::setFlickableDirection(FlickableDirection direction)
+{
+    Q_D(QSGFlickable);
+    if (direction != d->flickableDirection) {
+        d->flickableDirection = direction;
+        emit flickableDirectionChanged();
+    }
+}
+
+void QSGFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGFlickable);
+    if (interactive && timeline.isActive()
+        && (qAbs(hData.smoothVelocity.value()) > RetainGrabVelocity
+            || qAbs(vData.smoothVelocity.value()) > RetainGrabVelocity)) {
+        stealMouse = true; // If we've been flicked then steal the click.
+    } else {
+        stealMouse = false;
+    }
+    q->setKeepMouseGrab(stealMouse);
+    pressed = true;
+    timeline.clear();
+    hData.velocity = 0;
+    vData.velocity = 0;
+    hData.dragStartOffset = 0;
+    vData.dragStartOffset = 0;
+    hData.dragMinBound = q->minXExtent();
+    vData.dragMinBound = q->minYExtent();
+    hData.dragMaxBound = q->maxXExtent();
+    vData.dragMaxBound = q->maxYExtent();
+    hData.fixingUp = false;
+    vData.fixingUp = false;
+    lastPos = QPoint();
+    QSGItemPrivate::start(lastPosTime);
+    pressPos = event->pos();
+    hData.pressPos = hData.move.value();
+    vData.pressPos = vData.move.value();
+    flickingHorizontally = false;
+    flickingVertically = false;
+    QSGItemPrivate::start(pressTime);
+    QSGItemPrivate::start(velocityTime);
+}
+
+void QSGFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGFlickable);
+    if (!interactive || !lastPosTime.isValid())
+        return;
+    bool rejectY = false;
+    bool rejectX = false;
+
+    bool stealY = stealMouse;
+    bool stealX = stealMouse;
+
+    if (q->yflick()) {
+        int dy = int(event->pos().y() - pressPos.y());
+        if (qAbs(dy) > QApplication::startDragDistance() || QSGItemPrivate::elapsed(pressTime) > 200) {
+            if (!vMoved)
+                vData.dragStartOffset = dy;
+            qreal newY = dy + vData.pressPos - vData.dragStartOffset;
+            const qreal minY = vData.dragMinBound;
+            const qreal maxY = vData.dragMaxBound;
+            if (newY > minY)
+                newY = minY + (newY - minY) / 2;
+            if (newY < maxY && maxY - minY <= 0)
+                newY = maxY + (newY - maxY) / 2;
+            if (boundsBehavior == QSGFlickable::StopAtBounds && (newY > minY || newY < maxY)) {
+                rejectY = true;
+                if (newY < maxY) {
+                    newY = maxY;
+                    rejectY = false;
+                }
+                if (newY > minY) {
+                    newY = minY;
+                    rejectY = false;
+                }
+            }
+            if (!rejectY && stealMouse) {
+                vData.move.setValue(qRound(newY));
+                vMoved = true;
+            }
+            if (qAbs(dy) > QApplication::startDragDistance())
+                stealY = true;
+        }
+    }
+
+    if (q->xflick()) {
+        int dx = int(event->pos().x() - pressPos.x());
+        if (qAbs(dx) > QApplication::startDragDistance() || QSGItemPrivate::elapsed(pressTime) > 200) {
+            if (!hMoved)
+                hData.dragStartOffset = dx;
+            qreal newX = dx + hData.pressPos - hData.dragStartOffset;
+            const qreal minX = hData.dragMinBound;
+            const qreal maxX = hData.dragMaxBound;
+            if (newX > minX)
+                newX = minX + (newX - minX) / 2;
+            if (newX < maxX && maxX - minX <= 0)
+                newX = maxX + (newX - maxX) / 2;
+            if (boundsBehavior == QSGFlickable::StopAtBounds && (newX > minX || newX < maxX)) {
+                rejectX = true;
+                if (newX < maxX) {
+                    newX = maxX;
+                    rejectX = false;
+                }
+                if (newX > minX) {
+                    newX = minX;
+                    rejectX = false;
+                }
+            }
+            if (!rejectX && stealMouse) {
+                hData.move.setValue(qRound(newX));
+                hMoved = true;
+            }
+
+            if (qAbs(dx) > QApplication::startDragDistance())
+                stealX = true;
+        }
+    }
+
+    stealMouse = stealX || stealY;
+    if (stealMouse)
+        q->setKeepMouseGrab(true);
+
+    if (!lastPos.isNull()) {
+        qreal elapsed = qreal(QSGItemPrivate::restart(lastPosTime)) / 1000.;
+        if (elapsed <= 0)
+            elapsed = 1;
+        if (q->yflick()) {
+            qreal diff = event->pos().y() - lastPos.y();
+            // average to reduce the effect of spurious moves
+            vData.velocity += diff / elapsed;
+            vData.velocity /= 2;
+        }
+
+        if (q->xflick()) {
+            qreal diff = event->pos().x() - lastPos.x();
+            // average to reduce the effect of spurious moves
+            hData.velocity += diff / elapsed;
+            hData.velocity /= 2;
+        }
+    }
+
+    if (rejectY) vData.velocity = 0;
+    if (rejectX) hData.velocity = 0;
+
+    if (hMoved || vMoved) {
+        q->movementStarting();
+        q->viewportMoved();
+    }
+
+    lastPos = event->pos();
+}
+
+void QSGFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGFlickable);
+    stealMouse = false;
+    q->setKeepMouseGrab(false);
+    pressed = false;
+    if (!lastPosTime.isValid())
+        return;
+
+    if (QSGItemPrivate::elapsed(lastPosTime) > 100) {
+        // if we drag then pause before release we should not cause a flick.
+        hData.velocity = 0.0;
+        vData.velocity = 0.0;
+    }
+
+    vTime = timeline.time();
+    if (qAbs(vData.velocity) > MinimumFlickVelocity && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold)
+        flickY(vData.velocity);
+    else
+        fixupY();
+
+    if (qAbs(hData.velocity) > MinimumFlickVelocity && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold)
+        flickX(hData.velocity);
+    else
+        fixupX();
+
+    lastPosTime.invalidate();
+
+    if (!timeline.isActive())
+        q->movementEnding();
+}
+
+void QSGFlickable::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGFlickable);
+    if (d->interactive) {
+        if (!d->pressed)
+            d->handleMousePressEvent(event);
+        event->accept();
+    } else {
+        QSGItem::mousePressEvent(event);
+    }
+}
+
+void QSGFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGFlickable);
+    if (d->interactive) {
+        d->handleMouseMoveEvent(event);
+        event->accept();
+    } else {
+        QSGItem::mouseMoveEvent(event);
+    }
+}
+
+void QSGFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGFlickable);
+    if (d->interactive) {
+        d->clearDelayedPress();
+        d->handleMouseReleaseEvent(event);
+        event->accept();
+        ungrabMouse();
+    } else {
+        QSGItem::mouseReleaseEvent(event);
+    }
+}
+
+void QSGFlickable::wheelEvent(QGraphicsSceneWheelEvent *event)
+{
+    Q_D(QSGFlickable);
+    if (!d->interactive) {
+        QSGItem::wheelEvent(event);
+    } else if (yflick() && event->orientation() == Qt::Vertical) {
+        if (event->delta() > 0)
+            d->vData.velocity = qMax(event->delta() - d->vData.smoothVelocity.value(), qreal(250.0));
+        else
+            d->vData.velocity = qMin(event->delta() - d->vData.smoothVelocity.value(), qreal(-250.0));
+        d->flickingVertically = false;
+        d->flickY(d->vData.velocity);
+        if (d->flickingVertically) {
+            d->vMoved = true;
+            movementStarting();
+        }
+        event->accept();
+    } else if (xflick() && event->orientation() == Qt::Horizontal) {
+        if (event->delta() > 0)
+            d->hData.velocity = qMax(event->delta() - d->hData.smoothVelocity.value(), qreal(250.0));
+        else
+            d->hData.velocity = qMin(event->delta() - d->hData.smoothVelocity.value(), qreal(-250.0));
+        d->flickingHorizontally = false;
+        d->flickX(d->hData.velocity);
+        if (d->flickingHorizontally) {
+            d->hMoved = true;
+            movementStarting();
+        }
+        event->accept();
+    } else {
+        QSGItem::wheelEvent(event);
+    }
+}
+
+bool QSGFlickablePrivate::isOutermostPressDelay() const
+{
+    Q_Q(const QSGFlickable);
+    QSGItem *item = q->parentItem();
+    while (item) {
+        QSGFlickable *flick = qobject_cast<QSGFlickable*>(item);
+        if (flick && flick->pressDelay() > 0 && flick->isInteractive())
+            return false;
+        item = item->parentItem();
+    }
+
+    return true;
+}
+
+void QSGFlickablePrivate::captureDelayedPress(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGFlickable);
+    if (!q->canvas() || pressDelay <= 0)
+        return;
+    if (!isOutermostPressDelay())
+        return;
+    delayedPressTarget = q->canvas()->mouseGrabberItem();
+    delayedPressEvent = new QGraphicsSceneMouseEvent(event->type());
+    delayedPressEvent->setAccepted(false);
+    for (int i = 0x1; i <= 0x10; i <<= 1) {
+        if (event->buttons() & i) {
+            Qt::MouseButton button = Qt::MouseButton(i);
+            delayedPressEvent->setButtonDownPos(button, event->buttonDownPos(button));
+            delayedPressEvent->setButtonDownScenePos(button, event->buttonDownScenePos(button));
+            delayedPressEvent->setButtonDownScreenPos(button, event->buttonDownScreenPos(button));
+        }
+    }
+    delayedPressEvent->setButtons(event->buttons());
+    delayedPressEvent->setButton(event->button());
+    delayedPressEvent->setPos(event->pos());
+    delayedPressEvent->setScenePos(event->scenePos());
+    delayedPressEvent->setScreenPos(event->screenPos());
+    delayedPressEvent->setLastPos(event->lastPos());
+    delayedPressEvent->setLastScenePos(event->lastScenePos());
+    delayedPressEvent->setLastScreenPos(event->lastScreenPos());
+    delayedPressEvent->setModifiers(event->modifiers());
+    delayedPressTimer.start(pressDelay, q);
+}
+
+void QSGFlickablePrivate::clearDelayedPress()
+{
+    if (delayedPressEvent) {
+        delayedPressTimer.stop();
+        delete delayedPressEvent;
+        delayedPressEvent = 0;
+    }
+}
+
+void QSGFlickablePrivate::setRoundedViewportX(qreal x)
+{
+    contentItem->setX(qRound(x));
+}
+
+void QSGFlickablePrivate::setRoundedViewportY(qreal y)
+{
+    contentItem->setY(qRound(y));
+}
+
+void QSGFlickable::timerEvent(QTimerEvent *event)
+{
+    Q_D(QSGFlickable);
+    if (event->timerId() == d->delayedPressTimer.timerId()) {
+        d->delayedPressTimer.stop();
+        if (d->delayedPressEvent) {
+            QSGItem *grabber = canvas() ? canvas()->mouseGrabberItem() : 0;
+            if (!grabber || grabber != this) {
+                // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay)
+                // so we reset the grabber
+                if (canvas()->mouseGrabberItem() == d->delayedPressTarget)
+                    d->delayedPressTarget->ungrabMouse();
+                // Use the event handler that will take care of finding the proper item to propagate the event
+                QSGCanvasPrivate::get(canvas())->deliverMouseEvent(d->delayedPressEvent);
+            }
+            delete d->delayedPressEvent;
+            d->delayedPressEvent = 0;
+        }
+    }
+}
+
+qreal QSGFlickable::minYExtent() const
+{
+    return 0.0;
+}
+
+qreal QSGFlickable::minXExtent() const
+{
+    return 0.0;
+}
+
+/* returns -ve */
+qreal QSGFlickable::maxXExtent() const
+{
+    return width() - vWidth();
+}
+/* returns -ve */
+qreal QSGFlickable::maxYExtent() const
+{
+    return height() - vHeight();
+}
+
+void QSGFlickable::viewportMoved()
+{
+    Q_D(QSGFlickable);
+
+    qreal prevX = d->lastFlickablePosition.x();
+    qreal prevY = d->lastFlickablePosition.y();
+    d->velocityTimeline.clear();
+    if (d->pressed || d->calcVelocity) {
+        int elapsed = QSGItemPrivate::restart(d->velocityTime);
+        if (elapsed > 0) {
+            qreal horizontalVelocity = (prevX - d->hData.move.value()) * 1000 / elapsed;
+            qreal verticalVelocity = (prevY - d->vData.move.value()) * 1000 / elapsed;
+            d->velocityTimeline.move(d->hData.smoothVelocity, horizontalVelocity, d->reportedVelocitySmoothing);
+            d->velocityTimeline.move(d->hData.smoothVelocity, 0, d->reportedVelocitySmoothing);
+            d->velocityTimeline.move(d->vData.smoothVelocity, verticalVelocity, d->reportedVelocitySmoothing);
+            d->velocityTimeline.move(d->vData.smoothVelocity, 0, d->reportedVelocitySmoothing);
+        }
+    } else {
+        if (d->timeline.time() > d->vTime) {
+            qreal horizontalVelocity = (prevX - d->hData.move.value()) * 1000 / (d->timeline.time() - d->vTime);
+            qreal verticalVelocity = (prevY - d->vData.move.value()) * 1000 / (d->timeline.time() - d->vTime);
+            d->hData.smoothVelocity.setValue(horizontalVelocity);
+            d->vData.smoothVelocity.setValue(verticalVelocity);
+        }
+    }
+
+    d->lastFlickablePosition = QPointF(d->hData.move.value(), d->vData.move.value());
+
+    d->vTime = d->timeline.time();
+    d->updateBeginningEnd();
+}
+
+void QSGFlickable::geometryChanged(const QRectF &newGeometry,
+                             const QRectF &oldGeometry)
+{
+    Q_D(QSGFlickable);
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+
+    bool changed = false;
+    if (newGeometry.width() != oldGeometry.width()) {
+        if (xflick())
+            changed = true;
+        if (d->hData.viewSize < 0) {
+            d->contentItem->setWidth(width());
+            emit contentWidthChanged();
+        }
+        // Make sure that we're entirely in view.
+        if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+            d->fixupMode = QSGFlickablePrivate::Immediate;
+            d->fixupX();
+        }
+    }
+    if (newGeometry.height() != oldGeometry.height()) {
+        if (yflick())
+            changed = true;
+        if (d->vData.viewSize < 0) {
+            d->contentItem->setHeight(height());
+            emit contentHeightChanged();
+        }
+        // Make sure that we're entirely in view.
+        if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+            d->fixupMode = QSGFlickablePrivate::Immediate;
+            d->fixupY();
+        }
+    }
+
+    if (changed)
+        d->updateBeginningEnd();
+}
+
+void QSGFlickable::cancelFlick()
+{
+    Q_D(QSGFlickable);
+    d->timeline.reset(d->hData.move);
+    d->timeline.reset(d->vData.move);
+    movementEnding();
+}
+
+void QSGFlickablePrivate::data_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
+{
+    QSGItem *i = qobject_cast<QSGItem *>(o);
+    if (i) {
+        i->setParentItem(static_cast<QSGFlickablePrivate*>(prop->data)->contentItem);
+    } else {
+        o->setParent(prop->object); // XXX todo - do we want this?
+    }
+}
+
+int QSGFlickablePrivate::data_count(QDeclarativeListProperty<QObject> *)
+{
+    // XXX todo
+    return 0;
+}
+
+QObject *QSGFlickablePrivate::data_at(QDeclarativeListProperty<QObject> *, int)
+{
+    // XXX todo
+    return 0;
+}
+
+void QSGFlickablePrivate::data_clear(QDeclarativeListProperty<QObject> *)
+{
+    // XXX todo
+}
+
+QDeclarativeListProperty<QObject> QSGFlickable::flickableData()
+{
+    Q_D(QSGFlickable);
+    return QDeclarativeListProperty<QObject>(this, (void *)d, QSGFlickablePrivate::data_append,
+                                             QSGFlickablePrivate::data_count,
+                                             QSGFlickablePrivate::data_at,
+                                             QSGFlickablePrivate::data_clear);
+}
+
+QDeclarativeListProperty<QSGItem> QSGFlickable::flickableChildren()
+{
+    Q_D(QSGFlickable);
+    return QSGItemPrivate::get(d->contentItem)->children();
+}
+
+QSGFlickable::BoundsBehavior QSGFlickable::boundsBehavior() const
+{
+    Q_D(const QSGFlickable);
+    return d->boundsBehavior;
+}
+
+void QSGFlickable::setBoundsBehavior(BoundsBehavior b)
+{
+    Q_D(QSGFlickable);
+    if (b == d->boundsBehavior)
+        return;
+    d->boundsBehavior = b;
+    emit boundsBehaviorChanged();
+}
+
+qreal QSGFlickable::contentWidth() const
+{
+    Q_D(const QSGFlickable);
+    return d->hData.viewSize;
+}
+
+void QSGFlickable::setContentWidth(qreal w)
+{
+    Q_D(QSGFlickable);
+    if (d->hData.viewSize == w)
+        return;
+    d->hData.viewSize = w;
+    if (w < 0)
+        d->contentItem->setWidth(width());
+    else
+        d->contentItem->setWidth(w);
+    // Make sure that we're entirely in view.
+    if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+        d->fixupMode = QSGFlickablePrivate::Immediate;
+        d->fixupX();
+    } else if (!d->pressed && d->hData.fixingUp) {
+        d->fixupMode = QSGFlickablePrivate::ExtentChanged;
+        d->fixupX();
+    }
+    emit contentWidthChanged();
+    d->updateBeginningEnd();
+}
+
+qreal QSGFlickable::contentHeight() const
+{
+    Q_D(const QSGFlickable);
+    return d->vData.viewSize;
+}
+
+void QSGFlickable::setContentHeight(qreal h)
+{
+    Q_D(QSGFlickable);
+    if (d->vData.viewSize == h)
+        return;
+    d->vData.viewSize = h;
+    if (h < 0)
+        d->contentItem->setHeight(height());
+    else
+        d->contentItem->setHeight(h);
+    // Make sure that we're entirely in view.
+    if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+        d->fixupMode = QSGFlickablePrivate::Immediate;
+        d->fixupY();
+    } else if (!d->pressed && d->vData.fixingUp) {
+        d->fixupMode = QSGFlickablePrivate::ExtentChanged;
+        d->fixupY();
+    }
+    emit contentHeightChanged();
+    d->updateBeginningEnd();
+}
+
+void QSGFlickable::resizeContent(qreal w, qreal h, QPointF center)
+{
+    Q_D(QSGFlickable);
+    if (w != d->hData.viewSize) {
+        qreal oldSize = d->hData.viewSize;
+        setContentWidth(w);
+        if (center.x() != 0) {
+            qreal pos = center.x() * w / oldSize;
+            setContentX(contentX() + pos - center.x());
+        }
+    }
+    if (h != d->vData.viewSize) {
+        qreal oldSize = d->vData.viewSize;
+        setContentHeight(h);
+        if (center.y() != 0) {
+            qreal pos = center.y() * h / oldSize;
+            setContentY(contentY() + pos - center.y());
+        }
+    }
+}
+
+void QSGFlickable::returnToBounds()
+{
+    Q_D(QSGFlickable);
+    d->fixupX();
+    d->fixupY();
+}
+
+qreal QSGFlickable::vWidth() const
+{
+    Q_D(const QSGFlickable);
+    if (d->hData.viewSize < 0)
+        return width();
+    else
+        return d->hData.viewSize;
+}
+
+qreal QSGFlickable::vHeight() const
+{
+    Q_D(const QSGFlickable);
+    if (d->vData.viewSize < 0)
+        return height();
+    else
+        return d->vData.viewSize;
+}
+
+bool QSGFlickable::xflick() const
+{
+    Q_D(const QSGFlickable);
+    if (d->flickableDirection == QSGFlickable::AutoFlickDirection)
+        return vWidth() != width();
+    return d->flickableDirection & QSGFlickable::HorizontalFlick;
+}
+
+bool QSGFlickable::yflick() const
+{
+    Q_D(const QSGFlickable);
+    if (d->flickableDirection == QSGFlickable::AutoFlickDirection)
+        return vHeight() !=  height();
+    return d->flickableDirection & QSGFlickable::VerticalFlick;
+}
+
+void QSGFlickable::mouseUngrabEvent()
+{
+    Q_D(QSGFlickable);
+    if (d->pressed) {
+        // if our mouse grab has been removed (probably by another Flickable),
+        // fix our state
+        d->pressed = false;
+        d->stealMouse = false;
+        setKeepMouseGrab(false);
+    }
+}
+
+bool QSGFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGFlickable);
+    QGraphicsSceneMouseEvent mouseEvent(event->type());
+    QRectF myRect = mapRectToScene(QRectF(0, 0, width(), height()));
+
+    QSGCanvas *c = canvas();
+    QSGItem *grabber = c ? c->mouseGrabberItem() : 0;
+    bool stealThisEvent = d->stealMouse;
+    if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+        mouseEvent.setAccepted(false);
+        for (int i = 0x1; i <= 0x10; i <<= 1) {
+            if (event->buttons() & i) {
+                Qt::MouseButton button = Qt::MouseButton(i);
+                mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+            }
+        }
+        mouseEvent.setScenePos(event->scenePos());
+        mouseEvent.setLastScenePos(event->lastScenePos());
+        mouseEvent.setPos(mapFromScene(event->scenePos()));
+        mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+        switch(mouseEvent.type()) {
+        case QEvent::GraphicsSceneMouseMove:
+            d->handleMouseMoveEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMousePress:
+            if (d->pressed) // we are already pressed - this is a delayed replay
+                return false;
+
+            d->handleMousePressEvent(&mouseEvent);
+            d->captureDelayedPress(event);
+            stealThisEvent = d->stealMouse;   // Update stealThisEvent in case changed by function call above
+            break;
+        case QEvent::GraphicsSceneMouseRelease:
+            if (d->delayedPressEvent) {
+                // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay)
+                // so we reset the grabber
+                if (c->mouseGrabberItem() == d->delayedPressTarget)
+                    d->delayedPressTarget->ungrabMouse();
+                //Use the event handler that will take care of finding the proper item to propagate the event
+                QSGCanvasPrivate::get(canvas())->deliverMouseEvent(d->delayedPressEvent);
+                d->clearDelayedPress();
+                // We send the release
+                canvas()->sendEvent(c->mouseGrabberItem(), event);
+                // And the event has been consumed
+                d->stealMouse = false;
+                d->pressed = false;
+                return true;
+            }
+            d->handleMouseReleaseEvent(&mouseEvent);
+            break;
+        default:
+            break;
+        }
+        grabber = qobject_cast<QSGItem*>(c->mouseGrabberItem());
+        if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) {
+            d->clearDelayedPress();
+            grabMouse();
+        }
+
+        return stealThisEvent || d->delayedPressEvent;
+    } else if (d->lastPosTime.isValid()) {
+        d->lastPosTime.invalidate();
+    }
+    if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
+        d->clearDelayedPress();
+        d->stealMouse = false;
+        d->pressed = false;
+    }
+    return false;
+}
+
+
+bool QSGFlickable::childMouseEventFilter(QSGItem *i, QEvent *e)
+{
+    Q_D(QSGFlickable);
+    if (!isVisible() || !d->interactive)
+        return QSGItem::childMouseEventFilter(i, e);
+    switch (e->type()) {
+    case QEvent::GraphicsSceneMousePress:
+    case QEvent::GraphicsSceneMouseMove:
+    case QEvent::GraphicsSceneMouseRelease:
+        return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
+    default:
+        break;
+    }
+
+    return QSGItem::childMouseEventFilter(i, e);
+}
+
+qreal QSGFlickable::maximumFlickVelocity() const
+{
+    Q_D(const QSGFlickable);
+    return d->maxVelocity;
+}
+
+void QSGFlickable::setMaximumFlickVelocity(qreal v)
+{
+    Q_D(QSGFlickable);
+    if (v == d->maxVelocity)
+        return;
+    d->maxVelocity = v;
+    emit maximumFlickVelocityChanged();
+}
+
+qreal QSGFlickable::flickDeceleration() const
+{
+    Q_D(const QSGFlickable);
+    return d->deceleration;
+}
+
+void QSGFlickable::setFlickDeceleration(qreal deceleration)
+{
+    Q_D(QSGFlickable);
+    if (deceleration == d->deceleration)
+        return;
+    d->deceleration = deceleration;
+    emit flickDecelerationChanged();
+}
+
+bool QSGFlickable::isFlicking() const
+{
+    Q_D(const QSGFlickable);
+    return d->flickingHorizontally ||  d->flickingVertically;
+}
+
+bool QSGFlickable::isFlickingHorizontally() const
+{
+    Q_D(const QSGFlickable);
+    return d->flickingHorizontally;
+}
+
+bool QSGFlickable::isFlickingVertically() const
+{
+    Q_D(const QSGFlickable);
+    return d->flickingVertically;
+}
+
+int QSGFlickable::pressDelay() const
+{
+    Q_D(const QSGFlickable);
+    return d->pressDelay;
+}
+
+void QSGFlickable::setPressDelay(int delay)
+{
+    Q_D(QSGFlickable);
+    if (d->pressDelay == delay)
+        return;
+    d->pressDelay = delay;
+    emit pressDelayChanged();
+}
+
+
+bool QSGFlickable::isMoving() const
+{
+    Q_D(const QSGFlickable);
+    return d->movingHorizontally || d->movingVertically;
+}
+
+bool QSGFlickable::isMovingHorizontally() const
+{
+    Q_D(const QSGFlickable);
+    return d->movingHorizontally;
+}
+
+bool QSGFlickable::isMovingVertically() const
+{
+    Q_D(const QSGFlickable);
+    return d->movingVertically;
+}
+
+void QSGFlickable::movementStarting()
+{
+    Q_D(QSGFlickable);
+    if (d->hMoved && !d->movingHorizontally) {
+        d->movingHorizontally = true;
+        emit movingChanged();
+        emit movingHorizontallyChanged();
+        if (!d->movingVertically)
+            emit movementStarted();
+    }
+    else if (d->vMoved && !d->movingVertically) {
+        d->movingVertically = true;
+        emit movingChanged();
+        emit movingVerticallyChanged();
+        if (!d->movingHorizontally)
+            emit movementStarted();
+    }
+}
+
+void QSGFlickable::movementEnding()
+{
+    Q_D(QSGFlickable);
+    movementXEnding();
+    movementYEnding();
+    d->hData.smoothVelocity.setValue(0);
+    d->vData.smoothVelocity.setValue(0);
+}
+
+void QSGFlickable::movementXEnding()
+{
+    Q_D(QSGFlickable);
+    if (d->flickingHorizontally) {
+        d->flickingHorizontally = false;
+        emit flickingChanged();
+        emit flickingHorizontallyChanged();
+        if (!d->flickingVertically)
+           emit flickEnded();
+    }
+    if (!d->pressed && !d->stealMouse) {
+        if (d->movingHorizontally) {
+            d->movingHorizontally = false;
+            d->hMoved = false;
+            emit movingChanged();
+            emit movingHorizontallyChanged();
+            if (!d->movingVertically)
+                emit movementEnded();
+        }
+    }
+    d->hData.fixingUp = false;
+}
+
+void QSGFlickable::movementYEnding()
+{
+    Q_D(QSGFlickable);
+    if (d->flickingVertically) {
+        d->flickingVertically = false;
+        emit flickingChanged();
+        emit flickingVerticallyChanged();
+        if (!d->flickingHorizontally)
+           emit flickEnded();
+    }
+    if (!d->pressed && !d->stealMouse) {
+        if (d->movingVertically) {
+            d->movingVertically = false;
+            d->vMoved = false;
+            emit movingChanged();
+            emit movingVerticallyChanged();
+            if (!d->movingHorizontally)
+                emit movementEnded();
+        }
+    }
+    d->vData.fixingUp = false;
+}
+
+void QSGFlickablePrivate::updateVelocity()
+{
+    Q_Q(QSGFlickable);
+    emit q->horizontalVelocityChanged();
+    emit q->verticalVelocityChanged();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgflickable_p.h b/src/declarative/items/qsgflickable_p.h
new file mode 100644
index 0000000000..c1ed024527
--- /dev/null
+++ b/src/declarative/items/qsgflickable_p.h
@@ -0,0 +1,230 @@
+// Commit: 1bcddaaf318fc37c71c5191913f3487c49444ec6
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGFLICKABLE_P_H
+#define QSGFLICKABLE_P_H
+
+#include "qsgitem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGFlickablePrivate;
+class QSGFlickableVisibleArea;
+class Q_AUTOTEST_EXPORT QSGFlickable : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged)
+    Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged)
+    Q_PROPERTY(qreal contentX READ contentX WRITE setContentX NOTIFY contentXChanged)
+    Q_PROPERTY(qreal contentY READ contentY WRITE setContentY NOTIFY contentYChanged)
+    Q_PROPERTY(QSGItem *contentItem READ contentItem CONSTANT)
+
+    Q_PROPERTY(qreal horizontalVelocity READ horizontalVelocity NOTIFY horizontalVelocityChanged)
+    Q_PROPERTY(qreal verticalVelocity READ verticalVelocity NOTIFY verticalVelocityChanged)
+
+    Q_PROPERTY(BoundsBehavior boundsBehavior READ boundsBehavior WRITE setBoundsBehavior NOTIFY boundsBehaviorChanged)
+    Q_PROPERTY(qreal maximumFlickVelocity READ maximumFlickVelocity WRITE setMaximumFlickVelocity NOTIFY maximumFlickVelocityChanged)
+    Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
+    Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
+    Q_PROPERTY(bool movingHorizontally READ isMovingHorizontally NOTIFY movingHorizontallyChanged)
+    Q_PROPERTY(bool movingVertically READ isMovingVertically NOTIFY movingVerticallyChanged)
+    Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
+    Q_PROPERTY(bool flickingHorizontally READ isFlickingHorizontally NOTIFY flickingHorizontallyChanged)
+    Q_PROPERTY(bool flickingVertically READ isFlickingVertically NOTIFY flickingVerticallyChanged)
+    Q_PROPERTY(FlickableDirection flickableDirection READ flickableDirection WRITE setFlickableDirection NOTIFY flickableDirectionChanged)
+
+    Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
+    Q_PROPERTY(int pressDelay READ pressDelay WRITE setPressDelay NOTIFY pressDelayChanged)
+
+    Q_PROPERTY(bool atXEnd READ isAtXEnd NOTIFY isAtBoundaryChanged)
+    Q_PROPERTY(bool atYEnd READ isAtYEnd NOTIFY isAtBoundaryChanged)
+    Q_PROPERTY(bool atXBeginning READ isAtXBeginning NOTIFY isAtBoundaryChanged)
+    Q_PROPERTY(bool atYBeginning READ isAtYBeginning NOTIFY isAtBoundaryChanged)
+
+    Q_PROPERTY(QSGFlickableVisibleArea *visibleArea READ visibleArea CONSTANT)
+
+    Q_PROPERTY(QDeclarativeListProperty<QObject> flickableData READ flickableData)
+    Q_PROPERTY(QDeclarativeListProperty<QSGItem> flickableChildren READ flickableChildren)
+    Q_CLASSINFO("DefaultProperty", "flickableData")
+
+    Q_ENUMS(FlickableDirection)
+    Q_ENUMS(BoundsBehavior)
+
+public:
+    QSGFlickable(QSGItem *parent=0);
+    ~QSGFlickable();
+
+    QDeclarativeListProperty<QObject> flickableData();
+    QDeclarativeListProperty<QSGItem> flickableChildren();
+
+    enum BoundsBehavior { StopAtBounds, DragOverBounds, DragAndOvershootBounds };
+    BoundsBehavior boundsBehavior() const;
+    void setBoundsBehavior(BoundsBehavior);
+
+    qreal contentWidth() const;
+    void setContentWidth(qreal);
+
+    qreal contentHeight() const;
+    void setContentHeight(qreal);
+
+    qreal contentX() const;
+    virtual void setContentX(qreal pos);
+
+    qreal contentY() const;
+    virtual void setContentY(qreal pos);
+
+    bool isMoving() const;
+    bool isMovingHorizontally() const;
+    bool isMovingVertically() const;
+    bool isFlicking() const;
+    bool isFlickingHorizontally() const;
+    bool isFlickingVertically() const;
+
+    int pressDelay() const;
+    void setPressDelay(int delay);
+
+    qreal maximumFlickVelocity() const;
+    void setMaximumFlickVelocity(qreal);
+
+    qreal flickDeceleration() const;
+    void setFlickDeceleration(qreal);
+
+    bool isInteractive() const;
+    void setInteractive(bool);
+
+    qreal horizontalVelocity() const;
+    qreal verticalVelocity() const;
+
+    bool isAtXEnd() const;
+    bool isAtXBeginning() const;
+    bool isAtYEnd() const;
+    bool isAtYBeginning() const;
+
+    QSGItem *contentItem();
+
+    enum FlickableDirection { AutoFlickDirection=0x00, HorizontalFlick=0x01, VerticalFlick=0x02, HorizontalAndVerticalFlick=0x03 };
+    FlickableDirection flickableDirection() const;
+    void setFlickableDirection(FlickableDirection);
+
+    Q_INVOKABLE void resizeContent(qreal w, qreal h, QPointF center);
+    Q_INVOKABLE void returnToBounds();
+
+Q_SIGNALS:
+    void contentWidthChanged();
+    void contentHeightChanged();
+    void contentXChanged();
+    void contentYChanged();
+    void movingChanged();
+    void movingHorizontallyChanged();
+    void movingVerticallyChanged();
+    void flickingChanged();
+    void flickingHorizontallyChanged();
+    void flickingVerticallyChanged();
+    void horizontalVelocityChanged();
+    void verticalVelocityChanged();
+    void isAtBoundaryChanged();
+    void flickableDirectionChanged();
+    void interactiveChanged();
+    void boundsBehaviorChanged();
+    void maximumFlickVelocityChanged();
+    void flickDecelerationChanged();
+    void pressDelayChanged();
+    void movementStarted();
+    void movementEnded();
+    void flickStarted();
+    void flickEnded();
+
+protected:
+    virtual bool childMouseEventFilter(QSGItem *, QEvent *);
+    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
+    virtual void timerEvent(QTimerEvent *event);
+
+    QSGFlickableVisibleArea *visibleArea();
+
+protected Q_SLOTS:
+    virtual void ticked();
+    void movementStarting();
+    void movementEnding();
+
+protected:
+    void movementXEnding();
+    void movementYEnding();
+    virtual qreal minXExtent() const;
+    virtual qreal minYExtent() const;
+    virtual qreal maxXExtent() const;
+    virtual qreal maxYExtent() const;
+    qreal vWidth() const;
+    qreal vHeight() const;
+    virtual void viewportMoved();
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+    void mouseUngrabEvent();
+    bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
+
+    bool xflick() const;
+    bool yflick() const;
+    void cancelFlick();
+
+protected:
+    QSGFlickable(QSGFlickablePrivate &dd, QSGItem *parent);
+
+private:
+    Q_DISABLE_COPY(QSGFlickable)
+    Q_DECLARE_PRIVATE(QSGFlickable)
+    friend class QSGFlickableVisibleArea;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGFlickable)
+
+QT_END_HEADER
+
+#endif // QSGFLICKABLE_P_H
diff --git a/src/declarative/items/qsgflickable_p_p.h b/src/declarative/items/qsgflickable_p_p.h
new file mode 100644
index 0000000000..2861bfd5b3
--- /dev/null
+++ b/src/declarative/items/qsgflickable_p_p.h
@@ -0,0 +1,231 @@
+// Commit: cb0a6844705802564c81b581f24a76c5d5adf6d1
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGFLICKABLE_P_P_H
+#define QSGFLICKABLE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgflickable_p.h"
+#include "qsgitem_p.h"
+#include "qsgitemchangelistener_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtCore/qdatetime.h>
+
+#include <private/qdeclarativetimeline_p_p.h>
+#include <private/qdeclarativeanimation_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// Really slow flicks can be annoying.
+const qreal MinimumFlickVelocity = 75.0;
+
+class QSGFlickableVisibleArea;
+class QSGFlickablePrivate : public QSGItemPrivate, public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGFlickable)
+
+public:
+    static inline QSGFlickablePrivate *get(QSGFlickable *o) { return o->d_func(); }
+
+    QSGFlickablePrivate();
+    void init();
+
+    struct Velocity : public QDeclarativeTimeLineValue
+    {
+        Velocity(QSGFlickablePrivate *p)
+            : parent(p) {}
+        virtual void setValue(qreal v) {
+            if (v != value()) {
+                QDeclarativeTimeLineValue::setValue(v);
+                parent->updateVelocity();
+            }
+        }
+        QSGFlickablePrivate *parent;
+    };
+
+    struct AxisData {
+        AxisData(QSGFlickablePrivate *fp, void (QSGFlickablePrivate::*func)(qreal))
+            : move(fp, func), viewSize(-1), smoothVelocity(fp), atEnd(false), atBeginning(true)
+            , fixingUp(false)
+        {}
+
+        QDeclarativeTimeLineValueProxy<QSGFlickablePrivate> move;
+        qreal viewSize;
+        qreal pressPos;
+        qreal dragStartOffset;
+        qreal dragMinBound;
+        qreal dragMaxBound;
+        qreal velocity;
+        qreal flickTarget;
+        QSGFlickablePrivate::Velocity smoothVelocity;
+        bool atEnd : 1;
+        bool atBeginning : 1;
+        bool fixingUp : 1;
+    };
+
+    void flickX(qreal velocity);
+    void flickY(qreal velocity);
+    virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                        QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
+
+    void fixupX();
+    void fixupY();
+    virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
+
+    void updateBeginningEnd();
+
+    bool isOutermostPressDelay() const;
+    void captureDelayedPress(QGraphicsSceneMouseEvent *event);
+    void clearDelayedPress();
+
+    void setRoundedViewportX(qreal x);
+    void setRoundedViewportY(qreal y);
+
+    qreal overShootDistance(qreal velocity, qreal size);
+
+    void itemGeometryChanged(QSGItem *, const QRectF &, const QRectF &);
+
+public:
+    QSGItem *contentItem;
+
+    AxisData hData;
+    AxisData vData;
+
+    QDeclarativeTimeLine timeline;
+    bool flickingHorizontally : 1;
+    bool flickingVertically : 1;
+    bool hMoved : 1;
+    bool vMoved : 1;
+    bool movingHorizontally : 1;
+    bool movingVertically : 1;
+    bool stealMouse : 1;
+    bool pressed : 1;
+    bool interactive : 1;
+    bool calcVelocity : 1;
+    QElapsedTimer lastPosTime;
+    QPointF lastPos;
+    QPointF pressPos;
+    QElapsedTimer pressTime;
+    qreal deceleration;
+    qreal maxVelocity;
+    QElapsedTimer velocityTime;
+    QPointF lastFlickablePosition;
+    qreal reportedVelocitySmoothing;
+    QGraphicsSceneMouseEvent *delayedPressEvent;
+    QSGItem *delayedPressTarget;
+    QBasicTimer delayedPressTimer;
+    int pressDelay;
+    int fixupDuration;
+
+    enum FixupMode { Normal, Immediate, ExtentChanged };
+    FixupMode fixupMode;
+
+    static void fixupY_callback(void *);
+    static void fixupX_callback(void *);
+
+    void updateVelocity();
+    int vTime;
+    QDeclarativeTimeLine velocityTimeline;
+    QSGFlickableVisibleArea *visibleArea;
+    QSGFlickable::FlickableDirection flickableDirection;
+    QSGFlickable::BoundsBehavior boundsBehavior;
+
+    void handleMousePressEvent(QGraphicsSceneMouseEvent *);
+    void handleMouseMoveEvent(QGraphicsSceneMouseEvent *);
+    void handleMouseReleaseEvent(QGraphicsSceneMouseEvent *);
+
+    // flickableData property
+    static void data_append(QDeclarativeListProperty<QObject> *, QObject *);
+    static int data_count(QDeclarativeListProperty<QObject> *);
+    static QObject *data_at(QDeclarativeListProperty<QObject> *, int);
+    static void data_clear(QDeclarativeListProperty<QObject> *);
+};
+
+class QSGFlickableVisibleArea : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal xPosition READ xPosition NOTIFY xPositionChanged)
+    Q_PROPERTY(qreal yPosition READ yPosition NOTIFY yPositionChanged)
+    Q_PROPERTY(qreal widthRatio READ widthRatio NOTIFY widthRatioChanged)
+    Q_PROPERTY(qreal heightRatio READ heightRatio NOTIFY heightRatioChanged)
+
+public:
+    QSGFlickableVisibleArea(QSGFlickable *parent=0);
+
+    qreal xPosition() const;
+    qreal widthRatio() const;
+    qreal yPosition() const;
+    qreal heightRatio() const;
+
+    void updateVisible();
+
+signals:
+    void xPositionChanged(qreal xPosition);
+    void yPositionChanged(qreal yPosition);
+    void widthRatioChanged(qreal widthRatio);
+    void heightRatioChanged(qreal heightRatio);
+
+private:
+    QSGFlickable *flickable;
+    qreal m_xPosition;
+    qreal m_widthRatio;
+    qreal m_yPosition;
+    qreal m_heightRatio;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGFlickableVisibleArea)
+
+#endif // QSGFLICKABLE_P_P_H
diff --git a/src/declarative/items/qsgflipable.cpp b/src/declarative/items/qsgflipable.cpp
new file mode 100644
index 0000000000..a856d6360b
--- /dev/null
+++ b/src/declarative/items/qsgflipable.cpp
@@ -0,0 +1,255 @@
+// Commit: caee66da925949cf7aef2ff8e1a86c38dd6e6efd
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgflipable_p.h"
+#include "qsgitem_p.h"
+
+#include <private/qdeclarativeguard_p.h>
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+
+QT_BEGIN_NAMESPACE
+
+// XXX todo - i think this needs work and a bit of a re-think
+
+class QSGLocalTransform : public QSGTransform
+{
+    Q_OBJECT
+public:
+    QSGLocalTransform(QObject *parent) : QSGTransform(parent) {}
+
+    void setTransform(const QTransform &t) {
+        transform = t;
+        update();
+    }
+    virtual void applyTo(QMatrix4x4 *matrix) const {
+        *matrix *= transform;
+    }
+private:
+    QTransform transform;
+};
+
+class QSGFlipablePrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGFlipable)
+public:
+    QSGFlipablePrivate() : current(QSGFlipable::Front), front(0), back(0), sideDirty(false) {}
+
+    virtual void transformChanged();
+    void updateSide();
+    void setBackTransform();
+
+    QSGFlipable::Side current;
+    QDeclarativeGuard<QSGLocalTransform> backTransform;
+    QDeclarativeGuard<QSGItem> front;
+    QDeclarativeGuard<QSGItem> back;
+
+    bool sideDirty;
+    bool wantBackXFlipped;
+    bool wantBackYFlipped;
+};
+
+QSGFlipable::QSGFlipable(QSGItem *parent)
+: QSGItem(*(new QSGFlipablePrivate), parent)
+{
+}
+
+QSGFlipable::~QSGFlipable()
+{
+}
+
+QSGItem *QSGFlipable::front()
+{
+    Q_D(const QSGFlipable);
+    return d->front;
+}
+
+void QSGFlipable::setFront(QSGItem *front)
+{
+    Q_D(QSGFlipable);
+    if (d->front) {
+        qmlInfo(this) << tr("front is a write-once property");
+        return;
+    }
+    d->front = front;
+    d->front->setParentItem(this);
+    if (Back == d->current)
+        d->front->setOpacity(0.);
+    emit frontChanged();
+}
+
+QSGItem *QSGFlipable::back()
+{
+    Q_D(const QSGFlipable);
+    return d->back;
+}
+
+void QSGFlipable::setBack(QSGItem *back)
+{
+    Q_D(QSGFlipable);
+    if (d->back) {
+        qmlInfo(this) << tr("back is a write-once property");
+        return;
+    }
+    if (back == 0)
+        return;
+    d->back = back;
+    d->back->setParentItem(this);
+
+    d->backTransform = new QSGLocalTransform(d->back);
+    d->backTransform->prependToItem(d->back);
+
+    if (Front == d->current)
+        d->back->setOpacity(0.);
+    connect(back, SIGNAL(widthChanged()),
+            this, SLOT(retransformBack()));
+    connect(back, SIGNAL(heightChanged()),
+            this, SLOT(retransformBack()));
+    emit backChanged();
+}
+
+void QSGFlipable::retransformBack()
+{
+    Q_D(QSGFlipable);
+    if (d->current == QSGFlipable::Back && d->back)
+        d->setBackTransform();
+}
+
+QSGFlipable::Side QSGFlipable::side() const
+{
+    Q_D(const QSGFlipable);
+
+    const_cast<QSGFlipablePrivate *>(d)->updateSide();
+    return d->current;
+}
+
+void QSGFlipablePrivate::transformChanged()
+{
+    Q_Q(QSGFlipable);
+
+    if (!sideDirty) {
+        sideDirty = true;
+        q->polish();
+    }
+
+    QSGItemPrivate::transformChanged();
+}
+
+void QSGFlipable::updatePolish()
+{
+    Q_D(QSGFlipable);
+    d->updateSide();
+}
+
+// determination on the currently visible side of the flipable
+// has to be done on the complete scene transform to give
+// correct results.
+void QSGFlipablePrivate::updateSide()
+{
+    Q_Q(QSGFlipable);
+
+    if (!sideDirty)
+        return;
+
+    sideDirty = false;
+
+    QTransform sceneTransform;
+    itemToParentTransform(sceneTransform);
+
+    QPointF p1(0, 0);
+    QPointF p2(1, 0);
+    QPointF p3(1, 1);
+
+    QPointF scenep1 = sceneTransform.map(p1);
+    QPointF scenep2 = sceneTransform.map(p2);
+    QPointF scenep3 = sceneTransform.map(p3);
+#if 0
+    p1 = q->mapToParent(p1);
+    p2 = q->mapToParent(p2);
+    p3 = q->mapToParent(p3);
+#endif
+
+    qreal cross = (scenep1.x() - scenep2.x()) * (scenep3.y() - scenep2.y()) -
+                  (scenep1.y() - scenep2.y()) * (scenep3.x() - scenep2.x());
+
+    wantBackYFlipped = scenep1.x() >= scenep2.x();
+    wantBackXFlipped = scenep2.y() >= scenep3.y();
+
+    QSGFlipable::Side newSide;
+    if (cross > 0) {
+        newSide = QSGFlipable::Back;
+    } else {
+        newSide = QSGFlipable::Front;
+    }
+
+    if (newSide != current) {
+        current = newSide;
+        if (current == QSGFlipable::Back && back)
+            setBackTransform();
+        if (front)
+            front->setOpacity((current==QSGFlipable::Front)?1.:0.);
+        if (back)
+            back->setOpacity((current==QSGFlipable::Back)?1.:0.);
+        emit q->sideChanged();
+    }
+}
+
+/* Depends on the width/height of the back item, and so needs reevaulating
+   if those change.
+*/
+void QSGFlipablePrivate::setBackTransform()
+{
+    QTransform mat;
+    mat.translate(back->width()/2,back->height()/2);
+    if (back->width() && wantBackYFlipped)
+        mat.rotate(180, Qt::YAxis);
+    if (back->height() && wantBackXFlipped)
+        mat.rotate(180, Qt::XAxis);
+    mat.translate(-back->width()/2,-back->height()/2);
+
+    if (backTransform)
+        backTransform->setTransform(mat);
+}
+
+QT_END_NAMESPACE
+
+#include "qsgflipable.moc"
diff --git a/src/declarative/items/qsgflipable_p.h b/src/declarative/items/qsgflipable_p.h
new file mode 100644
index 0000000000..02178adca8
--- /dev/null
+++ b/src/declarative/items/qsgflipable_p.h
@@ -0,0 +1,104 @@
+// Commit: ebd4bc73c46c2962742a682b6a391fb68c482aec
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGFLIPABLE_P_H
+#define QSGFLIPABLE_P_H
+
+#include "qsgitem.h"
+
+#include <QtGui/qtransform.h>
+#include <QtGui/qvector3d.h>
+#include <QtCore/qobject.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGFlipablePrivate;
+class Q_AUTOTEST_EXPORT QSGFlipable : public QSGItem
+{
+    Q_OBJECT
+
+    Q_ENUMS(Side)
+    Q_PROPERTY(QSGItem *front READ front WRITE setFront NOTIFY frontChanged)
+    Q_PROPERTY(QSGItem *back READ back WRITE setBack NOTIFY backChanged)
+    Q_PROPERTY(Side side READ side NOTIFY sideChanged)
+    //### flipAxis
+    //### flipRotation
+public:
+    QSGFlipable(QSGItem *parent=0);
+    ~QSGFlipable();
+
+    QSGItem *front();
+    void setFront(QSGItem *);
+
+    QSGItem *back();
+    void setBack(QSGItem *);
+
+    enum Side { Front, Back };
+    Side side() const;
+
+Q_SIGNALS:
+    void frontChanged();
+    void backChanged();
+    void sideChanged();
+
+protected:
+    virtual void updatePolish();
+
+private Q_SLOTS:
+    void retransformBack();
+
+private:
+    Q_DISABLE_COPY(QSGFlipable)
+    Q_DECLARE_PRIVATE(QSGFlipable)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGFlipable)
+
+QT_END_HEADER
+
+#endif // QSGFLIPABLE_P_H
diff --git a/src/declarative/items/qsgfocusscope.cpp b/src/declarative/items/qsgfocusscope.cpp
new file mode 100644
index 0000000000..84f19b1671
--- /dev/null
+++ b/src/declarative/items/qsgfocusscope.cpp
@@ -0,0 +1,57 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgfocusscope_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QSGFocusScope::QSGFocusScope(QSGItem *parent) 
+: QSGItem(parent)
+{
+    setFlag(ItemIsFocusScope);
+}
+
+QSGFocusScope::~QSGFocusScope()
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgfocusscope_p.h b/src/declarative/items/qsgfocusscope_p.h
new file mode 100644
index 0000000000..ceffd9f089
--- /dev/null
+++ b/src/declarative/items/qsgfocusscope_p.h
@@ -0,0 +1,68 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGFOCUSSCOPE_P_H
+#define QSGFOCUSSCOPE_P_H
+
+#include "qsgitem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QSGFocusScope : public QSGItem
+{
+    Q_OBJECT
+public:
+    QSGFocusScope(QSGItem *parent=0);
+    virtual ~QSGFocusScope();
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGFocusScope)
+
+QT_END_HEADER
+
+#endif // QSGFOCUSSCOPE_P_H
diff --git a/src/declarative/items/qsggridview.cpp b/src/declarative/items/qsggridview.cpp
new file mode 100644
index 0000000000..9beac05d72
--- /dev/null
+++ b/src/declarative/items/qsggridview.cpp
@@ -0,0 +1,2634 @@
+// Commit: cc6408ccd5453d1bed9f98b9caa14861cea5742b
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsggridview_p.h"
+#include "qsgvisualitemmodel_p.h"
+#include "qsgflickable_p_p.h"
+
+#include <private/qdeclarativesmoothedanimation_p_p.h>
+#include <private/qlistmodelinterface_p.h>
+
+#include <QtGui/qevent.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qcoreapplication.h>
+#include <math.h>
+
+QT_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------------
+
+class FxGridItemSG
+{
+public:
+    FxGridItemSG(QSGItem *i, QSGGridView *v) : item(i), view(v) {
+        attached = static_cast<QSGGridViewAttached*>(qmlAttachedPropertiesObject<QSGGridView>(item));
+        if (attached)
+            attached->setView(view);
+    }
+    ~FxGridItemSG() {}
+
+    qreal rowPos() const {
+        qreal rowPos = 0;
+        if (view->flow() == QSGGridView::LeftToRight) {
+            rowPos = item->y();
+        } else {
+            if (view->effectiveLayoutDirection() == Qt::RightToLeft)
+                rowPos = -view->cellWidth()-item->x();
+            else
+                rowPos = item->x();
+        }
+        return rowPos;
+    }
+    qreal colPos() const {
+        qreal colPos = 0;
+        if (view->flow() == QSGGridView::LeftToRight) {
+            if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
+                int colSize = view->cellWidth();
+                int columns = view->width()/colSize;
+                colPos = colSize * (columns-1) - item->x();
+            } else {
+                colPos = item->x();
+            }
+        } else {
+            colPos = item->y();
+        }
+
+        return colPos;
+    }
+    qreal endRowPos() const {
+        if (view->flow() == QSGGridView::LeftToRight) {
+            return item->y() + view->cellHeight() - 1;
+        } else {
+            if (view->effectiveLayoutDirection() == Qt::RightToLeft)
+                return -item->x() - 1;
+            else
+                return item->x() + view->cellWidth() - 1;
+        }
+    }
+    void setPosition(qreal col, qreal row) {
+        if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
+            if (view->flow() == QSGGridView::LeftToRight) {
+                int columns = view->width()/view->cellWidth();
+                item->setPos(QPointF((view->cellWidth() * (columns-1) - col), row));
+            } else {
+                item->setPos(QPointF(-view->cellWidth()-row, col));
+            }
+        } else {
+            if (view->flow() == QSGGridView::LeftToRight)
+                item->setPos(QPointF(col, row));
+            else
+                item->setPos(QPointF(row, col));
+        }
+    }
+    bool contains(qreal x, qreal y) const {
+        return (x >= item->x() && x < item->x() + view->cellWidth() &&
+                y >= item->y() && y < item->y() + view->cellHeight());
+    }
+
+    QSGItem *item;
+    QSGGridView *view;
+    QSGGridViewAttached *attached;
+    int index;
+};
+
+//----------------------------------------------------------------------------
+
+class QSGGridViewPrivate : public QSGFlickablePrivate
+{
+    Q_DECLARE_PUBLIC(QSGGridView)
+
+public:
+    QSGGridViewPrivate()
+    : currentItem(0), layoutDirection(Qt::LeftToRight), flow(QSGGridView::LeftToRight)
+    , visibleIndex(0) , currentIndex(-1)
+    , cellWidth(100), cellHeight(100), columns(1), requestedIndex(-1), itemCount(0)
+    , highlightRangeStart(0), highlightRangeEnd(0)
+    , highlightRange(QSGGridView::NoHighlightRange)
+    , highlightComponent(0), highlight(0), trackedItem(0)
+    , moveReason(Other), buffer(0), highlightXAnimator(0), highlightYAnimator(0)
+    , highlightMoveDuration(150)
+    , footerComponent(0), footer(0), headerComponent(0), header(0)
+    , bufferMode(BufferBefore | BufferAfter), snapMode(QSGGridView::NoSnap)
+    , ownModel(false), wrap(false), autoHighlight(true)
+    , fixCurrentVisibility(false), lazyRelease(false), layoutScheduled(false)
+    , deferredRelease(false), haveHighlightRange(false), currentIndexCleared(false)
+    , highlightRangeStartValid(false), highlightRangeEndValid(false) {}
+
+    void init();
+    void clear();
+    FxGridItemSG *createItem(int modelIndex);
+    void releaseItem(FxGridItemSG *item);
+    void refill(qreal from, qreal to, bool doBuffer=false);
+
+    void updateGrid();
+    void scheduleLayout();
+    void layout();
+    void updateUnrequestedIndexes();
+    void updateUnrequestedPositions();
+    void updateTrackedItem();
+    void createHighlight();
+    void updateHighlight();
+    void updateCurrent(int modelIndex);
+    void updateHeader();
+    void updateFooter();
+    void fixupPosition();
+
+    FxGridItemSG *visibleItem(int modelIndex) const {
+        if (modelIndex >= visibleIndex && modelIndex < visibleIndex + visibleItems.count()) {
+            for (int i = modelIndex - visibleIndex; i < visibleItems.count(); ++i) {
+                FxGridItemSG *item = visibleItems.at(i);
+                if (item->index == modelIndex)
+                    return item;
+            }
+        }
+        return 0;
+    }
+
+    bool isRightToLeftTopToBottom() const {
+        Q_Q(const QSGGridView);
+        return flow == QSGGridView::TopToBottom && q->effectiveLayoutDirection() == Qt::RightToLeft;
+    }
+
+    void regenerate() {
+        Q_Q(QSGGridView);
+        if (q->isComponentComplete()) {
+            clear();
+            updateGrid();
+            setPosition(0);
+            q->refill();
+            updateCurrent(currentIndex);
+        }
+    }
+
+    void mirrorChange() {
+        Q_Q(QSGGridView);
+        regenerate();
+        emit q->effectiveLayoutDirectionChanged();
+    }
+
+    qreal position() const {
+        Q_Q(const QSGGridView);
+        return flow == QSGGridView::LeftToRight ? q->contentY() : q->contentX();
+    }
+    void setPosition(qreal pos) {
+        Q_Q(QSGGridView);
+        if (flow == QSGGridView::LeftToRight) {
+            q->QSGFlickable::setContentY(pos);
+            q->QSGFlickable::setContentX(0);
+        } else {
+            if (q->effectiveLayoutDirection() == Qt::LeftToRight)
+                q->QSGFlickable::setContentX(pos);
+            else
+                q->QSGFlickable::setContentX(-pos-size());
+            q->QSGFlickable::setContentY(0);
+        }
+    }
+    int size() const {
+        Q_Q(const QSGGridView);
+        return flow == QSGGridView::LeftToRight ? q->height() : q->width();
+    }
+    qreal originPosition() const {
+        qreal pos = 0;
+        if (!visibleItems.isEmpty())
+            pos = visibleItems.first()->rowPos() - visibleIndex / columns * rowSize();
+        return pos;
+    }
+
+    qreal lastPosition() const {
+        qreal pos = 0;
+        if (model && model->count())
+            pos = rowPosAt(model->count() - 1) + rowSize();
+        return pos;
+    }
+
+    qreal startPosition() const {
+        return isRightToLeftTopToBottom() ? -lastPosition()+1 : originPosition();
+    }
+
+    qreal endPosition() const {
+        return isRightToLeftTopToBottom() ? -originPosition()+1 : lastPosition();
+
+    }
+
+    bool isValid() const {
+        return model && model->count() && model->isValid();
+    }
+
+    int rowSize() const {
+        return flow == QSGGridView::LeftToRight ? cellHeight : cellWidth;
+    }
+    int colSize() const {
+        return flow == QSGGridView::LeftToRight ? cellWidth : cellHeight;
+    }
+
+    qreal colPosAt(int modelIndex) const {
+        if (FxGridItemSG *item = visibleItem(modelIndex))
+            return item->colPos();
+        if (!visibleItems.isEmpty()) {
+            if (modelIndex < visibleIndex) {
+                int count = (visibleIndex - modelIndex) % columns;
+                int col = visibleItems.first()->colPos() / colSize();
+                col = (columns - count + col) % columns;
+                return col * colSize();
+            } else {
+                int count = columns - 1 - (modelIndex - visibleItems.last()->index - 1) % columns;
+                return visibleItems.last()->colPos() - count * colSize();
+            }
+        } else {
+            return (modelIndex % columns) * colSize();
+        }
+        return 0;
+    }
+    qreal rowPosAt(int modelIndex) const {
+        if (FxGridItemSG *item = visibleItem(modelIndex))
+            return item->rowPos();
+        if (!visibleItems.isEmpty()) {
+            if (modelIndex < visibleIndex) {
+                int firstCol = visibleItems.first()->colPos() / colSize();
+                int col = visibleIndex - modelIndex + (columns - firstCol - 1);
+                int rows = col / columns;
+                return visibleItems.first()->rowPos() - rows * rowSize();
+            } else {
+                int count = modelIndex - visibleItems.last()->index;
+                int col = visibleItems.last()->colPos() + count * colSize();
+                int rows = col / (columns * colSize());
+                return visibleItems.last()->rowPos() + rows * rowSize();
+            }
+        } else {
+            qreal pos = (modelIndex / columns) * rowSize();
+            if (header)
+                pos += headerSize();
+            return pos;
+        }
+        return 0;
+    }
+
+    FxGridItemSG *firstVisibleItem() const {
+        const qreal pos = isRightToLeftTopToBottom() ? -position()-size() : position();
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *item = visibleItems.at(i);
+            if (item->index != -1 && item->endRowPos() > pos)
+                return item;
+        }
+        return visibleItems.count() ? visibleItems.first() : 0;
+    }
+
+    int lastVisibleIndex() const {
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *item = visibleItems.at(i);
+            if (item->index != -1)
+                return item->index;
+        }
+        return -1;
+    }
+
+    // Map a model index to visibleItems list index.
+    // These may differ if removed items are still present in the visible list,
+    // e.g. doing a removal animation
+    int mapFromModel(int modelIndex) const {
+        if (modelIndex < visibleIndex || modelIndex >= visibleIndex + visibleItems.count())
+            return -1;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *listItem = visibleItems.at(i);
+            if (listItem->index == modelIndex)
+                return i + visibleIndex;
+            if (listItem->index > modelIndex)
+                return -1;
+        }
+        return -1; // Not in visibleList
+    }
+
+    qreal snapPosAt(qreal pos) const {
+        Q_Q(const QSGGridView);
+        qreal snapPos = 0;
+        if (!visibleItems.isEmpty()) {
+            pos += rowSize()/2;
+            snapPos = visibleItems.first()->rowPos() - visibleIndex / columns * rowSize();
+            snapPos = pos - fmodf(pos - snapPos, qreal(rowSize()));
+            qreal maxExtent;
+            qreal minExtent;
+            if (isRightToLeftTopToBottom()) {
+                maxExtent = q->minXExtent();
+                minExtent = q->maxXExtent();
+            } else {
+                maxExtent = flow == QSGGridView::LeftToRight ? -q->maxYExtent() : -q->maxXExtent();
+                minExtent = flow == QSGGridView::LeftToRight ? -q->minYExtent() : -q->minXExtent();
+            }
+            if (snapPos > maxExtent)
+                snapPos = maxExtent;
+            if (snapPos < minExtent)
+                snapPos = minExtent;
+        }
+        return snapPos;
+    }
+
+    FxGridItemSG *snapItemAt(qreal pos) {
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *item = visibleItems[i];
+            if (item->index == -1)
+                continue;
+            qreal itemTop = item->rowPos();
+            if (itemTop+rowSize()/2 >= pos && itemTop - rowSize()/2 <= pos)
+                return item;
+        }
+        return 0;
+    }
+
+    int snapIndex() {
+        int index = currentIndex;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *item = visibleItems[i];
+            if (item->index == -1)
+                continue;
+            qreal itemTop = item->rowPos();
+            if (itemTop >= highlight->rowPos()-rowSize()/2 && itemTop < highlight->rowPos()+rowSize()/2) {
+                index = item->index;
+                if (item->colPos() >= highlight->colPos()-colSize()/2 && item->colPos() < highlight->colPos()+colSize()/2)
+                    return item->index;
+            }
+        }
+        return index;
+    }
+
+    qreal headerSize() const {
+        if (!header)
+            return 0.0;
+
+        return flow == QSGGridView::LeftToRight
+                       ? header->item->height()
+                       : header->item->width();
+    }
+
+
+    virtual void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
+        Q_Q(const QSGGridView);
+        QSGFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
+        if (item == q) {
+            if (newGeometry.height() != oldGeometry.height()
+                || newGeometry.width() != oldGeometry.width()) {
+                if (q->isComponentComplete()) {
+                    updateGrid();
+                    scheduleLayout();
+                }
+            }
+        } else if ((header && header->item == item) || (footer && footer->item == item)) {
+            if (header)
+                updateHeader();
+            if (footer)
+                updateFooter();
+        }
+    }
+
+    void positionViewAtIndex(int index, int mode);
+    virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
+    virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
+
+    // for debugging only
+    void checkVisible() const {
+        int skip = 0;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxGridItemSG *listItem = visibleItems.at(i);
+            if (listItem->index == -1) {
+                ++skip;
+            } else if (listItem->index != visibleIndex + i - skip) {
+                for (int j = 0; j < visibleItems.count(); j++)
+                    qDebug() << " index" << j << "item index" << visibleItems.at(j)->index;
+                qFatal("index %d %d %d", visibleIndex, i, listItem->index);
+            }
+        }
+    }
+
+    QDeclarativeGuard<QSGVisualModel> model;
+    QVariant modelVariant;
+    QList<FxGridItemSG*> visibleItems;
+    QHash<QSGItem*,int> unrequestedItems;
+    FxGridItemSG *currentItem;
+    Qt::LayoutDirection layoutDirection;
+    QSGGridView::Flow flow;
+    int visibleIndex;
+    int currentIndex;
+    int cellWidth;
+    int cellHeight;
+    int columns;
+    int requestedIndex;
+    int itemCount;
+    qreal highlightRangeStart;
+    qreal highlightRangeEnd;
+    QSGGridView::HighlightRangeMode highlightRange;
+    QDeclarativeComponent *highlightComponent;
+    FxGridItemSG *highlight;
+    FxGridItemSG *trackedItem;
+    enum MovementReason { Other, SetIndex, Mouse };
+    MovementReason moveReason;
+    int buffer;
+    QSmoothedAnimation *highlightXAnimator;
+    QSmoothedAnimation *highlightYAnimator;
+    int highlightMoveDuration;
+    QDeclarativeComponent *footerComponent;
+    FxGridItemSG *footer;
+    QDeclarativeComponent *headerComponent;
+    FxGridItemSG *header;
+    enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
+    int bufferMode;
+    QSGGridView::SnapMode snapMode;
+
+    bool ownModel : 1;
+    bool wrap : 1;
+    bool autoHighlight : 1;
+    bool fixCurrentVisibility : 1;
+    bool lazyRelease : 1;
+    bool layoutScheduled : 1;
+    bool deferredRelease : 1;
+    bool haveHighlightRange : 1;
+    bool currentIndexCleared : 1;
+    bool highlightRangeStartValid : 1;
+    bool highlightRangeEndValid : 1;
+};
+
+void QSGGridViewPrivate::init()
+{
+    Q_Q(QSGGridView);
+    QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped()));
+    q->setFlag(QSGItem::ItemIsFocusScope);
+    q->setFlickableDirection(QSGFlickable::VerticalFlick);
+    addItemChangeListener(this, Geometry);
+}
+
+void QSGGridViewPrivate::clear()
+{
+    for (int i = 0; i < visibleItems.count(); ++i)
+        releaseItem(visibleItems.at(i));
+    visibleItems.clear();
+    visibleIndex = 0;
+    releaseItem(currentItem);
+    currentItem = 0;
+    createHighlight();
+    trackedItem = 0;
+    itemCount = 0;
+}
+
+FxGridItemSG *QSGGridViewPrivate::createItem(int modelIndex)
+{
+    Q_Q(QSGGridView);
+    // create object
+    requestedIndex = modelIndex;
+    FxGridItemSG *listItem = 0;
+    if (QSGItem *item = model->item(modelIndex, false)) {
+        listItem = new FxGridItemSG(item, q);
+        listItem->index = modelIndex;
+        if (model->completePending()) {
+            // complete
+            listItem->item->setZ(1);
+            listItem->item->setParentItem(q->contentItem());
+            model->completeItem();
+        } else {
+            listItem->item->setParentItem(q->contentItem());
+        }
+        unrequestedItems.remove(listItem->item);
+    }
+    requestedIndex = -1;
+    return listItem;
+}
+
+
+void QSGGridViewPrivate::releaseItem(FxGridItemSG *item)
+{
+    Q_Q(QSGGridView);
+    if (!item || !model)
+        return;
+    if (trackedItem == item) {
+        QObject::disconnect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
+        QObject::disconnect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
+        trackedItem = 0;
+    }
+    if (model->release(item->item) == 0) {
+        // item was not destroyed, and we no longer reference it.
+        unrequestedItems.insert(item->item, model->indexOf(item->item, q));
+    }
+    delete item;
+}
+
+void QSGGridViewPrivate::refill(qreal from, qreal to, bool doBuffer)
+{
+    Q_Q(QSGGridView);
+    if (!isValid() || !q->isComponentComplete())
+        return;
+    itemCount = model->count();
+    qreal bufferFrom = from - buffer;
+    qreal bufferTo = to + buffer;
+    qreal fillFrom = from;
+    qreal fillTo = to;
+    if (doBuffer && (bufferMode & BufferAfter))
+        fillTo = bufferTo;
+    if (doBuffer && (bufferMode & BufferBefore))
+        fillFrom = bufferFrom;
+
+    bool changed = false;
+
+    int colPos = colPosAt(visibleIndex);
+    int rowPos = rowPosAt(visibleIndex);
+    int modelIndex = visibleIndex;
+    if (visibleItems.count()) {
+        rowPos = visibleItems.last()->rowPos();
+        colPos = visibleItems.last()->colPos() + colSize();
+        if (colPos > colSize() * (columns-1)) {
+            colPos = 0;
+            rowPos += rowSize();
+        }
+        int i = visibleItems.count() - 1;
+        while (i > 0 && visibleItems.at(i)->index == -1)
+            --i;
+        modelIndex = visibleItems.at(i)->index + 1;
+    }
+    int colNum = colPos / colSize();
+
+    FxGridItemSG *item = 0;
+
+    // Item creation and release is staggered in order to avoid
+    // creating/releasing multiple items in one frame
+    // while flicking (as much as possible).
+    while (modelIndex < model->count() && rowPos <= fillTo + rowSize()*(columns - colNum)/(columns+1)) {
+//        qDebug() << "refill: append item" << modelIndex;
+        if (!(item = createItem(modelIndex)))
+            break;
+        item->setPosition(colPos, rowPos);
+        visibleItems.append(item);
+        colPos += colSize();
+        colNum++;
+        if (colPos > colSize() * (columns-1)) {
+            colPos = 0;
+            colNum = 0;
+            rowPos += rowSize();
+        }
+        ++modelIndex;
+        changed = true;
+        if (doBuffer) // never buffer more than one item per frame
+            break;
+    }
+
+    if (visibleItems.count()) {
+        rowPos = visibleItems.first()->rowPos();
+        colPos = visibleItems.first()->colPos() - colSize();
+        if (colPos < 0) {
+            colPos = colSize() * (columns - 1);
+            rowPos -= rowSize();
+        }
+    }
+    colNum = colPos / colSize();
+    while (visibleIndex > 0 && rowPos + rowSize() - 1 >= fillFrom - rowSize()*(colNum+1)/(columns+1)){
+//        qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos;
+        if (!(item = createItem(visibleIndex-1)))
+            break;
+        --visibleIndex;
+        item->setPosition(colPos, rowPos);
+        visibleItems.prepend(item);
+        colPos -= colSize();
+        colNum--;
+        if (colPos < 0) {
+            colPos = colSize() * (columns - 1);
+            colNum = columns-1;
+            rowPos -= rowSize();
+        }
+        changed = true;
+        if (doBuffer) // never buffer more than one item per frame
+            break;
+    }
+
+    if (!lazyRelease || !changed || deferredRelease) { // avoid destroying items in the same frame that we create
+        while (visibleItems.count() > 1
+               && (item = visibleItems.first())
+                    && item->rowPos()+rowSize()-1 < bufferFrom - rowSize()*(item->colPos()/colSize()+1)/(columns+1)) {
+            if (item->attached->delayRemove())
+                break;
+//            qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos();
+            if (item->index != -1)
+                visibleIndex++;
+            visibleItems.removeFirst();
+            releaseItem(item);
+            changed = true;
+        }
+        while (visibleItems.count() > 1
+               && (item = visibleItems.last())
+                    && item->rowPos() > bufferTo + rowSize()*(columns - item->colPos()/colSize())/(columns+1)) {
+            if (item->attached->delayRemove())
+                break;
+//            qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1;
+            visibleItems.removeLast();
+            releaseItem(item);
+            changed = true;
+        }
+        deferredRelease = false;
+    } else {
+        deferredRelease = true;
+    }
+    if (changed) {
+        if (header)
+            updateHeader();
+        if (footer)
+            updateFooter();
+        if (flow == QSGGridView::LeftToRight)
+            q->setContentHeight(endPosition() - startPosition());
+        else
+            q->setContentWidth(endPosition() - startPosition());
+    } else if (!doBuffer && buffer && bufferMode != NoBuffer) {
+        refill(from, to, true);
+    }
+    lazyRelease = false;
+}
+
+void QSGGridViewPrivate::updateGrid()
+{
+    Q_Q(QSGGridView);
+    columns = (int)qMax((flow == QSGGridView::LeftToRight ? q->width() : q->height()) / colSize(), qreal(1.));
+    if (isValid()) {
+        if (flow == QSGGridView::LeftToRight)
+            q->setContentHeight(endPosition() - startPosition());
+        else
+            q->setContentWidth(lastPosition() - originPosition());
+    }
+}
+
+void QSGGridViewPrivate::scheduleLayout()
+{
+    Q_Q(QSGGridView);
+    if (!layoutScheduled) {
+        layoutScheduled = true;
+        q->polish();
+    }
+}
+
+void QSGGridViewPrivate::layout()
+{
+    Q_Q(QSGGridView);
+    layoutScheduled = false;
+    if (!isValid() && !visibleItems.count()) {
+        clear();
+        return;
+    }
+    if (visibleItems.count()) {
+        qreal rowPos = visibleItems.first()->rowPos();
+        qreal colPos = visibleItems.first()->colPos();
+        int col = visibleIndex % columns;
+        if (colPos != col * colSize()) {
+            colPos = col * colSize();
+            visibleItems.first()->setPosition(colPos, rowPos);
+        }
+        for (int i = 1; i < visibleItems.count(); ++i) {
+            FxGridItemSG *item = visibleItems.at(i);
+            colPos += colSize();
+            if (colPos > colSize() * (columns-1)) {
+                colPos = 0;
+                rowPos += rowSize();
+            }
+            item->setPosition(colPos, rowPos);
+        }
+    }
+    if (header)
+        updateHeader();
+    if (footer)
+        updateFooter();
+    q->refill();
+    updateHighlight();
+    moveReason = Other;
+    if (flow == QSGGridView::LeftToRight) {
+        q->setContentHeight(endPosition() - startPosition());
+        fixupY();
+    } else {
+        q->setContentWidth(endPosition() - startPosition());
+        fixupX();
+    }
+    updateUnrequestedPositions();
+}
+
+void QSGGridViewPrivate::updateUnrequestedIndexes()
+{
+    Q_Q(QSGGridView);
+    QHash<QSGItem*,int>::iterator it;
+    for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it)
+        *it = model->indexOf(it.key(), q);
+}
+
+void QSGGridViewPrivate::updateUnrequestedPositions()
+{
+    QHash<QSGItem*,int>::const_iterator it;
+    for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it) {
+        QSGItem *item = it.key();
+        if (flow == QSGGridView::LeftToRight) {
+            item->setPos(QPointF(colPosAt(*it), rowPosAt(*it)));
+        } else {
+            if (isRightToLeftTopToBottom())
+                item->setPos(QPointF(-rowPosAt(*it)-item->width(), colPosAt(*it)));
+            else
+                item->setPos(QPointF(rowPosAt(*it), colPosAt(*it)));
+        }
+    }
+}
+
+void QSGGridViewPrivate::updateTrackedItem()
+{
+    Q_Q(QSGGridView);
+    FxGridItemSG *item = currentItem;
+    if (highlight)
+        item = highlight;
+
+    if (trackedItem && item != trackedItem) {
+        QObject::disconnect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
+        QObject::disconnect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
+        trackedItem = 0;
+    }
+
+    if (!trackedItem && item) {
+        trackedItem = item;
+        QObject::connect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
+        QObject::connect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
+    }
+    if (trackedItem)
+        q->trackedPositionChanged();
+}
+
+void QSGGridViewPrivate::createHighlight()
+{
+    Q_Q(QSGGridView);
+    bool changed = false;
+    if (highlight) {
+        if (trackedItem == highlight)
+            trackedItem = 0;
+        delete highlight->item;
+        delete highlight;
+        highlight = 0;
+        delete highlightXAnimator;
+        delete highlightYAnimator;
+        highlightXAnimator = 0;
+        highlightYAnimator = 0;
+        changed = true;
+    }
+
+    if (currentItem) {
+        QSGItem *item = 0;
+        if (highlightComponent) {
+            QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
+            QObject *nobj = highlightComponent->create(highlightContext);
+            if (nobj) {
+                QDeclarative_setParent_noEvent(highlightContext, nobj);
+                item = qobject_cast<QSGItem *>(nobj);
+                if (!item)
+                    delete nobj;
+            } else {
+                delete highlightContext;
+            }
+        } else {
+            item = new QSGItem;
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            highlight = new FxGridItemSG(item, q);
+            if (currentItem && autoHighlight)
+                highlight->setPosition(currentItem->colPos(), currentItem->rowPos());
+            highlightXAnimator = new QSmoothedAnimation(q);
+            highlightXAnimator->target = QDeclarativeProperty(highlight->item, QLatin1String("x"));
+            highlightXAnimator->userDuration = highlightMoveDuration;
+            highlightYAnimator = new QSmoothedAnimation(q);
+            highlightYAnimator->target = QDeclarativeProperty(highlight->item, QLatin1String("y"));
+            highlightYAnimator->userDuration = highlightMoveDuration;
+            if (autoHighlight) {
+                highlightXAnimator->restart();
+                highlightYAnimator->restart();
+            }
+            changed = true;
+        }
+    }
+    if (changed)
+        emit q->highlightItemChanged();
+}
+
+void QSGGridViewPrivate::updateHighlight()
+{
+    if ((!currentItem && highlight) || (currentItem && !highlight))
+        createHighlight();
+    if (currentItem && autoHighlight && highlight && !movingHorizontally && !movingVertically) {
+        // auto-update highlight
+        highlightXAnimator->to = currentItem->item->x();
+        highlightYAnimator->to = currentItem->item->y();
+        highlight->item->setWidth(currentItem->item->width());
+        highlight->item->setHeight(currentItem->item->height());
+        highlightXAnimator->restart();
+        highlightYAnimator->restart();
+    }
+    updateTrackedItem();
+}
+
+void QSGGridViewPrivate::updateCurrent(int modelIndex)
+{
+    Q_Q(QSGGridView);
+    if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) {
+        if (currentItem) {
+            currentItem->attached->setIsCurrentItem(false);
+            releaseItem(currentItem);
+            currentItem = 0;
+            currentIndex = modelIndex;
+            emit q->currentIndexChanged();
+            updateHighlight();
+        } else if (currentIndex != modelIndex) {
+            currentIndex = modelIndex;
+            emit q->currentIndexChanged();
+        }
+        return;
+    }
+
+    if (currentItem && currentIndex == modelIndex) {
+        updateHighlight();
+        return;
+    }
+
+    FxGridItemSG *oldCurrentItem = currentItem;
+    currentIndex = modelIndex;
+    currentItem = createItem(modelIndex);
+    fixCurrentVisibility = true;
+    if (oldCurrentItem && (!currentItem || oldCurrentItem->item != currentItem->item))
+        oldCurrentItem->attached->setIsCurrentItem(false);
+    if (currentItem) {
+        currentItem->setPosition(colPosAt(modelIndex), rowPosAt(modelIndex));
+        currentItem->item->setFocus(true);
+        currentItem->attached->setIsCurrentItem(true);
+    }
+    updateHighlight();
+    emit q->currentIndexChanged();
+    releaseItem(oldCurrentItem);
+}
+
+void QSGGridViewPrivate::updateFooter()
+{
+    Q_Q(QSGGridView);
+    if (!footer && footerComponent) {
+        QSGItem *item = 0;
+        QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
+        QObject *nobj = footerComponent->create(context);
+        if (nobj) {
+            QDeclarative_setParent_noEvent(context, nobj);
+            item = qobject_cast<QSGItem *>(nobj);
+            if (!item)
+                delete nobj;
+        } else {
+            delete context;
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            item->setZ(1);
+            QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+            itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+            footer = new FxGridItemSG(item, q);
+        }
+    }
+    if (footer) {
+        qreal colOffset = 0;
+        qreal rowOffset;
+        if (isRightToLeftTopToBottom()) {
+            rowOffset = footer->item->width()-cellWidth;
+        } else {
+            rowOffset = 0;
+            if (q->effectiveLayoutDirection() == Qt::RightToLeft)
+                colOffset = footer->item->width()-cellWidth;
+        }
+        if (visibleItems.count()) {
+            qreal endPos = lastPosition();
+            if (lastVisibleIndex() == model->count()-1) {
+                footer->setPosition(colOffset, endPos + rowOffset);
+            } else {
+                qreal visiblePos = isRightToLeftTopToBottom() ? -position() : position() + size();
+                if (endPos <= visiblePos || footer->endRowPos() < endPos + rowOffset)
+                    footer->setPosition(colOffset, endPos + rowOffset);
+            }
+        } else {
+            qreal endPos = 0;
+            if (header) {
+                endPos += (flow == QSGGridView::LeftToRight) ? header->item->height() : header->item->width();
+            }
+            footer->setPosition(colOffset, endPos);
+        }
+    }
+}
+
+void QSGGridViewPrivate::updateHeader()
+{
+    Q_Q(QSGGridView);
+    if (!header && headerComponent) {
+        QSGItem *item = 0;
+        QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
+        QObject *nobj = headerComponent->create(context);
+        if (nobj) {
+            QDeclarative_setParent_noEvent(context, nobj);
+            item = qobject_cast<QSGItem *>(nobj);
+            if (!item)
+                delete nobj;
+        } else {
+            delete context;
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            item->setZ(1);
+            QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+            itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+            header = new FxGridItemSG(item, q);
+        }
+    }
+    if (header) {
+        qreal colOffset = 0;
+        qreal rowOffset;
+        if (isRightToLeftTopToBottom()) {
+            rowOffset = -cellWidth;
+        } else {
+            rowOffset = -headerSize();
+            if (q->effectiveLayoutDirection() == Qt::RightToLeft)
+                colOffset = header->item->width()-cellWidth;
+        }
+        if (visibleItems.count()) {
+            qreal startPos = originPosition();
+            if (visibleIndex == 0) {
+                header->setPosition(colOffset, startPos + rowOffset);
+            } else {
+                qreal tempPos = isRightToLeftTopToBottom() ? -position()-size() : position();
+                qreal headerPos = isRightToLeftTopToBottom() ? header->rowPos() + cellWidth - headerSize() : header->rowPos();
+                if (tempPos <= startPos || headerPos > startPos + rowOffset)
+                    header->setPosition(colOffset, startPos + rowOffset);
+            }
+        } else {
+            header->setPosition(colOffset, 0);
+        }
+    }
+}
+
+void QSGGridViewPrivate::fixupPosition()
+{
+    moveReason = Other;
+    if (flow == QSGGridView::LeftToRight)
+        fixupY();
+    else
+        fixupX();
+}
+
+void QSGGridViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
+{
+    if ((flow == QSGGridView::TopToBottom && &data == &vData)
+        || (flow == QSGGridView::LeftToRight && &data == &hData))
+        return;
+
+    fixupMode = moveReason == Mouse ? fixupMode : Immediate;
+
+    qreal highlightStart;
+    qreal highlightEnd;
+    qreal viewPos;
+    if (isRightToLeftTopToBottom()) {
+        // Handle Right-To-Left exceptions
+        viewPos = -position()-size();
+        highlightStart = highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
+        highlightEnd = highlightRangeEndValid ? size()-highlightRangeStart : highlightRangeEnd;
+    } else {
+        viewPos = position();
+        highlightStart = highlightRangeStart;
+        highlightEnd = highlightRangeEnd;
+    }
+
+    if (snapMode != QSGGridView::NoSnap) {
+        qreal tempPosition = isRightToLeftTopToBottom() ? -position()-size() : position();
+        FxGridItemSG *topItem = snapItemAt(tempPosition+highlightStart);
+        FxGridItemSG *bottomItem = snapItemAt(tempPosition+highlightEnd);
+        qreal pos;
+        if (topItem && bottomItem && haveHighlightRange && highlightRange == QSGGridView::StrictlyEnforceRange) {
+            qreal topPos = qMin(topItem->rowPos() - highlightStart, -maxExtent);
+            qreal bottomPos = qMax(bottomItem->rowPos() - highlightEnd, -minExtent);
+            pos = qAbs(data.move + topPos) < qAbs(data.move + bottomPos) ? topPos : bottomPos;
+        } else if (topItem) {
+            qreal headerPos = 0;
+            if (header)
+                headerPos = isRightToLeftTopToBottom() ? header->rowPos() + cellWidth - headerSize() : header->rowPos();
+            if (topItem->index == 0 && header && tempPosition+highlightStart < headerPos+headerSize()/2) {
+                pos = isRightToLeftTopToBottom() ? - headerPos + highlightStart - size() : headerPos - highlightStart;
+            } else {
+                if (isRightToLeftTopToBottom())
+                    pos = qMax(qMin(-topItem->rowPos() + highlightStart - size(), -maxExtent), -minExtent);
+                else
+                    pos = qMax(qMin(topItem->rowPos() - highlightStart, -maxExtent), -minExtent);
+            }
+        } else if (bottomItem) {
+            if (isRightToLeftTopToBottom())
+                pos = qMax(qMin(-bottomItem->rowPos() + highlightStart - size(), -maxExtent), -minExtent);
+            else
+                pos = qMax(qMin(bottomItem->rowPos() - highlightStart, -maxExtent), -minExtent);
+        } else {
+            QSGFlickablePrivate::fixup(data, minExtent, maxExtent);
+            return;
+        }
+        if (currentItem && haveHighlightRange && highlightRange == QSGGridView::StrictlyEnforceRange) {
+            updateHighlight();
+            qreal currPos = currentItem->rowPos();
+            if (isRightToLeftTopToBottom())
+                pos = -pos-size(); // Transform Pos if required
+            if (pos < currPos + rowSize() - highlightEnd)
+                pos = currPos + rowSize() - highlightEnd;
+            if (pos > currPos - highlightStart)
+                pos = currPos - highlightStart;
+            if (isRightToLeftTopToBottom())
+                pos = -pos-size(); // Untransform
+        }
+
+        qreal dist = qAbs(data.move + pos);
+        if (dist > 0) {
+            timeline.reset(data.move);
+            if (fixupMode != Immediate) {
+                timeline.move(data.move, -pos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
+                data.fixingUp = true;
+            } else {
+                timeline.set(data.move, -pos);
+            }
+            vTime = timeline.time();
+        }
+    } else if (haveHighlightRange && highlightRange == QSGGridView::StrictlyEnforceRange) {
+        if (currentItem) {
+            updateHighlight();
+            qreal pos = currentItem->rowPos();
+            if (viewPos < pos + rowSize() - highlightEnd)
+                viewPos = pos + rowSize() - highlightEnd;
+            if (viewPos > pos - highlightStart)
+                viewPos = pos - highlightStart;
+            if (isRightToLeftTopToBottom())
+                viewPos = -viewPos-size();
+            timeline.reset(data.move);
+            if (viewPos != position()) {
+                if (fixupMode != Immediate) {
+                    timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
+                    data.fixingUp = true;
+                } else {
+                    timeline.set(data.move, -viewPos);
+                }
+            }
+            vTime = timeline.time();
+        }
+    } else {
+        QSGFlickablePrivate::fixup(data, minExtent, maxExtent);
+    }
+    fixupMode = Normal;
+}
+
+void QSGGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                                        QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
+{
+    Q_Q(QSGGridView);
+    data.fixingUp = false;
+    moveReason = Mouse;
+    if ((!haveHighlightRange || highlightRange != QSGGridView::StrictlyEnforceRange)
+        && snapMode == QSGGridView::NoSnap) {
+        QSGFlickablePrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity);
+        return;
+    }
+    qreal maxDistance = 0;
+    qreal dataValue = isRightToLeftTopToBottom() ? -data.move.value()+size() : data.move.value();
+    // -ve velocity means list is moving up/left
+    if (velocity > 0) {
+        if (data.move.value() < minExtent) {
+            if (snapMode == QSGGridView::SnapOneRow) {
+                if (FxGridItemSG *item = firstVisibleItem())
+                    maxDistance = qAbs(item->rowPos() + dataValue);
+            } else {
+                maxDistance = qAbs(minExtent - data.move.value());
+            }
+        }
+        if (snapMode == QSGGridView::NoSnap && highlightRange != QSGGridView::StrictlyEnforceRange)
+            data.flickTarget = minExtent;
+    } else {
+        if (data.move.value() > maxExtent) {
+            if (snapMode == QSGGridView::SnapOneRow) {
+                qreal pos = snapPosAt(-dataValue) + (isRightToLeftTopToBottom() ? 0 : rowSize());
+                maxDistance = qAbs(pos + dataValue);
+            } else {
+                maxDistance = qAbs(maxExtent - data.move.value());
+            }
+        }
+        if (snapMode == QSGGridView::NoSnap && highlightRange != QSGGridView::StrictlyEnforceRange)
+            data.flickTarget = maxExtent;
+    }
+    bool overShoot = boundsBehavior == QSGFlickable::DragAndOvershootBounds;
+    qreal highlightStart = isRightToLeftTopToBottom() && highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
+    if (maxDistance > 0 || overShoot) {
+        // This mode requires the grid to stop exactly on a row boundary.
+        qreal v = velocity;
+        if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
+            if (v < 0)
+                v = -maxVelocity;
+            else
+                v = maxVelocity;
+        }
+        qreal accel = deceleration;
+        qreal v2 = v * v;
+        qreal overshootDist = 0.0;
+        if ((maxDistance > 0.0 && v2 / (2.0f * maxDistance) < accel) || snapMode == QSGGridView::SnapOneRow) {
+            // + rowSize()/4 to encourage moving at least one item in the flick direction
+            qreal dist = v2 / (accel * 2.0) + rowSize()/4;
+            dist = qMin(dist, maxDistance);
+            if (v > 0)
+                dist = -dist;
+            qreal distTemp = isRightToLeftTopToBottom() ? -dist : dist;
+            data.flickTarget = -snapPosAt(-(dataValue - highlightStart) + distTemp) + highlightStart;
+            data.flickTarget = isRightToLeftTopToBottom() ? -data.flickTarget+size() : data.flickTarget;
+            qreal adjDist = -data.flickTarget + data.move.value();
+            if (qAbs(adjDist) > qAbs(dist)) {
+                // Prevent painfully slow flicking - adjust velocity to suit flickDeceleration
+                qreal adjv2 = accel * 2.0f * qAbs(adjDist);
+                if (adjv2 > v2) {
+                    v2 = adjv2;
+                    v = qSqrt(v2);
+                    if (dist > 0)
+                        v = -v;
+                }
+            }
+            dist = adjDist;
+            accel = v2 / (2.0f * qAbs(dist));
+        } else {
+            data.flickTarget = velocity > 0 ? minExtent : maxExtent;
+            overshootDist = overShoot ? overShootDistance(v, vSize) : 0;
+        }
+        timeline.reset(data.move);
+        timeline.accel(data.move, v, accel, maxDistance + overshootDist);
+        timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
+        if (!flickingHorizontally && q->xflick()) {
+            flickingHorizontally = true;
+            emit q->flickingChanged();
+            emit q->flickingHorizontallyChanged();
+            emit q->flickStarted();
+        }
+        if (!flickingVertically && q->yflick()) {
+            flickingVertically = true;
+            emit q->flickingChanged();
+            emit q->flickingVerticallyChanged();
+            emit q->flickStarted();
+        }
+    } else {
+        timeline.reset(data.move);
+        fixup(data, minExtent, maxExtent);
+    }
+}
+
+
+//----------------------------------------------------------------------------
+
+QSGGridView::QSGGridView(QSGItem *parent)
+    : QSGFlickable(*(new QSGGridViewPrivate), parent)
+{
+    Q_D(QSGGridView);
+    d->init();
+}
+
+QSGGridView::~QSGGridView()
+{
+    Q_D(QSGGridView);
+    d->clear();
+    if (d->ownModel)
+        delete d->model;
+    delete d->header;
+    delete d->footer;
+}
+
+// For internal use
+int QSGGridView::modelCount() const
+{
+    Q_D(const QSGGridView);
+    return d->model->count();
+}
+
+QVariant QSGGridView::model() const
+{
+    Q_D(const QSGGridView);
+    return d->modelVariant;
+}
+
+void QSGGridView::setModel(const QVariant &model)
+{
+    Q_D(QSGGridView);
+    if (d->modelVariant == model)
+        return;
+    if (d->model) {
+        disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        disconnect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        disconnect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+    }
+    d->clear();
+    d->modelVariant = model;
+    QObject *object = qvariant_cast<QObject*>(model);
+    QSGVisualModel *vim = 0;
+    if (object && (vim = qobject_cast<QSGVisualModel *>(object))) {
+        if (d->ownModel) {
+            delete d->model;
+            d->ownModel = false;
+        }
+        d->model = vim;
+    } else {
+        if (!d->ownModel) {
+            d->model = new QSGVisualDataModel(qmlContext(this), this);
+            d->ownModel = true;
+        }
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            dataModel->setModel(model);
+    }
+    if (d->model) {
+        d->bufferMode = QSGGridViewPrivate::BufferBefore | QSGGridViewPrivate::BufferAfter;
+        if (isComponentComplete()) {
+            refill();
+            if ((d->currentIndex >= d->model->count() || d->currentIndex < 0) && !d->currentIndexCleared) {
+                setCurrentIndex(0);
+            } else {
+                d->moveReason = QSGGridViewPrivate::SetIndex;
+                d->updateCurrent(d->currentIndex);
+                if (d->highlight && d->currentItem) {
+                    if (d->autoHighlight)
+                        d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+                    d->updateTrackedItem();
+                }
+                d->moveReason = QSGGridViewPrivate::Other;
+            }
+        }
+        connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        connect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        connect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+        emit countChanged();
+    }
+    emit modelChanged();
+}
+
+QDeclarativeComponent *QSGGridView::delegate() const
+{
+    Q_D(const QSGGridView);
+    if (d->model) {
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            return dataModel->delegate();
+    }
+
+    return 0;
+}
+
+void QSGGridView::setDelegate(QDeclarativeComponent *delegate)
+{
+    Q_D(QSGGridView);
+    if (delegate == this->delegate())
+        return;
+
+    if (!d->ownModel) {
+        d->model = new QSGVisualDataModel(qmlContext(this));
+        d->ownModel = true;
+    }
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model)) {
+        dataModel->setDelegate(delegate);
+        if (isComponentComplete()) {
+            for (int i = 0; i < d->visibleItems.count(); ++i)
+                d->releaseItem(d->visibleItems.at(i));
+            d->visibleItems.clear();
+            d->releaseItem(d->currentItem);
+            d->currentItem = 0;
+            refill();
+            d->moveReason = QSGGridViewPrivate::SetIndex;
+            d->updateCurrent(d->currentIndex);
+            if (d->highlight && d->currentItem) {
+                if (d->autoHighlight)
+                    d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+                d->updateTrackedItem();
+            }
+            d->moveReason = QSGGridViewPrivate::Other;
+        }
+        emit delegateChanged();
+    }
+}
+
+int QSGGridView::currentIndex() const
+{
+    Q_D(const QSGGridView);
+    return d->currentIndex;
+}
+
+void QSGGridView::setCurrentIndex(int index)
+{
+    Q_D(QSGGridView);
+    if (d->requestedIndex >= 0) // currently creating item
+        return;
+    d->currentIndexCleared = (index == -1);
+    if (index == d->currentIndex)
+        return;
+    if (isComponentComplete() && d->isValid()) {
+        d->moveReason = QSGGridViewPrivate::SetIndex;
+        d->updateCurrent(index);
+    } else {
+        d->currentIndex = index;
+        emit currentIndexChanged();
+    }
+}
+
+QSGItem *QSGGridView::currentItem()
+{
+    Q_D(QSGGridView);
+    if (!d->currentItem)
+        return 0;
+    return d->currentItem->item;
+}
+
+QSGItem *QSGGridView::highlightItem()
+{
+    Q_D(QSGGridView);
+    if (!d->highlight)
+        return 0;
+    return d->highlight->item;
+}
+
+int QSGGridView::count() const
+{
+    Q_D(const QSGGridView);
+    if (d->model)
+        return d->model->count();
+    return 0;
+}
+
+QDeclarativeComponent *QSGGridView::highlight() const
+{
+    Q_D(const QSGGridView);
+    return d->highlightComponent;
+}
+
+void QSGGridView::setHighlight(QDeclarativeComponent *highlight)
+{
+    Q_D(QSGGridView);
+    if (highlight != d->highlightComponent) {
+        d->highlightComponent = highlight;
+        d->updateCurrent(d->currentIndex);
+        emit highlightChanged();
+    }
+}
+
+bool QSGGridView::highlightFollowsCurrentItem() const
+{
+    Q_D(const QSGGridView);
+    return d->autoHighlight;
+}
+
+void QSGGridView::setHighlightFollowsCurrentItem(bool autoHighlight)
+{
+    Q_D(QSGGridView);
+    if (d->autoHighlight != autoHighlight) {
+        d->autoHighlight = autoHighlight;
+        if (autoHighlight) {
+            d->updateHighlight();
+        } else if (d->highlightXAnimator) {
+            d->highlightXAnimator->stop();
+            d->highlightYAnimator->stop();
+        }
+    }
+}
+
+int QSGGridView::highlightMoveDuration() const
+{
+    Q_D(const QSGGridView);
+    return d->highlightMoveDuration;
+}
+
+void QSGGridView::setHighlightMoveDuration(int duration)
+{
+    Q_D(QSGGridView);
+    if (d->highlightMoveDuration != duration) {
+        d->highlightMoveDuration = duration;
+        if (d->highlightYAnimator) {
+            d->highlightXAnimator->userDuration = d->highlightMoveDuration;
+            d->highlightYAnimator->userDuration = d->highlightMoveDuration;
+        }
+        emit highlightMoveDurationChanged();
+    }
+}
+
+qreal QSGGridView::preferredHighlightBegin() const
+{
+    Q_D(const QSGGridView);
+    return d->highlightRangeStart;
+}
+
+void QSGGridView::setPreferredHighlightBegin(qreal start)
+{
+    Q_D(QSGGridView);
+    d->highlightRangeStartValid = true;
+    if (d->highlightRangeStart == start)
+        return;
+    d->highlightRangeStart = start;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit preferredHighlightBeginChanged();
+}
+
+void QSGGridView::resetPreferredHighlightBegin()
+{
+    Q_D(QSGGridView);
+    d->highlightRangeStartValid = false;
+    if (d->highlightRangeStart == 0)
+        return;
+    d->highlightRangeStart = 0;
+    emit preferredHighlightBeginChanged();
+}
+
+qreal QSGGridView::preferredHighlightEnd() const
+{
+    Q_D(const QSGGridView);
+    return d->highlightRangeEnd;
+}
+
+void QSGGridView::setPreferredHighlightEnd(qreal end)
+{
+    Q_D(QSGGridView);
+    d->highlightRangeEndValid = true;
+    if (d->highlightRangeEnd == end)
+        return;
+    d->highlightRangeEnd = end;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit preferredHighlightEndChanged();
+}
+
+void QSGGridView::resetPreferredHighlightEnd()
+{
+    Q_D(QSGGridView);
+    d->highlightRangeEndValid = false;
+    if (d->highlightRangeEnd == 0)
+        return;
+    d->highlightRangeEnd = 0;
+    emit preferredHighlightEndChanged();
+}
+
+QSGGridView::HighlightRangeMode QSGGridView::highlightRangeMode() const
+{
+    Q_D(const QSGGridView);
+    return d->highlightRange;
+}
+
+void QSGGridView::setHighlightRangeMode(HighlightRangeMode mode)
+{
+    Q_D(QSGGridView);
+    if (d->highlightRange == mode)
+        return;
+    d->highlightRange = mode;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit highlightRangeModeChanged();
+}
+
+Qt::LayoutDirection QSGGridView::layoutDirection() const
+{
+    Q_D(const QSGGridView);
+    return d->layoutDirection;
+}
+
+void QSGGridView::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+    Q_D(QSGGridView);
+    if (d->layoutDirection != layoutDirection) {
+        d->layoutDirection = layoutDirection;
+        d->regenerate();
+        emit layoutDirectionChanged();
+        emit effectiveLayoutDirectionChanged();
+    }
+}
+
+Qt::LayoutDirection QSGGridView::effectiveLayoutDirection() const
+{
+    Q_D(const QSGGridView);
+    if (d->effectiveLayoutMirror)
+        return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
+    else
+        return d->layoutDirection;
+}
+
+QSGGridView::Flow QSGGridView::flow() const
+{
+    Q_D(const QSGGridView);
+    return d->flow;
+}
+
+void QSGGridView::setFlow(Flow flow)
+{
+    Q_D(QSGGridView);
+    if (d->flow != flow) {
+        d->flow = flow;
+        if (d->flow == LeftToRight) {
+            setContentWidth(-1);
+            setFlickableDirection(QSGFlickable::VerticalFlick);
+        } else {
+            setContentHeight(-1);
+            setFlickableDirection(QSGFlickable::HorizontalFlick);
+        }
+        setContentX(0);
+        setContentY(0);
+        d->regenerate();
+        emit flowChanged();
+    }
+}
+
+bool QSGGridView::isWrapEnabled() const
+{
+    Q_D(const QSGGridView);
+    return d->wrap;
+}
+
+void QSGGridView::setWrapEnabled(bool wrap)
+{
+    Q_D(QSGGridView);
+    if (d->wrap == wrap)
+        return;
+    d->wrap = wrap;
+    emit keyNavigationWrapsChanged();
+}
+
+int QSGGridView::cacheBuffer() const
+{
+    Q_D(const QSGGridView);
+    return d->buffer;
+}
+
+void QSGGridView::setCacheBuffer(int buffer)
+{
+    Q_D(QSGGridView);
+    if (d->buffer != buffer) {
+        d->buffer = buffer;
+        if (isComponentComplete())
+            refill();
+        emit cacheBufferChanged();
+    }
+}
+
+int QSGGridView::cellWidth() const
+{
+    Q_D(const QSGGridView);
+    return d->cellWidth;
+}
+
+void QSGGridView::setCellWidth(int cellWidth)
+{
+    Q_D(QSGGridView);
+    if (cellWidth != d->cellWidth && cellWidth > 0) {
+        d->cellWidth = qMax(1, cellWidth);
+        d->updateGrid();
+        emit cellWidthChanged();
+        d->layout();
+    }
+}
+
+int QSGGridView::cellHeight() const
+{
+    Q_D(const QSGGridView);
+    return d->cellHeight;
+}
+
+void QSGGridView::setCellHeight(int cellHeight)
+{
+    Q_D(QSGGridView);
+    if (cellHeight != d->cellHeight && cellHeight > 0) {
+        d->cellHeight = qMax(1, cellHeight);
+        d->updateGrid();
+        emit cellHeightChanged();
+        d->layout();
+    }
+}
+
+QSGGridView::SnapMode QSGGridView::snapMode() const
+{
+    Q_D(const QSGGridView);
+    return d->snapMode;
+}
+
+void QSGGridView::setSnapMode(SnapMode mode)
+{
+    Q_D(QSGGridView);
+    if (d->snapMode != mode) {
+        d->snapMode = mode;
+        emit snapModeChanged();
+    }
+}
+
+QDeclarativeComponent *QSGGridView::footer() const
+{
+    Q_D(const QSGGridView);
+    return d->footerComponent;
+}
+
+void QSGGridView::setFooter(QDeclarativeComponent *footer)
+{
+    Q_D(QSGGridView);
+    if (d->footerComponent != footer) {
+        if (d->footer) {
+            // XXX todo - the original did scene()->removeItem().  Why?
+            d->footer->item->setParentItem(0);
+            d->footer->item->deleteLater();
+            delete d->footer;
+            d->footer = 0;
+        }
+        d->footerComponent = footer;
+        if (isComponentComplete()) {
+            d->updateFooter();
+            d->updateGrid();
+            d->fixupPosition();
+        }
+        emit footerChanged();
+    }
+}
+
+QDeclarativeComponent *QSGGridView::header() const
+{
+    Q_D(const QSGGridView);
+    return d->headerComponent;
+}
+
+void QSGGridView::setHeader(QDeclarativeComponent *header)
+{
+    Q_D(QSGGridView);
+    if (d->headerComponent != header) {
+        if (d->header) {
+            // XXX todo - the original did scene()->removeItem().  Why?
+            d->header->item->setParentItem(0);
+            d->header->item->deleteLater();
+            delete d->header;
+            d->header = 0;
+        }
+        d->headerComponent = header;
+        if (isComponentComplete()) {
+            d->updateHeader();
+            d->updateFooter();
+            d->updateGrid();
+            d->fixupPosition();
+        }
+        emit headerChanged();
+    }
+}
+
+void QSGGridView::setContentX(qreal pos)
+{
+    Q_D(QSGGridView);
+    // Positioning the view manually should override any current movement state
+    d->moveReason = QSGGridViewPrivate::Other;
+    QSGFlickable::setContentX(pos);
+}
+
+void QSGGridView::setContentY(qreal pos)
+{
+    Q_D(QSGGridView);
+    // Positioning the view manually should override any current movement state
+    d->moveReason = QSGGridViewPrivate::Other;
+    QSGFlickable::setContentY(pos);
+}
+
+void QSGGridView::updatePolish() 
+{
+    Q_D(QSGGridView);
+    QSGFlickable::updatePolish();
+    d->layout();
+}
+
+void QSGGridView::viewportMoved()
+{
+    Q_D(QSGGridView);
+    QSGFlickable::viewportMoved();
+    if (!d->itemCount)
+        return;
+    d->lazyRelease = true;
+    if (d->flickingHorizontally || d->flickingVertically) {
+        if (yflick()) {
+            if (d->vData.velocity > 0)
+                d->bufferMode = QSGGridViewPrivate::BufferBefore;
+            else if (d->vData.velocity < 0)
+                d->bufferMode = QSGGridViewPrivate::BufferAfter;
+        }
+
+        if (xflick()) {
+            if (d->hData.velocity > 0)
+                d->bufferMode = QSGGridViewPrivate::BufferBefore;
+            else if (d->hData.velocity < 0)
+                d->bufferMode = QSGGridViewPrivate::BufferAfter;
+        }
+    }
+    refill();
+    if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
+        d->moveReason = QSGGridViewPrivate::Mouse;
+    if (d->moveReason != QSGGridViewPrivate::SetIndex) {
+        if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange && d->highlight) {
+            // reposition highlight
+            qreal pos = d->highlight->rowPos();
+            qreal viewPos;
+            qreal highlightStart;
+            qreal highlightEnd;
+            if (d->isRightToLeftTopToBottom()) {
+                highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
+                highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
+                viewPos = -d->position()-d->size();
+            } else {
+                highlightStart = d->highlightRangeStart;
+                highlightEnd = d->highlightRangeEnd;
+                viewPos = d->position();
+            }
+            if (pos > viewPos + highlightEnd - d->rowSize())
+                pos = viewPos + highlightEnd - d->rowSize();
+            if (pos < viewPos + highlightStart)
+                pos = viewPos + highlightStart;
+            d->highlight->setPosition(d->highlight->colPos(), qRound(pos));
+
+            // update current index
+            int idx = d->snapIndex();
+            if (idx >= 0 && idx != d->currentIndex) {
+                d->updateCurrent(idx);
+                if (d->currentItem && d->currentItem->colPos() != d->highlight->colPos() && d->autoHighlight) {
+                    if (d->flow == LeftToRight)
+                        d->highlightXAnimator->to = d->currentItem->item->x();
+                    else
+                        d->highlightYAnimator->to = d->currentItem->item->y();
+                }
+            }
+        }
+    }
+}
+
+qreal QSGGridView::minYExtent() const
+{
+    Q_D(const QSGGridView);
+    if (d->flow == QSGGridView::TopToBottom)
+        return QSGFlickable::minYExtent();
+    qreal extent = -d->startPosition();
+    if (d->header && d->visibleItems.count())
+        extent += d->header->item->height();
+    if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+        extent += d->highlightRangeStart;
+        extent = qMax(extent, -(d->rowPosAt(0) + d->rowSize() - d->highlightRangeEnd));
+    }
+    return extent;
+}
+
+qreal QSGGridView::maxYExtent() const
+{
+    Q_D(const QSGGridView);
+    if (d->flow == QSGGridView::TopToBottom)
+        return QSGFlickable::maxYExtent();
+    qreal extent;
+    if (!d->model || !d->model->count()) {
+        extent = 0;
+    } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+        extent = -(d->rowPosAt(d->model->count()-1) - d->highlightRangeStart);
+        if (d->highlightRangeEnd != d->highlightRangeStart)
+            extent = qMin(extent, -(d->endPosition() - d->highlightRangeEnd + 1));
+    } else {
+        extent = -(d->endPosition() - height());
+    }
+    if (d->footer)
+        extent -= d->footer->item->height();
+    const qreal minY = minYExtent();
+    if (extent > minY)
+        extent = minY;
+    return extent;
+}
+
+qreal QSGGridView::minXExtent() const
+{
+    Q_D(const QSGGridView);
+    if (d->flow == QSGGridView::LeftToRight)
+        return QSGFlickable::minXExtent();
+    qreal extent = -d->startPosition();
+    qreal highlightStart;
+    qreal highlightEnd;
+    qreal endPositionFirstItem;
+    if (d->isRightToLeftTopToBottom()) {
+        endPositionFirstItem = d->rowPosAt(d->model->count()-1);
+        highlightStart = d->highlightRangeStartValid
+                ? d->highlightRangeStart - (d->lastPosition()-endPositionFirstItem)
+                : d->size() - (d->lastPosition()-endPositionFirstItem);
+        highlightEnd = d->highlightRangeEndValid ? d->highlightRangeEnd : d->size();
+        if (d->footer && d->visibleItems.count())
+            extent += d->footer->item->width();
+    } else {
+        endPositionFirstItem = d->rowPosAt(0)+d->rowSize();
+        highlightStart = d->highlightRangeStart;
+        highlightEnd = d->highlightRangeEnd;
+        if (d->header && d->visibleItems.count())
+            extent += d->header->item->width();
+    }
+    if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+        extent += highlightStart;
+        extent = qMax(extent, -(endPositionFirstItem - highlightEnd));
+    }
+    return extent;
+}
+
+qreal QSGGridView::maxXExtent() const
+{
+    Q_D(const QSGGridView);
+    if (d->flow == QSGGridView::LeftToRight)
+        return QSGFlickable::maxXExtent();
+    qreal extent;
+    qreal highlightStart;
+    qreal highlightEnd;
+    qreal lastItemPosition;
+    if (d->isRightToLeftTopToBottom()){
+        highlightStart = d->highlightRangeStartValid ? d->highlightRangeEnd : d->size();
+        highlightEnd = d->highlightRangeEndValid ? d->highlightRangeStart : d->size();
+        lastItemPosition = d->endPosition();
+    } else {
+        highlightStart = d->highlightRangeStart;
+        highlightEnd = d->highlightRangeEnd;
+        if (d->model && d->model->count())
+            lastItemPosition = d->rowPosAt(d->model->count()-1);
+    }
+    if (!d->model || !d->model->count()) {
+        extent = 0;
+    } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+        extent = -(lastItemPosition - highlightStart);
+        if (highlightEnd != highlightStart)
+            extent = d->isRightToLeftTopToBottom()
+                    ? qMax(extent, -(d->endPosition() - highlightEnd + 1))
+                    : qMin(extent, -(d->endPosition() - highlightEnd + 1));
+    } else {
+        extent = -(d->endPosition() - width());
+    }
+    if (d->isRightToLeftTopToBottom()) {
+        if (d->header)
+            extent -= d->header->item->width();
+    } else {
+        if (d->footer)
+            extent -= d->footer->item->width();
+    }
+
+    const qreal minX = minXExtent();
+    if (extent > minX)
+        extent = minX;
+    return extent;
+}
+
+void QSGGridView::keyPressEvent(QKeyEvent *event)
+{
+    Q_D(QSGGridView);
+    if (d->model && d->model->count() && d->interactive) {
+        d->moveReason = QSGGridViewPrivate::SetIndex;
+        int oldCurrent = currentIndex();
+        switch (event->key()) {
+        case Qt::Key_Up:
+            moveCurrentIndexUp();
+            break;
+        case Qt::Key_Down:
+            moveCurrentIndexDown();
+            break;
+        case Qt::Key_Left:
+            moveCurrentIndexLeft();
+            break;
+        case Qt::Key_Right:
+            moveCurrentIndexRight();
+            break;
+        default:
+            break;
+        }
+        if (oldCurrent != currentIndex()) {
+            event->accept();
+            return;
+        }
+    }
+    d->moveReason = QSGGridViewPrivate::Other;
+    event->ignore();
+    QSGFlickable::keyPressEvent(event);
+}
+
+void QSGGridView::moveCurrentIndexUp()
+{
+    Q_D(QSGGridView);
+    const int count = d->model ? d->model->count() : 0;
+    if (!count)
+        return;
+    if (d->flow == QSGGridView::LeftToRight) {
+        if (currentIndex() >= d->columns || d->wrap) {
+            int index = currentIndex() - d->columns;
+            setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+        }
+    } else {
+        if (currentIndex() > 0 || d->wrap) {
+            int index = currentIndex() - 1;
+            setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+        }
+    }
+}
+
+void QSGGridView::moveCurrentIndexDown()
+{
+    Q_D(QSGGridView);
+    const int count = d->model ? d->model->count() : 0;
+    if (!count)
+        return;
+    if (d->flow == QSGGridView::LeftToRight) {
+        if (currentIndex() < count - d->columns || d->wrap) {
+            int index = currentIndex()+d->columns;
+            setCurrentIndex((index >= 0 && index < count) ? index : 0);
+        }
+    } else {
+        if (currentIndex() < count - 1 || d->wrap) {
+            int index = currentIndex() + 1;
+            setCurrentIndex((index >= 0 && index < count) ? index : 0);
+        }
+    }
+}
+
+void QSGGridView::moveCurrentIndexLeft()
+{
+    Q_D(QSGGridView);
+    const int count = d->model ? d->model->count() : 0;
+    if (!count)
+        return;
+    if (effectiveLayoutDirection() == Qt::LeftToRight) {
+        if (d->flow == QSGGridView::LeftToRight) {
+            if (currentIndex() > 0 || d->wrap) {
+                int index = currentIndex() - 1;
+                setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+            }
+        } else {
+            if (currentIndex() >= d->columns || d->wrap) {
+                int index = currentIndex() - d->columns;
+                setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+            }
+        }
+    } else {
+        if (d->flow == QSGGridView::LeftToRight) {
+            if (currentIndex() < count - 1 || d->wrap) {
+                int index = currentIndex() + 1;
+                setCurrentIndex((index >= 0 && index < count) ? index : 0);
+            }
+        } else {
+            if (currentIndex() < count - d->columns || d->wrap) {
+                int index = currentIndex() + d->columns;
+                setCurrentIndex((index >= 0 && index < count) ? index : 0);
+            }
+        }
+    }
+}
+
+void QSGGridView::moveCurrentIndexRight()
+{
+    Q_D(QSGGridView);
+    const int count = d->model ? d->model->count() : 0;
+    if (!count)
+        return;
+    if (effectiveLayoutDirection() == Qt::LeftToRight) {
+        if (d->flow == QSGGridView::LeftToRight) {
+            if (currentIndex() < count - 1 || d->wrap) {
+                int index = currentIndex() + 1;
+                setCurrentIndex((index >= 0 && index < count) ? index : 0);
+            }
+        } else {
+            if (currentIndex() < count - d->columns || d->wrap) {
+                int index = currentIndex()+d->columns;
+                setCurrentIndex((index >= 0 && index < count) ? index : 0);
+            }
+        }
+    } else {
+        if (d->flow == QSGGridView::LeftToRight) {
+            if (currentIndex() > 0 || d->wrap) {
+                int index = currentIndex() - 1;
+                setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+            }
+        } else {
+            if (currentIndex() >= d->columns || d->wrap) {
+                int index = currentIndex() - d->columns;
+                setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+            }
+        }
+    }
+}
+
+void QSGGridViewPrivate::positionViewAtIndex(int index, int mode)
+{
+    Q_Q(QSGGridView);
+    if (!isValid())
+        return;
+    if (mode < QSGGridView::Beginning || mode > QSGGridView::Contain)
+        return;
+
+    int idx = qMax(qMin(index, model->count()-1), 0);
+
+    if (layoutScheduled)
+        layout();
+    qreal pos = isRightToLeftTopToBottom() ? -position() - size() : position();
+    FxGridItemSG *item = visibleItem(idx);
+    qreal maxExtent;
+    if (flow == QSGGridView::LeftToRight)
+        maxExtent = -q->maxYExtent();
+    else
+        maxExtent = isRightToLeftTopToBottom() ? q->minXExtent()-size() : -q->maxXExtent();
+    if (!item) {
+        int itemPos = rowPosAt(idx);
+        // save the currently visible items in case any of them end up visible again
+        QList<FxGridItemSG*> oldVisible = visibleItems;
+        visibleItems.clear();
+        visibleIndex = idx - idx % columns;
+        if (flow == QSGGridView::LeftToRight)
+            maxExtent = -q->maxYExtent();
+        else
+            maxExtent = isRightToLeftTopToBottom() ? q->minXExtent()-size() : -q->maxXExtent();
+        setPosition(qMin(qreal(itemPos), maxExtent));
+        // now release the reference to all the old visible items.
+        for (int i = 0; i < oldVisible.count(); ++i)
+            releaseItem(oldVisible.at(i));
+        item = visibleItem(idx);
+    }
+    if (item) {
+        qreal itemPos = item->rowPos();
+        switch (mode) {
+        case QSGGridView::Beginning:
+            pos = itemPos;
+            if (index < 0 && header) {
+                pos -= flow == QSGGridView::LeftToRight
+                            ? header->item->height()
+                            : header->item->width();
+            }
+            break;
+        case QSGGridView::Center:
+            pos = itemPos - (size() - rowSize())/2;
+            break;
+        case QSGGridView::End:
+            pos = itemPos - size() + rowSize();
+            if (index >= model->count() && footer) {
+                pos += flow == QSGGridView::LeftToRight
+                            ? footer->item->height()
+                            : footer->item->width();
+            }
+            break;
+        case QSGGridView::Visible:
+            if (itemPos > pos + size())
+                pos = itemPos - size() + rowSize();
+            else if (item->endRowPos() < pos)
+                pos = itemPos;
+            break;
+        case QSGGridView::Contain:
+            if (item->endRowPos() > pos + size())
+                pos = itemPos - size() + rowSize();
+            if (itemPos < pos)
+                pos = itemPos;
+        }
+        pos = qMin(pos, maxExtent);
+        qreal minExtent;
+        if (flow == QSGGridView::LeftToRight)
+            minExtent = -q->minYExtent();
+        else
+            minExtent = isRightToLeftTopToBottom() ? q->maxXExtent()-size() : -q->minXExtent();
+        pos = qMax(pos, minExtent);
+        moveReason = QSGGridViewPrivate::Other;
+        q->cancelFlick();
+        setPosition(pos);
+    }
+    fixupPosition();
+}
+
+void QSGGridView::positionViewAtIndex(int index, int mode)
+{
+    Q_D(QSGGridView);
+    if (!d->isValid() || index < 0 || index >= d->model->count())
+        return;
+    d->positionViewAtIndex(index, mode);
+}
+
+void QSGGridView::positionViewAtBeginning()
+{
+    Q_D(QSGGridView);
+    if (!d->isValid())
+        return;
+    d->positionViewAtIndex(-1, Beginning);
+}
+
+void QSGGridView::positionViewAtEnd()
+{
+    Q_D(QSGGridView);
+    if (!d->isValid())
+        return;
+    d->positionViewAtIndex(d->model->count(), End);
+}
+
+int QSGGridView::indexAt(qreal x, qreal y) const
+{
+    Q_D(const QSGGridView);
+    for (int i = 0; i < d->visibleItems.count(); ++i) {
+        const FxGridItemSG *listItem = d->visibleItems.at(i);
+        if(listItem->contains(x, y))
+            return listItem->index;
+    }
+
+    return -1;
+}
+
+void QSGGridView::componentComplete()
+{
+    Q_D(QSGGridView);
+    QSGFlickable::componentComplete();
+    d->updateHeader();
+    d->updateFooter();
+    d->updateGrid();
+    if (d->isValid()) {
+        refill();
+        d->moveReason = QSGGridViewPrivate::SetIndex;
+        if (d->currentIndex < 0 && !d->currentIndexCleared)
+            d->updateCurrent(0);
+        else
+            d->updateCurrent(d->currentIndex);
+        if (d->highlight && d->currentItem) {
+            if (d->autoHighlight)
+                d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+            d->updateTrackedItem();
+        }
+        d->moveReason = QSGGridViewPrivate::Other;
+        d->fixupPosition();
+    }
+}
+
+void QSGGridView::trackedPositionChanged()
+{
+    Q_D(QSGGridView);
+    if (!d->trackedItem || !d->currentItem)
+        return;
+    if (d->moveReason == QSGGridViewPrivate::SetIndex) {
+        const qreal trackedPos = d->trackedItem->rowPos();
+        qreal viewPos;
+        qreal highlightStart;
+        qreal highlightEnd;
+        if (d->isRightToLeftTopToBottom()) {
+            viewPos = -d->position()-d->size();
+            highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
+        } else {
+            viewPos = d->position();
+            highlightStart = d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEnd;
+        }
+        qreal pos = viewPos;
+        if (d->haveHighlightRange) {
+            if (d->highlightRange == StrictlyEnforceRange) {
+                if (trackedPos > pos + highlightEnd - d->rowSize())
+                    pos = trackedPos - highlightEnd + d->rowSize();
+                if (trackedPos < pos + highlightStart)
+                    pos = trackedPos - highlightStart;
+            } else {
+                if (trackedPos < d->startPosition() + highlightStart) {
+                    pos = d->startPosition();
+                } else if (d->trackedItem->endRowPos() > d->endPosition() - d->size() + highlightEnd) {
+                    pos = d->endPosition() - d->size() + 1;
+                    if (pos < d->startPosition())
+                        pos = d->startPosition();
+                } else {
+                    if (trackedPos < viewPos + highlightStart) {
+                        pos = trackedPos - highlightStart;
+                    } else if (trackedPos > viewPos + highlightEnd - d->rowSize()) {
+                        pos = trackedPos - highlightEnd + d->rowSize();
+                    }
+                }
+            }
+        } else {
+            if (trackedPos < viewPos && d->currentItem->rowPos() < viewPos) {
+                pos = qMax(trackedPos, d->currentItem->rowPos());
+            } else if (d->trackedItem->endRowPos() >= viewPos + d->size()
+                && d->currentItem->endRowPos() >= viewPos + d->size()) {
+                if (d->trackedItem->endRowPos() <= d->currentItem->endRowPos()) {
+                    pos = d->trackedItem->endRowPos() - d->size() + 1;
+                    if (d->rowSize() > d->size())
+                        pos = trackedPos;
+                } else {
+                    pos = d->currentItem->endRowPos() - d->size() + 1;
+                    if (d->rowSize() > d->size())
+                        pos = d->currentItem->rowPos();
+                }
+            }
+        }
+        if (viewPos != pos) {
+            cancelFlick();
+            d->calcVelocity = true;
+            d->setPosition(pos);
+            d->calcVelocity = false;
+        }
+    }
+}
+
+void QSGGridView::itemsInserted(int modelIndex, int count)
+{
+    Q_D(QSGGridView);
+    if (!isComponentComplete())
+        return;
+
+    int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
+    if (index < 0) {
+        int i = d->visibleItems.count() - 1;
+        while (i > 0 && d->visibleItems.at(i)->index == -1)
+            --i;
+        if (d->visibleItems.at(i)->index + 1 == modelIndex) {
+            // Special case of appending an item to the model.
+            index = d->visibleIndex + d->visibleItems.count();
+        } else {
+            if (modelIndex <= d->visibleIndex) {
+                // Insert before visible items
+                d->visibleIndex += count;
+                for (int i = 0; i < d->visibleItems.count(); ++i) {
+                    FxGridItemSG *listItem = d->visibleItems.at(i);
+                    if (listItem->index != -1 && listItem->index >= modelIndex)
+                        listItem->index += count;
+                }
+            }
+            if (d->currentIndex >= modelIndex) {
+                // adjust current item index
+                d->currentIndex += count;
+                if (d->currentItem)
+                    d->currentItem->index = d->currentIndex;
+                emit currentIndexChanged();
+            }
+            d->scheduleLayout();
+            d->itemCount += count;
+            emit countChanged();
+            return;
+        }
+    }
+
+    int insertCount = count;
+    if (index < d->visibleIndex && d->visibleItems.count()) {
+        insertCount -= d->visibleIndex - index;
+        index = d->visibleIndex;
+        modelIndex = d->visibleIndex;
+    }
+
+    qreal tempPos = d->isRightToLeftTopToBottom() ? -d->position()-d->size()+width()+1 : d->position();
+    int to = d->buffer+tempPos+d->size()-1;
+    int colPos = 0;
+    int rowPos = 0;
+    if (d->visibleItems.count()) {
+        index -= d->visibleIndex;
+        if (index < d->visibleItems.count()) {
+            colPos = d->visibleItems.at(index)->colPos();
+            rowPos = d->visibleItems.at(index)->rowPos();
+        } else {
+            // appending items to visible list
+            colPos = d->visibleItems.at(index-1)->colPos() + d->colSize();
+            rowPos = d->visibleItems.at(index-1)->rowPos();
+            if (colPos > d->colSize() * (d->columns-1)) {
+                colPos = 0;
+                rowPos += d->rowSize();
+            }
+        }
+    } else if (d->itemCount == 0 && d->header) {
+        rowPos = d->headerSize();
+    }
+
+    // Update the indexes of the following visible items.
+    for (int i = 0; i < d->visibleItems.count(); ++i) {
+        FxGridItemSG *listItem = d->visibleItems.at(i);
+        if (listItem->index != -1 && listItem->index >= modelIndex)
+            listItem->index += count;
+    }
+
+    bool addedVisible = false;
+    QList<FxGridItemSG*> added;
+    int i = 0;
+    while (i < insertCount && rowPos <= to + d->rowSize()*(d->columns - (colPos/d->colSize()))/qreal(d->columns)) {
+        if (!addedVisible) {
+            d->scheduleLayout();
+            addedVisible = true;
+        }
+        FxGridItemSG *item = d->createItem(modelIndex + i);
+        d->visibleItems.insert(index, item);
+        item->setPosition(colPos, rowPos);
+        added.append(item);
+        colPos += d->colSize();
+        if (colPos > d->colSize() * (d->columns-1)) {
+            colPos = 0;
+            rowPos += d->rowSize();
+        }
+        ++index;
+        ++i;
+    }
+    if (i < insertCount) {
+        // We didn't insert all our new items, which means anything
+        // beyond the current index is not visible - remove it.
+        while (d->visibleItems.count() > index) {
+            d->releaseItem(d->visibleItems.takeLast());
+        }
+    }
+
+    // update visibleIndex
+    d->visibleIndex = 0;
+    for (QList<FxGridItemSG*>::Iterator it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
+        if ((*it)->index != -1) {
+            d->visibleIndex = (*it)->index;
+            break;
+        }
+    }
+
+    if (d->itemCount && d->currentIndex >= modelIndex) {
+        // adjust current item index
+        d->currentIndex += count;
+        if (d->currentItem) {
+            d->currentItem->index = d->currentIndex;
+            d->currentItem->setPosition(d->colPosAt(d->currentIndex), d->rowPosAt(d->currentIndex));
+        } else if (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared)) {
+            d->updateCurrent(0);
+        }
+        emit currentIndexChanged();
+    } else if (d->itemCount == 0 && d->currentIndex == -1) {
+        setCurrentIndex(0);
+    }
+
+    // everything is in order now - emit add() signal
+    for (int j = 0; j < added.count(); ++j)
+        added.at(j)->attached->emitAdd();
+
+    d->itemCount += count;
+    emit countChanged();
+}
+
+void QSGGridView::itemsRemoved(int modelIndex, int count)
+{
+    Q_D(QSGGridView);
+    if (!isComponentComplete())
+        return;
+
+    d->itemCount -= count;
+    bool currentRemoved = d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count;
+    bool removedVisible = false;
+
+    // Remove the items from the visible list, skipping anything already marked for removal
+    QList<FxGridItemSG*>::Iterator it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxGridItemSG *item = *it;
+        if (item->index == -1 || item->index < modelIndex) {
+            // already removed, or before removed items
+            if (item->index < modelIndex && !removedVisible) {
+                d->scheduleLayout();
+                removedVisible = true;
+            }
+            ++it;
+        } else if (item->index >= modelIndex + count) {
+            // after removed items
+            item->index -= count;
+            ++it;
+        } else {
+            // removed item
+            if (!removedVisible) {
+                d->scheduleLayout();
+                removedVisible = true;
+            }
+            item->attached->emitRemove();
+            if (item->attached->delayRemove()) {
+                item->index = -1;
+                connect(item->attached, SIGNAL(delayRemoveChanged()), this, SLOT(destroyRemoved()), Qt::QueuedConnection);
+                ++it;
+            } else {
+                it = d->visibleItems.erase(it);
+                d->releaseItem(item);
+            }
+        }
+    }
+
+    // fix current
+    if (d->currentIndex >= modelIndex + count) {
+        d->currentIndex -= count;
+        if (d->currentItem)
+            d->currentItem->index -= count;
+        emit currentIndexChanged();
+    } else if (currentRemoved) {
+        // current item has been removed.
+        d->releaseItem(d->currentItem);
+        d->currentItem = 0;
+        d->currentIndex = -1;
+        if (d->itemCount)
+            d->updateCurrent(qMin(modelIndex, d->itemCount-1));
+    }
+
+    // update visibleIndex
+    d->visibleIndex = 0;
+    for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
+        if ((*it)->index != -1) {
+            d->visibleIndex = (*it)->index;
+            break;
+        }
+    }
+
+    if (removedVisible && d->visibleItems.isEmpty()) {
+        d->timeline.clear();
+        if (d->itemCount == 0) {
+            d->setPosition(0);
+            d->updateHeader();
+            d->updateFooter();
+        }
+    }
+
+    emit countChanged();
+}
+
+void QSGGridView::destroyRemoved()
+{
+    Q_D(QSGGridView);
+    for (QList<FxGridItemSG*>::Iterator it = d->visibleItems.begin();
+            it != d->visibleItems.end();) {
+        FxGridItemSG *listItem = *it;
+        if (listItem->index == -1 && listItem->attached->delayRemove() == false) {
+            d->releaseItem(listItem);
+            it = d->visibleItems.erase(it);
+        } else {
+            ++it;
+        }
+    }
+
+    // Correct the positioning of the items
+    d->layout();
+}
+
+void QSGGridView::itemsMoved(int from, int to, int count)
+{
+    Q_D(QSGGridView);
+    if (!isComponentComplete())
+        return;
+    QHash<int,FxGridItemSG*> moved;
+
+    FxGridItemSG *firstItem = d->firstVisibleItem();
+
+    QList<FxGridItemSG*>::Iterator it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxGridItemSG *item = *it;
+        if (item->index >= from && item->index < from + count) {
+            // take the items that are moving
+            item->index += (to-from);
+            moved.insert(item->index, item);
+            it = d->visibleItems.erase(it);
+        } else {
+            if (item->index > from && item->index != -1) {
+                // move everything after the moved items.
+                item->index -= count;
+                if (item->index < d->visibleIndex)
+                    d->visibleIndex = item->index;
+            }
+            ++it;
+        }
+    }
+
+    int remaining = count;
+    int endIndex = d->visibleIndex;
+    it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxGridItemSG *item = *it;
+        if (remaining && item->index >= to && item->index < to + count) {
+            // place items in the target position, reusing any existing items
+            FxGridItemSG *movedItem = moved.take(item->index);
+            if (!movedItem)
+                movedItem = d->createItem(item->index);
+            it = d->visibleItems.insert(it, movedItem);
+            if (it == d->visibleItems.begin() && firstItem)
+                movedItem->setPosition(firstItem->colPos(), firstItem->rowPos());
+            ++it;
+            --remaining;
+        } else {
+            if (item->index != -1) {
+                if (item->index >= to) {
+                    // update everything after the moved items.
+                    item->index += count;
+                }
+                endIndex = item->index;
+            }
+            ++it;
+        }
+    }
+
+    // If we have moved items to the end of the visible items
+    // then add any existing moved items that we have
+    while (FxGridItemSG *item = moved.take(endIndex+1)) {
+        d->visibleItems.append(item);
+        ++endIndex;
+    }
+
+    // update visibleIndex
+    for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
+        if ((*it)->index != -1) {
+            d->visibleIndex = (*it)->index;
+            break;
+        }
+    }
+
+    // Fix current index
+    if (d->currentIndex >= 0 && d->currentItem) {
+        int oldCurrent = d->currentIndex;
+        d->currentIndex = d->model->indexOf(d->currentItem->item, this);
+        if (oldCurrent != d->currentIndex) {
+            d->currentItem->index = d->currentIndex;
+            emit currentIndexChanged();
+        }
+    }
+
+    // Whatever moved items remain are no longer visible items.
+    while (moved.count()) {
+        int idx = moved.begin().key();
+        FxGridItemSG *item = moved.take(idx);
+        if (d->currentItem && item->item == d->currentItem->item)
+            item->setPosition(d->colPosAt(idx), d->rowPosAt(idx));
+        d->releaseItem(item);
+    }
+
+    d->layout();
+}
+
+void QSGGridView::modelReset()
+{
+    Q_D(QSGGridView);
+    d->clear();
+    refill();
+    d->moveReason = QSGGridViewPrivate::SetIndex;
+    d->updateCurrent(d->currentIndex);
+    if (d->highlight && d->currentItem) {
+        if (d->autoHighlight)
+            d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+        d->updateTrackedItem();
+    }
+    d->moveReason = QSGGridViewPrivate::Other;
+
+    emit countChanged();
+}
+
+void QSGGridView::createdItem(int index, QSGItem *item)
+{
+    Q_D(QSGGridView);
+    if (d->requestedIndex != index) {
+        item->setParentItem(this);
+        d->unrequestedItems.insert(item, index);
+        if (d->flow == QSGGridView::LeftToRight) {
+            item->setPos(QPointF(d->colPosAt(index), d->rowPosAt(index)));
+        } else {
+            item->setPos(QPointF(d->rowPosAt(index), d->colPosAt(index)));
+        }
+    }
+}
+
+void QSGGridView::destroyingItem(QSGItem *item)
+{
+    Q_D(QSGGridView);
+    d->unrequestedItems.remove(item);
+}
+
+void QSGGridView::animStopped()
+{
+    Q_D(QSGGridView);
+    d->bufferMode = QSGGridViewPrivate::NoBuffer;
+    if (d->haveHighlightRange && d->highlightRange == QSGGridView::StrictlyEnforceRange)
+        d->updateHighlight();
+}
+
+void QSGGridView::refill()
+{
+    Q_D(QSGGridView);
+    if (d->isRightToLeftTopToBottom())
+        d->refill(-d->position()-d->size()+1, -d->position());
+    else
+        d->refill(d->position(), d->position()+d->size()-1);
+}
+
+
+QSGGridViewAttached *QSGGridView::qmlAttachedProperties(QObject *obj)
+{
+    return new QSGGridViewAttached(obj);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsggridview_p.h b/src/declarative/items/qsggridview_p.h
new file mode 100644
index 0000000000..8eca17df55
--- /dev/null
+++ b/src/declarative/items/qsggridview_p.h
@@ -0,0 +1,290 @@
+// Commit: 95814418f9d6adeba365c795462e8afb00138211
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGGRIDVIEW_P_H
+#define QSGGRIDVIEW_P_H
+
+#include "qsgflickable_p.h"
+
+#include <private/qdeclarativeguard_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+class QSGVisualModel;
+class QSGGridViewAttached;
+class QSGGridViewPrivate;
+class Q_AUTOTEST_EXPORT QSGGridView : public QSGFlickable
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGGridView)
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
+    Q_PROPERTY(QSGItem *currentItem READ currentItem NOTIFY currentIndexChanged)
+    Q_PROPERTY(int count READ count NOTIFY countChanged)
+
+    Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
+    Q_PROPERTY(QSGItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
+    Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem)
+    Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
+
+    Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged RESET resetPreferredHighlightBegin)
+    Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged RESET resetPreferredHighlightEnd)
+    Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
+
+    Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
+    Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
+    Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
+    Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged)
+    Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
+    Q_PROPERTY(int cellWidth READ cellWidth WRITE setCellWidth NOTIFY cellWidthChanged)
+    Q_PROPERTY(int cellHeight READ cellHeight WRITE setCellHeight NOTIFY cellHeightChanged)
+
+    Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged)
+
+    Q_PROPERTY(QDeclarativeComponent *header READ header WRITE setHeader NOTIFY headerChanged)
+    Q_PROPERTY(QDeclarativeComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
+
+    Q_ENUMS(HighlightRangeMode)
+    Q_ENUMS(SnapMode)
+    Q_ENUMS(Flow)
+    Q_ENUMS(PositionMode)
+    Q_CLASSINFO("DefaultProperty", "data")
+
+public:
+    QSGGridView(QSGItem *parent=0);
+    ~QSGGridView();
+
+    QVariant model() const;
+    int modelCount() const;
+    void setModel(const QVariant &);
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    int currentIndex() const;
+    void setCurrentIndex(int idx);
+
+    QSGItem *currentItem();
+    QSGItem *highlightItem();
+    int count() const;
+
+    QDeclarativeComponent *highlight() const;
+    void setHighlight(QDeclarativeComponent *highlight);
+
+    bool highlightFollowsCurrentItem() const;
+    void setHighlightFollowsCurrentItem(bool);
+
+    int highlightMoveDuration() const;
+    void setHighlightMoveDuration(int);
+
+    enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
+    HighlightRangeMode highlightRangeMode() const;
+    void setHighlightRangeMode(HighlightRangeMode mode);
+
+    qreal preferredHighlightBegin() const;
+    void setPreferredHighlightBegin(qreal);
+    void resetPreferredHighlightBegin();
+
+    qreal preferredHighlightEnd() const;
+    void setPreferredHighlightEnd(qreal);
+    void resetPreferredHighlightEnd();
+
+    Qt::LayoutDirection layoutDirection() const;
+    void setLayoutDirection(Qt::LayoutDirection);
+    Qt::LayoutDirection effectiveLayoutDirection() const;
+
+    enum Flow { LeftToRight, TopToBottom };
+    Flow flow() const;
+    void setFlow(Flow);
+
+    bool isWrapEnabled() const;
+    void setWrapEnabled(bool);
+
+    int cacheBuffer() const;
+    void setCacheBuffer(int);
+
+    int cellWidth() const;
+    void setCellWidth(int);
+
+    int cellHeight() const;
+    void setCellHeight(int);
+
+    enum SnapMode { NoSnap, SnapToRow, SnapOneRow };
+    SnapMode snapMode() const;
+    void setSnapMode(SnapMode mode);
+
+    QDeclarativeComponent *footer() const;
+    void setFooter(QDeclarativeComponent *);
+
+    QDeclarativeComponent *header() const;
+    void setHeader(QDeclarativeComponent *);
+
+    virtual void setContentX(qreal pos);
+    virtual void setContentY(qreal pos);
+
+    enum PositionMode { Beginning, Center, End, Visible, Contain };
+
+    Q_INVOKABLE void positionViewAtIndex(int index, int mode);
+    Q_INVOKABLE int indexAt(qreal x, qreal y) const;
+    Q_INVOKABLE void positionViewAtBeginning();
+    Q_INVOKABLE void positionViewAtEnd();
+
+    static QSGGridViewAttached *qmlAttachedProperties(QObject *);
+
+public Q_SLOTS:
+    void moveCurrentIndexUp();
+    void moveCurrentIndexDown();
+    void moveCurrentIndexLeft();
+    void moveCurrentIndexRight();
+
+Q_SIGNALS:
+    void countChanged();
+    void currentIndexChanged();
+    void cellWidthChanged();
+    void cellHeightChanged();
+    void highlightChanged();
+    void highlightItemChanged();
+    void preferredHighlightBeginChanged();
+    void preferredHighlightEndChanged();
+    void highlightRangeModeChanged();
+    void highlightMoveDurationChanged();
+    void modelChanged();
+    void delegateChanged();
+    void flowChanged();
+    void layoutDirectionChanged();
+    void effectiveLayoutDirectionChanged();
+    void keyNavigationWrapsChanged();
+    void cacheBufferChanged();
+    void snapModeChanged();
+    void headerChanged();
+    void footerChanged();
+
+protected:
+    virtual void updatePolish();
+    virtual void viewportMoved();
+    virtual qreal minYExtent() const;
+    virtual qreal maxYExtent() const;
+    virtual qreal minXExtent() const;
+    virtual qreal maxXExtent() const;
+    virtual void keyPressEvent(QKeyEvent *);
+    virtual void componentComplete();
+
+private Q_SLOTS:
+    void trackedPositionChanged();
+    void itemsInserted(int index, int count);
+    void itemsRemoved(int index, int count);
+    void itemsMoved(int from, int to, int count);
+    void modelReset();
+    void destroyRemoved();
+    void createdItem(int index, QSGItem *item);
+    void destroyingItem(QSGItem *item);
+    void animStopped();
+
+private:
+    void refill();
+};
+
+class QSGGridViewAttached : public QObject
+{
+    Q_OBJECT
+public:
+    QSGGridViewAttached(QObject *parent)
+        : QObject(parent), m_view(0), m_isCurrent(false), m_delayRemove(false) {}
+    ~QSGGridViewAttached() {}
+
+    Q_PROPERTY(QSGGridView *view READ view NOTIFY viewChanged)
+    QSGGridView *view() { return m_view; }
+    void setView(QSGGridView *view) {
+        if (view != m_view) {
+            m_view = view;
+            emit viewChanged();
+        }
+    }
+
+    Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
+    bool isCurrentItem() const { return m_isCurrent; }
+    void setIsCurrentItem(bool c) {
+        if (m_isCurrent != c) {
+            m_isCurrent = c;
+            emit currentItemChanged();
+        }
+    }
+
+    Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
+    bool delayRemove() const { return m_delayRemove; }
+    void setDelayRemove(bool delay) {
+        if (m_delayRemove != delay) {
+            m_delayRemove = delay;
+            emit delayRemoveChanged();
+        }
+    }
+
+    void emitAdd() { emit add(); }
+    void emitRemove() { emit remove(); }
+
+Q_SIGNALS:
+    void currentItemChanged();
+    void delayRemoveChanged();
+    void add();
+    void remove();
+    void viewChanged();
+
+public:
+    QDeclarativeGuard<QSGGridView> m_view;
+    bool m_isCurrent : 1;
+    bool m_delayRemove : 1;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGGridView)
+QML_DECLARE_TYPEINFO(QSGGridView, QML_HAS_ATTACHED_PROPERTIES)
+
+QT_END_HEADER
+
+#endif // QSGGRIDVIEW_P_H
diff --git a/src/declarative/items/qsgimage.cpp b/src/declarative/items/qsgimage.cpp
new file mode 100644
index 0000000000..6f63555b81
--- /dev/null
+++ b/src/declarative/items/qsgimage.cpp
@@ -0,0 +1,288 @@
+// Commit: 695a39410c8ce186a2ce78cef51093c55fc32643
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgimage_p.h"
+#include "qsgimage_p_p.h"
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+
+#include <QtGui/qpainter.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGImagePrivate::QSGImagePrivate()
+    : fillMode(QSGImage::Stretch)
+    , paintedWidth(0)
+    , paintedHeight(0)
+    , pixmapChanged(false)
+{
+}
+
+QSGImage::QSGImage(QSGItem *parent)
+    : QSGImageBase(*(new QSGImagePrivate), parent)
+{
+}
+
+QSGImage::QSGImage(QSGImagePrivate &dd, QSGItem *parent)
+    : QSGImageBase(dd, parent)
+{
+}
+
+QSGImage::~QSGImage()
+{
+}
+
+void QSGImagePrivate::setPixmap(const QPixmap &pixmap)
+{
+    Q_Q(QSGImage);
+    pix.setPixmap(pixmap);
+
+    q->setImplicitWidth(pix.width());
+    q->setImplicitHeight(pix.height());
+    status = pix.isNull() ? QSGImageBase::Null : QSGImageBase::Ready;
+
+    q->update();
+    q->pixmapChange();
+}
+
+QSGImage::FillMode QSGImage::fillMode() const
+{
+    Q_D(const QSGImage);
+    return d->fillMode;
+}
+
+void QSGImage::setFillMode(FillMode mode)
+{
+    Q_D(QSGImage);
+    if (d->fillMode == mode)
+        return;
+    d->fillMode = mode;
+    update();
+    updatePaintedGeometry();
+    emit fillModeChanged();
+}
+
+qreal QSGImage::paintedWidth() const
+{
+    Q_D(const QSGImage);
+    return d->paintedWidth;
+}
+
+qreal QSGImage::paintedHeight() const
+{
+    Q_D(const QSGImage);
+    return d->paintedHeight;
+}
+
+void QSGImage::updatePaintedGeometry()
+{
+    Q_D(QSGImage);
+
+    if (d->fillMode == PreserveAspectFit) {
+        if (!d->pix.width() || !d->pix.height())
+            return;
+        qreal w = widthValid() ? width() : d->pix.width();
+        qreal widthScale = w / qreal(d->pix.width());
+        qreal h = heightValid() ? height() : d->pix.height();
+        qreal heightScale = h / qreal(d->pix.height());
+        if (widthScale <= heightScale) {
+            d->paintedWidth = w;
+            d->paintedHeight = widthScale * qreal(d->pix.height());
+        } else if(heightScale < widthScale) {
+            d->paintedWidth = heightScale * qreal(d->pix.width());
+            d->paintedHeight = h;
+        }
+        if (widthValid() && !heightValid()) {
+            setImplicitHeight(d->paintedHeight);
+        }
+        if (heightValid() && !widthValid()) {
+            setImplicitWidth(d->paintedWidth);
+        }
+    } else if (d->fillMode == PreserveAspectCrop) {
+        if (!d->pix.width() || !d->pix.height())
+            return;
+        qreal widthScale = width() / qreal(d->pix.width());
+        qreal heightScale = height() / qreal(d->pix.height());
+        if (widthScale < heightScale) {
+            widthScale = heightScale;
+        } else if(heightScale < widthScale) {
+            heightScale = widthScale;
+        }
+
+        d->paintedHeight = heightScale * qreal(d->pix.height());
+        d->paintedWidth = widthScale * qreal(d->pix.width());
+    } else {
+        d->paintedWidth = width();
+        d->paintedHeight = height();
+    }
+    emit paintedGeometryChanged();
+}
+
+void QSGImage::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    QSGImageBase::geometryChanged(newGeometry, oldGeometry);
+    updatePaintedGeometry();
+}
+
+QRectF QSGImage::boundingRect() const
+{
+    Q_D(const QSGImage);
+    return QRectF(0, 0, qMax(width(), d->paintedWidth), qMax(height(), d->paintedHeight));
+}
+
+QSGTexture *QSGImage::texture() const
+{
+    Q_D(const QSGImage);
+    QSGTexture *t = d->pix.texture();
+    t->setFiltering(QSGItemPrivate::get(this)->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
+    t->setMipmapFiltering(QSGTexture::None);
+    t->setHorizontalWrapMode(QSGTexture::ClampToEdge);
+    t->setVerticalWrapMode(QSGTexture::ClampToEdge);
+    return t;
+}
+
+QSGNode *QSGImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+    Q_D(QSGImage);
+    //XXX Support mirror property
+
+    if (!d->pix.texture() || width() <= 0 || height() <= 0) {
+        delete oldNode;
+        return 0;
+    }
+
+    QSGImageNode *node = static_cast<QSGImageNode *>(oldNode);
+    if (!node) { 
+        d->pixmapChanged = true;
+        node = d->sceneGraphContext()->createImageNode();
+        node->setTexture(d->pix.texture());
+    }
+
+    if (d->pixmapChanged) {
+        // force update the texture in the node to trigger reconstruction of
+        // geometry and the likes when a atlas segment has changed.
+        QSGTexture *t = d->pix.texture();
+        node->setTexture(0);
+        node->setTexture(t);
+        d->pixmapChanged = false;
+    }
+
+    QRectF targetRect;
+    QRectF sourceRect;
+    QSGTexture::WrapMode hWrap = QSGTexture::ClampToEdge;
+    QSGTexture::WrapMode vWrap = QSGTexture::ClampToEdge;
+
+    switch (d->fillMode) {
+    default:
+    case Stretch:
+        targetRect = QRectF(0, 0, width(), height());
+        sourceRect = d->pix.rect();
+        break;
+
+    case PreserveAspectFit:
+        targetRect = QRectF((width() - d->paintedWidth) / 2., (height() - d->paintedHeight) / 2.,
+                            d->paintedWidth, d->paintedHeight);
+        sourceRect = d->pix.rect();
+        break;
+
+    case PreserveAspectCrop: {
+        targetRect = QRect(0, 0, width(), height());
+        qreal wscale = width() / qreal(d->pix.width());
+        qreal hscale = height() / qreal(d->pix.height());
+
+        if (wscale > hscale) {
+            int src = (hscale / wscale) * qreal(d->pix.height());
+            sourceRect = QRectF(0, (d->pix.height() - src) / 2, d->pix.width(), src);
+        } else {
+            int src = (wscale / hscale) * qreal(d->pix.width());
+            sourceRect = QRectF((d->pix.width() - src) / 2, 0, src, d->pix.height());
+        }
+    }
+        break;
+
+    case Tile:
+        targetRect = QRectF(0, 0, width(), height());
+        sourceRect = QRectF(0, 0, width(), height());
+        hWrap = QSGTexture::Repeat;
+        vWrap = QSGTexture::Repeat;
+        break;
+
+    case TileHorizontally:
+        targetRect = QRectF(0, 0, width(), height());
+        sourceRect = QRectF(0, 0, width(), d->pix.height());
+        hWrap = QSGTexture::Repeat;
+        break;
+
+    case TileVertically:
+        targetRect = QRectF(0, 0, width(), height());
+        sourceRect = QRectF(0, 0, d->pix.width(), height());
+        vWrap = QSGTexture::Repeat;
+        break;
+
+    };
+
+    QRectF nsrect(sourceRect.x() / d->pix.width(),
+                  1 - sourceRect.y() / d->pix.height(),
+                  sourceRect.width() / d->pix.width(),
+                  -sourceRect.height() / d->pix.height());
+
+    node->setHorizontalWrapMode(hWrap);
+    node->setVerticalWrapMode(vWrap);
+    node->setFiltering(d->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
+
+    node->setTargetRect(targetRect);
+    node->setSourceRect(nsrect);
+    node->update();
+
+    return node;
+}
+
+void QSGImage::pixmapChange()
+{
+    Q_D(QSGImage);
+
+    updatePaintedGeometry();
+    d->pixmapChanged = true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgimage_p.h b/src/declarative/items/qsgimage_p.h
new file mode 100644
index 0000000000..aad63d42c0
--- /dev/null
+++ b/src/declarative/items/qsgimage_p.h
@@ -0,0 +1,104 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMAGE_P_H
+#define QSGIMAGE_P_H
+
+#include "qsgimagebase_p.h"
+#include <private/qsgtextureprovider_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGImagePrivate;
+class Q_AUTOTEST_EXPORT QSGImage : public QSGImageBase, public QSGTextureProvider
+{
+    Q_OBJECT
+    Q_ENUMS(FillMode)
+
+    Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
+    Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedGeometryChanged)
+    Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedGeometryChanged)
+    Q_PROPERTY(QSGTexture *texture READ texture)
+
+    Q_INTERFACES(QSGTextureProvider)
+
+public:
+    QSGImage(QSGItem *parent=0);
+    ~QSGImage();
+
+    enum FillMode { Stretch, PreserveAspectFit, PreserveAspectCrop, Tile, TileVertically, TileHorizontally };
+    FillMode fillMode() const;
+    void setFillMode(FillMode);
+
+    qreal paintedWidth() const;
+    qreal paintedHeight() const;
+
+    QRectF boundingRect() const;
+
+    virtual QSGTexture *texture() const;
+
+Q_SIGNALS:
+    void fillModeChanged();
+    void paintedGeometryChanged();
+
+protected:
+    QSGImage(QSGImagePrivate &dd, QSGItem *parent);
+    void pixmapChange();
+    void updatePaintedGeometry();
+
+    virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private:
+    Q_DISABLE_COPY(QSGImage)
+    Q_DECLARE_PRIVATE(QSGImage)
+};
+
+QT_END_NAMESPACE
+QML_DECLARE_TYPE(QSGImage)
+QT_END_HEADER
+
+#endif // QSGIMAGE_P_H
diff --git a/src/declarative/items/qsgimage_p_p.h b/src/declarative/items/qsgimage_p_p.h
new file mode 100644
index 0000000000..01b549df1f
--- /dev/null
+++ b/src/declarative/items/qsgimage_p_p.h
@@ -0,0 +1,81 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMAGE_P_P_H
+#define QSGIMAGE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgimagebase_p_p.h"
+#include "qsgimage_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGImagePrivate;
+
+class QSGImagePrivate : public QSGImageBasePrivate
+{
+    Q_DECLARE_PUBLIC(QSGImage)
+
+public:
+    QSGImagePrivate();
+
+    QSGImage::FillMode fillMode;
+    qreal paintedWidth;
+    qreal paintedHeight;
+    void setPixmap(const QPixmap &pix);
+
+    bool pixmapChanged : 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGIMAGE_P_P_H
diff --git a/src/declarative/items/qsgimagebase.cpp b/src/declarative/items/qsgimagebase.cpp
new file mode 100644
index 0000000000..bd8b24f735
--- /dev/null
+++ b/src/declarative/items/qsgimagebase.cpp
@@ -0,0 +1,273 @@
+// Commit: 462429f5692f810bdd4e04b916db5f9af428d9e4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgimagebase_p.h"
+#include "qsgimagebase_p_p.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGImageBase::QSGImageBase(QSGItem *parent)
+: QSGImplicitSizeItem(*(new QSGImageBasePrivate), parent)
+{
+    setFlag(ItemHasContents);
+}
+
+QSGImageBase::QSGImageBase(QSGImageBasePrivate &dd, QSGItem *parent)
+: QSGImplicitSizeItem(dd, parent)
+{
+    setFlag(ItemHasContents);
+}
+
+QSGImageBase::~QSGImageBase()
+{
+}
+
+QSGImageBase::Status QSGImageBase::status() const
+{
+    Q_D(const QSGImageBase);
+    return d->status;
+}
+
+
+qreal QSGImageBase::progress() const
+{
+    Q_D(const QSGImageBase);
+    return d->progress;
+}
+
+
+bool QSGImageBase::asynchronous() const
+{
+    Q_D(const QSGImageBase);
+    return d->async;
+}
+
+void QSGImageBase::setAsynchronous(bool async)
+{
+    Q_D(QSGImageBase);
+    if (d->async != async) {
+        d->async = async;
+        emit asynchronousChanged();
+    }
+}
+
+QUrl QSGImageBase::source() const
+{
+    Q_D(const QSGImageBase);
+    return d->url;
+}
+
+void QSGImageBase::setSource(const QUrl &url)
+{
+    Q_D(QSGImageBase);
+    //equality is fairly expensive, so we bypass for simple, common case
+    if ((d->url.isEmpty() == url.isEmpty()) && url == d->url)
+        return;
+
+    d->url = url;
+    emit sourceChanged(d->url);
+
+    if (isComponentComplete())
+        load();
+}
+
+void QSGImageBase::setSourceSize(const QSize& size)
+{
+    Q_D(QSGImageBase);
+    if (d->sourcesize == size)
+        return;
+
+    d->sourcesize = size;
+    d->explicitSourceSize = true;
+    emit sourceSizeChanged();
+    if (isComponentComplete())
+        load();
+}
+
+QSize QSGImageBase::sourceSize() const
+{
+    Q_D(const QSGImageBase);
+
+    int width = d->sourcesize.width();
+    int height = d->sourcesize.height();
+    return QSize(width != -1 ? width : d->pix.width(), height != -1 ? height : d->pix.height());
+}
+
+bool QSGImageBase::cache() const
+{
+    Q_D(const QSGImageBase);
+    return d->cache;
+}
+
+void QSGImageBase::setCache(bool cache)
+{
+    Q_D(QSGImageBase);
+    if (d->cache == cache)
+        return;
+
+    d->cache = cache;
+    emit cacheChanged();
+    if (isComponentComplete())
+        load();
+}
+
+void QSGImageBase::setMirror(bool mirror)
+{
+    Q_D(QSGImageBase);
+    if (mirror == d->mirror)
+        return;
+
+    d->mirror = mirror;
+
+    if (isComponentComplete())
+        update();
+
+    emit mirrorChanged();
+}
+
+bool QSGImageBase::mirror() const
+{
+    Q_D(const QSGImageBase);
+    return d->mirror;
+}
+
+void QSGImageBase::load()
+{
+    Q_D(QSGImageBase);
+
+    if (d->url.isEmpty()) {
+        d->pix.clear(this);
+        d->status = Null;
+        d->progress = 0.0;
+        setImplicitWidth(0);
+        setImplicitHeight(0);
+        emit progressChanged(d->progress);
+        emit statusChanged(d->status);
+        pixmapChange();
+        update();
+    } else {
+        QDeclarativePixmap::Options options;
+        if (d->async)
+            options |= QDeclarativePixmap::Asynchronous;
+        if (d->cache)
+            options |= QDeclarativePixmap::Cache;
+        d->pix.clear(this);
+        d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), options);
+
+        if (d->pix.isLoading()) {
+            d->progress = 0.0;
+            d->status = Loading;
+            emit progressChanged(d->progress);
+            emit statusChanged(d->status);
+
+            static int thisRequestProgress = -1;
+            static int thisRequestFinished = -1;
+            if (thisRequestProgress == -1) {
+                thisRequestProgress =
+                    QSGImageBase::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)");
+                thisRequestFinished =
+                    QSGImageBase::staticMetaObject.indexOfSlot("requestFinished()");
+            }
+
+            d->pix.connectFinished(this, thisRequestFinished);
+            d->pix.connectDownloadProgress(this, thisRequestProgress);
+
+        } else {
+            requestFinished();
+        }
+    }
+}
+
+void QSGImageBase::requestFinished()
+{
+    Q_D(QSGImageBase);
+
+    QSGImageBase::Status oldStatus = d->status;
+    qreal oldProgress = d->progress;
+
+    if (d->pix.isError()) {
+        d->status = Error;
+        qmlInfo(this) << d->pix.error();
+    } else {
+        d->status = Ready;
+    }
+
+    d->progress = 1.0;
+
+    setImplicitWidth(d->pix.width());
+    setImplicitHeight(d->pix.height());
+
+    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
+        emit sourceSizeChanged();
+
+    if (d->status != oldStatus)
+        emit statusChanged(d->status);
+    if (d->progress != oldProgress)
+        emit progressChanged(d->progress);
+    pixmapChange();
+    update();
+}
+
+void QSGImageBase::requestProgress(qint64 received, qint64 total)
+{
+    Q_D(QSGImageBase);
+    if (d->status == Loading && total > 0) {
+        d->progress = qreal(received)/total;
+        emit progressChanged(d->progress);
+    }
+}
+
+void QSGImageBase::componentComplete()
+{
+    Q_D(QSGImageBase);
+    QSGItem::componentComplete();
+    if (d->url.isValid())
+        load();
+}
+
+void QSGImageBase::pixmapChange()
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgimagebase_p.h b/src/declarative/items/qsgimagebase_p.h
new file mode 100644
index 0000000000..fe42854304
--- /dev/null
+++ b/src/declarative/items/qsgimagebase_p.h
@@ -0,0 +1,116 @@
+// Commit: ab71df83ba4eb9d749efc0f3a2d4a0fe5486023f
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMAGEBASE_P_H
+#define QSGIMAGEBASE_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QSGImageBasePrivate;
+class Q_AUTOTEST_EXPORT QSGImageBase : public QSGImplicitSizeItem
+{
+    Q_OBJECT
+    Q_ENUMS(Status)
+
+    Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+    Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
+    Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged)
+    Q_PROPERTY(bool cache READ cache WRITE setCache NOTIFY cacheChanged)
+    Q_PROPERTY(QSize sourceSize READ sourceSize WRITE setSourceSize NOTIFY sourceSizeChanged)
+    Q_PROPERTY(bool mirror READ mirror WRITE setMirror NOTIFY mirrorChanged)
+
+public:
+    QSGImageBase(QSGItem *parent=0);
+    ~QSGImageBase();
+    enum Status { Null, Ready, Loading, Error };
+    Status status() const;
+    qreal progress() const;
+
+    QUrl source() const;
+    virtual void setSource(const QUrl &url);
+
+    bool asynchronous() const;
+    void setAsynchronous(bool);
+
+    bool cache() const;
+    void setCache(bool);
+
+    virtual void setSourceSize(const QSize&);
+    QSize sourceSize() const;
+
+    virtual void setMirror(bool mirror);
+    bool mirror() const;
+
+Q_SIGNALS:
+    void sourceChanged(const QUrl &);
+    void sourceSizeChanged();
+    void statusChanged(QSGImageBase::Status);
+    void progressChanged(qreal progress);
+    void asynchronousChanged();
+    void cacheChanged();
+    void mirrorChanged();
+
+protected:
+    virtual void load();
+    virtual void componentComplete();
+    virtual void pixmapChange();
+    QSGImageBase(QSGImageBasePrivate &dd, QSGItem *parent);
+
+private Q_SLOTS:
+    virtual void requestFinished();
+    void requestProgress(qint64,qint64);
+
+private:
+    Q_DISABLE_COPY(QSGImageBase)
+    Q_DECLARE_PRIVATE(QSGImageBase)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGIMAGEBASE_P_H
diff --git a/src/declarative/items/qsgimagebase_p_p.h b/src/declarative/items/qsgimagebase_p_p.h
new file mode 100644
index 0000000000..8c67b41e8b
--- /dev/null
+++ b/src/declarative/items/qsgimagebase_p_p.h
@@ -0,0 +1,93 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMAGEBASE_P_P_H
+#define QSGIMAGEBASE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgimplicitsizeitem_p_p.h"
+#include "qsgimagebase_p.h"
+
+#include <private/qdeclarativepixmapcache_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkReply;
+class QSGImageBasePrivate : public QSGImplicitSizeItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGImageBase)
+
+public:
+    QSGImageBasePrivate()
+      : status(QSGImageBase::Null),
+        progress(0.0),
+        explicitSourceSize(false),
+        async(false),
+        cache(true),
+        mirror(false)
+    {
+    }
+
+    QDeclarativePixmap pix;
+    QSGImageBase::Status status;
+    QUrl url;
+    qreal progress;
+    QSize sourcesize;
+    bool explicitSourceSize : 1;
+    bool async : 1;
+    bool cache : 1;
+    bool mirror: 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGIMAGEBASE_P_P_H
diff --git a/src/declarative/items/qsgimplicitsizeitem.cpp b/src/declarative/items/qsgimplicitsizeitem.cpp
new file mode 100644
index 0000000000..f2cc9bcbdb
--- /dev/null
+++ b/src/declarative/items/qsgimplicitsizeitem.cpp
@@ -0,0 +1,93 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "private/qsgimplicitsizeitem_p.h"
+#include "private/qsgimplicitsizeitem_p_p.h"
+
+QT_BEGIN_NAMESPACE
+
+void QSGImplicitSizeItemPrivate::implicitWidthChanged()
+{
+    Q_Q(QSGImplicitSizeItem);
+    emit q->implicitWidthChanged();
+}
+
+void QSGImplicitSizeItemPrivate::implicitHeightChanged()
+{
+    Q_Q(QSGImplicitSizeItem);
+    emit q->implicitHeightChanged();
+}
+
+QSGImplicitSizeItem::QSGImplicitSizeItem(QSGItem *parent)
+    : QSGItem(*(new QSGImplicitSizeItemPrivate), parent)
+{
+}
+
+QSGImplicitSizeItem::QSGImplicitSizeItem(QSGImplicitSizeItemPrivate &dd, QSGItem *parent)
+    : QSGItem(dd, parent)
+{
+}
+
+
+void QSGImplicitSizePaintedItemPrivate::implicitWidthChanged()
+{
+    Q_Q(QSGImplicitSizePaintedItem);
+    emit q->implicitWidthChanged();
+}
+
+void QSGImplicitSizePaintedItemPrivate::implicitHeightChanged()
+{
+    Q_Q(QSGImplicitSizePaintedItem);
+    emit q->implicitHeightChanged();
+}
+
+QSGImplicitSizePaintedItem::QSGImplicitSizePaintedItem(QSGItem *parent)
+    : QSGPaintedItem(*(new QSGImplicitSizePaintedItemPrivate), parent)
+{
+}
+
+QSGImplicitSizePaintedItem::QSGImplicitSizePaintedItem(QSGImplicitSizePaintedItemPrivate &dd, QSGItem *parent)
+    : QSGPaintedItem(dd, parent)
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgimplicitsizeitem_p.h b/src/declarative/items/qsgimplicitsizeitem_p.h
new file mode 100644
index 0000000000..36ef0e7f8b
--- /dev/null
+++ b/src/declarative/items/qsgimplicitsizeitem_p.h
@@ -0,0 +1,101 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMPLICITSIZEITEM_H
+#define QSGIMPLICITSIZEITEM_H
+
+#include "qsgpainteditem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QSGImplicitSizeItemPrivate;
+class Q_AUTOTEST_EXPORT QSGImplicitSizeItem : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged)
+    Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged)
+
+public:
+    QSGImplicitSizeItem(QSGItem *parent = 0);
+
+protected:
+    QSGImplicitSizeItem(QSGImplicitSizeItemPrivate &dd, QSGItem *parent);
+
+Q_SIGNALS:
+    void implicitWidthChanged();
+    void implicitHeightChanged();
+
+private:
+    Q_DISABLE_COPY(QSGImplicitSizeItem)
+    Q_DECLARE_PRIVATE(QSGImplicitSizeItem)
+};
+
+class QSGImplicitSizePaintedItemPrivate;
+class Q_AUTOTEST_EXPORT QSGImplicitSizePaintedItem : public QSGPaintedItem
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged)
+    Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged)
+
+public:
+    QSGImplicitSizePaintedItem(QSGItem *parent = 0);
+
+protected:
+    QSGImplicitSizePaintedItem(QSGImplicitSizePaintedItemPrivate &dd, QSGItem *parent);
+    virtual void drawContents(QPainter *, const QRect &) {};
+
+Q_SIGNALS:
+    void implicitWidthChanged();
+    void implicitHeightChanged();
+
+private:
+    Q_DISABLE_COPY(QSGImplicitSizePaintedItem)
+    Q_DECLARE_PRIVATE(QSGImplicitSizePaintedItem)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGIMPLICITSIZEITEM_H
diff --git a/src/declarative/items/qsgimplicitsizeitem_p_p.h b/src/declarative/items/qsgimplicitsizeitem_p_p.h
new file mode 100644
index 0000000000..f67ecfab9f
--- /dev/null
+++ b/src/declarative/items/qsgimplicitsizeitem_p_p.h
@@ -0,0 +1,92 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGIMPLICITSIZEITEM_P_H
+#define QSGIMPLICITSIZEITEM_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "private/qsgitem_p.h"
+#include "private/qsgpainteditem_p.h"
+#include "private/qsgimplicitsizeitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGImplicitSizeItemPrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGImplicitSizeItem)
+
+public:
+    QSGImplicitSizeItemPrivate()
+    {
+    }
+
+    virtual void implicitWidthChanged();
+    virtual void implicitHeightChanged();
+};
+
+
+class QSGImplicitSizePaintedItemPrivate : public QSGPaintedItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGImplicitSizePaintedItem)
+
+public:
+    QSGImplicitSizePaintedItemPrivate()
+    {
+    }
+
+    virtual void implicitWidthChanged();
+    virtual void implicitHeightChanged();
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGIMPLICITSIZEITEM_P_H
diff --git a/src/declarative/items/qsgitem.cpp b/src/declarative/items/qsgitem.cpp
new file mode 100644
index 0000000000..b0df6b1a04
--- /dev/null
+++ b/src/declarative/items/qsgitem.cpp
@@ -0,0 +1,3143 @@
+// Commit: c44be8c0b27756a2025ebad1945632f3f7e4bebc
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgitem.h"
+
+#include "qsgcanvas.h"
+#include <QtScript/qscriptengine.h>
+#include "qsgcanvas_p.h"
+
+#include "qsgevents_p_p.h"
+
+#include <QtDeclarative/qdeclarativeitem.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativeview.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qgraphicstransform.h>
+#include <QtGui/qpen.h>
+#include <QtGui/qinputcontext.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qcoreevent.h>
+#include <QtCore/qnumeric.h>
+
+#include <private/qdeclarativeengine_p.h>
+#include <private/qdeclarativestategroup_p.h>
+#include <private/qdeclarativeopenmetaobject_p.h>
+#include <private/qdeclarativestate_p.h>
+#include <private/qlistmodelinterface_p.h>
+#include <private/qsgitem_p.h>
+
+#include <float.h>
+
+// XXX todo Readd parentNotifier for faster parent bindings
+// XXX todo Check that elements that create items handle memory correctly after visual ownership change
+
+QT_BEGIN_NAMESPACE
+
+QSGTransformPrivate::QSGTransformPrivate()
+{
+}
+
+QSGTransform::QSGTransform(QObject *parent)
+: QObject(*(new QSGTransformPrivate), parent)
+{
+}
+
+QSGTransform::QSGTransform(QSGTransformPrivate &dd, QObject *parent)
+: QObject(dd, parent)
+{
+}
+
+QSGTransform::~QSGTransform()
+{
+    Q_D(QSGTransform);
+    for (int ii = 0; ii < d->items.count(); ++ii) {
+        QSGItemPrivate *p = QSGItemPrivate::get(d->items.at(ii));
+        p->transforms.removeOne(this);
+        p->dirty(QSGItemPrivate::Transform);
+    }
+}
+
+void QSGTransform::update()
+{
+    Q_D(QSGTransform);
+    for (int ii = 0; ii < d->items.count(); ++ii) {
+        QSGItemPrivate *p = QSGItemPrivate::get(d->items.at(ii));
+        p->dirty(QSGItemPrivate::Transform);
+    }
+}
+
+QSGContents::QSGContents(QSGItem *item) 
+: m_item(item), m_x(0), m_y(0), m_width(0), m_height(0)
+{
+    //### optimize
+    connect(this, SIGNAL(rectChanged(QRectF)), m_item, SIGNAL(childrenRectChanged(QRectF)));
+}
+
+QSGContents::~QSGContents()
+{
+    QList<QSGItem *> children = m_item->childItems();
+    for (int i = 0; i < children.count(); ++i) {
+        QSGItem *child = children.at(i);
+        QSGItemPrivate::get(child)->removeItemChangeListener(this, QSGItemPrivate::Geometry | QSGItemPrivate::Destroyed);
+    }
+}
+
+QRectF QSGContents::rectF() const
+{
+    return QRectF(m_x, m_y, m_width, m_height);
+}
+
+void QSGContents::calcHeight(QSGItem *changed)
+{
+    qreal oldy = m_y;
+    qreal oldheight = m_height;
+
+    if (changed) {
+        qreal top = oldy;
+        qreal bottom = oldy + oldheight;
+        qreal y = changed->y();
+        if (y + changed->height() > bottom)
+            bottom = y + changed->height();
+        if (y < top)
+            top = y;
+        m_y = top;
+        m_height = bottom - top;
+    } else {
+        qreal top = FLT_MAX;
+        qreal bottom = 0;
+        QList<QSGItem *> children = m_item->childItems();
+        for (int i = 0; i < children.count(); ++i) {
+            QSGItem *child = children.at(i);
+            qreal y = child->y();
+            if (y + child->height() > bottom)
+                bottom = y + child->height();
+            if (y < top)
+                top = y;
+        }
+        if (!children.isEmpty())
+            m_y = top;
+        m_height = qMax(bottom - top, qreal(0.0));
+    }
+
+    if (m_height != oldheight || m_y != oldy)
+        emit rectChanged(rectF());
+}
+
+void QSGContents::calcWidth(QSGItem *changed)
+{
+    qreal oldx = m_x;
+    qreal oldwidth = m_width;
+
+    if (changed) {
+        qreal left = oldx;
+        qreal right = oldx + oldwidth;
+        qreal x = changed->x();
+        if (x + changed->width() > right)
+            right = x + changed->width();
+        if (x < left)
+            left = x;
+        m_x = left;
+        m_width = right - left;
+    } else {
+        qreal left = FLT_MAX;
+        qreal right = 0;
+        QList<QSGItem *> children = m_item->childItems();
+        for (int i = 0; i < children.count(); ++i) {
+            QSGItem *child = children.at(i);
+            qreal x = child->x();
+            if (x + child->width() > right)
+                right = x + child->width();
+            if (x < left)
+                left = x;
+        }
+        if (!children.isEmpty())
+            m_x = left;
+        m_width = qMax(right - left, qreal(0.0));
+    }
+
+    if (m_width != oldwidth || m_x != oldx)
+        emit rectChanged(rectF());
+}
+
+void QSGContents::complete()
+{
+    QList<QSGItem *> children = m_item->childItems();
+    for (int i = 0; i < children.count(); ++i) {
+        QSGItem *child = children.at(i);
+        QSGItemPrivate::get(child)->addItemChangeListener(this, QSGItemPrivate::Geometry | QSGItemPrivate::Destroyed);
+        //###what about changes to visibility?
+    }
+
+    calcGeometry();
+}
+
+void QSGContents::itemGeometryChanged(QSGItem *changed, const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_UNUSED(changed)
+    //### we can only pass changed if the left edge has moved left, or the right edge has moved right
+    if (newGeometry.width() != oldGeometry.width() || newGeometry.x() != oldGeometry.x())
+        calcWidth(/*changed*/);
+    if (newGeometry.height() != oldGeometry.height() || newGeometry.y() != oldGeometry.y())
+        calcHeight(/*changed*/);
+}
+
+void QSGContents::itemDestroyed(QSGItem *item)
+{
+    if (item)
+        QSGItemPrivate::get(item)->removeItemChangeListener(this, QSGItemPrivate::Geometry | QSGItemPrivate::Destroyed);
+    calcGeometry();
+}
+
+void QSGContents::childRemoved(QSGItem *item)
+{
+    if (item)
+        QSGItemPrivate::get(item)->removeItemChangeListener(this, QSGItemPrivate::Geometry | QSGItemPrivate::Destroyed);
+    calcGeometry();
+}
+
+void QSGContents::childAdded(QSGItem *item)
+{
+    if (item)
+        QSGItemPrivate::get(item)->addItemChangeListener(this, QSGItemPrivate::Geometry | QSGItemPrivate::Destroyed);
+    calcWidth(item);
+    calcHeight(item);
+}
+
+QSGItemKeyFilter::QSGItemKeyFilter(QSGItem *item)
+: m_processPost(false), m_next(0)
+{
+    QSGItemPrivate *p = item?QSGItemPrivate::get(item):0;
+    if (p) {
+        m_next = p->keyHandler;
+        p->keyHandler = this;
+    }
+}
+
+QSGItemKeyFilter::~QSGItemKeyFilter()
+{
+}
+
+void QSGItemKeyFilter::keyPressed(QKeyEvent *event, bool post)
+{
+    if (m_next) m_next->keyPressed(event, post);
+}
+
+void QSGItemKeyFilter::keyReleased(QKeyEvent *event, bool post)
+{
+    if (m_next) m_next->keyReleased(event, post);
+}
+
+void QSGItemKeyFilter::inputMethodEvent(QInputMethodEvent *event, bool post)
+{
+    if (m_next)
+        m_next->inputMethodEvent(event, post);
+    else
+        event->ignore();
+}
+
+QVariant QSGItemKeyFilter::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+    if (m_next) return m_next->inputMethodQuery(query);
+    return QVariant();
+}
+
+void QSGItemKeyFilter::componentComplete()
+{
+    if (m_next) m_next->componentComplete();
+}
+
+QSGKeyNavigationAttached::QSGKeyNavigationAttached(QObject *parent)
+: QObject(*(new QSGKeyNavigationAttachedPrivate), parent),
+  QSGItemKeyFilter(qobject_cast<QSGItem*>(parent))
+{
+    m_processPost = true;
+}
+
+QSGKeyNavigationAttached *
+QSGKeyNavigationAttached::qmlAttachedProperties(QObject *obj)
+{
+    return new QSGKeyNavigationAttached(obj);
+}
+
+QSGItem *QSGKeyNavigationAttached::left() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->left;
+}
+
+void QSGKeyNavigationAttached::setLeft(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->left == i)
+        return;
+    d->left = i;
+    d->leftSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if (other && !other->d_func()->rightSet){
+        other->d_func()->right = qobject_cast<QSGItem*>(parent());
+        emit other->rightChanged();
+    }
+    emit leftChanged();
+}
+
+QSGItem *QSGKeyNavigationAttached::right() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->right;
+}
+
+void QSGKeyNavigationAttached::setRight(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->right == i)
+        return;
+    d->right = i;
+    d->rightSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if (other && !other->d_func()->leftSet){
+        other->d_func()->left = qobject_cast<QSGItem*>(parent());
+        emit other->leftChanged();
+    }
+    emit rightChanged();
+}
+
+QSGItem *QSGKeyNavigationAttached::up() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->up;
+}
+
+void QSGKeyNavigationAttached::setUp(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->up == i)
+        return;
+    d->up = i;
+    d->upSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if (other && !other->d_func()->downSet){
+        other->d_func()->down = qobject_cast<QSGItem*>(parent());
+        emit other->downChanged();
+    }
+    emit upChanged();
+}
+
+QSGItem *QSGKeyNavigationAttached::down() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->down;
+}
+
+void QSGKeyNavigationAttached::setDown(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->down == i)
+        return;
+    d->down = i;
+    d->downSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if(other && !other->d_func()->upSet){
+        other->d_func()->up = qobject_cast<QSGItem*>(parent());
+        emit other->upChanged();
+    }
+    emit downChanged();
+}
+
+QSGItem *QSGKeyNavigationAttached::tab() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->tab;
+}
+
+void QSGKeyNavigationAttached::setTab(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->tab == i)
+        return;
+    d->tab = i;
+    d->tabSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if(other && !other->d_func()->backtabSet){
+        other->d_func()->backtab = qobject_cast<QSGItem*>(parent());
+        emit other->backtabChanged();
+    }
+    emit tabChanged();
+}
+
+QSGItem *QSGKeyNavigationAttached::backtab() const
+{
+    Q_D(const QSGKeyNavigationAttached);
+    return d->backtab;
+}
+
+void QSGKeyNavigationAttached::setBacktab(QSGItem *i)
+{
+    Q_D(QSGKeyNavigationAttached);
+    if (d->backtab == i)
+        return;
+    d->backtab = i;
+    d->backtabSet = true;
+    QSGKeyNavigationAttached* other =
+            qobject_cast<QSGKeyNavigationAttached*>(qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(i));
+    if(other && !other->d_func()->tabSet){
+        other->d_func()->tab = qobject_cast<QSGItem*>(parent());
+        emit other->tabChanged();
+    }
+    emit backtabChanged();
+}
+
+QSGKeyNavigationAttached::Priority QSGKeyNavigationAttached::priority() const
+{
+    return m_processPost ? AfterItem : BeforeItem;
+}
+
+void QSGKeyNavigationAttached::setPriority(Priority order)
+{
+    bool processPost = order == AfterItem;
+    if (processPost != m_processPost) {
+        m_processPost = processPost;
+        emit priorityChanged();
+    }
+}
+
+void QSGKeyNavigationAttached::keyPressed(QKeyEvent *event, bool post)
+{
+    Q_D(QSGKeyNavigationAttached);
+    event->ignore();
+
+    if (post != m_processPost) {
+        QSGItemKeyFilter::keyPressed(event, post);
+        return;
+    }
+
+    bool mirror = false;
+    switch(event->key()) {
+    case Qt::Key_Left: {
+        if (QSGItem *parentItem = qobject_cast<QSGItem*>(parent()))
+            mirror = QSGItemPrivate::get(parentItem)->effectiveLayoutMirror;
+        QSGItem* leftItem = mirror ? d->right : d->left;
+        if (leftItem) {
+            setFocusNavigation(leftItem, mirror ? "right" : "left");
+            event->accept();
+        }
+        break;
+    }
+    case Qt::Key_Right: {
+        if (QSGItem *parentItem = qobject_cast<QSGItem*>(parent()))
+            mirror = QSGItemPrivate::get(parentItem)->effectiveLayoutMirror;
+        QSGItem* rightItem = mirror ? d->left : d->right;
+        if (rightItem) {
+            setFocusNavigation(rightItem, mirror ? "left" : "right");
+            event->accept();
+        }
+        break;
+    }
+    case Qt::Key_Up:
+        if (d->up) {
+            setFocusNavigation(d->up, "up");
+            event->accept();
+        }
+        break;
+    case Qt::Key_Down:
+        if (d->down) {
+            setFocusNavigation(d->down, "down");
+            event->accept();
+        }
+        break;
+    case Qt::Key_Tab:
+        if (d->tab) {
+            setFocusNavigation(d->tab, "tab");
+            event->accept();
+        }
+        break;
+    case Qt::Key_Backtab:
+        if (d->backtab) {
+            setFocusNavigation(d->backtab, "backtab");
+            event->accept();
+        }
+        break;
+    default:
+        break;
+    }
+
+    if (!event->isAccepted()) QSGItemKeyFilter::keyPressed(event, post);
+}
+
+void QSGKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
+{
+    Q_D(QSGKeyNavigationAttached);
+    event->ignore();
+
+    if (post != m_processPost) {
+        QSGItemKeyFilter::keyReleased(event, post);
+        return;
+    }
+
+    bool mirror = false;
+    switch(event->key()) {
+    case Qt::Key_Left:
+        if (QSGItem *parentItem = qobject_cast<QSGItem*>(parent()))
+            mirror = QSGItemPrivate::get(parentItem)->effectiveLayoutMirror;
+        if (mirror ? d->right : d->left)
+            event->accept();
+        break;
+    case Qt::Key_Right:
+        if (QSGItem *parentItem = qobject_cast<QSGItem*>(parent()))
+            mirror = QSGItemPrivate::get(parentItem)->effectiveLayoutMirror;
+        if (mirror ? d->left : d->right)
+            event->accept();
+        break;
+    case Qt::Key_Up:
+        if (d->up) {
+            event->accept();
+        }
+        break;
+    case Qt::Key_Down:
+        if (d->down) {
+            event->accept();
+        }
+        break;
+    case Qt::Key_Tab:
+        if (d->tab) {
+            event->accept();
+        }
+        break;
+    case Qt::Key_Backtab:
+        if (d->backtab) {
+            event->accept();
+        }
+        break;
+    default:
+        break;
+    }
+
+    if (!event->isAccepted()) QSGItemKeyFilter::keyReleased(event, post);
+}
+
+void QSGKeyNavigationAttached::setFocusNavigation(QSGItem *currentItem, const char *dir)
+{
+    QSGItem *initialItem = currentItem;
+    bool isNextItem = false;
+    do {
+        isNextItem = false;
+        if (currentItem->isVisible() && currentItem->isEnabled()) {
+            currentItem->setFocus(true);
+        } else {
+            QObject *attached =
+                qmlAttachedPropertiesObject<QSGKeyNavigationAttached>(currentItem, false);
+            if (attached) {
+                QSGItem *tempItem = qvariant_cast<QSGItem*>(attached->property(dir));
+                if (tempItem) {
+                    currentItem = tempItem;
+                    isNextItem = true;
+                }
+            }
+        }
+    }
+    while (currentItem != initialItem && isNextItem);
+}
+
+const QSGKeysAttached::SigMap QSGKeysAttached::sigMap[] = {
+    { Qt::Key_Left, "leftPressed" },
+    { Qt::Key_Right, "rightPressed" },
+    { Qt::Key_Up, "upPressed" },
+    { Qt::Key_Down, "downPressed" },
+    { Qt::Key_Tab, "tabPressed" },
+    { Qt::Key_Backtab, "backtabPressed" },
+    { Qt::Key_Asterisk, "asteriskPressed" },
+    { Qt::Key_NumberSign, "numberSignPressed" },
+    { Qt::Key_Escape, "escapePressed" },
+    { Qt::Key_Return, "returnPressed" },
+    { Qt::Key_Enter, "enterPressed" },
+    { Qt::Key_Delete, "deletePressed" },
+    { Qt::Key_Space, "spacePressed" },
+    { Qt::Key_Back, "backPressed" },
+    { Qt::Key_Cancel, "cancelPressed" },
+    { Qt::Key_Select, "selectPressed" },
+    { Qt::Key_Yes, "yesPressed" },
+    { Qt::Key_No, "noPressed" },
+    { Qt::Key_Context1, "context1Pressed" },
+    { Qt::Key_Context2, "context2Pressed" },
+    { Qt::Key_Context3, "context3Pressed" },
+    { Qt::Key_Context4, "context4Pressed" },
+    { Qt::Key_Call, "callPressed" },
+    { Qt::Key_Hangup, "hangupPressed" },
+    { Qt::Key_Flip, "flipPressed" },
+    { Qt::Key_Menu, "menuPressed" },
+    { Qt::Key_VolumeUp, "volumeUpPressed" },
+    { Qt::Key_VolumeDown, "volumeDownPressed" },
+    { 0, 0 }
+};
+
+bool QSGKeysAttachedPrivate::isConnected(const char *signalName)
+{
+    return isSignalConnected(signalIndex(signalName));
+}
+
+QSGKeysAttached::QSGKeysAttached(QObject *parent)
+: QObject(*(new QSGKeysAttachedPrivate), parent),
+  QSGItemKeyFilter(qobject_cast<QSGItem*>(parent))
+{
+    Q_D(QSGKeysAttached);
+    m_processPost = false;
+    d->item = qobject_cast<QSGItem*>(parent);
+}
+
+QSGKeysAttached::~QSGKeysAttached()
+{
+}
+
+QSGKeysAttached::Priority QSGKeysAttached::priority() const
+{
+    return m_processPost ? AfterItem : BeforeItem;
+}
+
+void QSGKeysAttached::setPriority(Priority order)
+{
+    bool processPost = order == AfterItem;
+    if (processPost != m_processPost) {
+        m_processPost = processPost;
+        emit priorityChanged();
+    }
+}
+
+void QSGKeysAttached::componentComplete()
+{
+    Q_D(QSGKeysAttached);
+    if (d->item) {
+        for (int ii = 0; ii < d->targets.count(); ++ii) {
+            QSGItem *targetItem = d->targets.at(ii);
+            if (targetItem && (targetItem->flags() & QSGItem::ItemAcceptsInputMethod)) {
+                d->item->setFlag(QSGItem::ItemAcceptsInputMethod);
+                break;
+            }
+        }
+    }
+}
+
+void QSGKeysAttached::keyPressed(QKeyEvent *event, bool post)
+{
+    Q_D(QSGKeysAttached);
+    if (post != m_processPost || !d->enabled || d->inPress) {
+        event->ignore();
+        QSGItemKeyFilter::keyPressed(event, post);
+        return;
+    }
+
+    // first process forwards
+    if (d->item && d->item->canvas()) {
+        d->inPress = true;
+        for (int ii = 0; ii < d->targets.count(); ++ii) {
+            QSGItem *i = d->targets.at(ii);
+            if (i && i->isVisible()) {
+                d->item->canvas()->sendEvent(i, event);
+                if (event->isAccepted()) {
+                    d->inPress = false;
+                    return;
+                }
+            }
+        }
+        d->inPress = false;
+    }
+
+    QSGKeyEvent ke(*event);
+    QByteArray keySignal = keyToSignal(event->key());
+    if (!keySignal.isEmpty()) {
+        keySignal += "(QSGKeyEvent*)";
+        if (d->isConnected(keySignal)) {
+            // If we specifically handle a key then default to accepted
+            ke.setAccepted(true);
+            int idx = QSGKeysAttached::staticMetaObject.indexOfSignal(keySignal);
+            metaObject()->method(idx).invoke(this, Qt::DirectConnection, Q_ARG(QSGKeyEvent*, &ke));
+        }
+    }
+    if (!ke.isAccepted())
+        emit pressed(&ke);
+    event->setAccepted(ke.isAccepted());
+
+    if (!event->isAccepted()) QSGItemKeyFilter::keyPressed(event, post);
+}
+
+void QSGKeysAttached::keyReleased(QKeyEvent *event, bool post)
+{
+    Q_D(QSGKeysAttached);
+    if (post != m_processPost || !d->enabled || d->inRelease) {
+        event->ignore();
+        QSGItemKeyFilter::keyReleased(event, post);
+        return;
+    }
+
+    if (d->item && d->item->canvas()) {
+        d->inRelease = true;
+        for (int ii = 0; ii < d->targets.count(); ++ii) {
+            QSGItem *i = d->targets.at(ii);
+            if (i && i->isVisible()) {
+                d->item->canvas()->sendEvent(i, event);
+                if (event->isAccepted()) {
+                    d->inRelease = false;
+                    return;
+                }
+            }
+        }
+        d->inRelease = false;
+    }
+
+    QSGKeyEvent ke(*event);
+    emit released(&ke);
+    event->setAccepted(ke.isAccepted());
+
+    if (!event->isAccepted()) QSGItemKeyFilter::keyReleased(event, post);
+}
+
+void QSGKeysAttached::inputMethodEvent(QInputMethodEvent *event, bool post)
+{
+    Q_D(QSGKeysAttached);
+    if (post == m_processPost && d->item && !d->inIM && d->item->canvas()) {
+        d->inIM = true;
+        for (int ii = 0; ii < d->targets.count(); ++ii) {
+            QSGItem *i = d->targets.at(ii);
+            if (i && i->isVisible() && (i->flags() & QSGItem::ItemAcceptsInputMethod)) {
+                d->item->canvas()->sendEvent(i, event);
+                if (event->isAccepted()) {
+                    d->imeItem = i;
+                    d->inIM = false;
+                    return;
+                }
+            }
+        }
+        d->inIM = false;
+    }
+    QSGItemKeyFilter::inputMethodEvent(event, post);
+}
+
+QVariant QSGKeysAttached::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+    Q_D(const QSGKeysAttached);
+    if (d->item) {
+        for (int ii = 0; ii < d->targets.count(); ++ii) {
+            QSGItem *i = d->targets.at(ii);
+            if (i && i->isVisible() && (i->flags() & QSGItem::ItemAcceptsInputMethod) && i == d->imeItem) { 
+                //### how robust is i == d->imeItem check?
+                QVariant v = i->inputMethodQuery(query);
+                if (v.userType() == QVariant::RectF)
+                    v = d->item->mapRectFromItem(i, v.toRectF());  //### cost?
+                return v;
+            }
+        }
+    }
+    return QSGItemKeyFilter::inputMethodQuery(query);
+}
+
+QSGKeysAttached *QSGKeysAttached::qmlAttachedProperties(QObject *obj)
+{
+    return new QSGKeysAttached(obj);
+}
+
+
+QSGLayoutMirroringAttached::QSGLayoutMirroringAttached(QObject *parent) : QObject(parent), itemPrivate(0)
+{
+    if (QSGItem *item = qobject_cast<QSGItem*>(parent)) {
+        itemPrivate = QSGItemPrivate::get(item);
+        itemPrivate->attachedLayoutDirection = this;
+    } else
+        qmlInfo(parent) << tr("LayoutDirection attached property only works with Items");
+}
+
+QSGLayoutMirroringAttached * QSGLayoutMirroringAttached::qmlAttachedProperties(QObject *object)
+{
+    return new QSGLayoutMirroringAttached(object);
+}
+
+bool QSGLayoutMirroringAttached::enabled() const
+{
+    return itemPrivate ? itemPrivate->effectiveLayoutMirror : false;
+}
+
+void QSGLayoutMirroringAttached::setEnabled(bool enabled)
+{
+    if (!itemPrivate)
+        return;
+
+    itemPrivate->isMirrorImplicit = false;
+    if (enabled != itemPrivate->effectiveLayoutMirror) {
+        itemPrivate->setLayoutMirror(enabled);
+        if (itemPrivate->inheritMirrorFromItem)
+             itemPrivate->resolveLayoutMirror();
+    }
+}
+
+void QSGLayoutMirroringAttached::resetEnabled()
+{
+    if (itemPrivate && !itemPrivate->isMirrorImplicit) {
+        itemPrivate->isMirrorImplicit = true;
+        itemPrivate->resolveLayoutMirror();
+    }
+}
+
+bool QSGLayoutMirroringAttached::childrenInherit() const
+{
+    return itemPrivate ? itemPrivate->inheritMirrorFromItem : false;
+}
+
+void QSGLayoutMirroringAttached::setChildrenInherit(bool childrenInherit) {
+    if (itemPrivate && childrenInherit != itemPrivate->inheritMirrorFromItem) {
+        itemPrivate->inheritMirrorFromItem = childrenInherit;
+        itemPrivate->resolveLayoutMirror();
+        childrenInheritChanged();
+    }
+}
+
+void QSGItemPrivate::resolveLayoutMirror()
+{
+    Q_Q(QSGItem);
+    if (QSGItem *parentItem = q->parentItem()) {
+        QSGItemPrivate *parentPrivate = QSGItemPrivate::get(parentItem);
+        setImplicitLayoutMirror(parentPrivate->inheritedLayoutMirror, parentPrivate->inheritMirrorFromParent);
+    } else {
+        setImplicitLayoutMirror(isMirrorImplicit ? false : effectiveLayoutMirror, inheritMirrorFromItem);
+    }
+}
+
+void QSGItemPrivate::setImplicitLayoutMirror(bool mirror, bool inherit)
+{
+    inherit = inherit || inheritMirrorFromItem;
+    if (!isMirrorImplicit && inheritMirrorFromItem)
+        mirror = effectiveLayoutMirror;
+    if (mirror == inheritedLayoutMirror && inherit == inheritMirrorFromParent)
+        return;
+
+    inheritMirrorFromParent = inherit;
+    inheritedLayoutMirror = inheritMirrorFromParent ? mirror : false;
+
+    if (isMirrorImplicit)
+        setLayoutMirror(inherit ? inheritedLayoutMirror : false);
+    for (int i = 0; i < childItems.count(); ++i) {
+        if (QSGItem *child = qobject_cast<QSGItem *>(childItems.at(i))) {
+            QSGItemPrivate *childPrivate = QSGItemPrivate::get(child);
+            childPrivate->setImplicitLayoutMirror(inheritedLayoutMirror, inheritMirrorFromParent);
+        }
+    }
+}
+
+void QSGItemPrivate::setLayoutMirror(bool mirror)
+{
+    if (mirror != effectiveLayoutMirror) {
+        effectiveLayoutMirror = mirror;
+        if (_anchors) {
+            QSGAnchorsPrivate *anchor_d = QSGAnchorsPrivate::get(_anchors);
+            anchor_d->fillChanged();
+            anchor_d->centerInChanged();
+            anchor_d->updateHorizontalAnchors();
+            emit _anchors->mirroredChanged();
+        }
+        mirrorChange();
+        if (attachedLayoutDirection) {
+            emit attachedLayoutDirection->enabledChanged();
+        }
+    }
+}
+
+QSGItem::QSGItem(QSGItem* parent)
+: QObject(*(new QSGItemPrivate), parent)
+{
+    Q_D(QSGItem);
+    d->init(parent);
+}
+
+QSGItem::QSGItem(QSGItemPrivate &dd, QSGItem *parent)
+: QObject(dd, parent)
+{
+    Q_D(QSGItem);
+    d->init(parent);
+}
+
+QSGItem::~QSGItem()
+{
+    Q_D(QSGItem);
+
+    // XXX todo - optimize
+    setParentItem(0);
+    while (!d->childItems.isEmpty())
+        d->childItems.first()->setParentItem(0);
+    
+    for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
+        QSGAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate();
+        if (anchor)
+            anchor->clearItem(this);
+    }
+
+    // XXX todo - the original checks if the parent is being destroyed
+    for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
+        QSGAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate();
+        if (anchor && anchor->item && anchor->item->parent() != this) //child will be deleted anyway
+            anchor->updateOnComplete();
+    }
+    
+    for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
+        const QSGItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
+        if (change.types & QSGItemPrivate::Destroyed)
+            change.listener->itemDestroyed(this);
+    }
+    d->changeListeners.clear();
+    delete d->_anchorLines; d->_anchorLines = 0;
+    delete d->_anchors; d->_anchors = 0;
+    delete d->_stateGroup; d->_stateGroup = 0;
+    delete d->_contents; d->_contents = 0;
+}
+
+void QSGItem::setParentItem(QSGItem *parentItem)
+{
+    Q_D(QSGItem);
+    if (parentItem == d->parentItem)
+        return;
+
+    d->removeFromDirtyList();
+
+    QSGItem *oldParentItem = d->parentItem;
+    QSGItem *scopeFocusedItem = 0;
+
+    if (oldParentItem) {
+        QSGItemPrivate *op = QSGItemPrivate::get(oldParentItem);
+
+        QSGItem *scopeItem = 0;
+
+        if (d->canvas && hasFocus()) {
+            scopeItem = oldParentItem;
+            while (!scopeItem->isFocusScope()) scopeItem = scopeItem->parentItem();
+            scopeFocusedItem = this;
+        } else if (d->canvas && !isFocusScope() && d->subFocusItem) {
+            scopeItem = oldParentItem;
+            while (!scopeItem->isFocusScope()) scopeItem = scopeItem->parentItem();
+            scopeFocusedItem = d->subFocusItem;
+        } 
+
+        if (scopeFocusedItem) 
+            QSGCanvasPrivate::get(d->canvas)->clearFocusInScope(scopeItem, scopeFocusedItem, 
+                                                                QSGCanvasPrivate::DontChangeFocusProperty);
+
+        op->removeChild(this);
+    }
+
+    d->parentItem = parentItem;
+
+    QSGCanvas *parentCanvas = parentItem?QSGItemPrivate::get(parentItem)->canvas:0;
+    if (d->canvas != parentCanvas) {
+        if (d->canvas && d->itemNodeInstance)
+            QSGCanvasPrivate::get(d->canvas)->cleanup(d->itemNodeInstance);
+
+        QSGItemPrivate::InitializationState initState;
+        initState.clear();
+        d->initCanvas(&initState, parentCanvas);
+    }
+
+    d->dirty(QSGItemPrivate::ParentChanged);
+    
+    if (d->parentItem)
+        QSGItemPrivate::get(d->parentItem)->addChild(this);
+
+    d->setEffectiveVisibleRecur(d->calcEffectiveVisible());
+    d->setEffectiveEnableRecur(d->calcEffectiveEnable());
+
+    if (scopeFocusedItem && d->parentItem && d->canvas) {
+        // We need to test whether this item becomes scope focused
+        QSGItem *scopeItem = 0;
+        scopeItem = d->parentItem;
+        while (!scopeItem->isFocusScope()) scopeItem = scopeItem->parentItem();
+
+        if (scopeItem->scopedFocusItem()) {
+            QSGItemPrivate::get(scopeFocusedItem)->focus = false;
+            emit scopeFocusedItem->focusChanged(false);
+        } else {
+            QSGCanvasPrivate::get(d->canvas)->setFocusInScope(scopeItem, scopeFocusedItem, 
+                                                              QSGCanvasPrivate::DontChangeFocusProperty);
+        }
+    }
+
+    d->resolveLayoutMirror();
+
+    d->itemChange(ItemParentHasChanged, d->parentItem);
+
+    emit parentChanged(d->parentItem);
+}
+
+void QSGItem::stackBefore(const QSGItem *sibling)
+{
+    Q_D(QSGItem);
+    if (!sibling || sibling == this || !d->parentItem || d->parentItem != QSGItemPrivate::get(sibling)->parentItem) {
+        qWarning("QSGItem::stackBefore: Cannot stack before %p, which must be a sibling", sibling);
+        return;
+    }
+
+    QSGItemPrivate *parentPrivate = QSGItemPrivate::get(d->parentItem);
+
+    int myIndex = parentPrivate->childItems.indexOf(this);
+    int siblingIndex = parentPrivate->childItems.indexOf(const_cast<QSGItem *>(sibling));
+    
+    Q_ASSERT(myIndex != -1 && siblingIndex != -1);
+
+    if (myIndex == siblingIndex - 1)
+        return;
+
+    parentPrivate->childItems.removeAt(myIndex);
+
+    if (myIndex < siblingIndex) --siblingIndex;
+
+    parentPrivate->childItems.insert(siblingIndex, this);
+
+    parentPrivate->dirty(QSGItemPrivate::ChildrenStackingChanged);
+
+    for (int ii = qMin(siblingIndex, myIndex); ii < parentPrivate->childItems.count(); ++ii) 
+        QSGItemPrivate::get(parentPrivate->childItems.at(ii))->siblingOrderChanged();
+}
+
+void QSGItem::stackAfter(const QSGItem *sibling)
+{
+    Q_D(QSGItem);
+    if (!sibling || sibling == this || !d->parentItem || d->parentItem != QSGItemPrivate::get(sibling)->parentItem) {
+        qWarning("QSGItem::stackAfter: Cannot stack after %p, which must be a sibling", sibling);
+        return;
+    }
+
+    QSGItemPrivate *parentPrivate = QSGItemPrivate::get(d->parentItem);
+
+    int myIndex = parentPrivate->childItems.indexOf(this);
+    int siblingIndex = parentPrivate->childItems.indexOf(const_cast<QSGItem *>(sibling));
+    
+    Q_ASSERT(myIndex != -1 && siblingIndex != -1);
+
+    if (myIndex == siblingIndex + 1)
+        return;
+
+    parentPrivate->childItems.removeAt(myIndex);
+
+    if (myIndex < siblingIndex) --siblingIndex;
+
+    parentPrivate->childItems.insert(siblingIndex + 1, this);
+
+    parentPrivate->dirty(QSGItemPrivate::ChildrenStackingChanged);
+
+    for (int ii = qMin(myIndex, siblingIndex + 1); ii < parentPrivate->childItems.count(); ++ii) 
+        QSGItemPrivate::get(parentPrivate->childItems.at(ii))->siblingOrderChanged();
+}
+
+/*!
+    Returns the QSGItem parent of this item.
+*/
+QSGItem *QSGItem::parentItem() const
+{
+    Q_D(const QSGItem);
+    return d->parentItem;
+}
+
+QSGEngine *QSGItem::sceneGraphEngine() const
+{
+    return canvas()->sceneGraphEngine();
+}
+
+QSGCanvas *QSGItem::canvas() const 
+{ 
+    Q_D(const QSGItem);
+    return d->canvas;
+}
+
+static bool itemZOrder_sort(QSGItem *lhs, QSGItem *rhs)
+{
+    return lhs->z() < rhs->z();
+}
+
+QList<QSGItem *> QSGItemPrivate::paintOrderChildItems() const
+{
+    // XXX todo - optimize, don't sort and return items that are
+    // ignored anyway, like invisible or disabled items.
+    QList<QSGItem *> items = childItems;
+    qStableSort(items.begin(), items.end(), itemZOrder_sort);
+    return items;
+}
+
+void QSGItemPrivate::addChild(QSGItem *child)
+{
+    Q_Q(QSGItem);
+
+    Q_ASSERT(!childItems.contains(child));
+
+    childItems.append(child);
+
+    dirty(QSGItemPrivate::ChildrenChanged);
+
+    itemChange(QSGItem::ItemChildAddedChange, child);
+
+    emit q->childrenChanged();
+}
+
+void QSGItemPrivate::removeChild(QSGItem *child)
+{
+    Q_Q(QSGItem);
+
+    Q_ASSERT(child);
+    Q_ASSERT(childItems.contains(child));
+    childItems.removeOne(child);
+    Q_ASSERT(!childItems.contains(child));
+
+    dirty(QSGItemPrivate::ChildrenChanged);
+
+    itemChange(QSGItem::ItemChildRemovedChange, child);
+
+    emit q->childrenChanged();
+}
+
+void QSGItemPrivate::InitializationState::clear() 
+{ 
+    focusScope = 0; 
+}
+
+void QSGItemPrivate::InitializationState::clear(QSGItem *fs) 
+{ 
+    focusScope = fs;
+}
+
+QSGItem *QSGItemPrivate::InitializationState::getFocusScope(QSGItem *item)
+{
+    if (!focusScope) {
+        QSGItem *fs = item->parentItem();
+        while (!fs->isFocusScope())
+            fs = fs->parentItem();
+        focusScope = fs;
+    }
+    return focusScope;
+}
+
+void QSGItemPrivate::initCanvas(InitializationState *state, QSGCanvas *c)
+{
+    Q_Q(QSGItem);
+
+    if (canvas) {
+        removeFromDirtyList();
+        QSGCanvasPrivate *c = QSGCanvasPrivate::get(canvas);
+        if (polishScheduled)
+            c->itemsToPolish.remove(q);
+        if (c->mouseGrabberItem == q)
+            c->mouseGrabberItem = 0;
+    }
+
+    canvas = c;
+
+    if (canvas && polishScheduled) 
+        QSGCanvasPrivate::get(canvas)->itemsToPolish.insert(q);
+
+    if (canvas && hoverEnabled && !canvas->hasMouseTracking())
+        canvas->setMouseTracking(true);
+
+    // XXX todo - why aren't these added to the destroy list?
+    itemNodeInstance = 0;
+    opacityNode = 0;
+    clipNode = 0;
+    rootNode = 0;
+    groupNode = 0;
+    paintNode = 0;
+    paintNodeIndex = 0;
+
+    InitializationState _dummy;
+    InitializationState *childState = state;
+
+    if (c && q->isFocusScope()) {
+        _dummy.clear(q);
+        childState = &_dummy;
+    }
+
+    for (int ii = 0; ii < childItems.count(); ++ii) {
+        QSGItem *child = childItems.at(ii);
+        QSGItemPrivate::get(child)->initCanvas(childState, c);
+    }
+
+    if (c && focus) {
+        // Fixup
+        if (state->getFocusScope(q)->scopedFocusItem()) {
+            focus = false;
+            emit q->focusChanged(false);
+        } else {
+            QSGCanvasPrivate::get(canvas)->setFocusInScope(state->getFocusScope(q), q);
+        }
+    }
+
+    dirty(Canvas);
+
+    itemChange(QSGItem::ItemSceneChange, c);
+}
+
+/*!
+Returns a transform that maps points from canvas space into item space.
+*/
+QTransform QSGItemPrivate::canvasToItemTransform() const
+{
+    // XXX todo - optimize
+    return itemToCanvasTransform().inverted();
+}
+
+/*!
+Returns a transform that maps points from item space into canvas space.
+*/
+QTransform QSGItemPrivate::itemToCanvasTransform() const
+{
+    // XXX todo
+    QTransform rv = parentItem?QSGItemPrivate::get(parentItem)->itemToCanvasTransform():QTransform();
+    itemToParentTransform(rv);
+    return rv;
+}
+
+/*!
+Motifies \a t with this items local transform relative to its parent.
+*/
+void QSGItemPrivate::itemToParentTransform(QTransform &t) const
+{
+    if (x || y)
+        t.translate(x, y);
+
+    if (!transforms.isEmpty()) {
+        QMatrix4x4 m(t);
+        for (int ii = transforms.count() - 1; ii >= 0; --ii)
+            transforms.at(ii)->applyTo(&m);
+        t = m.toTransform();
+    }
+
+    if (scale != 1. || rotation != 0.) {
+        QPointF tp = computeTransformOrigin();
+        t.translate(tp.x(), tp.y());
+        t.scale(scale, scale);
+        t.rotate(rotation);
+        t.translate(-tp.x(), -tp.y());
+    }
+}
+
+bool QSGItem::isComponentComplete() const
+{
+    Q_D(const QSGItem);
+    return d->componentComplete;
+}
+
+QSGItemPrivate::QSGItemPrivate()
+: _anchors(0), _contents(0), baselineOffset(0), _anchorLines(0), _stateGroup(0), origin(QSGItem::Center), 
+    
+  flags(0), widthValid(false), heightValid(false), componentComplete(true), 
+  keepMouse(false), hoverEnabled(false), smooth(false), focus(false), activeFocus(false), notifiedFocus(false),
+  notifiedActiveFocus(false), filtersChildMouseEvents(false), explicitVisible(true), 
+  effectiveVisible(true), explicitEnable(true), effectiveEnable(true), polishScheduled(false),
+  inheritedLayoutMirror(false), effectiveLayoutMirror(false), isMirrorImplicit(true),
+  inheritMirrorFromParent(false), inheritMirrorFromItem(false),
+
+  canvas(0), parentItem(0),
+
+  subFocusItem(0),
+
+  x(0), y(0), width(0), height(0), implicitWidth(0), implicitHeight(0), 
+  z(0), scale(1), rotation(0), opacity(1),
+
+  attachedLayoutDirection(0), acceptedMouseButtons(0),
+  imHints(Qt::ImhNone),
+  
+  keyHandler(0),
+
+  dirtyAttributes(0), nextDirtyItem(0), prevDirtyItem(0),
+
+  itemNodeInstance(0), opacityNode(0), clipNode(0), rootNode(0), groupNode(0), paintNode(0)
+  , paintNodeIndex(0), effectRefCount(0), hideRefCount(0)
+{
+}
+
+void QSGItemPrivate::init(QSGItem *parent)
+{
+    Q_Q(QSGItem);
+    baselineOffset.invalidate();
+
+    if (parent) {
+        q->setParentItem(parent);
+        QSGItemPrivate *parentPrivate = QSGItemPrivate::get(parent);
+        setImplicitLayoutMirror(parentPrivate->inheritedLayoutMirror, parentPrivate->inheritMirrorFromParent);
+    }
+}
+
+void QSGItemPrivate::data_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
+{
+    if (!o)
+        return;
+
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+
+    // This test is measurably (albeit only slightly) faster than qobject_cast<>()
+    const QMetaObject *mo = o->metaObject();
+    while (mo && mo != &QSGItem::staticMetaObject) {
+        if (mo == &QDeclarativeItem::staticMetaObject) 
+            qWarning("Cannot add a QtQuick 1.0 item (%s) into a QtQuick 2.0 scene!", o->metaObject()->className());
+        mo = mo->d.superdata;
+    }
+
+    if (mo) {
+        QSGItem *item = static_cast<QSGItem *>(o);
+        item->setParentItem(that);
+    } else {
+        // XXX todo - do we really want this behavior?
+        o->setParent(that);
+    }
+}
+
+int QSGItemPrivate::data_count(QDeclarativeListProperty<QObject> *prop)
+{
+    Q_UNUSED(prop);
+    // XXX todo
+    return 0;
+}
+
+QObject *QSGItemPrivate::data_at(QDeclarativeListProperty<QObject> *prop, int i)
+{
+    Q_UNUSED(prop);
+    Q_UNUSED(i);
+    // XXX todo
+    return 0;
+}
+
+void QSGItemPrivate::data_clear(QDeclarativeListProperty<QObject> *prop)
+{
+    Q_UNUSED(prop);
+    // XXX todo
+}
+
+QObject *QSGItemPrivate::resources_at(QDeclarativeListProperty<QObject> *prop, int index)
+{
+    const QObjectList children = prop->object->children();
+    if (index < children.count())
+        return children.at(index);
+    else
+        return 0;
+}
+
+void QSGItemPrivate::resources_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
+{
+    // XXX todo - do we really want this behavior?
+    o->setParent(prop->object);
+}
+
+int QSGItemPrivate::resources_count(QDeclarativeListProperty<QObject> *prop)
+{
+    return prop->object->children().count();
+}
+
+void QSGItemPrivate::resources_clear(QDeclarativeListProperty<QObject> *prop)
+{
+    // XXX todo - do we really want this behavior?
+    const QObjectList children = prop->object->children();
+    for (int index = 0; index < children.count(); index++)
+        children.at(index)->setParent(0);
+}
+
+QSGItem *QSGItemPrivate::children_at(QDeclarativeListProperty<QSGItem> *prop, int index)
+{
+    QSGItemPrivate *p = QSGItemPrivate::get(static_cast<QSGItem *>(prop->object));
+    if (index >= p->childItems.count() || index < 0)
+        return 0;
+    else
+        return p->childItems.at(index);
+}
+
+void QSGItemPrivate::children_append(QDeclarativeListProperty<QSGItem> *prop, QSGItem *o)
+{
+    if (!o)
+        return;
+
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    if (o->parentItem() == that)
+        o->setParentItem(0);
+
+    o->setParentItem(that);
+}
+
+int QSGItemPrivate::children_count(QDeclarativeListProperty<QSGItem> *prop)
+{
+    QSGItemPrivate *p = QSGItemPrivate::get(static_cast<QSGItem *>(prop->object));
+    return p->childItems.count();
+}
+
+void QSGItemPrivate::children_clear(QDeclarativeListProperty<QSGItem> *prop)
+{
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    QSGItemPrivate *p = QSGItemPrivate::get(that);
+    while (!p->childItems.isEmpty())
+        p->childItems.at(0)->setParentItem(0);
+}
+
+int QSGItemPrivate::transform_count(QDeclarativeListProperty<QSGTransform> *prop)
+{
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    return QSGItemPrivate::get(that)->transforms.count();
+}
+
+void QSGTransform::appendToItem(QSGItem *item)
+{
+    Q_D(QSGTransform);
+    if (!item)
+        return;
+
+    QSGItemPrivate *p = QSGItemPrivate::get(item);
+
+    if (!d->items.isEmpty() && !p->transforms.isEmpty() && p->transforms.contains(this)) {
+        p->transforms.removeOne(this);
+        p->transforms.append(this);
+    } else {
+        p->transforms.append(this);
+        d->items.append(item);
+    }
+
+    p->dirty(QSGItemPrivate::Transform);
+}
+
+void QSGTransform::prependToItem(QSGItem *item)
+{
+    Q_D(QSGTransform);
+    if (!item)
+        return;
+
+    QSGItemPrivate *p = QSGItemPrivate::get(item);
+
+    if (!d->items.isEmpty() && !p->transforms.isEmpty() && p->transforms.contains(this)) {
+        p->transforms.removeOne(this);
+        p->transforms.prepend(this);
+    } else {
+        p->transforms.prepend(this);
+        d->items.append(item);
+    }
+
+    p->dirty(QSGItemPrivate::Transform);
+}
+
+void QSGItemPrivate::transform_append(QDeclarativeListProperty<QSGTransform> *prop, QSGTransform *transform)
+{
+    if (!transform)
+        return;
+
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    transform->appendToItem(that);
+}
+
+QSGTransform *QSGItemPrivate::transform_at(QDeclarativeListProperty<QSGTransform> *prop, int idx)
+{
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    QSGItemPrivate *p = QSGItemPrivate::get(that);
+
+    if (idx < 0 || idx >= p->transforms.count())
+        return 0;
+    else
+        return p->transforms.at(idx);
+}
+
+void QSGItemPrivate::transform_clear(QDeclarativeListProperty<QSGTransform> *prop)
+{
+    QSGItem *that = static_cast<QSGItem *>(prop->object);
+    QSGItemPrivate *p = QSGItemPrivate::get(that);
+
+    for (int ii = 0; ii < p->transforms.count(); ++ii) {
+        QSGTransform *t = p->transforms.at(ii);
+        QSGTransformPrivate *tp = QSGTransformPrivate::get(t);
+        tp->items.removeOne(that);
+    }
+
+    p->transforms.clear();
+
+    p->dirty(QSGItemPrivate::Transform);
+}
+
+QSGAnchors *QSGItemPrivate::anchors() const
+{
+    if (!_anchors) {
+        Q_Q(const QSGItem);
+        _anchors = new QSGAnchors(const_cast<QSGItem *>(q));
+        if (!componentComplete)
+            _anchors->classBegin();
+    }
+    return _anchors;
+}
+
+QSGItemPrivate::AnchorLines *QSGItemPrivate::anchorLines() const 
+{
+    Q_Q(const QSGItem);
+    if (!_anchorLines) _anchorLines =
+        new AnchorLines(const_cast<QSGItem *>(q));
+    return _anchorLines;
+}
+
+void QSGItemPrivate::siblingOrderChanged()
+{
+    Q_Q(QSGItem);
+    for(int ii = 0; ii < changeListeners.count(); ++ii) {
+        const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+        if (change.types & QSGItemPrivate::SiblingOrder) {
+            change.listener->itemSiblingOrderChanged(q);
+        }
+    }
+}
+
+QDeclarativeListProperty<QObject> QSGItemPrivate::data()
+{
+    return QDeclarativeListProperty<QObject>(q_func(), 0, QSGItemPrivate::data_append,
+                                             QSGItemPrivate::data_count,
+                                             QSGItemPrivate::data_at,
+                                             QSGItemPrivate::data_clear);
+}
+
+QRectF QSGItem::childrenRect()
+{
+    Q_D(QSGItem);
+    if (!d->_contents) {
+        d->_contents = new QSGContents(this);
+        if (d->componentComplete)
+            d->_contents->complete();
+    }
+    return d->_contents->rectF();
+}
+
+QList<QSGItem *> QSGItem::childItems() const
+{
+    Q_D(const QSGItem);
+    return d->childItems;
+}
+
+bool QSGItem::clip() const
+{
+    return flags() & ItemClipsChildrenToShape;
+}
+
+void QSGItem::setClip(bool c)
+{
+    if (clip() == c)
+        return;
+
+    setFlag(ItemClipsChildrenToShape, c);
+
+    emit clipChanged(c);
+}
+
+void QSGItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_D(QSGItem);
+
+    if (d->_anchors)
+        QSGAnchorsPrivate::get(d->_anchors)->updateMe();
+
+    for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
+        const QSGItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
+        if (change.types & QSGItemPrivate::Geometry)
+            change.listener->itemGeometryChanged(this, newGeometry, oldGeometry);
+    }
+
+    if (newGeometry.x() != oldGeometry.x())
+        emit xChanged();
+    if (newGeometry.y() != oldGeometry.y())
+        emit yChanged();
+    if (newGeometry.width() != oldGeometry.width())
+        emit widthChanged();
+    if (newGeometry.height() != oldGeometry.height())
+        emit heightChanged();
+}
+
+/*!
+    Called by the rendering thread when it is time to sync the state of the QML objects with the
+    scene graph objects. The function should return the root of the scene graph subtree for
+    this item. \a oldNode is the node that was returned the last time the function was called.
+
+    The main thread is blocked while this function is executed so it is safe to read
+    values from the QSGItem instance and other objects in the main thread.
+
+    \warning This is the only function in which it is allowed to make use of scene graph
+    objects from the main thread. Use of scene graph objects outside this function will
+    result in race conditions and potential crashes.
+ */
+
+QSGNode *QSGItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+    delete oldNode;
+    return 0;
+}
+
+QSGTransformNode *QSGItemPrivate::createTransformNode()
+{
+    return new QSGTransformNode;
+}
+
+void QSGItem::updatePolish()
+{
+}
+
+void QSGItemPrivate::removeItemChangeListener(QSGItemChangeListener *listener, ChangeTypes types)
+{
+    ChangeListener change(listener, types);
+    changeListeners.removeOne(change);
+}
+
+void QSGItem::keyPressEvent(QKeyEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::keyReleaseEvent(QKeyEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::inputMethodEvent(QInputMethodEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::focusInEvent(QFocusEvent *)
+{
+}
+
+void QSGItem::focusOutEvent(QFocusEvent *)
+{
+}
+
+void QSGItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
+{
+    mousePressEvent(event);
+}
+
+void QSGItem::mouseUngrabEvent()
+{
+    // XXX todo
+}
+
+void QSGItem::wheelEvent(QGraphicsSceneWheelEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::touchEvent(QTouchEvent *event)
+{
+    event->ignore();
+}
+
+void QSGItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+void QSGItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+void QSGItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+bool QSGItem::childMouseEventFilter(QSGItem *, QEvent *)
+{
+    return false;
+}
+
+Qt::InputMethodHints QSGItem::inputMethodHints() const
+{
+    Q_D(const QSGItem);
+    return d->imHints;
+}
+
+void QSGItem::setInputMethodHints(Qt::InputMethodHints hints)
+{
+    Q_D(QSGItem);
+    d->imHints = hints;
+
+    if (!d->canvas || d->canvas->activeFocusItem() != this)
+        return;
+
+    QSGCanvasPrivate::get(d->canvas)->updateInputMethodData();
+#ifndef QT_NO_IM
+    if (d->canvas->hasFocus())
+        if (QInputContext *inputContext = d->canvas->inputContext())
+            inputContext->update();
+#endif
+}
+
+void QSGItem::updateMicroFocus()
+{
+#ifndef QT_NO_IM
+    Q_D(QSGItem);
+    if (d->canvas && d->canvas->hasFocus())
+        if (QInputContext *inputContext = d->canvas->inputContext())
+            inputContext->update();
+#endif
+}
+
+QVariant QSGItem::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+    Q_D(const QSGItem);
+    QVariant v;
+
+    if (d->keyHandler)
+        v = d->keyHandler->inputMethodQuery(query);
+
+    return v;
+}
+
+QSGAnchorLine QSGItemPrivate::left() const
+{
+    return anchorLines()->left;
+}
+
+QSGAnchorLine QSGItemPrivate::right() const
+{
+    return anchorLines()->right;
+}
+
+QSGAnchorLine QSGItemPrivate::horizontalCenter() const
+{
+    return anchorLines()->hCenter;
+}
+
+QSGAnchorLine QSGItemPrivate::top() const
+{
+    return anchorLines()->top;
+}
+
+QSGAnchorLine QSGItemPrivate::bottom() const
+{
+    return anchorLines()->bottom;
+}
+
+QSGAnchorLine QSGItemPrivate::verticalCenter() const
+{
+    return anchorLines()->vCenter;
+}
+
+QSGAnchorLine QSGItemPrivate::baseline() const
+{
+    return anchorLines()->baseline;
+}
+
+qreal QSGItem::baselineOffset() const
+{
+    Q_D(const QSGItem);
+    if (!d->baselineOffset.isValid()) {
+        return 0.0;
+    } else
+        return d->baselineOffset;
+}
+
+void QSGItem::setBaselineOffset(qreal offset)
+{
+    Q_D(QSGItem);
+    if (offset == d->baselineOffset)
+        return;
+
+    d->baselineOffset = offset;
+
+    for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
+        const QSGItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
+        if (change.types & QSGItemPrivate::Geometry) {
+            QSGAnchorsPrivate *anchor = change.listener->anchorPrivate();
+            if (anchor)
+                anchor->updateVerticalAnchors();
+        }
+    }
+    emit baselineOffsetChanged(offset);
+}
+
+void QSGItem::update()
+{
+    Q_D(QSGItem);
+    Q_ASSERT(flags() & ItemHasContents);
+    d->dirty(QSGItemPrivate::Content);
+}
+
+void QSGItem::polish()
+{
+    Q_D(QSGItem);
+    if (!d->polishScheduled) {
+        d->polishScheduled = true;
+        if (d->canvas)
+            QSGCanvasPrivate::get(d->canvas)->itemsToPolish.insert(this);
+    }
+}
+
+QScriptValue QSGItem::mapFromItem(const QScriptValue &item, qreal x, qreal y) const
+{
+    QScriptValue sv = QDeclarativeEnginePrivate::getScriptEngine(qmlEngine(this))->newObject();
+    QSGItem *itemObj = qobject_cast<QSGItem*>(item.toQObject());
+    if (!itemObj && !item.isNull()) {
+        qmlInfo(this) << "mapFromItem() given argument \"" << item.toString() << "\" which is neither null nor an Item";
+        return 0;
+    }
+
+    // If QSGItem::mapFromItem() is called with 0, behaves the same as mapFromScene()
+    QPointF p = mapFromItem(itemObj, QPointF(x, y));
+    sv.setProperty(QLatin1String("x"), p.x());
+    sv.setProperty(QLatin1String("y"), p.y());
+    return sv;
+}
+
+QTransform QSGItem::itemTransform(QSGItem *other, bool *ok) const
+{
+    Q_D(const QSGItem);
+
+    // XXX todo - we need to be able to handle common parents better and detect 
+    // invalid cases
+    if (ok) *ok = true;
+
+    QTransform t = d->itemToCanvasTransform();
+    if (other) t *= QSGItemPrivate::get(other)->canvasToItemTransform();
+
+    return t;
+}
+
+QScriptValue QSGItem::mapToItem(const QScriptValue &item, qreal x, qreal y) const
+{
+    QScriptValue sv = QDeclarativeEnginePrivate::getScriptEngine(qmlEngine(this))->newObject();
+    QSGItem *itemObj = qobject_cast<QSGItem*>(item.toQObject());
+    if (!itemObj && !item.isNull()) {
+        qmlInfo(this) << "mapToItem() given argument \"" << item.toString() << "\" which is neither null nor an Item";
+        return 0;
+    }
+
+    // If QSGItem::mapToItem() is called with 0, behaves the same as mapToScene()
+    QPointF p = mapToItem(itemObj, QPointF(x, y));
+    sv.setProperty(QLatin1String("x"), p.x());
+    sv.setProperty(QLatin1String("y"), p.y());
+    return sv;
+}
+
+void QSGItem::forceActiveFocus()
+{
+    setFocus(true);
+    QSGItem *parent = parentItem();
+    while (parent) {
+        if (parent->flags() & QSGItem::ItemIsFocusScope) {
+            parent->setFocus(true);
+        } 
+        parent = parent->parentItem();
+    }
+}
+
+QSGItem *QSGItem::childAt(qreal x, qreal y) const
+{
+    // XXX todo - should this include transform etc.?
+    const QList<QSGItem *> children = childItems();
+    for (int i = children.count()-1; i >= 0; --i) {
+        if (QSGItem *child = qobject_cast<QSGItem *>(children.at(i))) {
+            if (child->isVisible() && child->x() <= x
+                && child->x() + child->width() >= x
+                && child->y() <= y
+                && child->y() + child->height() >= y)
+                return child;
+        }
+    }
+    return 0;
+}
+
+QDeclarativeListProperty<QObject> QSGItemPrivate::resources()
+{
+    return QDeclarativeListProperty<QObject>(q_func(), 0, QSGItemPrivate::resources_append,
+                                             QSGItemPrivate::resources_count,
+                                             QSGItemPrivate::resources_at,
+                                             QSGItemPrivate::resources_clear);
+}
+
+QDeclarativeListProperty<QSGItem> QSGItemPrivate::children()
+{
+    return QDeclarativeListProperty<QSGItem>(q_func(), 0, QSGItemPrivate::children_append, 
+                                             QSGItemPrivate::children_count,
+                                             QSGItemPrivate::children_at,
+                                             QSGItemPrivate::children_clear);
+                                     
+}
+
+QDeclarativeListProperty<QDeclarativeState> QSGItemPrivate::states()
+{
+    return _states()->statesProperty();
+}
+
+QDeclarativeListProperty<QDeclarativeTransition> QSGItemPrivate::transitions()
+{
+    return _states()->transitionsProperty();
+}
+
+QString QSGItemPrivate::state() const
+{
+    if (!_stateGroup)
+        return QString();
+    else
+        return _stateGroup->state();
+}
+
+void QSGItemPrivate::setState(const QString &state)
+{
+    _states()->setState(state);
+}
+
+QDeclarativeListProperty<QSGTransform> QSGItem::transform()
+{
+    Q_D(QSGItem);
+    return QDeclarativeListProperty<QSGTransform>(this, 0, d->transform_append, d->transform_count,
+                                                  d->transform_at, d->transform_clear);
+}
+
+void QSGItem::classBegin()
+{
+    Q_D(QSGItem);
+    d->componentComplete = false;
+    if (d->_stateGroup)
+        d->_stateGroup->classBegin();
+    if (d->_anchors)
+        d->_anchors->classBegin();
+}
+
+void QSGItem::componentComplete()
+{
+    Q_D(QSGItem);
+    d->componentComplete = true;
+    if (d->_stateGroup)
+        d->_stateGroup->componentComplete();
+    if (d->_anchors) {
+        d->_anchors->componentComplete();
+        QSGAnchorsPrivate::get(d->_anchors)->updateOnComplete();
+    }
+    if (d->keyHandler)
+        d->keyHandler->componentComplete();
+    if (d->_contents)
+        d->_contents->complete();
+}
+
+QDeclarativeStateGroup *QSGItemPrivate::_states()
+{
+    Q_Q(QSGItem);
+    if (!_stateGroup) {
+        _stateGroup = new QDeclarativeStateGroup;
+        if (!componentComplete)
+            _stateGroup->classBegin();
+        QObject::connect(_stateGroup, SIGNAL(stateChanged(QString)),
+                         q, SIGNAL(stateChanged(QString)));
+    }
+
+    return _stateGroup;
+}
+
+QSGItemPrivate::AnchorLines::AnchorLines(QSGItem *q)
+{
+    left.item = q;
+    left.anchorLine = QSGAnchorLine::Left;
+    right.item = q;
+    right.anchorLine = QSGAnchorLine::Right;
+    hCenter.item = q;
+    hCenter.anchorLine = QSGAnchorLine::HCenter;
+    top.item = q;
+    top.anchorLine = QSGAnchorLine::Top;
+    bottom.item = q;
+    bottom.anchorLine = QSGAnchorLine::Bottom;
+    vCenter.item = q;
+    vCenter.anchorLine = QSGAnchorLine::VCenter;
+    baseline.item = q;
+    baseline.anchorLine = QSGAnchorLine::Baseline;
+}
+
+QPointF QSGItemPrivate::computeTransformOrigin() const
+{
+    switch(origin) {
+    default:
+    case QSGItem::TopLeft:
+        return QPointF(0, 0);
+    case QSGItem::Top:
+        return QPointF(width / 2., 0);
+    case QSGItem::TopRight:
+        return QPointF(width, 0);
+    case QSGItem::Left:
+        return QPointF(0, height / 2.);
+    case QSGItem::Center:
+        return QPointF(width / 2., height / 2.);
+    case QSGItem::Right:
+        return QPointF(width, height / 2.);
+    case QSGItem::BottomLeft:
+        return QPointF(0, height);
+    case QSGItem::Bottom:
+        return QPointF(width / 2., height);
+    case QSGItem::BottomRight:
+        return QPointF(width, height);
+    }
+}
+
+void QSGItemPrivate::transformChanged()
+{
+}
+
+void QSGItemPrivate::deliverKeyEvent(QKeyEvent *e)
+{
+    Q_Q(QSGItem);
+    
+    Q_ASSERT(e->isAccepted());
+    if (keyHandler) {
+        if (e->type() == QEvent::KeyPress)
+            keyHandler->keyPressed(e, false);
+        else
+            keyHandler->keyReleased(e, false);
+
+        if (e->isAccepted())
+            return;
+        else
+            e->accept();
+    }
+
+    if (e->type() == QEvent::KeyPress)
+        q->keyPressEvent(e);
+    else
+        q->keyReleaseEvent(e);
+
+    if (e->isAccepted())
+        return;
+
+    if (keyHandler) {
+        e->accept();
+
+        if (e->type() == QEvent::KeyPress)
+            keyHandler->keyPressed(e, true);
+        else
+            keyHandler->keyReleased(e, true);
+    }
+}
+
+void QSGItemPrivate::deliverInputMethodEvent(QInputMethodEvent *e)
+{
+    Q_Q(QSGItem);
+
+    Q_ASSERT(e->isAccepted());
+    if (keyHandler) {
+        keyHandler->inputMethodEvent(e, false);
+
+        if (e->isAccepted())
+            return;
+        else
+            e->accept();
+    }
+
+    q->inputMethodEvent(e);
+
+    if (e->isAccepted())
+        return;
+
+    if (keyHandler) {
+        e->accept();
+
+        keyHandler->inputMethodEvent(e, true);
+    }
+}
+
+void QSGItemPrivate::deliverFocusEvent(QFocusEvent *e)
+{
+    Q_Q(QSGItem);
+
+    if (e->type() == QEvent::FocusIn) {
+        q->focusInEvent(e);
+    } else {
+        q->focusOutEvent(e);
+    }
+}
+
+void QSGItemPrivate::deliverMouseEvent(QGraphicsSceneMouseEvent *e)
+{
+    Q_Q(QSGItem);
+
+    Q_ASSERT(e->isAccepted());
+
+    switch(e->type()) {
+    default:
+        Q_ASSERT(!"Unknown event type");
+    case QEvent::GraphicsSceneMouseMove:
+        q->mouseMoveEvent(e);
+        break;
+    case QEvent::GraphicsSceneMousePress:
+        q->mousePressEvent(e);
+        break;
+    case QEvent::GraphicsSceneMouseRelease:
+        q->mouseReleaseEvent(e);
+        break;
+    case QEvent::GraphicsSceneMouseDoubleClick:
+        q->mouseDoubleClickEvent(e);
+        break;
+    }
+}
+
+void QSGItemPrivate::deliverWheelEvent(QGraphicsSceneWheelEvent *e)
+{
+    Q_Q(QSGItem);
+    q->wheelEvent(e);
+}
+
+void QSGItemPrivate::deliverTouchEvent(QTouchEvent *e)
+{
+    Q_Q(QSGItem);
+    q->touchEvent(e);
+}
+
+void QSGItemPrivate::deliverHoverEvent(QGraphicsSceneHoverEvent *e)
+{
+    Q_Q(QSGItem);
+    switch(e->type()) {
+    default:
+        Q_ASSERT(!"Unknown event type");
+    case QEvent::GraphicsSceneHoverEnter:
+        q->hoverEnterEvent(e);
+        break;
+    case QEvent::GraphicsSceneHoverLeave:
+        q->hoverLeaveEvent(e);
+        break;
+    case QEvent::GraphicsSceneHoverMove:
+        q->hoverMoveEvent(e);
+        break;
+    }
+}
+
+void QSGItem::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    Q_UNUSED(change);
+    Q_UNUSED(value);
+}
+
+/*! \internal */
+// XXX todo - do we want/need this anymore?
+QRectF QSGItem::boundingRect() const
+{
+    Q_D(const QSGItem);
+    return QRectF(0, 0, d->width, d->height);
+}
+
+QSGItem::TransformOrigin QSGItem::transformOrigin() const
+{
+    Q_D(const QSGItem);
+    return d->origin;
+}
+
+void QSGItem::setTransformOrigin(TransformOrigin origin)
+{
+    Q_D(QSGItem);
+    if (origin == d->origin) 
+        return;
+
+    d->origin = origin;
+    d->dirty(QSGItemPrivate::TransformOrigin);
+
+    emit transformOriginChanged(d->origin);
+}
+
+QPointF QSGItem::transformOriginPoint() const
+{
+    Q_D(const QSGItem);
+    return d->computeTransformOrigin();
+}
+
+qreal QSGItem::z() const
+{
+    Q_D(const QSGItem);
+    return d->z;
+}
+
+void QSGItem::setZ(qreal v)
+{
+    Q_D(QSGItem);
+    if (d->z == v)
+        return;
+
+    d->z = v;
+
+    d->dirty(QSGItemPrivate::ZValue);
+    if (d->parentItem) 
+        QSGItemPrivate::get(d->parentItem)->dirty(QSGItemPrivate::ChildrenStackingChanged);
+
+    emit zChanged();
+}
+
+qreal QSGItem::rotation() const 
+{ 
+    Q_D(const QSGItem);
+    return d->rotation;
+}
+
+void QSGItem::setRotation(qreal r) 
+{
+    Q_D(QSGItem);
+    if (d->rotation == r)
+        return;
+
+    d->rotation = r;
+
+    d->dirty(QSGItemPrivate::BasicTransform);
+
+    d->itemChange(ItemRotationHasChanged, r);
+
+    emit rotationChanged();
+}
+
+qreal QSGItem::scale() const 
+{ 
+    Q_D(const QSGItem);
+    return d->scale;
+}
+
+void QSGItem::setScale(qreal s) 
+{
+    Q_D(QSGItem);
+    if (d->scale == s)
+        return;
+
+    d->scale = s;
+
+    d->dirty(QSGItemPrivate::BasicTransform);
+
+    emit scaleChanged();
+}
+
+qreal QSGItem::opacity() const
+{
+    Q_D(const QSGItem);
+    return d->opacity;
+}
+
+void QSGItem::setOpacity(qreal o)
+{
+    Q_D(QSGItem);
+    if (d->opacity == o)
+        return;
+
+    d->opacity = o;
+    
+    d->dirty(QSGItemPrivate::OpacityValue);
+
+    d->itemChange(ItemOpacityHasChanged, o);
+
+    emit opacityChanged();
+}
+
+bool QSGItem::isVisible() const
+{
+    Q_D(const QSGItem);
+    return d->effectiveVisible;
+}
+
+void QSGItem::setVisible(bool v)
+{
+    Q_D(QSGItem);
+    if (v == d->explicitVisible)
+        return;
+
+    d->explicitVisible = v;
+
+    d->setEffectiveVisibleRecur(d->calcEffectiveVisible());
+}
+
+bool QSGItem::isEnabled() const
+{
+    Q_D(const QSGItem);
+    return d->effectiveEnable;
+}
+
+void QSGItem::setEnabled(bool e)
+{
+    Q_D(QSGItem);
+    if (e == d->explicitEnable)
+        return;
+
+    d->explicitEnable = e;
+
+    d->setEffectiveEnableRecur(d->calcEffectiveEnable());
+}
+
+bool QSGItemPrivate::calcEffectiveVisible() const
+{
+    // XXX todo - Should the effective visible of an element with no parent just be the current
+    // effective visible?  This would prevent pointless re-processing in the case of an element
+    // moving to/from a no-parent situation, but it is different from what graphics view does.
+    return explicitVisible && (!parentItem || QSGItemPrivate::get(parentItem)->effectiveVisible);
+}
+
+void QSGItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible)
+{
+    Q_Q(QSGItem);
+
+    if (newEffectiveVisible && !explicitVisible) {
+        // This item locally overrides visibility
+        return;
+    }
+
+    if (newEffectiveVisible == effectiveVisible) {
+        // No change necessary
+        return;
+    }
+
+    effectiveVisible = newEffectiveVisible;
+    dirty(Visible);
+    if (parentItem) QSGItemPrivate::get(parentItem)->dirty(ChildrenStackingChanged);
+
+    if (canvas) {
+        QSGCanvasPrivate *canvasPriv = QSGCanvasPrivate::get(canvas);
+        if (canvasPriv->mouseGrabberItem == q)
+            q->ungrabMouse();
+    }
+
+    for (int ii = 0; ii < childItems.count(); ++ii) 
+        QSGItemPrivate::get(childItems.at(ii))->setEffectiveVisibleRecur(newEffectiveVisible);
+
+    for(int ii = 0; ii < changeListeners.count(); ++ii) {
+        const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+        if (change.types & QSGItemPrivate::Visibility)
+            change.listener->itemVisibilityChanged(q);
+    }
+
+    emit q->visibleChanged();
+}
+
+bool QSGItemPrivate::calcEffectiveEnable() const
+{
+    // XXX todo - Should the effective enable of an element with no parent just be the current
+    // effective enable?  This would prevent pointless re-processing in the case of an element
+    // moving to/from a no-parent situation, but it is different from what graphics view does.
+    return explicitEnable && (!parentItem || QSGItemPrivate::get(parentItem)->effectiveEnable);
+}
+
+void QSGItemPrivate::setEffectiveEnableRecur(bool newEffectiveEnable)
+{
+    Q_Q(QSGItem);
+
+    // XXX todo - need to fixup focus
+
+    if (newEffectiveEnable && !explicitEnable) {
+        // This item locally overrides enable
+        return;
+    }
+
+    if (newEffectiveEnable == effectiveEnable) {
+        // No change necessary
+        return;
+    }
+
+    effectiveEnable = newEffectiveEnable;
+
+    if (canvas) {
+        QSGCanvasPrivate *canvasPriv = QSGCanvasPrivate::get(canvas);
+        if (canvasPriv->mouseGrabberItem == q)
+            q->ungrabMouse();
+    }
+
+    for (int ii = 0; ii < childItems.count(); ++ii) 
+        QSGItemPrivate::get(childItems.at(ii))->setEffectiveEnableRecur(newEffectiveEnable);
+
+    emit q->enabledChanged();
+}
+
+QString QSGItemPrivate::dirtyToString() const
+{
+#define DIRTY_TO_STRING(value) if (dirtyAttributes & value) { \
+    if (!rv.isEmpty()) \
+        rv.append(QLatin1String("|")); \
+    rv.append(QLatin1String(#value)); \
+}
+
+//    QString rv = QLatin1String("0x") + QString::number(dirtyAttributes, 16);
+    QString rv;
+
+    DIRTY_TO_STRING(TransformOrigin);
+    DIRTY_TO_STRING(Transform);
+    DIRTY_TO_STRING(BasicTransform);
+    DIRTY_TO_STRING(Position);
+    DIRTY_TO_STRING(Size);
+    DIRTY_TO_STRING(ZValue);
+    DIRTY_TO_STRING(Content);
+    DIRTY_TO_STRING(Smooth);
+    DIRTY_TO_STRING(OpacityValue);
+    DIRTY_TO_STRING(ChildrenChanged);
+    DIRTY_TO_STRING(ChildrenStackingChanged);
+    DIRTY_TO_STRING(ParentChanged);
+    DIRTY_TO_STRING(Clip);
+    DIRTY_TO_STRING(Canvas);
+    DIRTY_TO_STRING(EffectReference);
+    DIRTY_TO_STRING(Visible);
+    DIRTY_TO_STRING(HideReference);
+
+    return rv;
+}
+
+void QSGItemPrivate::dirty(DirtyType type)
+{
+    Q_Q(QSGItem);
+    if (type & (TransformOrigin | Transform | BasicTransform | Position | Size))
+        transformChanged();
+
+    if (!(dirtyAttributes & type) || (canvas && !prevDirtyItem)) {
+        dirtyAttributes |= type;
+        if (canvas) {
+            addToDirtyList();
+            QSGCanvasPrivate::get(canvas)->dirtyItem(q);
+        }
+    }
+}
+
+void QSGItemPrivate::addToDirtyList()
+{
+    Q_Q(QSGItem);
+
+    Q_ASSERT(canvas);
+    if (!prevDirtyItem) {
+        Q_ASSERT(!nextDirtyItem);
+
+        QSGCanvasPrivate *p = QSGCanvasPrivate::get(canvas);
+        nextDirtyItem = p->dirtyItemList;
+        if (nextDirtyItem) QSGItemPrivate::get(nextDirtyItem)->prevDirtyItem = &nextDirtyItem;
+        prevDirtyItem = &p->dirtyItemList;
+        p->dirtyItemList = q;
+        p->dirtyItem(q);
+    }
+    Q_ASSERT(prevDirtyItem);
+}
+
+void QSGItemPrivate::removeFromDirtyList()
+{
+    if (prevDirtyItem) {
+        if (nextDirtyItem) QSGItemPrivate::get(nextDirtyItem)->prevDirtyItem = prevDirtyItem;
+        *prevDirtyItem = nextDirtyItem;
+        prevDirtyItem = 0;
+        nextDirtyItem = 0;
+    }
+    Q_ASSERT(!prevDirtyItem);
+    Q_ASSERT(!nextDirtyItem);
+}
+
+void QSGItemPrivate::refFromEffectItem(bool hide)
+{
+    ++effectRefCount;
+    if (1 == effectRefCount) {
+        dirty(EffectReference);
+        if (parentItem) QSGItemPrivate::get(parentItem)->dirty(ChildrenStackingChanged);
+    }
+    if (hide) {
+        if (++hideRefCount == 1)
+            dirty(HideReference);
+    }
+}
+
+void QSGItemPrivate::derefFromEffectItem(bool unhide)
+{
+    Q_ASSERT(effectRefCount);
+    --effectRefCount;
+    if (0 == effectRefCount) {
+        dirty(EffectReference);
+        if (parentItem) QSGItemPrivate::get(parentItem)->dirty(ChildrenStackingChanged);
+    }
+    if (unhide) {
+        if (--hideRefCount == 0)
+            dirty(HideReference);
+    }
+}
+
+void QSGItemPrivate::itemChange(QSGItem::ItemChange change, const QSGItem::ItemChangeData &data)
+{
+    Q_Q(QSGItem);
+    switch(change) {
+    case QSGItem::ItemChildAddedChange:
+        q->itemChange(change, data);
+        if (_contents && componentComplete)
+            _contents->childAdded(data.item);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Children) {
+                change.listener->itemChildAdded(q, data.item);
+            }
+        }
+        break;
+    case QSGItem::ItemChildRemovedChange:
+        q->itemChange(change, data);
+        if (_contents && componentComplete)
+            _contents->childRemoved(data.item);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Children) {
+                change.listener->itemChildRemoved(q, data.item);
+            }
+        }
+        break;
+    case QSGItem::ItemSceneChange:
+        q->itemChange(change, data);
+        break;
+    case QSGItem::ItemVisibleHasChanged:
+        q->itemChange(change, data);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Visibility) {
+                change.listener->itemVisibilityChanged(q);
+            }
+        }
+        break;
+    case QSGItem::ItemParentHasChanged:
+        q->itemChange(change, data);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Parent) {
+                change.listener->itemParentChanged(q, data.item);
+            }
+        }
+        break;
+    case QSGItem::ItemOpacityHasChanged:
+        q->itemChange(change, data);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Opacity) {
+                change.listener->itemOpacityChanged(q);
+            }
+        }
+        break;
+    case QSGItem::ItemActiveFocusHasChanged:
+        q->itemChange(change, data);
+        break;
+    case QSGItem::ItemRotationHasChanged:
+        q->itemChange(change, data);
+        for(int ii = 0; ii < changeListeners.count(); ++ii) {
+            const QSGItemPrivate::ChangeListener &change = changeListeners.at(ii);
+            if (change.types & QSGItemPrivate::Rotation) {
+                change.listener->itemRotationChanged(q);
+            }
+        }
+        break;
+    }
+}
+
+bool QSGItem::smooth() const
+{
+    Q_D(const QSGItem);
+    return d->smooth;
+}
+
+void QSGItem::setSmooth(bool smooth)
+{
+    Q_D(QSGItem);
+    if (d->smooth == smooth)
+        return;
+
+    d->smooth = smooth;
+    d->dirty(QSGItemPrivate::Smooth);
+
+    emit smoothChanged(smooth);
+}
+
+QSGItem::Flags QSGItem::flags() const 
+{ 
+    Q_D(const QSGItem);
+    return (QSGItem::Flags)d->flags;
+}
+
+void QSGItem::setFlag(Flag flag, bool enabled)
+{ 
+    Q_D(QSGItem);
+    if (enabled)
+        setFlags((Flags)(d->flags | (quint32)flag));
+    else
+        setFlags((Flags)(d->flags & ~(quint32)flag));
+}
+
+void QSGItem::setFlags(Flags flags) 
+{ 
+    Q_D(QSGItem);
+
+    if ((flags & ItemIsFocusScope) != (d->flags & ItemIsFocusScope)) {
+        if (flags & ItemIsFocusScope && !d->childItems.isEmpty() && d->canvas) {
+            qWarning("QSGItem: Cannot set FocusScope once item has children and is in a canvas.");
+            flags &= ~ItemIsFocusScope;
+        } else if (d->flags & ItemIsFocusScope) {
+            qWarning("QSGItem: Cannot unset FocusScope flag.");
+            flags |= ItemIsFocusScope;
+        } 
+    }
+
+    if ((flags & ItemClipsChildrenToShape ) != (d->flags & ItemClipsChildrenToShape)) 
+        d->dirty(QSGItemPrivate::Clip);
+
+    d->flags = flags;
+}
+
+qreal QSGItem::x() const
+{
+    Q_D(const QSGItem);
+    return d->x;
+}
+
+qreal QSGItem::y() const
+{
+    Q_D(const QSGItem);
+    return d->y;
+}
+
+QPointF QSGItem::pos() const
+{
+    Q_D(const QSGItem);
+    return QPointF(d->x, d->y);
+}
+
+void QSGItem::setX(qreal v)
+{
+    Q_D(QSGItem);
+    if (d->x == v)
+        return;
+
+    qreal oldx = d->x;
+    d->x = v;
+
+    d->dirty(QSGItemPrivate::Position);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(oldx, y(), width(), height()));
+}
+
+void QSGItem::setY(qreal v)
+{
+    Q_D(QSGItem);
+    if (d->y == v)
+        return;
+
+    qreal oldy = d->y;
+    d->y = v;
+
+    d->dirty(QSGItemPrivate::Position);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), oldy, width(), height()));
+}
+
+void QSGItem::setPos(const QPointF &pos)
+{
+    Q_D(QSGItem);
+    if (QPointF(d->x, d->y) == pos)
+        return;
+
+    qreal oldx = d->x;
+    qreal oldy = d->y;
+
+    d->x = pos.x();
+    d->y = pos.y();
+
+    d->dirty(QSGItemPrivate::Position);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(oldx, oldy, width(), height()));
+}
+
+qreal QSGItem::width() const
+{
+    Q_D(const QSGItem);
+    return d->width;
+}
+
+void QSGItem::setWidth(qreal w)
+{
+    Q_D(QSGItem);
+    if (qIsNaN(w))
+        return;
+
+    d->widthValid = true;
+    if (d->width == w)
+        return;
+
+    qreal oldWidth = d->width;
+    d->width = w;
+
+    d->dirty(QSGItemPrivate::Size);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), y(), oldWidth, height()));
+}
+
+void QSGItem::resetWidth()
+{
+    Q_D(QSGItem);
+    d->widthValid = false;
+    setImplicitWidth(implicitWidth());
+}
+
+void QSGItemPrivate::implicitWidthChanged()
+{
+    Q_Q(QSGItem);
+    emit q->implicitWidthChanged();
+}
+
+qreal QSGItemPrivate::getImplicitWidth() const
+{
+    return implicitWidth;
+}
+
+qreal QSGItem::implicitWidth() const
+{
+    Q_D(const QSGItem);
+    return d->getImplicitWidth();
+}
+
+void QSGItem::setImplicitWidth(qreal w)
+{
+    Q_D(QSGItem);
+    bool changed = w != d->implicitWidth;
+    d->implicitWidth = w;
+    if (d->width == w || widthValid()) {
+        if (changed)
+            d->implicitWidthChanged();
+        return;
+    }   
+
+    qreal oldWidth = d->width;
+    d->width = w;
+    
+    d->dirty(QSGItemPrivate::Size);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), y(), oldWidth, height()));
+
+    if (changed)
+        d->implicitWidthChanged();
+}
+
+bool QSGItem::widthValid() const
+{
+    Q_D(const QSGItem);
+    return d->widthValid;
+}
+
+qreal QSGItem::height() const
+{
+    Q_D(const QSGItem);
+    return d->height;
+}
+
+void QSGItem::setHeight(qreal h)
+{
+    Q_D(QSGItem);
+    if (qIsNaN(h))
+        return;
+
+    d->heightValid = true;
+    if (d->height == h)
+        return;
+
+    qreal oldHeight = d->height;
+    d->height = h;
+
+    d->dirty(QSGItemPrivate::Size);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), y(), width(), oldHeight));
+}
+
+void QSGItem::resetHeight()
+{
+    Q_D(QSGItem);
+    d->heightValid = false;
+    setImplicitHeight(implicitHeight());
+}
+
+void QSGItemPrivate::implicitHeightChanged()
+{
+    Q_Q(QSGItem);
+    emit q->implicitHeightChanged();
+}
+
+qreal QSGItemPrivate::getImplicitHeight() const
+{
+    return implicitHeight;
+}
+
+qreal QSGItem::implicitHeight() const
+{
+    Q_D(const QSGItem);
+    return d->getImplicitHeight();
+}
+
+void QSGItem::setImplicitHeight(qreal h)
+{
+    Q_D(QSGItem);
+    bool changed = h != d->implicitHeight;
+    d->implicitHeight = h;
+    if (d->height == h || heightValid()) {
+        if (changed)
+            d->implicitHeightChanged();
+        return;
+    }
+
+    qreal oldHeight = d->height;
+    d->height = h;
+
+    d->dirty(QSGItemPrivate::Size);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), y(), width(), oldHeight));
+
+    if (changed)
+        d->implicitHeightChanged();
+}
+
+bool QSGItem::heightValid() const
+{
+    Q_D(const QSGItem);
+    return d->heightValid;
+}
+
+void QSGItem::setSize(const QSizeF &size)
+{
+    Q_D(QSGItem);
+    d->heightValid = true;
+    d->widthValid = true;
+
+    if (QSizeF(d->width, d->height) == size)
+        return;
+
+    qreal oldHeight = d->height;
+    qreal oldWidth = d->width;
+    d->height = size.height();
+    d->width = size.width();
+
+    d->dirty(QSGItemPrivate::Size);
+
+    geometryChanged(QRectF(x(), y(), width(), height()),
+                    QRectF(x(), y(), oldWidth, oldHeight));
+}
+
+bool QSGItem::hasActiveFocus() const
+{
+    Q_D(const QSGItem);
+    return d->activeFocus;
+}
+
+bool QSGItem::hasFocus() const
+{
+    Q_D(const QSGItem);
+    return d->focus;
+}
+
+void QSGItem::setFocus(bool focus)
+{
+    Q_D(QSGItem);
+    if (d->focus == focus)
+        return;
+
+    if (d->canvas) {
+        // Need to find our nearest focus scope
+        QSGItem *scope = parentItem();
+        while (scope && !scope->isFocusScope())
+            scope = scope->parentItem();
+        if (focus)
+            QSGCanvasPrivate::get(d->canvas)->setFocusInScope(scope, this);
+        else
+            QSGCanvasPrivate::get(d->canvas)->clearFocusInScope(scope, this);
+    } else {
+        d->focus = focus;
+        emit focusChanged(focus);
+    }
+}
+
+bool QSGItem::isFocusScope() const
+{
+    return flags() & ItemIsFocusScope;
+}
+
+QSGItem *QSGItem::scopedFocusItem() const
+{
+    Q_D(const QSGItem);
+    if (!isFocusScope())
+        return 0;
+    else 
+        return d->subFocusItem;
+}
+
+
+Qt::MouseButtons QSGItem::acceptedMouseButtons() const 
+{ 
+    Q_D(const QSGItem);
+    return d->acceptedMouseButtons;
+}
+
+void QSGItem::setAcceptedMouseButtons(Qt::MouseButtons buttons) 
+{ 
+    Q_D(QSGItem);
+    d->acceptedMouseButtons = buttons;
+}
+
+bool QSGItem::filtersChildMouseEvents() const
+{
+    Q_D(const QSGItem);
+    return d->filtersChildMouseEvents;
+}
+
+void QSGItem::setFiltersChildMouseEvents(bool filter) 
+{ 
+    Q_D(QSGItem);
+    d->filtersChildMouseEvents = filter;
+}
+
+bool QSGItem::isUnderMouse() const 
+{
+    Q_D(const QSGItem);
+    if (!d->canvas)
+        return false;
+
+    QPoint cursorPos = QCursor::pos();
+    if (QRectF(0, 0, width(), height()).contains(mapFromScene(d->canvas->mapFromGlobal(cursorPos))))
+        return true;
+    return false; 
+}
+
+bool QSGItem::acceptHoverEvents() const 
+{ 
+    Q_D(const QSGItem);
+    return d->hoverEnabled;
+}
+
+void QSGItem::setAcceptHoverEvents(bool enabled) 
+{ 
+    Q_D(QSGItem);
+    d->hoverEnabled = enabled;
+
+    if (d->canvas && d->hoverEnabled && !d->canvas->hasMouseTracking())
+        d->canvas->setMouseTracking(true);
+}
+
+void QSGItem::grabMouse() 
+{
+    Q_D(QSGItem);
+    if (!d->canvas)
+        return;
+    QSGCanvasPrivate *canvasPriv = QSGCanvasPrivate::get(d->canvas);
+    if (canvasPriv->mouseGrabberItem == this)
+        return;
+
+    QSGItem *oldGrabber = canvasPriv->mouseGrabberItem;
+    canvasPriv->mouseGrabberItem = this;
+    if (oldGrabber)
+        oldGrabber->mouseUngrabEvent();
+}
+
+void QSGItem::ungrabMouse() 
+{
+    Q_D(QSGItem);
+    if (!d->canvas)
+        return;
+    QSGCanvasPrivate *canvasPriv = QSGCanvasPrivate::get(d->canvas);
+    if (canvasPriv->mouseGrabberItem != this) {
+        qWarning("QSGItem::ungrabMouse(): Item is not the mouse grabber.");
+        return;
+    }
+
+    canvasPriv->mouseGrabberItem = 0;
+    mouseUngrabEvent();
+}
+
+bool QSGItem::keepMouseGrab() const
+{
+    Q_D(const QSGItem);
+    return d->keepMouse;
+}
+
+void QSGItem::setKeepMouseGrab(bool keep)
+{
+    Q_D(QSGItem);
+    d->keepMouse = keep;
+}
+
+QPointF QSGItem::mapToItem(const QSGItem *item, const QPointF &point) const 
+{ 
+    QPointF p = mapToScene(point);
+    if (item)
+        p = item->mapFromScene(p);
+    return p;
+}
+
+QPointF QSGItem::mapToScene(const QPointF &point) const 
+{ 
+    Q_D(const QSGItem);
+    return d->itemToCanvasTransform().map(point);
+}
+
+QRectF QSGItem::mapRectToItem(const QSGItem *item, const QRectF &rect) const
+{
+    Q_D(const QSGItem);
+    QTransform t = d->itemToCanvasTransform();
+    if (item)
+        t *= QSGItemPrivate::get(item)->canvasToItemTransform();
+    return t.mapRect(rect);
+}
+
+QRectF QSGItem::mapRectToScene(const QRectF &rect) const 
+{ 
+    Q_D(const QSGItem);
+    return d->itemToCanvasTransform().mapRect(rect);
+}
+
+QPointF QSGItem::mapFromItem(const QSGItem *item, const QPointF &point) const 
+{ 
+    QPointF p = item?item->mapToScene(point):point;
+    return mapFromScene(p);
+}
+
+QPointF QSGItem::mapFromScene(const QPointF &point) const 
+{ 
+    Q_D(const QSGItem);
+    return d->canvasToItemTransform().map(point);
+}
+
+QRectF QSGItem::mapRectFromItem(const QSGItem *item, const QRectF &rect) const 
+{ 
+    Q_D(const QSGItem);
+    QTransform t = item?QSGItemPrivate::get(item)->itemToCanvasTransform():QTransform();
+    t *= d->canvasToItemTransform();
+    return t.mapRect(rect);
+}
+
+QRectF QSGItem::mapRectFromScene(const QRectF &rect) const
+{
+    Q_D(const QSGItem);
+    return d->canvasToItemTransform().mapRect(rect);
+}
+
+bool QSGItem::event(QEvent *ev)
+{
+    return QObject::event(ev);
+
+#if 0
+    if (ev->type() == QEvent::PolishRequest) {
+        Q_D(QSGItem);
+        d->polishScheduled = false;
+        updatePolish();
+        return true;
+    } else {
+        return QObject::event(ev);
+    }
+#endif
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, QSGItem *item)
+{
+    if (!item) {
+        debug << "QSGItem(0)";
+        return debug;
+    }
+
+    debug << item->metaObject()->className() << "(this =" << ((void*)item)
+          << ", name=" << item->objectName()
+          << ", parent =" << ((void*)item->parentItem())
+          << ", geometry =" << QRectF(item->pos(), QSizeF(item->width(), item->height()))
+          << ", z =" << item->z() << ')';
+    return debug;
+}
+#endif
+
+qint64 QSGItemPrivate::consistentTime = -1;
+void QSGItemPrivate::setConsistentTime(qint64 t)
+{
+    consistentTime = t;
+}
+
+class QElapsedTimerConsistentTimeHack
+{
+public:
+    void start() {
+        t1 = QSGItemPrivate::consistentTime;
+        t2 = 0;
+    }
+    qint64 elapsed() {
+        return QSGItemPrivate::consistentTime - t1;
+    }
+    qint64 restart() {
+        qint64 val = QSGItemPrivate::consistentTime - t1;
+        t1 = QSGItemPrivate::consistentTime;
+        t2 = 0;
+        return val;
+    }
+
+private:
+    qint64 t1;
+    qint64 t2;
+};
+
+void QSGItemPrivate::start(QElapsedTimer &t)
+{
+    if (QSGItemPrivate::consistentTime == -1)
+        t.start();
+    else
+        ((QElapsedTimerConsistentTimeHack*)&t)->start();
+}
+
+qint64 QSGItemPrivate::elapsed(QElapsedTimer &t)
+{
+    if (QSGItemPrivate::consistentTime == -1)
+        return t.elapsed();
+    else
+        return ((QElapsedTimerConsistentTimeHack*)&t)->elapsed();
+}
+
+qint64 QSGItemPrivate::restart(QElapsedTimer &t)
+{
+    if (QSGItemPrivate::consistentTime == -1)
+        return t.restart();
+    else
+        return ((QElapsedTimerConsistentTimeHack*)&t)->restart();
+}
+
+QT_END_NAMESPACE
+
+#include <moc_qsgitem.cpp>
diff --git a/src/declarative/items/qsgitem.h b/src/declarative/items/qsgitem.h
new file mode 100644
index 0000000000..564d819000
--- /dev/null
+++ b/src/declarative/items/qsgitem.h
@@ -0,0 +1,399 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGITEM_H
+#define QSGITEM_H
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+
+#include <QtCore/QObject>
+#include <QtCore/QList>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qfont.h>
+#include <QtGui/qaction.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItem;
+class QSGTransformPrivate;
+class QSGTransform : public QObject
+{
+    Q_OBJECT
+public:
+    QSGTransform(QObject *parent = 0);
+    ~QSGTransform();
+
+    void appendToItem(QSGItem *);
+    void prependToItem(QSGItem *);
+
+    virtual void applyTo(QMatrix4x4 *matrix) const = 0;
+
+protected Q_SLOTS:
+    void update();
+
+protected:
+    QSGTransform(QSGTransformPrivate &dd, QObject *parent);
+
+private:
+    Q_DECLARE_PRIVATE(QSGTransform);
+};
+
+class QDeclarativeState;
+class QSGAnchorLine;
+class QDeclarativeTransition;
+class QSGKeyEvent;
+class QSGAnchors;
+class QSGItemPrivate;
+class QSGCanvas;
+class QSGEngine;
+class QTouchEvent;
+class QSGNode;
+class QSGTransformNode;
+class Q_DECLARATIVE_EXPORT QSGItem : public QObject, public QDeclarativeParserStatus
+{
+    Q_OBJECT
+    Q_INTERFACES(QDeclarativeParserStatus)
+
+    Q_PROPERTY(QSGItem *parent READ parentItem WRITE setParentItem NOTIFY parentChanged DESIGNABLE false FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QDeclarativeListProperty<QObject> data READ data DESIGNABLE false)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QDeclarativeListProperty<QObject> resources READ resources DESIGNABLE false)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QDeclarativeListProperty<QSGItem> children READ children NOTIFY childrenChanged DESIGNABLE false)
+
+    Q_PROPERTY(QPointF pos READ pos FINAL)
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged FINAL)
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged FINAL)
+    Q_PROPERTY(qreal z READ z WRITE setZ NOTIFY zChanged FINAL)
+    Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged RESET resetWidth FINAL)
+    Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY heightChanged RESET resetHeight FINAL)
+
+    Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged FINAL)
+    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL)
+
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QDeclarativeListProperty<QDeclarativeState> states READ states DESIGNABLE false)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QDeclarativeListProperty<QDeclarativeTransition> transitions READ transitions DESIGNABLE false)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QString state READ state WRITE setState NOTIFY stateChanged)
+    Q_PROPERTY(QRectF childrenRect READ childrenRect NOTIFY childrenRectChanged DESIGNABLE false FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchors * anchors READ anchors DESIGNABLE false CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine left READ left CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine right READ right CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine horizontalCenter READ horizontalCenter CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine top READ top CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine bottom READ bottom CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine verticalCenter READ verticalCenter CONSTANT FINAL)
+    Q_PRIVATE_PROPERTY(QSGItem::d_func(), QSGAnchorLine baseline READ baseline CONSTANT FINAL)
+    Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged)
+
+    Q_PROPERTY(bool clip READ clip WRITE setClip NOTIFY clipChanged)
+
+    Q_PROPERTY(bool focus READ hasFocus WRITE setFocus NOTIFY focusChanged FINAL)
+    Q_PROPERTY(bool activeFocus READ hasActiveFocus NOTIFY activeFocusChanged FINAL)
+
+    Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
+    Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged)
+    Q_PROPERTY(TransformOrigin transformOrigin READ transformOrigin WRITE setTransformOrigin NOTIFY transformOriginChanged)
+    Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint)  // XXX todo - notify?
+    Q_PROPERTY(QDeclarativeListProperty<QSGTransform> transform READ transform DESIGNABLE false FINAL)
+
+    Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged)
+    Q_PROPERTY(qreal implicitWidth READ implicitWidth WRITE setImplicitWidth NOTIFY implicitWidthChanged)
+    Q_PROPERTY(qreal implicitHeight READ implicitHeight WRITE setImplicitHeight NOTIFY implicitHeightChanged)
+
+    Q_ENUMS(TransformOrigin)
+    Q_CLASSINFO("DefaultProperty", "data")
+
+public:
+    enum Flag {
+        ItemClipsChildrenToShape  = 0x01,
+        ItemAcceptsInputMethod    = 0x02,
+        ItemIsFocusScope          = 0x04,
+        ItemHasContents           = 0x08,
+        // Remember to increment the size of QSGItemPrivate::flags
+    };
+    Q_DECLARE_FLAGS(Flags, Flag)
+
+    enum ItemChange {
+        ItemChildAddedChange,      // value.item
+        ItemChildRemovedChange,    // value.item
+        ItemSceneChange,           // value.canvas
+        ItemVisibleHasChanged,     // value.realValue
+        ItemParentHasChanged,      // value.item
+        ItemOpacityHasChanged,     // value.realValue
+        ItemActiveFocusHasChanged, // value.boolValue
+        ItemRotationHasChanged,    // value.realValue
+    };
+
+    union ItemChangeData {
+        ItemChangeData(QSGItem *v) : item(v) {}
+        ItemChangeData(QSGCanvas *v) : canvas(v) {}
+        ItemChangeData(qreal v) : realValue(v) {}
+        ItemChangeData(bool v) : boolValue(v) {}
+
+        QSGItem *item;
+        QSGCanvas *canvas;
+        qreal realValue;
+        bool boolValue;
+    };
+
+    enum TransformOrigin {
+        TopLeft, Top, TopRight,
+        Left, Center, Right,
+        BottomLeft, Bottom, BottomRight
+    };
+
+    QSGItem(QSGItem *parent = 0);
+    virtual ~QSGItem();
+
+    QSGEngine *sceneGraphEngine() const;
+
+    QSGCanvas *canvas() const;
+    QSGItem *parentItem() const;
+    void setParentItem(QSGItem *parent);
+    void stackBefore(const QSGItem *);
+    void stackAfter(const QSGItem *);
+
+    QRectF childrenRect();
+    QList<QSGItem *> childItems() const;
+
+    bool clip() const;
+    void setClip(bool);
+
+    qreal baselineOffset() const;
+    void setBaselineOffset(qreal);
+
+    QDeclarativeListProperty<QSGTransform> transform();
+
+    qreal x() const;
+    qreal y() const;
+    QPointF pos() const;
+    void setX(qreal);
+    void setY(qreal);
+    void setPos(const QPointF &);
+
+    qreal width() const;
+    void setWidth(qreal);
+    void resetWidth();
+    qreal implicitWidth() const;
+
+    qreal height() const;
+    void setHeight(qreal);
+    void resetHeight();
+    qreal implicitHeight() const;
+
+    void setSize(const QSizeF &size);
+
+    TransformOrigin transformOrigin() const;
+    void setTransformOrigin(TransformOrigin);
+    QPointF transformOriginPoint() const;
+
+    qreal z() const;
+    void setZ(qreal);
+
+    qreal rotation() const;
+    void setRotation(qreal);
+    qreal scale() const;
+    void setScale(qreal);
+
+    qreal opacity() const;
+    void setOpacity(qreal);
+
+    bool isVisible() const;
+    void setVisible(bool);
+
+    bool isEnabled() const;
+    void setEnabled(bool);
+
+    bool smooth() const;
+    void setSmooth(bool);
+
+    Flags flags() const;
+    void setFlag(Flag flag, bool enabled = true);
+    void setFlags(Flags flags);
+
+    QRectF boundingRect() const;
+
+    bool hasActiveFocus() const;
+    bool hasFocus() const;
+    void setFocus(bool);
+    bool isFocusScope() const;
+    QSGItem *scopedFocusItem() const;
+
+    Qt::MouseButtons acceptedMouseButtons() const;
+    void setAcceptedMouseButtons(Qt::MouseButtons buttons);
+    bool acceptHoverEvents() const;
+    void setAcceptHoverEvents(bool enabled);
+
+    bool isUnderMouse() const;
+    void grabMouse();
+    void ungrabMouse();
+    bool keepMouseGrab() const;
+    void setKeepMouseGrab(bool);
+    bool filtersChildMouseEvents() const;
+    void setFiltersChildMouseEvents(bool filter);
+
+    QTransform itemTransform(QSGItem *, bool *) const;
+    QPointF mapToItem(const QSGItem *item, const QPointF &point) const;
+    QPointF mapToScene(const QPointF &point) const;
+    QRectF mapRectToItem(const QSGItem *item, const QRectF &rect) const;
+    QRectF mapRectToScene(const QRectF &rect) const;
+    QPointF mapFromItem(const QSGItem *item, const QPointF &point) const;
+    QPointF mapFromScene(const QPointF &point) const;
+    QRectF mapRectFromItem(const QSGItem *item, const QRectF &rect) const;
+    QRectF mapRectFromScene(const QRectF &rect) const;
+
+    void polish();
+
+    Q_INVOKABLE QScriptValue mapFromItem(const QScriptValue &item, qreal x, qreal y) const;
+    Q_INVOKABLE QScriptValue mapToItem(const QScriptValue &item, qreal x, qreal y) const;
+    Q_INVOKABLE void forceActiveFocus();
+    Q_INVOKABLE QSGItem *childAt(qreal x, qreal y) const;
+
+    Qt::InputMethodHints inputMethodHints() const;
+    void setInputMethodHints(Qt::InputMethodHints hints);
+    virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+
+    struct UpdatePaintNodeData {
+       QSGTransformNode *transformNode;
+    private:
+       friend class QSGCanvasPrivate;
+       UpdatePaintNodeData();
+    };
+
+public Q_SLOTS:
+    void update();
+    void updateMicroFocus();
+
+Q_SIGNALS:
+    void childrenRectChanged(const QRectF &);
+    void baselineOffsetChanged(qreal);
+    void stateChanged(const QString &);
+    void focusChanged(bool);
+    void activeFocusChanged(bool);
+    void parentChanged(QSGItem *);
+    void transformOriginChanged(TransformOrigin);
+    void smoothChanged(bool);
+    void clipChanged(bool);
+
+    // XXX todo
+    void childrenChanged();
+    void opacityChanged();
+    void enabledChanged();
+    void visibleChanged();
+    void rotationChanged();
+    void scaleChanged();
+
+    void xChanged();
+    void yChanged();
+    void widthChanged();
+    void heightChanged();
+    void zChanged();
+    void implicitWidthChanged();
+    void implicitHeightChanged();
+
+protected:
+    virtual bool event(QEvent *);
+
+    bool isComponentComplete() const;
+    virtual void itemChange(ItemChange, const ItemChangeData &);
+
+    void setImplicitWidth(qreal);
+    bool widthValid() const; // ### better name?
+    void setImplicitHeight(qreal);
+    bool heightValid() const; // ### better name?
+
+    virtual void classBegin();
+    virtual void componentComplete();
+
+    virtual void keyPressEvent(QKeyEvent *event);
+    virtual void keyReleaseEvent(QKeyEvent *event);
+    virtual void inputMethodEvent(QInputMethodEvent *);
+    virtual void focusInEvent(QFocusEvent *);
+    virtual void focusOutEvent(QFocusEvent *);
+    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseUngrabEvent(); // XXX todo - params?
+    virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
+    virtual void touchEvent(QTouchEvent *event);
+    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+    virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
+    virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+    virtual bool childMouseEventFilter(QSGItem *, QEvent *);
+
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    virtual void updatePolish();
+
+protected:
+    QSGItem(QSGItemPrivate &dd, QSGItem *parent = 0);
+
+private:
+    friend class QSGCanvas;
+    friend class QSGCanvasPrivate;
+    friend class QSGRenderer;
+    Q_DISABLE_COPY(QSGItem)
+    Q_DECLARE_PRIVATE(QSGItem)
+};
+
+// XXX todo
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGItem::Flags)
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug Q_DECLARATIVE_EXPORT operator<<(QDebug debug, QSGItem *item);
+#endif
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGItem)
+QML_DECLARE_TYPE(QSGTransform)
+
+QT_END_HEADER
+
+#endif // QSGITEM_H
diff --git a/src/declarative/items/qsgitem_p.h b/src/declarative/items/qsgitem_p.h
new file mode 100644
index 0000000000..a13fd6a85a
--- /dev/null
+++ b/src/declarative/items/qsgitem_p.h
@@ -0,0 +1,710 @@
+// Commit: 5c783d0a9a912816813945387903857a314040b5
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGITEM_P_H
+#define QSGITEM_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgitem.h"
+
+#include "qsganchors_p.h"
+#include "qsganchors_p_p.h"
+#include "qsgitemchangelistener_p.h"
+
+#include "qsgcanvas_p.h"
+
+#include "qsgnode.h"
+#include "qsgclipnode_p.h"
+
+#include <private/qpodvector_p.h>
+#include <private/qdeclarativestate_p.h>
+#include <private/qdeclarativenullablevalue_p_p.h>
+#include <private/qdeclarativenotifier_p.h>
+#include <private/qdeclarativeglobal_p.h>
+
+#include <qdeclarative.h>
+#include <qdeclarativecontext.h>
+
+#include <QtCore/qlist.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qelapsedtimer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkReply;
+class QSGItemKeyFilter;
+class QSGLayoutMirroringAttached;
+
+//### merge into private?
+class QSGContents : public QObject, public QSGItemChangeListener
+{
+    Q_OBJECT
+public:
+    QSGContents(QSGItem *item);
+    ~QSGContents();
+
+    QRectF rectF() const;
+
+    void childRemoved(QSGItem *item);
+    void childAdded(QSGItem *item);
+
+    void calcGeometry() { calcWidth(); calcHeight(); }
+    void complete();
+
+Q_SIGNALS:
+    void rectChanged(QRectF);
+
+protected:
+    void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
+    void itemDestroyed(QSGItem *item);
+    //void itemVisibilityChanged(QSGItem *item)
+
+private:
+    void calcHeight(QSGItem *changed = 0);
+    void calcWidth(QSGItem *changed = 0);
+
+    QSGItem *m_item;
+    qreal m_x;
+    qreal m_y;
+    qreal m_width;
+    qreal m_height;
+};
+
+class QSGTransformPrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QSGTransform);
+public:
+    static QSGTransformPrivate* get(QSGTransform *transform) { return transform->d_func(); }
+
+    QSGTransformPrivate();
+
+    QList<QSGItem *> items;
+};
+
+class Q_DECLARATIVE_EXPORT QSGItemPrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QSGItem)
+
+public:
+    static QSGItemPrivate* get(QSGItem *item) { return item->d_func(); }
+    static const QSGItemPrivate* get(const QSGItem *item) { return item->d_func(); }
+
+    QSGItemPrivate();
+    void init(QSGItem *parent);
+
+    QDeclarativeListProperty<QObject> data();
+    QDeclarativeListProperty<QObject> resources();
+    QDeclarativeListProperty<QSGItem> children();
+
+    QDeclarativeListProperty<QDeclarativeState> states();
+    QDeclarativeListProperty<QDeclarativeTransition> transitions();
+
+    QString state() const;
+    void setState(const QString &);
+
+    QSGAnchorLine left() const;
+    QSGAnchorLine right() const;
+    QSGAnchorLine horizontalCenter() const;
+    QSGAnchorLine top() const;
+    QSGAnchorLine bottom() const;
+    QSGAnchorLine verticalCenter() const;
+    QSGAnchorLine baseline() const;
+
+    // data property
+    static void data_append(QDeclarativeListProperty<QObject> *, QObject *);
+    static int data_count(QDeclarativeListProperty<QObject> *);
+    static QObject *data_at(QDeclarativeListProperty<QObject> *, int);
+    static void data_clear(QDeclarativeListProperty<QObject> *);
+
+    // resources property
+    static QObject *resources_at(QDeclarativeListProperty<QObject> *, int);
+    static void resources_append(QDeclarativeListProperty<QObject> *, QObject *);
+    static int resources_count(QDeclarativeListProperty<QObject> *);
+    static void resources_clear(QDeclarativeListProperty<QObject> *);
+
+    // children property
+    static void children_append(QDeclarativeListProperty<QSGItem> *, QSGItem *);
+    static int children_count(QDeclarativeListProperty<QSGItem> *);
+    static QSGItem *children_at(QDeclarativeListProperty<QSGItem> *, int);
+    static void children_clear(QDeclarativeListProperty<QSGItem> *);
+
+    // transform property
+    static int transform_count(QDeclarativeListProperty<QSGTransform> *list);
+    static void transform_append(QDeclarativeListProperty<QSGTransform> *list, QSGTransform *);
+    static QSGTransform *transform_at(QDeclarativeListProperty<QSGTransform> *list, int);
+    static void transform_clear(QDeclarativeListProperty<QSGTransform> *list);
+
+    QSGAnchors *anchors() const;
+    mutable QSGAnchors *_anchors;
+    QSGContents *_contents;
+
+    QDeclarativeNullableValue<qreal> baselineOffset;
+
+    struct AnchorLines {
+        AnchorLines(QSGItem *);
+        QSGAnchorLine left;
+        QSGAnchorLine right;
+        QSGAnchorLine hCenter;
+        QSGAnchorLine top;
+        QSGAnchorLine bottom;
+        QSGAnchorLine vCenter;
+        QSGAnchorLine baseline;
+    };
+    mutable AnchorLines *_anchorLines;
+    AnchorLines *anchorLines() const;
+
+    enum ChangeType {
+        Geometry = 0x01,
+        SiblingOrder = 0x02,
+        Visibility = 0x04,
+        Opacity = 0x08,
+        Destroyed = 0x10,
+        Parent = 0x20,
+        Children = 0x40,
+        Rotation = 0x80,
+    };
+
+    Q_DECLARE_FLAGS(ChangeTypes, ChangeType)
+
+    struct ChangeListener {
+        ChangeListener(QSGItemChangeListener *l, QSGItemPrivate::ChangeTypes t) : listener(l), types(t) {}
+        QSGItemChangeListener *listener;
+        QSGItemPrivate::ChangeTypes types;
+        bool operator==(const ChangeListener &other) const { return listener == other.listener && types == other.types; }
+    };
+
+    void addItemChangeListener(QSGItemChangeListener *listener, ChangeTypes types) {
+        changeListeners.append(ChangeListener(listener, types));
+    }
+    void removeItemChangeListener(QSGItemChangeListener *, ChangeTypes types);
+    QPODVector<ChangeListener,4> changeListeners;
+
+    QDeclarativeStateGroup *_states();
+    QDeclarativeStateGroup *_stateGroup;
+
+    QSGItem::TransformOrigin origin:5;
+    quint32 flags:4;
+    bool widthValid:1;
+    bool heightValid:1;
+    bool componentComplete:1;
+    bool keepMouse:1;
+    bool hoverEnabled:1;
+    bool smooth:1;
+    bool focus:1;
+    bool activeFocus:1;
+    bool notifiedFocus:1;
+    bool notifiedActiveFocus:1;
+    bool filtersChildMouseEvents:1;
+    bool explicitVisible:1;
+    bool effectiveVisible:1;
+    bool explicitEnable:1;
+    bool effectiveEnable:1;
+    bool polishScheduled:1;
+    bool inheritedLayoutMirror:1;
+    bool effectiveLayoutMirror:1;
+    bool isMirrorImplicit:1;
+    bool inheritMirrorFromParent:1;
+    bool inheritMirrorFromItem:1;
+    quint32 dummy:2;
+
+    QSGCanvas *canvas;
+    QSGContext *sceneGraphContext() const { return static_cast<QSGCanvasPrivate *>(QObjectPrivate::get(canvas))->context; }
+
+    QSGItem *parentItem;
+    QList<QSGItem *> childItems;
+    QList<QSGItem *> paintOrderChildItems() const;
+    void addChild(QSGItem *);
+    void removeChild(QSGItem *);
+    void siblingOrderChanged();
+
+    class InitializationState {
+    public:
+        QSGItem *getFocusScope(QSGItem *item);
+        void clear();
+        void clear(QSGItem *focusScope);
+    private:
+        QSGItem *focusScope;
+    };
+    void initCanvas(InitializationState *, QSGCanvas *);
+
+    QSGItem *subFocusItem;
+
+    QTransform canvasToItemTransform() const;
+    QTransform itemToCanvasTransform() const;
+    void itemToParentTransform(QTransform &) const;
+
+    qreal x;
+    qreal y;
+    qreal width;
+    qreal height;
+    qreal implicitWidth;
+    qreal implicitHeight;
+
+    qreal z;
+    qreal scale;
+    qreal rotation;
+    qreal opacity;
+
+    QSGLayoutMirroringAttached* attachedLayoutDirection;
+
+    Qt::MouseButtons acceptedMouseButtons;
+    Qt::InputMethodHints imHints;
+
+    virtual qreal getImplicitWidth() const;
+    virtual qreal getImplicitHeight() const;
+    virtual void implicitWidthChanged();
+    virtual void implicitHeightChanged();
+
+    void resolveLayoutMirror();
+    void setImplicitLayoutMirror(bool mirror, bool inherit);
+    void setLayoutMirror(bool mirror);
+    bool isMirrored() const {
+        return effectiveLayoutMirror;
+    }
+
+    QPointF computeTransformOrigin() const;
+    QList<QSGTransform *> transforms;
+    virtual void transformChanged();
+
+    QSGItemKeyFilter *keyHandler;
+    void deliverKeyEvent(QKeyEvent *);
+    void deliverInputMethodEvent(QInputMethodEvent *);
+    void deliverFocusEvent(QFocusEvent *);
+    void deliverMouseEvent(QGraphicsSceneMouseEvent *);
+    void deliverWheelEvent(QGraphicsSceneWheelEvent *);
+    void deliverTouchEvent(QTouchEvent *);
+    void deliverHoverEvent(QGraphicsSceneHoverEvent *);
+
+    bool calcEffectiveVisible() const;
+    void setEffectiveVisibleRecur(bool);
+    bool calcEffectiveEnable() const;
+    void setEffectiveEnableRecur(bool);
+
+    // XXX todo
+    enum DirtyType {
+        TransformOrigin         = 0x00000001,
+        Transform               = 0x00000002,
+        BasicTransform          = 0x00000004,
+        Position                = 0x00000008,
+        Size                    = 0x00000010,
+
+        ZValue                  = 0x00000020,
+        Content                 = 0x00000040,
+        Smooth                  = 0x00000080,
+        OpacityValue            = 0x00000100,
+        ChildrenChanged         = 0x00000200,
+        ChildrenStackingChanged = 0x00000400,
+        ParentChanged           = 0x00000800,
+
+        Clip                    = 0x00001000,
+        Canvas                  = 0x00002000,
+
+        EffectReference         = 0x00008000,
+        Visible                 = 0x00010000,
+        HideReference           = 0x00020000,
+        // When you add an attribute here, don't forget to update
+        // dirtyToString()
+
+        TransformUpdateMask     = TransformOrigin | Transform | BasicTransform | Position | Size | Canvas,
+        ComplexTransformUpdateMask     = Transform | Canvas,
+        ContentUpdateMask       = Size | Content | Smooth | Canvas,
+        ChildrenUpdateMask      = ChildrenChanged | ChildrenStackingChanged | EffectReference | Canvas,
+
+    };
+    quint32 dirtyAttributes;
+    QString dirtyToString() const;
+    void dirty(DirtyType);
+    void addToDirtyList();
+    void removeFromDirtyList();
+    QSGItem *nextDirtyItem;
+    QSGItem**prevDirtyItem;
+
+    inline QSGTransformNode *itemNode();
+    inline QSGNode *childContainerNode();
+
+    /*
+      QSGNode order is:
+         - itemNode
+         - (opacityNode)
+         - (clipNode)
+         - (effectNode)
+         - groupNode
+     */
+
+    QSGTransformNode *itemNodeInstance;
+    QSGOpacityNode *opacityNode;
+    QSGDefaultClipNode *clipNode;
+    QSGRootNode *rootNode;
+    QSGNode *groupNode;
+    QSGNode *paintNode;
+    int paintNodeIndex;
+
+    virtual QSGTransformNode *createTransformNode();
+
+    // A reference from an effect item means that this item is used by the effect, so
+    // it should insert a root node.
+    void refFromEffectItem(bool hide);
+    void derefFromEffectItem(bool unhide);
+    int effectRefCount;
+    int hideRefCount;
+
+    void itemChange(QSGItem::ItemChange, const QSGItem::ItemChangeData &);
+
+    virtual void mirrorChange() {}
+
+    static qint64 consistentTime;
+    static void setConsistentTime(qint64 t);
+    static void start(QElapsedTimer &);
+    static qint64 elapsed(QElapsedTimer &);
+    static qint64 restart(QElapsedTimer &);
+};
+
+/*
+    Key filters can be installed on a QSGItem, but not removed.  Currently they
+    are only used by attached objects (which are only destroyed on Item
+    destruction), so this isn't a problem.  If in future this becomes any form
+    of public API, they will have to support removal too.
+*/
+class QSGItemKeyFilter
+{
+public:
+    QSGItemKeyFilter(QSGItem * = 0);
+    virtual ~QSGItemKeyFilter();
+
+    virtual void keyPressed(QKeyEvent *event, bool post);
+    virtual void keyReleased(QKeyEvent *event, bool post);
+    virtual void inputMethodEvent(QInputMethodEvent *event, bool post);
+    virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+    virtual void componentComplete();
+
+    bool m_processPost;
+
+private:
+    QSGItemKeyFilter *m_next;
+};
+
+class QSGKeyNavigationAttachedPrivate : public QObjectPrivate
+{
+public:
+    QSGKeyNavigationAttachedPrivate()
+        : QObjectPrivate(),
+          left(0), right(0), up(0), down(0), tab(0), backtab(0),
+          leftSet(false), rightSet(false), upSet(false), downSet(false),
+          tabSet(false), backtabSet(false) {}
+
+    QSGItem *left;
+    QSGItem *right;
+    QSGItem *up;
+    QSGItem *down;
+    QSGItem *tab;
+    QSGItem *backtab;
+    bool leftSet : 1;
+    bool rightSet : 1;
+    bool upSet : 1;
+    bool downSet : 1;
+    bool tabSet : 1;
+    bool backtabSet : 1;
+};
+
+class QSGKeyNavigationAttached : public QObject, public QSGItemKeyFilter
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGKeyNavigationAttached)
+
+    Q_PROPERTY(QSGItem *left READ left WRITE setLeft NOTIFY leftChanged)
+    Q_PROPERTY(QSGItem *right READ right WRITE setRight NOTIFY rightChanged)
+    Q_PROPERTY(QSGItem *up READ up WRITE setUp NOTIFY upChanged)
+    Q_PROPERTY(QSGItem *down READ down WRITE setDown NOTIFY downChanged)
+    Q_PROPERTY(QSGItem *tab READ tab WRITE setTab NOTIFY tabChanged)
+    Q_PROPERTY(QSGItem *backtab READ backtab WRITE setBacktab NOTIFY backtabChanged)
+    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
+
+    Q_ENUMS(Priority)
+
+public:
+    QSGKeyNavigationAttached(QObject * = 0);
+
+    QSGItem *left() const;
+    void setLeft(QSGItem *);
+    QSGItem *right() const;
+    void setRight(QSGItem *);
+    QSGItem *up() const;
+    void setUp(QSGItem *);
+    QSGItem *down() const;
+    void setDown(QSGItem *);
+    QSGItem *tab() const;
+    void setTab(QSGItem *);
+    QSGItem *backtab() const;
+    void setBacktab(QSGItem *);
+
+    enum Priority { BeforeItem, AfterItem };
+    Priority priority() const;
+    void setPriority(Priority);
+
+    static QSGKeyNavigationAttached *qmlAttachedProperties(QObject *);
+
+Q_SIGNALS:
+    void leftChanged();
+    void rightChanged();
+    void upChanged();
+    void downChanged();
+    void tabChanged();
+    void backtabChanged();
+    void priorityChanged();
+
+private:
+    virtual void keyPressed(QKeyEvent *event, bool post);
+    virtual void keyReleased(QKeyEvent *event, bool post);
+    void setFocusNavigation(QSGItem *currentItem, const char *dir);
+};
+
+class QSGLayoutMirroringAttached : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(bool enabled READ enabled WRITE setEnabled RESET resetEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(bool childrenInherit READ childrenInherit WRITE setChildrenInherit NOTIFY childrenInheritChanged)
+
+public:
+    explicit QSGLayoutMirroringAttached(QObject *parent = 0);
+
+    bool enabled() const;
+    void setEnabled(bool);
+    void resetEnabled();
+
+    bool childrenInherit() const;
+    void setChildrenInherit(bool);
+
+    static QSGLayoutMirroringAttached *qmlAttachedProperties(QObject *);
+Q_SIGNALS:
+    void enabledChanged();
+    void childrenInheritChanged();
+private:
+    friend class QSGItemPrivate;
+    QSGItemPrivate *itemPrivate;
+};
+
+class QSGKeysAttachedPrivate : public QObjectPrivate
+{
+public:
+    QSGKeysAttachedPrivate()
+        : QObjectPrivate(), inPress(false), inRelease(false)
+        , inIM(false), enabled(true), imeItem(0), item(0)
+    {}
+
+    bool isConnected(const char *signalName);
+
+    //loop detection
+    bool inPress:1;
+    bool inRelease:1;
+    bool inIM:1;
+
+    bool enabled : 1;
+
+    QSGItem *imeItem;
+    QList<QSGItem *> targets;
+    QSGItem *item;
+};
+
+class QSGKeysAttached : public QObject, public QSGItemKeyFilter
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGKeysAttached)
+
+    Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(QDeclarativeListProperty<QSGItem> forwardTo READ forwardTo)
+    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
+
+    Q_ENUMS(Priority)
+
+public:
+    QSGKeysAttached(QObject *parent=0);
+    ~QSGKeysAttached();
+
+    bool enabled() const { Q_D(const QSGKeysAttached); return d->enabled; }
+    void setEnabled(bool enabled) {
+        Q_D(QSGKeysAttached);
+        if (enabled != d->enabled) {
+            d->enabled = enabled;
+            emit enabledChanged();
+        }
+    }
+
+    enum Priority { BeforeItem, AfterItem};
+    Priority priority() const;
+    void setPriority(Priority);
+
+    QDeclarativeListProperty<QSGItem> forwardTo() {
+        Q_D(QSGKeysAttached);
+        return QDeclarativeListProperty<QSGItem>(this, d->targets);
+    }
+
+    virtual void componentComplete();
+
+    static QSGKeysAttached *qmlAttachedProperties(QObject *);
+
+Q_SIGNALS:
+    void enabledChanged();
+    void priorityChanged();
+    void pressed(QSGKeyEvent *event);
+    void released(QSGKeyEvent *event);
+    void digit0Pressed(QSGKeyEvent *event);
+    void digit1Pressed(QSGKeyEvent *event);
+    void digit2Pressed(QSGKeyEvent *event);
+    void digit3Pressed(QSGKeyEvent *event);
+    void digit4Pressed(QSGKeyEvent *event);
+    void digit5Pressed(QSGKeyEvent *event);
+    void digit6Pressed(QSGKeyEvent *event);
+    void digit7Pressed(QSGKeyEvent *event);
+    void digit8Pressed(QSGKeyEvent *event);
+    void digit9Pressed(QSGKeyEvent *event);
+
+    void leftPressed(QSGKeyEvent *event);
+    void rightPressed(QSGKeyEvent *event);
+    void upPressed(QSGKeyEvent *event);
+    void downPressed(QSGKeyEvent *event);
+    void tabPressed(QSGKeyEvent *event);
+    void backtabPressed(QSGKeyEvent *event);
+
+    void asteriskPressed(QSGKeyEvent *event);
+    void numberSignPressed(QSGKeyEvent *event);
+    void escapePressed(QSGKeyEvent *event);
+    void returnPressed(QSGKeyEvent *event);
+    void enterPressed(QSGKeyEvent *event);
+    void deletePressed(QSGKeyEvent *event);
+    void spacePressed(QSGKeyEvent *event);
+    void backPressed(QSGKeyEvent *event);
+    void cancelPressed(QSGKeyEvent *event);
+    void selectPressed(QSGKeyEvent *event);
+    void yesPressed(QSGKeyEvent *event);
+    void noPressed(QSGKeyEvent *event);
+    void context1Pressed(QSGKeyEvent *event);
+    void context2Pressed(QSGKeyEvent *event);
+    void context3Pressed(QSGKeyEvent *event);
+    void context4Pressed(QSGKeyEvent *event);
+    void callPressed(QSGKeyEvent *event);
+    void hangupPressed(QSGKeyEvent *event);
+    void flipPressed(QSGKeyEvent *event);
+    void menuPressed(QSGKeyEvent *event);
+    void volumeUpPressed(QSGKeyEvent *event);
+    void volumeDownPressed(QSGKeyEvent *event);
+
+private:
+    virtual void keyPressed(QKeyEvent *event, bool post);
+    virtual void keyReleased(QKeyEvent *event, bool post);
+    virtual void inputMethodEvent(QInputMethodEvent *, bool post);
+    virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+
+    const QByteArray keyToSignal(int key) {
+        QByteArray keySignal;
+        if (key >= Qt::Key_0 && key <= Qt::Key_9) {
+            keySignal = "digit0Pressed";
+            keySignal[5] = '0' + (key - Qt::Key_0);
+        } else {
+            int i = 0;
+            while (sigMap[i].key && sigMap[i].key != key)
+                ++i;
+            keySignal = sigMap[i].sig;
+        }
+        return keySignal;
+    }
+
+    struct SigMap {
+        int key;
+        const char *sig;
+    };
+
+    static const SigMap sigMap[];
+};
+
+QSGTransformNode *QSGItemPrivate::itemNode()
+{ 
+    if (!itemNodeInstance) {
+        itemNodeInstance = createTransformNode();
+#ifdef QML_RUNTIME_TESTING
+        Q_Q(QSGItem);
+        itemNodeInstance->description = QString::fromLatin1("QSGItem(%1)").arg(QString::fromLatin1(q->metaObject()->className()));
+#endif
+    }
+    return itemNodeInstance; 
+}
+
+QSGNode *QSGItemPrivate::childContainerNode()
+{
+    if (!groupNode) {
+        groupNode = new QSGNode();
+        if (rootNode)
+            rootNode->appendChildNode(groupNode);
+        else if (clipNode)
+            clipNode->appendChildNode(groupNode);
+        else if (opacityNode)
+            opacityNode->appendChildNode(groupNode);
+        else
+            itemNode()->appendChildNode(groupNode);
+#ifdef QML_RUNTIME_TESTING
+        groupNode->description = QLatin1String("group");
+#endif
+    }
+    return groupNode;
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGItemPrivate::ChangeTypes);
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGKeysAttached)
+QML_DECLARE_TYPEINFO(QSGKeysAttached, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(QSGKeyNavigationAttached)
+QML_DECLARE_TYPEINFO(QSGKeyNavigationAttached, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(QSGLayoutMirroringAttached)
+QML_DECLARE_TYPEINFO(QSGLayoutMirroringAttached, QML_HAS_ATTACHED_PROPERTIES)
+
+#endif // QSGITEM_P_H
diff --git a/src/declarative/items/qsgitemchangelistener_p.h b/src/declarative/items/qsgitemchangelistener_p.h
new file mode 100644
index 0000000000..3b4018a772
--- /dev/null
+++ b/src/declarative/items/qsgitemchangelistener_p.h
@@ -0,0 +1,82 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGITEMCHANGELISTENER_P_H
+#define QSGITEMCHANGELISTENER_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+class QRectF;
+class QSGItem;
+class QSGAnchorsPrivate;
+class QSGItemChangeListener
+{
+public:
+    virtual void itemGeometryChanged(QSGItem *, const QRectF &, const QRectF &) {}
+    virtual void itemSiblingOrderChanged(QSGItem *) {}
+    virtual void itemVisibilityChanged(QSGItem *) {}
+    virtual void itemOpacityChanged(QSGItem *) {}
+    virtual void itemDestroyed(QSGItem *) {}
+    virtual void itemChildAdded(QSGItem *, QSGItem *) {}
+    virtual void itemChildRemoved(QSGItem *, QSGItem *) {}
+    virtual void itemParentChanged(QSGItem *, QSGItem *) {}
+    virtual void itemRotationChanged(QSGItem *) {}
+
+    virtual QSGAnchorsPrivate *anchorPrivate() { return 0; }
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGITEMCHANGELISTENER_P_H
diff --git a/src/declarative/items/qsgitemsmodule.cpp b/src/declarative/items/qsgitemsmodule.cpp
new file mode 100644
index 0000000000..aa74ff6bc5
--- /dev/null
+++ b/src/declarative/items/qsgitemsmodule.cpp
@@ -0,0 +1,205 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgitemsmodule_p.h"
+
+#include "qsgitem.h"
+#include "qsgitem_p.h"
+#include "qsgevents_p_p.h"
+#include "qsgrectangle_p.h"
+#include "qsgfocusscope_p.h"
+#include "qsgtext_p.h"
+#include "qsgtextinput_p.h"
+#include "qsgtextedit_p.h"
+#include "qsgimage_p.h"
+#include "qsgborderimage_p.h"
+#include "qsgscalegrid_p_p.h"
+#include "qsgmousearea_p.h"
+#include "qsgpincharea_p.h"
+#include "qsgflickable_p.h"
+#include "qsgflickable_p_p.h"
+#include "qsglistview_p.h"
+#include "qsgvisualitemmodel_p.h"
+#include "qsggridview_p.h"
+#include "qsgpathview_p.h"
+#include <private/qdeclarativepath_p.h>
+#include "qsgpositioners_p.h"
+#include "qsgrepeater_p.h"
+#include "qsgloader_p.h"
+#include "qsganimatedimage_p.h"
+#include "qsgflipable_p.h"
+#include "qsgtranslate_p.h"
+#include "qsgstateoperations_p.h"
+#include "qsganimation_p.h"
+#include <private/qsgshadereffectitem_p.h>
+#include <private/qsgshadereffectsource_p.h>
+//#include "private/qsgpincharea_p.h"
+
+static QDeclarativePrivate::AutoParentResult qsgitem_autoParent(QObject *obj, QObject *parent)
+{
+    QSGItem *item = qobject_cast<QSGItem *>(obj);
+    if (!item)
+        return QDeclarativePrivate::IncompatibleObject;
+
+    QSGItem *parentItem = qobject_cast<QSGItem *>(parent);
+    if (!parentItem)
+        return QDeclarativePrivate::IncompatibleParent;
+
+    item->setParentItem(parentItem);
+    return QDeclarativePrivate::Parented;
+}
+
+static void qt_sgitems_defineModule(const char *uri, int major, int minor)
+{
+    QDeclarativePrivate::RegisterAutoParent autoparent = { 0, &qsgitem_autoParent };
+    QDeclarativePrivate::qmlregister(QDeclarativePrivate::AutoParentRegistration, &autoparent);
+
+#ifdef QT_NO_MOVIE
+    qmlRegisterTypeNotAvailable(uri,major,minor,"AnimatedImage", qApp->translate("QSGAnimatedImage","Qt was built without support for QMovie"));
+#else
+    qmlRegisterType<QSGAnimatedImage>(uri,major,minor,"AnimatedImage");
+#endif
+    qmlRegisterType<QSGBorderImage>(uri,major,minor,"BorderImage");
+    qmlRegisterType<QSGColumn>(uri,major,minor,"Column");
+    qmlRegisterType<QSGDrag>(uri,major,minor,"Drag");
+    qmlRegisterType<QSGFlickable>(uri,major,minor,"Flickable");
+    qmlRegisterType<QSGFlipable>(uri,major,minor,"Flipable");
+    qmlRegisterType<QSGFlow>(uri,major,minor,"Flow");
+//    qmlRegisterType<QDeclarativeFocusPanel>(uri,major,minor,"FocusPanel");
+    qmlRegisterType<QSGFocusScope>(uri,major,minor,"FocusScope");
+    qmlRegisterType<QSGGradient>(uri,major,minor,"Gradient");
+    qmlRegisterType<QSGGradientStop>(uri,major,minor,"GradientStop");
+    qmlRegisterType<QSGGrid>(uri,major,minor,"Grid");
+    qmlRegisterType<QSGGridView>(uri,major,minor,"GridView");
+    qmlRegisterType<QSGImage>(uri,major,minor,"Image");
+    qmlRegisterType<QSGItem>(uri,major,minor,"Item");
+    qmlRegisterType<QSGListView>(uri,major,minor,"ListView");
+    qmlRegisterType<QSGLoader>(uri,major,minor,"Loader");
+    qmlRegisterType<QSGMouseArea>(uri,major,minor,"MouseArea");
+    qmlRegisterType<QDeclarativePath>(uri,major,minor,"Path");
+    qmlRegisterType<QDeclarativePathAttribute>(uri,major,minor,"PathAttribute");
+    qmlRegisterType<QDeclarativePathCubic>(uri,major,minor,"PathCubic");
+    qmlRegisterType<QDeclarativePathLine>(uri,major,minor,"PathLine");
+    qmlRegisterType<QDeclarativePathPercent>(uri,major,minor,"PathPercent");
+    qmlRegisterType<QDeclarativePathQuad>(uri,major,minor,"PathQuad");
+    qmlRegisterType<QSGPathView>(uri,major,minor,"PathView");
+#ifndef QT_NO_VALIDATOR
+    qmlRegisterType<QIntValidator>(uri,major,minor,"IntValidator");
+    qmlRegisterType<QDoubleValidator>(uri,major,minor,"DoubleValidator");
+    qmlRegisterType<QRegExpValidator>(uri,major,minor,"RegExpValidator");
+#endif
+    qmlRegisterType<QSGRectangle>(uri,major,minor,"Rectangle");
+    qmlRegisterType<QSGRepeater>(uri,major,minor,"Repeater");
+    qmlRegisterType<QSGRow>(uri,major,minor,"Row");
+    qmlRegisterType<QSGTranslate>(uri,major,minor,"Translate");
+    qmlRegisterType<QSGRotation>(uri,major,minor,"Rotation");
+    qmlRegisterType<QSGScale>(uri,major,minor,"Scale");
+    qmlRegisterType<QSGText>(uri,major,minor,"Text");
+    qmlRegisterType<QSGTextEdit>(uri,major,minor,"TextEdit");
+    qmlRegisterType<QSGTextInput>(uri,major,minor,"TextInput");
+    qmlRegisterType<QSGViewSection>(uri,major,minor,"ViewSection");
+    qmlRegisterType<QSGVisualDataModel>(uri,major,minor,"VisualDataModel");
+    qmlRegisterType<QSGVisualItemModel>(uri,major,minor,"VisualItemModel");
+
+    qmlRegisterType<QSGAnchors>();
+    qmlRegisterType<QSGKeyEvent>();
+    qmlRegisterType<QSGMouseEvent>();
+    qmlRegisterType<QSGTransform>();
+    qmlRegisterType<QDeclarativePathElement>();
+    qmlRegisterType<QDeclarativeCurve>();
+    qmlRegisterType<QSGScaleGrid>();
+#ifndef QT_NO_VALIDATOR
+    qmlRegisterType<QValidator>();
+#endif
+    qmlRegisterType<QSGVisualModel>();
+#ifndef QT_NO_ACTION
+    qmlRegisterType<QAction>();
+#endif
+    qmlRegisterType<QSGPen>();
+    qmlRegisterType<QSGFlickableVisibleArea>();
+    qRegisterMetaType<QSGAnchorLine>("QSGAnchorLine");
+
+    qmlRegisterUncreatableType<QSGKeyNavigationAttached>(uri,major,minor,"KeyNavigation",QSGKeyNavigationAttached::tr("KeyNavigation is only available via attached properties"));
+    qmlRegisterUncreatableType<QSGKeysAttached>(uri,major,minor,"Keys",QSGKeysAttached::tr("Keys is only available via attached properties"));
+    qmlRegisterUncreatableType<QSGLayoutMirroringAttached>(uri,major,minor,"LayoutMirroring", QSGLayoutMirroringAttached::tr("LayoutMirroring is only available via attached properties"));
+
+    qmlRegisterType<QSGPinchArea>(uri,major,minor,"PinchArea");
+    qmlRegisterType<QSGPinch>(uri,major,minor,"Pinch");
+    qmlRegisterType<QSGPinchEvent>();
+
+    qmlRegisterType<QSGShaderEffectItem>("QtQuick", 2, 0, "ShaderEffectItem");
+    qmlRegisterType<QSGShaderEffectSource>("QtQuick", 2, 0, "ShaderEffectSource");
+    qmlRegisterUncreatableType<QSGShaderEffectMesh>("QtQuick", 2, 0, "ShaderEffectMesh", QSGShaderEffectMesh::tr("Cannot create instance of abstract class ShaderEffectMesh."));
+    qmlRegisterType<QSGGridMesh>("QtQuick", 2, 0, "GridMesh");
+
+    qmlRegisterUncreatableType<QSGPaintedItem>("QtQuick", 2, 0, "PaintedItem", QSGPaintedItem::tr("Cannot create instance of abstract class PaintedItem"));
+
+    qmlRegisterType<QSGParentChange>(uri, major, minor,"ParentChange");
+    qmlRegisterType<QSGAnchorChanges>(uri, major, minor,"AnchorChanges");
+    qmlRegisterType<QSGAnchorSet>();
+    qmlRegisterType<QSGAnchorAnimation>(uri, major, minor,"AnchorAnimation");
+    qmlRegisterType<QSGParentAnimation>(uri, major, minor,"ParentAnimation");
+}
+
+void QSGItemsModule::defineModule()
+{
+    static bool initialized = false;
+    if (initialized)
+        return;
+    initialized = true;
+
+    // XXX todo -  Remove before final integration...
+    QByteArray mode = qgetenv("QMLSCENE_IMPORT_NAME");
+    QByteArray name = "QtQuick";
+    int majorVersion = 2;
+    int minorVersion = 0;
+    if (mode == "quick1") {
+        majorVersion = 1;
+    } else if (mode == "qt") {
+        name = "Qt";
+        majorVersion = 4;
+        minorVersion = 7;
+    }
+
+    qt_sgitems_defineModule(name, majorVersion, minorVersion);
+}
+
diff --git a/src/declarative/items/qsgitemsmodule_p.h b/src/declarative/items/qsgitemsmodule_p.h
new file mode 100644
index 0000000000..2d8a971c22
--- /dev/null
+++ b/src/declarative/items/qsgitemsmodule_p.h
@@ -0,0 +1,65 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGITEMSMODULE_P_H
+#define QSGITEMSMODULE_P_H
+
+#include <qdeclarative.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItemsModule
+{
+public:
+    static void defineModule();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGITEMSMODULE_P_H
+
diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp
new file mode 100644
index 0000000000..496fdaf4cc
--- /dev/null
+++ b/src/declarative/items/qsglistview.cpp
@@ -0,0 +1,3032 @@
+// Commit: ce38c6e3a9b7eb336cbd9cd1e9520a5000c8f8ac
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsglistview_p.h"
+#include "qsgflickable_p_p.h"
+#include "qsgvisualitemmodel_p.h"
+
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qevent.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <private/qdeclarativesmoothedanimation_p_p.h>
+#include <private/qlistmodelinterface_p.h>
+
+QT_BEGIN_NAMESPACE
+
+void QSGViewSection::setProperty(const QString &property)
+{
+    if (property != m_property) {
+        m_property = property;
+        emit propertyChanged();
+    }
+}
+
+void QSGViewSection::setCriteria(QSGViewSection::SectionCriteria criteria)
+{
+    if (criteria != m_criteria) {
+        m_criteria = criteria;
+        emit criteriaChanged();
+    }
+}
+
+void QSGViewSection::setDelegate(QDeclarativeComponent *delegate)
+{
+    if (delegate != m_delegate) {
+        m_delegate = delegate;
+        emit delegateChanged();
+    }
+}
+
+QString QSGViewSection::sectionString(const QString &value)
+{
+    if (m_criteria == FirstCharacter)
+        return value.isEmpty() ? QString() : value.at(0);
+    else
+        return value;
+}
+
+//----------------------------------------------------------------------------
+
+class FxListItemSG
+{
+public:
+    FxListItemSG(QSGItem *i, QSGListView *v) : item(i), section(0), view(v) {
+        attached = static_cast<QSGListViewAttached*>(qmlAttachedPropertiesObject<QSGListView>(item));
+        if (attached)
+            attached->setView(view);
+    }
+    ~FxListItemSG() {}
+    qreal position() const {
+        if (section) {
+            if (view->orientation() == QSGListView::Vertical)
+                return section->y();
+            else
+                return (view->effectiveLayoutDirection() == Qt::RightToLeft ? -section->width()-section->x() : section->x());
+        } else {
+            return itemPosition();
+        }
+    }
+    qreal itemPosition() const {
+        if (view->orientation() == QSGListView::Vertical)
+            return item->y();
+        else
+            return (view->effectiveLayoutDirection() == Qt::RightToLeft ? -item->width()-item->x() : item->x());
+    }
+    qreal size() const {
+        if (section)
+            return (view->orientation() == QSGListView::Vertical ? item->height()+section->height() : item->width()+section->width());
+        else
+            return (view->orientation() == QSGListView::Vertical ? item->height() : item->width());
+    }
+    qreal itemSize() const {
+        return (view->orientation() == QSGListView::Vertical ? item->height() : item->width());
+    }
+    qreal sectionSize() const {
+        if (section)
+            return (view->orientation() == QSGListView::Vertical ? section->height() : section->width());
+        return 0.0;
+    }
+    qreal endPosition() const {
+        if (view->orientation() == QSGListView::Vertical) {
+            return item->y() + (item->height() >= 1.0 ? item->height() : 1) - 1;
+        } else {
+            return (view->effectiveLayoutDirection() == Qt::RightToLeft
+                    ? -item->width()-item->x() + (item->width() >= 1.0 ? item->width() : 1)
+                    : item->x() + (item->width() >= 1.0 ? item->width() : 1)) - 1;
+        }
+    }
+    void setPosition(qreal pos) {
+        if (view->orientation() == QSGListView::Vertical) {
+            if (section) {
+                section->setY(pos);
+                pos += section->height();
+            }
+            item->setY(pos);
+        } else {
+            if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
+                if (section) {
+                    section->setX(-section->width()-pos);
+                    pos += section->width();
+                }
+                item->setX(-item->width()-pos);
+            } else {
+                if (section) {
+                    section->setX(pos);
+                    pos += section->width();
+                }
+                item->setX(pos);
+            }
+        }
+    }
+    void setSize(qreal size) {
+        if (view->orientation() == QSGListView::Vertical)
+            item->setHeight(size);
+        else
+            item->setWidth(size);
+    }
+    bool contains(qreal x, qreal y) const {
+        return (x >= item->x() && x < item->x() + item->width() &&
+                y >= item->y() && y < item->y() + item->height());
+    }
+
+    QSGItem *item;
+    QSGItem *section;
+    QSGListView *view;
+    QSGListViewAttached *attached;
+    int index;
+};
+
+//----------------------------------------------------------------------------
+
+class QSGListViewPrivate : public QSGFlickablePrivate
+{
+    Q_DECLARE_PUBLIC(QSGListView)
+
+public:
+    QSGListViewPrivate()
+        : currentItem(0), orient(QSGListView::Vertical), layoutDirection(Qt::LeftToRight)
+        , visiblePos(0), visibleIndex(0)
+        , averageSize(100.0), currentIndex(-1), requestedIndex(-1)
+        , itemCount(0), highlightRangeStart(0), highlightRangeEnd(0)
+        , highlightComponent(0), highlight(0), trackedItem(0)
+        , moveReason(Other), buffer(0), highlightPosAnimator(0), highlightSizeAnimator(0)
+        , sectionCriteria(0), spacing(0.0)
+        , highlightMoveSpeed(400), highlightMoveDuration(-1)
+        , highlightResizeSpeed(400), highlightResizeDuration(-1), highlightRange(QSGListView::NoHighlightRange)
+        , snapMode(QSGListView::NoSnap), overshootDist(0.0)
+        , footerComponent(0), footer(0), headerComponent(0), header(0)
+        , bufferMode(BufferBefore | BufferAfter)
+        , ownModel(false), wrap(false), autoHighlight(true), haveHighlightRange(false)
+        , correctFlick(false), inFlickCorrection(false), lazyRelease(false)
+        , deferredRelease(false), layoutScheduled(false), currentIndexCleared(false)
+        , inViewportMoved(false)
+        , highlightRangeStartValid(false), highlightRangeEndValid(false)
+        , minExtentDirty(true), maxExtentDirty(true)
+    {}
+
+    void init();
+    void clear();
+    FxListItemSG *createItem(int modelIndex);
+    void releaseItem(FxListItemSG *item);
+
+    FxListItemSG *visibleItem(int modelIndex) const {
+        if (modelIndex >= visibleIndex && modelIndex < visibleIndex + visibleItems.count()) {
+            for (int i = modelIndex - visibleIndex; i < visibleItems.count(); ++i) {
+                FxListItemSG *item = visibleItems.at(i);
+                if (item->index == modelIndex)
+                    return item;
+            }
+        }
+        return 0;
+    }
+
+    FxListItemSG *firstVisibleItem() const {
+        const qreal pos = isRightToLeft() ? -position()-size() : position();
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxListItemSG *item = visibleItems.at(i);
+            if (item->index != -1 && item->endPosition() > pos)
+                return item;
+        }
+        return visibleItems.count() ? visibleItems.first() : 0;
+    }
+
+    FxListItemSG *nextVisibleItem() const {
+        const qreal pos = isRightToLeft() ? -position()-size() : position();
+        bool foundFirst = false;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxListItemSG *item = visibleItems.at(i);
+            if (item->index != -1) {
+                if (foundFirst)
+                    return item;
+                else if (item->position() < pos && item->endPosition() > pos)
+                    foundFirst = true;
+            }
+        }
+        return 0;
+    }
+
+    // Returns the item before modelIndex, if created.
+    // May return an item marked for removal.
+    FxListItemSG *itemBefore(int modelIndex) const {
+        if (modelIndex < visibleIndex)
+            return 0;
+        int idx = 1;
+        int lastIndex = -1;
+        while (idx < visibleItems.count()) {
+            FxListItemSG *item = visibleItems.at(idx);
+            if (item->index != -1)
+                lastIndex = item->index;
+            if (item->index == modelIndex)
+                return visibleItems.at(idx-1);
+            ++idx;
+        }
+        if (lastIndex == modelIndex-1)
+            return visibleItems.last();
+        return 0;
+    }
+
+    void regenerate() {
+        Q_Q(QSGListView);
+        if (q->isComponentComplete()) {
+            if (header) {
+                // XXX todo - the original did scene()->removeItem().  Why?
+                header->item->setParentItem(0);
+                header->item->deleteLater();
+                delete header;
+                header = 0;
+            }
+            if (footer) {
+                // XXX todo - the original did scene()->removeItem().  Why?
+                footer->item->setParentItem(0);
+                footer->item->deleteLater();
+                delete footer;
+                footer = 0;
+            }
+            updateHeader();
+            updateFooter();
+            clear();
+            setPosition(0);
+            q->refill();
+            updateCurrent(currentIndex);
+        }
+    }
+
+    void mirrorChange() {
+        Q_Q(QSGListView);
+        regenerate();
+        emit q->effectiveLayoutDirectionChanged();
+    }
+
+    bool isRightToLeft() const {
+        Q_Q(const QSGListView);
+        return orient == QSGListView::Horizontal && q->effectiveLayoutDirection() == Qt::RightToLeft;
+    }
+
+    qreal position() const {
+        Q_Q(const QSGListView);
+        return orient == QSGListView::Vertical ? q->contentY() : q->contentX();
+    }
+    void setPosition(qreal pos) {
+        Q_Q(QSGListView);
+        if (orient == QSGListView::Vertical) {
+            q->QSGFlickable::setContentY(pos);
+        } else {
+            if (isRightToLeft())
+                q->QSGFlickable::setContentX(-pos-size());
+            else
+                q->QSGFlickable::setContentX(pos);
+        }
+    }
+    qreal size() const {
+        Q_Q(const QSGListView);
+        return orient == QSGListView::Vertical ? q->height() : q->width();
+    }
+
+    qreal originPosition() const {
+        qreal pos = 0;
+        if (!visibleItems.isEmpty()) {
+            pos = (*visibleItems.constBegin())->position();
+            if (visibleIndex > 0)
+                pos -= visibleIndex * (averageSize + spacing);
+        }
+        return pos;
+    }
+
+    qreal lastPosition() const {
+        qreal pos = 0;
+        if (!visibleItems.isEmpty()) {
+            int invisibleCount = visibleItems.count() - visibleIndex;
+            for (int i = visibleItems.count()-1; i >= 0; --i) {
+                if (visibleItems.at(i)->index != -1) {
+                    invisibleCount = model->count() - visibleItems.at(i)->index - 1;
+                    break;
+                }
+            }
+            pos = (*(--visibleItems.constEnd()))->endPosition() + invisibleCount * (averageSize + spacing);
+        } else if (model && model->count()) {
+            pos = model->count() * averageSize + (model->count()-1) * spacing;
+        }
+        return pos;
+    }
+
+    qreal startPosition() const {
+        return isRightToLeft() ? -lastPosition()-1 : originPosition();
+    }
+
+    qreal endPosition() const {
+        return isRightToLeft() ? -originPosition()-1 : lastPosition();
+    }
+
+    qreal positionAt(int modelIndex) const {
+        if (FxListItemSG *item = visibleItem(modelIndex))
+            return item->position();
+        if (!visibleItems.isEmpty()) {
+            if (modelIndex < visibleIndex) {
+                int count = visibleIndex - modelIndex;
+                qreal cs = 0;
+                if (modelIndex == currentIndex && currentItem) {
+                    cs = currentItem->size() + spacing;
+                    --count;
+                }
+                return (*visibleItems.constBegin())->position() - count * (averageSize + spacing) - cs;
+            } else {
+                int idx = visibleItems.count() - 1;
+                while (idx >= 0 && visibleItems.at(idx)->index == -1)
+                    --idx;
+                if (idx < 0)
+                    idx = visibleIndex;
+                else
+                    idx = visibleItems.at(idx)->index;
+                int count = modelIndex - idx - 1;
+                return (*(--visibleItems.constEnd()))->endPosition() + spacing + count * (averageSize + spacing) + 1;
+            }
+        }
+        return 0;
+    }
+
+    qreal endPositionAt(int modelIndex) const {
+        if (FxListItemSG *item = visibleItem(modelIndex))
+            return item->endPosition();
+        if (!visibleItems.isEmpty()) {
+            if (modelIndex < visibleIndex) {
+                int count = visibleIndex - modelIndex;
+                return (*visibleItems.constBegin())->position() - (count - 1) * (averageSize + spacing) - spacing - 1;
+            } else {
+                int idx = visibleItems.count() - 1;
+                while (idx >= 0 && visibleItems.at(idx)->index == -1)
+                    --idx;
+                if (idx < 0)
+                    idx = visibleIndex;
+                else
+                    idx = visibleItems.at(idx)->index;
+                int count = modelIndex - idx - 1;
+                return (*(--visibleItems.constEnd()))->endPosition() + count * (averageSize + spacing);
+            }
+        }
+        return 0;
+    }
+
+    QString sectionAt(int modelIndex) {
+        if (FxListItemSG *item = visibleItem(modelIndex))
+            return item->attached->section();
+
+        QString section;
+        if (sectionCriteria) {
+            QString propValue = model->stringValue(modelIndex, sectionCriteria->property());
+            section = sectionCriteria->sectionString(propValue);
+        }
+
+        return section;
+    }
+
+    bool isValid() const {
+        return model && model->count() && model->isValid();
+    }
+
+    qreal snapPosAt(qreal pos) {
+        if (FxListItemSG *snapItem = snapItemAt(pos))
+            return snapItem->position();
+        if (visibleItems.count()) {
+            qreal firstPos = visibleItems.first()->position();
+            qreal endPos = visibleItems.last()->position();
+            if (pos < firstPos) {
+                return firstPos - qRound((firstPos - pos) / averageSize) * averageSize;
+            } else if (pos > endPos)
+                return endPos + qRound((pos - endPos) / averageSize) * averageSize;
+        }
+        return qRound((pos - originPosition()) / averageSize) * averageSize + originPosition();
+    }
+
+    FxListItemSG *snapItemAt(qreal pos) {
+        FxListItemSG *snapItem = 0;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxListItemSG *item = visibleItems[i];
+            if (item->index == -1)
+                continue;
+            qreal itemTop = item->position();
+            if (highlight && itemTop >= pos && item->endPosition() <= pos + highlight->size() - 1)
+                return item;
+            if (itemTop+item->size()/2 >= pos && itemTop-item->size()/2 < pos)
+                snapItem = item;
+        }
+        return snapItem;
+    }
+
+    int lastVisibleIndex() const {
+        int lastIndex = -1;
+        for (int i = visibleItems.count()-1; i >= 0; --i) {
+            FxListItemSG *listItem = visibleItems.at(i);
+            if (listItem->index != -1) {
+                lastIndex = listItem->index;
+                break;
+            }
+        }
+        return lastIndex;
+    }
+
+    // map a model index to visibleItems index.
+    int mapFromModel(int modelIndex) const {
+        if (modelIndex < visibleIndex || modelIndex >= visibleIndex + visibleItems.count())
+            return -1;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxListItemSG *listItem = visibleItems.at(i);
+            if (listItem->index == modelIndex)
+                return i;
+            if (listItem->index > modelIndex)
+                return -1;
+        }
+        return -1; // Not in visibleList
+    }
+
+    void updateViewport() {
+        Q_Q(QSGListView);
+        if (orient == QSGListView::Vertical) {
+            q->setContentHeight(endPosition() - startPosition() + 1);
+        } else {
+            q->setContentWidth(endPosition() - startPosition() + 1);
+        }
+    }
+
+    void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
+        Q_Q(QSGListView);
+        QSGFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
+        if (!q->isComponentComplete())
+            return;
+        if (item != contentItem && (!highlight || item != highlight->item)) {
+            if ((orient == QSGListView::Vertical && newGeometry.height() != oldGeometry.height())
+                || (orient == QSGListView::Horizontal && newGeometry.width() != oldGeometry.width())) {
+                scheduleLayout();
+            }
+        }
+        if ((header && header->item == item) || (footer && footer->item == item)) {
+            if (header)
+                updateHeader();
+            if (footer)
+                updateFooter();
+        }
+        if (currentItem && currentItem->item == item)
+            updateHighlight();
+        if (trackedItem && trackedItem->item == item)
+            q->trackedPositionChanged();
+    }
+
+    // for debugging only
+    void checkVisible() const {
+        int skip = 0;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            FxListItemSG *listItem = visibleItems.at(i);
+            if (listItem->index == -1) {
+                ++skip;
+            } else if (listItem->index != visibleIndex + i - skip) {
+                qFatal("index %d %d %d", visibleIndex, i, listItem->index);
+            }
+        }
+    }
+
+    void refill(qreal from, qreal to, bool doBuffer = false);
+    void scheduleLayout();
+    void layout();
+    void updateUnrequestedIndexes();
+    void updateUnrequestedPositions();
+    void updateTrackedItem();
+    void createHighlight();
+    void updateHighlight();
+    void createSection(FxListItemSG *);
+    void updateSections();
+    void updateCurrentSection();
+    void updateCurrent(int);
+    void updateAverage();
+    void updateHeader();
+    void updateFooter();
+    void fixupPosition();
+    void positionViewAtIndex(int index, int mode);
+    virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
+    virtual void flick(QSGFlickablePrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                        QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
+
+    QDeclarativeGuard<QSGVisualModel> model;
+    QVariant modelVariant;
+    QList<FxListItemSG*> visibleItems;
+    QHash<QSGItem*,int> unrequestedItems;
+    FxListItemSG *currentItem;
+    QSGListView::Orientation orient;
+    Qt::LayoutDirection layoutDirection;
+    qreal visiblePos;
+    int visibleIndex;
+    qreal averageSize;
+    int currentIndex;
+    int requestedIndex;
+    int itemCount;
+    qreal highlightRangeStart;
+    qreal highlightRangeEnd;
+    QDeclarativeComponent *highlightComponent;
+    FxListItemSG *highlight;
+    FxListItemSG *trackedItem;
+    enum MovementReason { Other, SetIndex, Mouse };
+    MovementReason moveReason;
+    int buffer;
+    QSmoothedAnimation *highlightPosAnimator;
+    QSmoothedAnimation *highlightSizeAnimator;
+    QSGViewSection *sectionCriteria;
+    QString currentSection;
+    static const int sectionCacheSize = 4;
+    QSGItem *sectionCache[sectionCacheSize];
+    qreal spacing;
+    qreal highlightMoveSpeed;
+    int highlightMoveDuration;
+    qreal highlightResizeSpeed;
+    int highlightResizeDuration;
+    QSGListView::HighlightRangeMode highlightRange;
+    QSGListView::SnapMode snapMode;
+    qreal overshootDist;
+    QDeclarativeComponent *footerComponent;
+    FxListItemSG *footer;
+    QDeclarativeComponent *headerComponent;
+    FxListItemSG *header;
+    enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
+    int bufferMode;
+    mutable qreal minExtent;
+    mutable qreal maxExtent;
+
+    bool ownModel : 1;
+    bool wrap : 1;
+    bool autoHighlight : 1;
+    bool haveHighlightRange : 1;
+    bool correctFlick : 1;
+    bool inFlickCorrection : 1;
+    bool lazyRelease : 1;
+    bool deferredRelease : 1;
+    bool layoutScheduled : 1;
+    bool currentIndexCleared : 1;
+    bool inViewportMoved : 1;
+    bool highlightRangeStartValid : 1;
+    bool highlightRangeEndValid : 1;
+    mutable bool minExtentDirty : 1;
+    mutable bool maxExtentDirty : 1;
+};
+
+void QSGListViewPrivate::init()
+{
+    Q_Q(QSGListView);
+    q->setFlag(QSGItem::ItemIsFocusScope);
+    addItemChangeListener(this, Geometry);
+    QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped()));
+    q->setFlickableDirection(QSGFlickable::VerticalFlick);
+    ::memset(sectionCache, 0, sizeof(QSGItem*) * sectionCacheSize);
+}
+
+void QSGListViewPrivate::clear()
+{
+    timeline.clear();
+    for (int i = 0; i < visibleItems.count(); ++i)
+        releaseItem(visibleItems.at(i));
+    visibleItems.clear();
+    for (int i = 0; i < sectionCacheSize; ++i) {
+        delete sectionCache[i];
+        sectionCache[i] = 0;
+    }
+    visiblePos = header ? header->size() : 0;
+    visibleIndex = 0;
+    releaseItem(currentItem);
+    currentItem = 0;
+    createHighlight();
+    trackedItem = 0;
+    minExtentDirty = true;
+    maxExtentDirty = true;
+    itemCount = 0;
+}
+
+FxListItemSG *QSGListViewPrivate::createItem(int modelIndex)
+{
+    Q_Q(QSGListView);
+    // create object
+    requestedIndex = modelIndex;
+    FxListItemSG *listItem = 0;
+    if (QSGItem *item = model->item(modelIndex, false)) {
+        listItem = new FxListItemSG(item, q);
+        listItem->index = modelIndex;
+        // initialise attached properties
+        if (sectionCriteria) {
+            QString propValue = model->stringValue(modelIndex, sectionCriteria->property());
+            listItem->attached->m_section = sectionCriteria->sectionString(propValue);
+            if (modelIndex > 0) {
+                if (FxListItemSG *item = itemBefore(modelIndex))
+                    listItem->attached->m_prevSection = item->attached->section();
+                else
+                    listItem->attached->m_prevSection = sectionAt(modelIndex-1);
+            }
+            if (modelIndex < model->count()-1) {
+                if (FxListItemSG *item = visibleItem(modelIndex+1))
+                    listItem->attached->m_nextSection = item->attached->section();
+                else
+                    listItem->attached->m_nextSection = sectionAt(modelIndex+1);
+            }
+        }
+        if (model->completePending()) {
+            // complete
+            listItem->item->setZ(1);
+            listItem->item->setParentItem(q->contentItem());
+            model->completeItem();
+        } else {
+            listItem->item->setParentItem(q->contentItem());
+        }
+        QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+        itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+        if (sectionCriteria && sectionCriteria->delegate()) {
+            if (listItem->attached->m_prevSection != listItem->attached->m_section)
+                createSection(listItem);
+        }
+        unrequestedItems.remove(listItem->item);
+    }
+    requestedIndex = -1;
+
+    return listItem;
+}
+
+void QSGListViewPrivate::releaseItem(FxListItemSG *item)
+{
+    Q_Q(QSGListView);
+    if (!item || !model)
+        return;
+    if (trackedItem == item)
+        trackedItem = 0;
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item->item);
+    itemPrivate->removeItemChangeListener(this, QSGItemPrivate::Geometry);
+    if (model->release(item->item) == 0) {
+        // item was not destroyed, and we no longer reference it.
+        unrequestedItems.insert(item->item, model->indexOf(item->item, q));
+    }
+    if (item->section) {
+        int i = 0;
+        do {
+            if (!sectionCache[i]) {
+                sectionCache[i] = item->section;
+                sectionCache[i]->setVisible(false);
+                item->section = 0;
+                break;
+            }
+            ++i;
+        } while (i < sectionCacheSize);
+        delete item->section;
+    }
+    delete item;
+}
+
+void QSGListViewPrivate::refill(qreal from, qreal to, bool doBuffer)
+{
+    Q_Q(QSGListView);
+    if (!isValid() || !q->isComponentComplete())
+        return;
+    itemCount = model->count();
+    qreal bufferFrom = from - buffer;
+    qreal bufferTo = to + buffer;
+    qreal fillFrom = from;
+    qreal fillTo = to;
+    if (doBuffer && (bufferMode & BufferAfter))
+        fillTo = bufferTo;
+    if (doBuffer && (bufferMode & BufferBefore))
+        fillFrom = bufferFrom;
+
+    int modelIndex = visibleIndex;
+    qreal itemEnd = visiblePos-1;
+    if (!visibleItems.isEmpty()) {
+        visiblePos = (*visibleItems.constBegin())->position();
+        itemEnd = (*(--visibleItems.constEnd()))->endPosition() + spacing;
+        int i = visibleItems.count() - 1;
+        while (i > 0 && visibleItems.at(i)->index == -1)
+            --i;
+        if (visibleItems.at(i)->index != -1)
+            modelIndex = visibleItems.at(i)->index + 1;
+    }
+
+    bool changed = false;
+    FxListItemSG *item = 0;
+    qreal pos = itemEnd + 1;
+    while (modelIndex < model->count() && pos <= fillTo) {
+//        qDebug() << "refill: append item" << modelIndex << "pos" << pos;
+        if (!(item = createItem(modelIndex)))
+            break;
+        item->setPosition(pos);
+        pos += item->size() + spacing;
+        visibleItems.append(item);
+        ++modelIndex;
+        changed = true;
+        if (doBuffer) // never buffer more than one item per frame
+            break;
+    }
+    while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos-1 >= fillFrom) {
+//        qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos;
+        if (!(item = createItem(visibleIndex-1)))
+            break;
+        --visibleIndex;
+        visiblePos -= item->size() + spacing;
+        item->setPosition(visiblePos);
+        visibleItems.prepend(item);
+        changed = true;
+        if (doBuffer) // never buffer more than one item per frame
+            break;
+    }
+
+    if (!lazyRelease || !changed || deferredRelease) { // avoid destroying items in the same frame that we create
+        while (visibleItems.count() > 1 && (item = visibleItems.first()) && item->endPosition() < bufferFrom) {
+            if (item->attached->delayRemove())
+                break;
+//            qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition();
+            if (item->index != -1)
+                visibleIndex++;
+            visibleItems.removeFirst();
+            releaseItem(item);
+            changed = true;
+        }
+        while (visibleItems.count() > 1 && (item = visibleItems.last()) && item->position() > bufferTo) {
+            if (item->attached->delayRemove())
+                break;
+//            qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position();
+            visibleItems.removeLast();
+            releaseItem(item);
+            changed = true;
+        }
+        deferredRelease = false;
+    } else {
+        deferredRelease = true;
+    }
+    if (changed) {
+        minExtentDirty = true;
+        maxExtentDirty = true;
+        if (visibleItems.count())
+            visiblePos = (*visibleItems.constBegin())->position();
+        updateAverage();
+        if (currentIndex >= 0 && currentItem && !visibleItem(currentIndex)) {
+            currentItem->setPosition(positionAt(currentIndex));
+            updateHighlight();
+        }
+
+        if (sectionCriteria)
+            updateCurrentSection();
+        if (header)
+            updateHeader();
+        if (footer)
+            updateFooter();
+        updateViewport();
+        updateUnrequestedPositions();
+    } else if (!doBuffer && buffer && bufferMode != NoBuffer) {
+        refill(from, to, true);
+    }
+    lazyRelease = false;
+}
+
+void QSGListViewPrivate::scheduleLayout()
+{
+    Q_Q(QSGListView);
+    if (!layoutScheduled) {
+        layoutScheduled = true;
+        q->polish();
+    }
+}
+
+void QSGListViewPrivate::layout()
+{
+    Q_Q(QSGListView);
+    layoutScheduled = false;
+    if (!isValid() && !visibleItems.count()) {
+        clear();
+        setPosition(0);
+        return;
+    }
+    if (!visibleItems.isEmpty()) {
+        bool fixedCurrent = currentItem && visibleItems.first()->item == currentItem->item;
+        qreal sum = visibleItems.first()->size();
+        qreal pos = visibleItems.first()->position() + visibleItems.first()->size() + spacing;
+        for (int i=1; i < visibleItems.count(); ++i) {
+            FxListItemSG *item = visibleItems.at(i);
+            item->setPosition(pos);
+            pos += item->size() + spacing;
+            sum += item->size();
+            fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item);
+        }
+        averageSize = qRound(sum / visibleItems.count());
+        // move current item if it is not a visible item.
+        if (currentIndex >= 0 && currentItem && !fixedCurrent)
+            currentItem->setPosition(positionAt(currentIndex));
+    }
+    q->refill();
+    minExtentDirty = true;
+    maxExtentDirty = true;
+    updateHighlight();
+    if (!q->isMoving() && !q->isFlicking()) {
+        fixupPosition();
+        q->refill();
+    }
+    if (header)
+        updateHeader();
+    if (footer)
+        updateFooter();
+    updateViewport();
+}
+
+void QSGListViewPrivate::updateUnrequestedIndexes()
+{
+    Q_Q(QSGListView);
+    QHash<QSGItem*,int>::iterator it;
+    for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it)
+        *it = model->indexOf(it.key(), q);
+}
+
+void QSGListViewPrivate::updateUnrequestedPositions()
+{
+    Q_Q(QSGListView);
+    if (unrequestedItems.count()) {
+        qreal pos = position();
+        QHash<QSGItem*,int>::const_iterator it;
+        for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it) {
+            QSGItem *item = it.key();
+            if (orient == QSGListView::Vertical) {
+                if (item->y() + item->height() > pos && item->y() < pos + q->height())
+                    item->setY(positionAt(*it));
+            } else {
+                if (item->x() + item->width() > pos && item->x() < pos + q->width()) {
+                    if (isRightToLeft())
+                        item->setX(-positionAt(*it)-item->width());
+                    else
+                        item->setX(positionAt(*it));
+                }
+            }
+        }
+    }
+}
+
+void QSGListViewPrivate::updateTrackedItem()
+{
+    Q_Q(QSGListView);
+    FxListItemSG *item = currentItem;
+    if (highlight)
+        item = highlight;
+    trackedItem = item;
+    if (trackedItem)
+        q->trackedPositionChanged();
+}
+
+void QSGListViewPrivate::createHighlight()
+{
+    Q_Q(QSGListView);
+    bool changed = false;
+    if (highlight) {
+        if (trackedItem == highlight)
+            trackedItem = 0;
+        delete highlight->item;
+        delete highlight;
+        highlight = 0;
+        delete highlightPosAnimator;
+        delete highlightSizeAnimator;
+        highlightPosAnimator = 0;
+        highlightSizeAnimator = 0;
+        changed = true;
+    }
+
+    if (currentItem) {
+        QSGItem *item = 0;
+        if (highlightComponent) {
+            QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
+            QObject *nobj = highlightComponent->create(highlightContext);
+            if (nobj) {
+                QDeclarative_setParent_noEvent(highlightContext, nobj);
+                item = qobject_cast<QSGItem *>(nobj);
+                if (!item)
+                    delete nobj;
+            } else {
+                delete highlightContext;
+            }
+        } else {
+            item = new QSGItem;
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            highlight = new FxListItemSG(item, q);
+            if (currentItem && autoHighlight) {
+                if (orient == QSGListView::Vertical) {
+                    highlight->item->setHeight(currentItem->item->height());
+                } else {
+                    highlight->item->setWidth(currentItem->item->width());
+                }
+                highlight->setPosition(currentItem->itemPosition());
+            }
+            QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+            itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+            const QLatin1String posProp(orient == QSGListView::Vertical ? "y" : "x");
+            highlightPosAnimator = new QSmoothedAnimation(q);
+            highlightPosAnimator->target = QDeclarativeProperty(highlight->item, posProp);
+            highlightPosAnimator->velocity = highlightMoveSpeed;
+            highlightPosAnimator->userDuration = highlightMoveDuration;
+            const QLatin1String sizeProp(orient == QSGListView::Vertical ? "height" : "width");
+            highlightSizeAnimator = new QSmoothedAnimation(q);
+            highlightSizeAnimator->velocity = highlightResizeSpeed;
+            highlightSizeAnimator->userDuration = highlightResizeDuration;
+            highlightSizeAnimator->target = QDeclarativeProperty(highlight->item, sizeProp);
+            if (autoHighlight) {
+                highlightPosAnimator->restart();
+                highlightSizeAnimator->restart();
+            }
+            changed = true;
+        }
+    }
+    if (changed)
+        emit q->highlightItemChanged();
+}
+
+void QSGListViewPrivate::updateHighlight()
+{
+    if ((!currentItem && highlight) || (currentItem && !highlight))
+        createHighlight();
+    if (currentItem && autoHighlight && highlight && !movingHorizontally && !movingVertically) {
+        // auto-update highlight
+        highlightPosAnimator->to = isRightToLeft()
+                ? -currentItem->itemPosition()-currentItem->itemSize()
+                : currentItem->itemPosition();
+        highlightSizeAnimator->to = currentItem->itemSize();
+        if (orient == QSGListView::Vertical) {
+            if (highlight->item->width() == 0)
+                highlight->item->setWidth(currentItem->item->width());
+        } else {
+            if (highlight->item->height() == 0)
+                highlight->item->setHeight(currentItem->item->height());
+        }
+        highlightPosAnimator->restart();
+        highlightSizeAnimator->restart();
+    }
+    updateTrackedItem();
+}
+
+void QSGListViewPrivate::createSection(FxListItemSG *listItem)
+{
+    Q_Q(QSGListView);
+    if (!sectionCriteria || !sectionCriteria->delegate())
+        return;
+    if (listItem->attached->m_prevSection != listItem->attached->m_section) {
+        if (!listItem->section) {
+            qreal pos = listItem->position();
+            int i = sectionCacheSize-1;
+            while (i >= 0 && !sectionCache[i])
+                --i;
+            if (i >= 0) {
+                listItem->section = sectionCache[i];
+                sectionCache[i] = 0;
+                listItem->section->setVisible(true);
+                QDeclarativeContext *context = QDeclarativeEngine::contextForObject(listItem->section)->parentContext();
+                context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
+            } else {
+                QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
+                context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
+                QObject *nobj = sectionCriteria->delegate()->beginCreate(context);
+                if (nobj) {
+                    QDeclarative_setParent_noEvent(context, nobj);
+                    listItem->section = qobject_cast<QSGItem *>(nobj);
+                    if (!listItem->section) {
+                        delete nobj;
+                    } else {
+                        listItem->section->setZ(1);
+                        QDeclarative_setParent_noEvent(listItem->section, q->contentItem());
+                        listItem->section->setParentItem(q->contentItem());
+                    }
+                } else {
+                    delete context;
+                }
+                sectionCriteria->delegate()->completeCreate();
+            }
+            listItem->setPosition(pos);
+        } else {
+            QDeclarativeContext *context = QDeclarativeEngine::contextForObject(listItem->section)->parentContext();
+            context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
+        }
+    } else if (listItem->section) {
+        qreal pos = listItem->position();
+        int i = 0;
+        do {
+            if (!sectionCache[i]) {
+                sectionCache[i] = listItem->section;
+                sectionCache[i]->setVisible(false);
+                listItem->section = 0;
+                return;
+            }
+            ++i;
+        } while (i < sectionCacheSize);
+        delete listItem->section;
+        listItem->section = 0;
+        listItem->setPosition(pos);
+    }
+}
+
+void QSGListViewPrivate::updateSections()
+{
+    if (sectionCriteria && !visibleItems.isEmpty()) {
+        QString prevSection;
+        if (visibleIndex > 0)
+            prevSection = sectionAt(visibleIndex-1);
+        QSGListViewAttached *prevAtt = 0;
+        int idx = -1;
+        for (int i = 0; i < visibleItems.count(); ++i) {
+            QSGListViewAttached *attached = visibleItems.at(i)->attached;
+            attached->setPrevSection(prevSection);
+            if (visibleItems.at(i)->index != -1) {
+                QString propValue = model->stringValue(visibleItems.at(i)->index, sectionCriteria->property());
+                attached->setSection(sectionCriteria->sectionString(propValue));
+                idx = visibleItems.at(i)->index;
+            }
+            createSection(visibleItems.at(i));
+            if (prevAtt)
+                prevAtt->setNextSection(attached->section());
+            prevSection = attached->section();
+            prevAtt = attached;
+        }
+        if (prevAtt) {
+            if (idx > 0 && idx < model->count()-1)
+                prevAtt->setNextSection(sectionAt(idx+1));
+            else
+                prevAtt->setNextSection(QString());
+        }
+    }
+}
+
+void QSGListViewPrivate::updateCurrentSection()
+{
+    Q_Q(QSGListView);
+    if (!sectionCriteria || visibleItems.isEmpty()) {
+        if (!currentSection.isEmpty()) {
+            currentSection.clear();
+            emit q->currentSectionChanged();
+        }
+        return;
+    }
+    int index = 0;
+    while (index < visibleItems.count() && visibleItems.at(index)->endPosition() < position())
+        ++index;
+
+    QString newSection = currentSection;
+    if (index < visibleItems.count())
+        newSection = visibleItems.at(index)->attached->section();
+    else
+        newSection = visibleItems.first()->attached->section();
+    if (newSection != currentSection) {
+        currentSection = newSection;
+        emit q->currentSectionChanged();
+    }
+}
+
+void QSGListViewPrivate::updateCurrent(int modelIndex)
+{
+    Q_Q(QSGListView);
+    if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) {
+        if (currentItem) {
+            currentItem->attached->setIsCurrentItem(false);
+            releaseItem(currentItem);
+            currentItem = 0;
+            currentIndex = modelIndex;
+            emit q->currentIndexChanged();
+            updateHighlight();
+        } else if (currentIndex != modelIndex) {
+            currentIndex = modelIndex;
+            emit q->currentIndexChanged();
+        }
+        return;
+    }
+
+    if (currentItem && currentIndex == modelIndex) {
+        updateHighlight();
+        return;
+    }
+    FxListItemSG *oldCurrentItem = currentItem;
+    currentIndex = modelIndex;
+    currentItem = createItem(modelIndex);
+    if (oldCurrentItem && (!currentItem || oldCurrentItem->item != currentItem->item))
+        oldCurrentItem->attached->setIsCurrentItem(false);
+    if (currentItem) {
+        if (modelIndex == visibleIndex - 1 && visibleItems.count()) {
+            // We can calculate exact postion in this case
+            currentItem->setPosition(visibleItems.first()->position() - currentItem->size() - spacing);
+        } else {
+            // Create current item now and position as best we can.
+            // Its position will be corrected when it becomes visible.
+            currentItem->setPosition(positionAt(modelIndex));
+        }
+        currentItem->item->setFocus(true);
+        currentItem->attached->setIsCurrentItem(true);
+        // Avoid showing section delegate twice.  We still need the section heading so that
+        // currentItem positioning works correctly.
+        // This is slightly sub-optimal, but section heading caching minimizes the impact.
+        if (currentItem->section)
+            currentItem->section->setVisible(false);
+        if (visibleItems.isEmpty())
+            averageSize = currentItem->size();
+    }
+    updateHighlight();
+    emit q->currentIndexChanged();
+    // Release the old current item
+    releaseItem(oldCurrentItem);
+}
+
+void QSGListViewPrivate::updateAverage()
+{
+    if (!visibleItems.count())
+        return;
+    qreal sum = 0.0;
+    for (int i = 0; i < visibleItems.count(); ++i)
+        sum += visibleItems.at(i)->size();
+    averageSize = qRound(sum / visibleItems.count());
+}
+
+void QSGListViewPrivate::updateFooter()
+{
+    Q_Q(QSGListView);
+    if (!footer && footerComponent) {
+        QSGItem *item = 0;
+        QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
+        QObject *nobj = footerComponent->create(context);
+        if (nobj) {
+            QDeclarative_setParent_noEvent(context, nobj);
+            item = qobject_cast<QSGItem *>(nobj);
+            if (!item)
+                delete nobj;
+        } else {
+            delete context;
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            item->setZ(1);
+            QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+            itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+            footer = new FxListItemSG(item, q);
+        }
+    }
+    if (footer) {
+        if (visibleItems.count()) {
+            qreal endPos = lastPosition() + 1;
+            if (lastVisibleIndex() == model->count()-1) {
+                footer->setPosition(endPos);
+            } else {
+                qreal visiblePos = position() + q->height();
+                if (endPos <= visiblePos || footer->position() < endPos)
+                    footer->setPosition(endPos);
+            }
+        } else {
+            footer->setPosition(visiblePos);
+        }
+    }
+}
+
+void QSGListViewPrivate::updateHeader()
+{
+    Q_Q(QSGListView);
+    if (!header && headerComponent) {
+        QSGItem *item = 0;
+        QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
+        QObject *nobj = headerComponent->create(context);
+        if (nobj) {
+            QDeclarative_setParent_noEvent(context, nobj);
+            item = qobject_cast<QSGItem *>(nobj);
+            if (!item)
+                delete nobj;
+        } else {
+            delete context;
+        }
+        if (item) {
+            QDeclarative_setParent_noEvent(item, q->contentItem());
+            item->setParentItem(q->contentItem());
+            item->setZ(1);
+            QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+            itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+            header = new FxListItemSG(item, q);
+        }
+    }
+    if (header) {
+        if (visibleItems.count()) {
+            qreal startPos = originPosition();
+            if (visibleIndex == 0) {
+                header->setPosition(startPos - header->size());
+            } else {
+                if (position() <= startPos || header->position() > startPos - header->size())
+                    header->setPosition(startPos - header->size());
+            }
+        } else {
+            if (itemCount == 0)
+                visiblePos = header->size();
+            header->setPosition(0);
+        }
+    }
+}
+
+void QSGListViewPrivate::fixupPosition()
+{
+    if ((haveHighlightRange && highlightRange == QSGListView::StrictlyEnforceRange)
+        || snapMode != QSGListView::NoSnap)
+        moveReason = Other;
+    if (orient == QSGListView::Vertical)
+        fixupY();
+    else
+        fixupX();
+}
+
+void QSGListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
+{
+    if ((orient == QSGListView::Horizontal && &data == &vData)
+        || (orient == QSGListView::Vertical && &data == &hData))
+        return;
+
+    correctFlick = false;
+    fixupMode = moveReason == Mouse ? fixupMode : Immediate;
+
+    qreal highlightStart;
+    qreal highlightEnd;
+    qreal viewPos;
+    if (isRightToLeft()) {
+        // Handle Right-To-Left exceptions
+        viewPos = -position()-size();
+        highlightStart = highlightRangeStartValid ? size() - highlightRangeEnd : highlightRangeStart;
+        highlightEnd = highlightRangeEndValid ? size() - highlightRangeStart : highlightRangeEnd;
+    } else {
+        viewPos = position();
+        highlightStart = highlightRangeStart;
+        highlightEnd = highlightRangeEnd;
+    }
+
+    if (currentItem && haveHighlightRange && highlightRange == QSGListView::StrictlyEnforceRange
+            && moveReason != QSGListViewPrivate::SetIndex) {
+        updateHighlight();
+        qreal pos = currentItem->itemPosition();
+        if (viewPos < pos + currentItem->itemSize() - highlightEnd)
+            viewPos = pos + currentItem->itemSize() - highlightEnd;
+        if (viewPos > pos - highlightStart)
+            viewPos = pos - highlightStart;
+        if (isRightToLeft())
+            viewPos = -viewPos-size();
+
+        timeline.reset(data.move);
+        if (viewPos != position()) {
+            if (fixupMode != Immediate) {
+                timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
+                data.fixingUp = true;
+            } else {
+                timeline.set(data.move, -viewPos);
+            }
+        }
+        vTime = timeline.time();
+    } else if (snapMode != QSGListView::NoSnap && moveReason != QSGListViewPrivate::SetIndex) {
+        qreal tempPosition = isRightToLeft() ? -position()-size() : position();
+        FxListItemSG *topItem = snapItemAt(tempPosition+highlightStart);
+        FxListItemSG *bottomItem = snapItemAt(tempPosition+highlightEnd);
+        qreal pos;
+        bool isInBounds = -position() > maxExtent && -position() < minExtent;
+        if (topItem && isInBounds) {
+            if (topItem->index == 0 && header && tempPosition+highlightStart < header->position()+header->size()/2) {
+                pos = isRightToLeft() ? - header->position() + highlightStart - size() : header->position() - highlightStart;
+            } else {
+                if (isRightToLeft())
+                    pos = qMax(qMin(-topItem->position() + highlightStart - size(), -maxExtent), -minExtent);
+                else
+                    pos = qMax(qMin(topItem->position() - highlightStart, -maxExtent), -minExtent);
+            }
+        } else if (bottomItem && isInBounds) {
+            if (isRightToLeft())
+                pos = qMax(qMin(-bottomItem->position() + highlightStart - size(), -maxExtent), -minExtent);
+            else
+                pos = qMax(qMin(bottomItem->position() - highlightStart, -maxExtent), -minExtent);
+        } else {
+            QSGFlickablePrivate::fixup(data, minExtent, maxExtent);
+            return;
+        }
+
+        qreal dist = qAbs(data.move + pos);
+        if (dist > 0) {
+            timeline.reset(data.move);
+            if (fixupMode != Immediate) {
+                timeline.move(data.move, -pos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
+                data.fixingUp = true;
+            } else {
+                timeline.set(data.move, -pos);
+            }
+            vTime = timeline.time();
+        }
+    } else {
+        QSGFlickablePrivate::fixup(data, minExtent, maxExtent);
+    }
+    fixupMode = Normal;
+}
+
+void QSGListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                                        QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
+{
+    Q_Q(QSGListView);
+
+    data.fixingUp = false;
+    moveReason = Mouse;
+    if ((!haveHighlightRange || highlightRange != QSGListView::StrictlyEnforceRange) && snapMode == QSGListView::NoSnap) {
+        correctFlick = true;
+        QSGFlickablePrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity);
+        return;
+    }
+    qreal maxDistance = 0;
+    qreal dataValue = isRightToLeft() ? -data.move.value()+size() : data.move.value();
+    // -ve velocity means list is moving up/left
+    if (velocity > 0) {
+        if (data.move.value() < minExtent) {
+            if (snapMode == QSGListView::SnapOneItem) {
+                if (FxListItemSG *item = isRightToLeft() ? nextVisibleItem() : firstVisibleItem())
+                    maxDistance = qAbs(item->position() + dataValue);
+            } else {
+                maxDistance = qAbs(minExtent - data.move.value());
+            }
+        }
+        if (snapMode == QSGListView::NoSnap && highlightRange != QSGListView::StrictlyEnforceRange)
+            data.flickTarget = minExtent;
+    } else {
+        if (data.move.value() > maxExtent) {
+            if (snapMode == QSGListView::SnapOneItem) {
+                if (FxListItemSG *item = isRightToLeft() ? firstVisibleItem() : nextVisibleItem())
+                    maxDistance = qAbs(item->position() + dataValue);
+            } else {
+                maxDistance = qAbs(maxExtent - data.move.value());
+            }
+        }
+        if (snapMode == QSGListView::NoSnap && highlightRange != QSGListView::StrictlyEnforceRange)
+            data.flickTarget = maxExtent;
+    }
+    bool overShoot = boundsBehavior == QSGFlickable::DragAndOvershootBounds;
+    qreal highlightStart = isRightToLeft() && highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
+    if (maxDistance > 0 || overShoot) {
+        // These modes require the list to stop exactly on an item boundary.
+        // The initial flick will estimate the boundary to stop on.
+        // Since list items can have variable sizes, the boundary will be
+        // reevaluated and adjusted as we approach the boundary.
+        qreal v = velocity;
+        if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
+            if (v < 0)
+                v = -maxVelocity;
+            else
+                v = maxVelocity;
+        }
+        if (!flickingHorizontally && !flickingVertically) {
+            // the initial flick - estimate boundary
+            qreal accel = deceleration;
+            qreal v2 = v * v;
+            overshootDist = 0.0;
+            // + averageSize/4 to encourage moving at least one item in the flick direction
+            qreal dist = v2 / (accel * 2.0) + averageSize/4;
+            if (maxDistance > 0)
+                dist = qMin(dist, maxDistance);
+            if (v > 0)
+                dist = -dist;
+            if ((maxDistance > 0.0 && v2 / (2.0f * maxDistance) < accel) || snapMode == QSGListView::SnapOneItem) {
+                qreal distTemp = isRightToLeft() ? -dist : dist;
+                data.flickTarget = -snapPosAt(-(dataValue - highlightStart) + distTemp) + highlightStart;
+                data.flickTarget = isRightToLeft() ? -data.flickTarget+size() : data.flickTarget;
+                if (overShoot) {
+                    if (data.flickTarget >= minExtent) {
+                        overshootDist = overShootDistance(v, vSize);
+                        data.flickTarget += overshootDist;
+                    } else if (data.flickTarget <= maxExtent) {
+                        overshootDist = overShootDistance(v, vSize);
+                        data.flickTarget -= overshootDist;
+                    }
+                }
+                qreal adjDist = -data.flickTarget + data.move.value();
+                if (qAbs(adjDist) > qAbs(dist)) {
+                    // Prevent painfully slow flicking - adjust velocity to suit flickDeceleration
+                    qreal adjv2 = accel * 2.0f * qAbs(adjDist);
+                    if (adjv2 > v2) {
+                        v2 = adjv2;
+                        v = qSqrt(v2);
+                        if (dist > 0)
+                            v = -v;
+                    }
+                }
+                dist = adjDist;
+                accel = v2 / (2.0f * qAbs(dist));
+            } else if (overShoot) {
+                data.flickTarget = data.move.value() - dist;
+                if (data.flickTarget >= minExtent) {
+                    overshootDist = overShootDistance(v, vSize);
+                    data.flickTarget += overshootDist;
+                } else if (data.flickTarget <= maxExtent) {
+                    overshootDist = overShootDistance(v, vSize);
+                    data.flickTarget -= overshootDist;
+                }
+            }
+            timeline.reset(data.move);
+            timeline.accel(data.move, v, accel, maxDistance + overshootDist);
+            timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
+            if (!flickingHorizontally && q->xflick()) {
+                flickingHorizontally = true;
+                emit q->flickingChanged();
+                emit q->flickingHorizontallyChanged();
+                emit q->flickStarted();
+            }
+            if (!flickingVertically && q->yflick()) {
+                flickingVertically = true;
+                emit q->flickingChanged();
+                emit q->flickingVerticallyChanged();
+                emit q->flickStarted();
+            }
+            correctFlick = true;
+        } else {
+            // reevaluate the target boundary.
+            qreal newtarget = data.flickTarget;
+            if (snapMode != QSGListView::NoSnap || highlightRange == QSGListView::StrictlyEnforceRange) {
+                qreal tempFlickTarget = isRightToLeft() ? -data.flickTarget+size() : data.flickTarget;
+                newtarget = -snapPosAt(-(tempFlickTarget - highlightStart)) + highlightStart;
+                newtarget = isRightToLeft() ? -newtarget+size() : newtarget;
+            }
+            if (velocity < 0 && newtarget <= maxExtent)
+                newtarget = maxExtent - overshootDist;
+            else if (velocity > 0 && newtarget >= minExtent)
+                newtarget = minExtent + overshootDist;
+            if (newtarget == data.flickTarget) { // boundary unchanged - nothing to do
+                if (qAbs(velocity) < MinimumFlickVelocity)
+                    correctFlick = false;
+                return;
+            }
+            data.flickTarget = newtarget;
+            qreal dist = -newtarget + data.move.value();
+            if ((v < 0 && dist < 0) || (v > 0 && dist > 0)) {
+                correctFlick = false;
+                timeline.reset(data.move);
+                fixup(data, minExtent, maxExtent);
+                return;
+            }
+            timeline.reset(data.move);
+            timeline.accelDistance(data.move, v, -dist);
+            timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
+        }
+    } else {
+        correctFlick = false;
+        timeline.reset(data.move);
+        fixup(data, minExtent, maxExtent);
+    }
+}
+
+//----------------------------------------------------------------------------
+
+QSGListView::QSGListView(QSGItem *parent)
+    : QSGFlickable(*(new QSGListViewPrivate), parent)
+{
+    Q_D(QSGListView);
+    d->init();
+}
+
+QSGListView::~QSGListView()
+{
+    Q_D(QSGListView);
+    d->clear();
+    if (d->ownModel)
+        delete d->model;
+    delete d->header;
+    delete d->footer;
+}
+
+QVariant QSGListView::model() const
+{
+    Q_D(const QSGListView);
+    return d->modelVariant;
+}
+
+void QSGListView::setModel(const QVariant &model)
+{
+    Q_D(QSGListView);
+    if (d->modelVariant == model)
+        return;
+    if (d->model) {
+        disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        disconnect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
+        disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        disconnect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        disconnect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+    }
+    d->clear();
+    QSGVisualModel *oldModel = d->model;
+    d->model = 0;
+    d->setPosition(0);
+    d->modelVariant = model;
+    QObject *object = qvariant_cast<QObject*>(model);
+    QSGVisualModel *vim = 0;
+    if (object && (vim = qobject_cast<QSGVisualModel *>(object))) {
+        if (d->ownModel) {
+            delete oldModel;
+            d->ownModel = false;
+        }
+        d->model = vim;
+    } else {
+        if (!d->ownModel) {
+            d->model = new QSGVisualDataModel(qmlContext(this), this);
+            d->ownModel = true;
+        } else {
+            d->model = oldModel;
+        }
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            dataModel->setModel(model);
+    }
+    if (d->model) {
+        d->bufferMode = QSGListViewPrivate::BufferBefore | QSGListViewPrivate::BufferAfter;
+        if (isComponentComplete()) {
+            updateSections();
+            refill();
+            if ((d->currentIndex >= d->model->count() || d->currentIndex < 0) && !d->currentIndexCleared) {
+                setCurrentIndex(0);
+            } else {
+                d->moveReason = QSGListViewPrivate::SetIndex;
+                d->updateCurrent(d->currentIndex);
+                if (d->highlight && d->currentItem) {
+                    if (d->autoHighlight)
+                        d->highlight->setPosition(d->currentItem->position());
+                    d->updateTrackedItem();
+                }
+            }
+            d->updateViewport();
+        }
+        connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        connect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
+        connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        connect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        connect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+        emit countChanged();
+    }
+    emit modelChanged();
+}
+
+QDeclarativeComponent *QSGListView::delegate() const
+{
+    Q_D(const QSGListView);
+    if (d->model) {
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            return dataModel->delegate();
+    }
+
+    return 0;
+}
+
+void QSGListView::setDelegate(QDeclarativeComponent *delegate)
+{
+    Q_D(QSGListView);
+    if (delegate == this->delegate())
+        return;
+    if (!d->ownModel) {
+        d->model = new QSGVisualDataModel(qmlContext(this));
+        d->ownModel = true;
+    }
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model)) {
+        dataModel->setDelegate(delegate);
+        if (isComponentComplete()) {
+            for (int i = 0; i < d->visibleItems.count(); ++i)
+                d->releaseItem(d->visibleItems.at(i));
+            d->visibleItems.clear();
+            d->releaseItem(d->currentItem);
+            d->currentItem = 0;
+            updateSections();
+            refill();
+            d->moveReason = QSGListViewPrivate::SetIndex;
+            d->updateCurrent(d->currentIndex);
+            if (d->highlight && d->currentItem) {
+                if (d->autoHighlight)
+                    d->highlight->setPosition(d->currentItem->position());
+                d->updateTrackedItem();
+            }
+            d->updateViewport();
+        }
+    }
+    emit delegateChanged();
+}
+
+int QSGListView::currentIndex() const
+{
+    Q_D(const QSGListView);
+    return d->currentIndex;
+}
+
+void QSGListView::setCurrentIndex(int index)
+{
+    Q_D(QSGListView);
+    if (d->requestedIndex >= 0)  // currently creating item
+        return;
+    d->currentIndexCleared = (index == -1);
+    if (index == d->currentIndex)
+        return;
+    if (isComponentComplete() && d->isValid()) {
+        d->moveReason = QSGListViewPrivate::SetIndex;
+        d->updateCurrent(index);
+    } else if (d->currentIndex != index) {
+        d->currentIndex = index;
+        emit currentIndexChanged();
+    }
+}
+
+QSGItem *QSGListView::currentItem()
+{
+    Q_D(QSGListView);
+    if (!d->currentItem)
+        return 0;
+    return d->currentItem->item;
+}
+
+QSGItem *QSGListView::highlightItem()
+{
+    Q_D(QSGListView);
+    if (!d->highlight)
+        return 0;
+    return d->highlight->item;
+}
+
+int QSGListView::count() const
+{
+    Q_D(const QSGListView);
+    if (d->model)
+        return d->model->count();
+    return 0;
+}
+
+QDeclarativeComponent *QSGListView::highlight() const
+{
+    Q_D(const QSGListView);
+    return d->highlightComponent;
+}
+
+void QSGListView::setHighlight(QDeclarativeComponent *highlight)
+{
+    Q_D(QSGListView);
+    if (highlight != d->highlightComponent) {
+        d->highlightComponent = highlight;
+        d->createHighlight();
+        if (d->currentItem)
+            d->updateHighlight();
+        emit highlightChanged();
+    }
+}
+
+bool QSGListView::highlightFollowsCurrentItem() const
+{
+    Q_D(const QSGListView);
+    return d->autoHighlight;
+}
+
+void QSGListView::setHighlightFollowsCurrentItem(bool autoHighlight)
+{
+    Q_D(QSGListView);
+    if (d->autoHighlight != autoHighlight) {
+        d->autoHighlight = autoHighlight;
+        if (autoHighlight) {
+            d->updateHighlight();
+        } else {
+            if (d->highlightPosAnimator)
+                d->highlightPosAnimator->stop();
+            if (d->highlightSizeAnimator)
+                d->highlightSizeAnimator->stop();
+        }
+        emit highlightFollowsCurrentItemChanged();
+    }
+}
+
+//###Possibly rename these properties, since they are very useful even without a highlight?
+qreal QSGListView::preferredHighlightBegin() const
+{
+    Q_D(const QSGListView);
+    return d->highlightRangeStart;
+}
+
+void QSGListView::setPreferredHighlightBegin(qreal start)
+{
+    Q_D(QSGListView);
+    d->highlightRangeStartValid = true;
+    if (d->highlightRangeStart == start)
+        return;
+    d->highlightRangeStart = start;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit preferredHighlightBeginChanged();
+}
+
+void QSGListView::resetPreferredHighlightBegin()
+{
+    Q_D(QSGListView);
+    d->highlightRangeStartValid = false;
+    if (d->highlightRangeStart == 0)
+        return;
+    d->highlightRangeStart = 0;
+    emit preferredHighlightBeginChanged();
+}
+
+qreal QSGListView::preferredHighlightEnd() const
+{
+    Q_D(const QSGListView);
+    return d->highlightRangeEnd;
+}
+
+void QSGListView::setPreferredHighlightEnd(qreal end)
+{
+    Q_D(QSGListView);
+    d->highlightRangeEndValid = true;
+    if (d->highlightRangeEnd == end)
+        return;
+    d->highlightRangeEnd = end;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit preferredHighlightEndChanged();
+}
+
+void QSGListView::resetPreferredHighlightEnd()
+{
+    Q_D(QSGListView);
+    d->highlightRangeEndValid = false;
+    if (d->highlightRangeEnd == 0)
+        return;
+    d->highlightRangeEnd = 0;
+    emit preferredHighlightEndChanged();
+}
+
+QSGListView::HighlightRangeMode QSGListView::highlightRangeMode() const
+{
+    Q_D(const QSGListView);
+    return d->highlightRange;
+}
+
+void QSGListView::setHighlightRangeMode(HighlightRangeMode mode)
+{
+    Q_D(QSGListView);
+    if (d->highlightRange == mode)
+        return;
+    d->highlightRange = mode;
+    d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit highlightRangeModeChanged();
+}
+
+qreal QSGListView::spacing() const
+{
+    Q_D(const QSGListView);
+    return d->spacing;
+}
+
+void QSGListView::setSpacing(qreal spacing)
+{
+    Q_D(QSGListView);
+    if (spacing != d->spacing) {
+        d->spacing = spacing;
+        d->layout();
+        emit spacingChanged();
+    }
+}
+
+QSGListView::Orientation QSGListView::orientation() const
+{
+    Q_D(const QSGListView);
+    return d->orient;
+}
+
+void QSGListView::setOrientation(QSGListView::Orientation orientation)
+{
+    Q_D(QSGListView);
+    if (d->orient != orientation) {
+        d->orient = orientation;
+        if (d->orient == QSGListView::Vertical) {
+            setContentWidth(-1);
+            setFlickableDirection(VerticalFlick);
+        } else {
+            setContentHeight(-1);
+            setFlickableDirection(HorizontalFlick);
+        }
+        d->regenerate();
+        emit orientationChanged();
+    }
+}
+
+Qt::LayoutDirection QSGListView::layoutDirection() const
+{
+    Q_D(const QSGListView);
+    return d->layoutDirection;
+}
+
+void QSGListView::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+    Q_D(QSGListView);
+    if (d->layoutDirection != layoutDirection) {
+        d->layoutDirection = layoutDirection;
+        d->regenerate();
+        emit layoutDirectionChanged();
+        emit effectiveLayoutDirectionChanged();
+    }
+}
+
+Qt::LayoutDirection QSGListView::effectiveLayoutDirection() const
+{
+    Q_D(const QSGListView);
+    if (d->effectiveLayoutMirror)
+        return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
+    else
+        return d->layoutDirection;
+}
+
+bool QSGListView::isWrapEnabled() const
+{
+    Q_D(const QSGListView);
+    return d->wrap;
+}
+
+void QSGListView::setWrapEnabled(bool wrap)
+{
+    Q_D(QSGListView);
+    if (d->wrap == wrap)
+        return;
+    d->wrap = wrap;
+    emit keyNavigationWrapsChanged();
+}
+
+int QSGListView::cacheBuffer() const
+{
+    Q_D(const QSGListView);
+    return d->buffer;
+}
+
+void QSGListView::setCacheBuffer(int b)
+{
+    Q_D(QSGListView);
+    if (d->buffer != b) {
+        d->buffer = b;
+        if (isComponentComplete()) {
+            d->bufferMode = QSGListViewPrivate::BufferBefore | QSGListViewPrivate::BufferAfter;
+            refill();
+        }
+        emit cacheBufferChanged();
+    }
+}
+
+QSGViewSection *QSGListView::sectionCriteria()
+{
+    Q_D(QSGListView);
+    if (!d->sectionCriteria) {
+        d->sectionCriteria = new QSGViewSection(this);
+        connect(d->sectionCriteria, SIGNAL(propertyChanged()), this, SLOT(updateSections()));
+    }
+    return d->sectionCriteria;
+}
+
+QString QSGListView::currentSection() const
+{
+    Q_D(const QSGListView);
+    return d->currentSection;
+}
+
+qreal QSGListView::highlightMoveSpeed() const
+{
+    Q_D(const QSGListView);\
+    return d->highlightMoveSpeed;
+}
+
+void QSGListView::setHighlightMoveSpeed(qreal speed)
+{
+    Q_D(QSGListView);\
+    if (d->highlightMoveSpeed != speed) {
+        d->highlightMoveSpeed = speed;
+        if (d->highlightPosAnimator)
+            d->highlightPosAnimator->velocity = d->highlightMoveSpeed;
+        emit highlightMoveSpeedChanged();
+    }
+}
+
+int QSGListView::highlightMoveDuration() const
+{
+    Q_D(const QSGListView);
+    return d->highlightMoveDuration;
+}
+
+void QSGListView::setHighlightMoveDuration(int duration)
+{
+    Q_D(QSGListView);\
+    if (d->highlightMoveDuration != duration) {
+        d->highlightMoveDuration = duration;
+        if (d->highlightPosAnimator)
+            d->highlightPosAnimator->userDuration = d->highlightMoveDuration;
+        emit highlightMoveDurationChanged();
+    }
+}
+
+qreal QSGListView::highlightResizeSpeed() const
+{
+    Q_D(const QSGListView);\
+    return d->highlightResizeSpeed;
+}
+
+void QSGListView::setHighlightResizeSpeed(qreal speed)
+{
+    Q_D(QSGListView);\
+    if (d->highlightResizeSpeed != speed) {
+        d->highlightResizeSpeed = speed;
+        if (d->highlightSizeAnimator)
+            d->highlightSizeAnimator->velocity = d->highlightResizeSpeed;
+        emit highlightResizeSpeedChanged();
+    }
+}
+
+int QSGListView::highlightResizeDuration() const
+{
+    Q_D(const QSGListView);
+    return d->highlightResizeDuration;
+}
+
+void QSGListView::setHighlightResizeDuration(int duration)
+{
+    Q_D(QSGListView);\
+    if (d->highlightResizeDuration != duration) {
+        d->highlightResizeDuration = duration;
+        if (d->highlightSizeAnimator)
+            d->highlightSizeAnimator->userDuration = d->highlightResizeDuration;
+        emit highlightResizeDurationChanged();
+    }
+}
+
+QSGListView::SnapMode QSGListView::snapMode() const
+{
+    Q_D(const QSGListView);
+    return d->snapMode;
+}
+
+void QSGListView::setSnapMode(SnapMode mode)
+{
+    Q_D(QSGListView);
+    if (d->snapMode != mode) {
+        d->snapMode = mode;
+        emit snapModeChanged();
+    }
+}
+
+QDeclarativeComponent *QSGListView::footer() const
+{
+    Q_D(const QSGListView);
+    return d->footerComponent;
+}
+
+void QSGListView::setFooter(QDeclarativeComponent *footer)
+{
+    Q_D(QSGListView);
+    if (d->footerComponent != footer) {
+        if (d->footer) {
+            // XXX todo - the original did scene()->removeItem().  Why?
+            d->footer->item->setParentItem(0);
+            d->footer->item->deleteLater();
+            delete d->footer;
+            d->footer = 0;
+        }
+        d->footerComponent = footer;
+        d->minExtentDirty = true;
+        d->maxExtentDirty = true;
+        if (isComponentComplete()) {
+            d->updateFooter();
+            d->updateViewport();
+            d->fixupPosition();
+        }
+        emit footerChanged();
+    }
+}
+
+QDeclarativeComponent *QSGListView::header() const
+{
+    Q_D(const QSGListView);
+    return d->headerComponent;
+}
+
+void QSGListView::setHeader(QDeclarativeComponent *header)
+{
+    Q_D(QSGListView);
+    if (d->headerComponent != header) {
+        if (d->header) {
+            // XXX todo - the original did scene()->removeItem().  Why?
+            d->header->item->setParentItem(0);
+            d->header->item->deleteLater();
+            delete d->header;
+            d->header = 0;
+        }
+        d->headerComponent = header;
+        d->minExtentDirty = true;
+        d->maxExtentDirty = true;
+        if (isComponentComplete()) {
+            d->updateHeader();
+            d->updateFooter();
+            d->updateViewport();
+            d->fixupPosition();
+        }
+        emit headerChanged();
+    }
+}
+
+void QSGListView::setContentX(qreal pos)
+{
+    Q_D(QSGListView);
+    // Positioning the view manually should override any current movement state
+    d->moveReason = QSGListViewPrivate::Other;
+    QSGFlickable::setContentX(pos);
+}
+
+void QSGListView::setContentY(qreal pos)
+{
+    Q_D(QSGListView);
+    // Positioning the view manually should override any current movement state
+    d->moveReason = QSGListViewPrivate::Other;
+    QSGFlickable::setContentY(pos);
+}
+
+void QSGListView::updatePolish()
+{
+    Q_D(QSGListView);
+    QSGFlickable::updatePolish();
+    d->layout();
+}
+
+void QSGListView::viewportMoved()
+{
+    Q_D(QSGListView);
+    QSGFlickable::viewportMoved();
+    if (!d->itemCount)
+        return;
+    // Recursion can occur due to refill changing the content size.
+    if (d->inViewportMoved)
+        return;
+    d->inViewportMoved = true;
+    d->lazyRelease = true;
+    refill();
+    if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
+        d->moveReason = QSGListViewPrivate::Mouse;
+    if (d->moveReason != QSGListViewPrivate::SetIndex) {
+        if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange && d->highlight) {
+            // reposition highlight
+            qreal pos = d->highlight->position();
+            qreal viewPos;
+            qreal highlightStart;
+            qreal highlightEnd;
+            if (d->isRightToLeft()) {
+                // Handle Right-To-Left exceptions
+                viewPos = -d->position()-d->size();
+                highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
+                highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
+            } else {
+                viewPos = d->position();
+                highlightStart = d->highlightRangeStart;
+                highlightEnd = d->highlightRangeEnd;
+            }
+            if (pos > viewPos + highlightEnd - d->highlight->size())
+                pos = viewPos + highlightEnd - d->highlight->size();
+            if (pos < viewPos + highlightStart)
+                pos = viewPos + highlightStart;
+            d->highlightPosAnimator->stop();
+            d->highlight->setPosition(qRound(pos));
+
+            // update current index
+            if (FxListItemSG *snapItem = d->snapItemAt(d->highlight->position())) {
+                if (snapItem->index >= 0 && snapItem->index != d->currentIndex)
+                    d->updateCurrent(snapItem->index);
+            }
+        }
+    }
+
+    if ((d->flickingHorizontally || d->flickingVertically) && d->correctFlick && !d->inFlickCorrection) {
+        d->inFlickCorrection = true;
+        // Near an end and it seems that the extent has changed?
+        // Recalculate the flick so that we don't end up in an odd position.
+        if (yflick()) {
+            if (d->vData.velocity > 0) {
+                const qreal minY = minYExtent();
+                if ((minY - d->vData.move.value() < height()/2 || d->vData.flickTarget - d->vData.move.value() < height()/2)
+                    && minY != d->vData.flickTarget)
+                    d->flickY(-d->vData.smoothVelocity.value());
+                d->bufferMode = QSGListViewPrivate::BufferBefore;
+            } else if (d->vData.velocity < 0) {
+                const qreal maxY = maxYExtent();
+                if ((d->vData.move.value() - maxY < height()/2 || d->vData.move.value() - d->vData.flickTarget < height()/2)
+                    && maxY != d->vData.flickTarget)
+                    d->flickY(-d->vData.smoothVelocity.value());
+                d->bufferMode = QSGListViewPrivate::BufferAfter;
+            }
+        }
+
+        if (xflick()) {
+            if (d->hData.velocity > 0) {
+                const qreal minX = minXExtent();
+                if ((minX - d->hData.move.value() < width()/2 || d->hData.flickTarget - d->hData.move.value() < width()/2)
+                    && minX != d->hData.flickTarget)
+                    d->flickX(-d->hData.smoothVelocity.value());
+                d->bufferMode = d->isRightToLeft() ? QSGListViewPrivate::BufferAfter : QSGListViewPrivate::BufferBefore;
+            } else if (d->hData.velocity < 0) {
+                const qreal maxX = maxXExtent();
+                if ((d->hData.move.value() - maxX < width()/2 || d->hData.move.value() - d->hData.flickTarget < width()/2)
+                    && maxX != d->hData.flickTarget)
+                    d->flickX(-d->hData.smoothVelocity.value());
+                d->bufferMode = d->isRightToLeft() ? QSGListViewPrivate::BufferBefore : QSGListViewPrivate::BufferAfter;
+            }
+        }
+        d->inFlickCorrection = false;
+    }
+    d->inViewportMoved = false;
+}
+
+qreal QSGListView::minYExtent() const
+{
+    Q_D(const QSGListView);
+    if (d->orient == QSGListView::Horizontal)
+        return QSGFlickable::minYExtent();
+    if (d->minExtentDirty) {
+        d->minExtent = -d->startPosition();
+        if (d->header && d->visibleItems.count())
+            d->minExtent += d->header->size();
+        if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+            d->minExtent += d->highlightRangeStart;
+            if (d->sectionCriteria) {
+                if (d->visibleItem(0))
+                    d->minExtent -= d->visibleItem(0)->sectionSize();
+            }
+            d->minExtent = qMax(d->minExtent, -(d->endPositionAt(0) - d->highlightRangeEnd + 1));
+        }
+        d->minExtentDirty = false;
+    }
+
+    return d->minExtent;
+}
+
+qreal QSGListView::maxYExtent() const
+{
+    Q_D(const QSGListView);
+    if (d->orient == QSGListView::Horizontal)
+        return height();
+    if (d->maxExtentDirty) {
+        if (!d->model || !d->model->count()) {
+            d->maxExtent = d->header ? -d->header->size() : 0;
+            d->maxExtent += height();
+        } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+            d->maxExtent = -(d->positionAt(d->model->count()-1) - d->highlightRangeStart);
+            if (d->highlightRangeEnd != d->highlightRangeStart)
+                d->maxExtent = qMin(d->maxExtent, -(d->endPosition() - d->highlightRangeEnd + 1));
+        } else {
+            d->maxExtent = -(d->endPosition() - height() + 1);
+        }
+        if (d->footer)
+            d->maxExtent -= d->footer->size();
+        qreal minY = minYExtent();
+        if (d->maxExtent > minY)
+            d->maxExtent = minY;
+        d->maxExtentDirty = false;
+    }
+    return d->maxExtent;
+}
+
+qreal QSGListView::minXExtent() const
+{
+    Q_D(const QSGListView);
+    if (d->orient == QSGListView::Vertical)
+        return QSGFlickable::minXExtent();
+    if (d->minExtentDirty) {
+        d->minExtent = -d->startPosition();
+        qreal highlightStart;
+        qreal highlightEnd;
+        qreal endPositionFirstItem = 0;
+        if (d->isRightToLeft()) {
+            if (d->model && d->model->count())
+                endPositionFirstItem = d->positionAt(d->model->count()-1);
+            else if (d->header)
+                d->minExtent += d->header->size();
+            highlightStart = d->highlightRangeStartValid
+                    ? d->highlightRangeStart - (d->lastPosition()-endPositionFirstItem)
+                    : d->size() - (d->lastPosition()-endPositionFirstItem);
+            highlightEnd = d->highlightRangeEndValid ? d->highlightRangeEnd : d->size();
+            if (d->footer)
+                d->minExtent += d->footer->size();
+            qreal maxX = maxXExtent();
+            if (d->minExtent < maxX)
+                d->minExtent = maxX;
+        } else {
+            endPositionFirstItem = d->endPositionAt(0);
+            highlightStart = d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEnd;
+            if (d->header && d->visibleItems.count())
+                d->minExtent += d->header->size();
+        }
+        if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+            d->minExtent += highlightStart;
+            d->minExtent = qMax(d->minExtent, -(endPositionFirstItem - highlightEnd + 1));
+        }
+        d->minExtentDirty = false;
+    }
+
+    return d->minExtent;
+}
+
+qreal QSGListView::maxXExtent() const
+{
+    Q_D(const QSGListView);
+    if (d->orient == QSGListView::Vertical)
+        return width();
+    if (d->maxExtentDirty) {
+        qreal highlightStart;
+        qreal highlightEnd;
+        qreal lastItemPosition = 0;
+        d->maxExtent = 0;
+        if (d->isRightToLeft()) {
+            highlightStart = d->highlightRangeStartValid ? d->highlightRangeEnd : d->size();
+            highlightEnd = d->highlightRangeEndValid ? d->highlightRangeStart : d->size();
+            lastItemPosition = d->endPosition();
+        } else {
+            highlightStart = d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEnd;
+            if (d->model && d->model->count())
+                lastItemPosition = d->positionAt(d->model->count()-1);
+        }
+        if (!d->model || !d->model->count()) {
+            if (!d->isRightToLeft())
+                d->maxExtent = d->header ? -d->header->size() : 0;
+            d->maxExtent += width();
+        } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
+            d->maxExtent = -(lastItemPosition - highlightStart);
+            if (highlightEnd != highlightStart) {
+                d->maxExtent = d->isRightToLeft()
+                        ? qMax(d->maxExtent, -(d->endPosition() - highlightEnd + 1))
+                        : qMin(d->maxExtent, -(d->endPosition() - highlightEnd + 1));
+            }
+        } else {
+            d->maxExtent = -(d->endPosition() - width() + 1);
+        }
+        if (d->isRightToLeft()) {
+            if (d->header && d->visibleItems.count())
+                d->maxExtent -= d->header->size();
+        } else {
+            if (d->footer)
+                d->maxExtent -= d->footer->size();
+            qreal minX = minXExtent();
+            if (d->maxExtent > minX)
+                d->maxExtent = minX;
+        }
+        d->maxExtentDirty = false;
+    }
+
+    return d->maxExtent;
+}
+
+void QSGListView::keyPressEvent(QKeyEvent *event)
+{
+    Q_D(QSGListView);
+    if (d->model && d->model->count() && d->interactive) {
+        if ((!d->isRightToLeft() && event->key() == Qt::Key_Left)
+                    || (d->orient == QSGListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Right)
+                    || (d->orient == QSGListView::Vertical && event->key() == Qt::Key_Up)) {
+            if (currentIndex() > 0 || (d->wrap && !event->isAutoRepeat())) {
+                decrementCurrentIndex();
+                event->accept();
+                return;
+            } else if (d->wrap) {
+                event->accept();
+                return;
+            }
+        } else if ((!d->isRightToLeft() && event->key() == Qt::Key_Right)
+                    || (d->orient == QSGListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Left)
+                    || (d->orient == QSGListView::Vertical && event->key() == Qt::Key_Down)) {
+            if (currentIndex() < d->model->count() - 1 || (d->wrap && !event->isAutoRepeat())) {
+                incrementCurrentIndex();
+                event->accept();
+                return;
+            } else if (d->wrap) {
+                event->accept();
+                return;
+            }
+        }
+    }
+    event->ignore();
+    QSGFlickable::keyPressEvent(event);
+}
+
+void QSGListView::geometryChanged(const QRectF &newGeometry,
+                                  const QRectF &oldGeometry)
+{
+    Q_D(QSGListView);
+    d->maxExtentDirty = true;
+    d->minExtentDirty = true;
+    if (d->isRightToLeft() && d->orient == QSGListView::Horizontal) {
+        // maintain position relative to the right edge
+        int dx = newGeometry.width() - oldGeometry.width();
+        setContentX(contentX() - dx);
+    }
+    QSGFlickable::geometryChanged(newGeometry, oldGeometry);
+}
+
+
+void QSGListView::incrementCurrentIndex()
+{
+    Q_D(QSGListView);
+    int count = d->model ? d->model->count() : 0;
+    if (count && (currentIndex() < count - 1 || d->wrap)) {
+        d->moveReason = QSGListViewPrivate::SetIndex;
+        int index = currentIndex()+1;
+        setCurrentIndex((index >= 0 && index < count) ? index : 0);
+    }
+}
+
+void QSGListView::decrementCurrentIndex()
+{
+    Q_D(QSGListView);
+    int count = d->model ? d->model->count() : 0;
+    if (count && (currentIndex() > 0 || d->wrap)) {
+        d->moveReason = QSGListViewPrivate::SetIndex;
+        int index = currentIndex()-1;
+        setCurrentIndex((index >= 0 && index < count) ? index : count-1);
+    }
+}
+
+void QSGListViewPrivate::positionViewAtIndex(int index, int mode)
+{
+    Q_Q(QSGListView);
+    if (!isValid())
+        return;
+    if (mode < QSGListView::Beginning || mode > QSGListView::Contain)
+        return;
+    int idx = qMax(qMin(index, model->count()-1), 0);
+
+    if (layoutScheduled)
+        layout();
+    qreal pos = isRightToLeft() ? -position() - size() : position();
+    FxListItemSG *item = visibleItem(idx);
+    qreal maxExtent;
+    if (orient == QSGListView::Vertical)
+        maxExtent = -q->maxYExtent();
+    else
+        maxExtent = isRightToLeft() ? q->minXExtent()-size(): -q->maxXExtent();
+    if (!item) {
+        int itemPos = positionAt(idx);
+        // save the currently visible items in case any of them end up visible again
+        QList<FxListItemSG*> oldVisible = visibleItems;
+        visibleItems.clear();
+        visiblePos = itemPos;
+        visibleIndex = idx;
+        setPosition(qMin(qreal(itemPos), maxExtent));
+        // now release the reference to all the old visible items.
+        for (int i = 0; i < oldVisible.count(); ++i)
+            releaseItem(oldVisible.at(i));
+        item = visibleItem(idx);
+    }
+    if (item) {
+        const qreal itemPos = item->position();
+        switch (mode) {
+        case QSGListView::Beginning:
+            pos = itemPos;
+            if (index < 0 && header)
+                pos -= header->size();
+            break;
+        case QSGListView::Center:
+            pos = itemPos - (size() - item->size())/2;
+            break;
+        case QSGListView::End:
+            pos = itemPos - size() + item->size();
+            if (index >= model->count() && footer)
+                pos += footer->size();
+            break;
+        case QSGListView::Visible:
+            if (itemPos > pos + size())
+                pos = itemPos - size() + item->size();
+            else if (item->endPosition() < pos)
+                pos = itemPos;
+            break;
+        case QSGListView::Contain:
+            if (item->endPosition() > pos + size())
+                pos = itemPos - size() + item->size();
+            if (itemPos < pos)
+                pos = itemPos;
+        }
+        pos = qMin(pos, maxExtent);
+        qreal minExtent;
+        if (orient == QSGListView::Vertical) {
+            minExtent = -q->minYExtent();
+        } else {
+            minExtent = isRightToLeft() ? q->maxXExtent()-size(): -q->minXExtent();
+        }
+        pos = qMax(pos, minExtent);
+        moveReason = QSGListViewPrivate::Other;
+        q->cancelFlick();
+        setPosition(pos);
+        if (highlight) {
+            if (autoHighlight) {
+                highlight->setPosition(currentItem->itemPosition());
+                highlight->setSize(currentItem->itemSize());
+            }
+            updateHighlight();
+        }
+    }
+    fixupPosition();
+}
+
+void QSGListView::positionViewAtIndex(int index, int mode)
+{
+    Q_D(QSGListView);
+    if (!d->isValid() || index < 0 || index >= d->model->count())
+        return;
+    d->positionViewAtIndex(index, mode);
+}
+
+void QSGListView::positionViewAtBeginning()
+{
+    Q_D(QSGListView);
+    if (!d->isValid())
+        return;
+    d->positionViewAtIndex(-1, Beginning);
+}
+
+void QSGListView::positionViewAtEnd()
+{
+    Q_D(QSGListView);
+    if (!d->isValid())
+        return;
+    d->positionViewAtIndex(d->model->count(), End);
+}
+
+int QSGListView::indexAt(qreal x, qreal y) const
+{
+    Q_D(const QSGListView);
+    for (int i = 0; i < d->visibleItems.count(); ++i) {
+        const FxListItemSG *listItem = d->visibleItems.at(i);
+        if(listItem->contains(x, y))
+            return listItem->index;
+    }
+
+    return -1;
+}
+
+void QSGListView::componentComplete()
+{
+    Q_D(QSGListView);
+    QSGFlickable::componentComplete();
+    updateSections();
+    d->updateHeader();
+    d->updateFooter();
+    if (d->isValid()) {
+        refill();
+        d->moveReason = QSGListViewPrivate::SetIndex;
+        if (d->currentIndex < 0 && !d->currentIndexCleared)
+            d->updateCurrent(0);
+        else
+            d->updateCurrent(d->currentIndex);
+        if (d->highlight && d->currentItem) {
+            if (d->autoHighlight)
+                d->highlight->setPosition(d->currentItem->position());
+            d->updateTrackedItem();
+        }
+        d->moveReason = QSGListViewPrivate::Other;
+        d->fixupPosition();
+    }
+}
+
+void QSGListView::updateSections()
+{
+    Q_D(QSGListView);
+    if (isComponentComplete() && d->model) {
+        QList<QByteArray> roles;
+        if (d->sectionCriteria && !d->sectionCriteria->property().isEmpty())
+            roles << d->sectionCriteria->property().toUtf8();
+        d->model->setWatchedRoles(roles);
+        d->updateSections();
+        if (d->itemCount)
+            d->layout();
+    }
+}
+
+void QSGListView::refill()
+{
+    Q_D(QSGListView);
+    if (d->isRightToLeft())
+        d->refill(-d->position()-d->size()+1, -d->position());
+    else
+        d->refill(d->position(), d->position()+d->size()-1);
+}
+
+void QSGListView::trackedPositionChanged()
+{
+    Q_D(QSGListView);
+    if (!d->trackedItem || !d->currentItem)
+        return;
+    if (d->moveReason == QSGListViewPrivate::SetIndex) {
+        qreal trackedPos = qCeil(d->trackedItem->position());
+        qreal trackedSize = d->trackedItem->size();
+        if (d->trackedItem != d->currentItem) {
+            trackedPos -= d->currentItem->sectionSize();
+            trackedSize += d->currentItem->sectionSize();
+        }
+        qreal viewPos;
+        qreal highlightStart;
+        qreal highlightEnd;
+        if (d->isRightToLeft()) {
+            viewPos = -d->position()-d->size();
+            highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
+        } else {
+            viewPos = d->position();
+            highlightStart = d->highlightRangeStart;
+            highlightEnd = d->highlightRangeEnd;
+        }
+        qreal pos = viewPos;
+        if (d->haveHighlightRange) {
+            if (d->highlightRange == StrictlyEnforceRange) {
+                if (trackedPos > pos + highlightEnd - d->trackedItem->size())
+                    pos = trackedPos - highlightEnd + d->trackedItem->size();
+                if (trackedPos < pos + highlightStart)
+                    pos = trackedPos - highlightStart;
+            } else {
+                if (trackedPos < d->startPosition() + highlightStart) {
+                    pos = d->startPosition();
+                } else if (d->trackedItem->endPosition() > d->endPosition() - d->size() + highlightEnd) {
+                    pos = d->endPosition() - d->size() + 1;
+                    if (pos < d->startPosition())
+                        pos = d->startPosition();
+                } else {
+                    if (trackedPos < viewPos + highlightStart) {
+                        pos = trackedPos - highlightStart;
+                    } else if (trackedPos > viewPos + highlightEnd - trackedSize) {
+                        pos = trackedPos - highlightEnd + trackedSize;
+                    }
+                }
+            }
+        } else {
+            if (trackedPos < viewPos && d->currentItem->position() < viewPos) {
+                pos = d->currentItem->position() < trackedPos ? trackedPos : d->currentItem->position();
+            } else if (d->trackedItem->endPosition() >= viewPos + d->size()
+                        && d->currentItem->endPosition() >= viewPos + d->size()) {
+                if (d->trackedItem->endPosition() <= d->currentItem->endPosition()) {
+                    pos = d->trackedItem->endPosition() - d->size() + 1;
+                     if (trackedSize > d->size())
+                        pos = trackedPos;
+                } else {
+                    pos = d->currentItem->endPosition() - d->size() + 1;
+                    if (d->currentItem->size() > d->size())
+                        pos = d->currentItem->position();
+                }
+            }
+        }
+        if (viewPos != pos) {
+            cancelFlick();
+            d->calcVelocity = true;
+            d->setPosition(pos);
+            d->calcVelocity = false;
+        }
+    }
+}
+
+void QSGListView::itemsInserted(int modelIndex, int count)
+{
+    Q_D(QSGListView);
+    if (!isComponentComplete())
+        return;
+    d->updateUnrequestedIndexes();
+    d->moveReason = QSGListViewPrivate::Other;
+
+    qreal tempPos = d->isRightToLeft() ? -d->position()-d->size() : d->position();
+    int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
+    if (index < 0) {
+        int i = d->visibleItems.count() - 1;
+        while (i > 0 && d->visibleItems.at(i)->index == -1)
+            --i;
+        if (i == 0 && d->visibleItems.first()->index == -1) {
+            // there are no visible items except items marked for removal
+            index = d->visibleItems.count();
+        } else if (d->visibleItems.at(i)->index + 1 == modelIndex
+            && d->visibleItems.at(i)->endPosition() < d->buffer+tempPos+d->size()-1) {
+            // Special case of appending an item to the model.
+            index = d->visibleItems.count();
+        } else {
+            if (modelIndex < d->visibleIndex) {
+                // Insert before visible items
+                d->visibleIndex += count;
+                for (int i = 0; i < d->visibleItems.count(); ++i) {
+                    FxListItemSG *listItem = d->visibleItems.at(i);
+                    if (listItem->index != -1 && listItem->index >= modelIndex)
+                        listItem->index += count;
+                }
+            }
+            if (d->currentIndex >= modelIndex) {
+                // adjust current item index
+                d->currentIndex += count;
+                if (d->currentItem)
+                    d->currentItem->index = d->currentIndex;
+                emit currentIndexChanged();
+            }
+            d->scheduleLayout();
+            d->itemCount += count;
+            emit countChanged();
+            return;
+        }
+    }
+
+    // index can be the next item past the end of the visible items list (i.e. appended)
+    int pos = 0;
+    if (d->visibleItems.count()) {
+        pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
+                                                : d->visibleItems.last()->endPosition()+d->spacing+1;
+    } else if (d->itemCount == 0 && d->header) {
+        pos = d->header->size();
+    }
+
+    int initialPos = pos;
+    int diff = 0;
+    QList<FxListItemSG*> added;
+    bool addedVisible = false;
+    FxListItemSG *firstVisible = d->firstVisibleItem();
+    if (firstVisible && pos < firstVisible->position()) {
+        // Insert items before the visible item.
+        int insertionIdx = index;
+        int i = 0;
+        int from = tempPos - d->buffer;
+        for (i = count-1; i >= 0 && pos > from; --i) {
+            if (!addedVisible) {
+                d->scheduleLayout();
+                addedVisible = true;
+            }
+            FxListItemSG *item = d->createItem(modelIndex + i);
+            d->visibleItems.insert(insertionIdx, item);
+            pos -= item->size() + d->spacing;
+            item->setPosition(pos);
+            index++;
+        }
+        if (i >= 0) {
+            // If we didn't insert all our new items - anything
+            // before the current index is not visible - remove it.
+            while (insertionIdx--) {
+                FxListItemSG *item = d->visibleItems.takeFirst();
+                if (item->index != -1)
+                    d->visibleIndex++;
+                d->releaseItem(item);
+            }
+        } else {
+            // adjust pos of items before inserted items.
+            for (int i = insertionIdx-1; i >= 0; i--) {
+                FxListItemSG *listItem = d->visibleItems.at(i);
+                listItem->setPosition(listItem->position() - (initialPos - pos));
+            }
+        }
+    } else {
+        int i = 0;
+        int to = d->buffer+tempPos+d->size()-1;
+        for (i = 0; i < count && pos <= to; ++i) {
+            if (!addedVisible) {
+                d->scheduleLayout();
+                addedVisible = true;
+            }
+            FxListItemSG *item = d->createItem(modelIndex + i);
+            d->visibleItems.insert(index, item);
+            item->setPosition(pos);
+            added.append(item);
+            pos += item->size() + d->spacing;
+            ++index;
+        }
+        if (i != count) {
+            // We didn't insert all our new items, which means anything
+            // beyond the current index is not visible - remove it.
+            while (d->visibleItems.count() > index)
+                d->releaseItem(d->visibleItems.takeLast());
+        }
+        diff = pos - initialPos;
+    }
+    if (d->itemCount && d->currentIndex >= modelIndex) {
+        // adjust current item index
+        d->currentIndex += count;
+        if (d->currentItem) {
+            d->currentItem->index = d->currentIndex;
+            d->currentItem->setPosition(d->currentItem->position() + diff);
+        }
+        emit currentIndexChanged();
+    } else if (!d->itemCount && (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared))) {
+        d->updateCurrent(0);
+    }
+    // Update the indexes of the following visible items.
+    for (; index < d->visibleItems.count(); ++index) {
+        FxListItemSG *listItem = d->visibleItems.at(index);
+        if (d->currentItem && listItem->item != d->currentItem->item)
+            listItem->setPosition(listItem->position() + diff);
+        if (listItem->index != -1)
+            listItem->index += count;
+    }
+    // everything is in order now - emit add() signal
+    for (int j = 0; j < added.count(); ++j)
+        added.at(j)->attached->emitAdd();
+
+    d->updateSections();
+    d->itemCount += count;
+    emit countChanged();
+}
+
+void QSGListView::itemsRemoved(int modelIndex, int count)
+{
+    Q_D(QSGListView);
+    if (!isComponentComplete())
+        return;
+    d->moveReason = QSGListViewPrivate::Other;
+    d->updateUnrequestedIndexes();
+    d->itemCount -= count;
+
+    FxListItemSG *firstVisible = d->firstVisibleItem();
+    int preRemovedSize = 0;
+    bool removedVisible = false;
+    // Remove the items from the visible list, skipping anything already marked for removal
+    QList<FxListItemSG*>::Iterator it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxListItemSG *item = *it;
+        if (item->index == -1 || item->index < modelIndex) {
+            // already removed, or before removed items
+            ++it;
+        } else if (item->index >= modelIndex + count) {
+            // after removed items
+            item->index -= count;
+            ++it;
+        } else {
+            // removed item
+            if (!removedVisible) {
+                d->scheduleLayout();
+                removedVisible = true;
+            }
+            item->attached->emitRemove();
+            if (item->attached->delayRemove()) {
+                item->index = -1;
+                connect(item->attached, SIGNAL(delayRemoveChanged()), this, SLOT(destroyRemoved()), Qt::QueuedConnection);
+                ++it;
+            } else {
+                if (item == firstVisible)
+                    firstVisible = 0;
+                if (firstVisible && item->position() < firstVisible->position())
+                    preRemovedSize += item->size();
+                it = d->visibleItems.erase(it);
+                d->releaseItem(item);
+            }
+        }
+    }
+
+    if (firstVisible && d->visibleItems.first() != firstVisible)
+        d->visibleItems.first()->setPosition(d->visibleItems.first()->position() + preRemovedSize);
+
+    // fix current
+    if (d->currentIndex >= modelIndex + count) {
+        d->currentIndex -= count;
+        if (d->currentItem)
+            d->currentItem->index -= count;
+        emit currentIndexChanged();
+    } else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
+        // current item has been removed.
+        if (d->currentItem) {
+            d->currentItem->attached->setIsCurrentItem(false);
+            d->releaseItem(d->currentItem);
+            d->currentItem = 0;
+        }
+        d->currentIndex = -1;
+        if (d->itemCount)
+            d->updateCurrent(qMin(modelIndex, d->itemCount-1));
+        else
+            emit currentIndexChanged();
+    }
+
+    // update visibleIndex
+    bool haveVisibleIndex = false;
+    for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
+        if ((*it)->index != -1) {
+            d->visibleIndex = (*it)->index;
+            haveVisibleIndex = true;
+            break;
+        }
+    }
+
+    if (removedVisible && !haveVisibleIndex) {
+        d->timeline.clear();
+        if (d->itemCount == 0) {
+            d->visibleIndex = 0;
+            d->visiblePos = d->header ? d->header->size() : 0;
+            d->setPosition(0);
+            d->updateHeader();
+            d->updateFooter();
+        } else {
+            if (modelIndex < d->visibleIndex)
+                d->visibleIndex = modelIndex+1;
+            d->visibleIndex = qMax(qMin(d->visibleIndex, d->itemCount-1), 0);
+        }
+    }
+
+    d->updateSections();
+    emit countChanged();
+}
+
+void QSGListView::destroyRemoved()
+{
+    Q_D(QSGListView);
+    for (QList<FxListItemSG*>::Iterator it = d->visibleItems.begin();
+            it != d->visibleItems.end();) {
+        FxListItemSG *listItem = *it;
+        if (listItem->index == -1 && listItem->attached->delayRemove() == false) {
+            d->releaseItem(listItem);
+            it = d->visibleItems.erase(it);
+        } else {
+            ++it;
+        }
+    }
+
+    // Correct the positioning of the items
+    d->updateSections();
+    d->layout();
+}
+
+void QSGListView::itemsMoved(int from, int to, int count)
+{
+    Q_D(QSGListView);
+    if (!isComponentComplete())
+        return;
+    d->updateUnrequestedIndexes();
+
+    if (d->visibleItems.isEmpty()) {
+        refill();
+        return;
+    }
+
+    d->moveReason = QSGListViewPrivate::Other;
+    FxListItemSG *firstVisible = d->firstVisibleItem();
+    qreal firstItemPos = firstVisible->position();
+    QHash<int,FxListItemSG*> moved;
+    int moveBy = 0;
+
+    QList<FxListItemSG*>::Iterator it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxListItemSG *item = *it;
+        if (item->index >= from && item->index < from + count) {
+            // take the items that are moving
+            item->index += (to-from);
+            moved.insert(item->index, item);
+            if (item->position() < firstItemPos)
+                moveBy += item->size();
+            it = d->visibleItems.erase(it);
+        } else {
+            // move everything after the moved items.
+            if (item->index > from && item->index != -1)
+                item->index -= count;
+            ++it;
+        }
+    }
+
+    int remaining = count;
+    int endIndex = d->visibleIndex;
+    it = d->visibleItems.begin();
+    while (it != d->visibleItems.end()) {
+        FxListItemSG *item = *it;
+        if (remaining && item->index >= to && item->index < to + count) {
+            // place items in the target position, reusing any existing items
+            FxListItemSG *movedItem = moved.take(item->index);
+            if (!movedItem)
+                movedItem = d->createItem(item->index);
+            if (item->index <= firstVisible->index)
+                moveBy -= movedItem->size();
+            it = d->visibleItems.insert(it, movedItem);
+            ++it;
+            --remaining;
+        } else {
+            if (item->index != -1) {
+                if (item->index >= to) {
+                    // update everything after the moved items.
+                    item->index += count;
+                }
+                endIndex = item->index;
+            }
+            ++it;
+        }
+    }
+
+    // If we have moved items to the end of the visible items
+    // then add any existing moved items that we have
+    while (FxListItemSG *item = moved.take(endIndex+1)) {
+        d->visibleItems.append(item);
+        ++endIndex;
+    }
+
+    // update visibleIndex
+    for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
+        if ((*it)->index != -1) {
+            d->visibleIndex = (*it)->index;
+            break;
+        }
+    }
+
+    // Fix current index
+    if (d->currentIndex >= 0 && d->currentItem) {
+        int oldCurrent = d->currentIndex;
+        d->currentIndex = d->model->indexOf(d->currentItem->item, this);
+        if (oldCurrent != d->currentIndex) {
+            d->currentItem->index = d->currentIndex;
+            emit currentIndexChanged();
+        }
+    }
+
+    // Whatever moved items remain are no longer visible items.
+    while (moved.count()) {
+        int idx = moved.begin().key();
+        FxListItemSG *item = moved.take(idx);
+        if (d->currentItem && item->item == d->currentItem->item)
+            item->setPosition(d->positionAt(idx));
+        d->releaseItem(item);
+    }
+
+    // Ensure we don't cause an ugly list scroll.
+    d->visibleItems.first()->setPosition(d->visibleItems.first()->position() + moveBy);
+
+    d->updateSections();
+    d->layout();
+}
+
+void QSGListView::itemsChanged(int, int)
+{
+    Q_D(QSGListView);
+    d->updateSections();
+    d->layout();
+}
+
+void QSGListView::modelReset()
+{
+    Q_D(QSGListView);
+    d->moveReason = QSGListViewPrivate::SetIndex;
+    d->regenerate();
+    if (d->highlight && d->currentItem) {
+        if (d->autoHighlight)
+            d->highlight->setPosition(d->currentItem->position());
+        d->updateTrackedItem();
+    }
+    d->moveReason = QSGListViewPrivate::Other;
+    emit countChanged();
+}
+
+void QSGListView::createdItem(int index, QSGItem *item)
+{
+    Q_D(QSGListView);
+    if (d->requestedIndex != index) {
+        item->setParentItem(contentItem());
+        d->unrequestedItems.insert(item, index);
+        if (d->orient == QSGListView::Vertical) {
+            item->setY(d->positionAt(index));
+        } else {
+            if (d->isRightToLeft())
+                item->setX(-d->positionAt(index)-item->width());
+            else
+                item->setX(d->positionAt(index));
+        }
+    }
+}
+
+void QSGListView::destroyingItem(QSGItem *item)
+{
+    Q_D(QSGListView);
+    d->unrequestedItems.remove(item);
+}
+
+void QSGListView::animStopped()
+{
+    Q_D(QSGListView);
+    d->bufferMode = QSGListViewPrivate::NoBuffer;
+    if (d->haveHighlightRange && d->highlightRange == QSGListView::StrictlyEnforceRange)
+        d->updateHighlight();
+}
+
+QSGListViewAttached *QSGListView::qmlAttachedProperties(QObject *obj)
+{
+    return new QSGListViewAttached(obj);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsglistview_p.h b/src/declarative/items/qsglistview_p.h
new file mode 100644
index 0000000000..2e3df2020f
--- /dev/null
+++ b/src/declarative/items/qsglistview_p.h
@@ -0,0 +1,374 @@
+// Commit: 95814418f9d6adeba365c795462e8afb00138211
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGLISTVIEW_P_H
+#define QSGLISTVIEW_P_H
+
+#include "qsgflickable_p.h"
+
+#include <private/qdeclarativeguard_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QSGViewSection : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged)
+    Q_PROPERTY(SectionCriteria criteria READ criteria WRITE setCriteria NOTIFY criteriaChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_ENUMS(SectionCriteria)
+public:
+    QSGViewSection(QObject *parent=0) : QObject(parent), m_criteria(FullString), m_delegate(0) {}
+
+    QString property() const { return m_property; }
+    void setProperty(const QString &);
+
+    enum SectionCriteria { FullString, FirstCharacter };
+    SectionCriteria criteria() const { return m_criteria; }
+    void setCriteria(SectionCriteria);
+
+    QDeclarativeComponent *delegate() const { return m_delegate; }
+    void setDelegate(QDeclarativeComponent *delegate);
+
+    QString sectionString(const QString &value);
+
+Q_SIGNALS:
+    void propertyChanged();
+    void criteriaChanged();
+    void delegateChanged();
+
+private:
+    QString m_property;
+    SectionCriteria m_criteria;
+    QDeclarativeComponent *m_delegate;
+};
+
+
+class QSGVisualModel;
+class QSGListViewAttached;
+class QSGListViewPrivate;
+class Q_AUTOTEST_EXPORT QSGListView : public QSGFlickable
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGListView)
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
+    Q_PROPERTY(QSGItem *currentItem READ currentItem NOTIFY currentIndexChanged)
+    Q_PROPERTY(int count READ count NOTIFY countChanged)
+
+    Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
+    Q_PROPERTY(QSGItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
+    Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem NOTIFY highlightFollowsCurrentItemChanged)
+    Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged)
+    Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
+    Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged)
+    Q_PROPERTY(int highlightResizeDuration READ highlightResizeDuration WRITE setHighlightResizeDuration NOTIFY highlightResizeDurationChanged)
+
+    Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged RESET resetPreferredHighlightBegin)
+    Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged RESET resetPreferredHighlightEnd)
+    Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
+
+    Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
+    Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)
+    Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
+    Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
+    Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged)
+    Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
+    Q_PROPERTY(QSGViewSection *section READ sectionCriteria CONSTANT)
+    Q_PROPERTY(QString currentSection READ currentSection NOTIFY currentSectionChanged)
+
+    Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged)
+
+    Q_PROPERTY(QDeclarativeComponent *header READ header WRITE setHeader NOTIFY headerChanged)
+    Q_PROPERTY(QDeclarativeComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
+
+    Q_ENUMS(HighlightRangeMode)
+    Q_ENUMS(Orientation)
+    Q_ENUMS(SnapMode)
+    Q_ENUMS(PositionMode)
+    Q_CLASSINFO("DefaultProperty", "data")
+
+public:
+    QSGListView(QSGItem *parent=0);
+    ~QSGListView();
+
+    QVariant model() const;
+    void setModel(const QVariant &);
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    int currentIndex() const;
+    void setCurrentIndex(int idx);
+
+    QSGItem *currentItem();
+    QSGItem *highlightItem();
+    int count() const;
+
+    QDeclarativeComponent *highlight() const;
+    void setHighlight(QDeclarativeComponent *highlight);
+
+    bool highlightFollowsCurrentItem() const;
+    void setHighlightFollowsCurrentItem(bool);
+
+    enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
+    HighlightRangeMode highlightRangeMode() const;
+    void setHighlightRangeMode(HighlightRangeMode mode);
+
+    qreal preferredHighlightBegin() const;
+    void setPreferredHighlightBegin(qreal);
+    void resetPreferredHighlightBegin();
+
+    qreal preferredHighlightEnd() const;
+    void setPreferredHighlightEnd(qreal);
+    void resetPreferredHighlightEnd();
+
+    qreal spacing() const;
+    void setSpacing(qreal spacing);
+
+    enum Orientation { Horizontal = Qt::Horizontal, Vertical = Qt::Vertical };
+    Orientation orientation() const;
+    void setOrientation(Orientation);
+
+    Qt::LayoutDirection layoutDirection() const;
+    void setLayoutDirection(Qt::LayoutDirection);
+    Qt::LayoutDirection effectiveLayoutDirection() const;
+
+    bool isWrapEnabled() const;
+    void setWrapEnabled(bool);
+
+    int cacheBuffer() const;
+    void setCacheBuffer(int);
+
+    QSGViewSection *sectionCriteria();
+    QString currentSection() const;
+
+    qreal highlightMoveSpeed() const;
+    void setHighlightMoveSpeed(qreal);
+
+    int highlightMoveDuration() const;
+    void setHighlightMoveDuration(int);
+
+    qreal highlightResizeSpeed() const;
+    void setHighlightResizeSpeed(qreal);
+
+    int highlightResizeDuration() const;
+    void setHighlightResizeDuration(int);
+
+    enum SnapMode { NoSnap, SnapToItem, SnapOneItem };
+    SnapMode snapMode() const;
+    void setSnapMode(SnapMode mode);
+
+    QDeclarativeComponent *footer() const;
+    void setFooter(QDeclarativeComponent *);
+
+    QDeclarativeComponent *header() const;
+    void setHeader(QDeclarativeComponent *);
+
+    virtual void setContentX(qreal pos);
+    virtual void setContentY(qreal pos);
+
+    static QSGListViewAttached *qmlAttachedProperties(QObject *);
+
+    enum PositionMode { Beginning, Center, End, Visible, Contain };
+
+    Q_INVOKABLE void positionViewAtIndex(int index, int mode);
+    Q_INVOKABLE int indexAt(qreal x, qreal y) const;
+    Q_INVOKABLE void positionViewAtBeginning();
+    Q_INVOKABLE void positionViewAtEnd();
+
+public Q_SLOTS:
+    void incrementCurrentIndex();
+    void decrementCurrentIndex();
+
+Q_SIGNALS:
+    void countChanged();
+    void spacingChanged();
+    void orientationChanged();
+    void layoutDirectionChanged();
+    void effectiveLayoutDirectionChanged();
+    void currentIndexChanged();
+    void currentSectionChanged();
+    void highlightMoveSpeedChanged();
+    void highlightMoveDurationChanged();
+    void highlightResizeSpeedChanged();
+    void highlightResizeDurationChanged();
+    void highlightChanged();
+    void highlightItemChanged();
+    void modelChanged();
+    void delegateChanged();
+    void highlightFollowsCurrentItemChanged();
+    void preferredHighlightBeginChanged();
+    void preferredHighlightEndChanged();
+    void highlightRangeModeChanged();
+    void keyNavigationWrapsChanged();
+    void cacheBufferChanged();
+    void snapModeChanged();
+    void headerChanged();
+    void footerChanged();
+
+protected:
+    virtual void updatePolish();
+    virtual void viewportMoved();
+    virtual qreal minYExtent() const;
+    virtual qreal maxYExtent() const;
+    virtual qreal minXExtent() const;
+    virtual qreal maxXExtent() const;
+    virtual void keyPressEvent(QKeyEvent *);
+    virtual void geometryChanged(const QRectF &newGeometry,const QRectF &oldGeometry);
+    virtual void componentComplete();
+
+private Q_SLOTS:
+    void updateSections();
+    void refill();
+    void trackedPositionChanged();
+    void itemsInserted(int index, int count);
+    void itemsRemoved(int index, int count);
+    void itemsMoved(int from, int to, int count);
+    void itemsChanged(int index, int count);
+    void modelReset();
+    void destroyRemoved();
+    void createdItem(int index, QSGItem *item);
+    void destroyingItem(QSGItem *item);
+    void animStopped();
+};
+
+class QSGListViewAttached : public QObject
+{
+    Q_OBJECT
+public:
+    QSGListViewAttached(QObject *parent)
+        : QObject(parent), m_view(0), m_isCurrent(false), m_delayRemove(false) {}
+    ~QSGListViewAttached() {}
+
+    Q_PROPERTY(QSGListView *view READ view NOTIFY viewChanged)
+    QSGListView *view() { return m_view; }
+    void setView(QSGListView *view) {
+        if (view != m_view) {
+            m_view = view;
+            emit viewChanged();
+        }
+    }
+
+    Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
+    bool isCurrentItem() const { return m_isCurrent; }
+    void setIsCurrentItem(bool c) {
+        if (m_isCurrent != c) {
+            m_isCurrent = c;
+            emit currentItemChanged();
+        }
+    }
+
+    Q_PROPERTY(QString previousSection READ prevSection NOTIFY prevSectionChanged)
+    QString prevSection() const { return m_prevSection; }
+    void setPrevSection(const QString &sect) {
+        if (m_prevSection != sect) {
+            m_prevSection = sect;
+            emit prevSectionChanged();
+        }
+    }
+
+    Q_PROPERTY(QString nextSection READ nextSection NOTIFY nextSectionChanged)
+    QString nextSection() const { return m_nextSection; }
+    void setNextSection(const QString &sect) {
+        if (m_nextSection != sect) {
+            m_nextSection = sect;
+            emit nextSectionChanged();
+        }
+    }
+
+    Q_PROPERTY(QString section READ section NOTIFY sectionChanged)
+    QString section() const { return m_section; }
+    void setSection(const QString &sect) {
+        if (m_section != sect) {
+            m_section = sect;
+            emit sectionChanged();
+        }
+    }
+
+    Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
+    bool delayRemove() const { return m_delayRemove; }
+    void setDelayRemove(bool delay) {
+        if (m_delayRemove != delay) {
+            m_delayRemove = delay;
+            emit delayRemoveChanged();
+        }
+    }
+
+    void emitAdd() { emit add(); }
+    void emitRemove() { emit remove(); }
+
+Q_SIGNALS:
+    void currentItemChanged();
+    void sectionChanged();
+    void prevSectionChanged();
+    void nextSectionChanged();
+    void delayRemoveChanged();
+    void add();
+    void remove();
+    void viewChanged();
+
+public:
+    QDeclarativeGuard<QSGListView> m_view;
+    mutable QString m_section;
+    QString m_prevSection;
+    QString m_nextSection;
+    bool m_isCurrent : 1;
+    bool m_delayRemove : 1;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPEINFO(QSGListView, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(QSGListView)
+QML_DECLARE_TYPE(QSGViewSection)
+
+QT_END_HEADER
+
+#endif // QSGLISTVIEW_P_H
diff --git a/src/declarative/items/qsgloader.cpp b/src/declarative/items/qsgloader.cpp
new file mode 100644
index 0000000000..6717098506
--- /dev/null
+++ b/src/declarative/items/qsgloader.cpp
@@ -0,0 +1,340 @@
+// Commit: 501180c6fbed0857126da2bb0ff1f17ee35472c6
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgloader_p_p.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+
+#include <private/qdeclarativeengine_p.h>
+#include <private/qdeclarativeglobal_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGLoaderPrivate::QSGLoaderPrivate()
+    : item(0), component(0), ownComponent(false), updatingSize(false),
+      itemWidthValid(false), itemHeightValid(false)
+{
+}
+
+QSGLoaderPrivate::~QSGLoaderPrivate()
+{
+}
+
+void QSGLoaderPrivate::itemGeometryChanged(QSGItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    if (resizeItem == item) {
+        if (!updatingSize && newGeometry.width() != oldGeometry.width())
+            itemWidthValid = true;
+        if (!updatingSize && newGeometry.height() != oldGeometry.height())
+            itemHeightValid = true;
+        _q_updateSize(false);
+    }
+    QSGItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
+}
+
+void QSGLoaderPrivate::clear()
+{
+    if (ownComponent) {
+        component->deleteLater();
+        component = 0;
+        ownComponent = false;
+    }
+    source = QUrl();
+
+    if (item) {
+        QSGItemPrivate *p = QSGItemPrivate::get(item);
+        p->removeItemChangeListener(this, QSGItemPrivate::Geometry);
+
+        // We can't delete immediately because our item may have triggered
+        // the Loader to load a different item.
+        item->setParentItem(0);
+        item->setVisible(false);
+        item->deleteLater();
+        item = 0;
+    }
+}
+
+void QSGLoaderPrivate::initResize()
+{
+    QSGItemPrivate *p = QSGItemPrivate::get(item);
+    p->addItemChangeListener(this, QSGItemPrivate::Geometry);
+    // We may override the item's size, so we need to remember
+    // whether the item provided its own valid size.
+    itemWidthValid = p->widthValid;
+    itemHeightValid = p->heightValid;
+    _q_updateSize();
+}
+
+QSGLoader::QSGLoader(QSGItem *parent)
+  : QSGImplicitSizeItem(*(new QSGLoaderPrivate), parent)
+{
+    setFlag(ItemIsFocusScope);
+}
+
+QSGLoader::~QSGLoader()
+{
+    Q_D(QSGLoader);
+    if (d->item) {
+        QSGItemPrivate *p = QSGItemPrivate::get(d->item);
+        p->removeItemChangeListener(d, QSGItemPrivate::Geometry);
+    }
+}
+
+QUrl QSGLoader::source() const
+{
+    Q_D(const QSGLoader);
+    return d->source;
+}
+
+void QSGLoader::setSource(const QUrl &url)
+{
+    Q_D(QSGLoader);
+    if (d->source == url)
+        return;
+
+    d->clear();
+
+    d->source = url;
+    if (d->source.isEmpty()) {
+        emit sourceChanged();
+        emit statusChanged();
+        emit progressChanged();
+        emit itemChanged();
+        return;
+    }
+
+    d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
+    d->ownComponent = true;
+
+    if (isComponentComplete())
+        d->load();
+}
+
+QDeclarativeComponent *QSGLoader::sourceComponent() const
+{
+    Q_D(const QSGLoader);
+    return d->component;
+}
+
+void QSGLoader::setSourceComponent(QDeclarativeComponent *comp)
+{
+    Q_D(QSGLoader);
+    if (comp == d->component)
+        return;
+
+    d->clear();
+
+    d->component = comp;
+    d->ownComponent = false;
+    if (!d->component) {
+        emit sourceChanged();
+        emit statusChanged();
+        emit progressChanged();
+        emit itemChanged();
+        return;
+    }
+
+    if (isComponentComplete())
+        d->load();
+}
+
+void QSGLoader::resetSourceComponent()
+{
+    setSourceComponent(0);
+}
+
+void QSGLoaderPrivate::load()
+{
+    Q_Q(QSGLoader);
+
+    if (!q->isComponentComplete() || !component)
+        return;
+
+    if (!component->isLoading()) {
+        _q_sourceLoaded();
+    } else {
+        QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)),
+                q, SLOT(_q_sourceLoaded()));
+        QObject::connect(component, SIGNAL(progressChanged(qreal)),
+                q, SIGNAL(progressChanged()));
+        emit q->statusChanged();
+        emit q->progressChanged();
+        emit q->sourceChanged();
+        emit q->itemChanged();
+    }
+}
+
+void QSGLoaderPrivate::_q_sourceLoaded()
+{
+    Q_Q(QSGLoader);
+
+    if (component) {
+        if (!component->errors().isEmpty()) {
+            QDeclarativeEnginePrivate::warning(qmlEngine(q), component->errors());
+            emit q->sourceChanged();
+            emit q->statusChanged();
+            emit q->progressChanged();
+            return;
+        }
+
+        QDeclarativeContext *creationContext = component->creationContext();
+        if (!creationContext) creationContext = qmlContext(q);
+        QDeclarativeContext *ctxt = new QDeclarativeContext(creationContext);
+        ctxt->setContextObject(q);
+
+        QDeclarativeGuard<QDeclarativeComponent> c = component;
+        QObject *obj = component->beginCreate(ctxt);
+        if (component != c) {
+            // component->create could trigger a change in source that causes
+            // component to be set to something else. In that case we just
+            // need to cleanup.
+            if (c)
+                c->completeCreate();
+            delete obj;
+            delete ctxt;
+            return;
+        }
+        if (obj) {
+            item = qobject_cast<QSGItem *>(obj);
+            if (item) {
+                QDeclarative_setParent_noEvent(ctxt, obj);
+                QDeclarative_setParent_noEvent(item, q);
+                item->setParentItem(q);
+//                item->setFocus(true);
+                initResize();
+            } else {
+                qmlInfo(q) << QSGLoader::tr("Loader does not support loading non-visual elements.");
+                delete obj;
+                delete ctxt;
+            }
+        } else {
+            if (!component->errors().isEmpty())
+                QDeclarativeEnginePrivate::warning(qmlEngine(q), component->errors());
+            delete obj;
+            delete ctxt;
+            source = QUrl();
+        }
+        component->completeCreate();
+        emit q->sourceChanged();
+        emit q->statusChanged();
+        emit q->progressChanged();
+        emit q->itemChanged();
+        emit q->loaded();
+    }
+}
+
+QSGLoader::Status QSGLoader::status() const
+{
+    Q_D(const QSGLoader);
+
+    if (d->component)
+        return static_cast<QSGLoader::Status>(d->component->status());
+
+    if (d->item)
+        return Ready;
+
+    return d->source.isEmpty() ? Null : Error;
+}
+
+void QSGLoader::componentComplete()
+{
+    Q_D(QSGLoader);
+    QSGItem::componentComplete();
+    d->load();
+}
+
+qreal QSGLoader::progress() const
+{
+    Q_D(const QSGLoader);
+
+    if (d->item)
+        return 1.0;
+
+    if (d->component)
+        return d->component->progress();
+
+    return 0.0;
+}
+
+void QSGLoaderPrivate::_q_updateSize(bool loaderGeometryChanged)
+{
+    Q_Q(QSGLoader);
+    if (!item || updatingSize)
+        return;
+
+    updatingSize = true;
+
+    if (!itemWidthValid)
+        q->setImplicitWidth(item->implicitWidth());
+    else
+        q->setImplicitWidth(item->width());
+    if (loaderGeometryChanged && q->widthValid())
+        item->setWidth(q->width());
+
+    if (!itemHeightValid)
+        q->setImplicitHeight(item->implicitHeight());
+    else
+        q->setImplicitHeight(item->height());
+    if (loaderGeometryChanged && q->heightValid())
+        item->setHeight(q->height());
+
+    updatingSize = false;
+}
+
+QSGItem *QSGLoader::item() const
+{
+    Q_D(const QSGLoader);
+    return d->item;
+}
+
+void QSGLoader::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_D(QSGLoader);
+    if (newGeometry != oldGeometry) {
+        d->_q_updateSize();
+    }
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+#include <moc_qsgloader_p.cpp>
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgloader_p.h b/src/declarative/items/qsgloader_p.h
new file mode 100644
index 0000000000..689971792c
--- /dev/null
+++ b/src/declarative/items/qsgloader_p.h
@@ -0,0 +1,107 @@
+// Commit: 6f78a6080b84cc3ef96b73a4ff58d1b5a72f08f4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGLOADER_P_H
+#define QSGLOADER_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGLoaderPrivate;
+class Q_AUTOTEST_EXPORT QSGLoader : public QSGImplicitSizeItem
+{
+    Q_OBJECT
+    Q_ENUMS(Status)
+
+    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+    Q_PROPERTY(QDeclarativeComponent *sourceComponent READ sourceComponent WRITE setSourceComponent RESET resetSourceComponent NOTIFY sourceChanged)
+    Q_PROPERTY(QSGItem *item READ item NOTIFY itemChanged)
+    Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+    Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
+
+public:
+    QSGLoader(QSGItem *parent=0);
+    virtual ~QSGLoader();
+
+    QUrl source() const;
+    void setSource(const QUrl &);
+
+    QDeclarativeComponent *sourceComponent() const;
+    void setSourceComponent(QDeclarativeComponent *);
+    void resetSourceComponent();
+
+    enum Status { Null, Ready, Loading, Error };
+    Status status() const;
+    qreal progress() const;
+
+    QSGItem *item() const;
+
+Q_SIGNALS:
+    void itemChanged();
+    void sourceChanged();
+    void statusChanged();
+    void progressChanged();
+    void loaded();
+
+protected:
+    void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+    void componentComplete();
+
+private:
+    Q_DISABLE_COPY(QSGLoader)
+    Q_DECLARE_PRIVATE(QSGLoader)
+    Q_PRIVATE_SLOT(d_func(), void _q_sourceLoaded())
+    Q_PRIVATE_SLOT(d_func(), void _q_updateSize())
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGLoader)
+
+QT_END_HEADER
+
+#endif // QSGLOADER_P_H
diff --git a/src/declarative/items/qsgloader_p_p.h b/src/declarative/items/qsgloader_p_p.h
new file mode 100644
index 0000000000..63da789dce
--- /dev/null
+++ b/src/declarative/items/qsgloader_p_p.h
@@ -0,0 +1,91 @@
+// Commit: 5d2817cd668a705729df1727de49adf00713ac97
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGLOADER_P_P_H
+#define QSGLOADER_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgloader_p.h"
+#include "qsgimplicitsizeitem_p_p.h"
+#include "qsgitemchangelistener_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeContext;
+class QSGLoaderPrivate : public QSGImplicitSizeItemPrivate, public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGLoader)
+
+public:
+    QSGLoaderPrivate();
+    ~QSGLoaderPrivate();
+
+    void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
+    void clear();
+    void initResize();
+    void load();
+
+    QUrl source;
+    QSGItem *item;
+    QDeclarativeComponent *component;
+    bool ownComponent : 1;
+    bool updatingSize: 1;
+    bool itemWidthValid : 1;
+    bool itemHeightValid : 1;
+
+    void _q_sourceLoaded();
+    void _q_updateSize(bool loaderGeometryChanged = true);
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGLOADER_P_P_H
diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp
new file mode 100644
index 0000000000..1157a9a172
--- /dev/null
+++ b/src/declarative/items/qsgmousearea.cpp
@@ -0,0 +1,771 @@
+// Commit: f0f6deb9a5e8bd078047dd090a3857290c8b4ea4
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgmousearea_p.h"
+#include "qsgmousearea_p_p.h"
+#include "qsgcanvas.h"
+#include "qsgevents_p_p.h"
+
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qapplication.h>
+
+#include <float.h>
+
+QT_BEGIN_NAMESPACE
+static const int PressAndHoldDelay = 800;
+
+QSGDrag::QSGDrag(QObject *parent)
+: QObject(parent), _target(0), _axis(XandYAxis), _xmin(-FLT_MAX), _xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX),
+_active(false), _filterChildren(false)
+{
+}
+
+QSGDrag::~QSGDrag()
+{
+}
+
+QSGItem *QSGDrag::target() const
+{
+    return _target;
+}
+
+void QSGDrag::setTarget(QSGItem *t)
+{
+    if (_target == t)
+        return;
+    _target = t;
+    emit targetChanged();
+}
+
+void QSGDrag::resetTarget()
+{
+    if (!_target)
+        return;
+    _target = 0;
+    emit targetChanged();
+}
+
+QSGDrag::Axis QSGDrag::axis() const
+{
+    return _axis;
+}
+
+void QSGDrag::setAxis(QSGDrag::Axis a)
+{
+    if (_axis == a)
+        return;
+    _axis = a;
+    emit axisChanged();
+}
+
+qreal QSGDrag::xmin() const
+{
+    return _xmin;
+}
+
+void QSGDrag::setXmin(qreal m)
+{
+    if (_xmin == m)
+        return;
+    _xmin = m;
+    emit minimumXChanged();
+}
+
+qreal QSGDrag::xmax() const
+{
+    return _xmax;
+}
+
+void QSGDrag::setXmax(qreal m)
+{
+    if (_xmax == m)
+        return;
+    _xmax = m;
+    emit maximumXChanged();
+}
+
+qreal QSGDrag::ymin() const
+{
+    return _ymin;
+}
+
+void QSGDrag::setYmin(qreal m)
+{
+    if (_ymin == m)
+        return;
+    _ymin = m;
+    emit minimumYChanged();
+}
+
+qreal QSGDrag::ymax() const
+{
+    return _ymax;
+}
+
+void QSGDrag::setYmax(qreal m)
+{
+    if (_ymax == m)
+        return;
+    _ymax = m;
+    emit maximumYChanged();
+}
+
+bool QSGDrag::active() const
+{
+    return _active;
+}
+
+void QSGDrag::setActive(bool drag)
+{
+    if (_active == drag)
+        return;
+    _active = drag;
+    emit activeChanged();
+}
+
+bool QSGDrag::filterChildren() const
+{
+    return _filterChildren;
+}
+
+void QSGDrag::setFilterChildren(bool filter)
+{
+    if (_filterChildren == filter)
+        return;
+    _filterChildren = filter;
+    emit filterChildrenChanged();
+}
+
+QSGMouseAreaPrivate::QSGMouseAreaPrivate()
+: absorb(true), hovered(false), pressed(false), longPress(false),
+  moved(false), stealMouse(false), doubleClick(false), preventStealing(false), drag(0)
+{
+}
+
+QSGMouseAreaPrivate::~QSGMouseAreaPrivate()
+{
+    delete drag;
+}
+
+void QSGMouseAreaPrivate::init()
+{
+    Q_Q(QSGMouseArea);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFiltersChildMouseEvents(true);
+}
+
+void QSGMouseAreaPrivate::saveEvent(QGraphicsSceneMouseEvent *event) 
+{
+    lastPos = event->pos();
+    lastScenePos = event->scenePos();
+    lastButton = event->button();
+    lastButtons = event->buttons();
+    lastModifiers = event->modifiers();
+}
+
+bool QSGMouseAreaPrivate::isPressAndHoldConnected() 
+{
+    Q_Q(QSGMouseArea);
+    static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QSGMouseEvent*)");
+    return QObjectPrivate::get(q)->isSignalConnected(idx);
+}
+
+bool QSGMouseAreaPrivate::isDoubleClickConnected() 
+{
+    Q_Q(QSGMouseArea);
+    static int idx = QObjectPrivate::get(q)->signalIndex("doubleClicked(QSGMouseEvent*)");
+    return QObjectPrivate::get(q)->isSignalConnected(idx);
+}
+
+bool QSGMouseAreaPrivate::isClickConnected()
+{
+    Q_Q(QSGMouseArea);
+    static int idx = QObjectPrivate::get(q)->signalIndex("clicked(QSGMouseEvent*)");
+    return QObjectPrivate::get(q)->isSignalConnected(idx);
+}
+
+void QSGMouseAreaPrivate::propagate(QSGMouseEvent* event, PropagateType t)
+{
+    Q_Q(QSGMouseArea);
+    QPointF scenePos = q->mapToScene(QPointF(event->x(), event->y()));
+    propagateHelper(event, canvas->rootItem(), scenePos, t);
+}
+
+bool QSGMouseAreaPrivate::propagateHelper(QSGMouseEvent *ev, QSGItem *item,const QPointF &sp, PropagateType sig)
+{
+    //Based off of QSGCanvas::deliverInitialMousePressEvent
+    //But specific to MouseArea, so doesn't belong in canvas
+    Q_Q(const QSGMouseArea);
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+    if (itemPrivate->opacity == 0.0)
+        return false;
+
+    if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) {
+        QPointF p = item->mapFromScene(sp);
+        if (!QRectF(0, 0, item->width(), item->height()).contains(p))
+            return false;
+    }
+
+    QList<QSGItem *> children = itemPrivate->paintOrderChildItems();
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        QSGItem *child = children.at(ii);
+        if (!child->isVisible() || !child->isEnabled())
+            continue;
+        if (propagateHelper(ev, child, sp, sig))
+            return true;
+    }
+
+    QSGMouseArea* ma = qobject_cast<QSGMouseArea*>(item);
+    if (ma && ma != q && itemPrivate->acceptedMouseButtons & ev->button()) {
+        switch(sig){
+        case Click:
+            if (!ma->d_func()->isClickConnected())
+                return false;
+            break;
+        case DoubleClick:
+            if (!ma->d_func()->isDoubleClickConnected())
+                return false;
+            break;
+        case PressAndHold:
+            if (!ma->d_func()->isPressAndHoldConnected())
+                return false;
+            break;
+        }
+        QPointF p = item->mapFromScene(sp);
+        if (QRectF(0, 0, item->width(), item->height()).contains(p)) {
+            ev->setX(p.x());
+            ev->setY(p.y());
+            ev->setAccepted(true);//It is connected, they have to explicitly ignore to let it slide
+            switch(sig){
+            case Click: emit ma->clicked(ev); break;
+            case DoubleClick: emit ma->doubleClicked(ev); break;
+            case PressAndHold: emit ma->pressAndHold(ev); break;
+            }
+            if (ev->isAccepted())
+                return true;
+        }
+    }
+    return false;
+
+}
+
+/*
+  Behavioral Change in QtQuick 2.0
+
+  From QtQuick 2.0, the signals clicked, doubleClicked and pressAndHold have a different interaction
+  model with regards to the delivery of events to multiple overlapping MouseAreas. These signals will now propagate
+  to all MouseAreas in the area, in painting order, until accepted by one of them. A signal is accepted by
+  default if there is a signal handler for it, use mouse.accepted = false; to ignore. This propagation
+  can send the signal to MouseAreas other than the one which accepted the press event, although that MouseArea
+  will receive the signal first.
+
+  Note that to get the same behavior as a QtQuick 1.0 MouseArea{} with regard to absorbing all mouse events, you will
+  now need to add empty signal handlers for these three signals.
+ */
+QSGMouseArea::QSGMouseArea(QSGItem *parent)
+  : QSGItem(*(new QSGMouseAreaPrivate), parent)
+{
+    Q_D(QSGMouseArea);
+    d->init();
+}
+
+QSGMouseArea::~QSGMouseArea()
+{
+}
+
+qreal QSGMouseArea::mouseX() const
+{
+    Q_D(const QSGMouseArea);
+    return d->lastPos.x();
+}
+
+qreal QSGMouseArea::mouseY() const
+{
+    Q_D(const QSGMouseArea);
+    return d->lastPos.y();
+}
+
+bool QSGMouseArea::isEnabled() const
+{
+    Q_D(const QSGMouseArea);
+    return d->absorb;
+}
+
+void QSGMouseArea::setEnabled(bool a)
+{
+    Q_D(QSGMouseArea);
+    if (a != d->absorb) {
+        d->absorb = a;
+        emit enabledChanged();
+    }
+}
+
+bool QSGMouseArea::preventStealing() const
+{
+    Q_D(const QSGMouseArea);
+    return d->preventStealing;
+}
+
+void QSGMouseArea::setPreventStealing(bool prevent)
+{
+    Q_D(QSGMouseArea);
+    if (prevent != d->preventStealing) {
+        d->preventStealing = prevent;
+        setKeepMouseGrab(d->preventStealing && d->absorb);
+        emit preventStealingChanged();
+    }
+}
+
+Qt::MouseButtons QSGMouseArea::pressedButtons() const
+{
+    Q_D(const QSGMouseArea);
+    return d->lastButtons;
+}
+
+void QSGMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGMouseArea);
+    d->moved = false;
+    d->stealMouse = d->preventStealing;
+    if (!d->absorb)
+        QSGItem::mousePressEvent(event);
+    else {
+        d->longPress = false;
+        d->saveEvent(event);
+        if (d->drag) {
+            d->dragX = drag()->axis() & QSGDrag::XAxis;
+            d->dragY = drag()->axis() & QSGDrag::YAxis;
+        }
+        if (d->drag)
+            d->drag->setActive(false);
+        setHovered(true);
+        d->startScene = event->scenePos();
+        d->pressAndHoldTimer.start(PressAndHoldDelay, this);
+        setKeepMouseGrab(d->stealMouse);
+        event->setAccepted(setPressed(true));
+    }
+}
+
+void QSGMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb) {
+        QSGItem::mouseMoveEvent(event);
+        return;
+    }
+
+    d->saveEvent(event);
+
+    // ### we should skip this if these signals aren't used
+    // ### can GV handle this for us?
+    bool contains = boundingRect().contains(d->lastPos);
+    if (d->hovered && !contains)
+        setHovered(false);
+    else if (!d->hovered && contains)
+        setHovered(true);
+
+    if (d->drag && d->drag->target()) {
+        if (!d->moved) {
+            d->startX = drag()->target()->x();
+            d->startY = drag()->target()->y();
+        }
+
+        QPointF startLocalPos;
+        QPointF curLocalPos;
+        if (drag()->target()->parentItem()) {
+            startLocalPos = drag()->target()->parentItem()->mapFromScene(d->startScene);
+            curLocalPos = drag()->target()->parentItem()->mapFromScene(event->scenePos());
+        } else {
+            startLocalPos = d->startScene;
+            curLocalPos = event->scenePos();
+        }
+
+        const int dragThreshold = QApplication::startDragDistance();
+        qreal dx = qAbs(curLocalPos.x() - startLocalPos.x());
+        qreal dy = qAbs(curLocalPos.y() - startLocalPos.y());
+
+        if (keepMouseGrab() && d->stealMouse)
+            d->drag->setActive(true);
+
+        if (d->dragX && d->drag->active()) {
+            qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX;
+            if (x < drag()->xmin())
+                x = drag()->xmin();
+            else if (x > drag()->xmax())
+                x = drag()->xmax();
+            drag()->target()->setX(x);
+        }
+        if (d->dragY && d->drag->active()) {
+            qreal y = (curLocalPos.y() - startLocalPos.y()) + d->startY;
+            if (y < drag()->ymin())
+                y = drag()->ymin();
+            else if (y > drag()->ymax())
+                y = drag()->ymax();
+            drag()->target()->setY(y);
+        }
+
+        if (!keepMouseGrab()) {
+            if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
+                || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
+                || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
+                setKeepMouseGrab(true);
+                d->stealMouse = true;
+            }
+        }
+
+        d->moved = true;
+    }
+    QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
+    emit mousePositionChanged(&me);
+    me.setX(d->lastPos.x());
+    me.setY(d->lastPos.y());
+    emit positionChanged(&me);
+}
+
+void QSGMouseArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGMouseArea);
+    d->stealMouse = false;
+    if (!d->absorb) {
+        QSGItem::mouseReleaseEvent(event);
+    } else {
+        d->saveEvent(event);
+        setPressed(false);
+        if (d->drag)
+            d->drag->setActive(false);
+        // If we don't accept hover, we need to reset containsMouse.
+        if (!acceptHoverEvents())
+            setHovered(false);
+        QSGCanvas *c = canvas();
+        if (c && c->mouseGrabberItem() == this)
+            ungrabMouse();
+        setKeepMouseGrab(false);
+    }
+    d->doubleClick = false;
+}
+
+void QSGMouseArea::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb) {
+        QSGItem::mouseDoubleClickEvent(event);
+    } else {
+        d->saveEvent(event);
+        QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false);
+        me.setAccepted(d->isDoubleClickConnected());
+        emit this->doubleClicked(&me);
+        if (!me.isAccepted())
+            d->propagate(&me, QSGMouseAreaPrivate::DoubleClick);
+        d->doubleClick = d->isDoubleClickConnected() || me.isAccepted();
+        QSGItem::mouseDoubleClickEvent(event);
+    }
+}
+
+void QSGMouseArea::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb) {
+        QSGItem::hoverEnterEvent(event);
+    } else {
+        d->lastPos = event->pos();
+        setHovered(true);
+        QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
+        emit mousePositionChanged(&me);
+    }
+}
+
+void QSGMouseArea::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb) {
+        QSGItem::hoverMoveEvent(event);
+    } else {
+        d->lastPos = event->pos();
+        QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
+        emit mousePositionChanged(&me);
+        me.setX(d->lastPos.x());
+        me.setY(d->lastPos.y());
+        emit positionChanged(&me);
+    }
+}
+
+void QSGMouseArea::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb)
+        QSGItem::hoverLeaveEvent(event);
+    else
+        setHovered(false);
+}
+
+void QSGMouseArea::mouseUngrabEvent()
+{
+    Q_D(QSGMouseArea);
+    if (d->pressed) {
+        // if our mouse grab has been removed (probably by Flickable), fix our
+        // state
+        d->pressed = false;
+        d->stealMouse = false;
+        setKeepMouseGrab(false);
+        emit canceled();
+        emit pressedChanged();
+        if (d->hovered) {
+            d->hovered = false;
+            emit hoveredChanged();
+        }
+    }
+}
+
+bool QSGMouseArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGMouseArea);
+    QGraphicsSceneMouseEvent mouseEvent(event->type());
+    QRectF myRect = mapRectToScene(QRectF(0, 0, width(), height()));
+
+    QSGCanvas *c = canvas();
+    QSGItem *grabber = c ? c->mouseGrabberItem() : 0;
+    bool stealThisEvent = d->stealMouse;
+    if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+        mouseEvent.setAccepted(false);
+        for (int i = 0x1; i <= 0x10; i <<= 1) {
+            if (event->buttons() & i) {
+                Qt::MouseButton button = Qt::MouseButton(i);
+                mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+            }
+        }
+        mouseEvent.setScenePos(event->scenePos());
+        mouseEvent.setLastScenePos(event->lastScenePos());
+        mouseEvent.setPos(mapFromScene(event->scenePos()));
+        mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+        switch(mouseEvent.type()) {
+        case QEvent::GraphicsSceneMouseMove:
+            mouseMoveEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMousePress:
+            mousePressEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMouseRelease:
+            mouseReleaseEvent(&mouseEvent);
+            break;
+        default:
+            break;
+        }
+        grabber = c->mouseGrabberItem();
+        if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
+            grabMouse();
+
+        return stealThisEvent;
+    }
+    if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
+        if (d->pressed) {
+            d->pressed = false;
+            d->stealMouse = false;
+            if (c && c->mouseGrabberItem() == this)
+                ungrabMouse();
+            emit canceled();
+            emit pressedChanged();
+            if (d->hovered) {
+                d->hovered = false;
+                emit hoveredChanged();
+            }
+        }
+    }
+    return false;
+}
+
+bool QSGMouseArea::childMouseEventFilter(QSGItem *i, QEvent *e)
+{
+    Q_D(QSGMouseArea);
+    if (!d->absorb || !isVisible() || !d->drag || !d->drag->filterChildren())
+        return QSGItem::childMouseEventFilter(i, e);
+    switch (e->type()) {
+    case QEvent::GraphicsSceneMousePress:
+    case QEvent::GraphicsSceneMouseMove:
+    case QEvent::GraphicsSceneMouseRelease:
+        return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
+    default:
+        break;
+    }
+
+    return QSGItem::childMouseEventFilter(i, e);
+}
+
+void QSGMouseArea::timerEvent(QTimerEvent *event)
+{
+    Q_D(QSGMouseArea);
+    if (event->timerId() == d->pressAndHoldTimer.timerId()) {
+        d->pressAndHoldTimer.stop();
+        bool dragged = d->drag && d->drag->active();
+        if (d->pressed && dragged == false && d->hovered == true) {
+            d->longPress = true;
+            QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
+            me.setAccepted(d->isPressAndHoldConnected());
+            emit pressAndHold(&me);
+            if (!me.isAccepted())
+                d->propagate(&me, QSGMouseAreaPrivate::PressAndHold);
+        }
+    }
+}
+
+void QSGMouseArea::geometryChanged(const QRectF &newGeometry,
+                                            const QRectF &oldGeometry)
+{
+    Q_D(QSGMouseArea);
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+
+    if (d->lastScenePos.isNull)
+        d->lastScenePos = mapToScene(d->lastPos);
+    else if (newGeometry.x() != oldGeometry.x() || newGeometry.y() != oldGeometry.y())
+        d->lastPos = mapFromScene(d->lastScenePos);
+}
+
+void QSGMouseArea::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    Q_D(QSGMouseArea);
+    switch (change) {
+    case ItemVisibleHasChanged:
+        if (acceptHoverEvents() && d->hovered != (isVisible() && isUnderMouse()))
+            setHovered(!d->hovered);
+        break;
+    default:
+        break;
+    }
+
+    QSGItem::itemChange(change, value);
+}
+
+bool QSGMouseArea::hoverEnabled() const
+{
+    return acceptHoverEvents();
+}
+
+void QSGMouseArea::setHoverEnabled(bool h)
+{
+    Q_D(QSGMouseArea);
+    if (h == acceptHoverEvents())
+        return;
+
+    setAcceptHoverEvents(h);
+    emit hoverEnabledChanged();
+    if (d->hovered != isUnderMouse())
+        setHovered(!d->hovered);
+}
+
+bool QSGMouseArea::hovered() const
+{
+    Q_D(const QSGMouseArea);
+    return d->hovered;
+}
+
+bool QSGMouseArea::pressed() const
+{
+    Q_D(const QSGMouseArea);
+    return d->pressed;
+}
+
+void QSGMouseArea::setHovered(bool h)
+{
+    Q_D(QSGMouseArea);
+    if (d->hovered != h) {
+        d->hovered = h;
+        emit hoveredChanged();
+        d->hovered ? emit entered() : emit exited();
+    }
+}
+
+Qt::MouseButtons QSGMouseArea::acceptedButtons() const
+{
+    return acceptedMouseButtons();
+}
+
+void QSGMouseArea::setAcceptedButtons(Qt::MouseButtons buttons)
+{
+    if (buttons != acceptedMouseButtons()) {
+        setAcceptedMouseButtons(buttons);
+        emit acceptedButtonsChanged();
+    }
+}
+
+bool QSGMouseArea::setPressed(bool p)
+{
+    Q_D(QSGMouseArea);
+    bool dragged = d->drag && d->drag->active();
+    bool isclick = d->pressed == true && p == false && dragged == false && d->hovered == true;
+
+    if (d->pressed != p) {
+        d->pressed = p;
+        QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress);
+        if (d->pressed) {
+            if (!d->doubleClick)
+                emit pressed(&me);
+            me.setX(d->lastPos.x());
+            me.setY(d->lastPos.y());
+            emit mousePositionChanged(&me);
+            emit pressedChanged();
+        } else {
+            emit released(&me);
+            me.setX(d->lastPos.x());
+            me.setY(d->lastPos.y());
+            emit pressedChanged();
+            if (isclick && !d->longPress && !d->doubleClick){
+                me.setAccepted(d->isClickConnected());
+                emit clicked(&me);
+                if (!me.isAccepted())
+                    d->propagate(&me, QSGMouseAreaPrivate::Click);
+            }
+        }
+
+        return me.isAccepted();
+    }
+    return false;
+}
+
+QSGDrag *QSGMouseArea::drag()
+{
+    Q_D(QSGMouseArea);
+    if (!d->drag)
+        d->drag = new QSGDrag;
+    return d->drag;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgmousearea_p.h b/src/declarative/items/qsgmousearea_p.h
new file mode 100644
index 0000000000..24fb8389a6
--- /dev/null
+++ b/src/declarative/items/qsgmousearea_p.h
@@ -0,0 +1,216 @@
+// Commit: 57676c237992e0aa5a93a4e8fa66b3e7b90c2c90
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGMOUSEAREA_P_H
+#define QSGMOUSEAREA_P_H
+
+#include "qsgitem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QSGDrag : public QObject
+{
+    Q_OBJECT
+
+    Q_ENUMS(Axis)
+    Q_PROPERTY(QSGItem *target READ target WRITE setTarget NOTIFY targetChanged RESET resetTarget)
+    Q_PROPERTY(Axis axis READ axis WRITE setAxis NOTIFY axisChanged)
+    Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged)
+    Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged)
+    Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged)
+    Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged)
+    Q_PROPERTY(bool active READ active NOTIFY activeChanged)
+    Q_PROPERTY(bool filterChildren READ filterChildren WRITE setFilterChildren NOTIFY filterChildrenChanged)
+    //### consider drag and drop
+
+public:
+    QSGDrag(QObject *parent=0);
+    ~QSGDrag();
+
+    QSGItem *target() const;
+    void setTarget(QSGItem *);
+    void resetTarget();
+
+    enum Axis { XAxis=0x01, YAxis=0x02, XandYAxis=0x03 };
+    Axis axis() const;
+    void setAxis(Axis);
+
+    qreal xmin() const;
+    void setXmin(qreal);
+    qreal xmax() const;
+    void setXmax(qreal);
+    qreal ymin() const;
+    void setYmin(qreal);
+    qreal ymax() const;
+    void setYmax(qreal);
+
+    bool active() const;
+    void setActive(bool);
+
+    bool filterChildren() const;
+    void setFilterChildren(bool);
+
+Q_SIGNALS:
+    void targetChanged();
+    void axisChanged();
+    void minimumXChanged();
+    void maximumXChanged();
+    void minimumYChanged();
+    void maximumYChanged();
+    void activeChanged();
+    void filterChildrenChanged();
+
+private:
+    QSGItem *_target;
+    Axis _axis;
+    qreal _xmin;
+    qreal _xmax;
+    qreal _ymin;
+    qreal _ymax;
+    bool _active : 1;
+    bool _filterChildren: 1;
+    Q_DISABLE_COPY(QSGDrag)
+};
+
+class QSGMouseEvent;
+class QSGMouseAreaPrivate;
+class Q_AUTOTEST_EXPORT QSGMouseArea : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal mouseX READ mouseX NOTIFY mousePositionChanged)
+    Q_PROPERTY(qreal mouseY READ mouseY NOTIFY mousePositionChanged)
+    Q_PROPERTY(bool containsMouse READ hovered NOTIFY hoveredChanged)
+    Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
+    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(Qt::MouseButtons pressedButtons READ pressedButtons NOTIFY pressedChanged)
+    Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
+    Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
+    Q_PROPERTY(QSGDrag *drag READ drag CONSTANT) //### add flicking to QSGDrag or add a QDeclarativeFlick ???
+    Q_PROPERTY(bool preventStealing READ preventStealing WRITE setPreventStealing NOTIFY preventStealingChanged)
+
+public:
+    QSGMouseArea(QSGItem *parent=0);
+    ~QSGMouseArea();
+
+    qreal mouseX() const;
+    qreal mouseY() const;
+
+    bool isEnabled() const;
+    void setEnabled(bool);
+
+    bool hovered() const;
+    bool pressed() const;
+
+    Qt::MouseButtons pressedButtons() const;
+
+    Qt::MouseButtons acceptedButtons() const;
+    void setAcceptedButtons(Qt::MouseButtons buttons);
+
+    bool hoverEnabled() const;
+    void setHoverEnabled(bool h);
+
+    QSGDrag *drag();
+
+    bool preventStealing() const;
+    void setPreventStealing(bool prevent);
+
+Q_SIGNALS:
+    void hoveredChanged();
+    void pressedChanged();
+    void enabledChanged();
+    void acceptedButtonsChanged();
+    void hoverEnabledChanged();
+    void positionChanged(QSGMouseEvent *mouse);
+    void mousePositionChanged(QSGMouseEvent *mouse);
+    void preventStealingChanged();
+
+    void pressed(QSGMouseEvent *mouse);
+    void pressAndHold(QSGMouseEvent *mouse);
+    void released(QSGMouseEvent *mouse);
+    void clicked(QSGMouseEvent *mouse);
+    void doubleClicked(QSGMouseEvent *mouse);
+    void entered();
+    void exited();
+    void canceled();
+
+protected:
+    void setHovered(bool);
+    bool setPressed(bool);
+    bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
+
+    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseUngrabEvent();
+    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+    virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
+    virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+    virtual bool childMouseEventFilter(QSGItem *i, QEvent *e);
+    virtual void timerEvent(QTimerEvent *event);
+
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+    virtual void itemChange(ItemChange change, const ItemChangeData& value);
+
+private:
+    void handlePress();
+    void handleRelease();
+
+private:
+    Q_DISABLE_COPY(QSGMouseArea)
+    Q_DECLARE_PRIVATE(QSGMouseArea)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGDrag)
+QML_DECLARE_TYPE(QSGMouseArea)
+
+QT_END_HEADER
+
+#endif // QSGMOUSEAREA_P_H
diff --git a/src/declarative/items/qsgmousearea_p_p.h b/src/declarative/items/qsgmousearea_p_p.h
new file mode 100644
index 0000000000..b4b64c67e9
--- /dev/null
+++ b/src/declarative/items/qsgmousearea_p_p.h
@@ -0,0 +1,112 @@
+// Commit: 57676c237992e0aa5a93a4e8fa66b3e7b90c2c90
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGMOUSEAREA_P_P_H
+#define QSGMOUSEAREA_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgitem_p.h"
+
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtCore/qbasictimer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGMouseEvent;
+class QSGMouseArea;
+class QSGMouseAreaPrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGMouseArea)
+
+public:
+    QSGMouseAreaPrivate();
+    ~QSGMouseAreaPrivate();
+    void init();
+
+    void saveEvent(QGraphicsSceneMouseEvent *event);
+    enum PropagateType{
+        Click,
+        DoubleClick,
+        PressAndHold
+    };
+    void propagate(QSGMouseEvent* event, PropagateType);
+    bool propagateHelper(QSGMouseEvent*, QSGItem*,const QPointF &, PropagateType);
+
+    bool isPressAndHoldConnected();
+    bool isDoubleClickConnected();
+    bool isClickConnected();
+
+    bool absorb : 1;
+    bool hovered : 1;
+    bool pressed : 1;
+    bool longPress : 1;
+    bool moved : 1;
+    bool dragX : 1;
+    bool dragY : 1;
+    bool stealMouse : 1;
+    bool doubleClick : 1;
+    bool preventStealing : 1;
+    QSGDrag *drag;
+    QPointF startScene;
+    qreal startX;
+    qreal startY;
+    QPointF lastPos;
+    QDeclarativeNullableValue<QPointF> lastScenePos;
+    Qt::MouseButton lastButton;
+    Qt::MouseButtons lastButtons;
+    Qt::KeyboardModifiers lastModifiers;
+    QBasicTimer pressAndHoldTimer;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGMOUSEAREA_P_P_H
diff --git a/src/declarative/items/qsgninepatchnode.cpp b/src/declarative/items/qsgninepatchnode.cpp
new file mode 100644
index 0000000000..7858e98190
--- /dev/null
+++ b/src/declarative/items/qsgninepatchnode.cpp
@@ -0,0 +1,273 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgninepatchnode_p.h"
+#include <private/qsgadaptationlayer_p.h>
+#include <private/qmath_p.h>
+
+QSGNinePatchNode::QSGNinePatchNode()
+    : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
+    , m_horizontalTileMode(QSGBorderImage::Stretch)
+    , m_verticalTileMode(QSGBorderImage::Stretch)
+    , m_dirtyGeometry(false)
+{
+    setOpaqueMaterial(&m_material);
+    setMaterial(&m_materialO);
+    setGeometry(&m_geometry);
+    m_geometry.setDrawingMode(GL_TRIANGLES);
+}
+
+void QSGNinePatchNode::setInnerRect(const QRectF &rect)
+{
+    if (m_innerRect == rect)
+        return;
+    m_innerRect = rect;
+    m_dirtyGeometry = true;
+}
+
+void QSGNinePatchNode::setRect(const QRectF &rect)
+{
+    if (m_targetRect == rect)
+        return;
+    m_targetRect = rect;
+    m_dirtyGeometry = true;
+}
+
+void QSGNinePatchNode::setHorzontalTileMode(QSGBorderImage::TileMode mode)
+{
+    if (mode == QSGBorderImage::TileMode(m_horizontalTileMode))
+        return;
+    m_horizontalTileMode = mode;
+    m_dirtyGeometry = true;
+}
+
+
+void QSGNinePatchNode::setVerticalTileMode(QSGBorderImage::TileMode mode)
+{
+    if (mode == QSGBorderImage::TileMode(m_verticalTileMode))
+        return;
+    m_verticalTileMode = mode;
+    m_dirtyGeometry = true;
+}
+
+
+void QSGNinePatchNode::setFiltering(QSGTexture::Filtering filtering)
+{
+    if (m_material.filtering() == filtering)
+        return;
+
+    m_material.setFiltering(filtering);
+    m_materialO.setFiltering(filtering);
+    markDirty(DirtyMaterial);
+}
+
+QSGTexture::Filtering QSGNinePatchNode::filtering() const
+{
+    return m_material.filtering();
+}
+
+void QSGNinePatchNode::setTexture(QSGTexture *texture)
+{
+    if (texture == m_material.texture())
+        return;
+    m_material.setTexture(texture);
+    m_materialO.setTexture(texture);
+    markDirty(DirtyMaterial);
+}
+
+QSGTexture *QSGNinePatchNode::texture() const
+{
+    return m_material.texture();
+}
+
+void QSGNinePatchNode::update()
+{
+    if (!m_dirtyGeometry)
+        return;
+
+    // For stretch this algorithm could be simplified to use less vertices
+    // as more vertices could be reused then, but I doubt its where our main
+    // problem will lie. This way, we at least share the algorithm between all
+
+    Q_ASSERT(m_material.texture());
+
+    float tw = m_material.texture()->textureSize().width();
+    float th = m_material.texture()->textureSize().height();
+
+    float rightBorder = tw - m_innerRect.right();
+    float bottomBorder = th - m_innerRect.bottom();
+
+//    qDebug() << m_innerRect << m_targetRect << m_horizontalTileMode << m_verticalTileMode;
+
+    int xChunkCount = 0; // Number of chunks
+    float xChunkSize = 0; // Size of chunk in pixels
+    float xTexSize = m_innerRect.width(); // Size of the texture to stretch/tile
+    float xSize = m_targetRect.width() - m_innerRect.left() - rightBorder; // Size of area to fill with chunks
+
+    if (m_horizontalTileMode == QSGBorderImage::Repeat) {
+        xChunkCount = qCeil(xSize / xTexSize);
+        xChunkSize = xTexSize;
+    } else if (m_horizontalTileMode == QSGBorderImage::Round) {
+        xChunkCount = qCeil(xSize / xTexSize);
+        xChunkSize = xSize / xChunkCount;
+    } else {
+        xChunkCount = 1;
+        xChunkSize = xSize;
+    }
+
+    int yChunkCount = 0;
+    float yChunkSize = 0; // Relative to target rect.
+    float yTexSize = m_innerRect.height(); // Size of the texture to stretch/tile
+    float ySize = m_targetRect.height() - m_innerRect.top() - bottomBorder;
+
+    if (m_verticalTileMode == QSGBorderImage::Repeat) {
+        yChunkCount = qCeil(ySize / yTexSize);
+        yChunkSize = yTexSize;
+    } else if (m_verticalTileMode == QSGBorderImage::Round) {
+        yChunkCount = qCeil(ySize / yTexSize);
+        yChunkSize = ySize / yChunkCount;
+    } else {
+        yChunkCount = 1;
+        yChunkSize = ySize;
+    }
+
+    int xTotalChunkCount = xChunkCount + 2;
+    int yTotalChunkCount = yChunkCount + 2;
+
+    int totalChunkCount = xTotalChunkCount * yTotalChunkCount;
+    int vertexCount = totalChunkCount * 4;
+    int indexCount = totalChunkCount * 6;
+
+    if (vertexCount != m_geometry.vertexCount() || indexCount != m_geometry.indexCount())
+        m_geometry.allocate(vertexCount, indexCount);
+
+    QSGGeometry::TexturedPoint2D *v = m_geometry.vertexDataAsTexturedPoint2D();
+
+
+    // Fill in the vertices.. The loop below is pretty much an exact replica
+    // of the one inside fillRow.
+    float yTexChunk1 = 1 - m_innerRect.top() / th;
+    float yTexChunk2 = 1 - m_innerRect.bottom() / th;
+
+    fillRow(v, 0, 1, xChunkCount, xChunkSize);
+    fillRow(v, m_innerRect.y(), yTexChunk1, xChunkCount, xChunkSize);
+
+    for (int yc=0; yc<yChunkCount; ++yc) {
+        float yy = m_innerRect.y() + yChunkSize * yc;
+        fillRow(v, yy, yTexChunk1, xChunkCount, xChunkSize);
+
+        // Special case the last one
+        if (yc == yChunkCount - 1) {
+            float t = m_verticalTileMode == QSGBorderImage::Repeat
+                    ? yTexChunk1 + (yTexChunk2 - yTexChunk1) * (m_targetRect.height() - bottomBorder - yy) / yChunkSize
+                    : yTexChunk2;
+            fillRow(v, m_targetRect.height() - bottomBorder, t, xChunkCount, xChunkSize);
+        } else {
+            fillRow(v, yy + yChunkSize, yTexChunk2, xChunkCount, xChunkSize);
+        }
+    }
+
+    fillRow(v, m_targetRect.height() - bottomBorder, yTexChunk2, xChunkCount, xChunkSize);
+    fillRow(v, m_targetRect.height(), 0, xChunkCount, xChunkSize);
+
+
+//    v = m_geometry.vertexDataAsTexturedPoint2D();
+//    for (int i=0; i<m_geometry.vertexCount(); ++i) {
+//        printf("Vertex: %d:  (%.3f, %.3f) - (%.3f, %.3f)\n",
+//               i,
+//               v->x, v->y, v->tx, v->ty);
+//        ++v;
+//    }
+
+    quint16 *i = m_geometry.indexDataAsUShort();
+    int row = xTotalChunkCount * 2;
+    for (int r=0; r<yTotalChunkCount; ++r) {
+        int offset = r * row * 2;
+        for (int c=0; c<xTotalChunkCount; ++c) {
+            *i++ = offset + c * 2;
+            *i++ = offset + c * 2 + 1;
+            *i++ = offset + c * 2 + row;
+            *i++ = offset + c * 2 + 1;
+            *i++ = offset + c * 2 + row + 1;
+            *i++ = offset + c * 2 + row;
+        }
+    }
+
+//    i = m_geometry.indexDataAsUShort();
+//    for (int idx=0; idx<m_geometry.indexCount(); idx+=6) {
+//        printf("%2d: ", idx / 6);
+//        for (int s=0; s<6; ++s)
+//            printf(" %d", i[idx + s]);
+//        printf("\n");
+//    }
+
+    markDirty(QSGNode::DirtyGeometry);
+}
+
+void QSGNinePatchNode::fillRow(QSGGeometry::TexturedPoint2D *&v, float y, float ty, int xChunkCount, float xChunkSize)
+{
+    float tw = m_material.texture()->textureSize().width();
+    float rightBorder = tw - m_innerRect.right();
+    float xTexChunk1 = m_innerRect.left() / tw;
+    float xTexChunk2 = m_innerRect.right() / tw;
+
+    v++->set(0, y, 0, ty);
+    v++->set(m_innerRect.x(), y, xTexChunk1, ty);
+
+    for (int xc=0; xc<xChunkCount; ++xc) {
+        float xx = m_innerRect.x() + xChunkSize * xc;
+        v++->set(xx, y, xTexChunk1, ty);
+
+        // Special case the last one
+        if (xc == xChunkCount - 1) {
+            float t = m_horizontalTileMode == QSGBorderImage::Repeat
+                    ? xTexChunk1 + (xTexChunk2 - xTexChunk1) * (m_targetRect.width() - rightBorder - xx) / xChunkSize
+                    : xTexChunk2;
+            v->set(m_targetRect.width() - rightBorder, y, t, ty);
+        } else {
+            v->set(xx + xChunkSize, y, xTexChunk2, ty);
+        }
+        ++v;
+    }
+
+    v++->set(m_targetRect.width() - rightBorder, y, xTexChunk2, ty);
+    v++->set(m_targetRect.width(), y, 1, ty);
+}
diff --git a/src/declarative/items/qsgninepatchnode_p.h b/src/declarative/items/qsgninepatchnode_p.h
new file mode 100644
index 0000000000..533495d3ce
--- /dev/null
+++ b/src/declarative/items/qsgninepatchnode_p.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGNINEPATCHNODE_H
+#define QSGNINEPATCHNODE_H
+
+#include "qsgnode.h"
+#include "qsgtexturematerial.h"
+#include "qsgborderimage_p.h"
+
+class TextureReference;
+
+class QSGNinePatchNode : public QSGGeometryNode
+{
+public:
+    QSGNinePatchNode();
+
+    void setTexture(QSGTexture *texture);
+    QSGTexture *texture() const;
+
+    void setRect(const QRectF &rect);
+    QRectF rect() const { return m_targetRect; }
+
+    void setInnerRect(const QRectF &rect);
+    QRectF innerRect() const { return m_innerRect; }
+
+    void setFiltering(QSGTexture::Filtering filtering);
+    QSGTexture::Filtering filtering() const;
+
+    void setHorzontalTileMode(QSGBorderImage::TileMode mode);
+    QSGBorderImage::TileMode horizontalTileMode() const {
+        return (QSGBorderImage::TileMode) m_horizontalTileMode;
+    }
+
+    void setVerticalTileMode(QSGBorderImage::TileMode mode);
+    QSGBorderImage::TileMode verticalTileMode() const {
+        return (QSGBorderImage::TileMode) m_verticalTileMode;
+    }
+
+    void update();
+
+private:
+    void fillRow(QSGGeometry::TexturedPoint2D *&v, float y, float ty, int xChunkCount, float xChunkSize);
+    QRectF m_targetRect;
+    QRectF m_innerRect;
+    QSGTextureMaterial m_material;
+    QSGTextureMaterialWithOpacity m_materialO;
+    QSGGeometry m_geometry;
+
+    uint m_horizontalTileMode : 2;
+    uint m_verticalTileMode : 2;
+
+    uint m_dirtyGeometry : 1;
+};
+
+#endif // QSGNINEPATCHNODE_H
diff --git a/src/declarative/items/qsgpainteditem.cpp b/src/declarative/items/qsgpainteditem.cpp
new file mode 100644
index 0000000000..8eb8afe8be
--- /dev/null
+++ b/src/declarative/items/qsgpainteditem.cpp
@@ -0,0 +1,354 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgpainteditem.h"
+#include <private/qsgpainteditem_p.h>
+#include <private/qsgpainternode_p.h>
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \class QSGPaintedItem
+    \brief The QSGPaintedItem class provides a way to use the QPainter API in the
+    QML Scene Graph.
+
+    The QSGPaintedItem makes it possible to use the QPainter API with the QML Scene Graph.
+    It sets up a textured rectangle in the Scene Graph and uses a QPainter to paint
+    onto the texture. The render target can be either a QImage or a QGLFramebufferObject.
+    When the render target is a QImage, QPainter first renders into the image then
+    the content is uploaded to the texture.
+    When a QGLFramebufferObject is used, QPainter paints directly onto the texture.
+    Call update() to trigger a repaint.
+
+    Set the \l smooth property to true to enable QPainter to do anti-aliased rendering.
+
+    QSGPaintedItem is meant to make it easier to port old code that is using the
+    QPainter API to the QML Scene Graph API and it should be used only for that purpose.
+
+    To write your own painted item, you first create a subclass of QSGPaintedItem, and then
+    start by implementing its only pure virtual public function: paint(), which implements
+    the actual painting. To get the size of the area painted by the item, use
+    QSGItem::width() and QSGItem::height().
+*/
+
+/*!
+    \enum QSGPaintedItem::RenderTarget
+
+    This enum describes QSGPaintedItem's render targets. The render target is the
+    surface QPainter paints onto before the item is rendered on screen.
+
+    \value Image The default; QPainter paints into a QImage using the raster paint engine.
+    The image's content needs to be uploaded to graphics memory afterward, this operation
+    can potentially be slow if the item is large. This render target allows high quality
+    anti-aliasing and fast item resizing.
+
+    \value FramebufferObject QPainter paints into a QGLFramebufferObject using the GL
+    paint engine. Painting can be faster as no texture upload is required, but anti-aliasing
+    quality is not as good as if using an image. This render target allows faster rendering
+    in some cases, but you should avoid using it if the item is resized often.
+
+    \sa setRenderTarget()
+*/
+
+/*!
+    \internal
+*/
+QSGPaintedItemPrivate::QSGPaintedItemPrivate()
+    : QSGItemPrivate()
+    , fillColor(Qt::transparent)
+    , renderTarget(QSGPaintedItem::Image)
+    , geometryDirty(false)
+    , contentsDirty(false)
+    , opaquePainting(false)
+{
+}
+
+/*!
+    Constructs a QSGPaintedItem with the given \a parent item.
+ */
+QSGPaintedItem::QSGPaintedItem(QSGItem *parent)
+    : QSGItem(*(new QSGPaintedItemPrivate), parent)
+{
+    setFlag(ItemHasContents);
+}
+
+/*!
+    \internal
+*/
+QSGPaintedItem::QSGPaintedItem(QSGPaintedItemPrivate &dd, QSGItem *parent)
+    : QSGItem(dd, parent)
+{
+    setFlag(ItemHasContents);
+}
+
+/*!
+    Destroys the QSGPaintedItem.
+*/
+QSGPaintedItem::~QSGPaintedItem()
+{
+}
+
+/*!
+    Schedules a redraw of the area covered by \a rect in this item. You can call this function
+    whenever your item needs to be redrawn, such as if it changes appearance or size.
+
+    This function does not cause an immediate paint; instead it schedules a paint request that
+    is processed by the QML Scene Graph when the next frame is rendered. The item will only be
+    redrawn if it is visible.
+
+    Note that calling this function will trigger a repaint of the whole scene.
+
+    \sa paint()
+*/
+void QSGPaintedItem::update(const QRect &rect)
+{
+    Q_D(QSGPaintedItem);
+    d->contentsDirty = true;
+    if (rect.isNull() && !d->dirtyRect.isNull())
+        d->dirtyRect = boundingRect().toAlignedRect();
+    else
+        d->dirtyRect |= (boundingRect() & rect).toAlignedRect();
+    QSGItem::update();
+}
+
+/*!
+    Returns true if this item is opaque; otherwise, false is returned.
+
+    By default, painted items are not opaque.
+
+    \sa setOpaquePainting()
+*/
+bool QSGPaintedItem::opaquePainting() const
+{
+    Q_D(const QSGPaintedItem);
+    return d->opaquePainting;
+}
+
+/*!
+    If \a opaque is true, the item is opaque; otherwise, it is considered as translucent.
+
+    Opaque items are not blended with the rest of the scene, you should set this to true
+    if the content of the item is opaque to speed up rendering.
+
+    By default, painted items are not opaque.
+
+    \sa opaquePainting()
+*/
+void QSGPaintedItem::setOpaquePainting(bool opaque)
+{
+    Q_D(QSGPaintedItem);
+
+    if (d->opaquePainting == opaque)
+        return;
+
+    d->opaquePainting = opaque;
+    QSGItem::update();
+}
+
+QSize QSGPaintedItem::contentsSize() const
+{
+    // XXX todo
+    return QSize();
+}
+
+void QSGPaintedItem::setContentsSize(const QSize &)
+{
+    // XXX todo
+}
+
+void QSGPaintedItem::resetContentsSize()
+{
+    // XXX todo
+}
+
+qreal QSGPaintedItem::contentsScale() const
+{
+    // XXX todo
+    return 1;
+}
+
+void QSGPaintedItem::setContentsScale(qreal)
+{
+    // XXX todo
+}
+
+int QSGPaintedItem::pixelCacheSize() const
+{
+    // XXX todo
+    return 0;
+}
+
+void QSGPaintedItem::setPixelCacheSize(int)
+{
+    // XXX todo
+}
+
+bool QSGPaintedItem::smoothCache() const
+{
+    // XXX todo
+    return false;
+}
+
+void QSGPaintedItem::setSmoothCache(bool)
+{
+    // XXX todo
+}
+
+/*!
+    \property QSGPaintedItem::fillColor
+    \brief The item's background fill color.
+
+    By default, the fill color is set to Qt::transparent.
+*/
+QColor QSGPaintedItem::fillColor() const
+{
+    Q_D(const QSGPaintedItem);
+    return d->fillColor;
+}
+
+void QSGPaintedItem::setFillColor(const QColor &c)
+{
+    Q_D(QSGPaintedItem);
+
+    if (d->fillColor == c)
+        return;
+
+    d->fillColor = c;
+    update();
+
+    emit fillColorChanged();
+}
+
+/*!
+    \property QSGPaintedItem::renderTarget
+    \brief The item's render target.
+
+    This property defines which render target the QPainter renders into, it can be either
+    QSGPaintedItem::Image or QSGPaintedItem::FramebufferObject. Both have certains benefits,
+    typically performance versus quality. Using a framebuffer object avoids a costly upload
+    of the image contents to the texture in graphics memory, while using an image enables
+    high quality anti-aliasing.
+
+    \warning Resizing a framebuffer object is a costly operation, avoid using
+    the QSGPaintedItem::FramebufferObject render target if the item gets resized often.
+
+    By default, the render target is QSGPaintedItem::Image.
+*/
+QSGPaintedItem::RenderTarget QSGPaintedItem::renderTarget() const
+{
+    Q_D(const QSGPaintedItem);
+    return d->renderTarget;
+}
+
+void QSGPaintedItem::setRenderTarget(RenderTarget target)
+{
+    Q_D(QSGPaintedItem);
+
+    if (d->renderTarget == target)
+        return;
+
+    d->renderTarget = target;
+    update();
+
+    emit renderTargetChanged();
+}
+
+/*!
+    \fn virtual void QSGPaintedItem::paint(QPainter *painter) = 0
+
+    This function, which is usually called by the QML Scene Graph, paints the
+    contents of an item in local coordinates.
+
+    The function is called after the item has been filled with the fillColor.
+
+    Reimplement this function in a QSGPaintedItem subclass to provide the
+    item's painting implementation, using \a painter.
+*/
+
+/*!
+    This function is called after the item's geometry has changed.
+*/
+void QSGPaintedItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_D(QSGPaintedItem);
+    d->geometryDirty = true;
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+
+/*!
+    This function is called when the Scene Graph node associated to the item needs to
+    be updated.
+*/
+QSGNode *QSGPaintedItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
+{
+    Q_UNUSED(data);
+    Q_D(QSGPaintedItem);
+
+    if (width() <= 0 || height() <= 0) {
+        delete oldNode;
+        return 0;
+    }
+
+    QSGPainterNode *node = static_cast<QSGPainterNode *>(oldNode);
+    if (!node)
+        node = new QSGPainterNode(this);
+
+    node->setPreferredRenderTarget(d->renderTarget);
+    node->setSize(QSize(d->width, d->height));
+    node->setSmoothPainting(d->smooth);
+    node->setLinearFiltering(d->smooth);
+    node->setOpaquePainting(d->opaquePainting);
+    node->setFillColor(d->fillColor);
+    node->setDirty(d->contentsDirty || d->geometryDirty, d->dirtyRect);
+    node->update();
+
+    d->contentsDirty = false;
+    d->geometryDirty = false;
+    d->dirtyRect = QRect();
+
+    return node;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgpainteditem.h b/src/declarative/items/qsgpainteditem.h
new file mode 100644
index 0000000000..23becfefa4
--- /dev/null
+++ b/src/declarative/items/qsgpainteditem.h
@@ -0,0 +1,119 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPAINTEDITEM_P_H
+#define QSGPAINTEDITEM_P_H
+
+#include <qsgitem.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QSGPaintedItemPrivate;
+class Q_DECLARATIVE_EXPORT QSGPaintedItem : public QSGItem
+{
+    Q_OBJECT
+    Q_ENUMS(RenderTarget)
+
+    Q_PROPERTY(QSize contentsSize READ contentsSize WRITE setContentsSize NOTIFY contentsSizeChanged)
+    Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor NOTIFY fillColorChanged)
+    Q_PROPERTY(int pixelCacheSize READ pixelCacheSize WRITE setPixelCacheSize)
+    Q_PROPERTY(bool smoothCache READ smoothCache WRITE setSmoothCache)
+    Q_PROPERTY(qreal contentsScale READ contentsScale WRITE setContentsScale NOTIFY contentsScaleChanged)
+    Q_PROPERTY(RenderTarget renderTarget READ renderTarget WRITE setRenderTarget NOTIFY renderTargetChanged)
+public:
+    QSGPaintedItem(QSGItem *parent = 0);
+    virtual ~QSGPaintedItem();
+
+    enum RenderTarget {
+        Image,
+        FramebufferObject
+    };
+
+    void update(const QRect &rect = QRect());
+
+    bool opaquePainting() const;
+    void setOpaquePainting(bool opaque);
+
+    QSize contentsSize() const;
+    void setContentsSize(const QSize &);
+    void resetContentsSize();
+
+    qreal contentsScale() const;
+    void setContentsScale(qreal);
+
+    int pixelCacheSize() const;
+    void setPixelCacheSize(int pixels);
+
+    bool smoothCache() const;
+    void setSmoothCache(bool on);
+
+    QColor fillColor() const;
+    void setFillColor(const QColor&);
+
+    RenderTarget renderTarget() const;
+    void setRenderTarget(RenderTarget target);
+
+    virtual void paint(QPainter *painter) = 0;
+
+Q_SIGNALS:
+    void fillColorChanged();
+    void contentsSizeChanged();
+    void contentsScaleChanged();
+    void renderTargetChanged();
+
+protected:
+    QSGPaintedItem(QSGPaintedItemPrivate &dd, QSGItem *parent = 0);
+    virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private:
+    Q_DISABLE_COPY(QSGPaintedItem);
+    Q_DECLARE_PRIVATE(QSGPaintedItem);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGPAINTEDITEM_P_H
diff --git a/src/declarative/items/qsgpainteditem_p.h b/src/declarative/items/qsgpainteditem_p.h
new file mode 100644
index 0000000000..c49da5098f
--- /dev/null
+++ b/src/declarative/items/qsgpainteditem_p.h
@@ -0,0 +1,67 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPAINTEDITEM_P_P_H
+#define QSGPAINTEDITEM_P_P_H
+
+#include "qsgitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGPaintedItemPrivate : public QSGItemPrivate
+{
+public:
+    QSGPaintedItemPrivate();
+
+    QColor fillColor;
+    QSGPaintedItem::RenderTarget renderTarget;
+
+    QRect dirtyRect;
+
+    bool geometryDirty : 1;
+    bool contentsDirty : 1;
+    bool opaquePainting: 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGPAINTEDITEM_P_P_H
diff --git a/src/declarative/items/qsgpathview.cpp b/src/declarative/items/qsgpathview.cpp
new file mode 100644
index 0000000000..f7dda6cb27
--- /dev/null
+++ b/src/declarative/items/qsgpathview.cpp
@@ -0,0 +1,1410 @@
+// Commit: ac704e9f682378a5ec56e3f5c195dcf2f2dfa1ac
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgpathview_p.h"
+#include "qsgpathview_p_p.h"
+#include "qsgcanvas.h"
+
+#include <private/qdeclarativestate_p.h>
+#include <private/qdeclarativeopenmetaobject_p.h>
+#include <private/qlistmodelinterface_p.h>
+
+#include <QtGui/qevent.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qapplication.h>
+#include <QtCore/qmath.h>
+#include <math.h>
+
+QT_BEGIN_NAMESPACE
+
+inline qreal qmlMod(qreal x, qreal y)
+{
+#ifdef QT_USE_MATH_H_FLOATS
+    if(sizeof(qreal) == sizeof(float))
+        return fmodf(float(x), float(y));
+    else
+#endif
+        return fmod(x, y);
+}
+
+static QDeclarativeOpenMetaObjectType *qPathViewAttachedType = 0;
+
+QSGPathViewAttached::QSGPathViewAttached(QObject *parent)
+: QObject(parent), m_percent(-1), m_view(0), m_onPath(false), m_isCurrent(false)
+{
+    if (qPathViewAttachedType) {
+        m_metaobject = new QDeclarativeOpenMetaObject(this, qPathViewAttachedType);
+        m_metaobject->setCached(true);
+    } else {
+        m_metaobject = new QDeclarativeOpenMetaObject(this);
+    }
+}
+
+QSGPathViewAttached::~QSGPathViewAttached()
+{
+}
+
+QVariant QSGPathViewAttached::value(const QByteArray &name) const
+{
+    return m_metaobject->value(name);
+}
+void QSGPathViewAttached::setValue(const QByteArray &name, const QVariant &val)
+{
+    m_metaobject->setValue(name, val);
+}
+
+
+void QSGPathViewPrivate::init()
+{
+    Q_Q(QSGPathView);
+    offset = 0;
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFlag(QSGItem::ItemIsFocusScope);
+    q->setFiltersChildMouseEvents(true);
+    q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked()));
+    lastPosTime.invalidate();
+    static int timelineCompletedIdx = -1;
+    static int movementEndingIdx = -1;
+    if (timelineCompletedIdx == -1) {
+        timelineCompletedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("completed()");
+        movementEndingIdx = QSGPathView::staticMetaObject.indexOfSlot("movementEnding()");
+    }
+    QMetaObject::connect(&tl, timelineCompletedIdx,
+                         q, movementEndingIdx, Qt::DirectConnection);
+}
+
+QSGItem *QSGPathViewPrivate::getItem(int modelIndex)
+{
+    Q_Q(QSGPathView);
+    requestedIndex = modelIndex;
+    QSGItem *item = model->item(modelIndex, false);
+    if (item) {
+        if (!attType) {
+            // pre-create one metatype to share with all attached objects
+            attType = new QDeclarativeOpenMetaObjectType(&QSGPathViewAttached::staticMetaObject, qmlEngine(q));
+            foreach(const QString &attr, path->attributes())
+                attType->createProperty(attr.toUtf8());
+        }
+        qPathViewAttachedType = attType;
+        QSGPathViewAttached *att = static_cast<QSGPathViewAttached *>(qmlAttachedPropertiesObject<QSGPathView>(item));
+        qPathViewAttachedType = 0;
+        if (att) {
+            att->m_view = q;
+            att->setOnPath(true);
+        }
+        item->setParentItem(q);
+        QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+        itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
+    }
+    requestedIndex = -1;
+    return item;
+}
+
+void QSGPathViewPrivate::releaseItem(QSGItem *item)
+{
+    if (!item || !model)
+        return;
+    QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
+    itemPrivate->removeItemChangeListener(this, QSGItemPrivate::Geometry);
+    if (model->release(item) == 0) {
+        // item was not destroyed, and we no longer reference it.
+        if (QSGPathViewAttached *att = attached(item))
+            att->setOnPath(false);
+    }
+}
+
+QSGPathViewAttached *QSGPathViewPrivate::attached(QSGItem *item)
+{
+    return static_cast<QSGPathViewAttached *>(qmlAttachedPropertiesObject<QSGPathView>(item, false));
+}
+
+void QSGPathViewPrivate::clear()
+{
+    for (int i=0; i<items.count(); i++){
+        QSGItem *p = items[i];
+        releaseItem(p);
+    }
+    items.clear();
+}
+
+void QSGPathViewPrivate::updateMappedRange()
+{
+    if (model && pathItems != -1 && pathItems < modelCount)
+        mappedRange = qreal(pathItems)/modelCount;
+    else
+        mappedRange = 1.0;
+}
+
+qreal QSGPathViewPrivate::positionOfIndex(qreal index) const
+{
+    qreal pos = -1.0;
+
+    if (model && index >= 0 && index < modelCount) {
+        qreal start = 0.0;
+        if (haveHighlightRange && highlightRangeMode != QSGPathView::NoHighlightRange)
+            start = highlightRangeStart;
+        qreal globalPos = index + offset;
+        globalPos = qmlMod(globalPos, qreal(modelCount)) / modelCount;
+        if (pathItems != -1 && pathItems < modelCount) {
+            globalPos += start * mappedRange;
+            globalPos = qmlMod(globalPos, 1.0);
+            if (globalPos < mappedRange)
+                pos = globalPos / mappedRange;
+        } else {
+            pos = qmlMod(globalPos + start, 1.0);
+        }
+    }
+
+    return pos;
+}
+
+void QSGPathViewPrivate::createHighlight()
+{
+    Q_Q(QSGPathView);
+    if (!q->isComponentComplete())
+        return;
+
+    bool changed = false;
+    if (highlightItem) {
+        delete highlightItem;
+        highlightItem = 0;
+        changed = true;
+    }
+
+    QSGItem *item = 0;
+    if (highlightComponent) {
+        QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
+        QObject *nobj = highlightComponent->create(highlightContext);
+        if (nobj) {
+            QDeclarative_setParent_noEvent(highlightContext, nobj);
+            item = qobject_cast<QSGItem *>(nobj);
+            if (!item)
+                delete nobj;
+        } else {
+            delete highlightContext;
+        }
+    } else {
+        item = new QSGItem;
+    }
+    if (item) {
+        QDeclarative_setParent_noEvent(item, q);
+        item->setParentItem(q);
+        highlightItem = item;
+        changed = true;
+    }
+    if (changed)
+        emit q->highlightItemChanged();
+}
+
+void QSGPathViewPrivate::updateHighlight()
+{
+    Q_Q(QSGPathView);
+    if (!q->isComponentComplete() || !isValid())
+        return;
+    if (highlightItem) {
+        if (haveHighlightRange && highlightRangeMode == QSGPathView::StrictlyEnforceRange) {
+            updateItem(highlightItem, highlightRangeStart);
+        } else {
+            qreal target = currentIndex;
+
+            offsetAdj = 0.0;
+            tl.reset(moveHighlight);
+            moveHighlight.setValue(highlightPosition);
+
+            const int duration = highlightMoveDuration;
+
+            if (target - highlightPosition > modelCount/2) {
+                highlightUp = false;
+                qreal distance = modelCount - target + highlightPosition;
+                tl.move(moveHighlight, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * highlightPosition / distance));
+                tl.set(moveHighlight, modelCount-0.01);
+                tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * (modelCount-target) / distance));
+            } else if (target - highlightPosition <= -modelCount/2) {
+                highlightUp = true;
+                qreal distance = modelCount - highlightPosition + target;
+                tl.move(moveHighlight, modelCount-0.01, QEasingCurve(QEasingCurve::InQuad), int(duration * (modelCount-highlightPosition) / distance));
+                tl.set(moveHighlight, 0.0);
+                tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * target / distance));
+            } else {
+                highlightUp = highlightPosition - target < 0;
+                tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::InOutQuad), duration);
+            }
+        }
+    }
+}
+
+void QSGPathViewPrivate::setHighlightPosition(qreal pos)
+{
+    if (pos != highlightPosition) {
+        qreal start = 0.0;
+        qreal end = 1.0;
+        if (haveHighlightRange && highlightRangeMode != QSGPathView::NoHighlightRange) {
+            start = highlightRangeStart;
+            end = highlightRangeEnd;
+        }
+
+        qreal range = qreal(modelCount);
+        // calc normalized position of highlight relative to offset
+        qreal relativeHighlight = qmlMod(pos + offset, range) / range;
+
+        if (!highlightUp && relativeHighlight > end * mappedRange) {
+            qreal diff = 1.0 - relativeHighlight;
+            setOffset(offset + diff * range);
+        } else if (highlightUp && relativeHighlight >= (end - start) * mappedRange) {
+            qreal diff = relativeHighlight - (end - start) * mappedRange;
+            setOffset(offset - diff * range - 0.00001);
+        }
+
+        highlightPosition = pos;
+        qreal pathPos = positionOfIndex(pos);
+        updateItem(highlightItem, pathPos);
+        if (QSGPathViewAttached *att = attached(highlightItem))
+            att->setOnPath(pathPos != -1.0);
+    }
+}
+
+void QSGPathView::pathUpdated()
+{
+    Q_D(QSGPathView);
+    QList<QSGItem*>::iterator it = d->items.begin();
+    while (it != d->items.end()) {
+        QSGItem *item = *it;
+        if (QSGPathViewAttached *att = d->attached(item))
+            att->m_percent = -1;
+        ++it;
+    }
+    refill();
+}
+
+void QSGPathViewPrivate::updateItem(QSGItem *item, qreal percent)
+{
+    if (QSGPathViewAttached *att = attached(item)) {
+        if (qFuzzyCompare(att->m_percent, percent))
+            return;
+        att->m_percent = percent;
+        foreach(const QString &attr, path->attributes())
+            att->setValue(attr.toUtf8(), path->attributeAt(attr, percent));
+    }
+    QPointF pf = path->pointAt(percent);
+    item->setX(qRound(pf.x() - item->width()/2));
+    item->setY(qRound(pf.y() - item->height()/2));
+}
+
+void QSGPathViewPrivate::regenerate()
+{
+    Q_Q(QSGPathView);
+    if (!q->isComponentComplete())
+        return;
+
+    clear();
+
+    if (!isValid())
+        return;
+
+    firstIndex = -1;
+    updateMappedRange();
+    q->refill();
+}
+
+QSGPathView::QSGPathView(QSGItem *parent)
+  : QSGItem(*(new QSGPathViewPrivate), parent)
+{
+    Q_D(QSGPathView);
+    d->init();
+}
+
+QSGPathView::~QSGPathView()
+{
+    Q_D(QSGPathView);
+    d->clear();
+    if (d->attType)
+        d->attType->release();
+    if (d->ownModel)
+        delete d->model;
+}
+
+QVariant QSGPathView::model() const
+{
+    Q_D(const QSGPathView);
+    return d->modelVariant;
+}
+
+void QSGPathView::setModel(const QVariant &model)
+{
+    Q_D(QSGPathView);
+    if (d->modelVariant == model)
+        return;
+
+    if (d->model) {
+        disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        disconnect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        for (int i=0; i<d->items.count(); i++){
+            QSGItem *p = d->items[i];
+            d->model->release(p);
+        }
+        d->items.clear();
+    }
+
+    d->modelVariant = model;
+    QObject *object = qvariant_cast<QObject*>(model);
+    QSGVisualModel *vim = 0;
+    if (object && (vim = qobject_cast<QSGVisualModel *>(object))) {
+        if (d->ownModel) {
+            delete d->model;
+            d->ownModel = false;
+        }
+        d->model = vim;
+    } else {
+        if (!d->ownModel) {
+            d->model = new QSGVisualDataModel(qmlContext(this), this);
+            d->ownModel = true;
+        }
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            dataModel->setModel(model);
+    }
+    d->modelCount = 0;
+    if (d->model) {
+        connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        connect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        d->modelCount = d->model->count();
+        if (d->model->count())
+            d->offset = qmlMod(d->offset, qreal(d->model->count()));
+        if (d->offset < 0)
+            d->offset = d->model->count() + d->offset;
+}
+    d->regenerate();
+    d->fixOffset();
+    emit countChanged();
+    emit modelChanged();
+}
+
+int QSGPathView::count() const
+{
+    Q_D(const QSGPathView);
+    return d->model ? d->modelCount : 0;
+}
+
+QDeclarativePath *QSGPathView::path() const
+{
+    Q_D(const QSGPathView);
+    return d->path;
+}
+
+void QSGPathView::setPath(QDeclarativePath *path)
+{
+    Q_D(QSGPathView);
+    if (d->path == path)
+        return;
+    if (d->path)
+        disconnect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated()));
+    d->path = path;
+    connect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated()));
+    if (d->isValid() && isComponentComplete()) {
+        d->clear();
+        if (d->attType) {
+            d->attType->release();
+            d->attType = 0;
+        }
+        d->regenerate();
+    }
+    emit pathChanged();
+}
+
+int QSGPathView::currentIndex() const
+{
+    Q_D(const QSGPathView);
+    return d->currentIndex;
+}
+
+void QSGPathView::setCurrentIndex(int idx)
+{
+    Q_D(QSGPathView);
+    if (d->model && d->modelCount)
+        idx = qAbs(idx % d->modelCount);
+    if (d->model && idx != d->currentIndex) {
+        if (d->modelCount) {
+            int itemIndex = (d->currentIndex - d->firstIndex + d->modelCount) % d->modelCount;
+            if (itemIndex < d->items.count()) {
+                if (QSGItem *item = d->items.at(itemIndex)) {
+                    if (QSGPathViewAttached *att = d->attached(item))
+                        att->setIsCurrentItem(false);
+                }
+            }
+        }
+        d->currentItem = 0;
+        d->moveReason = QSGPathViewPrivate::SetIndex;
+        d->currentIndex = idx;
+        if (d->modelCount) {
+            if (d->haveHighlightRange && d->highlightRangeMode == QSGPathView::StrictlyEnforceRange)
+                d->snapToCurrent();
+            int itemIndex = (idx - d->firstIndex + d->modelCount) % d->modelCount;
+            if (itemIndex < d->items.count()) {
+                d->currentItem = d->items.at(itemIndex);
+                d->currentItem->setFocus(true);
+                if (QSGPathViewAttached *att = d->attached(d->currentItem))
+                    att->setIsCurrentItem(true);
+            }
+            d->currentItemOffset = d->positionOfIndex(d->currentIndex);
+            d->updateHighlight();
+        }
+        emit currentIndexChanged();
+    }
+}
+
+void QSGPathView::incrementCurrentIndex()
+{
+    Q_D(QSGPathView);
+    d->moveDirection = QSGPathViewPrivate::Positive;
+    setCurrentIndex(currentIndex()+1);
+}
+
+void QSGPathView::decrementCurrentIndex()
+{
+    Q_D(QSGPathView);
+    if (d->model && d->modelCount) {
+        int idx = currentIndex()-1;
+        if (idx < 0)
+            idx = d->modelCount - 1;
+        d->moveDirection = QSGPathViewPrivate::Negative;
+        setCurrentIndex(idx);
+    }
+}
+
+qreal QSGPathView::offset() const
+{
+    Q_D(const QSGPathView);
+    return d->offset;
+}
+
+void QSGPathView::setOffset(qreal offset)
+{
+    Q_D(QSGPathView);
+    d->setOffset(offset);
+    d->updateCurrent();
+}
+
+void QSGPathViewPrivate::setOffset(qreal o)
+{
+    Q_Q(QSGPathView);
+    if (offset != o) {
+        if (isValid() && q->isComponentComplete()) {
+            offset = qmlMod(o, qreal(modelCount));
+            if (offset < 0)
+                offset += qreal(modelCount);
+            q->refill();
+        } else {
+            offset = o;
+        }
+        emit q->offsetChanged();
+    }
+}
+
+void QSGPathViewPrivate::setAdjustedOffset(qreal o)
+{
+    setOffset(o+offsetAdj);
+}
+
+QDeclarativeComponent *QSGPathView::highlight() const
+{
+    Q_D(const QSGPathView);
+    return d->highlightComponent;
+}
+
+void QSGPathView::setHighlight(QDeclarativeComponent *highlight)
+{
+    Q_D(QSGPathView);
+    if (highlight != d->highlightComponent) {
+        d->highlightComponent = highlight;
+        d->createHighlight();
+        d->updateHighlight();
+        emit highlightChanged();
+    }
+}
+
+QSGItem *QSGPathView::highlightItem()
+{
+    Q_D(const QSGPathView);
+    return d->highlightItem;
+}
+
+qreal QSGPathView::preferredHighlightBegin() const
+{
+    Q_D(const QSGPathView);
+    return d->highlightRangeStart;
+}
+
+void QSGPathView::setPreferredHighlightBegin(qreal start)
+{
+    Q_D(QSGPathView);
+    if (d->highlightRangeStart == start || start < 0 || start > 1.0)
+        return;
+    d->highlightRangeStart = start;
+    d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    refill();
+    emit preferredHighlightBeginChanged();
+}
+
+qreal QSGPathView::preferredHighlightEnd() const
+{
+    Q_D(const QSGPathView);
+    return d->highlightRangeEnd;
+}
+
+void QSGPathView::setPreferredHighlightEnd(qreal end)
+{
+    Q_D(QSGPathView);
+    if (d->highlightRangeEnd == end || end < 0 || end > 1.0)
+        return;
+    d->highlightRangeEnd = end;
+    d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    refill();
+    emit preferredHighlightEndChanged();
+}
+
+QSGPathView::HighlightRangeMode QSGPathView::highlightRangeMode() const
+{
+    Q_D(const QSGPathView);
+    return d->highlightRangeMode;
+}
+
+void QSGPathView::setHighlightRangeMode(HighlightRangeMode mode)
+{
+    Q_D(QSGPathView);
+    if (d->highlightRangeMode == mode)
+        return;
+    d->highlightRangeMode = mode;
+    d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
+    emit highlightRangeModeChanged();
+}
+
+int QSGPathView::highlightMoveDuration() const
+{
+    Q_D(const QSGPathView);
+    return d->highlightMoveDuration;
+}
+
+void QSGPathView::setHighlightMoveDuration(int duration)
+{
+    Q_D(QSGPathView);
+    if (d->highlightMoveDuration == duration)
+        return;
+    d->highlightMoveDuration = duration;
+    emit highlightMoveDurationChanged();
+}
+
+qreal QSGPathView::dragMargin() const
+{
+    Q_D(const QSGPathView);
+    return d->dragMargin;
+}
+
+void QSGPathView::setDragMargin(qreal dragMargin)
+{
+    Q_D(QSGPathView);
+    if (d->dragMargin == dragMargin)
+        return;
+    d->dragMargin = dragMargin;
+    emit dragMarginChanged();
+}
+
+qreal QSGPathView::flickDeceleration() const
+{
+    Q_D(const QSGPathView);
+    return d->deceleration;
+}
+
+void QSGPathView::setFlickDeceleration(qreal dec)
+{
+    Q_D(QSGPathView);
+    if (d->deceleration == dec)
+        return;
+    d->deceleration = dec;
+    emit flickDecelerationChanged();
+}
+
+bool QSGPathView::isInteractive() const
+{
+    Q_D(const QSGPathView);
+    return d->interactive;
+}
+
+void QSGPathView::setInteractive(bool interactive)
+{
+    Q_D(QSGPathView);
+    if (interactive != d->interactive) {
+        d->interactive = interactive;
+        if (!interactive)
+            d->tl.clear();
+        emit interactiveChanged();
+    }
+}
+
+bool QSGPathView::isMoving() const
+{
+    Q_D(const QSGPathView);
+    return d->moving;
+}
+
+bool QSGPathView::isFlicking() const
+{
+    Q_D(const QSGPathView);
+    return d->flicking;
+}
+
+QDeclarativeComponent *QSGPathView::delegate() const
+{
+    Q_D(const QSGPathView);
+     if (d->model) {
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            return dataModel->delegate();
+    }
+
+    return 0;
+}
+
+void QSGPathView::setDelegate(QDeclarativeComponent *delegate)
+{
+    Q_D(QSGPathView);
+    if (delegate == this->delegate())
+        return;
+    if (!d->ownModel) {
+        d->model = new QSGVisualDataModel(qmlContext(this));
+        d->ownModel = true;
+    }
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model)) {
+        dataModel->setDelegate(delegate);
+        d->modelCount = dataModel->count();
+        d->regenerate();
+        emit delegateChanged();
+    }
+}
+
+int QSGPathView::pathItemCount() const
+{
+    Q_D(const QSGPathView);
+    return d->pathItems;
+}
+
+void QSGPathView::setPathItemCount(int i)
+{
+    Q_D(QSGPathView);
+    if (i == d->pathItems)
+        return;
+    if (i < 1)
+        i = 1;
+    d->pathItems = i;
+    d->updateMappedRange();
+    if (d->isValid() && isComponentComplete()) {
+        d->regenerate();
+    }
+    emit pathItemCountChanged();
+}
+
+QPointF QSGPathViewPrivate::pointNear(const QPointF &point, qreal *nearPercent) const
+{
+    //XXX maybe do recursively at increasing resolution.
+    qreal mindist = 1e10; // big number
+    QPointF nearPoint = path->pointAt(0);
+    qreal nearPc = 0;
+    for (qreal i=1; i < 1000; i++) {
+        QPointF pt = path->pointAt(i/1000.0);
+        QPointF diff = pt - point;
+        qreal dist = diff.x()*diff.x() + diff.y()*diff.y();
+        if (dist < mindist) {
+            nearPoint = pt;
+            nearPc = i;
+            mindist = dist;
+        }
+    }
+
+    if (nearPercent)
+        *nearPercent = nearPc / 1000.0;
+
+    return nearPoint;
+}
+
+void QSGPathView::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPathView);
+    if (d->interactive) {
+        d->handleMousePressEvent(event);
+        event->accept();
+    } else {
+        QSGItem::mousePressEvent(event);
+    }
+}
+
+void QSGPathViewPrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGPathView);
+    if (!interactive || !items.count())
+        return;
+    QPointF scenePoint = q->mapToScene(event->pos());
+    int idx = 0;
+    for (; idx < items.count(); ++idx) {
+        QRectF rect = items.at(idx)->boundingRect();
+        rect = items.at(idx)->mapRectToScene(rect);
+        if (rect.contains(scenePoint))
+            break;
+    }
+    if (idx == items.count() && dragMargin == 0.)  // didn't click on an item
+        return;
+
+    startPoint = pointNear(event->pos(), &startPc);
+    if (idx == items.count()) {
+        qreal distance = qAbs(event->pos().x() - startPoint.x()) + qAbs(event->pos().y() - startPoint.y());
+        if (distance > dragMargin)
+            return;
+    }
+
+    if (tl.isActive() && flicking)
+        stealMouse = true; // If we've been flicked then steal the click.
+    else
+        stealMouse = false;
+
+    lastElapsed = 0;
+    lastDist = 0;
+    QSGItemPrivate::start(lastPosTime);
+    tl.clear();
+}
+
+void QSGPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPathView);
+    if (d->interactive) {
+        d->handleMouseMoveEvent(event);
+        if (d->stealMouse)
+            setKeepMouseGrab(true);
+        event->accept();
+    } else {
+        QSGItem::mouseMoveEvent(event);
+    }
+}
+
+void QSGPathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_Q(QSGPathView);
+    if (!interactive || !lastPosTime.isValid())
+        return;
+
+    qreal newPc;
+    QPointF pathPoint = pointNear(event->pos(), &newPc);
+    if (!stealMouse) {
+        QPointF delta = pathPoint - startPoint;
+        if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) {
+            stealMouse = true;
+            startPc = newPc;
+        }
+    }
+
+    if (stealMouse) {
+        moveReason = QSGPathViewPrivate::Mouse;
+        qreal diff = (newPc - startPc)*modelCount*mappedRange;
+        if (diff) {
+            q->setOffset(offset + diff);
+
+            if (diff > modelCount/2)
+                diff -= modelCount;
+            else if (diff < -modelCount/2)
+                diff += modelCount;
+
+            lastElapsed = QSGItemPrivate::restart(lastPosTime);
+            lastDist = diff;
+            startPc = newPc;
+        }
+        if (!moving) {
+            moving = true;
+            emit q->movingChanged();
+            emit q->movementStarted();
+        }
+    }
+}
+
+void QSGPathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPathView);
+    if (d->interactive) {
+        d->handleMouseReleaseEvent(event);
+        event->accept();
+        ungrabMouse();
+    } else {
+        QSGItem::mouseReleaseEvent(event);
+    }
+}
+
+void QSGPathViewPrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *)
+{
+    Q_Q(QSGPathView);
+    stealMouse = false;
+    q->setKeepMouseGrab(false);
+    if (!interactive || !lastPosTime.isValid())
+        return;
+
+    qreal elapsed = qreal(lastElapsed + QSGItemPrivate::elapsed(lastPosTime)) / 1000.;
+    qreal velocity = elapsed > 0. ? lastDist / elapsed : 0;
+    if (model && modelCount && qAbs(velocity) > 1.) {
+        qreal count = pathItems == -1 ? modelCount : pathItems;
+        if (qAbs(velocity) > count * 2) // limit velocity
+            velocity = (velocity > 0 ? count : -count) * 2;
+        // Calculate the distance to be travelled
+        qreal v2 = velocity*velocity;
+        qreal accel = deceleration/10;
+        // + 0.25 to encourage moving at least one item in the flick direction
+        qreal dist = qMin(qreal(modelCount-1), qreal(v2 / (accel * 2.0) + 0.25));
+        if (haveHighlightRange && highlightRangeMode == QSGPathView::StrictlyEnforceRange) {
+            // round to nearest item.
+            if (velocity > 0.)
+                dist = qRound(dist + offset) - offset;
+            else
+                dist = qRound(dist - offset) + offset;
+            // Calculate accel required to stop on item boundary
+            if (dist <= 0.) {
+                dist = 0.;
+                accel = 0.;
+            } else {
+                accel = v2 / (2.0f * qAbs(dist));
+            }
+        }
+        offsetAdj = 0.0;
+        moveOffset.setValue(offset);
+        tl.accel(moveOffset, velocity, accel, dist);
+        tl.callback(QDeclarativeTimeLineCallback(&moveOffset, fixOffsetCallback, this));
+        if (!flicking) {
+            flicking = true;
+            emit q->flickingChanged();
+            emit q->flickStarted();
+        }
+    } else {
+        fixOffset();
+    }
+
+    lastPosTime.invalidate();
+    if (!tl.isActive())
+        q->movementEnding();
+}
+
+bool QSGPathView::sendMouseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPathView);
+    QGraphicsSceneMouseEvent mouseEvent(event->type());
+    QRectF myRect = mapRectToScene(QRectF(0, 0, width(), height()));
+    QSGCanvas *c = canvas();
+    QSGItem *grabber = c ? c->mouseGrabberItem() : 0;
+    bool stealThisEvent = d->stealMouse;
+    if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+        mouseEvent.setAccepted(false);
+        for (int i = 0x1; i <= 0x10; i <<= 1) {
+            if (event->buttons() & i) {
+                Qt::MouseButton button = Qt::MouseButton(i);
+                mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+            }
+        }
+        mouseEvent.setScenePos(event->scenePos());
+        mouseEvent.setLastScenePos(event->lastScenePos());
+        mouseEvent.setPos(mapFromScene(event->scenePos()));
+        mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+        switch(mouseEvent.type()) {
+        case QEvent::GraphicsSceneMouseMove:
+            d->handleMouseMoveEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMousePress:
+            d->handleMousePressEvent(&mouseEvent);
+            stealThisEvent = d->stealMouse;   // Update stealThisEvent in case changed by function call above
+            break;
+        case QEvent::GraphicsSceneMouseRelease:
+            d->handleMouseReleaseEvent(&mouseEvent);
+            break;
+        default:
+            break;
+        }
+        grabber = c->mouseGrabberItem();
+        if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
+            grabMouse();
+
+        return d->stealMouse;
+    } else if (d->lastPosTime.isValid()) {
+        d->lastPosTime.invalidate();
+    }
+    if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease)
+        d->stealMouse = false;
+    return false;
+}
+
+bool QSGPathView::childMouseEventFilter(QSGItem *i, QEvent *e)
+{
+    Q_D(QSGPathView);
+    if (!isVisible() || !d->interactive)
+        return QSGItem::childMouseEventFilter(i, e);
+
+    switch (e->type()) {
+    case QEvent::GraphicsSceneMousePress:
+    case QEvent::GraphicsSceneMouseMove:
+    case QEvent::GraphicsSceneMouseRelease:
+        return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
+    default:
+        break;
+    }
+
+    return QSGItem::childMouseEventFilter(i, e);
+}
+
+void QSGPathView::updatePolish()
+{
+    QSGItem::updatePolish();
+    refill();
+}
+
+void QSGPathView::componentComplete()
+{
+    Q_D(QSGPathView);
+    QSGItem::componentComplete();
+    d->createHighlight();
+    // It is possible that a refill has already happended to to Path
+    // bindings being handled in the componentComplete().  If so
+    // don't do it again.
+    if (d->items.count() == 0 && d->model) {
+        d->modelCount = d->model->count();
+        d->regenerate();
+    }
+    d->updateHighlight();
+}
+
+void QSGPathView::refill()
+{
+    Q_D(QSGPathView);
+    if (!d->isValid() || !isComponentComplete())
+        return;
+
+    d->layoutScheduled = false;
+    bool currentVisible = false;
+
+    // first move existing items and remove items off path
+    int idx = d->firstIndex;
+    QList<QSGItem*>::iterator it = d->items.begin();
+    while (it != d->items.end()) {
+        qreal pos = d->positionOfIndex(idx);
+        QSGItem *item = *it;
+        if (pos >= 0.0) {
+            d->updateItem(item, pos);
+            if (idx == d->currentIndex) {
+                currentVisible = true;
+                d->currentItemOffset = pos;
+            }
+            ++it;
+        } else {
+//            qDebug() << "release";
+            d->updateItem(item, 1.0);
+            d->releaseItem(item);
+            if (it == d->items.begin()) {
+                if (++d->firstIndex >= d->modelCount)
+                    d->firstIndex = 0;
+            }
+            it = d->items.erase(it);
+        }
+        ++idx;
+        if (idx >= d->modelCount)
+            idx = 0;
+    }
+    if (!d->items.count())
+        d->firstIndex = -1;
+
+    if (d->modelCount) {
+        // add items to beginning and end
+        int count = d->pathItems == -1 ? d->modelCount : qMin(d->pathItems, d->modelCount);
+        if (d->items.count() < count) {
+            int idx = qRound(d->modelCount - d->offset) % d->modelCount;
+            qreal startPos = 0.0;
+            if (d->haveHighlightRange && d->highlightRangeMode != QSGPathView::NoHighlightRange)
+                startPos = d->highlightRangeStart;
+            if (d->firstIndex >= 0) {
+                startPos = d->positionOfIndex(d->firstIndex);
+                idx = (d->firstIndex + d->items.count()) % d->modelCount;
+            }
+            qreal pos = d->positionOfIndex(idx);
+            while ((pos > startPos || !d->items.count()) && d->items.count() < count) {
+    //            qDebug() << "append" << idx;
+                QSGItem *item = d->getItem(idx);
+                if (d->model->completePending())
+                    item->setZ(idx+1);
+                if (d->currentIndex == idx) {
+                    item->setFocus(true);
+                    if (QSGPathViewAttached *att = d->attached(item))
+                        att->setIsCurrentItem(true);
+                    currentVisible = true;
+                    d->currentItemOffset = pos;
+                    d->currentItem = item;
+                }
+                if (d->items.count() == 0)
+                    d->firstIndex = idx;
+                d->items.append(item);
+                d->updateItem(item, pos);
+                if (d->model->completePending())
+                    d->model->completeItem();
+                ++idx;
+                if (idx >= d->modelCount)
+                    idx = 0;
+                pos = d->positionOfIndex(idx);
+            }
+
+            idx = d->firstIndex - 1;
+            if (idx < 0)
+                idx = d->modelCount - 1;
+            pos = d->positionOfIndex(idx);
+            while (pos >= 0.0 && pos < startPos) {
+    //            qDebug() << "prepend" << idx;
+                QSGItem *item = d->getItem(idx);
+                if (d->model->completePending())
+                    item->setZ(idx+1);
+                if (d->currentIndex == idx) {
+                    item->setFocus(true);
+                    if (QSGPathViewAttached *att = d->attached(item))
+                        att->setIsCurrentItem(true);
+                    currentVisible = true;
+                    d->currentItemOffset = pos;
+                    d->currentItem = item;
+                }
+                d->items.prepend(item);
+                d->updateItem(item, pos);
+                if (d->model->completePending())
+                    d->model->completeItem();
+                d->firstIndex = idx;
+                idx = d->firstIndex - 1;
+                if (idx < 0)
+                    idx = d->modelCount - 1;
+                pos = d->positionOfIndex(idx);
+            }
+        }
+    }
+
+    if (!currentVisible)
+        d->currentItemOffset = 1.0;
+
+    if (d->highlightItem && d->haveHighlightRange && d->highlightRangeMode == QSGPathView::StrictlyEnforceRange) {
+        d->updateItem(d->highlightItem, d->highlightRangeStart);
+        if (QSGPathViewAttached *att = d->attached(d->highlightItem))
+            att->setOnPath(true);
+    } else if (d->highlightItem && d->moveReason != QSGPathViewPrivate::SetIndex) {
+        d->updateItem(d->highlightItem, d->currentItemOffset);
+        if (QSGPathViewAttached *att = d->attached(d->highlightItem))
+            att->setOnPath(currentVisible);
+    }
+    while (d->itemCache.count())
+        d->releaseItem(d->itemCache.takeLast());
+}
+
+void QSGPathView::itemsInserted(int modelIndex, int count)
+{
+    //XXX support animated insertion
+    Q_D(QSGPathView);
+    if (!d->isValid() || !isComponentComplete())
+        return;
+
+    if (d->modelCount) {
+        d->itemCache += d->items;
+        d->items.clear();
+        if (modelIndex <= d->currentIndex) {
+            d->currentIndex += count;
+            emit currentIndexChanged();
+        } else if (d->offset != 0) {
+            d->offset += count;
+            d->offsetAdj += count;
+        }
+    }
+
+    d->modelCount += count;
+    if (d->flicking || d->moving) {
+        d->regenerate();
+        d->updateCurrent();
+    } else {
+        d->firstIndex = -1;
+        d->updateMappedRange();
+        d->scheduleLayout();
+    }
+    emit countChanged();
+}
+
+void QSGPathView::itemsRemoved(int modelIndex, int count)
+{
+    //XXX support animated removal
+    Q_D(QSGPathView);
+    if (!d->model || !d->modelCount || !d->model->isValid() || !d->path || !isComponentComplete())
+        return;
+
+    // fix current
+    bool currentChanged = false;
+    if (d->currentIndex >= modelIndex + count) {
+        d->currentIndex -= count;
+        currentChanged = true;
+    } else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
+        // current item has been removed.
+        d->currentIndex = qMin(modelIndex, d->modelCount-count-1);
+        if (d->currentItem) {
+            if (QSGPathViewAttached *att = d->attached(d->currentItem))
+                att->setIsCurrentItem(true);
+        }
+        currentChanged = true;
+    }
+
+    d->itemCache += d->items;
+    d->items.clear();
+
+    bool changedOffset = false;
+    if (modelIndex > d->currentIndex) {
+        if (d->offset >= count) {
+            changedOffset = true;
+            d->offset -= count;
+            d->offsetAdj -= count;
+        }
+    }
+
+    d->modelCount -= count;
+    if (!d->modelCount) {
+        while (d->itemCache.count())
+            d->releaseItem(d->itemCache.takeLast());
+        d->offset = 0;
+        changedOffset = true;
+        d->tl.reset(d->moveOffset);
+    } else {
+        d->regenerate();
+        d->updateCurrent();
+    }
+    if (changedOffset)
+        emit offsetChanged();
+    if (currentChanged)
+        emit currentIndexChanged();
+    emit countChanged();
+}
+
+void QSGPathView::itemsMoved(int /*from*/, int /*to*/, int /*count*/)
+{
+    Q_D(QSGPathView);
+    if (!d->isValid() || !isComponentComplete())
+        return;
+
+    QList<QSGItem *> removedItems = d->items;
+    d->items.clear();
+    d->regenerate();
+    while (removedItems.count())
+        d->releaseItem(removedItems.takeLast());
+
+    // Fix current index
+    if (d->currentIndex >= 0 && d->currentItem) {
+        int oldCurrent = d->currentIndex;
+        d->currentIndex = d->model->indexOf(d->currentItem, this);
+        if (oldCurrent != d->currentIndex)
+            emit currentIndexChanged();
+    }
+    d->updateCurrent();
+}
+
+void QSGPathView::modelReset()
+{
+    Q_D(QSGPathView);
+    d->modelCount = d->model->count();
+    d->regenerate();
+    emit countChanged();
+}
+
+void QSGPathView::createdItem(int index, QSGItem *item)
+{
+    Q_D(QSGPathView);
+    if (d->requestedIndex != index) {
+        if (!d->attType) {
+            // pre-create one metatype to share with all attached objects
+            d->attType = new QDeclarativeOpenMetaObjectType(&QSGPathViewAttached::staticMetaObject, qmlEngine(this));
+            foreach(const QString &attr, d->path->attributes())
+                d->attType->createProperty(attr.toUtf8());
+        }
+        qPathViewAttachedType = d->attType;
+        QSGPathViewAttached *att = static_cast<QSGPathViewAttached *>(qmlAttachedPropertiesObject<QSGPathView>(item));
+        qPathViewAttachedType = 0;
+        if (att) {
+            att->m_view = this;
+            att->setOnPath(false);
+        }
+        item->setParentItem(this);
+        d->updateItem(item, index < d->firstIndex ? 0.0 : 1.0);
+    }
+}
+
+void QSGPathView::destroyingItem(QSGItem *item)
+{
+    Q_UNUSED(item);
+}
+
+void QSGPathView::ticked()
+{
+    Q_D(QSGPathView);
+    d->updateCurrent();
+}
+
+void QSGPathView::movementEnding()
+{
+    Q_D(QSGPathView);
+    if (d->flicking) {
+        d->flicking = false;
+        emit flickingChanged();
+        emit flickEnded();
+    }
+    if (d->moving && !d->stealMouse) {
+        d->moving = false;
+        emit movingChanged();
+        emit movementEnded();
+    }
+}
+
+// find the item closest to the snap position
+int QSGPathViewPrivate::calcCurrentIndex()
+{
+    int current = -1;
+    if (modelCount && model && items.count()) {
+        offset = qmlMod(offset, modelCount);
+        if (offset < 0)
+            offset += modelCount;
+        current = qRound(qAbs(qmlMod(modelCount - offset, modelCount)));
+        current = current % modelCount;
+    }
+
+    return current;
+}
+
+void QSGPathViewPrivate::updateCurrent()
+{
+    Q_Q(QSGPathView);
+    if (moveReason != Mouse)
+        return;
+    if (!modelCount || !haveHighlightRange || highlightRangeMode != QSGPathView::StrictlyEnforceRange)
+        return;
+
+    int idx = calcCurrentIndex();
+    if (model && idx != currentIndex) {
+        int itemIndex = (currentIndex - firstIndex + modelCount) % modelCount;
+        if (itemIndex < items.count()) {
+            if (QSGItem *item = items.at(itemIndex)) {
+                if (QSGPathViewAttached *att = attached(item))
+                    att->setIsCurrentItem(false);
+            }
+        }
+        currentIndex = idx;
+        currentItem = 0;
+        itemIndex = (idx - firstIndex + modelCount) % modelCount;
+        if (itemIndex < items.count()) {
+            currentItem = items.at(itemIndex);
+            currentItem->setFocus(true);
+            if (QSGPathViewAttached *att = attached(currentItem))
+                att->setIsCurrentItem(true);
+        }
+        emit q->currentIndexChanged();
+    }
+}
+
+void QSGPathViewPrivate::fixOffsetCallback(void *d)
+{
+    ((QSGPathViewPrivate *)d)->fixOffset();
+}
+
+void QSGPathViewPrivate::fixOffset()
+{
+    Q_Q(QSGPathView);
+    if (model && items.count()) {
+        if (haveHighlightRange && highlightRangeMode == QSGPathView::StrictlyEnforceRange) {
+            int curr = calcCurrentIndex();
+            if (curr != currentIndex)
+                q->setCurrentIndex(curr);
+            else
+                snapToCurrent();
+        }
+    }
+}
+
+void QSGPathViewPrivate::snapToCurrent()
+{
+    if (!model || modelCount <= 0)
+        return;
+
+    qreal targetOffset = qmlMod(modelCount - currentIndex, modelCount);
+
+    moveReason = Other;
+    offsetAdj = 0.0;
+    tl.reset(moveOffset);
+    moveOffset.setValue(offset);
+
+    const int duration = highlightMoveDuration;
+
+    if (moveDirection == Positive || (moveDirection == Shortest && targetOffset - offset > modelCount/2)) {
+        qreal distance = modelCount - targetOffset + offset;
+        if (targetOffset > moveOffset) {
+            tl.move(moveOffset, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * offset / distance));
+            tl.set(moveOffset, modelCount);
+            tl.move(moveOffset, targetOffset, QEasingCurve(offset == 0.0 ? QEasingCurve::InOutQuad : QEasingCurve::OutQuad), int(duration * (modelCount-targetOffset) / distance));
+        } else {
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
+        }
+    } else if (moveDirection == Negative || targetOffset - offset <= -modelCount/2) {
+        qreal distance = modelCount - offset + targetOffset;
+        if (targetOffset < moveOffset) {
+            tl.move(moveOffset, modelCount, QEasingCurve(targetOffset == 0 ? QEasingCurve::InOutQuad : QEasingCurve::InQuad), int(duration * (modelCount-offset) / distance));
+            tl.set(moveOffset, 0.0);
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * targetOffset / distance));
+        } else {
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
+        }
+    } else {
+        tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
+    }
+    moveDirection = Shortest;
+}
+
+QSGPathViewAttached *QSGPathView::qmlAttachedProperties(QObject *obj)
+{
+    return new QSGPathViewAttached(obj);
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/items/qsgpathview_p.h b/src/declarative/items/qsgpathview_p.h
new file mode 100644
index 0000000000..d75063395a
--- /dev/null
+++ b/src/declarative/items/qsgpathview_p.h
@@ -0,0 +1,254 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPATHVIEW_P_H
+#define QSGPATHVIEW_P_H
+
+#include "qsgitem.h"
+
+#include <private/qdeclarativepath_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGPathViewPrivate;
+class QSGPathViewAttached;
+class Q_AUTOTEST_EXPORT QSGPathView : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(QDeclarativePath *path READ path WRITE setPath NOTIFY pathChanged)
+    Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
+    Q_PROPERTY(qreal offset READ offset WRITE setOffset NOTIFY offsetChanged)
+
+    Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
+    Q_PROPERTY(QSGItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
+
+    Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged)
+    Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged)
+    Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
+    Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
+
+    Q_PROPERTY(qreal dragMargin READ dragMargin WRITE setDragMargin NOTIFY dragMarginChanged)
+    Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
+    Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
+
+    Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
+    Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
+
+    Q_PROPERTY(int count READ count NOTIFY countChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_PROPERTY(int pathItemCount READ pathItemCount WRITE setPathItemCount NOTIFY pathItemCountChanged)
+
+    Q_ENUMS(HighlightRangeMode)
+
+public:
+    QSGPathView(QSGItem *parent=0);
+    virtual ~QSGPathView();
+
+    QVariant model() const;
+    void setModel(const QVariant &);
+
+    QDeclarativePath *path() const;
+    void setPath(QDeclarativePath *);
+
+    int currentIndex() const;
+    void setCurrentIndex(int idx);
+
+    qreal offset() const;
+    void setOffset(qreal offset);
+
+    QDeclarativeComponent *highlight() const;
+    void setHighlight(QDeclarativeComponent *highlight);
+    QSGItem *highlightItem();
+
+    enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
+    HighlightRangeMode highlightRangeMode() const;
+    void setHighlightRangeMode(HighlightRangeMode mode);
+
+    qreal preferredHighlightBegin() const;
+    void setPreferredHighlightBegin(qreal);
+
+    qreal preferredHighlightEnd() const;
+    void setPreferredHighlightEnd(qreal);
+
+    int highlightMoveDuration() const;
+    void setHighlightMoveDuration(int);
+
+    qreal dragMargin() const;
+    void setDragMargin(qreal margin);
+
+    qreal flickDeceleration() const;
+    void setFlickDeceleration(qreal dec);
+
+    bool isInteractive() const;
+    void setInteractive(bool);
+
+    bool isMoving() const;
+    bool isFlicking() const;
+
+    int count() const;
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    int pathItemCount() const;
+    void setPathItemCount(int);
+
+    static QSGPathViewAttached *qmlAttachedProperties(QObject *);
+
+public Q_SLOTS:
+    void incrementCurrentIndex();
+    void decrementCurrentIndex();
+
+Q_SIGNALS:
+    void currentIndexChanged();
+    void offsetChanged();
+    void modelChanged();
+    void countChanged();
+    void pathChanged();
+    void preferredHighlightBeginChanged();
+    void preferredHighlightEndChanged();
+    void highlightRangeModeChanged();
+    void dragMarginChanged();
+    void snapPositionChanged();
+    void delegateChanged();
+    void pathItemCountChanged();
+    void flickDecelerationChanged();
+    void interactiveChanged();
+    void movingChanged();
+    void flickingChanged();
+    void highlightChanged();
+    void highlightItemChanged();
+    void highlightMoveDurationChanged();
+    void movementStarted();
+    void movementEnded();
+    void flickStarted();
+    void flickEnded();
+
+protected:
+    virtual void updatePolish();
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
+    bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
+    bool childMouseEventFilter(QSGItem *, QEvent *);
+    void componentComplete();
+
+private Q_SLOTS:
+    void refill();
+    void ticked();
+    void movementEnding();
+    void itemsInserted(int index, int count);
+    void itemsRemoved(int index, int count);
+    void itemsMoved(int,int,int);
+    void modelReset();
+    void createdItem(int index, QSGItem *item);
+    void destroyingItem(QSGItem *item);
+    void pathUpdated();
+
+private:
+    friend class QSGPathViewAttached;
+    Q_DISABLE_COPY(QSGPathView)
+    Q_DECLARE_PRIVATE(QSGPathView)
+};
+
+class QDeclarativeOpenMetaObject;
+class QSGPathViewAttached : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QSGPathView *view READ view CONSTANT)
+    Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
+    Q_PROPERTY(bool onPath READ isOnPath NOTIFY pathChanged)
+
+public:
+    QSGPathViewAttached(QObject *parent);
+    ~QSGPathViewAttached();
+
+    QSGPathView *view() { return m_view; }
+
+    bool isCurrentItem() const { return m_isCurrent; }
+    void setIsCurrentItem(bool c) {
+        if (m_isCurrent != c) {
+            m_isCurrent = c;
+            emit currentItemChanged();
+        }
+    }
+
+    QVariant value(const QByteArray &name) const;
+    void setValue(const QByteArray &name, const QVariant &val);
+
+    bool isOnPath() const { return m_onPath; }
+    void setOnPath(bool on) {
+        if (on != m_onPath) {
+            m_onPath = on;
+            emit pathChanged();
+        }
+    }
+    qreal m_percent;
+
+Q_SIGNALS:
+    void currentItemChanged();
+    void pathChanged();
+
+private:
+    friend class QSGPathViewPrivate;
+    friend class QSGPathView;
+    QSGPathView *m_view;
+    QDeclarativeOpenMetaObject *m_metaobject;
+    bool m_onPath : 1;
+    bool m_isCurrent : 1;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGPathView)
+QML_DECLARE_TYPEINFO(QSGPathView, QML_HAS_ATTACHED_PROPERTIES)
+QT_END_HEADER
+
+#endif // QSGPATHVIEW_P_H
diff --git a/src/declarative/items/qsgpathview_p_p.h b/src/declarative/items/qsgpathview_p_p.h
new file mode 100644
index 0000000000..ed54f29abe
--- /dev/null
+++ b/src/declarative/items/qsgpathview_p_p.h
@@ -0,0 +1,193 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEPATHVIEW_P_H
+#define QDECLARATIVEPATHVIEW_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgpathview_p.h"
+#include "qsgitem_p.h"
+#include "qsgvisualitemmodel_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtCore/qdatetime.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <private/qdeclarativeanimation_p_p.h>
+#include <private/qdeclarativeguard_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeOpenMetaObjectType;
+class QSGPathViewAttached;
+class QSGPathViewPrivate : public QSGItemPrivate, public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGPathView)
+
+public:
+    QSGPathViewPrivate()
+      : path(0), currentIndex(0), currentItemOffset(0.0), startPc(0), lastDist(0)
+        , lastElapsed(0), offset(0.0), offsetAdj(0.0), mappedRange(1.0)
+        , stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true)
+        , autoHighlight(true), highlightUp(false), layoutScheduled(false)
+        , moving(false), flicking(false)
+        , dragMargin(0), deceleration(100)
+        , moveOffset(this, &QSGPathViewPrivate::setAdjustedOffset)
+        , firstIndex(-1), pathItems(-1), requestedIndex(-1)
+        , moveReason(Other), moveDirection(Shortest), attType(0), highlightComponent(0), highlightItem(0)
+        , moveHighlight(this, &QSGPathViewPrivate::setHighlightPosition)
+        , highlightPosition(0)
+        , highlightRangeStart(0), highlightRangeEnd(0)
+        , highlightRangeMode(QSGPathView::StrictlyEnforceRange)
+        , highlightMoveDuration(300), modelCount(0)
+    {
+    }
+
+    void init();
+
+    void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
+        if ((newGeometry.size() != oldGeometry.size())
+            && (!highlightItem || item != highlightItem)) {
+            if (QSGPathViewAttached *att = attached(item))
+                att->m_percent = -1;
+            scheduleLayout();
+        }
+    }
+
+    void scheduleLayout() {
+        Q_Q(QSGPathView);
+        if (!layoutScheduled) {
+            layoutScheduled = true;
+            q->polish();
+        }
+    }
+
+    QSGItem *getItem(int modelIndex);
+    void releaseItem(QSGItem *item);
+    QSGPathViewAttached *attached(QSGItem *item);
+    void clear();
+    void updateMappedRange();
+    qreal positionOfIndex(qreal index) const;
+    void createHighlight();
+    void updateHighlight();
+    void setHighlightPosition(qreal pos);
+    bool isValid() const {
+        return model && model->count() > 0 && model->isValid() && path;
+    }
+
+    void handleMousePressEvent(QGraphicsSceneMouseEvent *event);
+    void handleMouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void handleMouseReleaseEvent(QGraphicsSceneMouseEvent *);
+
+    int calcCurrentIndex();
+    void updateCurrent();
+    static void fixOffsetCallback(void*);
+    void fixOffset();
+    void setOffset(qreal offset);
+    void setAdjustedOffset(qreal offset);
+    void regenerate();
+    void updateItem(QSGItem *, qreal);
+    void snapToCurrent();
+    QPointF pointNear(const QPointF &point, qreal *nearPercent=0) const;
+
+    QDeclarativePath *path;
+    int currentIndex;
+    QDeclarativeGuard<QSGItem> currentItem;
+    qreal currentItemOffset;
+    qreal startPc;
+    QPointF startPoint;
+    qreal lastDist;
+    int lastElapsed;
+    qreal offset;
+    qreal offsetAdj;
+    qreal mappedRange;
+    bool stealMouse : 1;
+    bool ownModel : 1;
+    bool interactive : 1;
+    bool haveHighlightRange : 1;
+    bool autoHighlight : 1;
+    bool highlightUp : 1;
+    bool layoutScheduled : 1;
+    bool moving : 1;
+    bool flicking : 1;
+    QElapsedTimer lastPosTime;
+    QPointF lastPos;
+    qreal dragMargin;
+    qreal deceleration;
+    QDeclarativeTimeLine tl;
+    QDeclarativeTimeLineValueProxy<QSGPathViewPrivate> moveOffset;
+    int firstIndex;
+    int pathItems;
+    int requestedIndex;
+    QList<QSGItem *> items;
+    QList<QSGItem *> itemCache;
+    QDeclarativeGuard<QSGVisualModel> model;
+    QVariant modelVariant;
+    enum MovementReason { Other, SetIndex, Mouse };
+    MovementReason moveReason;
+    enum MovementDirection { Shortest, Negative, Positive };
+    MovementDirection moveDirection;
+    QDeclarativeOpenMetaObjectType *attType;
+    QDeclarativeComponent *highlightComponent;
+    QSGItem *highlightItem;
+    QDeclarativeTimeLineValueProxy<QSGPathViewPrivate> moveHighlight;
+    qreal highlightPosition;
+    qreal highlightRangeStart;
+    qreal highlightRangeEnd;
+    QSGPathView::HighlightRangeMode highlightRangeMode;
+    int highlightMoveDuration;
+    int modelCount;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/declarative/items/qsgpincharea.cpp b/src/declarative/items/qsgpincharea.cpp
new file mode 100644
index 0000000000..e32f6bfe71
--- /dev/null
+++ b/src/declarative/items/qsgpincharea.cpp
@@ -0,0 +1,407 @@
+// Commit: 2ec2dc55ddf424f5a7acd0a4729ddd9af2d7c398
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtSG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgpincharea_p_p.h"
+#include "qsgcanvas.h"
+
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qapplication.h>
+
+#include <float.h>
+#include <math.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGPinch::QSGPinch()
+    : m_target(0), m_minScale(1.0), m_maxScale(1.0)
+    , m_minRotation(0.0), m_maxRotation(0.0)
+    , m_axis(NoDrag), m_xmin(-FLT_MAX), m_xmax(FLT_MAX)
+    , m_ymin(-FLT_MAX), m_ymax(FLT_MAX), m_active(false)
+{
+}
+
+QSGPinchAreaPrivate::~QSGPinchAreaPrivate()
+{
+    delete pinch;
+}
+
+QSGPinchArea::QSGPinchArea(QSGItem *parent)
+  : QSGItem(*(new QSGPinchAreaPrivate), parent)
+{
+    Q_D(QSGPinchArea);
+    d->init();
+}
+
+QSGPinchArea::~QSGPinchArea()
+{
+}
+
+bool QSGPinchArea::isEnabled() const
+{
+    Q_D(const QSGPinchArea);
+    return d->absorb;
+}
+
+void QSGPinchArea::setEnabled(bool a)
+{
+    Q_D(QSGPinchArea);
+    if (a != d->absorb) {
+        d->absorb = a;
+        emit enabledChanged();
+    }
+}
+
+void QSGPinchArea::touchEvent(QTouchEvent *event)
+{
+    Q_D(QSGPinchArea);
+    if (!d->absorb || !isVisible()) {
+        QSGItem::event(event);
+        return;
+    }
+
+    switch (event->type()) {
+    case QEvent::TouchBegin:
+    case QEvent::TouchUpdate:
+        d->touchPoints.clear();
+        for (int i = 0; i < event->touchPoints().count(); ++i) {
+            if (!(event->touchPoints().at(i).state() & Qt::TouchPointReleased)) {
+                d->touchPoints << event->touchPoints().at(i);
+            }
+        }
+        updatePinch();
+        break;
+    case QEvent::TouchEnd:
+        d->touchPoints.clear();
+        updatePinch();
+        break;
+    default:
+        QSGItem::event(event);
+    }
+}
+
+void QSGPinchArea::updatePinch()
+{
+    Q_D(QSGPinchArea);
+    if (d->touchPoints.count() != 2) {
+        if (d->inPinch) {
+            d->stealMouse = false;
+            setKeepMouseGrab(false);
+            d->inPinch = false;
+            QPointF pinchCenter = mapFromScene(d->sceneLastCenter);
+            QSGPinchEvent pe(pinchCenter, d->pinchLastScale, d->pinchLastAngle, d->pinchRotation);
+            pe.setStartCenter(d->pinchStartCenter);
+            pe.setPreviousCenter(pinchCenter);
+            pe.setPreviousAngle(d->pinchLastAngle);
+            pe.setPreviousScale(d->pinchLastScale);
+            pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+            pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+            pe.setPoint1(d->lastPoint1);
+            pe.setPoint2(d->lastPoint2);
+            emit pinchFinished(&pe);
+            d->pinchStartDist = 0;
+            if (d->pinch && d->pinch->target())
+                d->pinch->setActive(false);
+        }
+        return;
+    }
+    if (d->touchPoints.at(0).state() & Qt::TouchPointPressed
+        || d->touchPoints.at(1).state() & Qt::TouchPointPressed) {
+        d->sceneStartPoint1 = d->touchPoints.at(0).scenePos();
+        d->sceneStartPoint2 = d->touchPoints.at(1).scenePos();
+        d->inPinch = false;
+        d->pinchRejected = false;
+    } else if (!d->pinchRejected){
+        QSGItem *grabber = canvas() ? canvas()->mouseGrabberItem() : 0;
+        if (grabber == this || !grabber || !grabber->keepMouseGrab()) {
+            const int dragThreshold = QApplication::startDragDistance();
+            QPointF p1 = d->touchPoints.at(0).scenePos();
+            QPointF p2 = d->touchPoints.at(1).scenePos();
+            qreal dx = p1.x() - p2.x();
+            qreal dy = p1.y() - p2.y();
+            qreal dist = sqrt(dx*dx + dy*dy);
+            QPointF sceneCenter = (p1 + p2)/2;
+            qreal angle = QLineF(p1, p2).angle();
+            if (angle > 180)
+                angle -= 360;
+            if (!d->inPinch) {
+                if (qAbs(p1.x()-d->sceneStartPoint1.x()) > dragThreshold
+                        || qAbs(p1.y()-d->sceneStartPoint1.y()) > dragThreshold
+                        || qAbs(p2.x()-d->sceneStartPoint2.x()) > dragThreshold
+                        || qAbs(p2.y()-d->sceneStartPoint2.y()) > dragThreshold) {
+                    d->sceneStartCenter = sceneCenter;
+                    d->sceneLastCenter = sceneCenter;
+                    d->pinchStartCenter = mapFromScene(sceneCenter);
+                    d->pinchStartDist = dist;
+                    d->pinchStartAngle = angle;
+                    d->pinchLastScale = 1.0;
+                    d->pinchLastAngle = angle;
+                    d->pinchRotation = 0.0;
+                    d->lastPoint1 = d->touchPoints.at(0).pos();
+                    d->lastPoint2 = d->touchPoints.at(1).pos();
+                    QSGPinchEvent pe(d->pinchStartCenter, 1.0, angle, 0.0);
+                    pe.setStartCenter(d->pinchStartCenter);
+                    pe.setPreviousCenter(d->pinchStartCenter);
+                    pe.setPreviousAngle(d->pinchLastAngle);
+                    pe.setPreviousScale(d->pinchLastScale);
+                    pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+                    pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+                    pe.setPoint1(d->lastPoint1);
+                    pe.setPoint2(d->lastPoint2);
+                    emit pinchStarted(&pe);
+                    if (pe.accepted()) {
+                        d->inPinch = true;
+                        d->stealMouse = true;
+                        QSGCanvas *c = canvas();
+                        if (c && c->mouseGrabberItem() != this)
+                            grabMouse();
+                        setKeepMouseGrab(true);
+                        if (d->pinch && d->pinch->target()) {
+                            d->pinchStartPos = pinch()->target()->pos();
+                            d->pinchStartScale = d->pinch->target()->scale();
+                            d->pinchStartRotation = d->pinch->target()->rotation();
+                            d->pinch->setActive(true);
+                        }
+                    } else {
+                        d->pinchRejected = true;
+                    }
+                }
+            } else if (d->pinchStartDist > 0) {
+                qreal scale = dist / d->pinchStartDist;
+                qreal da = d->pinchLastAngle - angle;
+                if (da > 180)
+                    da -= 360;
+                else if (da < -180)
+                    da += 360;
+                d->pinchRotation += da;
+                QPointF pinchCenter = mapFromScene(sceneCenter);
+                QSGPinchEvent pe(pinchCenter, scale, angle, d->pinchRotation);
+                pe.setStartCenter(d->pinchStartCenter);
+                pe.setPreviousCenter(mapFromScene(d->sceneLastCenter));
+                pe.setPreviousAngle(d->pinchLastAngle);
+                pe.setPreviousScale(d->pinchLastScale);
+                pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+                pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+                pe.setPoint1(d->touchPoints.at(0).pos());
+                pe.setPoint2(d->touchPoints.at(1).pos());
+                d->pinchLastScale = scale;
+                d->sceneLastCenter = sceneCenter;
+                d->pinchLastAngle = angle;
+                d->lastPoint1 = d->touchPoints.at(0).pos();
+                d->lastPoint2 = d->touchPoints.at(1).pos();
+                emit pinchUpdated(&pe);
+                if (d->pinch && d->pinch->target()) {
+                    qreal s = d->pinchStartScale * scale;
+                    s = qMin(qMax(pinch()->minimumScale(),s), pinch()->maximumScale());
+                    pinch()->target()->setScale(s);
+                    QPointF pos = sceneCenter - d->sceneStartCenter + d->pinchStartPos;
+                    if (pinch()->axis() & QSGPinch::XAxis) {
+                        qreal x = pos.x();
+                        if (x < pinch()->xmin())
+                            x = pinch()->xmin();
+                        else if (x > pinch()->xmax())
+                            x = pinch()->xmax();
+                        pinch()->target()->setX(x);
+                    }
+                    if (pinch()->axis() & QSGPinch::YAxis) {
+                        qreal y = pos.y();
+                        if (y < pinch()->ymin())
+                            y = pinch()->ymin();
+                        else if (y > pinch()->ymax())
+                            y = pinch()->ymax();
+                        pinch()->target()->setY(y);
+                    }
+                    if (d->pinchStartRotation >= pinch()->minimumRotation()
+                            && d->pinchStartRotation <= pinch()->maximumRotation()) {
+                        qreal r = d->pinchRotation + d->pinchStartRotation;
+                        r = qMin(qMax(pinch()->minimumRotation(),r), pinch()->maximumRotation());
+                        pinch()->target()->setRotation(r);
+                    }
+                }
+            }
+        }
+    }
+}
+
+void QSGPinchArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPinchArea);
+    d->stealMouse = false;
+    if (!d->absorb)
+        QSGItem::mousePressEvent(event);
+    else {
+        setKeepMouseGrab(false);
+        event->setAccepted(true);
+    }
+}
+
+void QSGPinchArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPinchArea);
+    if (!d->absorb) {
+        QSGItem::mouseMoveEvent(event);
+        return;
+    }
+}
+
+void QSGPinchArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPinchArea);
+    d->stealMouse = false;
+    if (!d->absorb) {
+        QSGItem::mouseReleaseEvent(event);
+    } else {
+        QSGCanvas *c = canvas();
+        if (c && c->mouseGrabberItem() == this)
+            ungrabMouse();
+        setKeepMouseGrab(false);
+    }
+}
+
+void QSGPinchArea::mouseUngrabEvent()
+{
+    setKeepMouseGrab(false);
+}
+
+bool QSGPinchArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGPinchArea);
+    QGraphicsSceneMouseEvent mouseEvent(event->type());
+    QRectF myRect = mapRectToScene(QRectF(0, 0, width(), height()));
+
+    QSGCanvas *c = canvas();
+    QSGItem *grabber = c ? c->mouseGrabberItem() : 0;
+    bool stealThisEvent = d->stealMouse;
+    if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+        mouseEvent.setAccepted(false);
+        for (int i = 0x1; i <= 0x10; i <<= 1) {
+            if (event->buttons() & i) {
+                Qt::MouseButton button = Qt::MouseButton(i);
+                mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+            }
+        }
+        mouseEvent.setScenePos(event->scenePos());
+        mouseEvent.setLastScenePos(event->lastScenePos());
+        mouseEvent.setPos(mapFromScene(event->scenePos()));
+        mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+        switch(mouseEvent.type()) {
+        case QEvent::GraphicsSceneMouseMove:
+            mouseMoveEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMousePress:
+            mousePressEvent(&mouseEvent);
+            break;
+        case QEvent::GraphicsSceneMouseRelease:
+            mouseReleaseEvent(&mouseEvent);
+            break;
+        default:
+            break;
+        }
+        grabber = c->mouseGrabberItem();
+        if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
+            grabMouse();
+
+        return stealThisEvent;
+    }
+    if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
+        d->stealMouse = false;
+        if (c && c->mouseGrabberItem() == this)
+            ungrabMouse();
+        setKeepMouseGrab(false);
+    }
+    return false;
+}
+
+bool QSGPinchArea::childMouseEventFilter(QSGItem *i, QEvent *e)
+{
+    Q_D(QSGPinchArea);
+    if (!d->absorb || !isVisible())
+        return QSGItem::childMouseEventFilter(i, e);
+    switch (e->type()) {
+    case QEvent::GraphicsSceneMousePress:
+    case QEvent::GraphicsSceneMouseMove:
+    case QEvent::GraphicsSceneMouseRelease:
+        return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
+        break;
+    case QEvent::TouchBegin:
+    case QEvent::TouchUpdate: {
+            QTouchEvent *touch = static_cast<QTouchEvent*>(e);
+            d->touchPoints.clear();
+            for (int i = 0; i < touch->touchPoints().count(); ++i)
+                if (!(touch->touchPoints().at(i).state() & Qt::TouchPointReleased))
+                    d->touchPoints << touch->touchPoints().at(i);
+            updatePinch();
+        }
+        return d->inPinch;
+    case QEvent::TouchEnd:
+        d->touchPoints.clear();
+        updatePinch();
+        break;
+    default:
+        break;
+    }
+
+    return QSGItem::childMouseEventFilter(i, e);
+}
+
+void QSGPinchArea::geometryChanged(const QRectF &newGeometry,
+                                            const QRectF &oldGeometry)
+{
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+void QSGPinchArea::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    QSGItem::itemChange(change, value);
+}
+
+QSGPinch *QSGPinchArea::pinch()
+{
+    Q_D(QSGPinchArea);
+    if (!d->pinch)
+        d->pinch = new QSGPinch;
+    return d->pinch;
+}
+
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/items/qsgpincharea_p.h b/src/declarative/items/qsgpincharea_p.h
new file mode 100644
index 0000000000..04fd815df3
--- /dev/null
+++ b/src/declarative/items/qsgpincharea_p.h
@@ -0,0 +1,310 @@
+// Commit: ce59628ba366800fe2f3afdadc37be02f98480a7
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtSG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPINCHAREA_H
+#define QSGPINCHAREA_H
+
+#include "qsgitem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QSGPinch : public QObject
+{
+    Q_OBJECT
+
+    Q_ENUMS(Axis)
+    Q_PROPERTY(QSGItem *target READ target WRITE setTarget RESET resetTarget)
+    Q_PROPERTY(qreal minimumScale READ minimumScale WRITE setMinimumScale NOTIFY minimumScaleChanged)
+    Q_PROPERTY(qreal maximumScale READ maximumScale WRITE setMaximumScale NOTIFY maximumScaleChanged)
+    Q_PROPERTY(qreal minimumRotation READ minimumRotation WRITE setMinimumRotation NOTIFY minimumRotationChanged)
+    Q_PROPERTY(qreal maximumRotation READ maximumRotation WRITE setMaximumRotation NOTIFY maximumRotationChanged)
+    Q_PROPERTY(Axis dragAxis READ axis WRITE setAxis NOTIFY dragAxisChanged)
+    Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged)
+    Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged)
+    Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged)
+    Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged)
+    Q_PROPERTY(bool active READ active NOTIFY activeChanged)
+
+public:
+    QSGPinch();
+
+    QSGItem *target() const { return m_target; }
+    void setTarget(QSGItem *target) {
+        if (target == m_target)
+            return;
+        m_target = target;
+        emit targetChanged();
+    }
+    void resetTarget() {
+        if (!m_target)
+            return;
+        m_target = 0;
+        emit targetChanged();
+    }
+
+    qreal minimumScale() const { return m_minScale; }
+    void setMinimumScale(qreal s) {
+        if (s == m_minScale)
+            return;
+        m_minScale = s;
+        emit minimumScaleChanged();
+    }
+    qreal maximumScale() const { return m_maxScale; }
+    void setMaximumScale(qreal s) {
+        if (s == m_maxScale)
+            return;
+        m_maxScale = s;
+        emit maximumScaleChanged();
+    }
+
+    qreal minimumRotation() const { return m_minRotation; }
+    void setMinimumRotation(qreal r) {
+        if (r == m_minRotation)
+            return;
+        m_minRotation = r;
+        emit minimumRotationChanged();
+    }
+    qreal maximumRotation() const { return m_maxRotation; }
+    void setMaximumRotation(qreal r) {
+        if (r == m_maxRotation)
+            return;
+        m_maxRotation = r;
+        emit maximumRotationChanged();
+    }
+
+    enum Axis { NoDrag=0x00, XAxis=0x01, YAxis=0x02, XandYAxis=0x03 };
+    Axis axis() const { return m_axis; }
+    void setAxis(Axis a) {
+        if (a == m_axis)
+            return;
+        m_axis = a;
+        emit dragAxisChanged();
+    }
+
+    qreal xmin() const { return m_xmin; }
+    void setXmin(qreal x) {
+        if (x == m_xmin)
+            return;
+        m_xmin = x;
+        emit minimumXChanged();
+    }
+    qreal xmax() const { return m_xmax; }
+    void setXmax(qreal x) {
+        if (x == m_xmax)
+            return;
+        m_xmax = x;
+        emit maximumXChanged();
+    }
+    qreal ymin() const { return m_ymin; }
+    void setYmin(qreal y) {
+        if (y == m_ymin)
+            return;
+        m_ymin = y;
+        emit minimumYChanged();
+    }
+    qreal ymax() const { return m_ymax; }
+    void setYmax(qreal y) {
+        if (y == m_ymax)
+            return;
+        m_ymax = y;
+        emit maximumYChanged();
+    }
+
+    bool active() const { return m_active; }
+    void setActive(bool a) {
+        if (a == m_active)
+            return;
+        m_active = a;
+        emit activeChanged();
+    }
+
+signals:
+    void targetChanged();
+    void minimumScaleChanged();
+    void maximumScaleChanged();
+    void minimumRotationChanged();
+    void maximumRotationChanged();
+    void dragAxisChanged();
+    void minimumXChanged();
+    void maximumXChanged();
+    void minimumYChanged();
+    void maximumYChanged();
+    void activeChanged();
+
+private:
+    QSGItem *m_target;
+    qreal m_minScale;
+    qreal m_maxScale;
+    qreal m_minRotation;
+    qreal m_maxRotation;
+    Axis m_axis;
+    qreal m_xmin;
+    qreal m_xmax;
+    qreal m_ymin;
+    qreal m_ymax;
+    bool m_active;
+};
+
+class Q_AUTOTEST_EXPORT QSGPinchEvent : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QPointF center READ center)
+    Q_PROPERTY(QPointF startCenter READ startCenter)
+    Q_PROPERTY(QPointF previousCenter READ previousCenter)
+    Q_PROPERTY(qreal scale READ scale)
+    Q_PROPERTY(qreal previousScale READ previousScale)
+    Q_PROPERTY(qreal angle READ angle)
+    Q_PROPERTY(qreal previousAngle READ previousAngle)
+    Q_PROPERTY(qreal rotation READ rotation)
+    Q_PROPERTY(QPointF point1 READ point1)
+    Q_PROPERTY(QPointF startPoint1 READ startPoint1)
+    Q_PROPERTY(QPointF point2 READ point2)
+    Q_PROPERTY(QPointF startPoint2 READ startPoint2)
+    Q_PROPERTY(bool accepted READ accepted WRITE setAccepted)
+
+public:
+    QSGPinchEvent(QPointF c, qreal s, qreal a, qreal r)
+        : QObject(), m_center(c), m_scale(s), m_angle(a), m_rotation(r), m_accepted(true) {}
+
+    QPointF center() const { return m_center; }
+    QPointF startCenter() const { return m_startCenter; }
+    void setStartCenter(QPointF c) { m_startCenter = c; }
+    QPointF previousCenter() const { return m_lastCenter; }
+    void setPreviousCenter(QPointF c) { m_lastCenter = c; }
+    qreal scale() const { return m_scale; }
+    qreal previousScale() const { return m_lastScale; }
+    void setPreviousScale(qreal s) { m_lastScale = s; }
+    qreal angle() const { return m_angle; }
+    qreal previousAngle() const { return m_lastAngle; }
+    void setPreviousAngle(qreal a) { m_lastAngle = a; }
+    qreal rotation() const { return m_rotation; }
+    QPointF point1() const { return m_point1; }
+    void setPoint1(QPointF p) { m_point1 = p; }
+    QPointF startPoint1() const { return m_startPoint1; }
+    void setStartPoint1(QPointF p) { m_startPoint1 = p; }
+    QPointF point2() const { return m_point2; }
+    void setPoint2(QPointF p) { m_point2 = p; }
+    QPointF startPoint2() const { return m_startPoint2; }
+    void setStartPoint2(QPointF p) { m_startPoint2 = p; }
+
+    bool accepted() const { return m_accepted; }
+    void setAccepted(bool a) { m_accepted = a; }
+
+private:
+    QPointF m_center;
+    QPointF m_startCenter;
+    QPointF m_lastCenter;
+    qreal m_scale;
+    qreal m_lastScale;
+    qreal m_angle;
+    qreal m_lastAngle;
+    qreal m_rotation;
+    QPointF m_point1;
+    QPointF m_point2;
+    QPointF m_startPoint1;
+    QPointF m_startPoint2;
+    bool m_accepted;
+};
+
+
+class QSGMouseEvent;
+class QSGPinchAreaPrivate;
+class Q_AUTOTEST_EXPORT QSGPinchArea : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(QSGPinch *pinch READ pinch CONSTANT)
+
+public:
+    QSGPinchArea(QSGItem *parent=0);
+    ~QSGPinchArea();
+
+    bool isEnabled() const;
+    void setEnabled(bool);
+
+    QSGPinch *pinch();
+
+Q_SIGNALS:
+    void enabledChanged();
+    void pinchStarted(QSGPinchEvent *pinch);
+    void pinchUpdated(QSGPinchEvent *pinch);
+    void pinchFinished(QSGPinchEvent *pinch);
+
+protected:
+    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    virtual void mouseUngrabEvent();
+    virtual bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
+    virtual bool childMouseEventFilter(QSGItem *i, QEvent *e);
+    virtual void touchEvent(QTouchEvent *event);
+
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+    virtual void itemChange(ItemChange change, const ItemChangeData& value);
+
+private:
+    void updatePinch();
+    void handlePress();
+    void handleRelease();
+
+private:
+    Q_DISABLE_COPY(QSGPinchArea)
+    Q_DECLARE_PRIVATE(QSGPinchArea)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGPinch)
+QML_DECLARE_TYPE(QSGPinchEvent)
+QML_DECLARE_TYPE(QSGPinchArea)
+
+QT_END_HEADER
+
+#endif // QSGPINCHAREA_H
+
diff --git a/src/declarative/items/qsgpincharea_p_p.h b/src/declarative/items/qsgpincharea_p_p.h
new file mode 100644
index 0000000000..bdb3a51ef2
--- /dev/null
+++ b/src/declarative/items/qsgpincharea_p_p.h
@@ -0,0 +1,112 @@
+// Commit: 2ec2dc55ddf424f5a7acd0a4729ddd9af2d7c398
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtSG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPINCHAREA_P_H
+#define QSGPINCHAREA_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qevent.h>
+
+#include "qsgitem_p.h"
+#include "qsgpincharea_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGPinch;
+class QSGPinchAreaPrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGPinchArea)
+public:
+    QSGPinchAreaPrivate()
+      : absorb(true), stealMouse(false), inPinch(false)
+      , pinchRejected(false), pinch(0), pinchStartDist(0), pinchStartScale(1.0)
+      , pinchLastScale(1.0), pinchStartRotation(0.0), pinchStartAngle(0.0)
+      , pinchLastAngle(0.0), pinchRotation(0.0)
+    {
+    }
+
+    ~QSGPinchAreaPrivate();
+
+    void init()
+    {
+        Q_Q(QSGPinchArea);
+        q->setAcceptedMouseButtons(Qt::LeftButton);
+        q->setFiltersChildMouseEvents(true);
+    }
+
+    bool absorb : 1;
+    bool stealMouse : 1;
+    bool inPinch : 1;
+    bool pinchRejected : 1;
+    QSGPinch *pinch;
+    QPointF sceneStartPoint1;
+    QPointF sceneStartPoint2;
+    QPointF lastPoint1;
+    QPointF lastPoint2;
+    qreal pinchStartDist;
+    qreal pinchStartScale;
+    qreal pinchLastScale;
+    qreal pinchStartRotation;
+    qreal pinchStartAngle;
+    qreal pinchLastAngle;
+    qreal pinchRotation;
+    QPointF sceneStartCenter;
+    QPointF pinchStartCenter;
+    QPointF sceneLastCenter;
+    QPointF pinchStartPos;
+    QList<QTouchEvent::TouchPoint> touchPoints;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGPINCHAREA_P_H
+
diff --git a/src/declarative/items/qsgpositioners.cpp b/src/declarative/items/qsgpositioners.cpp
new file mode 100644
index 0000000000..f174612af6
--- /dev/null
+++ b/src/declarative/items/qsgpositioners.cpp
@@ -0,0 +1,788 @@
+// Commit: 1f38d41854fa2daa51d938a4eb398752b1751e0b
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgpositioners_p.h"
+#include "qsgpositioners_p_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <private/qdeclarativestate_p.h>
+#include <private/qdeclarativestategroup_p.h>
+#include <private/qdeclarativestateoperations_p.h>
+
+QT_BEGIN_NAMESPACE
+
+static const QSGItemPrivate::ChangeTypes watchedChanges
+    = QSGItemPrivate::Geometry
+    | QSGItemPrivate::SiblingOrder
+    | QSGItemPrivate::Visibility
+    | QSGItemPrivate::Opacity
+    | QSGItemPrivate::Destroyed;
+
+void QSGBasePositionerPrivate::watchChanges(QSGItem *other)
+{
+    QSGItemPrivate *otherPrivate = QSGItemPrivate::get(other);
+    otherPrivate->addItemChangeListener(this, watchedChanges);
+}
+
+void QSGBasePositionerPrivate::unwatchChanges(QSGItem* other)
+{
+    QSGItemPrivate *otherPrivate = QSGItemPrivate::get(other);
+    otherPrivate->removeItemChangeListener(this, watchedChanges);
+}
+
+QSGBasePositioner::QSGBasePositioner(PositionerType at, QSGItem *parent)
+    : QSGImplicitSizeItem(*(new QSGBasePositionerPrivate), parent)
+{
+    Q_D(QSGBasePositioner);
+    d->init(at);
+}
+
+QSGBasePositioner::QSGBasePositioner(QSGBasePositionerPrivate &dd, PositionerType at, QSGItem *parent)
+    : QSGImplicitSizeItem(dd, parent)
+{
+    Q_D(QSGBasePositioner);
+    d->init(at);
+}
+
+QSGBasePositioner::~QSGBasePositioner()
+{
+    Q_D(QSGBasePositioner);
+    for (int i = 0; i < positionedItems.count(); ++i)
+        d->unwatchChanges(positionedItems.at(i).item);
+    positionedItems.clear();
+}
+
+int QSGBasePositioner::spacing() const
+{
+    Q_D(const QSGBasePositioner);
+    return d->spacing;
+}
+
+void QSGBasePositioner::setSpacing(int s)
+{
+    Q_D(QSGBasePositioner);
+    if (s==d->spacing)
+        return;
+    d->spacing = s;
+    prePositioning();
+    emit spacingChanged();
+}
+
+QDeclarativeTransition *QSGBasePositioner::move() const
+{
+    Q_D(const QSGBasePositioner);
+    return d->moveTransition;
+}
+
+void QSGBasePositioner::setMove(QDeclarativeTransition *mt)
+{
+    Q_D(QSGBasePositioner);
+    if (mt == d->moveTransition)
+        return;
+    d->moveTransition = mt;
+    emit moveChanged();
+}
+
+QDeclarativeTransition *QSGBasePositioner::add() const
+{
+    Q_D(const QSGBasePositioner);
+    return d->addTransition;
+}
+
+void QSGBasePositioner::setAdd(QDeclarativeTransition *add)
+{
+    Q_D(QSGBasePositioner);
+    if (add == d->addTransition)
+        return;
+
+    d->addTransition = add;
+    emit addChanged();
+}
+
+void QSGBasePositioner::componentComplete()
+{
+    QSGItem::componentComplete();
+    positionedItems.reserve(childItems().count());
+    prePositioning();
+    reportConflictingAnchors();
+}
+
+void QSGBasePositioner::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    Q_D(QSGBasePositioner);
+    if (change == ItemChildAddedChange){
+        prePositioning();
+    } else if (change == ItemChildRemovedChange) {
+        QSGItem *child = value.item;
+        QSGBasePositioner::PositionedItem posItem(child);
+        int idx = positionedItems.find(posItem);
+        if (idx >= 0) {
+            d->unwatchChanges(child);
+            positionedItems.remove(idx);
+        }
+        prePositioning();
+    }
+
+    QSGItem::itemChange(change, value);
+}
+
+void QSGBasePositioner::prePositioning()
+{
+    Q_D(QSGBasePositioner);
+    if (!isComponentComplete())
+        return;
+
+    if (d->doingPositioning)
+        return;
+
+    d->queuedPositioning = false;
+    d->doingPositioning = true;
+    //Need to order children by creation order modified by stacking order
+    QList<QSGItem *> children = childItems();
+
+    QPODVector<PositionedItem,8> oldItems;
+    positionedItems.copyAndClear(oldItems);
+    for (int ii = 0; ii < children.count(); ++ii) {
+        QSGItem *child = children.at(ii);
+        QSGItemPrivate *childPrivate = QSGItemPrivate::get(child);
+        PositionedItem *item = 0;
+        PositionedItem posItem(child);
+        int wIdx = oldItems.find(posItem);
+        if (wIdx < 0) {
+            d->watchChanges(child);
+            positionedItems.append(posItem);
+            item = &positionedItems[positionedItems.count()-1];
+            item->isNew = true;
+            if (child->opacity() <= 0.0 || !childPrivate->explicitVisible || !child->width() || !child->height())
+                item->isVisible = false;
+        } else {
+            item = &oldItems[wIdx];
+            // Items are only omitted from positioning if they are explicitly hidden
+            // i.e. their positioning is not affected if an ancestor is hidden.
+            if (child->opacity() <= 0.0 || !childPrivate->explicitVisible || !child->width() || !child->height()) {
+                item->isVisible = false;
+            } else if (!item->isVisible) {
+                item->isVisible = true;
+                item->isNew = true;
+            } else {
+                item->isNew = false;
+            }
+            positionedItems.append(*item);
+        }
+    }
+    QSizeF contentSize;
+    doPositioning(&contentSize);
+    if(d->addTransition || d->moveTransition)
+        finishApplyTransitions();
+    d->doingPositioning = false;
+    //Set implicit size to the size of its children
+    setImplicitHeight(contentSize.height());
+    setImplicitWidth(contentSize.width());
+}
+
+void QSGBasePositioner::positionX(int x, const PositionedItem &target)
+{
+    Q_D(QSGBasePositioner);
+    if(d->type == Horizontal || d->type == Both){
+        if (target.isNew) {
+            if (!d->addTransition)
+                target.item->setX(x);
+            else
+                d->addActions << QDeclarativeAction(target.item, QLatin1String("x"), QVariant(x));
+        } else if (x != target.item->x()) {
+            if (!d->moveTransition)
+                target.item->setX(x);
+            else
+                d->moveActions << QDeclarativeAction(target.item, QLatin1String("x"), QVariant(x));
+        }
+    }
+}
+
+void QSGBasePositioner::positionY(int y, const PositionedItem &target)
+{
+    Q_D(QSGBasePositioner);
+    if(d->type == Vertical || d->type == Both){
+        if (target.isNew) {
+            if (!d->addTransition)
+                target.item->setY(y);
+            else
+                d->addActions << QDeclarativeAction(target.item, QLatin1String("y"), QVariant(y));
+        } else if (y != target.item->y()) {
+            if (!d->moveTransition)
+                target.item->setY(y);
+            else
+                d->moveActions << QDeclarativeAction(target.item, QLatin1String("y"), QVariant(y));
+        }
+    }
+}
+
+void QSGBasePositioner::finishApplyTransitions()
+{
+    Q_D(QSGBasePositioner);
+    // Note that if a transition is not set the transition manager will
+    // apply the changes directly, in the case add/move aren't set
+    d->addTransitionManager.transition(d->addActions, d->addTransition);
+    d->moveTransitionManager.transition(d->moveActions, d->moveTransition);
+    d->addActions.clear();
+    d->moveActions.clear();
+}
+
+QSGColumn::QSGColumn(QSGItem *parent)
+: QSGBasePositioner(Vertical, parent)
+{
+}
+
+void QSGColumn::doPositioning(QSizeF *contentSize)
+{
+    int voffset = 0;
+
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (!child.item || !child.isVisible)
+            continue;
+
+        if(child.item->y() != voffset)
+            positionY(voffset, child);
+
+        contentSize->setWidth(qMax(contentSize->width(), child.item->width()));
+
+        voffset += child.item->height();
+        voffset += spacing();
+    }
+
+    contentSize->setHeight(voffset - spacing());
+}
+
+void QSGColumn::reportConflictingAnchors()
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate*>(QSGBasePositionerPrivate::get(this));
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (child.item) {
+            QSGAnchors *anchors = QSGItemPrivate::get(static_cast<QSGItem *>(child.item))->_anchors;
+            if (anchors) {
+                QSGAnchors::Anchors usedAnchors = anchors->usedAnchors();
+                if (usedAnchors & QSGAnchors::TopAnchor ||
+                    usedAnchors & QSGAnchors::BottomAnchor ||
+                    usedAnchors & QSGAnchors::VCenterAnchor ||
+                    anchors->fill() || anchors->centerIn()) {
+                    d->anchorConflict = true;
+                    break;
+                }
+            }
+        }
+    }
+    if (d->anchorConflict) {
+        qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column";
+    }
+}
+
+QSGRow::QSGRow(QSGItem *parent)
+: QSGBasePositioner(Horizontal, parent)
+{
+}
+
+Qt::LayoutDirection QSGRow::layoutDirection() const
+{
+    return QSGBasePositionerPrivate::getLayoutDirection(this);
+}
+
+void QSGRow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate* >(QSGBasePositionerPrivate::get(this));
+    if (d->layoutDirection != layoutDirection) {
+        d->layoutDirection = layoutDirection;
+        // For RTL layout the positioning changes when the width changes.
+        if (d->layoutDirection == Qt::RightToLeft)
+            d->addItemChangeListener(d, QSGItemPrivate::Geometry);
+        else
+            d->removeItemChangeListener(d, QSGItemPrivate::Geometry);
+        prePositioning();
+        emit layoutDirectionChanged();
+        emit effectiveLayoutDirectionChanged();
+    }
+}
+
+Qt::LayoutDirection QSGRow::effectiveLayoutDirection() const
+{
+    return QSGBasePositionerPrivate::getEffectiveLayoutDirection(this);
+}
+
+void QSGRow::doPositioning(QSizeF *contentSize)
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate* >(QSGBasePositionerPrivate::get(this));
+    int hoffset = 0;
+
+    QList<int> hoffsets;
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (!child.item || !child.isVisible)
+            continue;
+
+        if (d->isLeftToRight()) {
+            if (child.item->x() != hoffset)
+                positionX(hoffset, child);
+        } else {
+            hoffsets << hoffset;
+        }
+
+        contentSize->setHeight(qMax(contentSize->height(), child.item->height()));
+
+        hoffset += child.item->width();
+        hoffset += spacing();
+    }
+
+    contentSize->setWidth(hoffset - spacing());
+
+    if (d->isLeftToRight())
+        return;
+
+    //Right to Left layout
+    int end = 0;
+    if (!widthValid())
+        end = contentSize->width();
+    else
+        end = width();
+
+    int acc = 0;
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (!child.item || !child.isVisible)
+            continue;
+        hoffset = end - hoffsets[acc++] - child.item->width();
+        if (child.item->x() != hoffset)
+            positionX(hoffset, child);
+    }
+}
+
+void QSGRow::reportConflictingAnchors()
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate*>(QSGBasePositionerPrivate::get(this));
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (child.item) {
+            QSGAnchors *anchors = QSGItemPrivate::get(static_cast<QSGItem *>(child.item))->_anchors;
+            if (anchors) {
+                QSGAnchors::Anchors usedAnchors = anchors->usedAnchors();
+                if (usedAnchors & QSGAnchors::LeftAnchor ||
+                    usedAnchors & QSGAnchors::RightAnchor ||
+                    usedAnchors & QSGAnchors::HCenterAnchor ||
+                    anchors->fill() || anchors->centerIn()) {
+                    d->anchorConflict = true;
+                    break;
+                }
+            }
+        }
+    }
+    if (d->anchorConflict)
+        qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row";
+}
+
+QSGGrid::QSGGrid(QSGItem *parent) :
+    QSGBasePositioner(Both, parent), m_rows(-1), m_columns(-1), m_flow(LeftToRight)
+{
+}
+
+void QSGGrid::setColumns(const int columns)
+{
+    if (columns == m_columns)
+        return;
+    m_columns = columns;
+    prePositioning();
+    emit columnsChanged();
+}
+
+void QSGGrid::setRows(const int rows)
+{
+    if (rows == m_rows)
+        return;
+    m_rows = rows;
+    prePositioning();
+    emit rowsChanged();
+}
+
+QSGGrid::Flow QSGGrid::flow() const
+{
+    return m_flow;
+}
+
+void QSGGrid::setFlow(Flow flow)
+{
+    if (m_flow != flow) {
+        m_flow = flow;
+        prePositioning();
+        emit flowChanged();
+    }
+}
+
+Qt::LayoutDirection QSGGrid::layoutDirection() const
+{
+    return QSGBasePositionerPrivate::getLayoutDirection(this);
+}
+
+void QSGGrid::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate*>(QSGBasePositionerPrivate::get(this));
+    if (d->layoutDirection != layoutDirection) {
+        d->layoutDirection = layoutDirection;
+        // For RTL layout the positioning changes when the width changes.
+        if (d->layoutDirection == Qt::RightToLeft)
+            d->addItemChangeListener(d, QSGItemPrivate::Geometry);
+        else
+            d->removeItemChangeListener(d, QSGItemPrivate::Geometry);
+        prePositioning();
+        emit layoutDirectionChanged();
+        emit effectiveLayoutDirectionChanged();
+    }
+}
+
+Qt::LayoutDirection QSGGrid::effectiveLayoutDirection() const
+{
+    return QSGBasePositionerPrivate::getEffectiveLayoutDirection(this);
+}
+
+void QSGGrid::doPositioning(QSizeF *contentSize)
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate*>(QSGBasePositionerPrivate::get(this));
+    int c = m_columns;
+    int r = m_rows;
+    //Is allocating the extra QPODVector too much overhead?
+    QPODVector<PositionedItem, 8> visibleItems;//we aren't concerned with invisible items
+    visibleItems.reserve(positionedItems.count());
+    for(int i=0; i<positionedItems.count(); i++)
+        if(positionedItems[i].item && positionedItems[i].isVisible)
+            visibleItems.append(positionedItems[i]);
+
+    int numVisible = visibleItems.count();
+    if (m_columns <= 0 && m_rows <= 0){
+        c = 4;
+        r = (numVisible+3)/4;
+    } else if (m_rows <= 0){
+        r = (numVisible+(m_columns-1))/m_columns;
+    } else if (m_columns <= 0){
+        c = (numVisible+(m_rows-1))/m_rows;
+    }
+
+    if(r==0 || c==0)
+        return; //Nothing to do
+
+    QList<int> maxColWidth;
+    QList<int> maxRowHeight;
+    int childIndex =0;
+    if (m_flow == LeftToRight) {
+        for (int i=0; i < r; i++){
+            for (int j=0; j < c; j++){
+                if (j==0)
+                    maxRowHeight << 0;
+                if (i==0)
+                    maxColWidth << 0;
+
+                if (childIndex == visibleItems.count())
+                    break;
+
+                const PositionedItem &child = visibleItems.at(childIndex++);
+                if (child.item->width() > maxColWidth[j])
+                    maxColWidth[j] = child.item->width();
+                if (child.item->height() > maxRowHeight[i])
+                    maxRowHeight[i] = child.item->height();
+            }
+        }
+    } else {
+        for (int j=0; j < c; j++){
+            for (int i=0; i < r; i++){
+                if (j==0)
+                    maxRowHeight << 0;
+                if (i==0)
+                    maxColWidth << 0;
+
+                if (childIndex == visibleItems.count())
+                    break;
+
+                const PositionedItem &child = visibleItems.at(childIndex++);
+                if (child.item->width() > maxColWidth[j])
+                    maxColWidth[j] = child.item->width();
+                if (child.item->height() > maxRowHeight[i])
+                    maxRowHeight[i] = child.item->height();
+            }
+        }
+    }
+
+    int widthSum = 0;
+    for (int j=0; j < maxColWidth.size(); j++){
+        if (j)
+            widthSum += spacing();
+        widthSum += maxColWidth[j];
+    }
+
+    int heightSum = 0;
+    for (int i=0; i < maxRowHeight.size(); i++){
+        if (i)
+            heightSum += spacing();
+        heightSum += maxRowHeight[i];
+    }
+
+    contentSize->setHeight(heightSum);
+    contentSize->setWidth(widthSum);
+
+    int end = 0;
+    if (widthValid())
+        end = width();
+    else
+        end = widthSum;
+
+    int xoffset=0;
+    if (!d->isLeftToRight())
+        xoffset = end;
+    int yoffset=0;
+    int curRow =0;
+    int curCol =0;
+    for (int i = 0; i < visibleItems.count(); ++i) {
+        const PositionedItem &child = visibleItems.at(i);
+        int childXOffset = xoffset;
+        if (!d->isLeftToRight())
+            childXOffset -= child.item->width();
+        if ((child.item->x() != childXOffset) || (child.item->y() != yoffset)){
+            positionX(childXOffset, child);
+            positionY(yoffset, child);
+        }
+
+        if (m_flow == LeftToRight) {
+            if (d->isLeftToRight())
+                xoffset += maxColWidth[curCol]+spacing();
+            else
+                xoffset -= maxColWidth[curCol]+spacing();
+            curCol++;
+            curCol%=c;
+            if (!curCol){
+                yoffset += maxRowHeight[curRow]+spacing();
+                if (d->isLeftToRight())
+                    xoffset = 0;
+                else
+                    xoffset = end;
+                curRow++;
+                if (curRow>=r)
+                    break;
+            }
+        } else {
+            yoffset+=maxRowHeight[curRow]+spacing();
+            curRow++;
+            curRow%=r;
+            if (!curRow){
+                if (d->isLeftToRight())
+                    xoffset += maxColWidth[curCol]+spacing();
+                else
+                    xoffset -= maxColWidth[curCol]+spacing();
+                yoffset=0;
+                curCol++;
+                if (curCol>=c)
+                    break;
+            }
+        }
+    }
+}
+
+void QSGGrid::reportConflictingAnchors()
+{
+    QSGBasePositionerPrivate *d = static_cast<QSGBasePositionerPrivate*>(QSGBasePositionerPrivate::get(this));
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (child.item) {
+            QSGAnchors *anchors = QSGItemPrivate::get(static_cast<QSGItem *>(child.item))->_anchors;
+            if (anchors && (anchors->usedAnchors() || anchors->fill() || anchors->centerIn())) {
+                d->anchorConflict = true;
+                break;
+            }
+        }
+    }
+    if (d->anchorConflict)
+        qmlInfo(this) << "Cannot specify anchors for items inside Grid";
+}
+
+class QSGFlowPrivate : public QSGBasePositionerPrivate
+{
+    Q_DECLARE_PUBLIC(QSGFlow)
+
+public:
+    QSGFlowPrivate()
+        : QSGBasePositionerPrivate(), flow(QSGFlow::LeftToRight)
+    {}
+
+    QSGFlow::Flow flow;
+};
+
+QSGFlow::QSGFlow(QSGItem *parent)
+: QSGBasePositioner(*(new QSGFlowPrivate), Both, parent)
+{
+    Q_D(QSGFlow);
+    // Flow layout requires relayout if its own size changes too.
+    d->addItemChangeListener(d, QSGItemPrivate::Geometry);
+}
+
+QSGFlow::Flow QSGFlow::flow() const
+{
+    Q_D(const QSGFlow);
+    return d->flow;
+}
+
+void QSGFlow::setFlow(Flow flow)
+{
+    Q_D(QSGFlow);
+    if (d->flow != flow) {
+        d->flow = flow;
+        prePositioning();
+        emit flowChanged();
+    }
+}
+
+Qt::LayoutDirection QSGFlow::layoutDirection() const
+{
+    Q_D(const QSGFlow);
+    return d->layoutDirection;
+}
+
+void QSGFlow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+    Q_D(QSGFlow);
+    if (d->layoutDirection != layoutDirection) {
+        d->layoutDirection = layoutDirection;
+        prePositioning();
+        emit layoutDirectionChanged();
+        emit effectiveLayoutDirectionChanged();
+    }
+}
+
+Qt::LayoutDirection QSGFlow::effectiveLayoutDirection() const
+{
+    return QSGBasePositionerPrivate::getEffectiveLayoutDirection(this);
+}
+
+void QSGFlow::doPositioning(QSizeF *contentSize)
+{
+    Q_D(QSGFlow);
+
+    int hoffset = 0;
+    int voffset = 0;
+    int linemax = 0;
+    QList<int> hoffsets;
+
+    for (int i = 0; i < positionedItems.count(); ++i) {
+        const PositionedItem &child = positionedItems.at(i);
+        if (!child.item || !child.isVisible)
+            continue;
+
+        if (d->flow == LeftToRight)  {
+            if (widthValid() && hoffset && hoffset + child.item->width() > width()) {
+                hoffset = 0;
+                voffset += linemax + spacing();
+                linemax = 0;
+            }
+        } else {
+            if (heightValid() && voffset && voffset + child.item->height() > height()) {
+                voffset = 0;
+                hoffset += linemax + spacing();
+                linemax = 0;
+            }
+        }
+
+        if (d->isLeftToRight()) {
+            if (child.item->x() != hoffset)
+                positionX(hoffset, child);
+        } else {
+            hoffsets << hoffset;
+        }
+        if (child.item->y() != voffset)
+            positionY(voffset, child);
+
+        contentSize->setWidth(qMax(contentSize->width(), hoffset + child.item->width()));
+        contentSize->setHeight(qMax(contentSize->height(), voffset + child.item->height()));
+
+        if (d->flow == LeftToRight)  {
+            hoffset += child.item->width();
+            hoffset += spacing();
+            linemax = qMax(linemax, qCeil(child.item->height()));
+        } else {
+            voffset += child.item->height();
+            voffset += spacing();
+            linemax = qMax(linemax, qCeil(child.item->width()));
+        }
+    }
+    if (d->isLeftToRight())
+        return;
+
+    int end;
+    if (widthValid())
+        end = width();
+    else
+        end = contentSize->width();
+    int acc = 0;
+    for (int i = 0; i < positionedItems.count(); ++i) {
+        const PositionedItem &child = positionedItems.at(i);
+        if (!child.item || !child.isVisible)
+            continue;
+        hoffset = end - hoffsets[acc++] - child.item->width();
+        if (child.item->x() != hoffset)
+            positionX(hoffset, child);
+    }
+}
+
+void QSGFlow::reportConflictingAnchors()
+{
+    Q_D(QSGFlow);
+    for (int ii = 0; ii < positionedItems.count(); ++ii) {
+        const PositionedItem &child = positionedItems.at(ii);
+        if (child.item) {
+            QSGAnchors *anchors = QSGItemPrivate::get(static_cast<QSGItem *>(child.item))->_anchors;
+            if (anchors && (anchors->usedAnchors() || anchors->fill() || anchors->centerIn())) {
+                d->anchorConflict = true;
+                break;
+            }
+        }
+    }
+    if (d->anchorConflict)
+        qmlInfo(this) << "Cannot specify anchors for items inside Flow";
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgpositioners_p.h b/src/declarative/items/qsgpositioners_p.h
new file mode 100644
index 0000000000..eb0e73456b
--- /dev/null
+++ b/src/declarative/items/qsgpositioners_p.h
@@ -0,0 +1,242 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPOSITIONERS_P_H
+#define QSGPOSITIONERS_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+
+#include <private/qdeclarativestate_p.h>
+#include <private/qpodvector_p.h>
+
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGBasePositionerPrivate;
+
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGBasePositioner : public QSGImplicitSizeItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(int spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
+    Q_PROPERTY(QDeclarativeTransition *move READ move WRITE setMove NOTIFY moveChanged)
+    Q_PROPERTY(QDeclarativeTransition *add READ add WRITE setAdd NOTIFY addChanged)
+public:
+    enum PositionerType { None = 0x0, Horizontal = 0x1, Vertical = 0x2, Both = 0x3 };
+    QSGBasePositioner(PositionerType, QSGItem *parent);
+    ~QSGBasePositioner();
+
+    int spacing() const;
+    void setSpacing(int);
+
+    QDeclarativeTransition *move() const;
+    void setMove(QDeclarativeTransition *);
+
+    QDeclarativeTransition *add() const;
+    void setAdd(QDeclarativeTransition *);
+
+protected:
+    QSGBasePositioner(QSGBasePositionerPrivate &dd, PositionerType at, QSGItem *parent);
+    virtual void componentComplete();
+    virtual void itemChange(ItemChange, const ItemChangeData &);
+    void finishApplyTransitions();
+
+Q_SIGNALS:
+    void spacingChanged();
+    void moveChanged();
+    void addChanged();
+
+protected Q_SLOTS:
+    void prePositioning();
+
+protected:
+    virtual void doPositioning(QSizeF *contentSize)=0;
+    virtual void reportConflictingAnchors()=0;
+    class PositionedItem {
+    public :
+        PositionedItem(QSGItem *i) : item(i), isNew(false), isVisible(true) {}
+        bool operator==(const PositionedItem &other) const { return other.item == item; }
+        QSGItem *item;
+        bool isNew;
+        bool isVisible;
+    };
+
+    QPODVector<PositionedItem,8> positionedItems;
+    void positionX(int,const PositionedItem &target);
+    void positionY(int,const PositionedItem &target);
+
+private:
+    Q_DISABLE_COPY(QSGBasePositioner)
+    Q_DECLARE_PRIVATE(QSGBasePositioner)
+};
+
+class Q_AUTOTEST_EXPORT QSGColumn : public QSGBasePositioner
+{
+    Q_OBJECT
+public:
+    QSGColumn(QSGItem *parent=0);
+protected:
+    virtual void doPositioning(QSizeF *contentSize);
+    virtual void reportConflictingAnchors();
+private:
+    Q_DISABLE_COPY(QSGColumn)
+};
+
+class Q_AUTOTEST_EXPORT QSGRow: public QSGBasePositioner
+{
+    Q_OBJECT
+    Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
+    Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
+public:
+    QSGRow(QSGItem *parent=0);
+
+    Qt::LayoutDirection layoutDirection() const;
+    void setLayoutDirection (Qt::LayoutDirection);
+    Qt::LayoutDirection effectiveLayoutDirection() const;
+
+Q_SIGNALS:
+    void layoutDirectionChanged();
+    void effectiveLayoutDirectionChanged();
+
+protected:
+    virtual void doPositioning(QSizeF *contentSize);
+    virtual void reportConflictingAnchors();
+private:
+    Q_DISABLE_COPY(QSGRow)
+};
+
+class Q_AUTOTEST_EXPORT QSGGrid : public QSGBasePositioner
+{
+    Q_OBJECT
+    Q_PROPERTY(int rows READ rows WRITE setRows NOTIFY rowsChanged)
+    Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged)
+    Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
+    Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
+    Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
+
+public:
+    QSGGrid(QSGItem *parent=0);
+
+    int rows() const {return m_rows;}
+    void setRows(const int rows);
+
+    int columns() const {return m_columns;}
+    void setColumns(const int columns);
+
+    Q_ENUMS(Flow)
+    enum Flow { LeftToRight, TopToBottom };
+    Flow flow() const;
+    void setFlow(Flow);
+
+    Qt::LayoutDirection layoutDirection() const;
+    void setLayoutDirection (Qt::LayoutDirection);
+    Qt::LayoutDirection effectiveLayoutDirection() const;
+
+Q_SIGNALS:
+    void rowsChanged();
+    void columnsChanged();
+    void flowChanged();
+    void layoutDirectionChanged();
+    void effectiveLayoutDirectionChanged();
+
+protected:
+    virtual void doPositioning(QSizeF *contentSize);
+    virtual void reportConflictingAnchors();
+
+private:
+    int m_rows;
+    int m_columns;
+    Flow m_flow;
+    Q_DISABLE_COPY(QSGGrid)
+};
+
+class QSGFlowPrivate;
+class Q_AUTOTEST_EXPORT QSGFlow: public QSGBasePositioner
+{
+    Q_OBJECT
+    Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
+    Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
+    Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
+public:
+    QSGFlow(QSGItem *parent=0);
+
+    Q_ENUMS(Flow)
+    enum Flow { LeftToRight, TopToBottom };
+    Flow flow() const;
+    void setFlow(Flow);
+
+    Qt::LayoutDirection layoutDirection() const;
+    void setLayoutDirection (Qt::LayoutDirection);
+    Qt::LayoutDirection effectiveLayoutDirection() const;
+
+Q_SIGNALS:
+    void flowChanged();
+    void layoutDirectionChanged();
+    void effectiveLayoutDirectionChanged();
+
+protected:
+    virtual void doPositioning(QSizeF *contentSize);
+    virtual void reportConflictingAnchors();
+protected:
+    QSGFlow(QSGFlowPrivate &dd, QSGItem *parent);
+private:
+    Q_DISABLE_COPY(QSGFlow)
+    Q_DECLARE_PRIVATE(QSGFlow)
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGColumn)
+QML_DECLARE_TYPE(QSGRow)
+QML_DECLARE_TYPE(QSGGrid)
+QML_DECLARE_TYPE(QSGFlow)
+
+QT_END_HEADER
+
+#endif // QSGPOSITIONERS_P_H
diff --git a/src/declarative/items/qsgpositioners_p_p.h b/src/declarative/items/qsgpositioners_p_p.h
new file mode 100644
index 0000000000..241cbcfa3c
--- /dev/null
+++ b/src/declarative/items/qsgpositioners_p_p.h
@@ -0,0 +1,173 @@
+// Commit: 2c7cab4172f1acc86fd49345a2847417e162f2c3
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPOSITIONERS_P_P_H
+#define QSGPOSITIONERS_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgpositioners_p.h"
+#include "qsgimplicitsizeitem_p_p.h"
+
+#include <private/qdeclarativestate_p.h>
+#include <private/qdeclarativetransitionmanager_p_p.h>
+#include <private/qdeclarativestateoperations_p.h>
+
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qtimer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGBasePositionerPrivate : public QSGImplicitSizeItemPrivate, public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGBasePositioner)
+
+public:
+    QSGBasePositionerPrivate()
+        : spacing(0), type(QSGBasePositioner::None)
+        , moveTransition(0), addTransition(0), queuedPositioning(false)
+        , doingPositioning(false), anchorConflict(false), layoutDirection(Qt::LeftToRight)
+    {
+    }
+
+    void init(QSGBasePositioner::PositionerType at)
+    {
+        type = at;
+    }
+
+    int spacing;
+
+    QSGBasePositioner::PositionerType type;
+    QDeclarativeTransition *moveTransition;
+    QDeclarativeTransition *addTransition;
+    QDeclarativeStateOperation::ActionList addActions;
+    QDeclarativeStateOperation::ActionList moveActions;
+    QDeclarativeTransitionManager addTransitionManager;
+    QDeclarativeTransitionManager moveTransitionManager;
+
+    void watchChanges(QSGItem *other);
+    void unwatchChanges(QSGItem* other);
+    bool queuedPositioning : 1;
+    bool doingPositioning : 1;
+    bool anchorConflict : 1;
+
+    Qt::LayoutDirection layoutDirection;
+
+    void schedulePositioning()
+    {
+        Q_Q(QSGBasePositioner);
+        if(!queuedPositioning){
+            QTimer::singleShot(0,q,SLOT(prePositioning()));
+            queuedPositioning = true;
+        }
+    }
+
+    void mirrorChange() {
+        Q_Q(QSGBasePositioner);
+        if (type != QSGBasePositioner::Vertical)
+            q->prePositioning();
+    }
+    bool isLeftToRight() const {
+        if (type == QSGBasePositioner::Vertical)
+            return true;
+        else
+            return effectiveLayoutMirror ? layoutDirection == Qt::RightToLeft : layoutDirection == Qt::LeftToRight;
+    }
+
+    virtual void itemSiblingOrderChanged(QSGItem* other)
+    {
+        Q_UNUSED(other);
+        //Delay is due to many children often being reordered at once
+        //And we only want to reposition them all once
+        schedulePositioning();
+    }
+
+    void itemGeometryChanged(QSGItem *, const QRectF &newGeometry, const QRectF &oldGeometry)
+    {
+        Q_Q(QSGBasePositioner);
+        if (newGeometry.size() != oldGeometry.size())
+            q->prePositioning();
+    }
+
+    virtual void itemVisibilityChanged(QSGItem *)
+    {
+        schedulePositioning();
+    }
+    virtual void itemOpacityChanged(QSGItem *)
+    {
+        Q_Q(QSGBasePositioner);
+        q->prePositioning();
+    }
+
+    void itemDestroyed(QSGItem *item)
+    {
+        Q_Q(QSGBasePositioner);
+        q->positionedItems.removeOne(QSGBasePositioner::PositionedItem(item));
+    }
+
+    static Qt::LayoutDirection getLayoutDirection(const QSGBasePositioner *positioner)
+    {
+        return positioner->d_func()->layoutDirection;
+    }
+
+    static Qt::LayoutDirection getEffectiveLayoutDirection(const QSGBasePositioner *positioner)
+    {
+        if (positioner->d_func()->effectiveLayoutMirror)
+            return positioner->d_func()->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
+        else
+            return positioner->d_func()->layoutDirection;
+    }
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGPOSITIONERS_P_P_H
diff --git a/src/declarative/items/qsgrectangle.cpp b/src/declarative/items/qsgrectangle.cpp
new file mode 100644
index 0000000000..247d6336b2
--- /dev/null
+++ b/src/declarative/items/qsgrectangle.cpp
@@ -0,0 +1,286 @@
+// Commit: acc903853d5ac54d646d324b7386c998bc07d464
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgrectangle_p.h"
+#include "qsgrectangle_p_p.h"
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+
+#include <QtGui/qpixmapcache.h>
+#include <QtCore/qstringbuilder.h>
+#include <QtCore/qmath.h>
+
+QT_BEGIN_NAMESPACE
+
+// XXX todo - should we change rectangle to draw entirely within its width/height?
+
+QSGPen::QSGPen(QObject *parent)
+: QObject(parent), _width(1), _color("#000000"), _valid(false)
+{
+}
+
+QColor QSGPen::color() const 
+{ 
+    return _color; 
+}
+
+void QSGPen::setColor(const QColor &c)
+{
+    _color = c;
+    _valid = (_color.alpha() && _width >= 1) ? true : false;
+    emit penChanged();
+}
+
+int QSGPen::width() const 
+{ 
+    return _width; 
+}
+
+void QSGPen::setWidth(int w)
+{
+    if (_width == w && _valid)
+        return;
+
+    _width = w;
+    _valid = (_color.alpha() && _width >= 1) ? true : false;
+    emit penChanged();
+}
+
+bool QSGPen::isValid() const
+{ 
+    return _valid; 
+}
+
+QSGGradientStop::QSGGradientStop(QObject *parent) 
+: QObject(parent) 
+{
+}
+
+qreal QSGGradientStop::position() const 
+{ 
+    return m_position; 
+}
+
+void QSGGradientStop::setPosition(qreal position) 
+{ 
+    m_position = position; updateGradient(); 
+}
+
+QColor QSGGradientStop::color() const 
+{ 
+    return m_color; 
+}
+
+void QSGGradientStop::setColor(const QColor &color) 
+{ 
+    m_color = color; updateGradient(); 
+}
+
+void QSGGradientStop::updateGradient()
+{
+    if (QSGGradient *grad = qobject_cast<QSGGradient*>(parent()))
+        grad->doUpdate();
+}
+
+QSGGradient::QSGGradient(QObject *parent) 
+: QObject(parent), m_gradient(0) 
+{
+}
+
+QSGGradient::~QSGGradient() 
+{ 
+    delete m_gradient; 
+}
+
+QDeclarativeListProperty<QSGGradientStop> QSGGradient::stops() 
+{ 
+    return QDeclarativeListProperty<QSGGradientStop>(this, m_stops); 
+}
+
+const QGradient *QSGGradient::gradient() const
+{
+    if (!m_gradient && !m_stops.isEmpty()) {
+        m_gradient = new QLinearGradient(0,0,0,1.0);
+        for (int i = 0; i < m_stops.count(); ++i) {
+            const QSGGradientStop *stop = m_stops.at(i);
+            m_gradient->setCoordinateMode(QGradient::ObjectBoundingMode);
+            m_gradient->setColorAt(stop->position(), stop->color());
+        }
+    }
+
+    return m_gradient;
+}
+
+void QSGGradient::doUpdate()
+{
+    delete m_gradient;
+    m_gradient = 0;
+    emit updated();
+}
+
+int QSGRectanglePrivate::doUpdateSlotIdx = -1;
+
+QSGRectangle::QSGRectangle(QSGItem *parent)
+: QSGItem(*(new QSGRectanglePrivate), parent)
+{
+    setFlag(ItemHasContents);
+}
+
+void QSGRectangle::doUpdate()
+{
+    Q_D(QSGRectangle);
+    const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
+    d->setPaintMargin((pw+1)/2);
+    update();
+}
+
+QSGPen *QSGRectangle::border()
+{
+    Q_D(QSGRectangle);
+    return d->getPen();
+}
+
+QSGGradient *QSGRectangle::gradient() const
+{
+    Q_D(const QSGRectangle);
+    return d->gradient;
+}
+
+void QSGRectangle::setGradient(QSGGradient *gradient)
+{
+    Q_D(QSGRectangle);
+    if (d->gradient == gradient)
+        return;
+    static int updatedSignalIdx = -1;
+    if (updatedSignalIdx < 0)
+        updatedSignalIdx = QSGGradient::staticMetaObject.indexOfSignal("updated()");
+    if (d->doUpdateSlotIdx < 0)
+        d->doUpdateSlotIdx = QSGRectangle::staticMetaObject.indexOfSlot("doUpdate()");
+    if (d->gradient)
+        QMetaObject::disconnect(d->gradient, updatedSignalIdx, this, d->doUpdateSlotIdx);
+    d->gradient = gradient;
+    if (d->gradient)
+        QMetaObject::connect(d->gradient, updatedSignalIdx, this, d->doUpdateSlotIdx);
+    update();
+}
+
+qreal QSGRectangle::radius() const
+{
+    Q_D(const QSGRectangle);
+    return d->radius;
+}
+
+void QSGRectangle::setRadius(qreal radius)
+{
+    Q_D(QSGRectangle);
+    if (d->radius == radius)
+        return;
+
+    d->radius = radius;
+    update();
+    emit radiusChanged();
+}
+
+QColor QSGRectangle::color() const
+{
+    Q_D(const QSGRectangle);
+    return d->color;
+}
+
+void QSGRectangle::setColor(const QColor &c)
+{
+    Q_D(QSGRectangle);
+    if (d->color == c)
+        return;
+
+    d->color = c;
+    update();
+    emit colorChanged();
+}
+
+QSGNode *QSGRectangle::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
+{
+    Q_UNUSED(data);
+    Q_D(QSGRectangle);
+
+    if (width() <= 0 || height() <= 0) {
+        delete oldNode;
+        return 0;
+    }
+
+    QSGRectangleNode *rectangle = static_cast<QSGRectangleNode *>(oldNode);
+    if (!rectangle) rectangle = d->sceneGraphContext()->createRectangleNode();
+
+    rectangle->setRect(QRectF(0, 0, width(), height()));
+    rectangle->setColor(d->color);
+
+    if (d->pen && d->pen->isValid()) {
+        rectangle->setPenColor(d->pen->color());
+        rectangle->setPenWidth(d->pen->width());
+    } else {
+        rectangle->setPenColor(QColor());
+        rectangle->setPenWidth(0);
+    }
+
+    rectangle->setRadius(d->radius);
+
+    QGradientStops stops;
+    if (d->gradient) {
+        QList<QSGGradientStop *> qxstops = d->gradient->m_stops;
+        for (int i = 0; i < qxstops.size(); ++i)
+            stops.append(QGradientStop(qxstops.at(i)->position(), qxstops.at(i)->color()));
+    }
+    rectangle->setGradientStops(stops);
+
+    rectangle->update();
+
+    return rectangle;
+}
+
+QRectF QSGRectangle::boundingRect() const
+{
+    Q_D(const QSGRectangle);
+    return QRectF(-d->paintmargin, -d->paintmargin, width()+d->paintmargin*2, height()+d->paintmargin*2);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgrectangle_p.h b/src/declarative/items/qsgrectangle_p.h
new file mode 100644
index 0000000000..6cd5172f35
--- /dev/null
+++ b/src/declarative/items/qsgrectangle_p.h
@@ -0,0 +1,184 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGRECTANGLE_P_H
+#define QSGRECTANGLE_P_H
+
+#include "qsgitem.h"
+
+#include <QtGui/qbrush.h>
+
+#include <private/qdeclarativeglobal_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGPen : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(int width READ width WRITE setWidth NOTIFY penChanged)
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY penChanged)
+public:
+    QSGPen(QObject *parent=0);
+
+    int width() const;
+    void setWidth(int w);
+
+    QColor color() const;
+    void setColor(const QColor &c);
+
+    bool isValid() const;
+
+Q_SIGNALS:
+    void penChanged();
+
+private:
+    int _width;
+    QColor _color;
+    bool _valid;
+};
+
+class Q_AUTOTEST_EXPORT QSGGradientStop : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal position READ position WRITE setPosition)
+    Q_PROPERTY(QColor color READ color WRITE setColor)
+
+public:
+    QSGGradientStop(QObject *parent=0);
+
+    qreal position() const;
+    void setPosition(qreal position);
+
+    QColor color() const;
+    void setColor(const QColor &color);
+
+private:
+    void updateGradient();
+
+private:
+    qreal m_position;
+    QColor m_color;
+};
+
+class Q_AUTOTEST_EXPORT QSGGradient : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QDeclarativeListProperty<QSGGradientStop> stops READ stops)
+    Q_CLASSINFO("DefaultProperty", "stops")
+
+public:
+    QSGGradient(QObject *parent=0);
+    ~QSGGradient();
+
+    QDeclarativeListProperty<QSGGradientStop> stops();
+
+    const QGradient *gradient() const;
+
+Q_SIGNALS:
+    void updated();
+
+private:
+    void doUpdate();
+
+private:
+    QList<QSGGradientStop *> m_stops;
+    mutable QGradient *m_gradient;
+    friend class QSGRectangle;
+    friend class QSGGradientStop;
+};
+
+class QSGRectanglePrivate;
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGRectangle : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+    Q_PROPERTY(QSGGradient *gradient READ gradient WRITE setGradient)
+    Q_PROPERTY(QSGPen * border READ border CONSTANT)
+    Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged)
+public:
+    QSGRectangle(QSGItem *parent=0);
+
+    QColor color() const;
+    void setColor(const QColor &);
+
+    QSGPen *border();
+
+    QSGGradient *gradient() const;
+    void setGradient(QSGGradient *gradient);
+
+    qreal radius() const;
+    void setRadius(qreal radius);
+
+    QRectF boundingRect() const;
+
+Q_SIGNALS:
+    void colorChanged();
+    void radiusChanged();
+
+protected:
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private Q_SLOTS:
+    void doUpdate();
+
+private:
+    Q_DISABLE_COPY(QSGRectangle)
+    Q_DECLARE_PRIVATE(QSGRectangle)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGPen)
+QML_DECLARE_TYPE(QSGGradientStop)
+QML_DECLARE_TYPE(QSGGradient)
+QML_DECLARE_TYPE(QSGRectangle)
+
+QT_END_HEADER
+
+#endif // QSGRECTANGLE_P_H
diff --git a/src/declarative/items/qsgrectangle_p_p.h b/src/declarative/items/qsgrectangle_p_p.h
new file mode 100644
index 0000000000..15bbd1f032
--- /dev/null
+++ b/src/declarative/items/qsgrectangle_p_p.h
@@ -0,0 +1,109 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGRECTANGLE_P_P_H
+#define QSGRECTANGLE_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGGradient;
+class QSGRectangle;
+class QSGRectanglePrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGRectangle)
+
+public:
+    QSGRectanglePrivate() :
+    color(Qt::white), gradient(0), pen(0), radius(0), paintmargin(0)
+    {
+    }
+
+    ~QSGRectanglePrivate()
+    {
+        delete pen;
+    }
+
+    QColor color;
+    QSGGradient *gradient;
+    QSGPen *pen;
+    qreal radius;
+    qreal paintmargin;
+    static int doUpdateSlotIdx;
+
+    QSGPen *getPen() {
+        if (!pen) {
+            Q_Q(QSGRectangle);
+            pen = new QSGPen;
+            static int penChangedSignalIdx = -1;
+            if (penChangedSignalIdx < 0)
+                penChangedSignalIdx = QSGPen::staticMetaObject.indexOfSignal("penChanged()");
+            if (doUpdateSlotIdx < 0)
+                doUpdateSlotIdx = QSGRectangle::staticMetaObject.indexOfSlot("doUpdate()");
+            QMetaObject::connect(pen, penChangedSignalIdx, q, doUpdateSlotIdx);
+        }
+        return pen;
+    }
+
+    void setPaintMargin(qreal margin)
+    {
+        if (margin == paintmargin)
+            return;
+        paintmargin = margin;
+    }
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGRECTANGLE_P_P_H
diff --git a/src/declarative/items/qsgrepeater.cpp b/src/declarative/items/qsgrepeater.cpp
new file mode 100644
index 0000000000..ac6086fc62
--- /dev/null
+++ b/src/declarative/items/qsgrepeater.cpp
@@ -0,0 +1,294 @@
+// Commit: a9f1eaa6a368bf7a72b52c428728a3e3e0a76209
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgrepeater_p.h"
+#include "qsgrepeater_p_p.h"
+#include "qsgvisualitemmodel_p.h"
+
+#include <private/qdeclarativeglobal_p.h>
+#include <private/qdeclarativelistaccessor_p.h>
+#include <private/qlistmodelinterface_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGRepeaterPrivate::QSGRepeaterPrivate()
+: model(0), ownModel(false)
+{
+}
+
+QSGRepeaterPrivate::~QSGRepeaterPrivate()
+{
+    if (ownModel)
+        delete model;
+}
+
+QSGRepeater::QSGRepeater(QSGItem *parent)
+  : QSGItem(*(new QSGRepeaterPrivate), parent)
+{
+}
+
+QSGRepeater::~QSGRepeater()
+{
+}
+
+QVariant QSGRepeater::model() const
+{
+    Q_D(const QSGRepeater);
+    return d->dataSource;
+}
+
+void QSGRepeater::setModel(const QVariant &model)
+{
+    Q_D(QSGRepeater);
+    if (d->dataSource == model)
+        return;
+
+    clear();
+    if (d->model) {
+        disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        /*
+        disconnect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        disconnect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+    */
+    }
+    d->dataSource = model;
+    QObject *object = qvariant_cast<QObject*>(model);
+    QSGVisualModel *vim = 0;
+    if (object && (vim = qobject_cast<QSGVisualModel *>(object))) {
+        if (d->ownModel) {
+            delete d->model;
+            d->ownModel = false;
+        }
+        d->model = vim;
+    } else {
+        if (!d->ownModel) {
+            d->model = new QSGVisualDataModel(qmlContext(this));
+            d->ownModel = true;
+        }
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            dataModel->setModel(model);
+    }
+    if (d->model) {
+        connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
+        connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
+        connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
+        /*
+        connect(d->model, SIGNAL(createdItem(int,QSGItem*)), this, SLOT(createdItem(int,QSGItem*)));
+        connect(d->model, SIGNAL(destroyingItem(QSGItem*)), this, SLOT(destroyingItem(QSGItem*)));
+        */
+        regenerate();
+    }
+    emit modelChanged();
+    emit countChanged();
+}
+
+QDeclarativeComponent *QSGRepeater::delegate() const
+{
+    Q_D(const QSGRepeater);
+    if (d->model) {
+        if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+            return dataModel->delegate();
+    }
+
+    return 0;
+}
+
+void QSGRepeater::setDelegate(QDeclarativeComponent *delegate)
+{
+    Q_D(QSGRepeater);
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
+       if (delegate == dataModel->delegate())
+           return;
+
+    if (!d->ownModel) {
+        d->model = new QSGVisualDataModel(qmlContext(this));
+        d->ownModel = true;
+    }
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model)) {
+        dataModel->setDelegate(delegate);
+        regenerate();
+        emit delegateChanged();
+    }
+}
+
+int QSGRepeater::count() const
+{
+    Q_D(const QSGRepeater);
+    if (d->model)
+        return d->model->count();
+    return 0;
+}
+
+QSGItem *QSGRepeater::itemAt(int index) const
+{
+    Q_D(const QSGRepeater);
+    if (index >= 0 && index < d->deletables.count())
+        return d->deletables[index];
+    return 0;
+}
+
+void QSGRepeater::componentComplete()
+{
+    QSGItem::componentComplete();
+    regenerate();
+}
+
+void QSGRepeater::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    QSGItem::itemChange(change, value);
+    if (change == ItemParentHasChanged) {
+        regenerate();
+    }
+}
+
+void QSGRepeater::clear()
+{
+    Q_D(QSGRepeater);
+    bool complete = isComponentComplete();
+
+    if (d->model) {
+        while (d->deletables.count() > 0) {
+            QSGItem *item = d->deletables.takeLast();
+            if (complete)
+                emit itemRemoved(d->deletables.count()-1, item);
+            d->model->release(item);
+        }
+    }
+    d->deletables.clear();
+}
+
+void QSGRepeater::regenerate()
+{
+    Q_D(QSGRepeater);
+    if (!isComponentComplete())
+        return;
+
+    clear();
+
+    if (!d->model || !d->model->count() || !d->model->isValid() || !parentItem() || !isComponentComplete())
+        return;
+
+    for (int ii = 0; ii < count(); ++ii) {
+        QSGItem *item = d->model->item(ii);
+        if (item) {
+            QDeclarative_setParent_noEvent(item, parentItem());
+            item->setParentItem(parentItem());
+            item->stackBefore(this);
+            d->deletables << item;
+            emit itemAdded(ii, item);
+        }
+    }
+}
+
+void QSGRepeater::itemsInserted(int index, int count)
+{
+    Q_D(QSGRepeater);
+    if (!isComponentComplete())
+        return;
+    for (int i = 0; i < count; ++i) {
+        int modelIndex = index + i;
+        QSGItem *item = d->model->item(modelIndex);
+        if (item) {
+            QDeclarative_setParent_noEvent(item, parentItem());
+            item->setParentItem(parentItem());
+            if (modelIndex < d->deletables.count())
+                item->stackBefore(d->deletables.at(modelIndex));
+            else
+                item->stackBefore(this);
+            d->deletables.insert(modelIndex, item);
+            emit itemAdded(modelIndex, item);
+        }
+    }
+    emit countChanged();
+}
+
+void QSGRepeater::itemsRemoved(int index, int count)
+{
+    Q_D(QSGRepeater);
+    if (!isComponentComplete() || count <= 0)
+        return;
+    while (count--) {
+        QSGItem *item = d->deletables.takeAt(index);
+        emit itemRemoved(index, item);
+        if (item)
+            d->model->release(item);
+        else
+            break;
+    }
+    emit countChanged();
+}
+
+void QSGRepeater::itemsMoved(int from, int to, int count)
+{
+    Q_D(QSGRepeater);
+    if (!isComponentComplete() || count <= 0)
+        return;
+    if (from + count > d->deletables.count()) {
+        regenerate();
+        return;
+    }
+    QList<QSGItem*> removed;
+    int removedCount = count;
+    while (removedCount--)
+        removed << d->deletables.takeAt(from);
+    for (int i = 0; i < count; ++i)
+        d->deletables.insert(to + i, removed.at(i));
+    d->deletables.last()->stackBefore(this);
+    for (int i = d->model->count()-1; i > 0; --i) {
+        QSGItem *item = d->deletables.at(i-1);
+        item->stackBefore(d->deletables.at(i));
+    }
+}
+
+void QSGRepeater::modelReset()
+{
+    if (!isComponentComplete())
+        return;
+    regenerate();
+    emit countChanged();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgrepeater_p.h b/src/declarative/items/qsgrepeater_p.h
new file mode 100644
index 0000000000..3a53fa4177
--- /dev/null
+++ b/src/declarative/items/qsgrepeater_p.h
@@ -0,0 +1,111 @@
+// Commit: ebd4bc73c46c2962742a682b6a391fb68c482aec
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGREPEATER_P_H
+#define QSGREPEATER_P_H
+
+#include "qsgitem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGRepeaterPrivate;
+class Q_AUTOTEST_EXPORT QSGRepeater : public QSGItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_PROPERTY(int count READ count NOTIFY countChanged)
+    Q_CLASSINFO("DefaultProperty", "delegate")
+
+public:
+    QSGRepeater(QSGItem *parent=0);
+    virtual ~QSGRepeater();
+
+    QVariant model() const;
+    void setModel(const QVariant &);
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    int count() const;
+
+    Q_INVOKABLE QSGItem *itemAt(int index) const;
+
+Q_SIGNALS:
+    void modelChanged();
+    void delegateChanged();
+    void countChanged();
+
+    void itemAdded(int index, QSGItem *item);
+    void itemRemoved(int index, QSGItem *item);
+
+private:
+    void clear();
+    void regenerate();
+
+protected:
+    virtual void componentComplete();
+    void itemChange(ItemChange change, const ItemChangeData &value);
+
+private Q_SLOTS:
+    void itemsInserted(int,int);
+    void itemsRemoved(int,int);
+    void itemsMoved(int,int,int);
+    void modelReset();
+
+private:
+    Q_DISABLE_COPY(QSGRepeater)
+    Q_DECLARE_PRIVATE(QSGRepeater)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGRepeater)
+
+QT_END_HEADER
+
+#endif // QSGREPEATER_P_H
diff --git a/src/declarative/items/qsgrepeater_p_p.h b/src/declarative/items/qsgrepeater_p_p.h
new file mode 100644
index 0000000000..155f1b8c6d
--- /dev/null
+++ b/src/declarative/items/qsgrepeater_p_p.h
@@ -0,0 +1,83 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGREPEATER_P_P_H
+#define QSGREPEATER_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgrepeater_p.h"
+#include "qsgitem_p.h"
+
+#include <QtCore/qpointer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeContext;
+class QSGVisualModel;
+class QSGRepeaterPrivate : public QSGItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGRepeater)
+
+public:
+    QSGRepeaterPrivate();
+    ~QSGRepeaterPrivate();
+
+    QSGVisualModel *model;
+    QVariant dataSource;
+    bool ownModel;
+
+    QList<QPointer<QSGItem> > deletables;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGREPEATER_P_P_H
diff --git a/src/declarative/items/qsgscalegrid.cpp b/src/declarative/items/qsgscalegrid.cpp
new file mode 100644
index 0000000000..4a73801159
--- /dev/null
+++ b/src/declarative/items/qsgscalegrid.cpp
@@ -0,0 +1,213 @@
+// Commit: 7ddec9f3179bfd854ae53e23ab292de1f9a26377
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgscalegrid_p_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \internal
+    \class QSGScaleGrid
+    \brief The QSGScaleGrid class allows you to specify a 3x3 grid to use in scaling an image.
+*/
+
+QSGScaleGrid::QSGScaleGrid(QObject *parent) : QObject(parent), _left(0), _top(0), _right(0), _bottom(0)
+{
+}
+
+QSGScaleGrid::~QSGScaleGrid()
+{
+}
+
+bool QSGScaleGrid::isNull() const
+{
+    return !_left && !_top && !_right && !_bottom;
+}
+
+void QSGScaleGrid::setLeft(int pos)
+{
+    if (_left != pos) {
+        _left = pos;
+        emit borderChanged();
+    }
+}
+
+void QSGScaleGrid::setTop(int pos)
+{
+    if (_top != pos) {
+        _top = pos;
+        emit borderChanged();
+    }
+}
+
+void QSGScaleGrid::setRight(int pos)
+{
+    if (_right != pos) {
+        _right = pos;
+        emit borderChanged();
+    }
+}
+
+void QSGScaleGrid::setBottom(int pos)
+{
+    if (_bottom != pos) {
+        _bottom = pos;
+        emit borderChanged();
+    }
+}
+
+QSGGridScaledImage::QSGGridScaledImage()
+: _l(-1), _r(-1), _t(-1), _b(-1),
+  _h(QSGBorderImage::Stretch), _v(QSGBorderImage::Stretch)
+{
+}
+
+QSGGridScaledImage::QSGGridScaledImage(const QSGGridScaledImage &o)
+: _l(o._l), _r(o._r), _t(o._t), _b(o._b), _h(o._h), _v(o._v), _pix(o._pix)
+{
+}
+
+QSGGridScaledImage &QSGGridScaledImage::operator=(const QSGGridScaledImage &o)
+{
+    _l = o._l;
+    _r = o._r;
+    _t = o._t;
+    _b = o._b;
+    _h = o._h;
+    _v = o._v;
+    _pix = o._pix;
+    return *this;
+}
+
+QSGGridScaledImage::QSGGridScaledImage(QIODevice *data)
+: _l(-1), _r(-1), _t(-1), _b(-1), _h(QSGBorderImage::Stretch), _v(QSGBorderImage::Stretch)
+{
+    int l = -1;
+    int r = -1;
+    int t = -1;
+    int b = -1;
+    QString imgFile;
+
+    QByteArray raw;
+    while(raw = data->readLine(), !raw.isEmpty()) {
+        QString line = QString::fromUtf8(raw.trimmed());
+        if (line.isEmpty() || line.startsWith(QLatin1Char('#')))
+            continue;
+
+        int colonId = line.indexOf(QLatin1Char(':'));
+        if (colonId <= 0)
+            return;
+
+        QStringList list;
+        list.append(line.left(colonId).trimmed());
+        list.append(line.mid(colonId+1).trimmed());
+
+        if (list[0] == QLatin1String("border.left"))
+            l = list[1].toInt();
+        else if (list[0] == QLatin1String("border.right"))
+            r = list[1].toInt();
+        else if (list[0] == QLatin1String("border.top"))
+            t = list[1].toInt();
+        else if (list[0] == QLatin1String("border.bottom"))
+            b = list[1].toInt();
+        else if (list[0] == QLatin1String("source"))
+            imgFile = list[1];
+        else if (list[0] == QLatin1String("horizontalTileRule"))
+            _h = stringToRule(list[1]);
+        else if (list[0] == QLatin1String("verticalTileRule"))
+            _v = stringToRule(list[1]);
+    }
+
+    if (l < 0 || r < 0 || t < 0 || b < 0 || imgFile.isEmpty())
+        return;
+
+    _l = l; _r = r; _t = t; _b = b;
+
+    _pix = imgFile;
+}
+
+QSGBorderImage::TileMode QSGGridScaledImage::stringToRule(const QString &s)
+{
+    if (s == QLatin1String("Stretch"))
+        return QSGBorderImage::Stretch;
+    if (s == QLatin1String("Repeat"))
+        return QSGBorderImage::Repeat;
+    if (s == QLatin1String("Round"))
+        return QSGBorderImage::Round;
+
+    qWarning("QSGGridScaledImage: Invalid tile rule specified. Using Stretch.");
+    return QSGBorderImage::Stretch;
+}
+
+bool QSGGridScaledImage::isValid() const
+{
+    return _l >= 0;
+}
+
+int QSGGridScaledImage::gridLeft() const
+{
+    return _l;
+}
+
+int QSGGridScaledImage::gridRight() const
+{
+    return _r;
+}
+
+int QSGGridScaledImage::gridTop() const
+{
+    return _t;
+}
+
+int QSGGridScaledImage::gridBottom() const
+{
+    return _b;
+}
+
+QString QSGGridScaledImage::pixmapUrl() const
+{
+    return _pix;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgscalegrid_p_p.h b/src/declarative/items/qsgscalegrid_p_p.h
new file mode 100644
index 0000000000..57beb4b3b0
--- /dev/null
+++ b/src/declarative/items/qsgscalegrid_p_p.h
@@ -0,0 +1,134 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGSCALEGRID_P_P_H
+#define QSGSCALEGRID_P_P_H
+
+#include "qsgborderimage_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtCore/qobject.h>
+
+#include <private/qdeclarativepixmapcache_p.h>
+#include <private/qdeclarativeglobal_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGScaleGrid : public QObject
+{
+    Q_OBJECT
+    Q_ENUMS(TileRule)
+
+    Q_PROPERTY(int left READ left WRITE setLeft NOTIFY borderChanged)
+    Q_PROPERTY(int top READ top WRITE setTop NOTIFY borderChanged)
+    Q_PROPERTY(int right READ right WRITE setRight NOTIFY borderChanged)
+    Q_PROPERTY(int bottom READ bottom WRITE setBottom NOTIFY borderChanged)
+
+public:
+    QSGScaleGrid(QObject *parent=0);
+    ~QSGScaleGrid();
+
+    bool isNull() const;
+
+    int left() const { return _left; }
+    void setLeft(int);
+
+    int top() const { return _top; }
+    void setTop(int);
+
+    int right() const { return _right; }
+    void setRight(int);
+
+    int  bottom() const { return _bottom; }
+    void setBottom(int);
+
+Q_SIGNALS:
+    void borderChanged();
+
+private:
+    int _left;
+    int _top;
+    int _right;
+    int _bottom;
+};
+
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGGridScaledImage
+{
+public:
+    QSGGridScaledImage();
+    QSGGridScaledImage(const QSGGridScaledImage &);
+    QSGGridScaledImage(QIODevice*);
+    QSGGridScaledImage &operator=(const QSGGridScaledImage &);
+    bool isValid() const;
+    int gridLeft() const;
+    int gridRight() const;
+    int gridTop() const;
+    int gridBottom() const;
+    QSGBorderImage::TileMode horizontalTileRule() const { return _h; }
+    QSGBorderImage::TileMode verticalTileRule() const { return _v; }
+
+    QString pixmapUrl() const;
+
+private:
+    static QSGBorderImage::TileMode stringToRule(const QString &);
+
+private:
+    int _l;
+    int _r;
+    int _t;
+    int _b;
+    QSGBorderImage::TileMode _h;
+    QSGBorderImage::TileMode _v;
+    QString _pix;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGScaleGrid)
+
+QT_END_HEADER
+
+#endif // QSGSCALEGRID_P_P_H
diff --git a/src/declarative/items/qsgshadereffectitem.cpp b/src/declarative/items/qsgshadereffectitem.cpp
new file mode 100644
index 0000000000..286b67bacd
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectitem.cpp
@@ -0,0 +1,449 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qsgshadereffectitem_p.h>
+#include <private/qsgshadereffectnode_p.h>
+
+#include "qsgmaterial.h"
+#include "qsgitem_p.h"
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgtextureprovider_p.h>
+#include "qsgcanvas.h"
+
+#include <QtCore/qsignalmapper.h>
+#include <QtOpenGL/qglframebufferobject.h>
+
+QT_BEGIN_NAMESPACE
+
+static const char qt_default_vertex_code[] =
+    "uniform highp mat4 qt_ModelViewProjectionMatrix;               \n"
+    "attribute highp vec4 qt_Vertex;                                \n"
+    "attribute highp vec2 qt_MultiTexCoord0;                        \n"
+    "varying highp vec2 qt_TexCoord0;                               \n"
+    "void main() {                                                  \n"
+    "    qt_TexCoord0 = qt_MultiTexCoord0;                          \n"
+    "    gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex;    \n"
+    "}";
+
+static const char qt_default_fragment_code[] =
+    "varying highp vec2 qt_TexCoord0;                                   \n"
+    "uniform sampler2D source;                                          \n"
+    "uniform lowp float qt_Opacity;                                     \n"
+    "void main() {                                                      \n"
+    "    gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity;   \n"
+    "}";
+
+static const char qt_position_attribute_name[] = "qt_Vertex";
+static const char qt_texcoord_attribute_name[] = "qt_MultiTexCoord0";
+
+const char *qtPositionAttributeName()
+{
+    return qt_position_attribute_name;
+}
+
+const char *qtTexCoordAttributeName()
+{
+    return qt_texcoord_attribute_name;
+}
+
+QSGShaderEffectItem::QSGShaderEffectItem(QSGItem *parent)
+    : QSGItem(parent)
+    , m_mesh(0)
+    , m_cullMode(NoCulling)
+    , m_blending(true)
+    , m_dirtyData(true)
+    , m_programDirty(true)
+    , m_dirtyMesh(true)
+    , m_dirtyGeometry(true)
+{
+    setFlag(QSGItem::ItemHasContents);
+}
+
+QSGShaderEffectItem::~QSGShaderEffectItem()
+{
+    reset();
+}
+
+void QSGShaderEffectItem::componentComplete()
+{
+    updateProperties();
+    QSGItem::componentComplete();
+}
+
+void QSGShaderEffectItem::setFragmentShader(const QByteArray &code)
+{
+    if (m_source.fragmentCode.constData() == code.constData())
+        return;
+    m_source.fragmentCode = code;
+    if (isComponentComplete()) {
+        reset();
+        updateProperties();
+    }
+    emit fragmentShaderChanged();
+}
+
+void QSGShaderEffectItem::setVertexShader(const QByteArray &code)
+{
+    if (m_source.vertexCode.constData() == code.constData())
+        return;
+    m_source.vertexCode = code;
+    if (isComponentComplete()) {
+        reset();
+        updateProperties();
+    }
+    emit vertexShaderChanged();
+}
+
+void QSGShaderEffectItem::setBlending(bool enable)
+{
+    if (blending() == enable)
+        return;
+
+    m_blending = enable;
+    update();
+
+    emit blendingChanged();
+}
+
+void QSGShaderEffectItem::setMesh(QSGShaderEffectMesh *mesh)
+{
+    if (mesh == m_mesh)
+        return;
+    if (m_mesh)
+        disconnect(m_mesh, SIGNAL(geometryChanged()), this, 0);
+    m_mesh = mesh;
+    if (m_mesh)
+        connect(m_mesh, SIGNAL(geometryChanged()), this, SLOT(updateGeometry()));
+    m_dirtyMesh = true;
+    update();
+    emit meshChanged();
+}
+
+void QSGShaderEffectItem::setCullMode(CullMode face)
+{
+    if (face == m_cullMode)
+        return;
+    m_cullMode = face;
+    update();
+    emit cullModeChanged();
+}
+
+void QSGShaderEffectItem::changeSource(int index)
+{
+    Q_ASSERT(index >= 0 && index < m_sources.size());
+    QVariant v = property(m_sources.at(index).name.constData());
+    setSource(v, index);
+}
+
+void QSGShaderEffectItem::updateData()
+{
+    m_dirtyData = true;
+    update();
+}
+
+void QSGShaderEffectItem::updateGeometry()
+{
+    m_dirtyGeometry = true;
+    update();
+}
+
+void QSGShaderEffectItem::setSource(const QVariant &var, int index)
+{
+    Q_ASSERT(index >= 0 && index < m_sources.size());
+
+    SourceData &source = m_sources[index];
+
+    source.item = 0;
+    if (var.isNull()) {
+        return;
+    } else if (!qVariantCanConvert<QObject *>(var)) {
+        qWarning("Could not assign source of type '%s' to property '%s'.", var.typeName(), source.name.constData());
+        return;
+    }
+
+    QObject *obj = qVariantValue<QObject *>(var);
+
+    QSGTextureProvider *int3rface = QSGTextureProvider::from(obj);
+    if (!int3rface) {
+        qWarning("Could not assign property '%s', did not implement QSGTextureProvider.", source.name.constData());
+    }
+
+    source.item = qobject_cast<QSGItem *>(obj);
+
+    // TODO: Find better solution.
+    // 'source.item' needs a canvas to get a scenegraph node.
+    // The easiest way to make sure it gets a canvas is to
+    // make it a part of the same item tree as 'this'.
+    if (source.item && source.item->parentItem() == 0) {
+        source.item->setParentItem(this);
+        source.item->setVisible(false);
+    }
+}
+
+void QSGShaderEffectItem::disconnectPropertySignals()
+{
+    disconnect(this, 0, this, SLOT(updateData()));
+    for (int i = 0; i < m_sources.size(); ++i) {
+        SourceData &source = m_sources[i];
+        disconnect(this, 0, source.mapper, 0);
+        disconnect(source.mapper, 0, this, 0);
+    }
+}
+
+void QSGShaderEffectItem::connectPropertySignals()
+{
+    QSet<QByteArray>::const_iterator it;
+    for (it = m_source.uniformNames.begin(); it != m_source.uniformNames.end(); ++it) {
+        int pi = metaObject()->indexOfProperty(it->constData());
+        if (pi >= 0) {
+            QMetaProperty mp = metaObject()->property(pi);
+            if (!mp.hasNotifySignal())
+                qWarning("QSGShaderEffectItem: property '%s' does not have notification method!", it->constData());
+            QByteArray signalName("2");
+            signalName.append(mp.notifySignal().signature());
+            connect(this, signalName, this, SLOT(updateData()));
+        } else {
+            qWarning("QSGShaderEffectItem: '%s' does not have a matching property!", it->constData());
+        }
+    }
+    for (int i = 0; i < m_sources.size(); ++i) {
+        SourceData &source = m_sources[i];
+        int pi = metaObject()->indexOfProperty(source.name.constData());
+        if (pi >= 0) {
+            QMetaProperty mp = metaObject()->property(pi);
+            QByteArray signalName("2");
+            signalName.append(mp.notifySignal().signature());
+            connect(this, signalName, source.mapper, SLOT(map()));
+            source.mapper->setMapping(this, i);
+            connect(source.mapper, SIGNAL(mapped(int)), this, SLOT(changeSource(int)));
+        } else {
+            qWarning("QSGShaderEffectItem: '%s' does not have a matching source!", source.name.constData());
+        }
+    }
+}
+
+void QSGShaderEffectItem::reset()
+{
+    disconnectPropertySignals();
+
+    m_source.attributeNames.clear();
+    m_source.uniformNames.clear();
+    m_source.respectsOpacity = false;
+    m_source.respectsMatrix = false;
+    m_source.className = metaObject()->className();
+
+    for (int i = 0; i < m_sources.size(); ++i) {
+        const SourceData &source = m_sources.at(i);
+        delete source.mapper;
+        if (source.item && source.item->parentItem() == this)
+            source.item->setParentItem(0);
+    }
+    m_sources.clear();
+
+    m_programDirty = true;
+    m_dirtyMesh = true;
+}
+
+void QSGShaderEffectItem::updateProperties()
+{
+    QByteArray vertexCode = m_source.vertexCode;
+    QByteArray fragmentCode = m_source.fragmentCode;
+    if (vertexCode.isEmpty())
+        vertexCode = qt_default_vertex_code;
+    if (fragmentCode.isEmpty())
+        fragmentCode = qt_default_fragment_code;
+
+    lookThroughShaderCode(vertexCode);
+    lookThroughShaderCode(fragmentCode);
+
+    if (!m_mesh && !m_source.attributeNames.contains(qt_position_attribute_name))
+        qWarning("QSGShaderEffectItem: Missing reference to \'%s\'.", qt_position_attribute_name);
+    if (!m_mesh && !m_source.attributeNames.contains(qt_texcoord_attribute_name))
+        qWarning("QSGShaderEffectItem: Missing reference to \'%s\'.", qt_texcoord_attribute_name);
+    if (!m_source.respectsMatrix)
+        qWarning("QSGShaderEffectItem: Missing reference to \'qt_ModelViewProjectionMatrix\'.");
+    if (!m_source.respectsOpacity)
+        qWarning("QSGShaderEffectItem: Missing reference to \'qt_Opacity\'.");
+
+    for (int i = 0; i < m_sources.size(); ++i) {
+        QVariant v = property(m_sources.at(i).name);
+        setSource(v, i);
+    }
+
+    connectPropertySignals();
+}
+
+void QSGShaderEffectItem::lookThroughShaderCode(const QByteArray &code)
+{
+    // Regexp for matching attributes and uniforms.
+    // In human readable form: attribute|uniform [lowp|mediump|highp] <type> <name>
+    static QRegExp re(QLatin1String("\\b(attribute|uniform)\\b\\s*\\b(?:lowp|mediump|highp)?\\b\\s*\\b(\\w+)\\b\\s*\\b(\\w+)"));
+    Q_ASSERT(re.isValid());
+
+    int pos = -1;
+
+    QString wideCode = QString::fromLatin1(code.constData(), code.size());
+
+    while ((pos = re.indexIn(wideCode, pos + 1)) != -1) {
+        QByteArray decl = re.cap(1).toLatin1(); // uniform or attribute
+        QByteArray type = re.cap(2).toLatin1(); // type
+        QByteArray name = re.cap(3).toLatin1(); // variable name
+
+        if (decl == "attribute") {
+            m_source.attributeNames.append(name);
+        } else {
+            Q_ASSERT(decl == "uniform");
+
+            if (name == "qt_ModelViewProjectionMatrix") {
+                m_source.respectsMatrix = true;
+            } else if (name == "qt_Opacity") {
+                m_source.respectsOpacity = true;
+            } else {
+                m_source.uniformNames.insert(name);
+                if (type == "sampler2D") {
+                    SourceData d;
+                    d.mapper = new QSignalMapper;
+                    d.name = name;
+                    d.item = 0;
+                    m_sources.append(d);
+                }
+            }
+        }
+    }
+}
+
+void QSGShaderEffectItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    m_dirtyGeometry = true;
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+QSGNode *QSGShaderEffectItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+    QSGShaderEffectNode *node = static_cast<QSGShaderEffectNode *>(oldNode);
+
+    if (!node) {
+        node = new QSGShaderEffectNode;
+        node->setMaterial(&m_material);
+        m_programDirty = true;
+        m_dirtyData = true;
+        m_dirtyGeometry = true;
+    }
+
+    if (m_dirtyMesh) {
+        node->setGeometry(0);
+        m_dirtyMesh = false;
+        m_dirtyGeometry = true;
+    }
+
+    if (m_dirtyGeometry) {
+        node->setFlag(QSGNode::OwnsGeometry, false);
+        QSGGeometry *geometry = node->geometry();
+        QRectF rect(0, 0, width(), height());
+        QSGShaderEffectMesh *mesh = m_mesh ? m_mesh : &m_defaultMesh;
+
+        geometry = mesh->updateGeometry(geometry, m_source.attributeNames, rect);
+        if (!geometry) {
+            delete node;
+            return 0;
+        }
+
+        node->setGeometry(geometry);
+        node->setFlag(QSGNode::OwnsGeometry, true);
+
+        m_dirtyGeometry = false;
+    }
+
+    if (m_programDirty) {
+        QSGShaderEffectProgram s = m_source;
+        if (s.fragmentCode.isEmpty())
+            s.fragmentCode = qt_default_fragment_code;
+        if (s.vertexCode.isEmpty())
+            s.vertexCode = qt_default_vertex_code;
+
+        m_material.setProgramSource(s);
+        node->markDirty(QSGNode::DirtyMaterial);
+        m_programDirty = false;
+    }
+
+    // Update blending
+    if (bool(m_material.flags() & QSGMaterial::Blending) != m_blending) {
+        m_material.setFlag(QSGMaterial::Blending, m_blending);
+        node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    if (int(m_material.cullMode()) != int(m_cullMode)) {
+        m_material.setCullMode(QSGShaderEffectMaterial::CullMode(m_cullMode));
+        node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    if (m_dirtyData) {
+        QVector<QPair<QByteArray, QVariant> > values;
+        QVector<QPair<QByteArray, QPointer<QSGItem> > > textures;
+        const QVector<QPair<QByteArray, QPointer<QSGItem> > > &oldTextures = m_material.textureProviders();
+
+        for (QSet<QByteArray>::const_iterator it = m_source.uniformNames.begin(); 
+             it != m_source.uniformNames.end(); ++it) {
+            values.append(qMakePair(*it, property(*it)));
+        }
+        for (int i = 0; i < oldTextures.size(); ++i) {
+            QSGTextureProvider *oldSource = QSGTextureProvider::from(oldTextures.at(i).second);
+            if (oldSource && oldSource->textureChangedSignal())
+                disconnect(oldTextures.at(i).second, oldSource->textureChangedSignal(), node, SLOT(markDirtyTexture()));
+        }
+        for (int i = 0; i < m_sources.size(); ++i) {
+            const SourceData &source = m_sources.at(i);
+            textures.append(qMakePair(source.name, source.item));
+            QSGTextureProvider *t = QSGTextureProvider::from(source.item);
+            if (t && t->textureChangedSignal())
+                connect(source.item, t->textureChangedSignal(), node, SLOT(markDirtyTexture()));
+        }
+        m_material.setUniforms(values);
+        m_material.setTextureProviders(textures);
+        node->markDirty(QSGNode::DirtyMaterial);
+        m_dirtyData = false;
+    }
+
+    return node;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgshadereffectitem_p.h b/src/declarative/items/qsgshadereffectitem_p.h
new file mode 100644
index 0000000000..84f80492aa
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectitem_p.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHADEREFFECTITEM_H
+#define SHADEREFFECTITEM_H
+
+#include "qsgitem.h"
+
+#include "qsgmaterial.h"
+#include <private/qsgadaptationlayer_p.h>
+#include <private/qsgshadereffectnode_p.h>
+#include "qsgshadereffectmesh_p.h"
+
+#include <QtCore/qpointer.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+const char *qtPositionAttributeName();
+const char *qtTexCoordAttributeName();
+
+class QSGContext;
+class QSignalMapper;
+class QSGCustomMaterialShader;
+
+class QSGShaderEffectItem : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(QByteArray fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged)
+    Q_PROPERTY(QByteArray vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged)
+    Q_PROPERTY(bool blending READ blending WRITE setBlending NOTIFY blendingChanged)
+    Q_PROPERTY(QSGShaderEffectMesh *mesh READ mesh WRITE setMesh NOTIFY meshChanged)
+    Q_PROPERTY(CullMode culling READ cullMode WRITE setCullMode NOTIFY cullModeChanged)
+    Q_ENUMS(CullMode)
+
+public:
+    enum CullMode
+    {
+        NoCulling = QSGShaderEffectMaterial::NoCulling,
+        BackFaceCulling = QSGShaderEffectMaterial::BackFaceCulling,
+        FrontFaceCulling = QSGShaderEffectMaterial::FrontFaceCulling
+    };
+
+    QSGShaderEffectItem(QSGItem *parent = 0);
+    ~QSGShaderEffectItem();
+
+    virtual void componentComplete();
+
+    QByteArray fragmentShader() const { return m_source.fragmentCode; }
+    void setFragmentShader(const QByteArray &code);
+    
+    QByteArray vertexShader() const { return m_source.vertexCode; }
+    void setVertexShader(const QByteArray &code);
+
+    bool blending() const { return m_blending; }
+    void setBlending(bool enable);
+
+    QSGShaderEffectMesh *mesh() const { return m_mesh; }
+    void setMesh(QSGShaderEffectMesh *mesh);
+
+    CullMode cullMode() const { return m_cullMode; }
+    void setCullMode(CullMode face);
+
+Q_SIGNALS:
+    void fragmentShaderChanged();
+    void vertexShaderChanged();
+    void blendingChanged();
+    void marginsChanged();
+    void meshChanged();
+    void cullModeChanged();
+
+protected:
+    virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private Q_SLOTS:
+    void changeSource(int index);
+    void updateData();
+    void updateGeometry();
+
+private:
+    friend class QSGCustomMaterialShader;
+    friend class QSGShaderEffectNode;
+
+    void setSource(const QVariant &var, int index);
+    void disconnectPropertySignals();
+    void connectPropertySignals();
+    void reset();
+    void updateProperties();
+    void lookThroughShaderCode(const QByteArray &code);
+
+    QSGShaderEffectProgram m_source;
+    QSGShaderEffectMesh *m_mesh;
+    QSGGridMesh m_defaultMesh;
+    CullMode m_cullMode;
+
+    struct SourceData
+    {
+        QSignalMapper *mapper;
+        QPointer<QSGItem> item;
+        QByteArray name;
+    };
+    QVector<SourceData> m_sources;
+    QSGShaderEffectMaterial m_material;
+
+    uint m_blending : 1;
+    uint m_dirtyData : 1;
+
+    uint m_programDirty : 1;
+    uint m_dirtyMesh : 1;
+    uint m_dirtyGeometry : 1;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SHADEREFFECTITEM_H
diff --git a/src/declarative/items/qsgshadereffectmesh.cpp b/src/declarative/items/qsgshadereffectmesh.cpp
new file mode 100644
index 0000000000..09d820706b
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectmesh.cpp
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgshadereffectmesh_p.h"
+#include "qsggeometry.h"
+#include "qsgshadereffectitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QSGShaderEffectMesh::QSGShaderEffectMesh(QObject *parent)
+    : QObject(parent)
+{
+}
+
+
+QSGGridMesh::QSGGridMesh(QObject *parent)
+    : QSGShaderEffectMesh(parent)
+    , m_resolution(1, 1)
+{
+    connect(this, SIGNAL(resolutionChanged()), this, SIGNAL(geometryChanged()));
+}
+
+QSGGeometry *QSGGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &dstRect) const
+{
+    int vmesh = m_resolution.height();
+    int hmesh = m_resolution.width();
+    int attrCount = attributes.count();
+
+    if (!geometry) {
+        bool error = true;
+        switch (attrCount) {
+        case 0:
+            qWarning("QSGGridMesh:: No attributes specified.");
+            break;
+        case 1:
+            if (attributes.at(0) == qtPositionAttributeName()) {
+                error = false;
+                break;
+            }
+            qWarning("QSGGridMesh:: Missing \'%s\' attribute.",
+                     qtPositionAttributeName());
+            break;
+        case 2:
+            if (attributes.contains(qtPositionAttributeName())
+                && attributes.contains(qtTexCoordAttributeName()))
+            {
+                error = false;
+                break;
+            }
+            qWarning("QSGGridMesh:: Missing \'%s\' or \'%s\' attribute.",
+                     qtPositionAttributeName(), qtTexCoordAttributeName());
+            break;
+        default:
+            qWarning("QSGGridMesh:: Too many attributes specified.");
+            break;;
+        }
+
+        if (error) {
+            delete geometry;
+            return 0;
+        }
+
+        geometry = new QSGGeometry(attrCount == 1
+                                   ? QSGGeometry::defaultAttributes_Point2D()
+                                   : QSGGeometry::defaultAttributes_TexturedPoint2D(),
+                                   (vmesh + 1) * (hmesh + 1), vmesh * 2 * (hmesh + 2),
+                                   GL_UNSIGNED_SHORT);
+
+    } else {
+        geometry->allocate((vmesh + 1) * (hmesh + 1), vmesh * 2 * (hmesh + 2));
+    }
+
+    QSGGeometry::Point2D *vdata = static_cast<QSGGeometry::Point2D *>(geometry->vertexData());
+
+    bool positionFirst = attributes.at(0) == qtPositionAttributeName();
+
+    QRectF srcRect(0, 1, 1, -1);
+    for (int iy = 0; iy <= vmesh; ++iy) {
+        float fy = iy / float(vmesh);
+        float y = float(dstRect.top()) + fy * float(dstRect.height());
+        float ty = float(srcRect.top()) + fy * float(srcRect.height());
+        for (int ix = 0; ix <= hmesh; ++ix) {
+            float fx = ix / float(hmesh);
+            for (int ia = 0; ia < attrCount; ++ia) {
+                if (positionFirst == (ia == 0)) {
+                    vdata->x = float(dstRect.left()) + fx * float(dstRect.width());
+                    vdata->y = y;
+                    ++vdata;
+                } else {
+                    vdata->x = float(srcRect.left()) + fx * float(srcRect.width());
+                    vdata->y = ty;
+                    ++vdata;
+                }
+            }
+        }
+    }
+
+    quint16 *indices = (quint16 *)geometry->indexDataAsUShort();
+    int i = 0;
+    for (int iy = 0; iy < vmesh; ++iy) {
+        *(indices++) = i + hmesh + 1;
+        for (int ix = 0; ix <= hmesh; ++ix, ++i) {
+            *(indices++) = i + hmesh + 1;
+            *(indices++) = i;
+        }
+        *(indices++) = i - 1;
+    }
+
+    return geometry;
+}
+
+void QSGGridMesh::setResolution(const QSize &res)
+{
+    if (res == m_resolution)
+        return;
+    if (res.width() < 1 || res.height() < 1) {
+        qWarning("QSGGridMesh: Resolution must be at least 1x1");
+        return;
+    }
+    m_resolution = res;
+    emit resolutionChanged();
+}
+
+QSize QSGGridMesh::resolution() const
+{
+    return m_resolution;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgshadereffectmesh_p.h b/src/declarative/items/qsgshadereffectmesh_p.h
new file mode 100644
index 0000000000..88198b5c40
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectmesh_p.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativeparserstatus.h"
+
+#include <QtCore/qobject.h>
+#include <QtCore/qsize.h>
+#include <QtCore/qvariant.h>
+#include <QtOpenGL/qglfunctions.h>
+
+#ifndef SHADEREFFECTMESH_H
+#define SHADEREFFECTMESH_H
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGGeometry;
+class QRectF;
+
+class QSGShaderEffectMesh : public QObject
+{
+    Q_OBJECT
+public:
+    QSGShaderEffectMesh(QObject *parent = 0);
+    // If 'geometry' != 0, 'attributes' is the same as last time the function was called.
+    virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const = 0;
+
+Q_SIGNALS:
+    // Emitted when the geometry needs to be updated.
+    void geometryChanged();
+};
+
+class QSGGridMesh : public QSGShaderEffectMesh
+{
+    Q_OBJECT
+    Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged)
+public:
+    QSGGridMesh(QObject *parent = 0);
+    virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const;
+
+    void setResolution(const QSize &res);
+    QSize resolution() const;
+
+Q_SIGNALS:
+    void resolutionChanged();
+
+private:
+    QSize m_resolution;
+};
+
+inline QColor qt_premultiply_color(const QColor &c)
+{
+    return QColor::fromRgbF(c.redF() * c.alphaF(), c.greenF() * c.alphaF(), c.blueF() * c.alphaF(), c.alphaF());
+}
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SHADEREFFECTITEM_H
diff --git a/src/declarative/items/qsgshadereffectnode.cpp b/src/declarative/items/qsgshadereffectnode.cpp
new file mode 100644
index 0000000000..d1c8fbca9e
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectnode.cpp
@@ -0,0 +1,322 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qsgshadereffectnode_p.h>
+
+#include "qsgshadereffectmesh_p.h"
+#include <private/qsgtextureprovider_p.h>
+#include <private/qsgrenderer_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGCustomMaterialShader : public QSGMaterialShader
+{
+public:
+    QSGCustomMaterialShader(const QSGShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes);
+    virtual void deactivate();
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+
+protected:
+    friend class QSGShaderEffectNode;
+
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    const QSGShaderEffectMaterialKey m_key;
+    QVector<const char *> m_attributeNames;
+    const QVector<QByteArray> m_attributes;
+
+    QVector<int> m_uniformLocs;
+    int m_opacityLoc;
+    int m_matrixLoc;
+    uint m_textureIndicesSet;
+};
+
+QSGCustomMaterialShader::QSGCustomMaterialShader(const QSGShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes)
+    : m_key(key)
+    , m_attributes(attributes)
+    , m_textureIndicesSet(false)
+{
+    for (int i = 0; i < attributes.count(); ++i)
+        m_attributeNames.append(attributes.at(i).constData());
+    m_attributeNames.append(0);
+}
+
+void QSGCustomMaterialShader::deactivate()
+{
+    glDisable(GL_CULL_FACE);
+}
+
+void QSGCustomMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(newEffect != 0);
+
+    const QSGShaderEffectMaterial *material = static_cast<const QSGShaderEffectMaterial *>(newEffect);
+
+    if (!m_textureIndicesSet) {
+        for (int i = 0; i < material->m_textures.size(); ++i)
+            m_program.setUniformValue(material->m_textures.at(i).first.constData(), i);
+        m_textureIndicesSet = true;
+    }
+
+    if (m_uniformLocs.size() != material->m_uniformValues.size()) {
+        m_uniformLocs.reserve(material->m_uniformValues.size());
+        for (int i = 0; i < material->m_uniformValues.size(); ++i) {
+            const QByteArray &name = material->m_uniformValues.at(i).first;
+            m_uniformLocs.append(m_program.uniformLocation(name.constData()));
+        }
+    }
+
+    QGLFunctions *functions = state.context()->functions();
+    for (int i = material->m_textures.size() - 1; i >= 0; --i) {
+        QPointer<QSGItem> source = material->m_textures.at(i).second;
+        QSGTextureProvider *provider = QSGTextureProvider::from(source);
+        QSGTexture *texture = provider ? provider->texture() : 0;
+        if (!source || !provider || !texture) {
+            qWarning("ShaderEffectItem: source or provider missing when binding textures");
+            continue;
+        }
+        functions->glActiveTexture(GL_TEXTURE0 + i);
+        provider->texture()->bind();
+    }
+
+    if (material->m_source.respectsOpacity)
+        m_program.setUniformValue(m_opacityLoc, state.opacity());
+
+    for (int i = 0; i < material->m_uniformValues.count(); ++i) {
+        const QVariant &v = material->m_uniformValues.at(i).second;
+
+        switch (v.type()) {
+        case QVariant::Color:
+            m_program.setUniformValue(m_uniformLocs.at(i), qt_premultiply_color(qvariant_cast<QColor>(v)));
+            break;
+        case QVariant::Double:
+            m_program.setUniformValue(m_uniformLocs.at(i), (float) qvariant_cast<double>(v));
+            break;
+        case QVariant::Transform:
+            m_program.setUniformValue(m_uniformLocs.at(i), qvariant_cast<QTransform>(v));
+            break;
+        case QVariant::Int:
+            m_program.setUniformValue(m_uniformLocs.at(i), v.toInt());
+            break;
+        case QVariant::Bool:
+            m_program.setUniformValue(m_uniformLocs.at(i), GLint(v.toBool()));
+            break;
+        case QVariant::Size:
+        case QVariant::SizeF:
+            m_program.setUniformValue(m_uniformLocs.at(i), v.toSizeF());
+            break;
+        case QVariant::Point:
+        case QVariant::PointF:
+            m_program.setUniformValue(m_uniformLocs.at(i), v.toPointF());
+            break;
+        case QVariant::Rect:
+        case QVariant::RectF:
+            {
+                QRectF r = v.toRectF();
+                m_program.setUniformValue(m_uniformLocs.at(i), r.x(), r.y(), r.width(), r.height());
+            }
+            break;
+        case QVariant::Vector3D:
+            m_program.setUniformValue(m_uniformLocs.at(i), qvariant_cast<QVector3D>(v));
+            break;
+        default:
+            break;
+        }
+    }
+
+    const QSGShaderEffectMaterial *oldMaterial = static_cast<const QSGShaderEffectMaterial *>(oldEffect);
+    if (oldEffect == 0 || material->cullMode() != oldMaterial->cullMode()) {
+        switch (material->cullMode()) {
+        case QSGShaderEffectMaterial::FrontFaceCulling:
+            glEnable(GL_CULL_FACE);
+            glCullFace(GL_FRONT);
+            break;
+        case QSGShaderEffectMaterial::BackFaceCulling:
+            glEnable(GL_CULL_FACE);
+            glCullFace(GL_BACK);
+            break;
+        default:
+            glDisable(GL_CULL_FACE);
+            break;
+        }
+    }
+
+    if ((state.isMatrixDirty()) && material->m_source.respectsMatrix)
+        m_program.setUniformValue(m_matrixLoc, state.combinedMatrix());
+}
+
+char const *const *QSGCustomMaterialShader::attributeNames() const
+{
+    return m_attributeNames.constData();
+}
+
+void QSGCustomMaterialShader::initialize()
+{
+    m_opacityLoc = m_program.uniformLocation("qt_Opacity");
+    m_matrixLoc = m_program.uniformLocation("qt_ModelViewProjectionMatrix");
+}
+
+const char *QSGCustomMaterialShader::vertexShader() const
+{
+    return m_key.vertexCode.constData();
+}
+
+const char *QSGCustomMaterialShader::fragmentShader() const
+{
+    return m_key.fragmentCode.constData();
+}
+
+
+bool QSGShaderEffectMaterialKey::operator == (const QSGShaderEffectMaterialKey &other) const
+{
+    return vertexCode == other.vertexCode && fragmentCode == other.fragmentCode && className == other.className;
+}
+
+uint qHash(const QSGShaderEffectMaterialKey &key)
+{
+    return qHash(qMakePair(qMakePair(key.vertexCode, key.fragmentCode), key.className));
+}
+
+
+QHash<QSGShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > QSGShaderEffectMaterial::materialMap;
+
+QSGShaderEffectMaterial::QSGShaderEffectMaterial()
+    : m_cullMode(NoCulling)
+{
+    setFlag(Blending, true);
+}
+
+QSGMaterialType *QSGShaderEffectMaterial::type() const
+{
+    return m_type.data();
+}
+
+QSGMaterialShader *QSGShaderEffectMaterial::createShader() const
+{
+    return new QSGCustomMaterialShader(m_source, m_source.attributeNames);
+}
+
+int QSGShaderEffectMaterial::compare(const QSGMaterial *other) const
+{
+    return this - static_cast<const QSGShaderEffectMaterial *>(other);
+}
+
+void QSGShaderEffectMaterial::setCullMode(QSGShaderEffectMaterial::CullMode face)
+{
+    m_cullMode = face;
+}
+
+QSGShaderEffectMaterial::CullMode QSGShaderEffectMaterial::cullMode() const
+{
+    return m_cullMode;
+}
+
+void QSGShaderEffectMaterial::setProgramSource(const QSGShaderEffectProgram &source)
+{
+    m_source = source;
+    m_type = materialMap.value(m_source);
+    if (m_type.isNull()) {
+        m_type = QSharedPointer<QSGMaterialType>(new QSGMaterialType);
+        materialMap.insert(m_source, m_type);
+    }
+}
+
+void QSGShaderEffectMaterial::setUniforms(const QVector<QPair<QByteArray, QVariant> > &uniformValues)
+{
+    m_uniformValues = uniformValues;
+}
+
+void QSGShaderEffectMaterial::setTextureProviders(const QVector<QPair<QByteArray, QPointer<QSGItem> > > &textures)
+{
+    m_textures = textures;
+}
+
+const QVector<QPair<QByteArray, QPointer<QSGItem> > > &QSGShaderEffectMaterial::textureProviders() const
+{
+    return m_textures;
+}
+
+void QSGShaderEffectMaterial::updateTextures() const
+{
+    for (int i = 0; i < m_textures.size(); ++i) {
+        QSGItem *item = m_textures.at(i).second;
+        if (item) {
+            QSGTextureProvider *provider = QSGTextureProvider::from(item);
+            if (provider) {
+                QSGTexture *texture = provider->texture();
+                if (!texture) {
+                    qWarning("QSGShaderEffectMaterial: no texture from %s [%s]",
+                             qPrintable(item->objectName()),
+                             item->metaObject()->className());
+                }
+                if (QSGDynamicTexture *t = qobject_cast<QSGDynamicTexture *>(provider->texture())) {
+                    t->updateTexture();
+                }
+            }
+        }
+    }
+}
+
+
+QSGShaderEffectNode::QSGShaderEffectNode()
+{
+    QSGNode::setFlag(UsePreprocess, true);
+}
+
+QSGShaderEffectNode::~QSGShaderEffectNode()
+{
+}
+
+void QSGShaderEffectNode::markDirtyTexture()
+{
+    markDirty(DirtyMaterial);
+}
+
+void QSGShaderEffectNode::preprocess()
+{
+    Q_ASSERT(material());
+    static_cast<QSGShaderEffectMaterial *>(material())->updateTextures();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgshadereffectnode_p.h b/src/declarative/items/qsgshadereffectnode_p.h
new file mode 100644
index 0000000000..0be4b36294
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectnode_p.h
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHADEREFFECTNODE_H
+#define SHADEREFFECTNODE_H
+
+#include "qsgnode.h"
+#include "qsgmaterial.h"
+#include <private/qsgtextureprovider_p.h>
+#include <qsgitem.h>
+
+#include <QtCore/qsharedpointer.h>
+#include <QtCore/qpointer.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+struct QSGShaderEffectMaterialKey {
+    QByteArray vertexCode;
+    QByteArray fragmentCode;
+    const char *className;
+
+    bool operator == (const QSGShaderEffectMaterialKey &other) const;
+};
+
+uint qHash(const QSGShaderEffectMaterialKey &key);
+
+// TODO: Implement support for multisampling.
+struct QSGShaderEffectProgram : public QSGShaderEffectMaterialKey
+{
+    QSGShaderEffectProgram() : respectsOpacity(false), respectsMatrix(false) {}
+
+    QVector<QByteArray> attributeNames;
+    QSet<QByteArray> uniformNames;
+
+    uint respectsOpacity : 1;
+    uint respectsMatrix : 1;
+};
+
+
+class QSGCustomMaterialShader;
+class QSGShaderEffectMaterial : public QSGMaterial
+{
+public:
+    enum CullMode
+    {
+        NoCulling,
+        BackFaceCulling,
+        FrontFaceCulling
+    };
+
+    QSGShaderEffectMaterial();
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const;
+
+    void setCullMode(CullMode face);
+    CullMode cullMode() const;
+
+    void setProgramSource(const QSGShaderEffectProgram &);
+    void setUniforms(const QVector<QPair<QByteArray, QVariant> > &uniformValues);
+    void setTextureProviders(const QVector<QPair<QByteArray, QPointer<QSGItem> > > &textures);
+    const QVector<QPair<QByteArray, QPointer<QSGItem> > > &textureProviders() const;
+    void updateTextures() const;
+
+protected:
+    friend class QSGShaderEffectItem;
+    friend class QSGCustomMaterialShader;
+
+    // The type pointer needs to be unique. It is not safe to let the type object be part of the
+    // QSGShaderEffectMaterial, since it can be deleted and a new one constructed on top of the old
+    // one. The new QSGShaderEffectMaterial would then get the same type pointer as the old one, and
+    // CustomMaterialShaders based on the old one would incorrectly be used together with the new
+    // one. To guarantee that the type pointer is unique, the type object must live as long as
+    // there are any CustomMaterialShaders of that type.
+    QSharedPointer<QSGMaterialType> m_type;
+
+    QSGShaderEffectProgram m_source;
+    QVector<QPair<QByteArray, QVariant> > m_uniformValues;
+    QVector<QPair<QByteArray, QPointer<QSGItem> > > m_textures;
+    CullMode m_cullMode;
+
+    static QHash<QSGShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > materialMap;
+};
+
+
+class QSGShaderEffectMesh;
+
+class QSGShaderEffectNode : public QObject, public QSGGeometryNode
+{
+    Q_OBJECT
+public:
+    QSGShaderEffectNode();
+    virtual ~QSGShaderEffectNode();
+
+    virtual void preprocess();
+
+private Q_SLOTS:
+    void markDirtyTexture();
+
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SHADEREFFECTNODE_H
diff --git a/src/declarative/items/qsgshadereffectsource.cpp b/src/declarative/items/qsgshadereffectsource.cpp
new file mode 100644
index 0000000000..36d380b15f
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectsource.cpp
@@ -0,0 +1,526 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgshadereffectsource_p.h"
+
+#include "qsgitem_p.h"
+#include "qsgcanvas_p.h"
+#include <private/qsgadaptationlayer_p.h>
+#include <private/qsgrenderer_p.h>
+
+#include "qglframebufferobject.h"
+#include "qmath.h"
+#include <private/qsgtexture_p.h>
+
+QT_BEGIN_NAMESPACE
+
+DEFINE_BOOL_CONFIG_OPTION(qmlFboOverlay, QML_FBO_OVERLAY)
+
+QSGShaderEffectTexture::QSGShaderEffectTexture(QSGItem *shaderSource)
+    : QSGDynamicTexture()
+    , m_item(0)
+    , m_format(GL_RGBA)
+    , m_shaderSource(shaderSource)
+    , m_renderer(0)
+    , m_fbo(0)
+    , m_multisampledFbo(0)
+#ifdef QSG_DEBUG_FBO_OVERLAY
+    , m_debugOverlay(0)
+#endif
+    , m_live(true)
+    , m_dirtyTexture(true)
+    , m_multisamplingSupportChecked(false)
+    , m_multisampling(false)
+{
+}
+
+QSGShaderEffectTexture::~QSGShaderEffectTexture()
+{
+    delete m_renderer;
+    delete m_fbo;
+    delete m_multisampledFbo;
+#ifdef QSG_DEBUG_FBO_OVERLAY
+    delete m_debugOverlay;
+#endif
+}
+
+
+int QSGShaderEffectTexture::textureId() const
+{
+    return m_fbo->texture();
+}
+
+bool QSGShaderEffectTexture::hasAlphaChannel() const
+{
+    return m_format != GL_RGB;
+}
+
+bool QSGShaderEffectTexture::hasMipmaps() const
+{
+    return m_mipmapFiltering;
+}
+
+
+void QSGShaderEffectTexture::bind()
+{
+    glBindTexture(GL_TEXTURE_2D, m_fbo->texture());
+    updateBindOptions();
+}
+
+bool QSGShaderEffectTexture::updateTexture()
+{
+    if (m_dirtyTexture) {
+        grab();
+        return true;
+    }
+    return false;
+}
+
+void QSGShaderEffectTexture::setHasMipmaps(QSGTexture::Filtering filtering)
+{
+    if (filtering == m_mipmapFiltering)
+        return;
+    m_mipmapFiltering = filtering;
+    if (filtering != None && m_fbo && !m_fbo->format().mipmap())
+        markDirtyTexture();
+}
+
+
+void QSGShaderEffectTexture::setItem(QSGNode *item)
+{
+    if (item == m_item)
+        return;
+    m_item = item;
+    markDirtyTexture();
+}
+
+void QSGShaderEffectTexture::setRect(const QRectF &rect)
+{
+    if (rect == m_rect)
+        return;
+    m_rect = rect;
+    markDirtyTexture();
+}
+
+void QSGShaderEffectTexture::setSize(const QSize &size)
+{
+    if (size == m_size)
+        return;
+    m_size = size;
+    markDirtyTexture();
+}
+
+void QSGShaderEffectTexture::setFormat(GLenum format)
+{
+    if (format == m_format)
+        return;
+    m_format = format;
+    markDirtyTexture();
+}
+
+void QSGShaderEffectTexture::setLive(bool live)
+{
+    if (live == m_live)
+        return;
+    m_live = live;
+    markDirtyTexture();
+}
+
+void QSGShaderEffectTexture::markDirtyTexture()
+{
+    if (m_live) {
+        m_dirtyTexture = true;
+        emit textureChanged();
+    }
+}
+
+void QSGShaderEffectTexture::grab()
+{
+    Q_ASSERT(m_item);
+    QSGNode *root = m_item;
+    while (root->childCount() && root->type() != QSGNode::RootNodeType)
+        root = root->childAtIndex(0);
+    if (root->type() != QSGNode::RootNodeType)
+        return;
+
+    if (m_size.isEmpty()) {
+        delete m_fbo;
+        delete m_multisampledFbo;
+        m_multisampledFbo = m_fbo = 0;
+        return;
+    }
+
+    QSGContext *context = QSGItemPrivate::get(m_shaderSource)->sceneGraphContext();
+
+    if (!m_renderer) {
+        m_renderer = context->createRenderer();
+        connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture()));
+    }
+    m_renderer->setRootNode(static_cast<QSGRootNode *>(root));
+
+    bool mipmap = m_mipmapFiltering != None;
+    if (!m_fbo || m_fbo->size() != m_size || m_fbo->format().internalTextureFormat() != m_format
+        || (!m_fbo->format().mipmap() && mipmap))
+    {
+        if (!m_multisamplingSupportChecked) {
+            QList<QByteArray> extensions = QByteArray((const char *)glGetString(GL_EXTENSIONS)).split(' ');
+            m_multisampling = extensions.contains("GL_EXT_framebuffer_multisample")
+                            && extensions.contains("GL_EXT_framebuffer_blit");
+            m_multisamplingSupportChecked = true;
+        }
+        if (m_multisampling) {
+            delete m_fbo;
+            delete m_multisampledFbo;
+            QGLFramebufferObjectFormat format;
+
+            format.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
+            format.setInternalTextureFormat(m_format);
+            format.setSamples(8);
+            m_multisampledFbo = new QGLFramebufferObject(m_size, format);
+
+            format.setAttachment(QGLFramebufferObject::NoAttachment);
+            format.setMipmap(m_mipmapFiltering);
+            format.setSamples(0);
+            m_fbo = new QGLFramebufferObject(m_size, format);
+
+        } else {
+            delete m_fbo;
+            QGLFramebufferObjectFormat format;
+            format.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
+            format.setInternalTextureFormat(m_format);
+            format.setMipmap(m_mipmapFiltering);
+            m_fbo = new QGLFramebufferObject(m_size, format);
+        }
+    }
+
+    // Render texture.
+    QSGNode::DirtyFlags dirty = root->dirtyFlags();
+    root->markDirty(QSGNode::DirtyNodeAdded); // Force matrix and clip update.
+    m_renderer->nodeChanged(root, QSGNode::DirtyNodeAdded); // Force render list update.
+
+#ifdef QSG_DEBUG_FBO_OVERLAY
+    if (qmlFboOverlay()) {
+        if (!m_debugOverlay)
+            m_debugOverlay = context->createRectangleNode();
+        m_debugOverlay->setRect(QRectF(0, 0, m_size.width(), m_size.height()));
+        m_debugOverlay->setColor(QColor(0xff, 0x00, 0x80, 0x40));
+        m_debugOverlay->setPenColor(QColor());
+        m_debugOverlay->setPenWidth(0);
+        m_debugOverlay->setRadius(0);
+        m_debugOverlay->update();
+        root->appendChildNode(m_debugOverlay);
+    }
+#endif
+
+    m_dirtyTexture = false;
+
+    const QGLContext *ctx = QGLContext::currentContext();
+    m_renderer->setDeviceRect(m_size);
+    m_renderer->setViewportRect(m_size);
+    m_renderer->setProjectMatrixToRect(m_rect);
+    m_renderer->setClearColor(Qt::transparent);
+
+    if (m_multisampling) {
+        m_renderer->renderScene(BindableFbo(m_multisampledFbo));
+        QRect r(0, 0, m_fbo->width(), m_fbo->height());
+        QGLFramebufferObject::blitFramebuffer(m_fbo, r, m_multisampledFbo, r);
+    } else {
+        m_renderer->renderScene(BindableFbo(m_fbo));
+    }
+
+    if (mipmap) {
+        glBindTexture(GL_TEXTURE_2D, textureId());
+        ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D);
+    }
+
+    root->markDirty(dirty | QSGNode::DirtyNodeAdded); // Force matrix, clip and render list update.
+
+#ifdef QSG_DEBUG_FBO_OVERLAY
+    if (qmlFboOverlay())
+        root->removeChildNode(m_debugOverlay);
+#endif
+}
+
+
+QSGShaderEffectSource::QSGShaderEffectSource(QSGItem *parent)
+    : QSGItem(parent)
+    , m_wrapMode(ClampToEdge)
+    , m_sourceItem(0)
+    , m_textureSize(0, 0)
+    , m_format(RGBA)
+    , m_live(true)
+    , m_hideSource(false)
+    , m_mipmap(false)
+{
+    setFlag(ItemHasContents);
+    m_texture = new QSGShaderEffectTexture(this);
+}
+
+QSGShaderEffectSource::~QSGShaderEffectSource()
+{
+    delete m_texture;
+    if (m_sourceItem)
+        QSGItemPrivate::get(m_sourceItem)->derefFromEffectItem(m_hideSource);
+}
+
+QSGShaderEffectSource::WrapMode QSGShaderEffectSource::wrapMode() const
+{
+    return m_wrapMode;
+}
+
+void QSGShaderEffectSource::setWrapMode(WrapMode mode)
+{
+    if (mode == m_wrapMode)
+        return;
+    m_wrapMode = mode;
+    update();
+    emit wrapModeChanged();
+}
+
+QSGItem *QSGShaderEffectSource::sourceItem() const
+{
+    return m_sourceItem;
+}
+
+void QSGShaderEffectSource::setSourceItem(QSGItem *item)
+{
+    if (item == m_sourceItem)
+        return;
+    if (m_sourceItem)
+        QSGItemPrivate::get(m_sourceItem)->derefFromEffectItem(m_hideSource);
+    m_sourceItem = item;
+    if (m_sourceItem) {
+        // TODO: Find better solution.
+        // 'm_sourceItem' needs a canvas to get a scenegraph node.
+        // The easiest way to make sure it gets a canvas is to
+        // make it a part of the same item tree as 'this'.
+        if (m_sourceItem->parentItem() == 0) {
+            m_sourceItem->setParentItem(this);
+            m_sourceItem->setVisible(false);
+        }
+        QSGItemPrivate::get(m_sourceItem)->refFromEffectItem(m_hideSource);
+    }
+    update();
+    emit sourceItemChanged();
+}
+
+QRectF QSGShaderEffectSource::sourceRect() const
+{
+    return m_sourceRect;
+}
+
+void QSGShaderEffectSource::setSourceRect(const QRectF &rect)
+{
+    if (rect == m_sourceRect)
+        return;
+    m_sourceRect = rect;
+    update();
+    emit sourceRectChanged();
+}
+
+QSize QSGShaderEffectSource::textureSize() const
+{
+    return m_textureSize;
+}
+
+void QSGShaderEffectSource::setTextureSize(const QSize &size)
+{
+    if (size == m_textureSize)
+        return;
+    m_textureSize = size;
+    update();
+    emit textureSizeChanged();
+}
+
+QSGShaderEffectSource::Format QSGShaderEffectSource::format() const
+{
+    return m_format;
+}
+
+void QSGShaderEffectSource::setFormat(QSGShaderEffectSource::Format format)
+{
+    if (format == m_format)
+        return;
+    m_format = format;
+    update();
+    emit formatChanged();
+}
+
+bool QSGShaderEffectSource::live() const
+{
+    return m_live;
+}
+
+void QSGShaderEffectSource::setLive(bool live)
+{
+    if (live == m_live)
+        return;
+    m_live = live;
+    update();
+    emit liveChanged();
+}
+
+bool QSGShaderEffectSource::hideSource() const
+{
+    return m_hideSource;
+}
+
+void QSGShaderEffectSource::setHideSource(bool hide)
+{
+    if (hide == m_hideSource)
+        return;
+    if (m_sourceItem) {
+        QSGItemPrivate::get(m_sourceItem)->refFromEffectItem(hide);
+        QSGItemPrivate::get(m_sourceItem)->derefFromEffectItem(m_hideSource);
+    }
+    m_hideSource = hide;
+    update();
+    emit hideSourceChanged();
+}
+
+bool QSGShaderEffectSource::mipmap() const
+{
+    return m_mipmap;
+}
+
+void QSGShaderEffectSource::setMipmap(bool enabled)
+{
+    if (enabled == m_mipmap)
+        return;
+    printf("setting mipmap to: %d\n", enabled);
+    m_mipmap = enabled;
+    update();
+    emit mipmapChanged();
+}
+
+void QSGShaderEffectSource::grab()
+{
+    if (!m_sourceItem)
+        return;
+    QSGCanvas *canvas = m_sourceItem->canvas();
+    if (!canvas)
+        return;
+    QSGCanvasPrivate::get(canvas)->updateDirtyNodes();
+    QGLContext *glctx = const_cast<QGLContext *>(canvas->context());
+    glctx->makeCurrent();
+    qobject_cast<QSGShaderEffectTexture *>(m_texture)->grab();
+}
+
+static void get_wrap_mode(QSGShaderEffectSource::WrapMode mode, QSGTexture::WrapMode *hWrap, QSGTexture::WrapMode *vWrap)
+{
+    switch (mode) {
+    case QSGShaderEffectSource::RepeatHorizontally:
+        *hWrap = QSGTexture::Repeat;
+        *vWrap = QSGTexture::ClampToEdge;
+        break;
+    case QSGShaderEffectSource::RepeatVertically:
+        *vWrap = QSGTexture::Repeat;
+        *hWrap = QSGTexture::ClampToEdge;
+        break;
+    case QSGShaderEffectSource::Repeat:
+        *hWrap = *vWrap = QSGTexture::Repeat;
+        break;
+    default:
+        break;
+    }
+}
+
+
+QSGTexture *QSGShaderEffectSource::texture() const
+{
+    m_texture->setMipmapFiltering(m_mipmap ? QSGTexture::Linear : QSGTexture::None);
+    m_texture->setFiltering(QSGItemPrivate::get(this)->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
+    QSGTexture::WrapMode h, v;
+    get_wrap_mode(m_wrapMode, &h, &v);
+    m_texture->setHorizontalWrapMode(h);
+    m_texture->setVerticalWrapMode(v);
+    return m_texture;
+}
+
+QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+    if (!m_sourceItem) {
+        delete oldNode;
+        return 0;
+    }
+
+    QSGImageNode *node = static_cast<QSGImageNode *>(oldNode);
+    if (!node) {
+        node = QSGItemPrivate::get(this)->sceneGraphContext()->createImageNode();
+        node->setFlag(QSGNode::UsePreprocess, true);
+        node->setTexture(m_texture);
+    }
+
+    QSGShaderEffectTexture *tex = qobject_cast<QSGShaderEffectTexture *>(m_texture);
+
+    tex->setItem(QSGItemPrivate::get(m_sourceItem)->itemNode());
+    QRectF sourceRect = m_sourceRect.isEmpty()
+                      ? QRectF(0, 0, m_sourceItem->width(), m_sourceItem->height())
+                      : m_sourceRect;
+    tex->setRect(sourceRect);
+    QSize textureSize = m_textureSize.isEmpty()
+                      ? QSize(qCeil(sourceRect.width()), qCeil(sourceRect.height()))
+                      : m_textureSize;
+    tex->setSize(textureSize);
+    tex->setLive(m_live);
+    tex->setFormat(GLenum(m_format));
+
+    QSGTexture::Filtering filtering = QSGItemPrivate::get(this)->smooth
+                                            ? QSGTexture::Linear
+                                            : QSGTexture::Nearest;
+    QSGTexture::Filtering mmFiltering = m_mipmap ? filtering : QSGTexture::None;
+    tex->setHasMipmaps(mmFiltering);
+    node->setMipmapFiltering(mmFiltering);
+    node->setFiltering(filtering);
+
+    QSGTexture::WrapMode hWrap, vWrap;
+    get_wrap_mode(m_wrapMode, &hWrap, &vWrap);
+
+    node->setHorizontalWrapMode(hWrap);
+    node->setVerticalWrapMode(vWrap);
+    node->setTargetRect(QRectF(0, 0, width(), height()));
+    node->setSourceRect(QRectF(0, 1, 1, -1));
+    node->update();
+
+    return node;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgshadereffectsource_p.h b/src/declarative/items/qsgshadereffectsource_p.h
new file mode 100644
index 0000000000..d8c4a18df1
--- /dev/null
+++ b/src/declarative/items/qsgshadereffectsource_p.h
@@ -0,0 +1,219 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHADEREFFECTSOURCE_H
+#define SHADEREFFECTSOURCE_H
+
+#include "qsgitem.h"
+#include <private/qsgtextureprovider_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include <private/qsgcontext_p.h>
+
+#include "qpointer.h"
+#include "qsize.h"
+#include "qrect.h"
+
+#define QSG_DEBUG_FBO_OVERLAY
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGNode;
+class UpdatePaintNodeData;
+class QGLFramebufferObject;
+
+class QSGShaderEffectTexture : public QSGDynamicTexture
+{
+    Q_OBJECT
+public:
+    QSGShaderEffectTexture(QSGItem *shaderSource);
+    ~QSGShaderEffectTexture();
+
+    virtual bool updateTexture();
+
+    // The item's "paint node", not effect node.
+    QSGNode *item() const { return m_item; }
+    void setItem(QSGNode *item);
+
+    QRectF rect() const { return m_rect; }
+    void setRect(const QRectF &rect);
+
+    QSize size() const { return m_size; }
+    void setSize(const QSize &size);
+
+    void setHasMipmaps(QSGTexture::Filtering filtering);
+
+    void bind();
+
+    bool hasAlphaChannel() const;
+    bool hasMipmaps() const;
+    int textureId() const;
+    QSize textureSize() const { return m_size; }
+
+    GLenum format() const { return m_format; }
+    void setFormat(GLenum format);
+
+    bool live() const { return bool(m_live); }
+    void setLive(bool live);
+
+    void grab();
+
+public Q_SLOTS:
+    void markDirtyTexture();
+
+private:
+    QSGNode *m_item;
+    QRectF m_rect;
+    QSize m_size;
+    GLenum m_format;
+
+    QSGItem *m_shaderSource;
+    QSGRenderer *m_renderer;
+    QGLFramebufferObject *m_fbo;
+    QGLFramebufferObject *m_multisampledFbo;
+
+#ifdef QSG_DEBUG_FBO_OVERLAY
+    QSGRectangleNode *m_debugOverlay;
+#endif
+
+    uint m_hWrapMode : 1;
+    uint m_vWrapMode : 1;
+    uint m_filtering : 2;
+    uint m_mipmapFiltering : 2;
+
+    uint m_live : 1;
+    uint m_dirtyTexture : 1;
+    uint m_multisamplingSupportChecked : 1;
+    uint m_multisampling : 1;
+};
+
+class QSGShaderEffectSource : public QSGItem, public QSGTextureProvider
+{
+    Q_OBJECT
+    Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
+    Q_PROPERTY(QSGItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged)
+    Q_PROPERTY(QRectF sourceRect READ sourceRect WRITE setSourceRect NOTIFY sourceRectChanged)
+    Q_PROPERTY(QSize textureSize READ textureSize WRITE setTextureSize NOTIFY textureSizeChanged)
+    Q_PROPERTY(Format format READ format WRITE setFormat NOTIFY formatChanged)
+    Q_PROPERTY(bool live READ live WRITE setLive NOTIFY liveChanged)
+    Q_PROPERTY(bool hideSource READ hideSource WRITE setHideSource NOTIFY hideSourceChanged)
+    Q_PROPERTY(bool mipmap READ mipmap WRITE setMipmap NOTIFY mipmapChanged)
+    Q_INTERFACES(QSGTextureProvider)
+    Q_ENUMS(Format WrapMode)
+public:
+    enum WrapMode {
+        ClampToEdge,
+        RepeatHorizontally,
+        RepeatVertically,
+        Repeat
+    };
+
+    enum Format {
+        Alpha = GL_ALPHA,
+        RGB = GL_RGB,
+        RGBA = GL_RGBA
+    };
+
+    QSGShaderEffectSource(QSGItem *parent = 0);
+    ~QSGShaderEffectSource();
+
+    WrapMode wrapMode() const;
+    void setWrapMode(WrapMode mode);
+
+    QSGItem *sourceItem() const;
+    void setSourceItem(QSGItem *item);
+
+    QRectF sourceRect() const;
+    void setSourceRect(const QRectF &rect);
+
+    QSize textureSize() const;
+    void setTextureSize(const QSize &size);
+
+    Format format() const;
+    void setFormat(Format format);
+
+    bool live() const;
+    void setLive(bool live);
+
+    bool hideSource() const;
+    void setHideSource(bool hide);
+
+    bool mipmap() const;
+    void setMipmap(bool enabled);
+
+    QSGTexture *texture() const;
+    const char *textureChangedSignal() const { return SIGNAL(textureChanged); }
+
+    Q_INVOKABLE void grab();
+
+Q_SIGNALS:
+    void wrapModeChanged();
+    void sourceItemChanged();
+    void sourceRectChanged();
+    void textureSizeChanged();
+    void formatChanged();
+    void liveChanged();
+    void hideSourceChanged();
+    void mipmapChanged();
+
+protected:
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private:
+    QSGTexture *m_texture;
+    WrapMode m_wrapMode;
+    QPointer<QSGItem> m_sourceItem;
+    QRectF m_sourceRect;
+    QSize m_textureSize;
+    Format m_format;
+    uint m_live : 1;
+    uint m_hideSource : 1;
+    uint m_mipmap : 1;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SHADEREFFECTSOURCE_H
diff --git a/src/declarative/items/qsgstateoperations.cpp b/src/declarative/items/qsgstateoperations.cpp
new file mode 100644
index 0000000000..5390440e39
--- /dev/null
+++ b/src/declarative/items/qsgstateoperations.cpp
@@ -0,0 +1,1347 @@
+// Commit: 726a8b16c52fe4608c89d740b47361a2b073ce01
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgstateoperations_p.h"
+#include "qsgitem_p.h"
+
+#include <private/qdeclarativestate_p_p.h>
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtCore/qmath.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGParentChangePrivate : public QDeclarativeStateOperationPrivate
+{
+    Q_DECLARE_PUBLIC(QSGParentChange)
+public:
+    QSGParentChangePrivate() : target(0), parent(0), origParent(0), origStackBefore(0),
+        rewindParent(0), rewindStackBefore(0) {}
+
+    QSGItem *target;
+    QDeclarativeGuard<QSGItem> parent;
+    QDeclarativeGuard<QSGItem> origParent;
+    QDeclarativeGuard<QSGItem> origStackBefore;
+    QSGItem *rewindParent;
+    QSGItem *rewindStackBefore;
+
+    QDeclarativeNullableValue<QDeclarativeScriptString> xString;
+    QDeclarativeNullableValue<QDeclarativeScriptString> yString;
+    QDeclarativeNullableValue<QDeclarativeScriptString> widthString;
+    QDeclarativeNullableValue<QDeclarativeScriptString> heightString;
+    QDeclarativeNullableValue<QDeclarativeScriptString> scaleString;
+    QDeclarativeNullableValue<QDeclarativeScriptString> rotationString;
+
+    void doChange(QSGItem *targetParent, QSGItem *stackBefore = 0);
+};
+
+void QSGParentChangePrivate::doChange(QSGItem *targetParent, QSGItem *stackBefore)
+{
+    if (targetParent && target && target->parentItem()) {
+        Q_Q(QSGParentChange);
+        bool ok;
+        const QTransform &transform = target->parentItem()->itemTransform(targetParent, &ok);
+        if (transform.type() >= QTransform::TxShear || !ok) {
+            qmlInfo(q) << QSGParentChange::tr("Unable to preserve appearance under complex transform");
+            ok = false;
+        }
+
+        qreal scale = 1;
+        qreal rotation = 0;
+        bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0);
+        if (ok && !isRotate) {
+            if (transform.m11() == transform.m22())
+                scale = transform.m11();
+            else {
+                qmlInfo(q) << QSGParentChange::tr("Unable to preserve appearance under non-uniform scale");
+                ok = false;
+            }
+        } else if (ok && isRotate) {
+            if (transform.m11() == transform.m22())
+                scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
+            else {
+                qmlInfo(q) << QSGParentChange::tr("Unable to preserve appearance under non-uniform scale");
+                ok = false;
+            }
+
+            if (scale != 0)
+                rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
+            else {
+                qmlInfo(q) << QSGParentChange::tr("Unable to preserve appearance under scale of 0");
+                ok = false;
+            }
+        }
+
+        const QPointF &point = transform.map(QPointF(target->x(),target->y()));
+        qreal x = point.x();
+        qreal y = point.y();
+
+        // setParentItem will update the transformOriginPoint if needed
+        target->setParentItem(targetParent);
+
+        if (ok && target->transformOrigin() != QSGItem::TopLeft) {
+            qreal tempxt = target->transformOriginPoint().x();
+            qreal tempyt = target->transformOriginPoint().y();
+            QTransform t;
+            t.translate(-tempxt, -tempyt);
+            t.rotate(rotation);
+            t.scale(scale, scale);
+            t.translate(tempxt, tempyt);
+            const QPointF &offset = t.map(QPointF(0,0));
+            x += offset.x();
+            y += offset.y();
+        }
+
+        if (ok) {
+            //qDebug() << x << y << rotation << scale;
+            target->setX(x);
+            target->setY(y);
+            target->setRotation(target->rotation() + rotation);
+            target->setScale(target->scale() * scale);
+        }
+    } else if (target) {
+        target->setParentItem(targetParent);
+    }
+
+    //restore the original stack position.
+    //### if stackBefore has also been reparented this won't work
+    if (stackBefore)
+        target->stackBefore(stackBefore);
+}
+
+QSGParentChange::QSGParentChange(QObject *parent)
+    : QDeclarativeStateOperation(*(new QSGParentChangePrivate), parent)
+{
+}
+
+QSGParentChange::~QSGParentChange()
+{
+}
+
+QDeclarativeScriptString QSGParentChange::x() const
+{
+    Q_D(const QSGParentChange);
+    return d->xString.value;
+}
+
+void QSGParentChange::setX(QDeclarativeScriptString x)
+{
+    Q_D(QSGParentChange);
+    d->xString = x;
+}
+
+bool QSGParentChange::xIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->xString.isValid();
+}
+
+QDeclarativeScriptString QSGParentChange::y() const
+{
+    Q_D(const QSGParentChange);
+    return d->yString.value;
+}
+
+void QSGParentChange::setY(QDeclarativeScriptString y)
+{
+    Q_D(QSGParentChange);
+    d->yString = y;
+}
+
+bool QSGParentChange::yIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->yString.isValid();
+}
+
+QDeclarativeScriptString QSGParentChange::width() const
+{
+    Q_D(const QSGParentChange);
+    return d->widthString.value;
+}
+
+void QSGParentChange::setWidth(QDeclarativeScriptString width)
+{
+    Q_D(QSGParentChange);
+    d->widthString = width;
+}
+
+bool QSGParentChange::widthIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->widthString.isValid();
+}
+
+QDeclarativeScriptString QSGParentChange::height() const
+{
+    Q_D(const QSGParentChange);
+    return d->heightString.value;
+}
+
+void QSGParentChange::setHeight(QDeclarativeScriptString height)
+{
+    Q_D(QSGParentChange);
+    d->heightString = height;
+}
+
+bool QSGParentChange::heightIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->heightString.isValid();
+}
+
+QDeclarativeScriptString QSGParentChange::scale() const
+{
+    Q_D(const QSGParentChange);
+    return d->scaleString.value;
+}
+
+void QSGParentChange::setScale(QDeclarativeScriptString scale)
+{
+    Q_D(QSGParentChange);
+    d->scaleString = scale;
+}
+
+bool QSGParentChange::scaleIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->scaleString.isValid();
+}
+
+QDeclarativeScriptString QSGParentChange::rotation() const
+{
+    Q_D(const QSGParentChange);
+    return d->rotationString.value;
+}
+
+void QSGParentChange::setRotation(QDeclarativeScriptString rotation)
+{
+    Q_D(QSGParentChange);
+    d->rotationString = rotation;
+}
+
+bool QSGParentChange::rotationIsSet() const
+{
+    Q_D(const QSGParentChange);
+    return d->rotationString.isValid();
+}
+
+QSGItem *QSGParentChange::originalParent() const
+{
+    Q_D(const QSGParentChange);
+    return d->origParent;
+}
+
+QSGItem *QSGParentChange::object() const
+{
+    Q_D(const QSGParentChange);
+    return d->target;
+}
+
+void QSGParentChange::setObject(QSGItem *target)
+{
+    Q_D(QSGParentChange);
+    d->target = target;
+}
+
+QSGItem *QSGParentChange::parent() const
+{
+    Q_D(const QSGParentChange);
+    return d->parent;
+}
+
+void QSGParentChange::setParent(QSGItem *parent)
+{
+    Q_D(QSGParentChange);
+    d->parent = parent;
+}
+
+QDeclarativeStateOperation::ActionList QSGParentChange::actions()
+{
+    Q_D(QSGParentChange);
+    if (!d->target || !d->parent)
+        return ActionList();
+
+    ActionList actions;
+
+    QDeclarativeAction a;
+    a.event = this;
+    actions << a;
+
+    if (d->xString.isValid()) {
+        bool ok = false;
+        QString script = d->xString.value.script();
+        qreal x = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction xa(d->target, QLatin1String("x"), x);
+            actions << xa;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("x")));
+            QDeclarativeAction xa;
+            xa.property = newBinding->property();
+            xa.toBinding = newBinding;
+            xa.fromValue = xa.property.read();
+            xa.deletableToBinding = true;
+            actions << xa;
+        }
+    }
+
+    if (d->yString.isValid()) {
+        bool ok = false;
+        QString script = d->yString.value.script();
+        qreal y = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction ya(d->target, QLatin1String("y"), y);
+            actions << ya;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("y")));
+            QDeclarativeAction ya;
+            ya.property = newBinding->property();
+            ya.toBinding = newBinding;
+            ya.fromValue = ya.property.read();
+            ya.deletableToBinding = true;
+            actions << ya;
+        }
+    }
+
+    if (d->scaleString.isValid()) {
+        bool ok = false;
+        QString script = d->scaleString.value.script();
+        qreal scale = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction sa(d->target, QLatin1String("scale"), scale);
+            actions << sa;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("scale")));
+            QDeclarativeAction sa;
+            sa.property = newBinding->property();
+            sa.toBinding = newBinding;
+            sa.fromValue = sa.property.read();
+            sa.deletableToBinding = true;
+            actions << sa;
+        }
+    }
+
+    if (d->rotationString.isValid()) {
+        bool ok = false;
+        QString script = d->rotationString.value.script();
+        qreal rotation = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction ra(d->target, QLatin1String("rotation"), rotation);
+            actions << ra;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("rotation")));
+            QDeclarativeAction ra;
+            ra.property = newBinding->property();
+            ra.toBinding = newBinding;
+            ra.fromValue = ra.property.read();
+            ra.deletableToBinding = true;
+            actions << ra;
+        }
+    }
+
+    if (d->widthString.isValid()) {
+        bool ok = false;
+        QString script = d->widthString.value.script();
+        qreal width = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction wa(d->target, QLatin1String("width"), width);
+            actions << wa;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("width")));
+            QDeclarativeAction wa;
+            wa.property = newBinding->property();
+            wa.toBinding = newBinding;
+            wa.fromValue = wa.property.read();
+            wa.deletableToBinding = true;
+            actions << wa;
+        }
+    }
+
+    if (d->heightString.isValid()) {
+        bool ok = false;
+        QString script = d->heightString.value.script();
+        qreal height = script.toFloat(&ok);
+        if (ok) {
+            QDeclarativeAction ha(d->target, QLatin1String("height"), height);
+            actions << ha;
+        } else {
+            QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
+            newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("height")));
+            QDeclarativeAction ha;
+            ha.property = newBinding->property();
+            ha.toBinding = newBinding;
+            ha.fromValue = ha.property.read();
+            ha.deletableToBinding = true;
+            actions << ha;
+        }
+    }
+
+    return actions;
+}
+
+void QSGParentChange::saveOriginals()
+{
+    Q_D(QSGParentChange);
+    saveCurrentValues();
+    d->origParent = d->rewindParent;
+    d->origStackBefore = d->rewindStackBefore;
+}
+
+/*void QSGParentChange::copyOriginals(QDeclarativeActionEvent *other)
+{
+    Q_D(QSGParentChange);
+    QSGParentChange *pc = static_cast<QSGParentChange*>(other);
+
+    d->origParent = pc->d_func()->rewindParent;
+    d->origStackBefore = pc->d_func()->rewindStackBefore;
+
+    saveCurrentValues();
+}*/
+
+void QSGParentChange::execute(Reason)
+{
+    Q_D(QSGParentChange);
+    d->doChange(d->parent);
+}
+
+bool QSGParentChange::isReversable()
+{
+    return true;
+}
+
+void QSGParentChange::reverse(Reason)
+{
+    Q_D(QSGParentChange);
+    d->doChange(d->origParent, d->origStackBefore);
+}
+
+QString QSGParentChange::typeName() const
+{
+    return QLatin1String("ParentChange");
+}
+
+bool QSGParentChange::override(QDeclarativeActionEvent*other)
+{
+    Q_D(QSGParentChange);
+    if (other->typeName() != QLatin1String("ParentChange"))
+        return false;
+    if (QSGParentChange *otherPC = static_cast<QSGParentChange*>(other))
+        return (d->target == otherPC->object());
+    return false;
+}
+
+void QSGParentChange::saveCurrentValues()
+{
+    Q_D(QSGParentChange);
+    if (!d->target) {
+        d->rewindParent = 0;
+        d->rewindStackBefore = 0;
+        return;
+    }
+
+    d->rewindParent = d->target->parentItem();
+    d->rewindStackBefore = 0;
+
+    if (!d->rewindParent)
+        return;
+
+    QList<QSGItem *> children = d->rewindParent->childItems();
+    for (int ii = 0; ii < children.count() - 1; ++ii) {
+        if (children.at(ii) == d->target) {
+            d->rewindStackBefore = children.at(ii + 1);
+            break;
+        }
+    }
+}
+
+void QSGParentChange::rewind()
+{
+    Q_D(QSGParentChange);
+    d->doChange(d->rewindParent, d->rewindStackBefore);
+}
+
+class QSGAnchorSetPrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QSGAnchorSet)
+public:
+    QSGAnchorSetPrivate()
+      : usedAnchors(0), resetAnchors(0), fill(0),
+        centerIn(0)/*, leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
+        margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)*/
+    {
+    }
+
+    QSGAnchors::Anchors usedAnchors;
+    QSGAnchors::Anchors resetAnchors;
+
+    QSGItem *fill;
+    QSGItem *centerIn;
+
+    QDeclarativeScriptString leftScript;
+    QDeclarativeScriptString rightScript;
+    QDeclarativeScriptString topScript;
+    QDeclarativeScriptString bottomScript;
+    QDeclarativeScriptString hCenterScript;
+    QDeclarativeScriptString vCenterScript;
+    QDeclarativeScriptString baselineScript;
+
+    /*qreal leftMargin;
+    qreal rightMargin;
+    qreal topMargin;
+    qreal bottomMargin;
+    qreal margins;
+    qreal vCenterOffset;
+    qreal hCenterOffset;
+    qreal baselineOffset;*/
+};
+
+QSGAnchorSet::QSGAnchorSet(QObject *parent)
+  : QObject(*new QSGAnchorSetPrivate, parent)
+{
+}
+
+QSGAnchorSet::~QSGAnchorSet()
+{
+}
+
+QDeclarativeScriptString QSGAnchorSet::top() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->topScript;
+}
+
+void QSGAnchorSet::setTop(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::TopAnchor;
+    d->topScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetTop();
+}
+
+void QSGAnchorSet::resetTop()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::TopAnchor;
+    d->topScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::TopAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::bottom() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->bottomScript;
+}
+
+void QSGAnchorSet::setBottom(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::BottomAnchor;
+    d->bottomScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetBottom();
+}
+
+void QSGAnchorSet::resetBottom()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::BottomAnchor;
+    d->bottomScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::BottomAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::verticalCenter() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->vCenterScript;
+}
+
+void QSGAnchorSet::setVerticalCenter(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::VCenterAnchor;
+    d->vCenterScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetVerticalCenter();
+}
+
+void QSGAnchorSet::resetVerticalCenter()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::VCenterAnchor;
+    d->vCenterScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::VCenterAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::baseline() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->baselineScript;
+}
+
+void QSGAnchorSet::setBaseline(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::BaselineAnchor;
+    d->baselineScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetBaseline();
+}
+
+void QSGAnchorSet::resetBaseline()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::BaselineAnchor;
+    d->baselineScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::BaselineAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::left() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->leftScript;
+}
+
+void QSGAnchorSet::setLeft(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::LeftAnchor;
+    d->leftScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetLeft();
+}
+
+void QSGAnchorSet::resetLeft()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::LeftAnchor;
+    d->leftScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::LeftAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::right() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->rightScript;
+}
+
+void QSGAnchorSet::setRight(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::RightAnchor;
+    d->rightScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetRight();
+}
+
+void QSGAnchorSet::resetRight()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::RightAnchor;
+    d->rightScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::RightAnchor;
+}
+
+QDeclarativeScriptString QSGAnchorSet::horizontalCenter() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->hCenterScript;
+}
+
+void QSGAnchorSet::setHorizontalCenter(const QDeclarativeScriptString &edge)
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors |= QSGAnchors::HCenterAnchor;
+    d->hCenterScript = edge;
+    if (edge.script() == QLatin1String("undefined"))
+        resetHorizontalCenter();
+}
+
+void QSGAnchorSet::resetHorizontalCenter()
+{
+    Q_D(QSGAnchorSet);
+    d->usedAnchors &= ~QSGAnchors::HCenterAnchor;
+    d->hCenterScript = QDeclarativeScriptString();
+    d->resetAnchors |= QSGAnchors::HCenterAnchor;
+}
+
+QSGItem *QSGAnchorSet::fill() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->fill;
+}
+
+void QSGAnchorSet::setFill(QSGItem *f)
+{
+    Q_D(QSGAnchorSet);
+    d->fill = f;
+}
+
+void QSGAnchorSet::resetFill()
+{
+    setFill(0);
+}
+
+QSGItem *QSGAnchorSet::centerIn() const
+{
+    Q_D(const QSGAnchorSet);
+    return d->centerIn;
+}
+
+void QSGAnchorSet::setCenterIn(QSGItem* c)
+{
+    Q_D(QSGAnchorSet);
+    d->centerIn = c;
+}
+
+void QSGAnchorSet::resetCenterIn()
+{
+    setCenterIn(0);
+}
+
+
+class QSGAnchorChangesPrivate : public QDeclarativeStateOperationPrivate
+{
+public:
+    QSGAnchorChangesPrivate()
+        : target(0), anchorSet(new QSGAnchorSet),
+          leftBinding(0), rightBinding(0), hCenterBinding(0),
+          topBinding(0), bottomBinding(0), vCenterBinding(0), baselineBinding(0),
+          origLeftBinding(0), origRightBinding(0), origHCenterBinding(0),
+          origTopBinding(0), origBottomBinding(0), origVCenterBinding(0),
+          origBaselineBinding(0)
+    {
+
+    }
+    ~QSGAnchorChangesPrivate() { delete anchorSet; }
+
+    QSGItem *target;
+    QSGAnchorSet *anchorSet;
+
+    QDeclarativeBinding *leftBinding;
+    QDeclarativeBinding *rightBinding;
+    QDeclarativeBinding *hCenterBinding;
+    QDeclarativeBinding *topBinding;
+    QDeclarativeBinding *bottomBinding;
+    QDeclarativeBinding *vCenterBinding;
+    QDeclarativeBinding *baselineBinding;
+
+    QDeclarativeAbstractBinding *origLeftBinding;
+    QDeclarativeAbstractBinding *origRightBinding;
+    QDeclarativeAbstractBinding *origHCenterBinding;
+    QDeclarativeAbstractBinding *origTopBinding;
+    QDeclarativeAbstractBinding *origBottomBinding;
+    QDeclarativeAbstractBinding *origVCenterBinding;
+    QDeclarativeAbstractBinding *origBaselineBinding;
+
+    QSGAnchorLine rewindLeft;
+    QSGAnchorLine rewindRight;
+    QSGAnchorLine rewindHCenter;
+    QSGAnchorLine rewindTop;
+    QSGAnchorLine rewindBottom;
+    QSGAnchorLine rewindVCenter;
+    QSGAnchorLine rewindBaseline;
+
+    qreal fromX;
+    qreal fromY;
+    qreal fromWidth;
+    qreal fromHeight;
+
+    qreal toX;
+    qreal toY;
+    qreal toWidth;
+    qreal toHeight;
+
+    qreal rewindX;
+    qreal rewindY;
+    qreal rewindWidth;
+    qreal rewindHeight;
+
+    bool applyOrigLeft;
+    bool applyOrigRight;
+    bool applyOrigHCenter;
+    bool applyOrigTop;
+    bool applyOrigBottom;
+    bool applyOrigVCenter;
+    bool applyOrigBaseline;
+
+    QDeclarativeNullableValue<qreal> origWidth;
+    QDeclarativeNullableValue<qreal> origHeight;
+    qreal origX;
+    qreal origY;
+
+    QList<QDeclarativeAbstractBinding*> oldBindings;
+
+    QDeclarativeProperty leftProp;
+    QDeclarativeProperty rightProp;
+    QDeclarativeProperty hCenterProp;
+    QDeclarativeProperty topProp;
+    QDeclarativeProperty bottomProp;
+    QDeclarativeProperty vCenterProp;
+    QDeclarativeProperty baselineProp;
+};
+
+QSGAnchorChanges::QSGAnchorChanges(QObject *parent)
+ : QDeclarativeStateOperation(*(new QSGAnchorChangesPrivate), parent)
+{
+}
+
+QSGAnchorChanges::~QSGAnchorChanges()
+{
+}
+
+QSGAnchorChanges::ActionList QSGAnchorChanges::actions()
+{
+    Q_D(QSGAnchorChanges);
+    d->leftBinding = d->rightBinding = d->hCenterBinding = d->topBinding
+                   = d->bottomBinding = d->vCenterBinding = d->baselineBinding = 0;
+
+    d->leftProp = QDeclarativeProperty(d->target, QLatin1String("anchors.left"));
+    d->rightProp = QDeclarativeProperty(d->target, QLatin1String("anchors.right"));
+    d->hCenterProp = QDeclarativeProperty(d->target, QLatin1String("anchors.horizontalCenter"));
+    d->topProp = QDeclarativeProperty(d->target, QLatin1String("anchors.top"));
+    d->bottomProp = QDeclarativeProperty(d->target, QLatin1String("anchors.bottom"));
+    d->vCenterProp = QDeclarativeProperty(d->target, QLatin1String("anchors.verticalCenter"));
+    d->baselineProp = QDeclarativeProperty(d->target, QLatin1String("anchors.baseline"));
+
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::LeftAnchor) {
+        d->leftBinding = new QDeclarativeBinding(d->anchorSet->d_func()->leftScript.script(), d->target, qmlContext(this));
+        d->leftBinding->setTarget(d->leftProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::RightAnchor) {
+        d->rightBinding = new QDeclarativeBinding(d->anchorSet->d_func()->rightScript.script(), d->target, qmlContext(this));
+        d->rightBinding->setTarget(d->rightProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::HCenterAnchor) {
+        d->hCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->hCenterScript.script(), d->target, qmlContext(this));
+        d->hCenterBinding->setTarget(d->hCenterProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::TopAnchor) {
+        d->topBinding = new QDeclarativeBinding(d->anchorSet->d_func()->topScript.script(), d->target, qmlContext(this));
+        d->topBinding->setTarget(d->topProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::BottomAnchor) {
+        d->bottomBinding = new QDeclarativeBinding(d->anchorSet->d_func()->bottomScript.script(), d->target, qmlContext(this));
+        d->bottomBinding->setTarget(d->bottomProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::VCenterAnchor) {
+        d->vCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->vCenterScript.script(), d->target, qmlContext(this));
+        d->vCenterBinding->setTarget(d->vCenterProp);
+    }
+    if (d->anchorSet->d_func()->usedAnchors & QSGAnchors::BaselineAnchor) {
+        d->baselineBinding = new QDeclarativeBinding(d->anchorSet->d_func()->baselineScript.script(), d->target, qmlContext(this));
+        d->baselineBinding->setTarget(d->baselineProp);
+    }
+
+    QDeclarativeAction a;
+    a.event = this;
+    return ActionList() << a;
+}
+
+QSGAnchorSet *QSGAnchorChanges::anchors()
+{
+    Q_D(QSGAnchorChanges);
+    return d->anchorSet;
+}
+
+QSGItem *QSGAnchorChanges::object() const
+{
+    Q_D(const QSGAnchorChanges);
+    return d->target;
+}
+
+void QSGAnchorChanges::setObject(QSGItem *target)
+{
+    Q_D(QSGAnchorChanges);
+    d->target = target;
+}
+
+void QSGAnchorChanges::execute(Reason reason)
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+    //incorporate any needed "reverts"
+    if (d->applyOrigLeft) {
+        if (!d->origLeftBinding)
+            targetPrivate->anchors()->resetLeft();
+        QDeclarativePropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
+    }
+    if (d->applyOrigRight) {
+        if (!d->origRightBinding)
+            targetPrivate->anchors()->resetRight();
+        QDeclarativePropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
+    }
+    if (d->applyOrigHCenter) {
+        if (!d->origHCenterBinding)
+            targetPrivate->anchors()->resetHorizontalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
+    }
+    if (d->applyOrigTop) {
+        if (!d->origTopBinding)
+            targetPrivate->anchors()->resetTop();
+        QDeclarativePropertyPrivate::setBinding(d->topProp, d->origTopBinding);
+    }
+    if (d->applyOrigBottom) {
+        if (!d->origBottomBinding)
+            targetPrivate->anchors()->resetBottom();
+        QDeclarativePropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
+    }
+    if (d->applyOrigVCenter) {
+        if (!d->origVCenterBinding)
+            targetPrivate->anchors()->resetVerticalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
+    }
+    if (d->applyOrigBaseline) {
+        if (!d->origBaselineBinding)
+            targetPrivate->anchors()->resetBaseline();
+        QDeclarativePropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
+    }
+
+    //destroy old bindings
+    if (reason == ActualChange) {
+        for (int i = 0; i < d->oldBindings.size(); ++i) {
+            QDeclarativeAbstractBinding *binding = d->oldBindings.at(i);
+            if (binding)
+                binding->destroy();
+        }
+        d->oldBindings.clear();
+    }
+
+    //reset any anchors that have been specified as "undefined"
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::LeftAnchor) {
+        targetPrivate->anchors()->resetLeft();
+        QDeclarativePropertyPrivate::setBinding(d->leftProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::RightAnchor) {
+        targetPrivate->anchors()->resetRight();
+        QDeclarativePropertyPrivate::setBinding(d->rightProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::HCenterAnchor) {
+        targetPrivate->anchors()->resetHorizontalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->hCenterProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::TopAnchor) {
+        targetPrivate->anchors()->resetTop();
+        QDeclarativePropertyPrivate::setBinding(d->topProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::BottomAnchor) {
+        targetPrivate->anchors()->resetBottom();
+        QDeclarativePropertyPrivate::setBinding(d->bottomProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::VCenterAnchor) {
+        targetPrivate->anchors()->resetVerticalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->vCenterProp, 0);
+    }
+    if (d->anchorSet->d_func()->resetAnchors & QSGAnchors::BaselineAnchor) {
+        targetPrivate->anchors()->resetBaseline();
+        QDeclarativePropertyPrivate::setBinding(d->baselineProp, 0);
+    }
+
+    //set any anchors that have been specified
+    if (d->leftBinding)
+        QDeclarativePropertyPrivate::setBinding(d->leftBinding->property(), d->leftBinding);
+    if (d->rightBinding)
+        QDeclarativePropertyPrivate::setBinding(d->rightBinding->property(), d->rightBinding);
+    if (d->hCenterBinding)
+        QDeclarativePropertyPrivate::setBinding(d->hCenterBinding->property(), d->hCenterBinding);
+    if (d->topBinding)
+        QDeclarativePropertyPrivate::setBinding(d->topBinding->property(), d->topBinding);
+    if (d->bottomBinding)
+        QDeclarativePropertyPrivate::setBinding(d->bottomBinding->property(), d->bottomBinding);
+    if (d->vCenterBinding)
+        QDeclarativePropertyPrivate::setBinding(d->vCenterBinding->property(), d->vCenterBinding);
+    if (d->baselineBinding)
+        QDeclarativePropertyPrivate::setBinding(d->baselineBinding->property(), d->baselineBinding);
+}
+
+bool QSGAnchorChanges::isReversable()
+{
+    return true;
+}
+
+void QSGAnchorChanges::reverse(Reason reason)
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+    //reset any anchors set by the state
+    if (d->leftBinding) {
+        targetPrivate->anchors()->resetLeft();
+        QDeclarativePropertyPrivate::setBinding(d->leftBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->leftBinding->destroy(); d->leftBinding = 0;
+        }
+    }
+    if (d->rightBinding) {
+        targetPrivate->anchors()->resetRight();
+        QDeclarativePropertyPrivate::setBinding(d->rightBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->rightBinding->destroy(); d->rightBinding = 0;
+        }
+    }
+    if (d->hCenterBinding) {
+        targetPrivate->anchors()->resetHorizontalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->hCenterBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->hCenterBinding->destroy(); d->hCenterBinding = 0;
+        }
+    }
+    if (d->topBinding) {
+        targetPrivate->anchors()->resetTop();
+        QDeclarativePropertyPrivate::setBinding(d->topBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->topBinding->destroy(); d->topBinding = 0;
+        }
+    }
+    if (d->bottomBinding) {
+        targetPrivate->anchors()->resetBottom();
+        QDeclarativePropertyPrivate::setBinding(d->bottomBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->bottomBinding->destroy(); d->bottomBinding = 0;
+        }
+    }
+    if (d->vCenterBinding) {
+        targetPrivate->anchors()->resetVerticalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->vCenterBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->vCenterBinding->destroy(); d->vCenterBinding = 0;
+        }
+    }
+    if (d->baselineBinding) {
+        targetPrivate->anchors()->resetBaseline();
+        QDeclarativePropertyPrivate::setBinding(d->baselineBinding->property(), 0);
+        if (reason == ActualChange) {
+            d->baselineBinding->destroy(); d->baselineBinding = 0;
+        }
+    }
+
+    //restore previous anchors
+    if (d->origLeftBinding)
+        QDeclarativePropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
+    if (d->origRightBinding)
+        QDeclarativePropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
+    if (d->origHCenterBinding)
+        QDeclarativePropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
+    if (d->origTopBinding)
+        QDeclarativePropertyPrivate::setBinding(d->topProp, d->origTopBinding);
+    if (d->origBottomBinding)
+        QDeclarativePropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
+    if (d->origVCenterBinding)
+        QDeclarativePropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
+    if (d->origBaselineBinding)
+        QDeclarativePropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
+
+    //restore any absolute geometry changed by the state's anchors
+    QSGAnchors::Anchors stateVAnchors = d->anchorSet->d_func()->usedAnchors & QSGAnchors::Vertical_Mask;
+    QSGAnchors::Anchors origVAnchors = targetPrivate->anchors()->usedAnchors() & QSGAnchors::Vertical_Mask;
+    QSGAnchors::Anchors stateHAnchors = d->anchorSet->d_func()->usedAnchors & QSGAnchors::Horizontal_Mask;
+    QSGAnchors::Anchors origHAnchors = targetPrivate->anchors()->usedAnchors() & QSGAnchors::Horizontal_Mask;
+
+    bool stateSetWidth = (stateHAnchors &&
+                          stateHAnchors != QSGAnchors::LeftAnchor &&
+                          stateHAnchors != QSGAnchors::RightAnchor &&
+                          stateHAnchors != QSGAnchors::HCenterAnchor);
+    bool origSetWidth = (origHAnchors &&
+                         origHAnchors != QSGAnchors::LeftAnchor &&
+                         origHAnchors != QSGAnchors::RightAnchor &&
+                         origHAnchors != QSGAnchors::HCenterAnchor);
+    if (d->origWidth.isValid() && stateSetWidth && !origSetWidth)
+        d->target->setWidth(d->origWidth.value);
+
+    bool stateSetHeight = (stateVAnchors &&
+                           stateVAnchors != QSGAnchors::TopAnchor &&
+                           stateVAnchors != QSGAnchors::BottomAnchor &&
+                           stateVAnchors != QSGAnchors::VCenterAnchor &&
+                           stateVAnchors != QSGAnchors::BaselineAnchor);
+    bool origSetHeight = (origVAnchors &&
+                          origVAnchors != QSGAnchors::TopAnchor &&
+                          origVAnchors != QSGAnchors::BottomAnchor &&
+                          origVAnchors != QSGAnchors::VCenterAnchor &&
+                          origVAnchors != QSGAnchors::BaselineAnchor);
+    if (d->origHeight.isValid() && stateSetHeight && !origSetHeight)
+        d->target->setHeight(d->origHeight.value);
+
+    if (stateHAnchors && !origHAnchors)
+        d->target->setX(d->origX);
+
+    if (stateVAnchors && !origVAnchors)
+        d->target->setY(d->origY);
+}
+
+QString QSGAnchorChanges::typeName() const
+{
+    return QLatin1String("AnchorChanges");
+}
+
+QList<QDeclarativeAction> QSGAnchorChanges::additionalActions()
+{
+    Q_D(QSGAnchorChanges);
+    QList<QDeclarativeAction> extra;
+
+    QSGAnchors::Anchors combined = d->anchorSet->d_func()->usedAnchors | d->anchorSet->d_func()->resetAnchors;
+    bool hChange = combined & QSGAnchors::Horizontal_Mask;
+    bool vChange = combined & QSGAnchors::Vertical_Mask;
+
+    if (d->target) {
+        QDeclarativeAction a;
+        if (hChange && d->fromX != d->toX) {
+            a.property = QDeclarativeProperty(d->target, QLatin1String("x"));
+            a.toValue = d->toX;
+            extra << a;
+        }
+        if (vChange && d->fromY != d->toY) {
+            a.property = QDeclarativeProperty(d->target, QLatin1String("y"));
+            a.toValue = d->toY;
+            extra << a;
+        }
+        if (hChange && d->fromWidth != d->toWidth) {
+            a.property = QDeclarativeProperty(d->target, QLatin1String("width"));
+            a.toValue = d->toWidth;
+            extra << a;
+        }
+        if (vChange && d->fromHeight != d->toHeight) {
+            a.property = QDeclarativeProperty(d->target, QLatin1String("height"));
+            a.toValue = d->toHeight;
+            extra << a;
+        }
+    }
+
+    return extra;
+}
+
+bool QSGAnchorChanges::changesBindings()
+{
+    return true;
+}
+
+void QSGAnchorChanges::saveOriginals()
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    d->origLeftBinding = QDeclarativePropertyPrivate::binding(d->leftProp);
+    d->origRightBinding = QDeclarativePropertyPrivate::binding(d->rightProp);
+    d->origHCenterBinding = QDeclarativePropertyPrivate::binding(d->hCenterProp);
+    d->origTopBinding = QDeclarativePropertyPrivate::binding(d->topProp);
+    d->origBottomBinding = QDeclarativePropertyPrivate::binding(d->bottomProp);
+    d->origVCenterBinding = QDeclarativePropertyPrivate::binding(d->vCenterProp);
+    d->origBaselineBinding = QDeclarativePropertyPrivate::binding(d->baselineProp);
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+    if (targetPrivate->widthValid)
+        d->origWidth = d->target->width();
+    if (targetPrivate->heightValid)
+        d->origHeight = d->target->height();
+    d->origX = d->target->x();
+    d->origY = d->target->y();
+
+    d->applyOrigLeft = d->applyOrigRight = d->applyOrigHCenter = d->applyOrigTop
+      = d->applyOrigBottom = d->applyOrigVCenter = d->applyOrigBaseline = false;
+
+    saveCurrentValues();
+}
+
+void QSGAnchorChanges::copyOriginals(QDeclarativeActionEvent *other)
+{
+    Q_D(QSGAnchorChanges);
+    QSGAnchorChanges *ac = static_cast<QSGAnchorChanges*>(other);
+    QSGAnchorChangesPrivate *acp = ac->d_func();
+
+    QSGAnchors::Anchors combined = acp->anchorSet->d_func()->usedAnchors |
+                                            acp->anchorSet->d_func()->resetAnchors;
+
+    //probably also need to revert some things
+    d->applyOrigLeft = (combined & QSGAnchors::LeftAnchor);
+    d->applyOrigRight = (combined & QSGAnchors::RightAnchor);
+    d->applyOrigHCenter = (combined & QSGAnchors::HCenterAnchor);
+    d->applyOrigTop = (combined & QSGAnchors::TopAnchor);
+    d->applyOrigBottom = (combined & QSGAnchors::BottomAnchor);
+    d->applyOrigVCenter = (combined & QSGAnchors::VCenterAnchor);
+    d->applyOrigBaseline = (combined & QSGAnchors::BaselineAnchor);
+
+    d->origLeftBinding = acp->origLeftBinding;
+    d->origRightBinding = acp->origRightBinding;
+    d->origHCenterBinding = acp->origHCenterBinding;
+    d->origTopBinding = acp->origTopBinding;
+    d->origBottomBinding = acp->origBottomBinding;
+    d->origVCenterBinding = acp->origVCenterBinding;
+    d->origBaselineBinding = acp->origBaselineBinding;
+
+    d->origWidth = acp->origWidth;
+    d->origHeight = acp->origHeight;
+    d->origX = acp->origX;
+    d->origY = acp->origY;
+
+    d->oldBindings.clear();
+    d->oldBindings << acp->leftBinding << acp->rightBinding << acp->hCenterBinding
+                << acp->topBinding << acp->bottomBinding << acp->baselineBinding;
+
+    saveCurrentValues();
+}
+
+void QSGAnchorChanges::clearBindings()
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    //### should this (saving "from" values) be moved to saveCurrentValues()?
+    d->fromX = d->target->x();
+    d->fromY = d->target->y();
+    d->fromWidth = d->target->width();
+    d->fromHeight = d->target->height();
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+    //reset any anchors with corresponding reverts
+    //reset any anchors that have been specified as "undefined"
+    //reset any anchors that we'll be setting in the state
+    QSGAnchors::Anchors combined = d->anchorSet->d_func()->resetAnchors |
+                                            d->anchorSet->d_func()->usedAnchors;
+    if (d->applyOrigLeft || (combined & QSGAnchors::LeftAnchor)) {
+        targetPrivate->anchors()->resetLeft();
+        QDeclarativePropertyPrivate::setBinding(d->leftProp, 0);
+    }
+    if (d->applyOrigRight || (combined & QSGAnchors::RightAnchor)) {
+        targetPrivate->anchors()->resetRight();
+        QDeclarativePropertyPrivate::setBinding(d->rightProp, 0);
+    }
+    if (d->applyOrigHCenter || (combined & QSGAnchors::HCenterAnchor)) {
+        targetPrivate->anchors()->resetHorizontalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->hCenterProp, 0);
+    }
+    if (d->applyOrigTop || (combined & QSGAnchors::TopAnchor)) {
+        targetPrivate->anchors()->resetTop();
+        QDeclarativePropertyPrivate::setBinding(d->topProp, 0);
+    }
+    if (d->applyOrigBottom || (combined & QSGAnchors::BottomAnchor)) {
+        targetPrivate->anchors()->resetBottom();
+        QDeclarativePropertyPrivate::setBinding(d->bottomProp, 0);
+    }
+    if (d->applyOrigVCenter || (combined & QSGAnchors::VCenterAnchor)) {
+        targetPrivate->anchors()->resetVerticalCenter();
+        QDeclarativePropertyPrivate::setBinding(d->vCenterProp, 0);
+    }
+    if (d->applyOrigBaseline || (combined & QSGAnchors::BaselineAnchor)) {
+        targetPrivate->anchors()->resetBaseline();
+        QDeclarativePropertyPrivate::setBinding(d->baselineProp, 0);
+    }
+}
+
+bool QSGAnchorChanges::override(QDeclarativeActionEvent*other)
+{
+    if (other->typeName() != QLatin1String("AnchorChanges"))
+        return false;
+    if (static_cast<QDeclarativeActionEvent*>(this) == other)
+        return true;
+    if (static_cast<QSGAnchorChanges*>(other)->object() == object())
+        return true;
+    return false;
+}
+
+void QSGAnchorChanges::rewind()
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+
+    //restore previous values (but not previous bindings, i.e. anchors)
+    d->target->setX(d->rewindX);
+    d->target->setY(d->rewindY);
+    if (targetPrivate->widthValid) {
+        d->target->setWidth(d->rewindWidth);
+    }
+    if (targetPrivate->heightValid) {
+        d->target->setHeight(d->rewindHeight);
+    }
+}
+
+void QSGAnchorChanges::saveCurrentValues()
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    QSGItemPrivate *targetPrivate = QSGItemPrivate::get(d->target);
+    d->rewindLeft = targetPrivate->anchors()->left();
+    d->rewindRight = targetPrivate->anchors()->right();
+    d->rewindHCenter = targetPrivate->anchors()->horizontalCenter();
+    d->rewindTop = targetPrivate->anchors()->top();
+    d->rewindBottom = targetPrivate->anchors()->bottom();
+    d->rewindVCenter = targetPrivate->anchors()->verticalCenter();
+    d->rewindBaseline = targetPrivate->anchors()->baseline();
+
+    d->rewindX = d->target->x();
+    d->rewindY = d->target->y();
+    d->rewindWidth = d->target->width();
+    d->rewindHeight = d->target->height();
+}
+
+void QSGAnchorChanges::saveTargetValues()
+{
+    Q_D(QSGAnchorChanges);
+    if (!d->target)
+        return;
+
+    d->toX = d->target->x();
+    d->toY = d->target->y();
+    d->toWidth = d->target->width();
+    d->toHeight = d->target->height();
+}
+
+#include <moc_qsgstateoperations_p.cpp>
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/items/qsgstateoperations_p.h b/src/declarative/items/qsgstateoperations_p.h
new file mode 100644
index 0000000000..f816e36b82
--- /dev/null
+++ b/src/declarative/items/qsgstateoperations_p.h
@@ -0,0 +1,275 @@
+// Commit: 84c47bbb133304d7ef35642fa1fbb17619d4a43d
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGSTATEOPERATIONS_H
+#define QSGSTATEOPERATIONS_H
+
+#include "qsgitem.h"
+#include "qsganchors_p.h"
+
+#include <private/qdeclarativestate_p.h>
+
+#include <QtDeclarative/qdeclarativescriptstring.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGParentChangePrivate;
+class Q_AUTOTEST_EXPORT QSGParentChange : public QDeclarativeStateOperation, public QDeclarativeActionEvent
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGParentChange)
+
+    Q_PROPERTY(QSGItem *target READ object WRITE setObject)
+    Q_PROPERTY(QSGItem *parent READ parent WRITE setParent)
+    Q_PROPERTY(QDeclarativeScriptString x READ x WRITE setX)
+    Q_PROPERTY(QDeclarativeScriptString y READ y WRITE setY)
+    Q_PROPERTY(QDeclarativeScriptString width READ width WRITE setWidth)
+    Q_PROPERTY(QDeclarativeScriptString height READ height WRITE setHeight)
+    Q_PROPERTY(QDeclarativeScriptString scale READ scale WRITE setScale)
+    Q_PROPERTY(QDeclarativeScriptString rotation READ rotation WRITE setRotation)
+public:
+    QSGParentChange(QObject *parent=0);
+    ~QSGParentChange();
+
+    QSGItem *object() const;
+    void setObject(QSGItem *);
+
+    QSGItem *parent() const;
+    void setParent(QSGItem *);
+
+    QSGItem *originalParent() const;
+
+    QDeclarativeScriptString x() const;
+    void setX(QDeclarativeScriptString x);
+    bool xIsSet() const;
+
+    QDeclarativeScriptString y() const;
+    void setY(QDeclarativeScriptString y);
+    bool yIsSet() const;
+
+    QDeclarativeScriptString width() const;
+    void setWidth(QDeclarativeScriptString width);
+    bool widthIsSet() const;
+
+    QDeclarativeScriptString height() const;
+    void setHeight(QDeclarativeScriptString height);
+    bool heightIsSet() const;
+
+    QDeclarativeScriptString scale() const;
+    void setScale(QDeclarativeScriptString scale);
+    bool scaleIsSet() const;
+
+    QDeclarativeScriptString rotation() const;
+    void setRotation(QDeclarativeScriptString rotation);
+    bool rotationIsSet() const;
+
+    virtual ActionList actions();
+
+    virtual void saveOriginals();
+    //virtual void copyOriginals(QDeclarativeActionEvent*);
+    virtual void execute(Reason reason = ActualChange);
+    virtual bool isReversable();
+    virtual void reverse(Reason reason = ActualChange);
+    virtual QString typeName() const;
+    virtual bool override(QDeclarativeActionEvent*other);
+    virtual void rewind();
+    virtual void saveCurrentValues();
+};
+
+class QSGAnchorChanges;
+class QSGAnchorSetPrivate;
+class Q_AUTOTEST_EXPORT QSGAnchorSet : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QDeclarativeScriptString left READ left WRITE setLeft RESET resetLeft)
+    Q_PROPERTY(QDeclarativeScriptString right READ right WRITE setRight RESET resetRight)
+    Q_PROPERTY(QDeclarativeScriptString horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter)
+    Q_PROPERTY(QDeclarativeScriptString top READ top WRITE setTop RESET resetTop)
+    Q_PROPERTY(QDeclarativeScriptString bottom READ bottom WRITE setBottom RESET resetBottom)
+    Q_PROPERTY(QDeclarativeScriptString verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter)
+    Q_PROPERTY(QDeclarativeScriptString baseline READ baseline WRITE setBaseline RESET resetBaseline)
+    //Q_PROPERTY(QSGItem *fill READ fill WRITE setFill RESET resetFill)
+    //Q_PROPERTY(QSGItem *centerIn READ centerIn WRITE setCenterIn RESET resetCenterIn)
+
+    /*Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged)
+    Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
+    Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
+    Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged())
+    Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin NOTIFY topMarginChanged)
+    Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
+    Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged())
+    Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged())*/
+
+public:
+    QSGAnchorSet(QObject *parent=0);
+    virtual ~QSGAnchorSet();
+
+    QDeclarativeScriptString left() const;
+    void setLeft(const QDeclarativeScriptString &edge);
+    void resetLeft();
+
+    QDeclarativeScriptString right() const;
+    void setRight(const QDeclarativeScriptString &edge);
+    void resetRight();
+
+    QDeclarativeScriptString horizontalCenter() const;
+    void setHorizontalCenter(const QDeclarativeScriptString &edge);
+    void resetHorizontalCenter();
+
+    QDeclarativeScriptString top() const;
+    void setTop(const QDeclarativeScriptString &edge);
+    void resetTop();
+
+    QDeclarativeScriptString bottom() const;
+    void setBottom(const QDeclarativeScriptString &edge);
+    void resetBottom();
+
+    QDeclarativeScriptString verticalCenter() const;
+    void setVerticalCenter(const QDeclarativeScriptString &edge);
+    void resetVerticalCenter();
+
+    QDeclarativeScriptString baseline() const;
+    void setBaseline(const QDeclarativeScriptString &edge);
+    void resetBaseline();
+
+    QSGItem *fill() const;
+    void setFill(QSGItem *);
+    void resetFill();
+
+    QSGItem *centerIn() const;
+    void setCenterIn(QSGItem *);
+    void resetCenterIn();
+
+    /*qreal leftMargin() const;
+    void setLeftMargin(qreal);
+
+    qreal rightMargin() const;
+    void setRightMargin(qreal);
+
+    qreal horizontalCenterOffset() const;
+    void setHorizontalCenterOffset(qreal);
+
+    qreal topMargin() const;
+    void setTopMargin(qreal);
+
+    qreal bottomMargin() const;
+    void setBottomMargin(qreal);
+
+    qreal margins() const;
+    void setMargins(qreal);
+
+    qreal verticalCenterOffset() const;
+    void setVerticalCenterOffset(qreal);
+
+    qreal baselineOffset() const;
+    void setBaselineOffset(qreal);*/
+
+    QSGAnchors::Anchors usedAnchors() const;
+
+/*Q_SIGNALS:
+    void leftMarginChanged();
+    void rightMarginChanged();
+    void topMarginChanged();
+    void bottomMarginChanged();
+    void marginsChanged();
+    void verticalCenterOffsetChanged();
+    void horizontalCenterOffsetChanged();
+    void baselineOffsetChanged();*/
+
+private:
+    friend class QSGAnchorChanges;
+    Q_DISABLE_COPY(QSGAnchorSet)
+    Q_DECLARE_PRIVATE(QSGAnchorSet)
+};
+
+class QSGAnchorChangesPrivate;
+class Q_AUTOTEST_EXPORT QSGAnchorChanges : public QDeclarativeStateOperation, public QDeclarativeActionEvent
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGAnchorChanges)
+
+    Q_PROPERTY(QSGItem *target READ object WRITE setObject)
+    Q_PROPERTY(QSGAnchorSet *anchors READ anchors CONSTANT)
+
+public:
+    QSGAnchorChanges(QObject *parent=0);
+    ~QSGAnchorChanges();
+
+    virtual ActionList actions();
+
+    QSGAnchorSet *anchors();
+
+    QSGItem *object() const;
+    void setObject(QSGItem *);
+
+    virtual void execute(Reason reason = ActualChange);
+    virtual bool isReversable();
+    virtual void reverse(Reason reason = ActualChange);
+    virtual QString typeName() const;
+    virtual bool override(QDeclarativeActionEvent*other);
+    virtual bool changesBindings();
+    virtual void saveOriginals();
+    virtual bool needsCopy() { return true; }
+    virtual void copyOriginals(QDeclarativeActionEvent*);
+    virtual void clearBindings();
+    virtual void rewind();
+    virtual void saveCurrentValues();
+
+    QList<QDeclarativeAction> additionalActions();
+    virtual void saveTargetValues();
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGParentChange)
+QML_DECLARE_TYPE(QSGAnchorSet)
+QML_DECLARE_TYPE(QSGAnchorChanges)
+
+QT_END_HEADER
+
+#endif // QSGSTATEOPERATIONS_H
+
diff --git a/src/declarative/items/qsgtext.cpp b/src/declarative/items/qsgtext.cpp
new file mode 100644
index 0000000000..ab4669eb45
--- /dev/null
+++ b/src/declarative/items/qsgtext.cpp
@@ -0,0 +1,1240 @@
+// Commit: a5c3c11e3e2204da6c8be9af98b38929366fafb8
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtext_p.h"
+#include "qsgtext_p_p.h"
+
+#include <private/qsgdistancefieldglyphcache_p.h>
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include "qsgtextnode_p.h"
+#include "qsgimage_p_p.h"
+#include <private/qsgtexture_p.h>
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qabstracttextdocumentlayout.h>
+#include <QtGui/qpainter.h>
+#include <QtGui/qtextdocument.h>
+#include <QtGui/qtextobject.h>
+#include <QtGui/qtextcursor.h>
+#include <QtGui/qapplication.h>
+
+#include <private/qdeclarativestyledtext_p.h>
+#include <private/qdeclarativepixmapcache_p.h>
+
+#include <qmath.h>
+#include <limits.h>
+
+QT_BEGIN_NAMESPACE
+
+extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
+
+class QSGTextDocumentWithImageResources : public QTextDocument {
+    Q_OBJECT
+
+public:
+    QSGTextDocumentWithImageResources(QSGText *parent);
+    virtual ~QSGTextDocumentWithImageResources();
+
+    void setText(const QString &);
+    int resourcesLoading() const { return outstanding; }
+
+protected:
+    QVariant loadResource(int type, const QUrl &name);
+
+private slots:
+    void requestFinished();
+
+private:
+    QHash<QUrl, QDeclarativePixmap *> m_resources;
+
+    int outstanding;
+    static QSet<QUrl> errors;
+};
+
+DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE);
+
+QString QSGTextPrivate::elideChar = QString(0x2026);
+
+QSGTextPrivate::QSGTextPrivate()
+: color((QRgb)0), style(QSGText::Normal), hAlign(QSGText::AlignLeft),
+  vAlign(QSGText::AlignTop), elideMode(QSGText::ElideNone),
+  format(QSGText::AutoText), wrapMode(QSGText::NoWrap), lineHeight(1),
+  lineHeightMode(QSGText::ProportionalHeight), lineCount(1), maximumLineCount(INT_MAX),
+  maximumLineCountValid(false),
+  texture(0),
+  imageCacheDirty(true), updateOnComponentComplete(true),
+  richText(false), singleline(false), cacheAllTextAsImage(true), internalWidthUpdate(false),
+  requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false),
+  naturalWidth(0), doc(0), nodeType(NodeIsNull)
+{
+    cacheAllTextAsImage = enableImageCache();
+}
+
+void QSGTextPrivate::init()
+{
+    Q_Q(QSGText);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFlag(QSGItem::ItemHasContents);
+}
+
+QSGTextDocumentWithImageResources::QSGTextDocumentWithImageResources(QSGText *parent)
+: QTextDocument(parent), outstanding(0)
+{
+    setUndoRedoEnabled(false);
+}
+
+QSGTextDocumentWithImageResources::~QSGTextDocumentWithImageResources()
+{
+    if (!m_resources.isEmpty())
+        qDeleteAll(m_resources);
+}
+
+QVariant QSGTextDocumentWithImageResources::loadResource(int type, const QUrl &name)
+{
+    QDeclarativeContext *context = qmlContext(parent());
+    QUrl url = context->resolvedUrl(name);
+
+    if (type == QTextDocument::ImageResource) {
+        QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url);
+
+        if (iter == m_resources.end()) {
+            QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url);
+            iter = m_resources.insert(name, p);
+
+            if (p->isLoading()) {
+                p->connectFinished(this, SLOT(requestFinished()));
+                outstanding++;
+            }
+        }
+
+        QDeclarativePixmap *p = *iter;
+        if (p->isReady()) {
+            return p->pixmap();
+        } else if (p->isError()) {
+            if (!errors.contains(url)) {
+                errors.insert(url);
+                qmlInfo(parent()) << p->error();
+            }
+        }
+    }
+
+    return QTextDocument::loadResource(type,url); // The *resolved* URL
+}
+
+void QSGTextDocumentWithImageResources::requestFinished()
+{
+    outstanding--;
+    if (outstanding == 0) {
+        QSGText *textItem = static_cast<QSGText*>(parent());
+        QString text = textItem->text();
+#ifndef QT_NO_TEXTHTMLPARSER
+        setHtml(text);
+#else
+        setPlainText(text);
+#endif
+        QSGTextPrivate *d = QSGTextPrivate::get(textItem);
+        d->updateLayout();
+    }
+}
+
+void QSGTextDocumentWithImageResources::setText(const QString &text)
+{
+    if (!m_resources.isEmpty()) {
+        qDeleteAll(m_resources);
+        m_resources.clear();
+        outstanding = 0;
+    }
+
+#ifndef QT_NO_TEXTHTMLPARSER
+    setHtml(text);
+#else
+    setPlainText(text);
+#endif
+}
+
+QSet<QUrl> QSGTextDocumentWithImageResources::errors;
+
+QSGTextPrivate::~QSGTextPrivate()
+{
+}
+
+qreal QSGTextPrivate::getImplicitWidth() const
+{
+    if (!requireImplicitWidth) {
+        // We don't calculate implicitWidth unless it is required.
+        // We need to force a size update now to ensure implicitWidth is calculated
+        QSGTextPrivate *me = const_cast<QSGTextPrivate*>(this);
+        me->requireImplicitWidth = true;
+        me->updateSize();
+    }
+    return implicitWidth;
+}
+
+void QSGTextPrivate::updateLayout()
+{
+    Q_Q(QSGText);
+    if (!q->isComponentComplete()) {
+        updateOnComponentComplete = true;
+        return;
+    }
+
+    // Setup instance of QTextLayout for all cases other than richtext
+    if (!richText) {
+        layout.clearLayout();
+        layout.setFont(font);
+        if (format != QSGText::StyledText) {
+            QString tmp = text;
+            tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
+            singleline = !tmp.contains(QChar::LineSeparator);
+            if (singleline && !maximumLineCountValid && elideMode != QSGText::ElideNone && q->widthValid()) {
+                QFontMetrics fm(font);
+                tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...?
+                if (tmp != text && !truncated) {
+                    truncated = true;
+                    emit q->truncatedChanged();
+                }
+            }
+            layout.setText(tmp);
+        } else {
+            singleline = false;
+            QDeclarativeStyledText::parse(text, layout);
+        }
+    } else {
+        ensureDoc();
+        QTextBlockFormat::LineHeightTypes type;
+        type = lineHeightMode == QSGText::FixedHeight ? QTextBlockFormat::FixedHeight : QTextBlockFormat::ProportionalHeight;
+        QTextBlockFormat blockFormat;
+        blockFormat.setLineHeight((lineHeightMode == QSGText::FixedHeight ? lineHeight : lineHeight * 100), type);
+        for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next()) {
+            QTextCursor cursor(it);
+            cursor.setBlockFormat(blockFormat);
+        }
+    }
+
+    updateSize();
+}
+
+void QSGTextPrivate::updateSize()
+{
+    Q_Q(QSGText);
+
+    if (!q->isComponentComplete()) {
+        updateOnComponentComplete = true;
+        return;
+    }
+
+    if (!requireImplicitWidth) {
+        emit q->implicitWidthChanged();
+        // if the implicitWidth is used, then updateSize() has already been called (recursively)
+        if (requireImplicitWidth)
+            return;
+    }
+
+    invalidateImageCache();
+
+    QFontMetrics fm(font);
+    if (text.isEmpty()) {
+        q->setImplicitWidth(0);
+        q->setImplicitHeight(fm.height());
+        paintedSize = QSize(0, fm.height());
+        emit q->paintedSizeChanged();
+        q->update();
+        return;
+    }
+
+    int dy = q->height();
+    QSize size(0, 0);
+
+    //setup instance of QTextLayout for all cases other than richtext
+    if (!richText) {
+        QRect textRect = setupTextLayout();
+        layedOutTextRect = textRect;
+        size = textRect.size();
+        dy -= size.height();
+    } else {
+        singleline = false; // richtext can't elide or be optimized for single-line case
+        ensureDoc();
+        doc->setDefaultFont(font);
+        QSGText::HAlignment horizontalAlignment = q->effectiveHAlign();
+        if (rightToLeftText) {
+            if (horizontalAlignment == QSGText::AlignLeft)
+                horizontalAlignment = QSGText::AlignRight;
+            else if (horizontalAlignment == QSGText::AlignRight)
+                horizontalAlignment = QSGText::AlignLeft;
+        }
+        QTextOption option;
+        option.setAlignment((Qt::Alignment)int(horizontalAlignment | vAlign));
+        option.setWrapMode(QTextOption::WrapMode(wrapMode));
+        doc->setDefaultTextOption(option);
+        if (requireImplicitWidth && q->widthValid()) {
+            doc->setTextWidth(-1);
+            naturalWidth = doc->idealWidth();
+        }
+        if (wrapMode != QSGText::NoWrap && q->widthValid())
+            doc->setTextWidth(q->width());
+        else
+            doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
+        dy -= (int)doc->size().height();
+        QSize dsize = doc->size().toSize();
+        layedOutTextRect = QRect(QPoint(0,0), dsize);
+        size = QSize(int(doc->idealWidth()),dsize.height());
+    }
+    int yoff = 0;
+
+    if (q->heightValid()) {
+        if (vAlign == QSGText::AlignBottom)
+            yoff = dy;
+        else if (vAlign == QSGText::AlignVCenter)
+            yoff = dy/2;
+    }
+    q->setBaselineOffset(fm.ascent() + yoff);
+
+    //### need to comfirm cost of always setting these for richText
+    internalWidthUpdate = true;
+    if (!q->widthValid())
+        q->setImplicitWidth(size.width());
+    else if (requireImplicitWidth)
+        q->setImplicitWidth(naturalWidth);
+    internalWidthUpdate = false;
+
+    q->setImplicitHeight(size.height());
+    if (paintedSize != size) {
+        paintedSize = size;
+        emit q->paintedSizeChanged();
+    }
+    q->update();
+}
+
+/*!
+    Lays out the QSGTextPrivate::layout QTextLayout in the constraints of the QSGText.
+
+    Returns the size of the final text.  This can be used to position the text vertically (the text is
+    already absolutely positioned horizontally).
+*/
+QRect QSGTextPrivate::setupTextLayout()
+{
+    // ### text layout handling should be profiled and optimized as needed
+    // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine);
+    Q_Q(QSGText);
+    layout.setCacheEnabled(true);
+
+    qreal lineWidth = 0;
+    int visibleCount = 0;
+
+    //set manual width
+    if (q->widthValid())
+        lineWidth = q->width();
+
+    QTextOption textOption = layout.textOption();
+    textOption.setAlignment(Qt::Alignment(q->effectiveHAlign()));
+    textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
+    layout.setTextOption(textOption);
+
+    bool elideText = false;
+    bool truncate = false;
+
+    QFontMetrics fm(layout.font());
+    elidePos = QPointF();
+
+    if (requireImplicitWidth && q->widthValid()) {
+        // requires an extra layout
+        layout.beginLayout();
+        forever {
+            QTextLine line = layout.createLine();
+            if (!line.isValid())
+                break;
+        }
+        layout.endLayout();
+        QRectF br;
+        for (int i = 0; i < layout.lineCount(); ++i) {
+            QTextLine line = layout.lineAt(i);
+            br = br.united(line.naturalTextRect());
+        }
+        naturalWidth = br.width();
+    }
+
+    if (maximumLineCountValid) {
+        layout.beginLayout();
+        if (!lineWidth)
+            lineWidth = INT_MAX;
+        int linesLeft = maximumLineCount;
+        int visibleTextLength = 0;
+        while (linesLeft > 0) {
+            QTextLine line = layout.createLine();
+            if (!line.isValid())
+                break;
+
+            visibleCount++;
+            if (lineWidth)
+                line.setLineWidth(lineWidth);
+            visibleTextLength += line.textLength();
+
+            if (--linesLeft == 0) {
+                if (visibleTextLength < text.length()) {
+                    truncate = true;
+                    if (elideMode==QSGText::ElideRight && q->widthValid()) {
+                        qreal elideWidth = fm.width(elideChar);
+                        // Need to correct for alignment
+                        line.setLineWidth(lineWidth-elideWidth);
+                        if (layout.text().mid(line.textStart(), line.textLength()).isRightToLeft()) {
+                            line.setPosition(QPointF(line.position().x() + elideWidth, line.position().y()));
+                            elidePos.setX(line.naturalTextRect().left() - elideWidth);
+                        } else {
+                            elidePos.setX(line.naturalTextRect().right());
+                        }
+                        elideText = true;
+                    }
+                }
+            }
+        }
+        layout.endLayout();
+
+        //Update truncated
+        if (truncated != truncate) {
+            truncated = truncate;
+            emit q->truncatedChanged();
+        }
+    } else {
+        layout.beginLayout();
+        forever {
+            QTextLine line = layout.createLine();
+            if (!line.isValid())
+                break;
+            visibleCount++;
+            if (lineWidth)
+                line.setLineWidth(lineWidth);
+        }
+        layout.endLayout();
+    }
+
+    qreal height = 0;
+    QRectF br;
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        // set line spacing
+        line.setPosition(QPointF(line.position().x(), height));
+        if (elideText && i == layout.lineCount()-1) {
+            elidePos.setY(height + fm.ascent());
+            br = br.united(QRectF(elidePos, QSizeF(fm.width(elideChar), fm.ascent())));
+        }
+        br = br.united(line.naturalTextRect());
+        height += (lineHeightMode == QSGText::FixedHeight) ? lineHeight : line.height() * lineHeight;
+    }
+    br.setHeight(height);
+
+    if (!q->widthValid())
+        naturalWidth = br.width();
+
+    //Update the number of visible lines
+    if (lineCount != visibleCount) {
+        lineCount = visibleCount;
+        emit q->lineCountChanged();
+    }
+
+    return QRect(qRound(br.x()), qRound(br.y()), qCeil(br.width()), qCeil(br.height()));
+}
+
+/*!
+    Returns a painted version of the QSGTextPrivate::layout QTextLayout.
+    If \a drawStyle is true, the style color overrides all colors in the document.
+*/
+QPixmap QSGTextPrivate::textLayoutImage(bool drawStyle)
+{
+    QSize size = layedOutTextRect.size();
+
+    //paint text
+    QPixmap img(size);
+    if (!size.isEmpty()) {
+        img.fill(Qt::transparent);
+#ifdef Q_WS_MAC
+        bool oldSmooth = qt_applefontsmoothing_enabled;
+        qt_applefontsmoothing_enabled = false;
+#endif
+        QPainter p(&img);
+#ifdef Q_WS_MAC
+        qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+        drawTextLayout(&p, QPointF(-layedOutTextRect.x(),0), drawStyle);
+    }
+    return img;
+}
+
+/*!
+    Paints the QSGTextPrivate::layout QTextLayout into \a painter at \a pos.  If
+    \a drawStyle is true, the style color overrides all colors in the document.
+*/
+void QSGTextPrivate::drawTextLayout(QPainter *painter, const QPointF &pos, bool drawStyle)
+{
+    if (drawStyle)
+        painter->setPen(styleColor);
+    else
+        painter->setPen(color);
+    painter->setFont(font);
+    layout.draw(painter, pos);
+    if (!elidePos.isNull())
+        painter->drawText(pos + elidePos, elideChar);
+}
+
+/*!
+    Returns a painted version of the QSGTextPrivate::doc QTextDocument.
+    If \a drawStyle is true, the style color overrides all colors in the document.
+*/
+QPixmap QSGTextPrivate::textDocumentImage(bool drawStyle)
+{
+    QSize size = doc->size().toSize();
+
+    //paint text
+    QPixmap img(size);
+    img.fill(Qt::transparent);
+#ifdef Q_WS_MAC
+    bool oldSmooth = qt_applefontsmoothing_enabled;
+    qt_applefontsmoothing_enabled = false;
+#endif
+    QPainter p(&img);
+#ifdef Q_WS_MAC
+    qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+
+    QAbstractTextDocumentLayout::PaintContext context;
+
+    QTextOption oldOption(doc->defaultTextOption());
+    if (drawStyle) {
+        context.palette.setColor(QPalette::Text, styleColor);
+        QTextOption colorOption(doc->defaultTextOption());
+        colorOption.setFlags(QTextOption::SuppressColors);
+        doc->setDefaultTextOption(colorOption);
+    } else {
+        context.palette.setColor(QPalette::Text, color);
+    }
+    doc->documentLayout()->draw(&p, context);
+    if (drawStyle)
+        doc->setDefaultTextOption(oldOption);
+    return img;
+}
+
+/*!
+    Mark the image cache as dirty.
+*/
+void QSGTextPrivate::invalidateImageCache()
+{
+    Q_Q(QSGText);
+
+    if(cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && style != QSGText::Normal)){//If actually using the image cache
+        if (imageCacheDirty)
+            return;
+
+        imageCacheDirty = true;
+        imageCache = QPixmap();
+    }
+    if (q->isComponentComplete())
+        q->update();
+}
+
+/*!
+    Tests if the image cache is dirty, and repaints it if it is.
+*/
+void QSGTextPrivate::checkImageCache()
+{
+    if (!imageCacheDirty)
+        return;
+
+    if (text.isEmpty()) {
+
+        imageCache = QPixmap();
+
+    } else {
+
+        QPixmap textImage;
+        QPixmap styledImage;
+
+        if (richText) {
+            textImage = textDocumentImage(false);
+            if (style != QSGText::Normal)
+                styledImage = textDocumentImage(true); //### should use styleColor
+        } else {
+            textImage = textLayoutImage(false);
+            if (style != QSGText::Normal)
+                styledImage = textLayoutImage(true); //### should use styleColor
+        }
+
+        switch (style) {
+        case QSGText::Outline:
+            imageCache = drawOutline(textImage, styledImage);
+            break;
+        case QSGText::Sunken:
+            imageCache = drawOutline(textImage, styledImage, -1);
+            break;
+        case QSGText::Raised:
+            imageCache = drawOutline(textImage, styledImage, 1);
+            break;
+        default:
+            imageCache = textImage;
+            break;
+        }
+
+    }
+
+    imageCacheDirty = false;
+}
+
+/*!
+    Ensures the QSGTextPrivate::doc variable is set to a valid text document
+*/
+void QSGTextPrivate::ensureDoc()
+{
+    if (!doc) {
+        Q_Q(QSGText);
+        doc = new QSGTextDocumentWithImageResources(q);
+        doc->setDocumentMargin(0);
+    }
+}
+
+/*!
+    Draw \a styleSource as an outline around \a source and return the new image.
+*/
+QPixmap QSGTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource)
+{
+    QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
+    img.fill(Qt::transparent);
+
+    QPainter ppm(&img);
+
+    QPoint pos(0, 0);
+    pos += QPoint(-1, 0);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(2, 0);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(-1, -1);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(0, 2);
+    ppm.drawPixmap(pos, styleSource);
+
+    pos += QPoint(0, -1);
+    ppm.drawPixmap(pos, source);
+    ppm.end();
+
+    return img;
+}
+
+/*!
+    Draw \a styleSource below \a source at \a yOffset and return the new image.
+*/
+QPixmap QSGTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset)
+{
+    QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
+    img.fill(Qt::transparent);
+
+    QPainter ppm(&img);
+
+    ppm.drawPixmap(QPoint(0, yOffset), styleSource);
+    ppm.drawPixmap(0, 0, source);
+
+    ppm.end();
+
+    return img;
+}
+
+QSGText::QSGText(QSGItem *parent)
+: QSGImplicitSizeItem(*(new QSGTextPrivate), parent)
+{
+    Q_D(QSGText);
+    d->init();
+}
+
+QSGText::~QSGText()
+{
+}
+
+QFont QSGText::font() const
+{
+    Q_D(const QSGText);
+    return d->sourceFont;
+}
+
+void QSGText::setFont(const QFont &font)
+{
+    Q_D(QSGText);
+    if (d->sourceFont == font)
+        return;
+
+    d->sourceFont = font;
+    QFont oldFont = d->font;
+    d->font = font;
+    if (QSGDistanceFieldGlyphCache::distanceFieldEnabled())
+        d->font.setHintingPreference(QFont::PreferNoHinting);
+
+    if (d->font.pointSizeF() != -1) {
+        // 0.5pt resolution
+        qreal size = qRound(d->font.pointSizeF()*2.0);
+        d->font.setPointSizeF(size/2.0);
+    }
+
+    if (oldFont != d->font)
+        d->updateLayout();
+
+    emit fontChanged(d->sourceFont);
+}
+
+QString QSGText::text() const
+{
+    Q_D(const QSGText);
+    return d->text;
+}
+
+void QSGText::setText(const QString &n)
+{
+    Q_D(QSGText);
+    if (d->text == n)
+        return;
+
+    d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n));
+    d->text = n;
+    if (isComponentComplete()) {
+        if (d->richText) {
+            d->ensureDoc();
+            d->doc->setText(n);
+            d->rightToLeftText = d->doc->toPlainText().isRightToLeft();
+        } else {
+            d->rightToLeftText = d->text.isRightToLeft();
+        }
+        d->determineHorizontalAlignment();
+    }
+    d->updateLayout();
+    emit textChanged(d->text);
+}
+
+QColor QSGText::color() const
+{
+    Q_D(const QSGText);
+    return d->color;
+}
+
+void QSGText::setColor(const QColor &color)
+{
+    Q_D(QSGText);
+    if (d->color == color)
+        return;
+
+    d->color = color;
+    d->invalidateImageCache();
+    emit colorChanged(d->color);
+}
+
+QSGText::TextStyle QSGText::style() const
+{
+    Q_D(const QSGText);
+    return d->style;
+}
+
+void QSGText::setStyle(QSGText::TextStyle style)
+{
+    Q_D(QSGText);
+    if (d->style == style)
+        return;
+
+    // changing to/from Normal requires the boundingRect() to change
+    if (isComponentComplete() && (d->style == Normal || style == Normal))
+        update();
+    d->style = style;
+    d->invalidateImageCache();
+    emit styleChanged(d->style);
+}
+
+QColor QSGText::styleColor() const
+{
+    Q_D(const QSGText);
+    return d->styleColor;
+}
+
+void QSGText::setStyleColor(const QColor &color)
+{
+    Q_D(QSGText);
+    if (d->styleColor == color)
+        return;
+
+    d->styleColor = color;
+    d->invalidateImageCache();
+    emit styleColorChanged(d->styleColor);
+}
+
+QSGText::HAlignment QSGText::hAlign() const
+{
+    Q_D(const QSGText);
+    return d->hAlign;
+}
+
+void QSGText::setHAlign(HAlignment align)
+{
+    Q_D(QSGText);
+    bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
+    d->hAlignImplicit = false;
+    if (d->setHAlign(align, forceAlign) && isComponentComplete())
+        d->updateLayout();
+}
+
+void QSGText::resetHAlign()
+{
+    Q_D(QSGText);
+    d->hAlignImplicit = true;
+    if (d->determineHorizontalAlignment() && isComponentComplete())
+        d->updateLayout();
+}
+
+QSGText::HAlignment QSGText::effectiveHAlign() const
+{
+    Q_D(const QSGText);
+    QSGText::HAlignment effectiveAlignment = d->hAlign;
+    if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
+        switch (d->hAlign) {
+        case QSGText::AlignLeft:
+            effectiveAlignment = QSGText::AlignRight;
+            break;
+        case QSGText::AlignRight:
+            effectiveAlignment = QSGText::AlignLeft;
+            break;
+        default:
+            break;
+        }
+    }
+    return effectiveAlignment;
+}
+
+bool QSGTextPrivate::setHAlign(QSGText::HAlignment alignment, bool forceAlign)
+{
+    Q_Q(QSGText);
+    if (hAlign != alignment || forceAlign) {
+        QSGText::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
+        hAlign = alignment;
+
+        emit q->horizontalAlignmentChanged(hAlign);
+        if (oldEffectiveHAlign != q->effectiveHAlign())
+            emit q->effectiveHorizontalAlignmentChanged();
+        return true;
+    }
+    return false;
+}
+
+bool QSGTextPrivate::determineHorizontalAlignment()
+{
+    Q_Q(QSGText);
+    if (hAlignImplicit && q->isComponentComplete()) {
+        bool alignToRight = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : rightToLeftText;
+        return setHAlign(alignToRight ? QSGText::AlignRight : QSGText::AlignLeft);
+    }
+    return false;
+}
+
+void QSGTextPrivate::mirrorChange()
+{
+    Q_Q(QSGText);
+    if (q->isComponentComplete()) {
+        if (!hAlignImplicit && (hAlign == QSGText::AlignRight || hAlign == QSGText::AlignLeft)) {
+            updateLayout();
+            emit q->effectiveHorizontalAlignmentChanged();
+        }
+    }
+}
+
+QTextDocument *QSGTextPrivate::textDocument()
+{
+    return doc;
+}
+
+QSGText::VAlignment QSGText::vAlign() const
+{
+    Q_D(const QSGText);
+    return d->vAlign;
+}
+
+void QSGText::setVAlign(VAlignment align)
+{
+    Q_D(QSGText);
+    if (d->vAlign == align)
+        return;
+
+    d->vAlign = align;
+    emit verticalAlignmentChanged(align);
+}
+
+QSGText::WrapMode QSGText::wrapMode() const
+{
+    Q_D(const QSGText);
+    return d->wrapMode;
+}
+
+void QSGText::setWrapMode(WrapMode mode)
+{
+    Q_D(QSGText);
+    if (mode == d->wrapMode)
+        return;
+
+    d->wrapMode = mode;
+    d->updateLayout();
+
+    emit wrapModeChanged();
+}
+
+int QSGText::lineCount() const
+{
+    Q_D(const QSGText);
+    return d->lineCount;
+}
+
+bool QSGText::truncated() const
+{
+    Q_D(const QSGText);
+    return d->truncated;
+}
+
+int QSGText::maximumLineCount() const
+{
+    Q_D(const QSGText);
+    return d->maximumLineCount;
+}
+
+void QSGText::setMaximumLineCount(int lines)
+{
+    Q_D(QSGText);
+
+    d->maximumLineCountValid = lines==INT_MAX ? false : true;
+    if (d->maximumLineCount != lines) {
+        d->maximumLineCount = lines;
+        d->updateLayout();
+        emit maximumLineCountChanged();
+    }
+}
+
+void QSGText::resetMaximumLineCount()
+{
+    Q_D(QSGText);
+    setMaximumLineCount(INT_MAX);
+    d->elidePos = QPointF();
+    if (d->truncated != false) {
+        d->truncated = false;
+        emit truncatedChanged();
+    }
+}
+
+QSGText::TextFormat QSGText::textFormat() const
+{
+    Q_D(const QSGText);
+    return d->format;
+}
+
+void QSGText::setTextFormat(TextFormat format)
+{
+    Q_D(QSGText);
+    if (format == d->format)
+        return;
+    d->format = format;
+    bool wasRich = d->richText;
+    d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
+
+    if (!wasRich && d->richText && isComponentComplete()) {
+        d->ensureDoc();
+        d->doc->setText(d->text);
+    }
+
+    d->updateLayout();
+
+    emit textFormatChanged(d->format);
+}
+
+QSGText::TextElideMode QSGText::elideMode() const
+{
+    Q_D(const QSGText);
+    return d->elideMode;
+}
+
+void QSGText::setElideMode(QSGText::TextElideMode mode)
+{
+    Q_D(QSGText);
+    if (mode == d->elideMode)
+        return;
+
+    d->elideMode = mode;
+    d->updateLayout();
+
+    emit elideModeChanged(d->elideMode);
+}
+
+/*! \internal */
+QRectF QSGText::boundingRect() const
+{
+    Q_D(const QSGText);
+
+    QRect rect = d->layedOutTextRect;
+    if (d->style != Normal)
+        rect.adjust(-1, 0, 1, 2);
+
+    // Could include font max left/right bearings to either side of rectangle.
+
+    int h = height();
+    switch (d->vAlign) {
+    case AlignTop:
+        break;
+    case AlignBottom:
+        rect.moveTop(h - rect.height());
+        break;
+    case AlignVCenter:
+        rect.moveTop((h - rect.height()) / 2);
+        break;
+    }
+
+    return QRectF(rect);
+}
+
+/*! \internal */
+void QSGText::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_D(QSGText);
+    if ((!d->internalWidthUpdate && newGeometry.width() != oldGeometry.width())
+            && (d->wrapMode != QSGText::NoWrap
+                || d->elideMode != QSGText::ElideNone
+                || d->hAlign != QSGText::AlignLeft)) {
+        if ((d->singleline || d->maximumLineCountValid) && d->elideMode != QSGText::ElideNone && widthValid()) {
+            // We need to re-elide
+            d->updateLayout();
+        } else {
+            // We just need to re-layout
+            d->updateSize();
+        }
+    }
+
+    QSGItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+QSGNode *QSGText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
+{
+    Q_UNUSED(data);
+    Q_D(QSGText);
+
+    bool richTextAsImage = false;
+    if (d->richText) {
+        d->ensureDoc();
+        richTextAsImage = QSGTextNode::isComplexRichText(d->doc);
+    }
+
+    QRectF bounds = boundingRect();
+
+    // XXX todo - some styled text can be done by the QSGTextNode
+    if (richTextAsImage || d->cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && d->style != Normal)) {
+        bool wasDirty = d->imageCacheDirty;
+
+        d->checkImageCache();
+
+        if (d->imageCache.isNull()) {
+            delete oldNode;
+            return 0;
+        }
+
+        QSGImageNode *node = 0;
+        if (!oldNode || d->nodeType != QSGTextPrivate::NodeIsTexture) {
+            delete oldNode;
+            node = QSGItemPrivate::get(this)->sceneGraphContext()->createImageNode();
+            d->texture = new QSGPlainTexture();
+            wasDirty = true;
+            d->nodeType = QSGTextPrivate::NodeIsTexture;
+        } else {
+            node = static_cast<QSGImageNode *>(oldNode);
+            Q_ASSERT(d->texture);
+        }
+
+        if (wasDirty) {
+            qobject_cast<QSGPlainTexture *>(d->texture)->setImage(d->imageCache.toImage());
+            node->setTexture(0);
+            node->setTexture(d->texture);
+        }
+
+        node->setTargetRect(QRectF(bounds.x(), bounds.y(), d->imageCache.width(), d->imageCache.height()));
+        node->setSourceRect(QRectF(0, 0, 1, 1));
+        node->setHorizontalWrapMode(QSGTexture::ClampToEdge);
+        node->setVerticalWrapMode(QSGTexture::ClampToEdge);
+        node->setFiltering(QSGTexture::Linear); // Nonsmooth text just ugly, so don't do that..
+        node->update();
+
+        return node;
+
+    } else {
+        QSGTextNode *node = 0;
+        if (!oldNode || d->nodeType != QSGTextPrivate::NodeIsText) {
+            delete oldNode;
+            node = new QSGTextNode(QSGItemPrivate::get(this)->sceneGraphContext());
+            d->nodeType = QSGTextPrivate::NodeIsText;
+        } else {
+            node = static_cast<QSGTextNode *>(oldNode);
+        }
+
+        node->deleteContent();
+        node->setMatrix(QMatrix4x4());
+
+        if (d->richText) {
+
+            d->ensureDoc();
+            node->addTextDocument(bounds.topLeft(), d->doc, QColor(), d->style, d->styleColor);
+
+        } else {
+            node->addTextLayout(QPoint(0, bounds.y()), &d->layout, d->color, d->style, d->styleColor);
+            QMatrix4x4 m;
+            m.translate(0, QFontMetricsF(d->font).ascent());
+            node->setMatrix(m);
+        }
+
+        return node;
+    }
+}
+
+qreal QSGText::paintedWidth() const
+{
+    Q_D(const QSGText);
+    return d->paintedSize.width();
+}
+
+qreal QSGText::paintedHeight() const
+{
+    Q_D(const QSGText);
+    return d->paintedSize.height();
+}
+
+qreal QSGText::lineHeight() const
+{
+    Q_D(const QSGText);
+    return d->lineHeight;
+}
+
+void QSGText::setLineHeight(qreal lineHeight)
+{
+    Q_D(QSGText);
+
+    if ((d->lineHeight == lineHeight) || (lineHeight < 0.0))
+        return;
+
+    d->lineHeight = lineHeight;
+    d->updateLayout();
+    emit lineHeightChanged(lineHeight);
+}
+
+QSGText::LineHeightMode QSGText::lineHeightMode() const
+{
+    Q_D(const QSGText);
+    return d->lineHeightMode;
+}
+
+void QSGText::setLineHeightMode(LineHeightMode mode)
+{
+    Q_D(QSGText);
+    if (mode == d->lineHeightMode)
+        return;
+
+    d->lineHeightMode = mode;
+    d->updateLayout();
+
+    emit lineHeightModeChanged(mode);
+}
+
+/*!
+    Returns the number of resources (images) that are being loaded asynchronously.
+*/
+int QSGText::resourcesLoading() const
+{
+    Q_D(const QSGText);
+    return d->doc ? d->doc->resourcesLoading() : 0;
+}
+
+/*! \internal */
+void QSGText::componentComplete()
+{
+    Q_D(QSGText);
+    QSGItem::componentComplete();
+    if (d->updateOnComponentComplete) {
+        d->updateOnComponentComplete = false;
+        if (d->richText) {
+            d->ensureDoc();
+            d->doc->setText(d->text);
+            d->rightToLeftText = d->doc->toPlainText().isRightToLeft();
+        } else {
+            d->rightToLeftText = d->text.isRightToLeft();
+        }
+        d->determineHorizontalAlignment();
+        d->updateLayout();
+    }
+}
+
+/*!  \internal */
+void QSGText::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGText);
+
+    if (!d->richText || !d->doc || d->doc->documentLayout()->anchorAt(event->pos()).isEmpty()) {
+        event->setAccepted(false);
+        d->activeLink.clear();
+    } else {
+        d->activeLink = d->doc->documentLayout()->anchorAt(event->pos());
+    }
+
+    // ### may malfunction if two of the same links are clicked & dragged onto each other)
+
+    if (!event->isAccepted())
+        QSGItem::mousePressEvent(event);
+
+}
+
+/*! \internal */
+void QSGText::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGText);
+
+        // ### confirm the link, and send a signal out
+    if (d->richText && d->doc && d->activeLink == d->doc->documentLayout()->anchorAt(event->pos()))
+        emit linkActivated(d->activeLink);
+    else
+        event->setAccepted(false);
+
+    if (!event->isAccepted())
+        QSGItem::mouseReleaseEvent(event);
+}
+
+QT_END_NAMESPACE
+
+#include "qsgtext.moc"
diff --git a/src/declarative/items/qsgtext_p.h b/src/declarative/items/qsgtext_p.h
new file mode 100644
index 0000000000..090a2b0e67
--- /dev/null
+++ b/src/declarative/items/qsgtext_p.h
@@ -0,0 +1,214 @@
+// Commit: 27e4302b7f45f22180693d26747f419177c81e27
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXT_P_H
+#define QSGTEXT_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+
+#include <private/qdeclarativeglobal_p.h>
+
+#include <QtGui/qtextoption.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+class QSGTextPrivate;
+class Q_DECLARATIVE_PRIVATE_EXPORT QSGText : public QSGImplicitSizeItem
+{
+    Q_OBJECT
+    Q_ENUMS(HAlignment)
+    Q_ENUMS(VAlignment)
+    Q_ENUMS(TextStyle)
+    Q_ENUMS(TextFormat)
+    Q_ENUMS(TextElideMode)
+    Q_ENUMS(WrapMode)
+    Q_ENUMS(LineHeightMode)
+
+    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
+    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+    Q_PROPERTY(TextStyle style READ style WRITE setStyle NOTIFY styleChanged)
+    Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor NOTIFY styleColorChanged)
+    Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
+    Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged)
+    Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
+    Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
+    Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged)
+    Q_PROPERTY(bool truncated READ truncated NOTIFY truncatedChanged)
+    Q_PROPERTY(int maximumLineCount READ maximumLineCount WRITE setMaximumLineCount NOTIFY maximumLineCountChanged RESET resetMaximumLineCount)
+
+    Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
+    Q_PROPERTY(TextElideMode elide READ elideMode WRITE setElideMode NOTIFY elideModeChanged) //### elideMode?
+    Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
+    Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
+    Q_PROPERTY(qreal lineHeight READ lineHeight WRITE setLineHeight NOTIFY lineHeightChanged)
+    Q_PROPERTY(LineHeightMode lineHeightMode READ lineHeightMode WRITE setLineHeightMode NOTIFY lineHeightModeChanged)
+
+public:
+    QSGText(QSGItem *parent=0);
+    ~QSGText();
+
+    enum HAlignment { AlignLeft = Qt::AlignLeft,
+                       AlignRight = Qt::AlignRight,
+                       AlignHCenter = Qt::AlignHCenter,
+                       AlignJustify = Qt::AlignJustify };
+    enum VAlignment { AlignTop = Qt::AlignTop,
+                       AlignBottom = Qt::AlignBottom,
+                       AlignVCenter = Qt::AlignVCenter };
+    enum TextStyle { Normal,
+                      Outline,
+                      Raised,
+                      Sunken };
+    enum TextFormat { PlainText = Qt::PlainText,
+                       RichText = Qt::RichText,
+                       AutoText = Qt::AutoText,
+                       StyledText = 4 };
+    enum TextElideMode { ElideLeft = Qt::ElideLeft,
+                          ElideRight = Qt::ElideRight,
+                          ElideMiddle = Qt::ElideMiddle,
+                          ElideNone = Qt::ElideNone };
+
+    enum WrapMode { NoWrap = QTextOption::NoWrap,
+                    WordWrap = QTextOption::WordWrap,
+                    WrapAnywhere = QTextOption::WrapAnywhere,
+                    WrapAtWordBoundaryOrAnywhere = QTextOption::WrapAtWordBoundaryOrAnywhere, // COMPAT
+                    Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
+                  };
+
+    enum LineHeightMode { ProportionalHeight, FixedHeight };
+
+    QString text() const;
+    void setText(const QString &);
+
+    QFont font() const;
+    void setFont(const QFont &font);
+
+    QColor color() const;
+    void setColor(const QColor &c);
+
+    TextStyle style() const;
+    void setStyle(TextStyle style);
+
+    QColor styleColor() const;
+    void setStyleColor(const QColor &c);
+
+    HAlignment hAlign() const;
+    void setHAlign(HAlignment align);
+    void resetHAlign();
+    HAlignment effectiveHAlign() const;
+
+    VAlignment vAlign() const;
+    void setVAlign(VAlignment align);
+
+    WrapMode wrapMode() const;
+    void setWrapMode(WrapMode w);
+
+    int lineCount() const;
+    bool truncated() const;
+
+    int maximumLineCount() const;
+    void setMaximumLineCount(int lines);
+    void resetMaximumLineCount();
+
+    TextFormat textFormat() const;
+    void setTextFormat(TextFormat format);
+
+    TextElideMode elideMode() const;
+    void setElideMode(TextElideMode);
+
+    qreal lineHeight() const;
+    void setLineHeight(qreal lineHeight);
+
+    LineHeightMode lineHeightMode() const;
+    void setLineHeightMode(LineHeightMode);
+
+    virtual void componentComplete();
+
+    int resourcesLoading() const; // mainly for testing
+
+    qreal paintedWidth() const;
+    qreal paintedHeight() const;
+
+    QRectF boundingRect() const;
+
+Q_SIGNALS:
+    void textChanged(const QString &text);
+    void linkActivated(const QString &link);
+    void fontChanged(const QFont &font);
+    void colorChanged(const QColor &color);
+    void styleChanged(TextStyle style);
+    void styleColorChanged(const QColor &color);
+    void horizontalAlignmentChanged(HAlignment alignment);
+    void verticalAlignmentChanged(VAlignment alignment);
+    void wrapModeChanged();
+    void lineCountChanged();
+    void truncatedChanged();
+    void maximumLineCountChanged();
+    void textFormatChanged(TextFormat textFormat);
+    void elideModeChanged(TextElideMode mode);
+    void paintedSizeChanged();
+    void lineHeightChanged(qreal lineHeight);
+    void lineHeightModeChanged(LineHeightMode mode);
+    void effectiveHorizontalAlignmentChanged();
+
+protected:
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+
+private:
+    Q_DISABLE_COPY(QSGText)
+    Q_DECLARE_PRIVATE(QSGText)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGText)
+
+QT_END_HEADER
+
+#endif // QSGTEXT_P_H
diff --git a/src/declarative/items/qsgtext_p_p.h b/src/declarative/items/qsgtext_p_p.h
new file mode 100644
index 0000000000..7df91f80d9
--- /dev/null
+++ b/src/declarative/items/qsgtext_p_p.h
@@ -0,0 +1,154 @@
+// Commit: aeb330e3999ef3d7ae8d94b9330471f2a2a13554
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXT_P_P_H
+#define QSGTEXT_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgitem.h"
+#include "qsgimplicitsizeitem_p_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtGui/qtextlayout.h>
+
+#include <private/qdeclarativetextlayout_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTextLayout;
+class QSGTextDocumentWithImageResources;
+class QSGPlainTexture;
+
+class Q_AUTOTEST_EXPORT QSGTextPrivate : public QSGImplicitSizeItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGText)
+public:
+    QSGTextPrivate();
+    ~QSGTextPrivate();
+    void init();
+
+    void updateSize();
+    void updateLayout();
+    bool determineHorizontalAlignment();
+    bool setHAlign(QSGText::HAlignment, bool forceAlign = false);
+    void mirrorChange();
+    QTextDocument *textDocument();
+
+    QString text;
+    QFont font;
+    QFont sourceFont;
+    QColor  color;
+    QSGText::TextStyle style;
+    QColor  styleColor;
+    QString activeLink;
+    QSGText::HAlignment hAlign;
+    QSGText::VAlignment vAlign;
+    QSGText::TextElideMode elideMode;
+    QSGText::TextFormat format;
+    QSGText::WrapMode wrapMode;
+    qreal lineHeight;
+    QSGText::LineHeightMode lineHeightMode;
+    int lineCount;
+    int maximumLineCount;
+    int maximumLineCountValid;
+    QPointF elidePos;
+
+    static QString elideChar;
+
+    void invalidateImageCache();
+    void checkImageCache();
+    QPixmap imageCache;
+    QSGTexture *texture;
+
+    bool imageCacheDirty:1;
+    bool updateOnComponentComplete:1;
+    bool richText:1;
+    bool singleline:1;
+    bool cacheAllTextAsImage:1;
+    bool internalWidthUpdate:1;
+    bool requireImplicitWidth:1;
+    bool truncated:1;
+    bool hAlignImplicit:1;
+    bool rightToLeftText:1;
+
+    QRect layedOutTextRect;
+    QSize paintedSize;
+    qreal naturalWidth;
+    virtual qreal getImplicitWidth() const;
+    
+    void ensureDoc();
+    QPixmap textDocumentImage(bool drawStyle);
+    QSGTextDocumentWithImageResources *doc;
+
+    QRect setupTextLayout();
+    QPixmap textLayoutImage(bool drawStyle);
+    void drawTextLayout(QPainter *p, const QPointF &pos, bool drawStyle);
+    QTextLayout layout;
+
+    static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource);
+    static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset);
+
+    static inline QSGTextPrivate *get(QSGText *t) {
+        return t->d_func();
+    }
+
+    enum NodeType {
+        NodeIsNull,
+        NodeIsTexture,
+        NodeIsText,
+    };
+    NodeType nodeType;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGTEXT_P_P_H
diff --git a/src/declarative/items/qsgtextedit.cpp b/src/declarative/items/qsgtextedit.cpp
new file mode 100644
index 0000000000..57f9135917
--- /dev/null
+++ b/src/declarative/items/qsgtextedit.cpp
@@ -0,0 +1,1235 @@
+// Commit: 6980bca15b411f86b9fadb7484a6dd782b9d1403
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtextedit_p.h"
+#include "qsgtextedit_p_p.h"
+#include "qsgevents_p_p.h"
+#include "qsgcanvas.h"
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qapplication.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qpainter.h>
+#include <QtGui/qtextobject.h>
+#include <QtCore/qmath.h>
+
+#include <private/qdeclarativeglobal_p.h>
+#include <private/qtextcontrol_p.h>
+#include <private/qtextengine_p.h>
+#include <private/qwidget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QWidgetPrivate *qt_widget_private(QWidget *widget);
+
+QSGTextEdit::QSGTextEdit(QSGItem *parent)
+: QSGImplicitSizePaintedItem(*(new QSGTextEditPrivate), parent)
+{
+    Q_D(QSGTextEdit);
+    d->init();
+}
+
+QString QSGTextEdit::text() const
+{
+    Q_D(const QSGTextEdit);
+
+#ifndef QT_NO_TEXTHTMLPARSER
+    if (d->richText)
+        return d->document->toHtml();
+    else
+#endif
+        return d->document->toPlainText();
+}
+
+void QSGTextEdit::setText(const QString &text)
+{
+    Q_D(QSGTextEdit);
+    if (QSGTextEdit::text() == text)
+        return;
+
+    d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(text));
+    if (d->richText) {
+#ifndef QT_NO_TEXTHTMLPARSER
+        d->control->setHtml(text);
+#else
+        d->control->setPlainText(text);
+#endif
+    } else {
+        d->control->setPlainText(text);
+    }
+    q_textChanged();
+}
+
+QSGTextEdit::TextFormat QSGTextEdit::textFormat() const
+{
+    Q_D(const QSGTextEdit);
+    return d->format;
+}
+
+void QSGTextEdit::setTextFormat(TextFormat format)
+{
+    Q_D(QSGTextEdit);
+    if (format == d->format)
+        return;
+    bool wasRich = d->richText;
+    d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
+
+    if (wasRich && !d->richText) {
+        d->control->setPlainText(d->text);
+        updateSize();
+    } else if (!wasRich && d->richText) {
+#ifndef QT_NO_TEXTHTMLPARSER
+        d->control->setHtml(d->text);
+#else
+        d->control->setPlainText(d->text);
+#endif
+        updateSize();
+    }
+    d->format = format;
+    d->control->setAcceptRichText(d->format != PlainText);
+    emit textFormatChanged(d->format);
+}
+
+QFont QSGTextEdit::font() const
+{
+    Q_D(const QSGTextEdit);
+    return d->sourceFont;
+}
+
+void QSGTextEdit::setFont(const QFont &font)
+{
+    Q_D(QSGTextEdit);
+    if (d->sourceFont == font)
+        return;
+
+    d->sourceFont = font;
+    QFont oldFont = d->font;
+    d->font = font;
+    if (d->font.pointSizeF() != -1) {
+        // 0.5pt resolution
+        qreal size = qRound(d->font.pointSizeF()*2.0);
+        d->font.setPointSizeF(size/2.0);
+    }
+
+    if (oldFont != d->font) {
+        d->document->setDefaultFont(d->font);
+        if(d->cursor){
+            d->cursor->setHeight(QFontMetrics(d->font).height());
+            moveCursorDelegate();
+        }
+        updateSize();
+        update();
+    }
+    emit fontChanged(d->sourceFont);
+}
+
+QColor QSGTextEdit::color() const
+{
+    Q_D(const QSGTextEdit);
+    return d->color;
+}
+
+void QSGTextEdit::setColor(const QColor &color)
+{
+    Q_D(QSGTextEdit);
+    if (d->color == color)
+        return;
+
+    d->color = color;
+    QPalette pal = d->control->palette();
+    pal.setColor(QPalette::Text, color);
+    d->control->setPalette(pal);
+    update();
+    emit colorChanged(d->color);
+}
+
+QColor QSGTextEdit::selectionColor() const
+{
+    Q_D(const QSGTextEdit);
+    return d->selectionColor;
+}
+
+void QSGTextEdit::setSelectionColor(const QColor &color)
+{
+    Q_D(QSGTextEdit);
+    if (d->selectionColor == color)
+        return;
+
+    d->selectionColor = color;
+    QPalette pal = d->control->palette();
+    pal.setColor(QPalette::Highlight, color);
+    d->control->setPalette(pal);
+    update();
+    emit selectionColorChanged(d->selectionColor);
+}
+
+QColor QSGTextEdit::selectedTextColor() const
+{
+    Q_D(const QSGTextEdit);
+    return d->selectedTextColor;
+}
+
+void QSGTextEdit::setSelectedTextColor(const QColor &color)
+{
+    Q_D(QSGTextEdit);
+    if (d->selectedTextColor == color)
+        return;
+
+    d->selectedTextColor = color;
+    QPalette pal = d->control->palette();
+    pal.setColor(QPalette::HighlightedText, color);
+    d->control->setPalette(pal);
+    update();
+    emit selectedTextColorChanged(d->selectedTextColor);
+}
+
+QSGTextEdit::HAlignment QSGTextEdit::hAlign() const
+{
+    Q_D(const QSGTextEdit);
+    return d->hAlign;
+}
+
+void QSGTextEdit::setHAlign(HAlignment align)
+{
+    Q_D(QSGTextEdit);
+    bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
+    d->hAlignImplicit = false;
+    if (d->setHAlign(align, forceAlign) && isComponentComplete()) {
+        d->updateDefaultTextOption();
+        updateSize();
+    }
+}
+
+void QSGTextEdit::resetHAlign()
+{
+    Q_D(QSGTextEdit);
+    d->hAlignImplicit = true;
+    if (d->determineHorizontalAlignment() && isComponentComplete()) {
+        d->updateDefaultTextOption();
+        updateSize();
+    }
+}
+
+QSGTextEdit::HAlignment QSGTextEdit::effectiveHAlign() const
+{
+    Q_D(const QSGTextEdit);
+    QSGTextEdit::HAlignment effectiveAlignment = d->hAlign;
+    if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
+        switch (d->hAlign) {
+        case QSGTextEdit::AlignLeft:
+            effectiveAlignment = QSGTextEdit::AlignRight;
+            break;
+        case QSGTextEdit::AlignRight:
+            effectiveAlignment = QSGTextEdit::AlignLeft;
+            break;
+        default:
+            break;
+        }
+    }
+    return effectiveAlignment;
+}
+
+bool QSGTextEditPrivate::setHAlign(QSGTextEdit::HAlignment alignment, bool forceAlign)
+{
+    Q_Q(QSGTextEdit);
+    if (hAlign != alignment || forceAlign) {
+        QSGTextEdit::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
+        hAlign = alignment;
+        emit q->horizontalAlignmentChanged(alignment);
+        if (oldEffectiveHAlign != q->effectiveHAlign())
+            emit q->effectiveHorizontalAlignmentChanged();
+        return true;
+    }
+    return false;
+}
+
+bool QSGTextEditPrivate::determineHorizontalAlignment()
+{
+    Q_Q(QSGTextEdit);
+    if (hAlignImplicit && q->isComponentComplete()) {
+        bool alignToRight = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : rightToLeftText;
+        return setHAlign(alignToRight ? QSGTextEdit::AlignRight : QSGTextEdit::AlignLeft);
+    }
+    return false;
+}
+
+void QSGTextEditPrivate::mirrorChange()
+{
+    Q_Q(QSGTextEdit);
+    if (q->isComponentComplete()) {
+        if (!hAlignImplicit && (hAlign == QSGTextEdit::AlignRight || hAlign == QSGTextEdit::AlignLeft)) {
+            updateDefaultTextOption();
+            q->updateSize();
+            emit q->effectiveHorizontalAlignmentChanged();
+        }
+    }
+}
+
+QSGTextEdit::VAlignment QSGTextEdit::vAlign() const
+{
+    Q_D(const QSGTextEdit);
+    return d->vAlign;
+}
+
+void QSGTextEdit::setVAlign(QSGTextEdit::VAlignment alignment)
+{
+    Q_D(QSGTextEdit);
+    if (alignment == d->vAlign)
+        return;
+    d->vAlign = alignment;
+    d->updateDefaultTextOption();
+    updateSize();
+    emit verticalAlignmentChanged(d->vAlign);
+}
+
+QSGTextEdit::WrapMode QSGTextEdit::wrapMode() const
+{
+    Q_D(const QSGTextEdit);
+    return d->wrapMode;
+}
+
+void QSGTextEdit::setWrapMode(WrapMode mode)
+{
+    Q_D(QSGTextEdit);
+    if (mode == d->wrapMode)
+        return;
+    d->wrapMode = mode;
+    d->updateDefaultTextOption();
+    updateSize();
+    emit wrapModeChanged();
+}
+
+int QSGTextEdit::lineCount() const
+{
+    Q_D(const QSGTextEdit);
+    return d->lineCount;
+}
+
+qreal QSGTextEdit::paintedWidth() const
+{
+    Q_D(const QSGTextEdit);
+    return d->paintedSize.width();
+}
+
+qreal QSGTextEdit::paintedHeight() const
+{
+    Q_D(const QSGTextEdit);
+    return d->paintedSize.height();
+}
+
+QRectF QSGTextEdit::positionToRectangle(int pos) const
+{
+    Q_D(const QSGTextEdit);
+    QTextCursor c(d->document);
+    c.setPosition(pos);
+    return d->control->cursorRect(c);
+
+}
+
+int QSGTextEdit::positionAt(int x, int y) const
+{
+    Q_D(const QSGTextEdit);
+    int r = d->document->documentLayout()->hitTest(QPoint(x,y-d->yoff), Qt::FuzzyHit);
+    QTextCursor cursor = d->control->textCursor();
+    if (r > cursor.position()) {
+        // The cursor position includes positions within the preedit text, but only positions in the
+        // same text block are offset so it is possible to get a position that is either part of the
+        // preedit or the next text block.
+        QTextLayout *layout = cursor.block().layout();
+        const int preeditLength = layout
+                ? layout->preeditAreaText().length()
+                : 0;
+        if (preeditLength > 0
+                && d->document->documentLayout()->blockBoundingRect(cursor.block()).contains(x,y-d->yoff)) {
+            r = r > cursor.position() + preeditLength
+                    ? r - preeditLength
+                    : cursor.position();
+        }
+    }
+    return r;
+}
+
+void QSGTextEdit::moveCursorSelection(int pos)
+{
+    //Note that this is the same as setCursorPosition but with the KeepAnchor flag set
+    Q_D(QSGTextEdit);
+    QTextCursor cursor = d->control->textCursor();
+    if (cursor.position() == pos)
+        return;
+    cursor.setPosition(pos, QTextCursor::KeepAnchor);
+    d->control->setTextCursor(cursor);
+}
+
+void QSGTextEdit::moveCursorSelection(int pos, SelectionMode mode)
+{
+    Q_D(QSGTextEdit);
+    QTextCursor cursor = d->control->textCursor();
+    if (cursor.position() == pos)
+        return;
+    if (mode == SelectCharacters) {
+        cursor.setPosition(pos, QTextCursor::KeepAnchor);
+    } else if (cursor.anchor() < pos || (cursor.anchor() == pos && cursor.position() < pos)) {
+        if (cursor.anchor() > cursor.position()) {
+            cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+            cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+            if (cursor.position() == cursor.anchor())
+                cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor);
+            else
+                cursor.setPosition(cursor.position(), QTextCursor::MoveAnchor);
+        } else {
+            cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+            cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
+        }
+
+        cursor.setPosition(pos, QTextCursor::KeepAnchor);
+        cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+        if (cursor.position() != pos)
+            cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+    } else if (cursor.anchor() > pos || (cursor.anchor() == pos && cursor.position() > pos)) {
+        if (cursor.anchor() < cursor.position()) {
+            cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+            cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
+        } else {
+            cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+            cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
+            cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+            if (cursor.position() != cursor.anchor()) {
+                cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+                cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
+            }
+        }
+
+        cursor.setPosition(pos, QTextCursor::KeepAnchor);
+        cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+        if (cursor.position() != pos) {
+            cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
+            cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+        }
+    }
+    d->control->setTextCursor(cursor);
+}
+
+bool QSGTextEdit::isCursorVisible() const
+{
+    Q_D(const QSGTextEdit);
+    return d->cursorVisible;
+}
+
+void QSGTextEdit::setCursorVisible(bool on)
+{
+    Q_D(QSGTextEdit);
+    if (d->cursorVisible == on)
+        return;
+    d->cursorVisible = on;
+    QFocusEvent focusEvent(on ? QEvent::FocusIn : QEvent::FocusOut);
+    if (!on && !d->persistentSelection)
+        d->control->setCursorIsFocusIndicator(true);
+    d->control->processEvent(&focusEvent, QPointF(0, -d->yoff));
+    emit cursorVisibleChanged(d->cursorVisible);
+}
+
+int QSGTextEdit::cursorPosition() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->textCursor().position();
+}
+
+void QSGTextEdit::setCursorPosition(int pos)
+{
+    Q_D(QSGTextEdit);
+    if (pos < 0 || pos > d->text.length())
+        return;
+    QTextCursor cursor = d->control->textCursor();
+    if (cursor.position() == pos && cursor.anchor() == pos)
+        return;
+    cursor.setPosition(pos);
+    d->control->setTextCursor(cursor);
+}
+
+QDeclarativeComponent* QSGTextEdit::cursorDelegate() const
+{
+    Q_D(const QSGTextEdit);
+    return d->cursorComponent;
+}
+
+void QSGTextEdit::setCursorDelegate(QDeclarativeComponent* c)
+{
+    Q_D(QSGTextEdit);
+    if(d->cursorComponent){
+        if(d->cursor){
+            disconnect(d->control, SIGNAL(cursorPositionChanged()),
+                    this, SLOT(moveCursorDelegate()));
+            d->control->setCursorWidth(-1);
+            update(cursorRectangle());
+            delete d->cursor;
+            d->cursor = 0;
+        }
+    }
+    d->cursorComponent = c;
+    if(c && c->isReady()){
+        loadCursorDelegate();
+    }else{
+        if(c)
+            connect(c, SIGNAL(statusChanged()),
+                    this, SLOT(loadCursorDelegate()));
+    }
+
+    emit cursorDelegateChanged();
+}
+
+void QSGTextEdit::loadCursorDelegate()
+{
+    Q_D(QSGTextEdit);
+    if(d->cursorComponent->isLoading())
+        return;
+    d->cursor = qobject_cast<QSGItem*>(d->cursorComponent->create(qmlContext(this)));
+    if(d->cursor){
+        connect(d->control, SIGNAL(cursorPositionChanged()),
+                this, SLOT(moveCursorDelegate()));
+        d->control->setCursorWidth(0);
+        update(cursorRectangle());
+        QDeclarative_setParent_noEvent(d->cursor, this);
+        d->cursor->setParentItem(this);
+        d->cursor->setHeight(QFontMetrics(d->font).height());
+        moveCursorDelegate();
+    }else{
+        qmlInfo(this) << "Error loading cursor delegate.";
+    }
+}
+
+int QSGTextEdit::selectionStart() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->textCursor().selectionStart();
+}
+
+int QSGTextEdit::selectionEnd() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->textCursor().selectionEnd();
+}
+
+QString QSGTextEdit::selectedText() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->textCursor().selectedText();
+}
+
+bool QSGTextEdit::focusOnPress() const
+{
+    Q_D(const QSGTextEdit);
+    return d->focusOnPress;
+}
+
+void QSGTextEdit::setFocusOnPress(bool on)
+{
+    Q_D(QSGTextEdit);
+    if (d->focusOnPress == on)
+        return;
+    d->focusOnPress = on;
+    emit activeFocusOnPressChanged(d->focusOnPress);
+}
+
+bool QSGTextEdit::persistentSelection() const
+{
+    Q_D(const QSGTextEdit);
+    return d->persistentSelection;
+}
+
+void QSGTextEdit::setPersistentSelection(bool on)
+{
+    Q_D(QSGTextEdit);
+    if (d->persistentSelection == on)
+        return;
+    d->persistentSelection = on;
+    emit persistentSelectionChanged(d->persistentSelection);
+}
+
+qreal QSGTextEdit::textMargin() const
+{
+    Q_D(const QSGTextEdit);
+    return d->textMargin;
+}
+
+void QSGTextEdit::setTextMargin(qreal margin)
+{
+    Q_D(QSGTextEdit);
+    if (d->textMargin == margin)
+        return;
+    d->textMargin = margin;
+    d->document->setDocumentMargin(d->textMargin);
+    emit textMarginChanged(d->textMargin);
+}
+
+void QSGTextEdit::geometryChanged(const QRectF &newGeometry,
+                                  const QRectF &oldGeometry)
+{
+    if (newGeometry.width() != oldGeometry.width())
+        updateSize();
+    QSGPaintedItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+void QSGTextEdit::componentComplete()
+{
+    Q_D(QSGTextEdit);
+    QSGPaintedItem::componentComplete();
+    if (d->dirty) {
+        d->determineHorizontalAlignment();
+        d->updateDefaultTextOption();
+        updateSize();
+        d->dirty = false;
+    }
+}
+
+bool QSGTextEdit::selectByMouse() const
+{
+    Q_D(const QSGTextEdit);
+    return d->selectByMouse;
+}
+
+void QSGTextEdit::setSelectByMouse(bool on)
+{
+    Q_D(QSGTextEdit);
+    if (d->selectByMouse != on) {
+        d->selectByMouse = on;
+        setKeepMouseGrab(on);
+        if (on)
+            setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByMouse);
+        else
+            setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByMouse);
+        emit selectByMouseChanged(on);
+    }
+}
+
+QSGTextEdit::SelectionMode QSGTextEdit::mouseSelectionMode() const
+{
+    Q_D(const QSGTextEdit);
+    return d->mouseSelectionMode;
+}
+
+void QSGTextEdit::setMouseSelectionMode(SelectionMode mode)
+{
+    Q_D(QSGTextEdit);
+    if (d->mouseSelectionMode != mode) {
+        d->mouseSelectionMode = mode;
+        d->control->setWordSelectionEnabled(mode == SelectWords);
+        emit mouseSelectionModeChanged(mode);
+    }
+}
+
+void QSGTextEdit::setReadOnly(bool r)
+{
+    Q_D(QSGTextEdit);
+    if (r == isReadOnly())
+        return;
+
+    setFlag(QSGItem::ItemAcceptsInputMethod, !r);
+    Qt::TextInteractionFlags flags = Qt::LinksAccessibleByMouse;
+    if (d->selectByMouse)
+        flags = flags | Qt::TextSelectableByMouse;
+    if (!r)
+        flags = flags | Qt::TextSelectableByKeyboard | Qt::TextEditable;
+    d->control->setTextInteractionFlags(flags);
+    if (!r)
+        d->control->moveCursor(QTextCursor::End);
+
+    emit readOnlyChanged(r);
+}
+
+bool QSGTextEdit::isReadOnly() const
+{
+    Q_D(const QSGTextEdit);
+    return !(d->control->textInteractionFlags() & Qt::TextEditable);
+}
+
+void QSGTextEdit::setTextInteractionFlags(Qt::TextInteractionFlags flags)
+{
+    Q_D(QSGTextEdit);
+    d->control->setTextInteractionFlags(flags);
+}
+
+Qt::TextInteractionFlags QSGTextEdit::textInteractionFlags() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->textInteractionFlags();
+}
+
+QRect QSGTextEdit::cursorRectangle() const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->cursorRect().toRect().translated(0,-d->yoff);
+}
+
+bool QSGTextEdit::event(QEvent *event)
+{
+    Q_D(QSGTextEdit);
+    if (event->type() == QEvent::ShortcutOverride) {
+        d->control->processEvent(event, QPointF(0, -d->yoff));
+        return event->isAccepted();
+    }
+    return QSGPaintedItem::event(event);
+}
+
+/*!
+\overload
+Handles the given key \a event.
+*/
+void QSGTextEdit::keyPressEvent(QKeyEvent *event)
+{
+    Q_D(QSGTextEdit);
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!event->isAccepted())
+        QSGPaintedItem::keyPressEvent(event);
+}
+
+/*!
+\overload
+Handles the given key \a event.
+*/
+void QSGTextEdit::keyReleaseEvent(QKeyEvent *event)
+{
+    Q_D(QSGTextEdit);
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!event->isAccepted())
+        QSGPaintedItem::keyReleaseEvent(event);
+}
+
+void QSGTextEdit::deselect()
+{
+    Q_D(QSGTextEdit);
+    QTextCursor c = d->control->textCursor();
+    c.clearSelection();
+    d->control->setTextCursor(c);
+}
+
+void QSGTextEdit::selectAll()
+{
+    Q_D(QSGTextEdit);
+    d->control->selectAll();
+}
+
+void QSGTextEdit::selectWord()
+{
+    Q_D(QSGTextEdit);
+    QTextCursor c = d->control->textCursor();
+    c.select(QTextCursor::WordUnderCursor);
+    d->control->setTextCursor(c);
+}
+
+void QSGTextEdit::select(int start, int end)
+{
+    Q_D(QSGTextEdit);
+    if (start < 0 || end < 0 || start > d->text.length() || end > d->text.length())
+        return;
+    QTextCursor cursor = d->control->textCursor();
+    cursor.beginEditBlock();
+    cursor.setPosition(start, QTextCursor::MoveAnchor);
+    cursor.setPosition(end, QTextCursor::KeepAnchor);
+    cursor.endEditBlock();
+    d->control->setTextCursor(cursor);
+
+    // QTBUG-11100
+    updateSelectionMarkers();
+}
+
+bool QSGTextEdit::isRightToLeft(int start, int end)
+{
+    Q_D(QSGTextEdit);
+    if (start > end) {
+        qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start.";
+        return false;
+    } else {
+        return d->text.mid(start, end - start).isRightToLeft();
+    }
+}
+
+#ifndef QT_NO_CLIPBOARD
+void QSGTextEdit::cut()
+{
+    Q_D(QSGTextEdit);
+    d->control->cut();
+}
+
+void QSGTextEdit::copy()
+{
+    Q_D(QSGTextEdit);
+    d->control->copy();
+}
+
+void QSGTextEdit::paste()
+{
+    Q_D(QSGTextEdit);
+    d->control->paste();
+}
+#endif // QT_NO_CLIPBOARD
+
+/*!
+\overload
+Handles the given mouse \a event.
+*/
+void QSGTextEdit::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextEdit);
+    if (d->focusOnPress){
+        bool hadActiveFocus = hasActiveFocus();
+        forceActiveFocus();
+        if (d->showInputPanelOnFocus) {
+            if (hasActiveFocus() && hadActiveFocus && !isReadOnly()) {
+                // re-open input panel on press if already focused
+                openSoftwareInputPanel();
+            }
+        } else { // show input panel on click
+            if (hasActiveFocus() && !hadActiveFocus) {
+                d->clickCausedFocus = true;
+            }
+        }
+    }
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!event->isAccepted())
+        QSGPaintedItem::mousePressEvent(event);
+}
+
+/*!
+\overload
+Handles the given mouse \a event.
+*/
+void QSGTextEdit::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextEdit);
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!d->showInputPanelOnFocus) { // input panel on click
+        if (d->focusOnPress && !isReadOnly() && boundingRect().contains(event->pos())) {
+            if (canvas() && canvas() == qApp->focusWidget()) {
+                qt_widget_private(canvas())->handleSoftwareInputPanel(event->button(), d->clickCausedFocus);
+            }
+        }
+    }
+    d->clickCausedFocus = false;
+
+    if (!event->isAccepted())
+        QSGPaintedItem::mouseReleaseEvent(event);
+}
+
+/*!
+\overload
+Handles the given mouse \a event.
+*/
+void QSGTextEdit::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextEdit);
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!event->isAccepted())
+        QSGPaintedItem::mouseDoubleClickEvent(event);
+}
+
+/*!
+\overload
+Handles the given mouse \a event.
+*/
+void QSGTextEdit::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextEdit);
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (!event->isAccepted())
+        QSGPaintedItem::mouseMoveEvent(event);
+}
+
+/*!
+\overload
+Handles the given input method \a event.
+*/
+void QSGTextEdit::inputMethodEvent(QInputMethodEvent *event)
+{
+    Q_D(QSGTextEdit);
+    const bool wasComposing = isInputMethodComposing();
+    d->control->processEvent(event, QPointF(0, -d->yoff));
+    if (wasComposing != isInputMethodComposing())
+        emit inputMethodComposingChanged();
+}
+
+void QSGTextEdit::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    Q_D(QSGTextEdit);
+    if (change == ItemActiveFocusHasChanged) {
+        setCursorVisible(value.boolValue && d->canvas && d->canvas->hasFocus());
+    }
+    QSGItem::itemChange(change, value);
+}
+
+/*!
+\overload
+Returns the value of the given \a property.
+*/
+QVariant QSGTextEdit::inputMethodQuery(Qt::InputMethodQuery property) const
+{
+    Q_D(const QSGTextEdit);
+    return d->control->inputMethodQuery(property);
+}
+
+/*!
+Draws the contents of the text edit using the given \a painter within
+the given \a bounds.
+*/
+void QSGTextEdit::paint(QPainter *painter)
+{
+    // XXX todo
+    QRect bounds(0, 0, width(), height());
+    Q_D(QSGTextEdit);
+
+    painter->setRenderHint(QPainter::TextAntialiasing, true);
+    painter->translate(0,d->yoff);
+
+    d->control->drawContents(painter, bounds.translated(0,-d->yoff));
+
+    painter->translate(0,-d->yoff);
+}
+
+void QSGTextEdit::updateImgCache(const QRectF &rf)
+{
+    Q_D(const QSGTextEdit);
+    QRect r;
+    if (!rf.isValid()) {
+        r = QRect(0,0,INT_MAX,INT_MAX);
+    } else {
+        r = rf.toRect();
+        if (r.height() > INT_MAX/2) {
+            // Take care of overflow when translating "everything"
+            r.setTop(r.y() + d->yoff);
+            r.setBottom(INT_MAX/2);
+        } else {
+            r = r.translated(0,d->yoff);
+        }
+    }
+    update(r);
+}
+
+bool QSGTextEdit::canPaste() const
+{
+    Q_D(const QSGTextEdit);
+    return d->canPaste;
+}
+
+bool QSGTextEdit::isInputMethodComposing() const
+{
+    Q_D(const QSGTextEdit);
+    if (QTextLayout *layout = d->control->textCursor().block().layout())
+        return layout->preeditAreaText().length() > 0;
+    return false;
+}
+
+void QSGTextEditPrivate::init()
+{
+    Q_Q(QSGTextEdit);
+
+    q->setSmooth(smooth);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFlag(QSGItem::ItemAcceptsInputMethod);
+
+    control = new QTextControl(q);
+    control->setIgnoreUnusedNavigationEvents(true);
+    control->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard | Qt::TextEditable);
+    control->setDragEnabled(false);
+
+    // QTextControl follows the default text color
+    // defined by the platform, declarative text
+    // should be black by default
+    QPalette pal = control->palette();
+    if (pal.color(QPalette::Text) != color) {
+        pal.setColor(QPalette::Text, color);
+        control->setPalette(pal);
+    }
+
+    QObject::connect(control, SIGNAL(updateRequest(QRectF)), q, SLOT(updateImgCache(QRectF)));
+
+    QObject::connect(control, SIGNAL(textChanged()), q, SLOT(q_textChanged()));
+    QObject::connect(control, SIGNAL(selectionChanged()), q, SIGNAL(selectionChanged()));
+    QObject::connect(control, SIGNAL(selectionChanged()), q, SLOT(updateSelectionMarkers()));
+    QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SLOT(updateSelectionMarkers()));
+    QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorPositionChanged()));
+    QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorRectangleChanged()));
+    QObject::connect(control, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString)));
+#ifndef QT_NO_CLIPBOARD
+    QObject::connect(q, SIGNAL(readOnlyChanged(bool)), q, SLOT(q_canPasteChanged()));
+    QObject::connect(QApplication::clipboard(), SIGNAL(dataChanged()), q, SLOT(q_canPasteChanged()));
+    canPaste = control->canPaste();
+#endif
+
+    document = control->document();
+    document->setDefaultFont(font);
+    document->setDocumentMargin(textMargin);
+    document->setUndoRedoEnabled(false); // flush undo buffer.
+    document->setUndoRedoEnabled(true);
+    updateDefaultTextOption();
+}
+
+void QSGTextEdit::q_textChanged()
+{
+    Q_D(QSGTextEdit);
+    d->text = text();
+    d->rightToLeftText = d->document->begin().layout()->engine()->isRightToLeft();
+    d->determineHorizontalAlignment();
+    d->updateDefaultTextOption();
+    updateSize();
+    updateTotalLines();
+    updateMicroFocus();
+    emit textChanged(d->text);
+}
+
+void QSGTextEdit::moveCursorDelegate()
+{
+    Q_D(QSGTextEdit);
+    if(!d->cursor)
+        return;
+    QRectF cursorRect = d->control->cursorRect();
+    d->cursor->setX(cursorRect.x());
+    d->cursor->setY(cursorRect.y());
+}
+
+void QSGTextEditPrivate::updateSelection()
+{
+    Q_Q(QSGTextEdit);
+    QTextCursor cursor = control->textCursor();
+    bool startChange = (lastSelectionStart != cursor.selectionStart());
+    bool endChange = (lastSelectionEnd != cursor.selectionEnd());
+    cursor.beginEditBlock();
+    cursor.setPosition(lastSelectionStart, QTextCursor::MoveAnchor);
+    cursor.setPosition(lastSelectionEnd, QTextCursor::KeepAnchor);
+    cursor.endEditBlock();
+    control->setTextCursor(cursor);
+    if(startChange)
+        q->selectionStartChanged();
+    if(endChange)
+        q->selectionEndChanged();
+}
+
+void QSGTextEdit::updateSelectionMarkers()
+{
+    Q_D(QSGTextEdit);
+    if(d->lastSelectionStart != d->control->textCursor().selectionStart()){
+        d->lastSelectionStart = d->control->textCursor().selectionStart();
+        emit selectionStartChanged();
+    }
+    if(d->lastSelectionEnd != d->control->textCursor().selectionEnd()){
+        d->lastSelectionEnd = d->control->textCursor().selectionEnd();
+        emit selectionEndChanged();
+    }
+    updateMicroFocus();
+}
+
+QRectF QSGTextEdit::boundingRect() const
+{
+    Q_D(const QSGTextEdit);
+    QRectF r = QSGPaintedItem::boundingRect();
+    int cursorWidth = 1;
+    if(d->cursor)
+        cursorWidth = d->cursor->width();
+    if(!d->document->isEmpty())
+        cursorWidth += 3;// ### Need a better way of accounting for space between char and cursor
+
+    // Could include font max left/right bearings to either side of rectangle.
+
+    r.setRight(r.right() + cursorWidth);
+    return r.translated(0,d->yoff);
+}
+
+qreal QSGTextEditPrivate::getImplicitWidth() const
+{
+    Q_Q(const QSGTextEdit);
+    if (!requireImplicitWidth) {
+        // We don't calculate implicitWidth unless it is required.
+        // We need to force a size update now to ensure implicitWidth is calculated
+        const_cast<QSGTextEditPrivate*>(this)->requireImplicitWidth = true;
+        const_cast<QSGTextEdit*>(q)->updateSize();
+    }
+    return implicitWidth;
+}
+
+//### we should perhaps be a bit smarter here -- depending on what has changed, we shouldn't
+//    need to do all the calculations each time
+void QSGTextEdit::updateSize()
+{
+    Q_D(QSGTextEdit);
+    if (isComponentComplete()) {
+        qreal naturalWidth = d->implicitWidth;
+        // ### assumes that if the width is set, the text will fill to edges
+        // ### (unless wrap is false, then clipping will occur)
+        if (widthValid()) {
+            if (!d->requireImplicitWidth) {
+                emit implicitWidthChanged();
+                // if the implicitWidth is used, then updateSize() has already been called (recursively)
+                if (d->requireImplicitWidth)
+                    return;
+            }
+            if (d->requireImplicitWidth) {
+                d->document->setTextWidth(-1);
+                naturalWidth = d->document->idealWidth();
+            }
+            if (d->document->textWidth() != width())
+                d->document->setTextWidth(width());
+        } else {
+            d->document->setTextWidth(-1);
+        }
+        QFontMetrics fm = QFontMetrics(d->font);
+        int dy = height();
+        dy -= (int)d->document->size().height();
+
+        int nyoff;
+        if (heightValid()) {
+            if (d->vAlign == AlignBottom)
+                nyoff = dy;
+            else if (d->vAlign == AlignVCenter)
+                nyoff = dy/2;
+            else
+                nyoff = 0;
+        } else {
+            nyoff = 0;
+        }
+        if (nyoff != d->yoff) 
+            d->yoff = nyoff;
+        setBaselineOffset(fm.ascent() + d->yoff + d->textMargin);
+
+        //### need to comfirm cost of always setting these
+        int newWidth = qCeil(d->document->idealWidth());
+        if (!widthValid() && d->document->textWidth() != newWidth)
+            d->document->setTextWidth(newWidth); // ### Text does not align if width is not set (QTextDoc bug)
+        // ### Setting the implicitWidth triggers another updateSize(), and unless there are bindings nothing has changed.
+        if (!widthValid())
+            setImplicitWidth(newWidth);
+        else if (d->requireImplicitWidth)
+            setImplicitWidth(naturalWidth);
+        qreal newHeight = d->document->isEmpty() ? fm.height() : (int)d->document->size().height();
+        setImplicitHeight(newHeight);
+
+        d->paintedSize = QSize(newWidth, newHeight);
+        setContentsSize(d->paintedSize);
+        emit paintedSizeChanged();
+    } else {
+        d->dirty = true;
+    }
+    update();
+}
+
+void QSGTextEdit::updateTotalLines()
+{
+    Q_D(QSGTextEdit);
+
+    int subLines = 0;
+
+    for (QTextBlock it = d->document->begin(); it != d->document->end(); it = it.next()) {
+        QTextLayout *layout = it.layout();
+        if (!layout)
+            continue;
+        subLines += layout->lineCount()-1;
+    }
+
+    int newTotalLines = d->document->lineCount() + subLines;
+    if (d->lineCount != newTotalLines) {
+        d->lineCount = newTotalLines;
+        emit lineCountChanged();
+    }
+}
+
+void QSGTextEditPrivate::updateDefaultTextOption()
+{
+    Q_Q(QSGTextEdit);
+    QTextOption opt = document->defaultTextOption();
+    int oldAlignment = opt.alignment();
+
+    QSGTextEdit::HAlignment horizontalAlignment = q->effectiveHAlign();
+    if (rightToLeftText) {
+        if (horizontalAlignment == QSGTextEdit::AlignLeft)
+            horizontalAlignment = QSGTextEdit::AlignRight;
+        else if (horizontalAlignment == QSGTextEdit::AlignRight)
+            horizontalAlignment = QSGTextEdit::AlignLeft;
+    }
+    opt.setAlignment((Qt::Alignment)(int)(horizontalAlignment | vAlign));
+
+    QTextOption::WrapMode oldWrapMode = opt.wrapMode();
+    opt.setWrapMode(QTextOption::WrapMode(wrapMode));
+
+    if (oldWrapMode == opt.wrapMode() && oldAlignment == opt.alignment())
+        return;
+    document->setDefaultTextOption(opt);
+}
+
+
+void QSGTextEdit::openSoftwareInputPanel()
+{
+    if (qApp) {
+        if (canvas() && canvas() == qApp->focusWidget()) {
+            QEvent event(QEvent::RequestSoftwareInputPanel);
+            QApplication::sendEvent(canvas(), &event);
+        }
+    }
+}
+
+void QSGTextEdit::closeSoftwareInputPanel()
+{
+    if (qApp) {
+        if (canvas() && canvas() == qApp->focusWidget()) {
+            QEvent event(QEvent::CloseSoftwareInputPanel);
+            QApplication::sendEvent(canvas(), &event);
+        }
+    }
+}
+
+void QSGTextEdit::focusInEvent(QFocusEvent *event)
+{
+    Q_D(const QSGTextEdit);
+    if (d->showInputPanelOnFocus) {
+        if (d->focusOnPress && !isReadOnly()) {
+            openSoftwareInputPanel();
+        }
+    }
+    QSGPaintedItem::focusInEvent(event);
+}
+
+void QSGTextEdit::q_canPasteChanged()
+{
+    Q_D(QSGTextEdit);
+    bool old = d->canPaste;
+    d->canPaste = d->control->canPaste();
+    if(old!=d->canPaste)
+        emit canPasteChanged();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgtextedit_p.h b/src/declarative/items/qsgtextedit_p.h
new file mode 100644
index 0000000000..547ead18e9
--- /dev/null
+++ b/src/declarative/items/qsgtextedit_p.h
@@ -0,0 +1,303 @@
+// Commit: 27e4302b7f45f22180693d26747f419177c81e27
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTEDIT_P_H
+#define QSGTEXTEDIT_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+
+#include <QtGui/qtextoption.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGTextEditPrivate;
+class Q_AUTOTEST_EXPORT QSGTextEdit : public QSGImplicitSizePaintedItem
+{
+    Q_OBJECT
+    Q_ENUMS(VAlignment)
+    Q_ENUMS(HAlignment)
+    Q_ENUMS(TextFormat)
+    Q_ENUMS(WrapMode)
+    Q_ENUMS(SelectionMode)
+
+    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+    Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged)
+    Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged)
+    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
+    Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
+    Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged)
+    Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
+    Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
+    Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged)
+    Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
+    Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
+    Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
+    Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
+    Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged)
+    Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
+    Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
+    Q_PROPERTY(QDeclarativeComponent* cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged)
+    Q_PROPERTY(int selectionStart READ selectionStart NOTIFY selectionStartChanged)
+    Q_PROPERTY(int selectionEnd READ selectionEnd NOTIFY selectionEndChanged)
+    Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectionChanged)
+    Q_PROPERTY(bool activeFocusOnPress READ focusOnPress WRITE setFocusOnPress NOTIFY activeFocusOnPressChanged)
+    Q_PROPERTY(bool persistentSelection READ persistentSelection WRITE setPersistentSelection NOTIFY persistentSelectionChanged)
+    Q_PROPERTY(qreal textMargin READ textMargin WRITE setTextMargin NOTIFY textMarginChanged)
+    Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ inputMethodHints WRITE setInputMethodHints)
+    Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
+    Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged)
+    Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged)
+    Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged)
+
+public:
+    QSGTextEdit(QSGItem *parent=0);
+
+    enum HAlignment {
+        AlignLeft = Qt::AlignLeft,
+        AlignRight = Qt::AlignRight,
+        AlignHCenter = Qt::AlignHCenter,
+        AlignJustify = Qt::AlignJustify
+    };
+
+    enum VAlignment {
+        AlignTop = Qt::AlignTop,
+        AlignBottom = Qt::AlignBottom,
+        AlignVCenter = Qt::AlignVCenter
+    };
+
+    enum TextFormat {
+        PlainText = Qt::PlainText,
+        RichText = Qt::RichText,
+        AutoText = Qt::AutoText
+    };
+
+    enum WrapMode { NoWrap = QTextOption::NoWrap,
+                    WordWrap = QTextOption::WordWrap,
+                    WrapAnywhere = QTextOption::WrapAnywhere,
+                    WrapAtWordBoundaryOrAnywhere = QTextOption::WrapAtWordBoundaryOrAnywhere, // COMPAT
+                    Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
+                  };
+
+    enum SelectionMode {
+        SelectCharacters,
+        SelectWords
+    };
+
+    Q_INVOKABLE void openSoftwareInputPanel();
+    Q_INVOKABLE void closeSoftwareInputPanel();
+
+    QString text() const;
+    void setText(const QString &);
+
+    TextFormat textFormat() const;
+    void setTextFormat(TextFormat format);
+
+    QFont font() const;
+    void setFont(const QFont &font);
+
+    QColor color() const;
+    void setColor(const QColor &c);
+
+    QColor selectionColor() const;
+    void setSelectionColor(const QColor &c);
+
+    QColor selectedTextColor() const;
+    void setSelectedTextColor(const QColor &c);
+
+    HAlignment hAlign() const;
+    void setHAlign(HAlignment align);
+    void resetHAlign();
+    HAlignment effectiveHAlign() const;
+
+    VAlignment vAlign() const;
+    void setVAlign(VAlignment align);
+
+    WrapMode wrapMode() const;
+    void setWrapMode(WrapMode w);
+
+    int lineCount() const;
+
+    bool isCursorVisible() const;
+    void setCursorVisible(bool on);
+
+    int cursorPosition() const;
+    void setCursorPosition(int pos);
+
+    QDeclarativeComponent* cursorDelegate() const;
+    void setCursorDelegate(QDeclarativeComponent*);
+
+    int selectionStart() const;
+    int selectionEnd() const;
+
+    QString selectedText() const;
+
+    bool focusOnPress() const;
+    void setFocusOnPress(bool on);
+
+    bool persistentSelection() const;
+    void setPersistentSelection(bool on);
+
+    qreal textMargin() const;
+    void setTextMargin(qreal margin);
+
+    bool selectByMouse() const;
+    void setSelectByMouse(bool);
+
+    SelectionMode mouseSelectionMode() const;
+    void setMouseSelectionMode(SelectionMode mode);
+
+    bool canPaste() const;
+
+    virtual void componentComplete();
+
+    /* FROM EDIT */
+    void setReadOnly(bool);
+    bool isReadOnly() const;
+
+    void setTextInteractionFlags(Qt::TextInteractionFlags flags);
+    Qt::TextInteractionFlags textInteractionFlags() const;
+
+    QRect cursorRectangle() const;
+
+    QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
+
+    qreal paintedWidth() const;
+    qreal paintedHeight() const;
+
+    Q_INVOKABLE QRectF positionToRectangle(int) const;
+    Q_INVOKABLE int positionAt(int x, int y) const;
+    Q_INVOKABLE void moveCursorSelection(int pos);
+    Q_INVOKABLE void moveCursorSelection(int pos, SelectionMode mode);
+
+    QRectF boundingRect() const;
+
+    bool isInputMethodComposing() const;
+
+Q_SIGNALS:
+    void textChanged(const QString &);
+    void paintedSizeChanged();
+    void cursorPositionChanged();
+    void cursorRectangleChanged();
+    void selectionStartChanged();
+    void selectionEndChanged();
+    void selectionChanged();
+    void colorChanged(const QColor &color);
+    void selectionColorChanged(const QColor &color);
+    void selectedTextColorChanged(const QColor &color);
+    void fontChanged(const QFont &font);
+    void horizontalAlignmentChanged(HAlignment alignment);
+    void verticalAlignmentChanged(VAlignment alignment);
+    void wrapModeChanged();
+    void lineCountChanged();
+    void textFormatChanged(TextFormat textFormat);
+    void readOnlyChanged(bool isReadOnly);
+    void cursorVisibleChanged(bool isCursorVisible);
+    void cursorDelegateChanged();
+    void activeFocusOnPressChanged(bool activeFocusOnPressed);
+    void persistentSelectionChanged(bool isPersistentSelection);
+    void textMarginChanged(qreal textMargin);
+    void selectByMouseChanged(bool selectByMouse);
+    void mouseSelectionModeChanged(SelectionMode mode);
+    void linkActivated(const QString &link);
+    void canPasteChanged();
+    void inputMethodComposingChanged();
+    void effectiveHorizontalAlignmentChanged();
+
+public Q_SLOTS:
+    void selectAll();
+    void selectWord();
+    void select(int start, int end);
+    void deselect();
+    bool isRightToLeft(int start, int end);
+#ifndef QT_NO_CLIPBOARD
+    void cut();
+    void copy();
+    void paste();
+#endif
+
+private Q_SLOTS:
+    void updateImgCache(const QRectF &rect);
+    void q_textChanged();
+    void updateSelectionMarkers();
+    void moveCursorDelegate();
+    void loadCursorDelegate();
+    void q_canPasteChanged();
+
+private:
+    void updateSize();
+    void updateTotalLines();
+
+protected:
+    virtual void geometryChanged(const QRectF &newGeometry, 
+                                 const QRectF &oldGeometry);
+
+    bool event(QEvent *);
+    void keyPressEvent(QKeyEvent *);
+    void keyReleaseEvent(QKeyEvent *);
+    void focusInEvent(QFocusEvent *event);
+
+    // mouse filter?
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void inputMethodEvent(QInputMethodEvent *e);
+    virtual void itemChange(ItemChange, const ItemChangeData &);
+
+    void paint(QPainter *);
+private:
+    Q_DISABLE_COPY(QSGTextEdit)
+    Q_DECLARE_PRIVATE(QSGTextEdit)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGTextEdit)
+
+QT_END_HEADER
+
+#endif // QSGTEXTEDIT_P_H
diff --git a/src/declarative/items/qsgtextedit_p_p.h b/src/declarative/items/qsgtextedit_p_p.h
new file mode 100644
index 0000000000..63f4bbc341
--- /dev/null
+++ b/src/declarative/items/qsgtextedit_p_p.h
@@ -0,0 +1,143 @@
+// Commit: 27e4302b7f45f22180693d26747f419177c81e27
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTEDIT_P_P_H
+#define QSGTEXTEDIT_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsgtextedit_p.h"
+#include "qsgimplicitsizeitem_p_p.h"
+
+#include <QtDeclarative/qdeclarative.h>
+
+QT_BEGIN_NAMESPACE
+class QTextLayout;
+class QTextDocument;
+class QTextControl;
+class QSGTextEditPrivate : public QSGImplicitSizePaintedItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGTextEdit)
+
+public:
+    QSGTextEditPrivate()
+      : color("black"), hAlign(QSGTextEdit::AlignLeft), vAlign(QSGTextEdit::AlignTop),
+      imgDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true),
+      showInputPanelOnFocus(true), clickCausedFocus(false), persistentSelection(true),
+      requireImplicitWidth(false), selectByMouse(false), canPaste(false),
+      hAlignImplicit(true), rightToLeftText(false),
+      textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0),
+      format(QSGTextEdit::AutoText), document(0), wrapMode(QSGTextEdit::NoWrap),
+      mouseSelectionMode(QSGTextEdit::SelectCharacters),
+      yoff(0)
+    {
+#ifdef Q_OS_SYMBIAN
+        if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
+            showInputPanelOnFocus = false;
+        }
+#endif
+    }
+
+    void init();
+
+    void updateDefaultTextOption();
+    void relayoutDocument();
+    void updateSelection();
+    bool determineHorizontalAlignment();
+    bool setHAlign(QSGTextEdit::HAlignment, bool forceAlign = false);
+    void mirrorChange();
+    qreal getImplicitWidth() const;
+
+    QString text;
+    QFont font;
+    QFont sourceFont;
+    QColor  color;
+    QColor  selectionColor;
+    QColor  selectedTextColor;
+    QString style;
+    QColor  styleColor;
+    QPixmap imgCache;
+    QPixmap imgStyleCache;
+    QSGTextEdit::HAlignment hAlign;
+    QSGTextEdit::VAlignment vAlign;
+
+    bool imgDirty : 1;
+    bool dirty : 1;
+    bool richText : 1;
+    bool cursorVisible : 1;
+    bool focusOnPress : 1;
+    bool showInputPanelOnFocus : 1;
+    bool clickCausedFocus : 1;
+    bool persistentSelection : 1;
+    bool requireImplicitWidth:1;
+    bool selectByMouse:1;
+    bool canPaste:1;
+    bool hAlignImplicit:1;
+    bool rightToLeftText:1;
+
+    qreal textMargin;
+    int lastSelectionStart;
+    int lastSelectionEnd;
+    QDeclarativeComponent* cursorComponent;
+    QSGItem* cursor;
+    QSGTextEdit::TextFormat format;
+    QTextDocument *document;
+    QTextControl *control;
+    QSGTextEdit::WrapMode wrapMode;
+    QSGTextEdit::SelectionMode mouseSelectionMode;
+    int lineCount;
+    int yoff;
+    QSize paintedSize;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGTEXTEDIT_P_P_H
diff --git a/src/declarative/items/qsgtextinput.cpp b/src/declarative/items/qsgtextinput.cpp
new file mode 100644
index 0000000000..9631b3bafb
--- /dev/null
+++ b/src/declarative/items/qsgtextinput.cpp
@@ -0,0 +1,1265 @@
+// Commit: b94176e69efc3948696c6774d5a228fc753b5b29
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtextinput_p.h"
+#include "qsgtextinput_p_p.h"
+#include "qsgcanvas.h"
+
+#include <private/qdeclarativeglobal_p.h>
+#include <private/qwidget_p.h>
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtGui/qgraphicssceneevent.h>
+#include <QtGui/qinputcontext.h>
+#include <QTextBoundaryFinder>
+#include <qstyle.h>
+
+QT_BEGIN_NAMESPACE
+
+QWidgetPrivate *qt_widget_private(QWidget *widget);
+
+QSGTextInput::QSGTextInput(QSGItem* parent)
+: QSGImplicitSizePaintedItem(*(new QSGTextInputPrivate), parent)
+{
+    Q_D(QSGTextInput);
+    d->init();
+}
+
+QSGTextInput::~QSGTextInput()
+{
+}
+
+QString QSGTextInput::text() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->text();
+}
+
+void QSGTextInput::setText(const QString &s)
+{
+    Q_D(QSGTextInput);
+    if(s == text())
+        return;
+    d->control->setText(s);
+}
+
+QFont QSGTextInput::font() const
+{
+    Q_D(const QSGTextInput);
+    return d->sourceFont;
+}
+
+void QSGTextInput::setFont(const QFont &font)
+{
+    Q_D(QSGTextInput);
+    if (d->sourceFont == font)
+        return;
+
+    d->sourceFont = font;
+    QFont oldFont = d->font;
+    d->font = font;
+    if (d->font.pointSizeF() != -1) {
+        // 0.5pt resolution
+        qreal size = qRound(d->font.pointSizeF()*2.0);
+        d->font.setPointSizeF(size/2.0);
+    }
+    if (oldFont != d->font) {
+        d->control->setFont(d->font);
+        if(d->cursorItem){
+            d->cursorItem->setHeight(QFontMetrics(d->font).height());
+            moveCursor();
+        }
+        updateSize();
+    }
+    emit fontChanged(d->sourceFont);
+}
+
+QColor QSGTextInput::color() const
+{
+    Q_D(const QSGTextInput);
+    return d->color;
+}
+
+void QSGTextInput::setColor(const QColor &c)
+{
+    Q_D(QSGTextInput);
+    if (c != d->color) {
+        d->color = c;
+        update();
+        emit colorChanged(c);
+    }
+}
+
+QColor QSGTextInput::selectionColor() const
+{
+    Q_D(const QSGTextInput);
+    return d->selectionColor;
+}
+
+void QSGTextInput::setSelectionColor(const QColor &color)
+{
+    Q_D(QSGTextInput);
+    if (d->selectionColor == color)
+        return;
+
+    d->selectionColor = color;
+    QPalette p = d->control->palette();
+    p.setColor(QPalette::Highlight, d->selectionColor);
+    d->control->setPalette(p);
+    if (d->control->hasSelectedText()) 
+        update();
+    emit selectionColorChanged(color);
+}
+
+QColor QSGTextInput::selectedTextColor() const
+{
+    Q_D(const QSGTextInput);
+    return d->selectedTextColor;
+}
+
+void QSGTextInput::setSelectedTextColor(const QColor &color)
+{
+    Q_D(QSGTextInput);
+    if (d->selectedTextColor == color)
+        return;
+
+    d->selectedTextColor = color;
+    QPalette p = d->control->palette();
+    p.setColor(QPalette::HighlightedText, d->selectedTextColor);
+    d->control->setPalette(p);
+    if (d->control->hasSelectedText()) 
+        update();
+    emit selectedTextColorChanged(color);
+}
+
+QSGTextInput::HAlignment QSGTextInput::hAlign() const
+{
+    Q_D(const QSGTextInput);
+    return d->hAlign;
+}
+
+void QSGTextInput::setHAlign(HAlignment align)
+{
+    Q_D(QSGTextInput);
+    bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
+    d->hAlignImplicit = false;
+    if (d->setHAlign(align, forceAlign) && isComponentComplete()) {
+        updateRect();
+        d->updateHorizontalScroll();
+    }
+}
+
+void QSGTextInput::resetHAlign()
+{
+    Q_D(QSGTextInput);
+    d->hAlignImplicit = true;
+    if (d->determineHorizontalAlignment() && isComponentComplete()) {
+        updateRect();
+        d->updateHorizontalScroll();
+    }
+}
+
+QSGTextInput::HAlignment QSGTextInput::effectiveHAlign() const
+{
+    Q_D(const QSGTextInput);
+    QSGTextInput::HAlignment effectiveAlignment = d->hAlign;
+    if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
+        switch (d->hAlign) {
+        case QSGTextInput::AlignLeft:
+            effectiveAlignment = QSGTextInput::AlignRight;
+            break;
+        case QSGTextInput::AlignRight:
+            effectiveAlignment = QSGTextInput::AlignLeft;
+            break;
+        default:
+            break;
+        }
+    }
+    return effectiveAlignment;
+}
+
+bool QSGTextInputPrivate::setHAlign(QSGTextInput::HAlignment alignment, bool forceAlign)
+{
+    Q_Q(QSGTextInput);
+    if ((hAlign != alignment || forceAlign) && alignment <= QSGTextInput::AlignHCenter) { // justify not supported
+        QSGTextInput::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
+        hAlign = alignment;
+        emit q->horizontalAlignmentChanged(alignment);
+        if (oldEffectiveHAlign != q->effectiveHAlign())
+            emit q->effectiveHorizontalAlignmentChanged();
+        return true;
+    }
+    return false;
+}
+
+bool QSGTextInputPrivate::determineHorizontalAlignment()
+{
+    if (hAlignImplicit) {
+        // if no explicit alignment has been set, follow the natural layout direction of the text
+        QString text = control->text();
+        bool isRightToLeft = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : text.isRightToLeft();
+        return setHAlign(isRightToLeft ? QSGTextInput::AlignRight : QSGTextInput::AlignLeft);
+    }
+    return false;
+}
+
+void QSGTextInputPrivate::mirrorChange()
+{
+    Q_Q(QSGTextInput);
+    if (q->isComponentComplete()) {
+        if (!hAlignImplicit && (hAlign == QSGTextInput::AlignRight || hAlign == QSGTextInput::AlignLeft)) {
+            q->updateRect();
+            updateHorizontalScroll();
+            emit q->effectiveHorizontalAlignmentChanged();
+        }
+    }
+}
+
+bool QSGTextInput::isReadOnly() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->isReadOnly();
+}
+
+void QSGTextInput::setReadOnly(bool ro)
+{
+    Q_D(QSGTextInput);
+    if (d->control->isReadOnly() == ro)
+        return;
+
+    setFlag(QSGItem::ItemAcceptsInputMethod, !ro);
+    d->control->setReadOnly(ro);
+
+    emit readOnlyChanged(ro);
+}
+
+int QSGTextInput::maxLength() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->maxLength();
+}
+
+void QSGTextInput::setMaxLength(int ml)
+{
+    Q_D(QSGTextInput);
+    if (d->control->maxLength() == ml)
+        return;
+
+    d->control->setMaxLength(ml);
+
+    emit maximumLengthChanged(ml);
+}
+
+bool QSGTextInput::isCursorVisible() const
+{
+    Q_D(const QSGTextInput);
+    return d->cursorVisible;
+}
+
+void QSGTextInput::setCursorVisible(bool on)
+{
+    Q_D(QSGTextInput);
+    if (d->cursorVisible == on)
+        return;
+    d->cursorVisible = on;
+    d->control->setCursorBlinkPeriod(on?QApplication::cursorFlashTime():0);
+    QRect r = d->control->cursorRect();
+    if (d->control->inputMask().isEmpty())
+        updateRect(r);
+    else
+        updateRect();
+    emit cursorVisibleChanged(d->cursorVisible);
+}
+
+int QSGTextInput::cursorPosition() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->cursor();
+}
+void QSGTextInput::setCursorPosition(int cp)
+{
+    Q_D(QSGTextInput);
+    if (cp < 0 || cp > d->control->text().length())
+        return;
+    d->control->moveCursor(cp);
+}
+
+QRect QSGTextInput::cursorRectangle() const
+{
+    Q_D(const QSGTextInput);
+    QRect r = d->control->cursorRect();
+    // Scroll and make consistent with TextEdit
+    // QLineControl inexplicably adds 1 to the height and horizontal padding
+    // for unicode direction markers.
+    r.adjust(5 - d->hscroll, 0, -4 - d->hscroll, -1);
+    return r;
+}
+
+int QSGTextInput::selectionStart() const
+{
+    Q_D(const QSGTextInput);
+    return d->lastSelectionStart;
+}
+
+int QSGTextInput::selectionEnd() const
+{
+    Q_D(const QSGTextInput);
+    return d->lastSelectionEnd;
+}
+
+void QSGTextInput::select(int start, int end)
+{
+    Q_D(QSGTextInput);
+    if (start < 0 || end < 0 || start > d->control->text().length() || end > d->control->text().length())
+        return;
+    d->control->setSelection(start, end-start);
+}
+
+QString QSGTextInput::selectedText() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->selectedText();
+}
+
+bool QSGTextInput::focusOnPress() const
+{
+    Q_D(const QSGTextInput);
+    return d->focusOnPress;
+}
+
+void QSGTextInput::setFocusOnPress(bool b)
+{
+    Q_D(QSGTextInput);
+    if (d->focusOnPress == b)
+        return;
+
+    d->focusOnPress = b;
+
+    emit activeFocusOnPressChanged(d->focusOnPress);
+}
+
+bool QSGTextInput::autoScroll() const
+{
+    Q_D(const QSGTextInput);
+    return d->autoScroll;
+}
+
+void QSGTextInput::setAutoScroll(bool b)
+{
+    Q_D(QSGTextInput);
+    if (d->autoScroll == b)
+        return;
+
+    d->autoScroll = b;
+    //We need to repaint so that the scrolling is taking into account.
+    updateSize(true);
+    d->updateHorizontalScroll();
+    emit autoScrollChanged(d->autoScroll);
+}
+
+#ifndef QT_NO_VALIDATOR
+QValidator* QSGTextInput::validator() const
+{
+    Q_D(const QSGTextInput);
+    //###const cast isn't good, but needed for property system?
+    return const_cast<QValidator*>(d->control->validator());
+}
+
+void QSGTextInput::setValidator(QValidator* v)
+{
+    Q_D(QSGTextInput);
+    if (d->control->validator() == v)
+        return;
+
+    d->control->setValidator(v);
+    if(!d->control->hasAcceptableInput()){
+        d->oldValidity = false;
+        emit acceptableInputChanged();
+    }
+
+    emit validatorChanged();
+}
+#endif // QT_NO_VALIDATOR
+
+QString QSGTextInput::inputMask() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->inputMask();
+}
+
+void QSGTextInput::setInputMask(const QString &im)
+{
+    Q_D(QSGTextInput);
+    if (d->control->inputMask() == im)
+        return;
+
+    d->control->setInputMask(im);
+    emit inputMaskChanged(d->control->inputMask());
+}
+
+bool QSGTextInput::hasAcceptableInput() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->hasAcceptableInput();
+}
+
+QSGTextInput::EchoMode QSGTextInput::echoMode() const
+{
+    Q_D(const QSGTextInput);
+    return (QSGTextInput::EchoMode)d->control->echoMode();
+}
+
+void QSGTextInput::setEchoMode(QSGTextInput::EchoMode echo)
+{
+    Q_D(QSGTextInput);
+    if (echoMode() == echo)
+        return;
+    Qt::InputMethodHints imHints = inputMethodHints();
+    if (echo == Password || echo == NoEcho)
+        imHints |= Qt::ImhHiddenText;
+    else
+        imHints &= ~Qt::ImhHiddenText;
+    if (echo != Normal)
+        imHints |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    else
+        imHints &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    setInputMethodHints(imHints);
+    d->control->setEchoMode((uint)echo);
+    q_textChanged();
+    emit echoModeChanged(echoMode());
+}
+
+QDeclarativeComponent* QSGTextInput::cursorDelegate() const
+{
+    Q_D(const QSGTextInput);
+    return d->cursorComponent;
+}
+
+void QSGTextInput::setCursorDelegate(QDeclarativeComponent* c)
+{
+    Q_D(QSGTextInput);
+    if (d->cursorComponent == c)
+        return;
+
+    d->cursorComponent = c;
+    if(!c){
+        //note that the components are owned by something else
+        disconnect(d->control, SIGNAL(cursorPositionChanged(int,int)),
+                this, SLOT(moveCursor()));
+        delete d->cursorItem;
+    }else{
+        d->startCreatingCursor();
+    }
+
+    emit cursorDelegateChanged();
+}
+
+void QSGTextInputPrivate::startCreatingCursor()
+{
+    Q_Q(QSGTextInput);
+    q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
+            q, SLOT(moveCursor()));
+    if(cursorComponent->isReady()){
+        q->createCursor();
+    }else if(cursorComponent->isLoading()){
+        q->connect(cursorComponent, SIGNAL(statusChanged(int)),
+                q, SLOT(createCursor()));
+    }else {//isError
+        qmlInfo(q, cursorComponent->errors()) << QSGTextInput::tr("Could not load cursor delegate");
+    }
+}
+
+void QSGTextInput::createCursor()
+{
+    Q_D(QSGTextInput);
+    if(d->cursorComponent->isError()){
+        qmlInfo(this, d->cursorComponent->errors()) << tr("Could not load cursor delegate");
+        return;
+    }
+
+    if(!d->cursorComponent->isReady())
+        return;
+
+    if(d->cursorItem)
+        delete d->cursorItem;
+    d->cursorItem = qobject_cast<QSGItem*>(d->cursorComponent->create());
+    if(!d->cursorItem){
+        qmlInfo(this, d->cursorComponent->errors()) << tr("Could not instantiate cursor delegate");
+        return;
+    }
+
+    QDeclarative_setParent_noEvent(d->cursorItem, this);
+    d->cursorItem->setParentItem(this);
+    d->cursorItem->setX(d->control->cursorToX());
+    d->cursorItem->setHeight(d->control->height()-1); // -1 to counter QLineControl's +1 which is not consistent with Text.
+}
+
+void QSGTextInput::moveCursor()
+{
+    Q_D(QSGTextInput);
+    if(!d->cursorItem)
+        return;
+    d->updateHorizontalScroll();
+    d->cursorItem->setX(d->control->cursorToX() - d->hscroll);
+}
+
+QRectF QSGTextInput::positionToRectangle(int pos) const
+{
+    Q_D(const QSGTextInput);
+    if (pos > d->control->cursorPosition())
+        pos += d->control->preeditAreaText().length();
+    return QRectF(d->control->cursorToX(pos)-d->hscroll,
+        0.0,
+        d->control->cursorWidth(),
+        cursorRectangle().height());
+}
+
+int QSGTextInput::positionAt(int x) const
+{
+    return positionAt(x, CursorBetweenCharacters);
+}
+
+int QSGTextInput::positionAt(int x, CursorPosition position) const
+{
+    Q_D(const QSGTextInput);
+    int pos = d->control->xToPos(x + d->hscroll, QTextLine::CursorPosition(position));
+    const int cursor = d->control->cursor();
+    if (pos > cursor) {
+        const int preeditLength = d->control->preeditAreaText().length();
+        pos = pos > cursor + preeditLength
+                ? pos - preeditLength
+                : cursor;
+    }
+    return pos;
+}
+
+void QSGTextInput::keyPressEvent(QKeyEvent* ev)
+{
+    Q_D(QSGTextInput);
+    // Don't allow MacOSX up/down support, and we don't allow a completer.
+    bool ignore = (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down) && ev->modifiers() == Qt::NoModifier;
+    if (!ignore && (d->lastSelectionStart == d->lastSelectionEnd) && (ev->key() == Qt::Key_Right || ev->key() == Qt::Key_Left)) {
+        // Ignore when moving off the end unless there is a selection,
+        // because then moving will do something (deselect).
+        int cursorPosition = d->control->cursor();
+        if (cursorPosition == 0)
+            ignore = ev->key() == (d->control->layoutDirection() == Qt::LeftToRight ? Qt::Key_Left : Qt::Key_Right);
+        if (cursorPosition == d->control->text().length())
+            ignore = ev->key() == (d->control->layoutDirection() == Qt::LeftToRight ? Qt::Key_Right : Qt::Key_Left);
+    }
+    if (ignore) {
+        ev->ignore();
+    } else {
+        d->control->processKeyEvent(ev);
+    }
+    if (!ev->isAccepted())
+        QSGPaintedItem::keyPressEvent(ev);
+}
+
+void QSGTextInput::inputMethodEvent(QInputMethodEvent *ev)
+{
+    Q_D(QSGTextInput);
+    const bool wasComposing = d->control->preeditAreaText().length() > 0;
+    if (d->control->isReadOnly()) {
+        ev->ignore();
+    } else {
+        d->control->processInputMethodEvent(ev);
+        updateSize();
+        d->updateHorizontalScroll();
+    }
+    if (!ev->isAccepted())
+        QSGPaintedItem::inputMethodEvent(ev);
+
+    if (wasComposing != (d->control->preeditAreaText().length() > 0))
+        emit inputMethodComposingChanged();
+}
+
+void QSGTextInput::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextInput);
+    if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonDblClick))
+        return;
+    if (d->selectByMouse) {
+        int cursor = d->xToPos(event->pos().x());
+        d->control->selectWordAtPos(cursor);
+        event->setAccepted(true);
+    } else {
+        QSGPaintedItem::mouseDoubleClickEvent(event);
+    }
+}
+
+void QSGTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextInput);
+    if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonPress))
+        return;
+    if(d->focusOnPress){
+        bool hadActiveFocus = hasActiveFocus();
+        forceActiveFocus();
+        if (d->showInputPanelOnFocus) {
+            if (hasActiveFocus() && hadActiveFocus && !isReadOnly()) {
+                // re-open input panel on press if already focused
+                openSoftwareInputPanel();
+            }
+        } else { // show input panel on click
+            if (hasActiveFocus() && !hadActiveFocus) {
+                d->clickCausedFocus = true;
+            }
+        }
+    }
+    if (d->selectByMouse) {
+        setKeepMouseGrab(false);
+        d->pressPos = event->pos();
+    }
+    bool mark = event->modifiers() & Qt::ShiftModifier;
+    int cursor = d->xToPos(event->pos().x());
+    d->control->moveCursor(cursor, mark);
+    event->setAccepted(true);
+}
+
+void QSGTextInput::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextInput);
+    if (d->sendMouseEventToInputContext(event, QEvent::MouseMove))
+        return;
+    if (d->selectByMouse) {
+        if (qAbs(int(event->pos().x() - d->pressPos.x())) > QApplication::startDragDistance())
+            setKeepMouseGrab(true);
+        moveCursorSelection(d->xToPos(event->pos().x()), d->mouseSelectionMode);
+        event->setAccepted(true);
+    } else {
+        QSGPaintedItem::mouseMoveEvent(event);
+    }
+}
+
+void QSGTextInput::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QSGTextInput);
+    if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonRelease))
+        return;
+    if (d->selectByMouse)
+        setKeepMouseGrab(false);
+    if (!d->showInputPanelOnFocus) { // input panel on click
+        if (d->focusOnPress && !isReadOnly() && boundingRect().contains(event->pos())) {
+            if (canvas() && canvas() == qApp->focusWidget()) {
+                qt_widget_private(canvas())->handleSoftwareInputPanel(event->button(), d->clickCausedFocus);
+            }
+        }
+    }
+    d->clickCausedFocus = false;
+    d->control->processEvent(event);
+    if (!event->isAccepted())
+        QSGPaintedItem::mouseReleaseEvent(event);
+}
+
+bool QSGTextInputPrivate::sendMouseEventToInputContext(
+        QGraphicsSceneMouseEvent *event, QEvent::Type eventType)
+{
+#if !defined QT_NO_IM
+    if (event->widget() && control->composeMode()) {
+        int tmp_cursor = xToPos(event->pos().x());
+        int mousePos = tmp_cursor - control->cursor();
+        if (mousePos < 0 || mousePos > control->preeditAreaText().length()) {
+            mousePos = -1;
+            // don't send move events outside the preedit area
+            if (eventType == QEvent::MouseMove)
+                return true;
+        }
+
+        QInputContext *qic = event->widget()->inputContext();
+        if (qic) {
+            QMouseEvent mouseEvent(
+                    eventType,
+                    event->widget()->mapFromGlobal(event->screenPos()),
+                    event->screenPos(),
+                    event->button(),
+                    event->buttons(),
+                    event->modifiers());
+            // may be causing reset() in some input methods
+            qic->mouseHandler(mousePos, &mouseEvent);
+            event->setAccepted(mouseEvent.isAccepted());
+        }
+        if (!control->preeditAreaText().isEmpty())
+            return true;
+    }
+#else
+    Q_UNUSED(event);
+    Q_UNUSED(eventType)
+#endif
+
+    return false;
+}
+
+void QSGTextInput::mouseUngrabEvent()
+{
+    setKeepMouseGrab(false);
+}
+
+bool QSGTextInput::event(QEvent* ev)
+{
+    Q_D(QSGTextInput);
+    //Anything we don't deal with ourselves, pass to the control
+    bool handled = false;
+    switch(ev->type()){
+        case QEvent::KeyPress:
+        case QEvent::KeyRelease://###Should the control be doing anything with release?
+        case QEvent::InputMethod:
+        case QEvent::GraphicsSceneMousePress:
+        case QEvent::GraphicsSceneMouseMove:
+        case QEvent::GraphicsSceneMouseRelease:
+        case QEvent::GraphicsSceneMouseDoubleClick:
+            break;
+        default:
+            handled = d->control->processEvent(ev);
+    }
+    if(!handled)
+        handled = QSGPaintedItem::event(ev);
+    return handled;
+}
+
+void QSGTextInput::geometryChanged(const QRectF &newGeometry,
+                                  const QRectF &oldGeometry)
+{
+    Q_D(QSGTextInput);
+    if (newGeometry.width() != oldGeometry.width()) {
+        updateSize();
+        d->updateHorizontalScroll();
+    }
+    QSGPaintedItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+int QSGTextInputPrivate::calculateTextWidth()
+{
+    return qRound(control->naturalTextWidth());
+}
+
+void QSGTextInputPrivate::updateHorizontalScroll()
+{
+    Q_Q(QSGTextInput);
+    const int preeditLength = control->preeditAreaText().length();
+    int cix = qRound(control->cursorToX(control->cursor() + preeditLength));
+    QRect br(q->boundingRect().toRect());
+    int widthUsed = calculateTextWidth();
+
+    QSGTextInput::HAlignment effectiveHAlign = q->effectiveHAlign();
+    if (autoScroll) {
+        if (widthUsed <=  br.width()) {
+            // text fits in br; use hscroll for alignment
+            switch (effectiveHAlign & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) {
+            case Qt::AlignRight:
+                hscroll = widthUsed - br.width() - 1;
+                break;
+            case Qt::AlignHCenter:
+                hscroll = (widthUsed - br.width()) / 2;
+                break;
+            default:
+                // Left
+                hscroll = 0;
+                break;
+            }
+        } else if (cix - hscroll >= br.width()) {
+            // text doesn't fit, cursor is to the right of br (scroll right)
+            hscroll = cix - br.width() + 1;
+        } else if (cix - hscroll < 0 && hscroll < widthUsed) {
+            // text doesn't fit, cursor is to the left of br (scroll left)
+            hscroll = cix;
+        } else if (widthUsed - hscroll < br.width()) {
+            // text doesn't fit, text document is to the left of br; align
+            // right
+            hscroll = widthUsed - br.width() + 1;
+        }
+        if (preeditLength > 0) {
+            // check to ensure long pre-edit text doesn't push the cursor
+            // off to the left
+             cix = qRound(control->cursorToX(
+                     control->cursor() + qMax(0, control->preeditCursor() - 1)));
+             if (cix < hscroll)
+                 hscroll = cix;
+        }
+    } else {
+        switch (effectiveHAlign) {
+        case QSGTextInput::AlignRight:
+            hscroll = q->width() - widthUsed;
+            break;
+        case QSGTextInput::AlignHCenter:
+            hscroll = (q->width() - widthUsed) / 2;
+            break;
+        default:
+            // Left
+            hscroll = 0;
+            break;
+        }
+    }
+}
+
+void QSGTextInput::paint(QPainter *p)
+{
+    // XXX todo
+    QRect r(0, 0, width(), height());
+
+    Q_D(QSGTextInput);
+    p->setRenderHint(QPainter::TextAntialiasing, true);
+    p->save();
+    p->setPen(QPen(d->color));
+    int flags = QLineControl::DrawText;
+    if(!isReadOnly() && d->cursorVisible && !d->cursorItem)
+        flags |= QLineControl::DrawCursor;
+    if (d->control->hasSelectedText())
+            flags |= QLineControl::DrawSelections;
+    QPoint offset = QPoint(0,0);
+    QFontMetrics fm = QFontMetrics(d->font);
+    QRect br(boundingRect().toRect());
+    if (d->autoScroll) {
+        // the y offset is there to keep the baseline constant in case we have script changes in the text.
+        offset = br.topLeft() - QPoint(d->hscroll, d->control->ascent() - fm.ascent());
+    } else {
+        offset = QPoint(d->hscroll, 0);
+    }
+    d->control->draw(p, offset, r, flags);
+    p->restore();
+}
+
+QVariant QSGTextInput::inputMethodQuery(Qt::InputMethodQuery property) const
+{
+    Q_D(const QSGTextInput);
+    switch(property) {
+    case Qt::ImMicroFocus:
+        return cursorRectangle();
+    case Qt::ImFont:
+        return font();
+    case Qt::ImCursorPosition:
+        return QVariant(d->control->cursor());
+    case Qt::ImSurroundingText:
+        if (d->control->echoMode() == PasswordEchoOnEdit && !d->control->passwordEchoEditing())
+            return QVariant(displayText());
+        else
+            return QVariant(text());
+    case Qt::ImCurrentSelection:
+        return QVariant(selectedText());
+    case Qt::ImMaximumTextLength:
+        return QVariant(maxLength());
+    case Qt::ImAnchorPosition:
+        if (d->control->selectionStart() == d->control->selectionEnd())
+            return QVariant(d->control->cursor());
+        else if (d->control->selectionStart() == d->control->cursor())
+            return QVariant(d->control->selectionEnd());
+        else
+            return QVariant(d->control->selectionStart());
+    default:
+        return QVariant();
+    }
+}
+
+void QSGTextInput::deselect()
+{
+    Q_D(QSGTextInput);
+    d->control->deselect();
+}
+
+void QSGTextInput::selectAll()
+{
+    Q_D(QSGTextInput);
+    d->control->setSelection(0, d->control->text().length());
+}
+
+bool QSGTextInput::isRightToLeft(int start, int end)
+{
+    Q_D(QSGTextInput);
+    if (start > end) {
+        qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start.";
+        return false;
+    } else {
+        return d->control->text().mid(start, end - start).isRightToLeft();
+    }
+}
+
+#ifndef QT_NO_CLIPBOARD
+void QSGTextInput::cut()
+{
+    Q_D(QSGTextInput);
+    d->control->copy();
+    d->control->del();
+}
+
+void QSGTextInput::copy()
+{
+    Q_D(QSGTextInput);
+    d->control->copy();
+}
+
+void QSGTextInput::paste()
+{
+    Q_D(QSGTextInput);
+    if (!d->control->isReadOnly())
+        d->control->paste();
+}
+#endif // QT_NO_CLIPBOARD
+
+void QSGTextInput::selectWord()
+{
+    Q_D(QSGTextInput);
+    d->control->selectWordAtPos(d->control->cursor());
+}
+
+QString QSGTextInput::passwordCharacter() const
+{
+    Q_D(const QSGTextInput);
+    return QString(d->control->passwordCharacter());
+}
+
+void QSGTextInput::setPasswordCharacter(const QString &str)
+{
+    Q_D(QSGTextInput);
+    if(str.length() < 1)
+        return;
+    d->control->setPasswordCharacter(str.constData()[0]);
+    EchoMode echoMode_ = echoMode();
+    if (echoMode_ == Password || echoMode_ == PasswordEchoOnEdit) {
+        updateSize();
+    }
+    emit passwordCharacterChanged();
+}
+
+QString QSGTextInput::displayText() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->displayText();
+}
+
+bool QSGTextInput::selectByMouse() const
+{
+    Q_D(const QSGTextInput);
+    return d->selectByMouse;
+}
+
+void QSGTextInput::setSelectByMouse(bool on)
+{
+    Q_D(QSGTextInput);
+    if (d->selectByMouse != on) {
+        d->selectByMouse = on;
+        emit selectByMouseChanged(on);
+    }
+}
+
+QSGTextInput::SelectionMode QSGTextInput::mouseSelectionMode() const
+{
+    Q_D(const QSGTextInput);
+    return d->mouseSelectionMode;
+}
+
+void QSGTextInput::setMouseSelectionMode(SelectionMode mode)
+{
+    Q_D(QSGTextInput);
+    if (d->mouseSelectionMode != mode) {
+        d->mouseSelectionMode = mode;
+        emit mouseSelectionModeChanged(mode);
+    }
+}
+
+bool QSGTextInput::canPaste() const
+{
+    Q_D(const QSGTextInput);
+    return d->canPaste;
+}
+
+void QSGTextInput::moveCursorSelection(int position)
+{
+    Q_D(QSGTextInput);
+    d->control->moveCursor(position, true);
+    d->updateHorizontalScroll();
+}
+
+void QSGTextInput::moveCursorSelection(int pos, SelectionMode mode)
+{
+    Q_D(QSGTextInput);
+
+    if (mode == SelectCharacters) {
+        d->control->moveCursor(pos, true);
+    } else if (pos != d->control->cursor()){
+        const int cursor = d->control->cursor();
+        int anchor;
+        if (!d->control->hasSelectedText())
+            anchor = d->control->cursor();
+        else if (d->control->selectionStart() == d->control->cursor())
+            anchor = d->control->selectionEnd();
+        else
+            anchor = d->control->selectionStart();
+
+        if (anchor < pos || (anchor == pos && cursor < pos)) {
+            const QString text = d->control->text();
+            QTextBoundaryFinder finder(QTextBoundaryFinder::Word, text);
+            finder.setPosition(anchor);
+
+            const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
+            if (anchor < text.length() && (!(reasons & QTextBoundaryFinder::StartWord)
+                    || ((reasons & QTextBoundaryFinder::EndWord) && anchor > cursor))) {
+                finder.toPreviousBoundary();
+            }
+            anchor = finder.position() != -1 ? finder.position() : 0;
+
+            finder.setPosition(pos);
+            if (pos > 0 && !finder.boundaryReasons())
+                finder.toNextBoundary();
+            const int cursor = finder.position() != -1 ? finder.position() : text.length();
+
+            d->control->setSelection(anchor, cursor - anchor);
+        } else if (anchor > pos || (anchor == pos && cursor > pos)) {
+            const QString text = d->control->text();
+            QTextBoundaryFinder finder(QTextBoundaryFinder::Word, text);
+            finder.setPosition(anchor);
+
+            const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
+            if (anchor > 0 && (!(reasons & QTextBoundaryFinder::EndWord)
+                    || ((reasons & QTextBoundaryFinder::StartWord) && anchor < cursor))) {
+                finder.toNextBoundary();
+            }
+
+            anchor = finder.position() != -1 ? finder.position() : text.length();
+
+            finder.setPosition(pos);
+            if (pos < text.length() && !finder.boundaryReasons())
+                 finder.toPreviousBoundary();
+            const int cursor = finder.position() != -1 ? finder.position() : 0;
+
+            d->control->setSelection(anchor, cursor - anchor);
+        }
+    }
+}
+
+void QSGTextInput::openSoftwareInputPanel()
+{
+    QEvent event(QEvent::RequestSoftwareInputPanel);
+    if (qApp) {
+        if (canvas() && canvas() == qApp->focusWidget()) {
+            QEvent event(QEvent::RequestSoftwareInputPanel);
+            QApplication::sendEvent(canvas(), &event);
+        }
+    }
+}
+
+void QSGTextInput::closeSoftwareInputPanel()
+{
+    if (qApp) {
+        if (canvas() && canvas() == qApp->focusWidget()) {
+            QEvent event(QEvent::CloseSoftwareInputPanel);
+            QApplication::sendEvent(canvas(), &event);
+        }
+    }
+}
+
+void QSGTextInput::focusInEvent(QFocusEvent *event)
+{
+    Q_D(const QSGTextInput);
+    if (d->showInputPanelOnFocus) {
+        if (d->focusOnPress && !isReadOnly()) {
+            openSoftwareInputPanel();
+        }
+    }
+    QSGPaintedItem::focusInEvent(event);
+}
+
+void QSGTextInput::itemChange(ItemChange change, const ItemChangeData &value)
+{
+    Q_D(QSGTextInput);
+    if (change == ItemActiveFocusHasChanged) {
+        bool hasFocus = value.boolValue;
+        d->focused = hasFocus;
+        setCursorVisible(hasFocus && d->canvas && d->canvas->hasFocus());
+        if(echoMode() == QSGTextInput::PasswordEchoOnEdit && !hasFocus)
+            d->control->updatePasswordEchoEditing(false);//QLineControl sets it on key events, but doesn't deal with focus events
+        if (!hasFocus)
+            d->control->deselect();
+    }
+    QSGItem::itemChange(change, value);
+}
+
+bool QSGTextInput::isInputMethodComposing() const
+{
+    Q_D(const QSGTextInput);
+    return d->control->preeditAreaText().length() > 0;
+}
+
+void QSGTextInputPrivate::init()
+{
+    Q_Q(QSGTextInput);
+    control->setCursorWidth(1);
+    control->setPasswordCharacter(QLatin1Char('*'));
+    q->setSmooth(smooth);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setFlag(QSGItem::ItemAcceptsInputMethod);
+    q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
+               q, SLOT(cursorPosChanged()));
+    q->connect(control, SIGNAL(selectionChanged()),
+               q, SLOT(selectionChanged()));
+    q->connect(control, SIGNAL(textChanged(QString)),
+               q, SLOT(q_textChanged()));
+    q->connect(control, SIGNAL(accepted()),
+               q, SIGNAL(accepted()));
+    q->connect(control, SIGNAL(updateNeeded(QRect)),
+               q, SLOT(updateRect(QRect)));
+#ifndef QT_NO_CLIPBOARD
+    q->connect(q, SIGNAL(readOnlyChanged(bool)),
+            q, SLOT(q_canPasteChanged()));
+    q->connect(QApplication::clipboard(), SIGNAL(dataChanged()),
+            q, SLOT(q_canPasteChanged()));
+    canPaste = !control->isReadOnly() && QApplication::clipboard()->text().length() != 0;
+#endif // QT_NO_CLIPBOARD
+    q->connect(control, SIGNAL(updateMicroFocus()),
+               q, SLOT(updateMicroFocus()));
+    q->connect(control, SIGNAL(displayTextChanged(QString)),
+               q, SLOT(updateRect()));
+    q->updateSize();
+    oldValidity = control->hasAcceptableInput();
+    lastSelectionStart = 0;
+    lastSelectionEnd = 0;
+    QPalette p = control->palette();
+    selectedTextColor = p.color(QPalette::HighlightedText);
+    selectionColor = p.color(QPalette::Highlight);
+    determineHorizontalAlignment();
+}
+
+void QSGTextInput::cursorPosChanged()
+{
+    Q_D(QSGTextInput);
+    d->updateHorizontalScroll();
+    updateRect();//TODO: Only update rect between pos's
+    updateMicroFocus();
+    emit cursorPositionChanged();
+    // XXX todo - not in 4.8?
+#if 0
+    d->control->resetCursorBlinkTimer();
+#endif
+
+    if(!d->control->hasSelectedText()){
+        if(d->lastSelectionStart != d->control->cursor()){
+            d->lastSelectionStart = d->control->cursor();
+            emit selectionStartChanged();
+        }
+        if(d->lastSelectionEnd != d->control->cursor()){
+            d->lastSelectionEnd = d->control->cursor();
+            emit selectionEndChanged();
+        }
+    }
+}
+
+void QSGTextInput::selectionChanged()
+{
+    Q_D(QSGTextInput);
+    updateRect();//TODO: Only update rect in selection
+    emit selectedTextChanged();
+
+    if(d->lastSelectionStart != d->control->selectionStart()){
+        d->lastSelectionStart = d->control->selectionStart();
+        if(d->lastSelectionStart == -1)
+            d->lastSelectionStart = d->control->cursor();
+        emit selectionStartChanged();
+    }
+    if(d->lastSelectionEnd != d->control->selectionEnd()){
+        d->lastSelectionEnd = d->control->selectionEnd();
+        if(d->lastSelectionEnd == -1)
+            d->lastSelectionEnd = d->control->cursor();
+        emit selectionEndChanged();
+    }
+}
+
+void QSGTextInput::q_textChanged()
+{
+    Q_D(QSGTextInput);
+    updateSize();
+    d->determineHorizontalAlignment();
+    d->updateHorizontalScroll();
+    updateMicroFocus();
+    emit textChanged();
+    emit displayTextChanged();
+    if(hasAcceptableInput() != d->oldValidity){
+        d->oldValidity = hasAcceptableInput();
+        emit acceptableInputChanged();
+    }
+}
+
+void QSGTextInput::updateRect(const QRect &r)
+{
+    Q_D(QSGTextInput);
+    if(r == QRect())
+        update();
+    else
+        update(QRect(r.x() - d->hscroll, r.y(), r.width(), r.height()));
+}
+
+QRectF QSGTextInput::boundingRect() const
+{
+    Q_D(const QSGTextInput);
+    QRectF r = QSGPaintedItem::boundingRect();
+
+    int cursorWidth = d->cursorItem ? d->cursorItem->width() : d->control->cursorWidth();
+
+    // Could include font max left/right bearings to either side of rectangle.
+
+    r.setRight(r.right() + cursorWidth);
+    return r;
+}
+
+void QSGTextInput::updateSize(bool needsRedraw)
+{
+    Q_D(QSGTextInput);
+    int w = width();
+    int h = height();
+    setImplicitHeight(d->control->height()-1); // -1 to counter QLineControl's +1 which is not consistent with Text.
+    setImplicitWidth(d->calculateTextWidth());
+    setContentsSize(QSize(width(), height()));
+    if(w==width() && h==height() && needsRedraw)
+        update();
+}
+
+void QSGTextInput::q_canPasteChanged()
+{
+    Q_D(QSGTextInput);
+    bool old = d->canPaste;
+#ifndef QT_NO_CLIPBOARD
+    d->canPaste = !d->control->isReadOnly() && QApplication::clipboard()->text().length() != 0;
+#endif
+    if(d->canPaste != old)
+        emit canPasteChanged();
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/items/qsgtextinput_p.h b/src/declarative/items/qsgtextinput_p.h
new file mode 100644
index 0000000000..ee04579a54
--- /dev/null
+++ b/src/declarative/items/qsgtextinput_p.h
@@ -0,0 +1,299 @@
+// Commit: 27e4302b7f45f22180693d26747f419177c81e27
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTINPUT_P_H
+#define QSGTEXTINPUT_P_H
+
+#include "qsgimplicitsizeitem_p.h"
+#include <QtGui/qvalidator.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGTextInputPrivate;
+class QValidator;
+class Q_AUTOTEST_EXPORT QSGTextInput : public QSGImplicitSizePaintedItem
+{
+    Q_OBJECT
+    Q_ENUMS(HAlignment)
+    Q_ENUMS(EchoMode)
+    Q_ENUMS(SelectionMode)
+
+    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+    Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged)
+    Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged)
+    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
+    Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
+    Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged)
+
+    Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
+    Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged)
+    Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
+    Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorPositionChanged)
+    Q_PROPERTY(QDeclarativeComponent *cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged)
+    Q_PROPERTY(int selectionStart READ selectionStart NOTIFY selectionStartChanged)
+    Q_PROPERTY(int selectionEnd READ selectionEnd NOTIFY selectionEndChanged)
+    Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectedTextChanged)
+
+    Q_PROPERTY(int maximumLength READ maxLength WRITE setMaxLength NOTIFY maximumLengthChanged)
+#ifndef QT_NO_VALIDATOR
+    Q_PROPERTY(QValidator* validator READ validator WRITE setValidator NOTIFY validatorChanged)
+#endif
+    Q_PROPERTY(QString inputMask READ inputMask WRITE setInputMask NOTIFY inputMaskChanged)
+    Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ inputMethodHints WRITE setInputMethodHints)
+
+    Q_PROPERTY(bool acceptableInput READ hasAcceptableInput NOTIFY acceptableInputChanged)
+    Q_PROPERTY(EchoMode echoMode READ echoMode WRITE setEchoMode NOTIFY echoModeChanged)
+    Q_PROPERTY(bool activeFocusOnPress READ focusOnPress WRITE setFocusOnPress NOTIFY activeFocusOnPressChanged)
+    Q_PROPERTY(QString passwordCharacter READ passwordCharacter WRITE setPasswordCharacter NOTIFY passwordCharacterChanged)
+    Q_PROPERTY(QString displayText READ displayText NOTIFY displayTextChanged)
+    Q_PROPERTY(bool autoScroll READ autoScroll WRITE setAutoScroll NOTIFY autoScrollChanged)
+    Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
+    Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged)
+    Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged)
+    Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged)
+
+public:
+    QSGTextInput(QSGItem * parent=0);
+    ~QSGTextInput();
+
+    enum EchoMode {//To match QLineEdit::EchoMode
+        Normal,
+        NoEcho,
+        Password,
+        PasswordEchoOnEdit
+    };
+
+    enum HAlignment {
+        AlignLeft = Qt::AlignLeft,
+        AlignRight = Qt::AlignRight,
+        AlignHCenter = Qt::AlignHCenter
+    };
+
+    enum SelectionMode {
+        SelectCharacters,
+        SelectWords
+    };
+
+    enum CursorPosition {
+        CursorBetweenCharacters,
+        CursorOnCharacter
+    };
+
+    //Auxilliary functions needed to control the TextInput from QML
+    Q_INVOKABLE int positionAt(int x) const;
+    Q_INVOKABLE int positionAt(int x, CursorPosition position) const;
+    Q_INVOKABLE QRectF positionToRectangle(int pos) const;
+    Q_INVOKABLE void moveCursorSelection(int pos);
+    Q_INVOKABLE void moveCursorSelection(int pos, SelectionMode mode);
+
+    Q_INVOKABLE void openSoftwareInputPanel();
+    Q_INVOKABLE void closeSoftwareInputPanel();
+
+    QString text() const;
+    void setText(const QString &);
+
+    QFont font() const;
+    void setFont(const QFont &font);
+
+    QColor color() const;
+    void setColor(const QColor &c);
+
+    QColor selectionColor() const;
+    void setSelectionColor(const QColor &c);
+
+    QColor selectedTextColor() const;
+    void setSelectedTextColor(const QColor &c);
+
+    HAlignment hAlign() const;
+    void setHAlign(HAlignment align);
+    void resetHAlign();
+    HAlignment effectiveHAlign() const;
+
+    bool isReadOnly() const;
+    void setReadOnly(bool);
+
+    bool isCursorVisible() const;
+    void setCursorVisible(bool on);
+
+    int cursorPosition() const;
+    void setCursorPosition(int cp);
+
+    QRect cursorRectangle() const;
+
+    int selectionStart() const;
+    int selectionEnd() const;
+
+    QString selectedText() const;
+
+    int maxLength() const;
+    void setMaxLength(int ml);
+
+#ifndef QT_NO_VALIDATOR
+    QValidator * validator() const;
+    void setValidator(QValidator* v);
+#endif
+    QString inputMask() const;
+    void setInputMask(const QString &im);
+
+    EchoMode echoMode() const;
+    void setEchoMode(EchoMode echo);
+
+    QString passwordCharacter() const;
+    void setPasswordCharacter(const QString &str);
+
+    QString displayText() const;
+
+    QDeclarativeComponent* cursorDelegate() const;
+    void setCursorDelegate(QDeclarativeComponent*);
+
+    bool focusOnPress() const;
+    void setFocusOnPress(bool);
+
+    bool autoScroll() const;
+    void setAutoScroll(bool);
+
+    bool selectByMouse() const;
+    void setSelectByMouse(bool);
+
+    SelectionMode mouseSelectionMode() const;
+    void setMouseSelectionMode(SelectionMode mode);
+
+    bool hasAcceptableInput() const;
+
+    void paint(QPainter *p);
+    QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
+
+    QRectF boundingRect() const;
+    bool canPaste() const;
+
+    bool isInputMethodComposing() const;
+
+Q_SIGNALS:
+    void textChanged();
+    void cursorPositionChanged();
+    void selectionStartChanged();
+    void selectionEndChanged();
+    void selectedTextChanged();
+    void accepted();
+    void acceptableInputChanged();
+    void colorChanged(const QColor &color);
+    void selectionColorChanged(const QColor &color);
+    void selectedTextColorChanged(const QColor &color);
+    void fontChanged(const QFont &font);
+    void horizontalAlignmentChanged(HAlignment alignment);
+    void readOnlyChanged(bool isReadOnly);
+    void cursorVisibleChanged(bool isCursorVisible);
+    void cursorDelegateChanged();
+    void maximumLengthChanged(int maximumLength);
+    void validatorChanged();
+    void inputMaskChanged(const QString &inputMask);
+    void echoModeChanged(EchoMode echoMode);
+    void passwordCharacterChanged();
+    void displayTextChanged();
+    void activeFocusOnPressChanged(bool activeFocusOnPress);
+    void autoScrollChanged(bool autoScroll);
+    void selectByMouseChanged(bool selectByMouse);
+    void mouseSelectionModeChanged(SelectionMode mode);
+    void canPasteChanged();
+    void inputMethodComposingChanged();
+    void effectiveHorizontalAlignmentChanged();
+
+protected:
+    virtual void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry);
+
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+    bool sceneEvent(QEvent *event);
+    void keyPressEvent(QKeyEvent* ev);
+    void inputMethodEvent(QInputMethodEvent *);
+    void mouseUngrabEvent();
+    bool event(QEvent *e);
+    void focusInEvent(QFocusEvent *event);
+    virtual void itemChange(ItemChange, const ItemChangeData &);
+
+public Q_SLOTS:
+    void selectAll();
+    void selectWord();
+    void select(int start, int end);
+    void deselect();
+    bool isRightToLeft(int start, int end);
+#ifndef QT_NO_CLIPBOARD
+    void cut();
+    void copy();
+    void paste();
+#endif
+
+private Q_SLOTS:
+    void updateSize(bool needsRedraw = true);
+    void q_textChanged();
+    void selectionChanged();
+    void createCursor();
+    void moveCursor();
+    void cursorPosChanged();
+    void updateRect(const QRect &r = QRect());
+    void q_canPasteChanged();
+
+private:
+    Q_DECLARE_PRIVATE(QSGTextInput)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGTextInput)
+#ifndef QT_NO_VALIDATOR
+QML_DECLARE_TYPE(QValidator)
+QML_DECLARE_TYPE(QIntValidator)
+QML_DECLARE_TYPE(QDoubleValidator)
+QML_DECLARE_TYPE(QRegExpValidator)
+#endif
+
+QT_END_HEADER
+
+#endif // QSGTEXTINPUT_P_H
diff --git a/src/declarative/items/qsgtextinput_p_p.h b/src/declarative/items/qsgtextinput_p_p.h
new file mode 100644
index 0000000000..00db1e995c
--- /dev/null
+++ b/src/declarative/items/qsgtextinput_p_p.h
@@ -0,0 +1,150 @@
+// Commit: 27e4302b7f45f22180693d26747f419177c81e27
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTINPUT_P_P_H
+#define QSGTEXTINPUT_P_P_H
+
+#include "qsgtextinput_p.h"
+#include "qsgtext_p.h"
+#include "qsgimplicitsizeitem_p_p.h"
+
+#include <private/qlinecontrol_p.h>
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtCore/qpointer.h>
+
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+QT_BEGIN_NAMESPACE
+
+class Q_AUTOTEST_EXPORT QSGTextInputPrivate : public QSGImplicitSizePaintedItemPrivate
+{
+    Q_DECLARE_PUBLIC(QSGTextInput)
+public:
+    QSGTextInputPrivate() : control(new QLineControl(QString())),
+                 color((QRgb)0), style(QSGText::Normal),
+                 styleColor((QRgb)0), hAlign(QSGTextInput::AlignLeft),
+                 mouseSelectionMode(QSGTextInput::SelectCharacters),
+                 hscroll(0), oldScroll(0), oldValidity(false), focused(false), focusOnPress(true),
+                 showInputPanelOnFocus(true), clickCausedFocus(false), cursorVisible(false),
+                 autoScroll(true), selectByMouse(false), canPaste(false), hAlignImplicit(true)
+    {
+#ifdef Q_OS_SYMBIAN
+        if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
+            showInputPanelOnFocus = false;
+        }
+#endif
+
+    }
+
+    ~QSGTextInputPrivate()
+    {
+        delete control;
+    }
+
+    int xToPos(int x, QTextLine::CursorPosition betweenOrOn = QTextLine::CursorBetweenCharacters) const
+    {
+        Q_Q(const QSGTextInput);
+        QRect cr = q->boundingRect().toRect();
+        x-= cr.x() - hscroll;
+        return control->xToPos(x, betweenOrOn);
+    }
+
+    void init();
+    void startCreatingCursor();
+    void updateHorizontalScroll();
+    bool determineHorizontalAlignment();
+    bool setHAlign(QSGTextInput::HAlignment, bool forceAlign = false);
+    void mirrorChange();
+    int calculateTextWidth();
+    bool sendMouseEventToInputContext(QGraphicsSceneMouseEvent *event, QEvent::Type eventType);
+
+    QLineControl* control;
+
+    QFont font;
+    QFont sourceFont;
+    QColor  color;
+    QColor  selectionColor;
+    QColor  selectedTextColor;
+    QSGText::TextStyle style;
+    QColor  styleColor;
+    QSGTextInput::HAlignment hAlign;
+    QSGTextInput::SelectionMode mouseSelectionMode;
+    QPointer<QDeclarativeComponent> cursorComponent;
+    QPointer<QSGItem> cursorItem;
+    QPointF pressPos;
+
+    int lastSelectionStart;
+    int lastSelectionEnd;
+    int oldHeight;
+    int oldWidth;
+    int hscroll;
+    int oldScroll;
+
+    bool oldValidity:1;
+    bool focused:1;
+    bool focusOnPress:1;
+    bool showInputPanelOnFocus:1;
+    bool clickCausedFocus:1;
+    bool cursorVisible:1;
+    bool autoScroll:1;
+    bool selectByMouse:1;
+    bool canPaste:1;
+    bool hAlignImplicit:1;
+
+    static inline QSGTextInputPrivate *get(QSGTextInput *t) {
+        return t->d_func();
+    }
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGTEXTINPUT_P_P_H
diff --git a/src/declarative/items/qsgtextnode.cpp b/src/declarative/items/qsgtextnode.cpp
new file mode 100644
index 0000000000..3bbe0d2832
--- /dev/null
+++ b/src/declarative/items/qsgtextnode.cpp
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtextnode_p.h"
+#include "qsgsimplerectnode.h"
+#include <private/qsgadaptationlayer_p.h>
+#include <private/qsgdistancefieldglyphcache_p.h>
+#include <private/qsgdistancefieldglyphnode_p.h>
+
+#include <private/qsgcontext_p.h>
+
+#include <qmath.h>
+#include <qtextdocument.h>
+#include <qtextlayout.h>
+#include <qabstracttextdocumentlayout.h>
+#include <qxmlstream.h>
+#include <qrawfont.h>
+#include <private/qdeclarativestyledtext_p.h>
+#include <private/qfont_p.h>
+#include <private/qfontengine_p.h>
+#include <private/qrawfont_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+  Creates an empty QSGTextNode
+*/
+QSGTextNode::QSGTextNode(QSGContext *context)
+: m_context(context)
+{
+#if defined(QML_RUNTIME_TESTING)
+    description = QLatin1String("text");
+#endif
+}
+
+QSGTextNode::~QSGTextNode()
+{
+}
+
+#if 0
+void QSGTextNode::setColor(const QColor &color)
+{
+    if (m_usePixmapCache) {
+        setUpdateFlag(UpdateNodes);
+    } else {
+        for (int i=0; i<childCount(); ++i) {
+            QSGNode *childNode = childAtIndex(i);
+            if (childNode->subType() == GlyphNodeSubType) {
+                QSGGlyphNode *glyphNode = static_cast<QSGGlyphNode *>(childNode);
+                if (glyphNode->color() == m_color)
+                    glyphNode->setColor(color);
+            } else if (childNode->subType() == SolidRectNodeSubType) {
+                QSGSimpleRectNode *solidRectNode = static_cast<QSGSimpleRectNode *>(childNode);
+                if (solidRectNode->color() == m_color)
+                    solidRectNode->setColor(color);
+            }
+        }
+    }
+    m_color = color;
+}
+
+void QSGTextNode::setStyleColor(const QColor &styleColor)
+{
+    if (m_textStyle != QSGTextNode::NormalTextStyle) {
+        if (m_usePixmapCache) {
+            setUpdateFlag(UpdateNodes);
+        } else {
+            for (int i=0; i<childCount(); ++i) {
+                QSGNode *childNode = childAtIndex(i);
+                if (childNode->subType() == GlyphNodeSubType) {
+                    QSGGlyphNode *glyphNode = static_cast<QSGGlyphNode *>(childNode);
+                    if (glyphNode->color() == m_styleColor)
+                        glyphNode->setColor(styleColor);
+                } else if (childNode->subType() == SolidRectNodeSubType) {
+                    QSGSimpleRectNode *solidRectNode = static_cast<QSGSimpleRectNode *>(childNode);
+                    if (solidRectNode->color() == m_styleColor)
+                        solidRectNode->setColor(styleColor);
+                }
+            }
+        }
+    }
+    m_styleColor = styleColor;
+}
+#endif
+
+void QSGTextNode::addTextDecorations(const QPointF &position, const QRawFont &font, const QColor &color,
+                                     qreal width, bool hasOverline, bool hasStrikeOut, bool hasUnderline)
+{
+    Q_ASSERT(font.isValid());
+    QRawFontPrivate *dptrFont = QRawFontPrivate::get(font);
+    QFontEngine *fontEngine = dptrFont->fontEngine;
+
+    qreal lineThickness = fontEngine->lineThickness().toReal();
+
+    QRectF line(position.x(), position.y() - lineThickness / 2.0, width, lineThickness);
+
+    if (hasUnderline) {
+        int underlinePosition = fontEngine->underlinePosition().ceil().toInt();
+        QRectF underline(line);
+        underline.translate(0.0, underlinePosition);
+        appendChildNode(new QSGSimpleRectNode(underline, color));
+    }
+
+    qreal ascent = font.ascent();
+    if (hasOverline) {
+        QRectF overline(line);
+        overline.translate(0.0, -ascent);
+        appendChildNode(new QSGSimpleRectNode(overline, color));
+    }
+
+    if (hasStrikeOut) {
+        QRectF strikeOut(line);
+        strikeOut.translate(0.0, ascent / -3.0);
+        appendChildNode(new QSGSimpleRectNode(strikeOut, color));
+    }
+}
+
+QSGGlyphNode *QSGTextNode::addGlyphs(const QPointF &position, const QGlyphs &glyphs, const QColor &color,
+                                           QSGText::TextStyle style, const QColor &styleColor)
+{
+    QSGGlyphNode *node = m_context->createGlyphNode();
+    if (QSGDistanceFieldGlyphCache::distanceFieldEnabled()) {
+        QSGDistanceFieldGlyphNode *dfNode = static_cast<QSGDistanceFieldGlyphNode *>(node);
+        dfNode->setStyle(style);
+        dfNode->setStyleColor(styleColor);
+    }
+    node->setGlyphs(position, glyphs);
+    node->setColor(color);
+
+    appendChildNode(node);
+
+    return node;
+}
+
+void QSGTextNode::addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &color,
+                                  QSGText::TextStyle style, const QColor &styleColor)
+{
+    Q_UNUSED(position)
+    QTextFrame *textFrame = textDocument->rootFrame();
+    QPointF p = textDocument->documentLayout()->frameBoundingRect(textFrame).topLeft();
+
+    QTextFrame::iterator it = textFrame->begin();
+    while (!it.atEnd()) {
+        addTextBlock(p, textDocument, it.currentBlock(), color, style, styleColor);
+        ++it;
+    }
+}
+
+void QSGTextNode::addTextLayout(const QPointF &position, QTextLayout *textLayout, const QColor &color,
+                                QSGText::TextStyle style, const QColor &styleColor)
+{
+    QList<QGlyphs> glyphsList(textLayout->glyphs());
+    for (int i=0; i<glyphsList.size(); ++i)
+        addGlyphs(position, glyphsList.at(i), color, style, styleColor);
+
+    QFont font = textLayout->font();
+    QRawFont rawFont = QRawFont::fromFont(font);
+    if (font.strikeOut() || font.underline() || font.overline()) {
+        addTextDecorations(position, rawFont, color, textLayout->boundingRect().width(),
+                           font.overline(), font.strikeOut(), font.underline());
+    }
+}
+
+
+/*!
+  Returns true if \a text contains any HTML tags, attributes or CSS properties which are unrelated
+   to text, fonts or text layout. Otherwise the function returns false. If the return value is
+  false, \a text is considered to be easily representable in the scenegraph. If it returns true,
+  then the text should be prerendered into a pixmap before it's displayed on screen.
+*/
+bool QSGTextNode::isComplexRichText(QTextDocument *doc)
+{
+    if (doc == 0)
+        return false;
+
+    static QSet<QString> supportedTags;
+    if (supportedTags.isEmpty()) {
+        supportedTags.insert(QLatin1String("i"));
+        supportedTags.insert(QLatin1String("b"));
+        supportedTags.insert(QLatin1String("u"));
+        supportedTags.insert(QLatin1String("div"));
+        supportedTags.insert(QLatin1String("big"));
+        supportedTags.insert(QLatin1String("blockquote"));
+        supportedTags.insert(QLatin1String("body"));
+        supportedTags.insert(QLatin1String("br"));
+        supportedTags.insert(QLatin1String("center"));
+        supportedTags.insert(QLatin1String("cite"));
+        supportedTags.insert(QLatin1String("code"));
+        supportedTags.insert(QLatin1String("tt"));
+        supportedTags.insert(QLatin1String("dd"));
+        supportedTags.insert(QLatin1String("dfn"));
+        supportedTags.insert(QLatin1String("em"));
+        supportedTags.insert(QLatin1String("font"));
+        supportedTags.insert(QLatin1String("h1"));
+        supportedTags.insert(QLatin1String("h2"));
+        supportedTags.insert(QLatin1String("h3"));
+        supportedTags.insert(QLatin1String("h4"));
+        supportedTags.insert(QLatin1String("h5"));
+        supportedTags.insert(QLatin1String("h6"));
+        supportedTags.insert(QLatin1String("head"));
+        supportedTags.insert(QLatin1String("html"));
+        supportedTags.insert(QLatin1String("meta"));
+        supportedTags.insert(QLatin1String("nobr"));
+        supportedTags.insert(QLatin1String("p"));
+        supportedTags.insert(QLatin1String("pre"));
+        supportedTags.insert(QLatin1String("qt"));
+        supportedTags.insert(QLatin1String("s"));
+        supportedTags.insert(QLatin1String("samp"));
+        supportedTags.insert(QLatin1String("small"));
+        supportedTags.insert(QLatin1String("span"));
+        supportedTags.insert(QLatin1String("strong"));
+        supportedTags.insert(QLatin1String("sub"));
+        supportedTags.insert(QLatin1String("sup"));
+        supportedTags.insert(QLatin1String("title"));
+        supportedTags.insert(QLatin1String("var"));
+        supportedTags.insert(QLatin1String("style"));
+    }
+
+    static QSet<QCss::Property> supportedCssProperties;
+    if (supportedCssProperties.isEmpty()) {
+        supportedCssProperties.insert(QCss::Color);
+        supportedCssProperties.insert(QCss::Float);
+        supportedCssProperties.insert(QCss::Font);
+        supportedCssProperties.insert(QCss::FontFamily);
+        supportedCssProperties.insert(QCss::FontSize);
+        supportedCssProperties.insert(QCss::FontStyle);
+        supportedCssProperties.insert(QCss::FontWeight);
+        supportedCssProperties.insert(QCss::Margin);
+        supportedCssProperties.insert(QCss::MarginBottom);
+        supportedCssProperties.insert(QCss::MarginLeft);
+        supportedCssProperties.insert(QCss::MarginRight);
+        supportedCssProperties.insert(QCss::MarginTop);
+        supportedCssProperties.insert(QCss::TextDecoration);
+        supportedCssProperties.insert(QCss::TextIndent);
+        supportedCssProperties.insert(QCss::TextUnderlineStyle);
+        supportedCssProperties.insert(QCss::VerticalAlignment);
+        supportedCssProperties.insert(QCss::Whitespace);
+        supportedCssProperties.insert(QCss::Padding);
+        supportedCssProperties.insert(QCss::PaddingLeft);
+        supportedCssProperties.insert(QCss::PaddingRight);
+        supportedCssProperties.insert(QCss::PaddingTop);
+        supportedCssProperties.insert(QCss::PaddingBottom);
+        supportedCssProperties.insert(QCss::PageBreakBefore);
+        supportedCssProperties.insert(QCss::PageBreakAfter);
+        supportedCssProperties.insert(QCss::Width);
+        supportedCssProperties.insert(QCss::Height);
+        supportedCssProperties.insert(QCss::MinimumWidth);
+        supportedCssProperties.insert(QCss::MinimumHeight);
+        supportedCssProperties.insert(QCss::MaximumWidth);
+        supportedCssProperties.insert(QCss::MaximumHeight);
+        supportedCssProperties.insert(QCss::Left);
+        supportedCssProperties.insert(QCss::Right);
+        supportedCssProperties.insert(QCss::Top);
+        supportedCssProperties.insert(QCss::Bottom);
+        supportedCssProperties.insert(QCss::Position);
+        supportedCssProperties.insert(QCss::TextAlignment);
+        supportedCssProperties.insert(QCss::FontVariant);
+    }
+
+    QXmlStreamReader reader(doc->toHtml("utf-8"));
+    while (!reader.atEnd()) {
+        reader.readNext();
+
+        if (reader.isStartElement()) {
+            if (!supportedTags.contains(reader.name().toString().toLower()))
+                return true;
+
+            QXmlStreamAttributes attributes = reader.attributes();
+            if (attributes.hasAttribute(QLatin1String("bgcolor")))
+                return true;
+            if (attributes.hasAttribute(QLatin1String("style"))) {
+                QCss::StyleSheet styleSheet;
+                QCss::Parser(attributes.value(QLatin1String("style")).toString()).parse(&styleSheet);
+
+                QVector<QCss::Declaration> decls;
+                for (int i=0; i<styleSheet.pageRules.size(); ++i)
+                    decls += styleSheet.pageRules.at(i).declarations;
+
+                QVector<QCss::StyleRule> styleRules =
+                        styleSheet.styleRules
+                        + styleSheet.idIndex.values().toVector()
+                        + styleSheet.nameIndex.values().toVector();
+                for (int i=0; i<styleSheet.mediaRules.size(); ++i)
+                    styleRules += styleSheet.mediaRules.at(i).styleRules;
+
+                for (int i=0; i<styleRules.size(); ++i)
+                    decls += styleRules.at(i).declarations;
+
+                for (int i=0; i<decls.size(); ++i) {
+                    if (!supportedCssProperties.contains(decls.at(i).d->propertyId))
+                        return true;
+                }
+
+            }
+        }
+    }
+
+    return reader.hasError();
+}
+
+void QSGTextNode::addTextBlock(const QPointF &position, QTextDocument *textDocument, const QTextBlock &block,
+                               const QColor &overrideColor, QSGText::TextStyle style, const QColor &styleColor)
+{
+    if (!block.isValid())
+        return;
+
+    QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft();
+
+    QTextBlock::iterator it = block.begin();
+    while (!it.atEnd()) {
+        QTextFragment fragment = it.fragment();
+        if (!fragment.text().isEmpty()) {
+            QTextCharFormat charFormat = fragment.charFormat();
+            QColor color = overrideColor.isValid()
+                    ? overrideColor
+                    : charFormat.foreground().color();
+
+            QFontMetricsF fm(fragment.charFormat().font());
+            QPointF ascent(0, fm.ascent());
+
+            QList<QGlyphs> glyphsList = fragment.glyphs();
+            for (int i=0; i<glyphsList.size(); ++i) {
+                QGlyphs glyphs = glyphsList.at(i);
+                QSGGlyphNode *glyphNode = addGlyphs(position + blockPosition + ascent, glyphs,
+                                                          color, style, styleColor);
+
+                QRawFont font = glyphs.font();
+                QPointF baseLine = glyphNode->baseLine();
+                qreal width = glyphNode->boundingRect().width();
+                addTextDecorations(baseLine, font, color, width,
+                                   glyphs.overline(), glyphs.strikeOut(), glyphs.underline());
+            }
+        }
+
+        ++it;
+    }
+}
+
+void QSGTextNode::deleteContent()
+{
+    while (childCount() > 0)
+        delete childAtIndex(0);
+}
+
+#if 0
+void QSGTextNode::updateNodes()
+{
+    return;
+    deleteContent();
+    if (m_text.isEmpty())
+        return;
+
+    if (m_usePixmapCache) {
+        // ### gunnar: port properly
+//        QPixmap pixmap = generatedPixmap();
+//        if (pixmap.isNull())
+//            return;
+
+//        QSGImageNode *pixmapNode = m_context->createImageNode();
+//        pixmapNode->setRect(pixmap.rect());
+//        pixmapNode->setSourceRect(pixmap.rect());
+//        pixmapNode->setOpacity(m_opacity);
+//        pixmapNode->setClampToEdge(true);
+//        pixmapNode->setLinearFiltering(m_linearFiltering);
+
+//        appendChildNode(pixmapNode);
+    } else {
+        if (m_text.isEmpty())
+            return;
+
+        // Implement styling by drawing text several times at slight shifts. shiftForStyle
+        // contains the sequence of shifted positions at which to draw the text. All except
+        // the last will be drawn with styleColor.
+        QList<QPointF> shiftForStyle;
+        switch (m_textStyle) {
+        case OutlineTextStyle:
+            // ### Should be made faster by implementing outline material
+            shiftForStyle << QPointF(-1, 0);
+            shiftForStyle << QPointF(0, -1);
+            shiftForStyle << QPointF(1, 0);
+            shiftForStyle << QPointF(0, 1);
+            break;
+        case SunkenTextStyle:
+            shiftForStyle << QPointF(0, -1);
+            break;
+        case RaisedTextStyle:
+            shiftForStyle << QPointF(0, 1);
+            break;
+        default:
+            break;
+        }
+
+        shiftForStyle << QPointF(0, 0); // Regular position
+        while (!shiftForStyle.isEmpty()) {
+            QPointF shift = shiftForStyle.takeFirst();
+
+            // Use styleColor for all but last shift
+            if (m_richText) {
+                QColor overrideColor = shiftForStyle.isEmpty() ? QColor() : m_styleColor;
+
+                QTextFrame *textFrame = m_textDocument->rootFrame();
+                QPointF p = m_textDocument->documentLayout()->frameBoundingRect(textFrame).topLeft();
+
+                QTextFrame::iterator it = textFrame->begin();
+                while (!it.atEnd()) {
+                    addTextBlock(shift + p, it.currentBlock(), overrideColor);
+                    ++it;
+                }
+            } else {
+                addTextLayout(shift, m_textLayout, shiftForStyle.isEmpty()
+                                                   ? m_color
+                                                   : m_styleColor);
+            }
+        }
+    }
+}
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgtextnode_p.h b/src/declarative/items/qsgtextnode_p.h
new file mode 100644
index 0000000000..e7bd95faee
--- /dev/null
+++ b/src/declarative/items/qsgtextnode_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTNODE_P_H
+#define QSGTEXTNODE_P_H
+
+#include <qsgnode.h>
+#include <qsgtext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTextLayout;
+class QSGGlyphNode;
+class QTextBlock;
+class QColor;
+class QTextDocument;
+class QSGContext;
+class QRawFont;
+
+class QSGTextNode : public QSGTransformNode
+{
+public:
+    QSGTextNode(QSGContext *);
+    ~QSGTextNode();
+
+    static bool isComplexRichText(QTextDocument *);
+
+    void deleteContent();
+    void addTextLayout(const QPointF &position, QTextLayout *textLayout, const QColor &color = QColor(),
+                       QSGText::TextStyle style = QSGText::Normal, const QColor &styleColor = QColor());
+    void addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &color = QColor(),
+                         QSGText::TextStyle style = QSGText::Normal, const QColor &styleColor = QColor());
+
+private:
+    void addTextBlock(const QPointF &position, QTextDocument *textDocument, const QTextBlock &block,
+                      const QColor &overrideColor, QSGText::TextStyle style = QSGText::Normal, const QColor &styleColor = QColor());
+    QSGGlyphNode *addGlyphs(const QPointF &position, const QGlyphs &glyphs, const QColor &color,
+                                  QSGText::TextStyle style = QSGText::Normal, const QColor &styleColor = QColor());
+    void addTextDecorations(const QPointF &position, const QRawFont &font, const QColor &color,
+                            qreal width, bool hasOverline, bool hasStrikeOut, bool hasUnderline);
+    QSGContext *m_context;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGTEXTNODE_P_H
diff --git a/src/declarative/items/qsgtranslate.cpp b/src/declarative/items/qsgtranslate.cpp
new file mode 100644
index 0000000000..5f7112bd42
--- /dev/null
+++ b/src/declarative/items/qsgtranslate.cpp
@@ -0,0 +1,297 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtranslate_p.h"
+#include "qsgitem_p.h"
+
+#include <QtCore/qmath.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGTranslatePrivate : public QSGTransformPrivate
+{
+public:
+    QSGTranslatePrivate()
+    : x(0), y(0) {}
+
+    qreal x;
+    qreal y;
+};
+
+QSGTranslate::QSGTranslate(QObject *parent)
+: QSGTransform(*new QSGTranslatePrivate, parent)
+{
+}
+
+QSGTranslate::~QSGTranslate()
+{
+}
+
+qreal QSGTranslate::x() const
+{
+    Q_D(const QSGTranslate);
+    return d->x;
+}
+
+void QSGTranslate::setX(qreal x)
+{
+    Q_D(QSGTranslate);
+    if (d->x == x)
+        return;
+    d->x = x;
+    update();
+    emit xChanged();
+}
+
+qreal QSGTranslate::y() const
+{
+    Q_D(const QSGTranslate);
+    return d->y;
+}
+void QSGTranslate::setY(qreal y)
+{
+    Q_D(QSGTranslate);
+    if (d->y == y)
+        return;
+    d->y = y;
+    update();
+    emit yChanged();
+}
+
+void QSGTranslate::applyTo(QMatrix4x4 *matrix) const
+{
+    Q_D(const QSGTranslate);
+    matrix->translate(d->x, d->y, 0);
+}
+
+class QSGScalePrivate : public QSGTransformPrivate
+{
+public:
+    QSGScalePrivate()
+        : xScale(1), yScale(1), zScale(1) {}
+    QVector3D origin;
+    qreal xScale;
+    qreal yScale;
+    qreal zScale;
+};
+
+QSGScale::QSGScale(QObject *parent)
+    : QSGTransform(*new QSGScalePrivate, parent)
+{
+}
+
+QSGScale::~QSGScale()
+{
+}
+
+QVector3D QSGScale::origin() const
+{
+    Q_D(const QSGScale);
+    return d->origin;
+}
+void QSGScale::setOrigin(const QVector3D &point)
+{
+    Q_D(QSGScale);
+    if (d->origin == point)
+        return;
+    d->origin = point;
+    update();
+    emit originChanged();
+}
+
+qreal QSGScale::xScale() const
+{
+    Q_D(const QSGScale);
+    return d->xScale;
+}
+void QSGScale::setXScale(qreal scale)
+{
+    Q_D(QSGScale);
+    if (d->xScale == scale)
+        return;
+    d->xScale = scale;
+    update();
+    emit xScaleChanged();
+    emit scaleChanged();
+}
+
+qreal QSGScale::yScale() const
+{
+    Q_D(const QSGScale);
+    return d->yScale;
+}
+void QSGScale::setYScale(qreal scale)
+{
+    Q_D(QSGScale);
+    if (d->yScale == scale)
+        return;
+    d->yScale = scale;
+    update();
+    emit yScaleChanged();
+    emit scaleChanged();
+}
+
+qreal QSGScale::zScale() const
+{
+    Q_D(const QSGScale);
+    return d->zScale;
+}
+void QSGScale::setZScale(qreal scale)
+{
+    Q_D(QSGScale);
+    if (d->zScale == scale)
+        return;
+    d->zScale = scale;
+    update();
+    emit zScaleChanged();
+    emit scaleChanged();
+}
+
+void QSGScale::applyTo(QMatrix4x4 *matrix) const
+{
+    Q_D(const QSGScale);
+    matrix->translate(d->origin);
+    matrix->scale(d->xScale, d->yScale, d->zScale);
+    matrix->translate(-d->origin);
+}
+
+class QSGRotationPrivate : public QSGTransformPrivate
+{
+public:
+    QSGRotationPrivate()
+        : angle(0), axis(0, 0, 1) {}
+    QVector3D origin;
+    qreal angle;
+    QVector3D axis;
+};
+
+QSGRotation::QSGRotation(QObject *parent)
+    : QSGTransform(*new QSGRotationPrivate, parent)
+{
+}
+
+QSGRotation::~QSGRotation()
+{
+}
+
+QVector3D QSGRotation::origin() const
+{
+    Q_D(const QSGRotation);
+    return d->origin;
+}
+
+void QSGRotation::setOrigin(const QVector3D &point)
+{
+    Q_D(QSGRotation);
+    if (d->origin == point)
+        return;
+    d->origin = point;
+    update();
+    emit originChanged();
+}
+
+qreal QSGRotation::angle() const
+{
+    Q_D(const QSGRotation);
+    return d->angle;
+}
+void QSGRotation::setAngle(qreal angle)
+{
+    Q_D(QSGRotation);
+    if (d->angle == angle)
+        return;
+    d->angle = angle;
+    update();
+    emit angleChanged();
+}
+
+QVector3D QSGRotation::axis() const
+{
+    Q_D(const QSGRotation);
+    return d->axis;
+}
+void QSGRotation::setAxis(const QVector3D &axis)
+{
+    Q_D(QSGRotation);
+    if (d->axis == axis)
+         return;
+    d->axis = axis;
+    update();
+    emit axisChanged();
+}
+
+void QSGRotation::setAxis(Qt::Axis axis)
+{
+    switch (axis)
+    {
+    case Qt::XAxis:
+        setAxis(QVector3D(1, 0, 0));
+        break;
+    case Qt::YAxis:
+        setAxis(QVector3D(0, 1, 0));
+        break;
+    case Qt::ZAxis:
+        setAxis(QVector3D(0, 0, 1));
+        break;
+    }
+}
+
+struct QGraphicsRotation {
+    static inline void projectedRotate(QMatrix4x4 *matrix, qreal angle, qreal x, qreal y, qreal z)
+    {
+        matrix->projectedRotate(angle, x, y, z);
+    }
+};
+
+void QSGRotation::applyTo(QMatrix4x4 *matrix) const
+{
+    Q_D(const QSGRotation);
+
+    if (d->angle == 0. || d->axis.isNull())
+        return;
+
+    matrix->translate(d->origin);
+    QGraphicsRotation::projectedRotate(matrix, d->angle, d->axis.x(), d->axis.y(), d->axis.z());
+    matrix->translate(-d->origin);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgtranslate_p.h b/src/declarative/items/qsgtranslate_p.h
new file mode 100644
index 0000000000..de05778b1e
--- /dev/null
+++ b/src/declarative/items/qsgtranslate_p.h
@@ -0,0 +1,162 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTRANSLATE_P_H
+#define QSGTRANSLATE_P_H
+
+#include "qsgitem.h"
+
+#include <QtGui/qmatrix4x4.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGTranslatePrivate;
+class Q_AUTOTEST_EXPORT QSGTranslate : public QSGTransform
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
+
+public:
+    QSGTranslate(QObject *parent = 0);
+    ~QSGTranslate();
+
+    qreal x() const;
+    void setX(qreal);
+
+    qreal y() const;
+    void setY(qreal);
+
+    void applyTo(QMatrix4x4 *matrix) const;
+
+Q_SIGNALS:
+    void xChanged();
+    void yChanged();
+
+private:
+    Q_DECLARE_PRIVATE(QSGTranslate)
+    Q_DISABLE_COPY(QSGTranslate)
+};
+
+class QSGScalePrivate;
+class Q_AUTOTEST_EXPORT QSGScale : public QSGTransform
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QVector3D origin READ origin WRITE setOrigin NOTIFY originChanged)
+    Q_PROPERTY(qreal xScale READ xScale WRITE setXScale NOTIFY xScaleChanged)
+    Q_PROPERTY(qreal yScale READ yScale WRITE setYScale NOTIFY yScaleChanged)
+    Q_PROPERTY(qreal zScale READ zScale WRITE setZScale NOTIFY zScaleChanged)
+public:
+    QSGScale(QObject *parent = 0);
+    ~QSGScale();
+
+    QVector3D origin() const;
+    void setOrigin(const QVector3D &point);
+
+    qreal xScale() const;
+    void setXScale(qreal);
+
+    qreal yScale() const;
+    void setYScale(qreal);
+
+    qreal zScale() const;
+    void setZScale(qreal);
+
+    void applyTo(QMatrix4x4 *matrix) const;
+
+Q_SIGNALS:
+    void originChanged();
+    void xScaleChanged();
+    void yScaleChanged();
+    void zScaleChanged();
+    void scaleChanged();
+
+private:
+    Q_DECLARE_PRIVATE(QSGScale)
+};
+
+class QSGRotationPrivate;
+class Q_AUTOTEST_EXPORT QSGRotation : public QSGTransform
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QVector3D origin READ origin WRITE setOrigin NOTIFY originChanged)
+    Q_PROPERTY(qreal angle READ angle WRITE setAngle NOTIFY angleChanged)
+    Q_PROPERTY(QVector3D axis READ axis WRITE setAxis NOTIFY axisChanged)
+public:
+    QSGRotation(QObject *parent = 0);
+    ~QSGRotation();
+
+    QVector3D origin() const;
+    void setOrigin(const QVector3D &point);
+
+    qreal angle() const;
+    void setAngle(qreal);
+
+    QVector3D axis() const;
+    void setAxis(const QVector3D &axis);
+    void setAxis(Qt::Axis axis);
+
+    void applyTo(QMatrix4x4 *matrix) const;
+
+Q_SIGNALS:
+    void originChanged();
+    void angleChanged();
+    void axisChanged();
+
+private:
+    Q_DECLARE_PRIVATE(QSGRotation)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGTranslate)
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/items/qsgview.cpp b/src/declarative/items/qsgview.cpp
new file mode 100644
index 0000000000..1169c59a1b
--- /dev/null
+++ b/src/declarative/items/qsgview.cpp
@@ -0,0 +1,466 @@
+// Commit: 55c4d94dfea78951f3371d3697a3cb28539b3012
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgview.h"
+
+#include "qsgcanvas_p.h"
+#include "qsgitem_p.h"
+#include "qsgitemchangelistener_p.h"
+
+#include <private/qdeclarativedebugtrace_p.h>
+
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <private/qdeclarativeengine_p.h>
+#include <QtCore/qbasictimer.h>
+
+// XXX todo - This whole class should probably be merged with QDeclarativeView for 
+// maximum seamlessness
+QT_BEGIN_NAMESPACE
+
+DEFINE_BOOL_CONFIG_OPTION(frameRateDebug, QML_SHOW_FRAMERATE)
+
+class QSGViewPrivate : public QSGCanvasPrivate, 
+                       public QSGItemChangeListener
+{
+    Q_DECLARE_PUBLIC(QSGView)
+public:
+    QSGViewPrivate();
+    ~QSGViewPrivate();
+
+    void execute();
+    void itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
+    void initResize();
+    void updateSize();
+    void setRootObject(QObject *);
+
+    void init();
+
+    QSize rootObjectSize() const;
+
+    QPointer<QSGItem> root;
+
+    QUrl source;
+
+    QDeclarativeEngine engine;
+    QDeclarativeComponent *component;
+    QBasicTimer resizetimer;
+
+    QSGView::ResizeMode resizeMode;
+    QSize initialSize;
+    QElapsedTimer frameTimer;
+};
+
+void QSGViewPrivate::init()
+{
+    q_func()->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
+    QDeclarativeEnginePrivate::get(&engine)->sgContext = QSGCanvasPrivate::context;
+}
+
+QSGViewPrivate::QSGViewPrivate()
+: root(0), component(0), resizeMode(QSGView::SizeViewToRootObject), initialSize(0,0) 
+{
+}
+
+QSGViewPrivate::~QSGViewPrivate() 
+{ 
+    delete root; 
+}
+
+void QSGViewPrivate::execute()
+{
+    Q_Q(QSGView);
+    if (root) {
+        delete root;
+        root = 0;
+    }
+    if (component) {
+        delete component;
+        component = 0;
+    }
+    if (!source.isEmpty()) {
+        component = new QDeclarativeComponent(&engine, source, q);
+        if (!component->isLoading()) {
+            q->continueExecute();
+        } else {
+            QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), 
+                             q, SLOT(continueExecute()));
+        }
+    }
+}
+
+void QSGViewPrivate::itemGeometryChanged(QSGItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+    Q_Q(QSGView);
+    if (resizeItem == root && resizeMode == QSGView::SizeViewToRootObject) {
+        // wait for both width and height to be changed
+        resizetimer.start(0,q);
+    }
+    QSGItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
+}
+
+QSGView::QSGView(QWidget *parent, Qt::WindowFlags f)
+: QSGCanvas(*(new QSGViewPrivate), parent, f)
+{
+    d_func()->init();
+}
+
+QSGView::QSGView(const QGLFormat &format, QWidget *parent, Qt::WindowFlags f)
+: QSGCanvas(*(new QSGViewPrivate), format, parent, f)
+{
+    d_func()->init();
+}
+
+QSGView::QSGView(const QUrl &source, QWidget *parent, Qt::WindowFlags f)
+: QSGCanvas(*(new QSGViewPrivate), parent, f)
+{
+    d_func()->init();
+    setSource(source);
+}
+
+QSGView::QSGView(const QUrl &source, const QGLFormat &format, QWidget *parent, Qt::WindowFlags f)
+: QSGCanvas(*(new QSGViewPrivate), format, parent, f)
+{
+    d_func()->init();
+    setSource(source);
+}
+
+QSGView::~QSGView()
+{
+}
+
+void QSGView::setSource(const QUrl& url)
+{
+    Q_D(QSGView);
+    d->source = url;
+    d->execute();
+}
+
+QUrl QSGView::source() const
+{
+    Q_D(const QSGView);
+    return d->source;
+}
+
+QDeclarativeEngine* QSGView::engine() const
+{
+    Q_D(const QSGView);
+    return const_cast<QDeclarativeEngine *>(&d->engine);
+}
+
+QDeclarativeContext* QSGView::rootContext() const
+{
+    Q_D(const QSGView);
+    return d->engine.rootContext();
+}
+
+QSGView::Status QSGView::status() const
+{
+    Q_D(const QSGView);
+    if (!d->component)
+        return QSGView::Null;
+
+    return QSGView::Status(d->component->status());
+}
+
+QList<QDeclarativeError> QSGView::errors() const
+{
+    Q_D(const QSGView);
+    if (d->component)
+        return d->component->errors();
+    return QList<QDeclarativeError>();
+}
+
+void QSGView::setResizeMode(ResizeMode mode)
+{
+    Q_D(QSGView);
+    if (d->resizeMode == mode)
+        return;
+
+    if (d->root) {
+        if (d->resizeMode == SizeViewToRootObject) {
+            QSGItemPrivate *p = QSGItemPrivate::get(d->root);
+            p->removeItemChangeListener(d, QSGItemPrivate::Geometry);
+        }
+    }
+
+    d->resizeMode = mode;
+    if (d->root) {
+        d->initResize();
+    }
+}
+
+void QSGViewPrivate::initResize()
+{
+    if (root) {
+        if (resizeMode == QSGView::SizeViewToRootObject) {
+            QSGItemPrivate *p = QSGItemPrivate::get(root);
+            p->addItemChangeListener(this, QSGItemPrivate::Geometry);
+        }
+    }
+    updateSize();
+}
+
+void QSGViewPrivate::updateSize()
+{
+    Q_Q(QSGView);
+    if (!root)
+        return;
+
+    if (resizeMode == QSGView::SizeViewToRootObject) {
+        QSize newSize = QSize(root->width(), root->height());
+        if (newSize.isValid() && newSize != q->size()) {
+            q->resize(newSize);
+        }
+    } else if (resizeMode == QSGView::SizeRootObjectToView) {
+        if (!qFuzzyCompare(q->width(), root->width()))
+            root->setWidth(q->width());
+        if (!qFuzzyCompare(q->height(), root->height()))
+            root->setHeight(q->height());
+    }
+
+    q->updateGeometry();
+}
+
+QSize QSGViewPrivate::rootObjectSize() const
+{
+    QSize rootObjectSize(0,0);
+    int widthCandidate = -1;
+    int heightCandidate = -1;
+    if (root) {
+        widthCandidate = root->width();
+        heightCandidate = root->height();
+    }
+    if (widthCandidate > 0) {
+        rootObjectSize.setWidth(widthCandidate);
+    }
+    if (heightCandidate > 0) {
+        rootObjectSize.setHeight(heightCandidate);
+    }
+    return rootObjectSize;
+}
+
+QSGView::ResizeMode QSGView::resizeMode() const
+{
+    Q_D(const QSGView);
+    return d->resizeMode;
+}
+
+/*!
+  \internal
+ */
+void QSGView::continueExecute()
+{
+    Q_D(QSGView);
+    disconnect(d->component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), this, SLOT(continueExecute()));
+
+    if (d->component->isError()) {
+        QList<QDeclarativeError> errorList = d->component->errors();
+        foreach (const QDeclarativeError &error, errorList) {
+            qWarning() << error;
+        }
+        emit statusChanged(status());
+        return;
+    }
+
+    QObject *obj = d->component->create();
+
+    if(d->component->isError()) {
+        QList<QDeclarativeError> errorList = d->component->errors();
+        foreach (const QDeclarativeError &error, errorList) {
+            qWarning() << error;
+        }
+        emit statusChanged(status());
+        return;
+    }
+
+    d->setRootObject(obj);
+    emit statusChanged(status());
+}
+
+
+/*!
+  \internal
+*/
+void QSGViewPrivate::setRootObject(QObject *obj)
+{
+    Q_Q(QSGView);
+    if (root == obj)
+        return;
+    if (QSGItem *sgItem = qobject_cast<QSGItem *>(obj)) {
+        root = sgItem;
+        sgItem->setParentItem(q->QSGCanvas::rootItem());
+    } else {
+        qWarning() << "QSGView only supports loading of root objects that derive from QSGItem." << endl
+                   << endl
+                   << "If your example is using QML 2, (such as qmlscene) and the .qml file you" << endl
+                   << "loaded has 'import QtQuick 1.0' or 'import Qt 4.7', this error will occur." << endl
+                   << endl
+                   << "To load files with 'import QtQuick 1.0' with QML 2, specify:" << endl
+                   << "  QMLSCENE_IMPORT_NAME=quick1" << endl
+                   << "on as an environment variable prior to launching the application." << endl
+                   << endl
+                   << "To load files with 'import Qt 4.7' with QML 2, specify:" << endl
+                   << "  QMLSCENE_IMPORT_NAME=qt" << endl
+                   << "on as an environment variable prior to launching the application." << endl;
+        delete obj;
+        root = 0;
+    }
+
+    if (root) {
+        initialSize = rootObjectSize();
+        if (initialSize != q->size()) {
+            if (!(q->parentWidget() && q->parentWidget()->layout())) {
+                q->resize(initialSize);
+            }
+        }
+        initResize();
+    }
+}
+
+/*!
+  \internal
+  If the \l {QTimerEvent} {timer event} \a e is this
+  view's resize timer, sceneResized() is emitted.
+ */
+void QSGView::timerEvent(QTimerEvent* e)
+{
+    Q_D(QSGView);
+    if (!e || e->timerId() == d->resizetimer.timerId()) {
+        d->updateSize();
+        d->resizetimer.stop();
+    }
+}
+
+/*!
+    \internal
+    Preferred size follows the root object geometry.
+*/
+QSize QSGView::sizeHint() const
+{
+    Q_D(const QSGView);
+    QSize rootObjectSize = d->rootObjectSize();
+    if (rootObjectSize.isEmpty()) {
+        return size();
+    } else {
+        return rootObjectSize;
+    }
+}
+
+QSize QSGView::initialSize() const
+{
+    Q_D(const QSGView);
+    return d->initialSize;
+}
+
+QSGItem *QSGView::rootObject() const
+{
+    Q_D(const QSGView);
+    return d->root;
+}
+
+/*!
+  \internal
+  This function handles the \l {QResizeEvent} {resize event}
+  \a e.
+ */
+void QSGView::resizeEvent(QResizeEvent *e)
+{
+    Q_D(QSGView);
+    if (d->resizeMode == SizeRootObjectToView) 
+        d->updateSize();
+    
+    QSGCanvas::resizeEvent(e);
+}
+
+/*!
+    \internal
+*/
+void QSGView::paintEvent(QPaintEvent *event)
+{
+    Q_D(QSGView);
+    int time = 0;
+    if (frameRateDebug()) 
+        time = d->frameTimer.restart();
+
+    QSGCanvas::paintEvent(event);
+
+    if (frameRateDebug())
+        qDebug() << "paintEvent:" << d->frameTimer.elapsed() << "time since last frame:" << time;
+}
+
+void QSGView::keyPressEvent(QKeyEvent *e)
+{
+    QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Key);
+
+    QSGCanvas::keyPressEvent(e);
+}
+
+void QSGView::keyReleaseEvent(QKeyEvent *e)
+{
+    QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Key);
+
+    QSGCanvas::keyReleaseEvent(e);
+}
+
+void QSGView::mouseMoveEvent(QMouseEvent *e)
+{
+    QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
+
+    QSGCanvas::mouseMoveEvent(e);
+}
+
+void QSGView::mousePressEvent(QMouseEvent *e)
+{
+    QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
+
+    QSGCanvas::mousePressEvent(e);
+}
+
+void QSGView::mouseReleaseEvent(QMouseEvent *e)
+{
+    QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
+
+    QSGCanvas::mouseReleaseEvent(e);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/items/qsgview.h b/src/declarative/items/qsgview.h
new file mode 100644
index 0000000000..8e174b7170
--- /dev/null
+++ b/src/declarative/items/qsgview.h
@@ -0,0 +1,120 @@
+// Commit: 0b83a2161261be525f01359397ab1c8c34827749
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGVIEW_H
+#define QSGVIEW_H
+
+#include <QtCore/qurl.h>
+#include <qsgcanvas.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QDeclarativeEngine;
+class QDeclarativeContext;
+class QDeclarativeError;
+class QSGItem;
+
+class QSGViewPrivate;
+class Q_DECLARATIVE_EXPORT QSGView : public QSGCanvas
+{
+    Q_OBJECT
+    Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
+    Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+    Q_PROPERTY(QUrl source READ source WRITE setSource DESIGNABLE true)
+    Q_ENUMS(ResizeMode Status)
+public:
+    explicit QSGView(QWidget *parent = 0, Qt::WindowFlags f = 0);
+    explicit QSGView(const QGLFormat &format, QWidget *parent = 0, Qt::WindowFlags f = 0);
+    QSGView(const QUrl &source, QWidget *parent = 0, Qt::WindowFlags f = 0);
+    QSGView(const QUrl &source, const QGLFormat &format, QWidget *parent = 0, Qt::WindowFlags f = 0);
+    virtual ~QSGView();
+
+    QUrl source() const;
+    void setSource(const QUrl&);
+
+    QDeclarativeEngine* engine() const;
+    QDeclarativeContext* rootContext() const;
+
+    QSGItem *rootObject() const;
+
+    enum ResizeMode { SizeViewToRootObject, SizeRootObjectToView };
+    ResizeMode resizeMode() const;
+    void setResizeMode(ResizeMode);
+
+    enum Status { Null, Ready, Loading, Error };
+    Status status() const;
+
+    QList<QDeclarativeError> errors() const;
+
+    QSize sizeHint() const;
+    QSize initialSize() const;
+
+Q_SIGNALS:
+    void statusChanged(QSGView::Status);
+
+private Q_SLOTS:
+    void continueExecute();
+
+protected:
+    virtual void resizeEvent(QResizeEvent *);
+    virtual void paintEvent(QPaintEvent *event);
+    virtual void timerEvent(QTimerEvent*);
+
+    virtual void keyPressEvent(QKeyEvent *);
+    virtual void keyReleaseEvent(QKeyEvent *);
+    virtual void mousePressEvent(QMouseEvent *);
+    virtual void mouseReleaseEvent(QMouseEvent *);
+    virtual void mouseMoveEvent(QMouseEvent *);
+private:
+    Q_DISABLE_COPY(QSGView)
+    Q_DECLARE_PRIVATE(QSGView)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGVIEW_H
diff --git a/src/declarative/items/qsgvisualitemmodel.cpp b/src/declarative/items/qsgvisualitemmodel.cpp
new file mode 100644
index 0000000000..c7628b230e
--- /dev/null
+++ b/src/declarative/items/qsgvisualitemmodel.cpp
@@ -0,0 +1,1247 @@
+// Commit: 45153a37e4d9e39e8c326a0f33ea17be49bb29e2
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgvisualitemmodel_p.h"
+#include "qsgitem.h"
+
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/qdeclarativeinfo.h>
+
+#include <private/qdeclarativecontext_p.h>
+#include <private/qdeclarativepackage_p.h>
+#include <private/qdeclarativeopenmetaobject_p.h>
+#include <private/qdeclarativelistaccessor_p.h>
+#include <private/qdeclarativedata_p.h>
+#include <private/qdeclarativepropertycache_p.h>
+#include <private/qdeclarativeguard_p.h>
+#include <private/qdeclarativeglobal_p.h>
+#include <private/qlistmodelinterface_p.h>
+#include <private/qmetaobjectbuilder_p.h>
+#include <private/qobject_p.h>
+
+#include <QtCore/qhash.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+QHash<QObject*, QSGVisualItemModelAttached*> QSGVisualItemModelAttached::attachedProperties;
+
+
+class QSGVisualItemModelPrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QSGVisualItemModel)
+public:
+    QSGVisualItemModelPrivate() : QObjectPrivate() {}
+
+    static void children_append(QDeclarativeListProperty<QSGItem> *prop, QSGItem *item) {
+        QDeclarative_setParent_noEvent(item, prop->object);
+        static_cast<QSGVisualItemModelPrivate *>(prop->data)->children.append(Item(item));
+        static_cast<QSGVisualItemModelPrivate *>(prop->data)->itemAppended();
+        static_cast<QSGVisualItemModelPrivate *>(prop->data)->emitChildrenChanged();
+    }
+
+    static int children_count(QDeclarativeListProperty<QSGItem> *prop) {
+        return static_cast<QSGVisualItemModelPrivate *>(prop->data)->children.count();
+    }
+
+    static QSGItem *children_at(QDeclarativeListProperty<QSGItem> *prop, int index) {
+        return static_cast<QSGVisualItemModelPrivate *>(prop->data)->children.at(index).item;
+    }
+
+    void itemAppended() {
+        Q_Q(QSGVisualItemModel);
+        QSGVisualItemModelAttached *attached = QSGVisualItemModelAttached::properties(children.last().item);
+        attached->setIndex(children.count()-1);
+        emit q->itemsInserted(children.count()-1, 1);
+        emit q->countChanged();
+    }
+
+    void emitChildrenChanged() {
+        Q_Q(QSGVisualItemModel);
+        emit q->childrenChanged();
+    }
+
+    int indexOf(QSGItem *item) const {
+        for (int i = 0; i < children.count(); ++i)
+            if (children.at(i).item == item)
+                return i;
+        return -1;
+    }
+
+    class Item {
+    public:
+        Item(QSGItem *i) : item(i), ref(0) {}
+
+        void addRef() { ++ref; }
+        bool deref() { return --ref == 0; }
+
+        QSGItem *item;
+        int ref;
+    };
+
+    QList<Item> children;
+};
+
+QSGVisualItemModel::QSGVisualItemModel(QObject *parent)
+    : QSGVisualModel(*(new QSGVisualItemModelPrivate), parent)
+{
+}
+
+QDeclarativeListProperty<QSGItem> QSGVisualItemModel::children()
+{
+    Q_D(QSGVisualItemModel);
+    return QDeclarativeListProperty<QSGItem>(this, d, d->children_append,
+                                                      d->children_count, d->children_at);
+}
+
+int QSGVisualItemModel::count() const
+{
+    Q_D(const QSGVisualItemModel);
+    return d->children.count();
+}
+
+bool QSGVisualItemModel::isValid() const
+{
+    return true;
+}
+
+QSGItem *QSGVisualItemModel::item(int index, bool)
+{
+    Q_D(QSGVisualItemModel);
+    QSGVisualItemModelPrivate::Item &item = d->children[index];
+    item.addRef();
+    return item.item;
+}
+
+QSGVisualModel::ReleaseFlags QSGVisualItemModel::release(QSGItem *item)
+{
+    Q_D(QSGVisualItemModel);
+    int idx = d->indexOf(item);
+    if (idx >= 0) {
+        if (d->children[idx].deref()) {
+            // XXX todo - the original did item->scene()->removeItem().  Why?
+            item->setParentItem(0);
+            QDeclarative_setParent_noEvent(item, this);
+        }
+    }
+    return 0;
+}
+
+bool QSGVisualItemModel::completePending() const
+{
+    return false;
+}
+
+void QSGVisualItemModel::completeItem()
+{
+    // Nothing to do
+}
+
+QString QSGVisualItemModel::stringValue(int index, const QString &name)
+{
+    Q_D(QSGVisualItemModel);
+    if (index < 0 || index >= d->children.count())
+        return QString();
+    return QDeclarativeEngine::contextForObject(d->children.at(index).item)->contextProperty(name).toString();
+}
+
+int QSGVisualItemModel::indexOf(QSGItem *item, QObject *) const
+{
+    Q_D(const QSGVisualItemModel);
+    return d->indexOf(item);
+}
+
+QSGVisualItemModelAttached *QSGVisualItemModel::qmlAttachedProperties(QObject *obj)
+{
+    return QSGVisualItemModelAttached::properties(obj);
+}
+
+//============================================================================
+
+class VDMDelegateDataType : public QDeclarativeOpenMetaObjectType
+{
+public:
+    VDMDelegateDataType(const QMetaObject *base, QDeclarativeEngine *engine) : QDeclarativeOpenMetaObjectType(base, engine) {}
+
+    void propertyCreated(int, QMetaPropertyBuilder &prop) {
+        prop.setWritable(false);
+    }
+};
+
+class QSGVisualDataModelParts;
+class QSGVisualDataModelData;
+class QSGVisualDataModelPrivate : public QObjectPrivate
+{
+public:
+    QSGVisualDataModelPrivate(QDeclarativeContext *);
+
+    static QSGVisualDataModelPrivate *get(QSGVisualDataModel *m) {
+        return static_cast<QSGVisualDataModelPrivate *>(QObjectPrivate::get(m));
+    }
+
+    QDeclarativeGuard<QListModelInterface> m_listModelInterface;
+    QDeclarativeGuard<QAbstractItemModel> m_abstractItemModel;
+    QDeclarativeGuard<QSGVisualDataModel> m_visualItemModel;
+    QString m_part;
+
+    QDeclarativeComponent *m_delegate;
+    QDeclarativeGuard<QDeclarativeContext> m_context;
+    QList<int> m_roles;
+    QHash<QByteArray,int> m_roleNames;
+    void ensureRoles() {
+        if (m_roleNames.isEmpty()) {
+            if (m_listModelInterface) {
+                m_roles = m_listModelInterface->roles();
+                for (int ii = 0; ii < m_roles.count(); ++ii)
+                    m_roleNames.insert(m_listModelInterface->toString(m_roles.at(ii)).toUtf8(), m_roles.at(ii));
+            } else if (m_abstractItemModel) {
+                for (QHash<int,QByteArray>::const_iterator it = m_abstractItemModel->roleNames().begin();
+                        it != m_abstractItemModel->roleNames().end(); ++it) {
+                    m_roles.append(it.key());
+                    m_roleNames.insert(*it, it.key());
+                }
+                if (m_roles.count())
+                    m_roleNames.insert("hasModelChildren", -1);
+            } else if (m_listAccessor) {
+                m_roleNames.insert("modelData", 0);
+                if (m_listAccessor->type() == QDeclarativeListAccessor::Instance) {
+                    if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
+                        int count = object->metaObject()->propertyCount();
+                        for (int ii = 1; ii < count; ++ii) {
+                            const QMetaProperty &prop = object->metaObject()->property(ii);
+                            m_roleNames.insert(prop.name(), 0);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    QHash<int,int> m_roleToPropId;
+    int m_modelDataPropId;
+    void createMetaData() {
+        if (!m_metaDataCreated) {
+            ensureRoles();
+            if (m_roleNames.count()) {
+                QHash<QByteArray, int>::const_iterator it = m_roleNames.begin();
+                while (it != m_roleNames.end()) {
+                    int propId = m_delegateDataType->createProperty(it.key()) - m_delegateDataType->propertyOffset();
+                    m_roleToPropId.insert(*it, propId);
+                    ++it;
+                }
+                // Add modelData property
+                if (m_roles.count() == 1)
+                    m_modelDataPropId = m_delegateDataType->createProperty("modelData") - m_delegateDataType->propertyOffset();
+                m_metaDataCreated = true;
+            }
+        }
+    }
+
+    struct ObjectRef {
+        ObjectRef(QObject *object=0) : obj(object), ref(1) {}
+        QObject *obj;
+        int ref;
+    };
+    class Cache : public QHash<int, ObjectRef> {
+    public:
+        QObject *getItem(int index) {
+            QObject *item = 0;
+            QHash<int,ObjectRef>::iterator it = find(index);
+            if (it != end()) {
+                (*it).ref++;
+                item = (*it).obj;
+            }
+            return item;
+        }
+        QObject *item(int index) {
+            QObject *item = 0;
+            QHash<int, ObjectRef>::const_iterator it = find(index);
+            if (it != end())
+                item = (*it).obj;
+            return item;
+        }
+        void insertItem(int index, QObject *obj) {
+            insert(index, ObjectRef(obj));
+        }
+        bool releaseItem(QObject *obj) {
+            QHash<int, ObjectRef>::iterator it = begin();
+            for (; it != end(); ++it) {
+                ObjectRef &objRef = *it;
+                if (objRef.obj == obj) {
+                    if (--objRef.ref == 0) {
+                        erase(it);
+                        return true;
+                    }
+                    break;
+                }
+            }
+            return false;
+        }
+    };
+
+    int modelCount() const {
+        if (m_visualItemModel)
+            return m_visualItemModel->count();
+        if (m_listModelInterface)
+            return m_listModelInterface->count();
+        if (m_abstractItemModel)
+            return m_abstractItemModel->rowCount(m_root);
+        if (m_listAccessor)
+            return m_listAccessor->count();
+        return 0;
+    }
+
+    Cache m_cache;
+    QHash<QObject *, QDeclarativePackage*> m_packaged;
+
+    QSGVisualDataModelParts *m_parts;
+    friend class QSGVisualItemParts;
+
+    VDMDelegateDataType *m_delegateDataType;
+    friend class QSGVisualDataModelData;
+    bool m_metaDataCreated : 1;
+    bool m_metaDataCacheable : 1;
+    bool m_delegateValidated : 1;
+    bool m_completePending : 1;
+
+    QSGVisualDataModelData *data(QObject *item);
+
+    QVariant m_modelVariant;
+    QDeclarativeListAccessor *m_listAccessor;
+
+    QModelIndex m_root;
+    QList<QByteArray> watchedRoles;
+    QList<int> watchedRoleIds;
+};
+
+class QSGVisualDataModelDataMetaObject : public QDeclarativeOpenMetaObject
+{
+public:
+    QSGVisualDataModelDataMetaObject(QObject *parent, QDeclarativeOpenMetaObjectType *type)
+    : QDeclarativeOpenMetaObject(parent, type) {}
+
+    virtual QVariant initialValue(int);
+    virtual int createProperty(const char *, const char *);
+
+private:
+    friend class QSGVisualDataModelData;
+};
+
+class QSGVisualDataModelData : public QObject
+{
+Q_OBJECT
+public:
+    QSGVisualDataModelData(int index, QSGVisualDataModel *model);
+    ~QSGVisualDataModelData();
+
+    Q_PROPERTY(int index READ index NOTIFY indexChanged)
+    int index() const;
+    void setIndex(int index);
+
+    int propForRole(int) const;
+    int modelDataPropertyId() const {
+        QSGVisualDataModelPrivate *model = QSGVisualDataModelPrivate::get(m_model);
+        return model->m_modelDataPropId;
+    }
+
+    void setValue(int, const QVariant &);
+    bool hasValue(int id) const {
+        return m_meta->hasValue(id);
+    }
+
+    void ensureProperties();
+
+Q_SIGNALS:
+    void indexChanged();
+
+private:
+    friend class QSGVisualDataModelDataMetaObject;
+    int m_index;
+    QDeclarativeGuard<QSGVisualDataModel> m_model;
+    QSGVisualDataModelDataMetaObject *m_meta;
+};
+
+int QSGVisualDataModelData::propForRole(int id) const
+{
+    QSGVisualDataModelPrivate *model = QSGVisualDataModelPrivate::get(m_model);
+    QHash<int,int>::const_iterator it = model->m_roleToPropId.find(id);
+    if (it != model->m_roleToPropId.end())
+        return *it;
+
+    return -1;
+}
+
+void QSGVisualDataModelData::setValue(int id, const QVariant &val)
+{
+    m_meta->setValue(id, val);
+}
+
+int QSGVisualDataModelDataMetaObject::createProperty(const char *name, const char *type)
+{
+    QSGVisualDataModelData *data =
+        static_cast<QSGVisualDataModelData *>(object());
+
+    if (!data->m_model)
+        return -1;
+
+    QSGVisualDataModelPrivate *model = QSGVisualDataModelPrivate::get(data->m_model);
+    if (data->m_index < 0 || data->m_index >= model->modelCount())
+        return -1;
+
+    if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
+        if (model->m_listAccessor->type() == QDeclarativeListAccessor::ListProperty) {
+            model->ensureRoles();
+            if (qstrcmp(name,"modelData") == 0)
+                return QDeclarativeOpenMetaObject::createProperty(name, type);
+        }
+    }
+    return -1;
+}
+
+QVariant QSGVisualDataModelDataMetaObject::initialValue(int propId)
+{
+    QSGVisualDataModelData *data =
+        static_cast<QSGVisualDataModelData *>(object());
+
+    Q_ASSERT(data->m_model);
+    QSGVisualDataModelPrivate *model = QSGVisualDataModelPrivate::get(data->m_model);
+
+    QByteArray propName = name(propId);
+    if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
+        if (propName == "modelData") {
+            if (model->m_listAccessor->type() == QDeclarativeListAccessor::Instance) {
+                QObject *object = model->m_listAccessor->at(0).value<QObject*>();
+                return object->metaObject()->property(1).read(object); // the first property after objectName
+            }
+            return model->m_listAccessor->at(data->m_index);
+        } else {
+            // return any property of a single object instance.
+            QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
+            return object->property(propName);
+        }
+    } else if (model->m_listModelInterface) {
+        model->ensureRoles();
+        QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
+        if (it != model->m_roleNames.end()) {
+            QVariant value = model->m_listModelInterface->data(data->m_index, *it);
+            return value;
+        } else if (model->m_roles.count() == 1 && propName == "modelData") {
+            //for compatibility with other lists, assign modelData if there is only a single role
+            QVariant value = model->m_listModelInterface->data(data->m_index, model->m_roles.first());
+            return value;
+        }
+    } else if (model->m_abstractItemModel) {
+        model->ensureRoles();
+        QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0, model->m_root);
+        if (propName == "hasModelChildren") {
+            return model->m_abstractItemModel->hasChildren(index);
+        } else {
+            QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
+            if (it != model->m_roleNames.end()) {
+                return model->m_abstractItemModel->data(index, *it);
+            } else if (model->m_roles.count() == 1 && propName == "modelData") {
+                //for compatibility with other lists, assign modelData if there is only a single role
+                return model->m_abstractItemModel->data(index, model->m_roles.first());
+            }
+        }
+    }
+    Q_ASSERT(!"Can never be reached");
+    return QVariant();
+}
+
+QSGVisualDataModelData::QSGVisualDataModelData(int index,
+                                               QSGVisualDataModel *model)
+: m_index(index), m_model(model),
+m_meta(new QSGVisualDataModelDataMetaObject(this, QSGVisualDataModelPrivate::get(model)->m_delegateDataType))
+{
+    ensureProperties();
+}
+
+QSGVisualDataModelData::~QSGVisualDataModelData()
+{
+}
+
+void QSGVisualDataModelData::ensureProperties()
+{
+    QSGVisualDataModelPrivate *modelPriv = QSGVisualDataModelPrivate::get(m_model);
+    if (modelPriv->m_metaDataCacheable) {
+        if (!modelPriv->m_metaDataCreated)
+            modelPriv->createMetaData();
+        if (modelPriv->m_metaDataCreated)
+            m_meta->setCached(true);
+    }
+}
+
+int QSGVisualDataModelData::index() const
+{
+    return m_index;
+}
+
+// This is internal only - it should not be set from qml
+void QSGVisualDataModelData::setIndex(int index)
+{
+    m_index = index;
+    emit indexChanged();
+}
+
+//---------------------------------------------------------------------------
+
+class QSGVisualDataModelPartsMetaObject : public QDeclarativeOpenMetaObject
+{
+public:
+    QSGVisualDataModelPartsMetaObject(QObject *parent)
+    : QDeclarativeOpenMetaObject(parent) {}
+
+    virtual void propertyCreated(int, QMetaPropertyBuilder &);
+    virtual QVariant initialValue(int);
+};
+
+class QSGVisualDataModelParts : public QObject
+{
+Q_OBJECT
+public:
+    QSGVisualDataModelParts(QSGVisualDataModel *parent);
+
+private:
+    friend class QSGVisualDataModelPartsMetaObject;
+    QSGVisualDataModel *model;
+};
+
+void QSGVisualDataModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
+{
+    prop.setWritable(false);
+}
+
+QVariant QSGVisualDataModelPartsMetaObject::initialValue(int id)
+{
+    QSGVisualDataModel *m = new QSGVisualDataModel;
+    m->setParent(object());
+    m->setPart(QString::fromUtf8(name(id)));
+    m->setModel(QVariant::fromValue(static_cast<QSGVisualDataModelParts *>(object())->model));
+
+    QVariant var = QVariant::fromValue((QObject *)m);
+    return var;
+}
+
+QSGVisualDataModelParts::QSGVisualDataModelParts(QSGVisualDataModel *parent)
+: QObject(parent), model(parent)
+{
+    new QSGVisualDataModelPartsMetaObject(this);
+}
+
+QSGVisualDataModelPrivate::QSGVisualDataModelPrivate(QDeclarativeContext *ctxt)
+: m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
+, m_context(ctxt), m_modelDataPropId(-1), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
+, m_metaDataCacheable(false), m_delegateValidated(false), m_completePending(false), m_listAccessor(0)
+{
+}
+
+QSGVisualDataModelData *QSGVisualDataModelPrivate::data(QObject *item)
+{
+    QSGVisualDataModelData *dataItem =
+        item->findChild<QSGVisualDataModelData *>();
+    Q_ASSERT(dataItem);
+    return dataItem;
+}
+
+//---------------------------------------------------------------------------
+
+QSGVisualDataModel::QSGVisualDataModel()
+: QSGVisualModel(*(new QSGVisualDataModelPrivate(0)))
+{
+}
+
+QSGVisualDataModel::QSGVisualDataModel(QDeclarativeContext *ctxt, QObject *parent)
+: QSGVisualModel(*(new QSGVisualDataModelPrivate(ctxt)), parent)
+{
+}
+
+QSGVisualDataModel::~QSGVisualDataModel()
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_listAccessor)
+        delete d->m_listAccessor;
+    if (d->m_delegateDataType)
+        d->m_delegateDataType->release();
+}
+
+QVariant QSGVisualDataModel::model() const
+{
+    Q_D(const QSGVisualDataModel);
+    return d->m_modelVariant;
+}
+
+void QSGVisualDataModel::setModel(const QVariant &model)
+{
+    Q_D(QSGVisualDataModel);
+    delete d->m_listAccessor;
+    d->m_listAccessor = 0;
+    d->m_modelVariant = model;
+    if (d->m_listModelInterface) {
+        // Assume caller has released all items.
+        QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
+                this, SLOT(_q_itemsChanged(int,int,QList<int>)));
+        QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
+                this, SLOT(_q_itemsInserted(int,int)));
+        QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
+                this, SLOT(_q_itemsRemoved(int,int)));
+        QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
+                this, SLOT(_q_itemsMoved(int,int,int)));
+        d->m_listModelInterface = 0;
+    } else if (d->m_abstractItemModel) {
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
+                            this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                            this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+                            this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
+                            this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
+        QObject::disconnect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
+        d->m_abstractItemModel = 0;
+    } else if (d->m_visualItemModel) {
+        QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
+                         this, SIGNAL(itemsInserted(int,int)));
+        QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
+                         this, SIGNAL(itemsRemoved(int,int)));
+        QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
+                         this, SIGNAL(itemsMoved(int,int,int)));
+        QObject::disconnect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarativePackage*)),
+                         this, SLOT(_q_createdPackage(int,QDeclarativePackage*)));
+        QObject::disconnect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarativePackage*)),
+                         this, SLOT(_q_destroyingPackage(QDeclarativePackage*)));
+        d->m_visualItemModel = 0;
+    }
+
+    d->m_roles.clear();
+    d->m_roleNames.clear();
+    if (d->m_delegateDataType)
+        d->m_delegateDataType->release();
+    d->m_metaDataCreated = 0;
+    d->m_metaDataCacheable = false;
+    d->m_delegateDataType = new VDMDelegateDataType(&QSGVisualDataModelData::staticMetaObject, d->m_context?d->m_context->engine():qmlEngine(this));
+
+    QObject *object = qvariant_cast<QObject *>(model);
+    if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
+        QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
+                         this, SLOT(_q_itemsChanged(int,int,QList<int>)));
+        QObject::connect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
+                         this, SLOT(_q_itemsInserted(int,int)));
+        QObject::connect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
+                         this, SLOT(_q_itemsRemoved(int,int)));
+        QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
+                         this, SLOT(_q_itemsMoved(int,int,int)));
+        d->m_metaDataCacheable = true;
+        if (d->m_delegate && d->m_listModelInterface->count())
+            emit itemsInserted(0, d->m_listModelInterface->count());
+        return;
+    } else if (object && (d->m_abstractItemModel = qobject_cast<QAbstractItemModel *>(object))) {
+        QObject::connect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
+                            this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
+        QObject::connect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                            this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
+        QObject::connect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+                            this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
+        QObject::connect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
+                            this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
+        QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
+        QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
+        d->m_metaDataCacheable = true;
+        if (d->m_abstractItemModel->canFetchMore(d->m_root))
+            d->m_abstractItemModel->fetchMore(d->m_root);
+        return;
+    }
+    if ((d->m_visualItemModel = qvariant_cast<QSGVisualDataModel *>(model))) {
+        QObject::connect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
+                         this, SIGNAL(itemsInserted(int,int)));
+        QObject::connect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
+                         this, SIGNAL(itemsRemoved(int,int)));
+        QObject::connect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
+                         this, SIGNAL(itemsMoved(int,int,int)));
+        QObject::connect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarativePackage*)),
+                         this, SLOT(_q_createdPackage(int,QDeclarativePackage*)));
+        QObject::connect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarativePackage*)),
+                         this, SLOT(_q_destroyingPackage(QDeclarativePackage*)));
+        return;
+    }
+    d->m_listAccessor = new QDeclarativeListAccessor;
+    d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
+    if (d->m_listAccessor->type() != QDeclarativeListAccessor::ListProperty)
+        d->m_metaDataCacheable = true;
+    if (d->m_delegate && d->modelCount()) {
+        emit itemsInserted(0, d->modelCount());
+        emit countChanged();
+    }
+}
+
+QDeclarativeComponent *QSGVisualDataModel::delegate() const
+{
+    Q_D(const QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->delegate();
+    return d->m_delegate;
+}
+
+void QSGVisualDataModel::setDelegate(QDeclarativeComponent *delegate)
+{
+    Q_D(QSGVisualDataModel);
+    bool wasValid = d->m_delegate != 0;
+    d->m_delegate = delegate;
+    d->m_delegateValidated = false;
+    if (!wasValid && d->modelCount() && d->m_delegate) {
+        emit itemsInserted(0, d->modelCount());
+        emit countChanged();
+    }
+    if (wasValid && !d->m_delegate && d->modelCount()) {
+        emit itemsRemoved(0, d->modelCount());
+        emit countChanged();
+    }
+}
+
+QVariant QSGVisualDataModel::rootIndex() const
+{
+    Q_D(const QSGVisualDataModel);
+    return QVariant::fromValue(d->m_root);
+}
+
+void QSGVisualDataModel::setRootIndex(const QVariant &root)
+{
+    Q_D(QSGVisualDataModel);
+    QModelIndex modelIndex = qvariant_cast<QModelIndex>(root);
+    if (d->m_root != modelIndex) {
+        int oldCount = d->modelCount();
+        d->m_root = modelIndex;
+        if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
+            d->m_abstractItemModel->fetchMore(modelIndex);
+        int newCount = d->modelCount();
+        if (d->m_delegate && oldCount)
+            emit itemsRemoved(0, oldCount);
+        if (d->m_delegate && newCount)
+            emit itemsInserted(0, newCount);
+        if (newCount != oldCount)
+            emit countChanged();
+        emit rootIndexChanged();
+    }
+}
+
+QVariant QSGVisualDataModel::modelIndex(int idx) const
+{
+    Q_D(const QSGVisualDataModel);
+    if (d->m_abstractItemModel)
+        return QVariant::fromValue(d->m_abstractItemModel->index(idx, 0, d->m_root));
+    return QVariant::fromValue(QModelIndex());
+}
+
+QVariant QSGVisualDataModel::parentModelIndex() const
+{
+    Q_D(const QSGVisualDataModel);
+    if (d->m_abstractItemModel)
+        return QVariant::fromValue(d->m_abstractItemModel->parent(d->m_root));
+    return QVariant::fromValue(QModelIndex());
+}
+
+QString QSGVisualDataModel::part() const
+{
+    Q_D(const QSGVisualDataModel);
+    return d->m_part;
+}
+
+void QSGVisualDataModel::setPart(const QString &part)
+{
+    Q_D(QSGVisualDataModel);
+    d->m_part = part;
+}
+
+int QSGVisualDataModel::count() const
+{
+    Q_D(const QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->count();
+    if (!d->m_delegate)
+        return 0;
+    return d->modelCount();
+}
+
+QSGItem *QSGVisualDataModel::item(int index, bool complete)
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->item(index, d->m_part.toUtf8(), complete);
+    return item(index, QByteArray(), complete);
+}
+
+/*
+  Returns ReleaseStatus flags.
+*/
+QSGVisualDataModel::ReleaseFlags QSGVisualDataModel::release(QSGItem *item)
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->release(item);
+
+    ReleaseFlags stat = 0;
+    QObject *obj = item;
+    bool inPackage = false;
+
+    QHash<QObject*,QDeclarativePackage*>::iterator it = d->m_packaged.find(item);
+    if (it != d->m_packaged.end()) {
+        QDeclarativePackage *package = *it;
+        d->m_packaged.erase(it);
+        if (d->m_packaged.contains(item))
+            stat |= Referenced;
+        inPackage = true;
+        obj = package; // fall through and delete
+    }
+
+    if (d->m_cache.releaseItem(obj)) {
+        // Remove any bindings to avoid warnings due to parent change.
+        QObjectPrivate *p = QObjectPrivate::get(obj);
+        Q_ASSERT(p->declarativeData);
+        QDeclarativeData *d = static_cast<QDeclarativeData*>(p->declarativeData);
+        if (d->ownContext && d->context)
+            d->context->clearContext();
+
+        if (inPackage) {
+            emit destroyingPackage(qobject_cast<QDeclarativePackage*>(obj));
+        } else {
+            // XXX todo - the original did item->scene()->removeItem().  Why?
+            item->setParentItem(0);
+        }
+        stat |= Destroyed;
+        obj->deleteLater();
+    } else if (!inPackage) {
+        stat |= Referenced;
+    }
+
+    return stat;
+}
+
+QObject *QSGVisualDataModel::parts()
+{
+    Q_D(QSGVisualDataModel);
+    if (!d->m_parts)
+        d->m_parts = new QSGVisualDataModelParts(this);
+    return d->m_parts;
+}
+
+QSGItem *QSGVisualDataModel::item(int index, const QByteArray &viewId, bool complete)
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->item(index, viewId, complete);
+
+    if (d->modelCount() <= 0 || !d->m_delegate)
+        return 0;
+    QObject *nobj = d->m_cache.getItem(index);
+    bool needComplete = false;
+    if (!nobj) {
+        QDeclarativeContext *ccontext = d->m_context;
+        if (!ccontext) ccontext = qmlContext(this);
+        QDeclarativeContext *ctxt = new QDeclarativeContext(ccontext);
+        QSGVisualDataModelData *data = new QSGVisualDataModelData(index, this);
+        if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor
+            && d->m_listAccessor->type() == QDeclarativeListAccessor::ListProperty) {
+            ctxt->setContextObject(d->m_listAccessor->at(index).value<QObject*>());
+            ctxt = new QDeclarativeContext(ctxt, ctxt);
+        }
+        ctxt->setContextProperty(QLatin1String("model"), data);
+        ctxt->setContextObject(data);
+        d->m_completePending = false;
+        nobj = d->m_delegate->beginCreate(ctxt);
+        if (complete) {
+            d->m_delegate->completeCreate();
+        } else {
+            d->m_completePending = true;
+            needComplete = true;
+        }
+        if (nobj) {
+            QDeclarative_setParent_noEvent(ctxt, nobj);
+            QDeclarative_setParent_noEvent(data, nobj);
+            d->m_cache.insertItem(index, nobj);
+            if (QDeclarativePackage *package = qobject_cast<QDeclarativePackage *>(nobj))
+                emit createdPackage(index, package);
+        } else {
+            delete data;
+            delete ctxt;
+            qmlInfo(this, d->m_delegate->errors()) << "Error creating delegate";
+        }
+    }
+    QSGItem *item = qobject_cast<QSGItem *>(nobj);
+    if (!item) {
+        QDeclarativePackage *package = qobject_cast<QDeclarativePackage *>(nobj);
+        if (package) {
+            QObject *o = package->part(QString::fromUtf8(viewId));
+            item = qobject_cast<QSGItem *>(o);
+            if (item)
+                d->m_packaged.insertMulti(item, package);
+        }
+    }
+    if (!item) {
+        if (needComplete)
+            d->m_delegate->completeCreate();
+        d->m_cache.releaseItem(nobj);
+        if (!d->m_delegateValidated) {
+            qmlInfo(d->m_delegate) << QSGVisualDataModel::tr("Delegate component must be Item type.");
+            d->m_delegateValidated = true;
+        }
+    }
+    if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
+        d->m_abstractItemModel->fetchMore(d->m_root);
+
+    return item;
+}
+
+bool QSGVisualDataModel::completePending() const
+{
+    Q_D(const QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->completePending();
+    return d->m_completePending;
+}
+
+void QSGVisualDataModel::completeItem()
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_visualItemModel) {
+        d->m_visualItemModel->completeItem();
+        return;
+    }
+
+    d->m_delegate->completeCreate();
+    d->m_completePending = false;
+}
+
+QString QSGVisualDataModel::stringValue(int index, const QString &name)
+{
+    Q_D(QSGVisualDataModel);
+    if (d->m_visualItemModel)
+        return d->m_visualItemModel->stringValue(index, name);
+
+    if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor) {
+        if (QObject *object = d->m_listAccessor->at(index).value<QObject*>())
+            return object->property(name.toUtf8()).toString();
+    }
+
+    if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
+        return QString();
+
+    QString val;
+    QObject *data = 0;
+    bool tempData = false;
+
+    if (QObject *nobj = d->m_cache.item(index))
+        data = d->data(nobj);
+    if (!data) {
+        data = new QSGVisualDataModelData(index, this);
+        tempData = true;
+    }
+
+    QDeclarativeData *ddata = QDeclarativeData::get(data);
+    if (ddata && ddata->propertyCache) {
+        QDeclarativePropertyCache::Data *prop = ddata->propertyCache->property(name);
+        if (prop) {
+            if (prop->propType == QVariant::String) {
+                void *args[] = { &val, 0 };
+                QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
+            } else if (prop->propType == qMetaTypeId<QVariant>()) {
+                QVariant v;
+                void *args[] = { &v, 0 };
+                QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
+                val = v.toString();
+            }
+        } else {
+            val = data->property(name.toUtf8()).toString();
+        }
+    } else {
+        val = data->property(name.toUtf8()).toString();
+    }
+
+    if (tempData)
+        delete data;
+
+    return val;
+}
+
+int QSGVisualDataModel::indexOf(QSGItem *item, QObject *) const
+{
+    QVariant val = QDeclarativeEngine::contextForObject(item)->contextProperty(QLatin1String("index"));
+        return val.toInt();
+    return -1;
+}
+
+void QSGVisualDataModel::setWatchedRoles(QList<QByteArray> roles)
+{
+    Q_D(QSGVisualDataModel);
+    d->watchedRoles = roles;
+    d->watchedRoleIds.clear();
+}
+
+void QSGVisualDataModel::_q_itemsChanged(int index, int count,
+                                         const QList<int> &roles)
+{
+    Q_D(QSGVisualDataModel);
+    bool changed = false;
+    if (!d->watchedRoles.isEmpty() && d->watchedRoleIds.isEmpty()) {
+        foreach (QByteArray r, d->watchedRoles) {
+            if (d->m_roleNames.contains(r))
+                d->watchedRoleIds << d->m_roleNames.value(r);
+        }
+    }
+
+    for (QHash<int,QSGVisualDataModelPrivate::ObjectRef>::ConstIterator iter = d->m_cache.begin();
+        iter != d->m_cache.end(); ++iter) {
+        const int idx = iter.key();
+
+        if (idx >= index && idx < index+count) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
+                int role = roles.at(roleIdx);
+                if (!changed && !d->watchedRoleIds.isEmpty() && d->watchedRoleIds.contains(role))
+                    changed = true;
+                int propId = data->propForRole(role);
+                if (propId != -1) {
+                    if (data->hasValue(propId)) {
+                        if (d->m_listModelInterface) {
+                            data->setValue(propId, d->m_listModelInterface->data(idx, role));
+                        } else if (d->m_abstractItemModel) {
+                            QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
+                            data->setValue(propId, d->m_abstractItemModel->data(index, role));
+                        }
+                    }
+                } else {
+                    QString roleName;
+                    if (d->m_listModelInterface)
+                        roleName = d->m_listModelInterface->toString(role);
+                    else if (d->m_abstractItemModel)
+                        roleName = QString::fromUtf8(d->m_abstractItemModel->roleNames().value(role));
+                    qmlInfo(this) << "Changing role not present in item: " << roleName;
+                }
+            }
+            if (d->m_roles.count() == 1) {
+                // Handle the modelData role we add if there is just one role.
+                int propId = data->modelDataPropertyId();
+                if (data->hasValue(propId)) {
+                    int role = d->m_roles.at(0);
+                    if (d->m_listModelInterface) {
+                        data->setValue(propId, d->m_listModelInterface->data(idx, role));
+                    } else if (d->m_abstractItemModel) {
+                        QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
+                        data->setValue(propId, d->m_abstractItemModel->data(index, role));
+                    }
+                }
+            }
+        }
+    }
+    if (changed)
+        emit itemsChanged(index, count);
+}
+
+void QSGVisualDataModel::_q_itemsInserted(int index, int count)
+{
+    Q_D(QSGVisualDataModel);
+    if (!count)
+        return;
+    // XXX - highly inefficient
+    QHash<int,QSGVisualDataModelPrivate::ObjectRef> items;
+    for (QHash<int,QSGVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
+        iter != d->m_cache.end(); ) {
+
+        if (iter.key() >= index) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            int index = iter.key() + count;
+            iter = d->m_cache.erase(iter);
+
+            items.insert(index, objRef);
+
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            data->setIndex(index);
+        } else {
+            ++iter;
+        }
+    }
+    d->m_cache.unite(items);
+
+    emit itemsInserted(index, count);
+    emit countChanged();
+}
+
+void QSGVisualDataModel::_q_itemsRemoved(int index, int count)
+{
+    Q_D(QSGVisualDataModel);
+    if (!count)
+        return;
+    // XXX - highly inefficient
+    QHash<int, QSGVisualDataModelPrivate::ObjectRef> items;
+    for (QHash<int, QSGVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
+        iter != d->m_cache.end(); ) {
+        if (iter.key() >= index && iter.key() < index + count) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            iter = d->m_cache.erase(iter);
+            items.insertMulti(-1, objRef); //XXX perhaps better to maintain separately
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            data->setIndex(-1);
+        } else if (iter.key() >= index + count) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            int index = iter.key() - count;
+            iter = d->m_cache.erase(iter);
+            items.insert(index, objRef);
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            data->setIndex(index);
+        } else {
+            ++iter;
+        }
+    }
+
+    d->m_cache.unite(items);
+    emit itemsRemoved(index, count);
+    emit countChanged();
+}
+
+void QSGVisualDataModel::_q_itemsMoved(int from, int to, int count)
+{
+    Q_D(QSGVisualDataModel);
+    // XXX - highly inefficient
+    QHash<int,QSGVisualDataModelPrivate::ObjectRef> items;
+    for (QHash<int,QSGVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
+        iter != d->m_cache.end(); ) {
+
+        if (iter.key() >= from && iter.key() < from + count) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            int index = iter.key() - from + to;
+            iter = d->m_cache.erase(iter);
+
+            items.insert(index, objRef);
+
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            data->setIndex(index);
+        } else {
+            ++iter;
+        }
+    }
+    for (QHash<int,QSGVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
+        iter != d->m_cache.end(); ) {
+
+        int diff = from > to ? count : -count;
+        if (iter.key() >= qMin(from,to) && iter.key() < qMax(from+count,to+count)) {
+            QSGVisualDataModelPrivate::ObjectRef objRef = *iter;
+            int index = iter.key() + diff;
+            iter = d->m_cache.erase(iter);
+
+            items.insert(index, objRef);
+
+            QSGVisualDataModelData *data = d->data(objRef.obj);
+            data->setIndex(index);
+        } else {
+            ++iter;
+        }
+    }
+    d->m_cache.unite(items);
+
+    emit itemsMoved(from, to, count);
+}
+
+void QSGVisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
+{
+    Q_D(QSGVisualDataModel);
+    if (parent == d->m_root)
+        _q_itemsInserted(begin, end - begin + 1);
+}
+
+void QSGVisualDataModel::_q_rowsRemoved(const QModelIndex &parent, int begin, int end)
+{
+    Q_D(QSGVisualDataModel);
+    if (parent == d->m_root)
+        _q_itemsRemoved(begin, end - begin + 1);
+}
+
+void QSGVisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
+{
+    Q_D(QSGVisualDataModel);
+    const int count = sourceEnd - sourceStart + 1;
+    if (destinationParent == d->m_root && sourceParent == d->m_root) {
+        _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow-1, count);
+    } else if (sourceParent == d->m_root) {
+        _q_itemsRemoved(sourceStart, count);
+    } else if (destinationParent == d->m_root) {
+        _q_itemsInserted(destinationRow, count);
+    }
+}
+
+void QSGVisualDataModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end)
+{
+    Q_D(QSGVisualDataModel);
+    if (begin.parent() == d->m_root)
+        _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, d->m_roles);
+}
+
+void QSGVisualDataModel::_q_layoutChanged()
+{
+    Q_D(QSGVisualDataModel);
+    _q_itemsChanged(0, count(), d->m_roles);
+}
+
+void QSGVisualDataModel::_q_modelReset()
+{
+    emit modelReset();
+}
+
+void QSGVisualDataModel::_q_createdPackage(int index, QDeclarativePackage *package)
+{
+    Q_D(QSGVisualDataModel);
+    emit createdItem(index, qobject_cast<QSGItem*>(package->part(d->m_part)));
+}
+
+void QSGVisualDataModel::_q_destroyingPackage(QDeclarativePackage *package)
+{
+    Q_D(QSGVisualDataModel);
+    emit destroyingItem(qobject_cast<QSGItem*>(package->part(d->m_part)));
+}
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QListModelInterface)
+
+#include <qsgvisualitemmodel.moc>
diff --git a/src/declarative/items/qsgvisualitemmodel_p.h b/src/declarative/items/qsgvisualitemmodel_p.h
new file mode 100644
index 0000000000..1f735e7cbc
--- /dev/null
+++ b/src/declarative/items/qsgvisualitemmodel_p.h
@@ -0,0 +1,257 @@
+// Commit: ac5c099cc3c5b8c7eec7a49fdeb8a21037230350
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGVISUALITEMMODEL_P_H
+#define QSGVISUALITEMMODEL_P_H
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qabstractitemmodel.h>
+
+QT_BEGIN_HEADER
+
+Q_DECLARE_METATYPE(QModelIndex)
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItem;
+class QDeclarativeComponent;
+class QDeclarativePackage;
+class QSGVisualDataModelPrivate;
+
+class Q_AUTOTEST_EXPORT QSGVisualModel : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(int count READ count NOTIFY countChanged)
+
+public:
+    virtual ~QSGVisualModel() {}
+
+    enum ReleaseFlag { Referenced = 0x01, Destroyed = 0x02 };
+    Q_DECLARE_FLAGS(ReleaseFlags, ReleaseFlag)
+
+    virtual int count() const = 0;
+    virtual bool isValid() const = 0;
+    virtual QSGItem *item(int index, bool complete=true) = 0;
+    virtual ReleaseFlags release(QSGItem *item) = 0;
+    virtual bool completePending() const = 0;
+    virtual void completeItem() = 0;
+    virtual QString stringValue(int, const QString &) = 0;
+    virtual void setWatchedRoles(QList<QByteArray> roles) = 0;
+
+    virtual int indexOf(QSGItem *item, QObject *objectContext) const = 0;
+
+Q_SIGNALS:
+    void countChanged();
+    void itemsInserted(int index, int count);
+    void itemsRemoved(int index, int count);
+    void itemsMoved(int from, int to, int count);
+    void itemsChanged(int index, int count);
+    void modelReset();
+    void createdItem(int index, QSGItem *item);
+    void destroyingItem(QSGItem *item);
+
+protected:
+    QSGVisualModel(QObjectPrivate &dd, QObject *parent = 0)
+        : QObject(dd, parent) {}
+
+private:
+    Q_DISABLE_COPY(QSGVisualModel)
+};
+
+class QSGVisualItemModelAttached;
+class QSGVisualItemModelPrivate;
+class Q_AUTOTEST_EXPORT QSGVisualItemModel : public QSGVisualModel
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGVisualItemModel)
+
+    Q_PROPERTY(QDeclarativeListProperty<QSGItem> children READ children NOTIFY childrenChanged DESIGNABLE false)
+    Q_CLASSINFO("DefaultProperty", "children")
+
+public:
+    QSGVisualItemModel(QObject *parent=0);
+    virtual ~QSGVisualItemModel() {}
+
+    virtual int count() const;
+    virtual bool isValid() const;
+    virtual QSGItem *item(int index, bool complete=true);
+    virtual ReleaseFlags release(QSGItem *item);
+    virtual bool completePending() const;
+    virtual void completeItem();
+    virtual QString stringValue(int index, const QString &role);
+    virtual void setWatchedRoles(QList<QByteArray>) {}
+
+    virtual int indexOf(QSGItem *item, QObject *objectContext) const;
+
+    QDeclarativeListProperty<QSGItem> children();
+
+    static QSGVisualItemModelAttached *qmlAttachedProperties(QObject *obj);
+
+Q_SIGNALS:
+    void childrenChanged();
+
+private:
+    Q_DISABLE_COPY(QSGVisualItemModel)
+};
+
+
+class Q_AUTOTEST_EXPORT QSGVisualDataModel : public QSGVisualModel
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGVisualDataModel)
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate)
+    Q_PROPERTY(QString part READ part WRITE setPart)
+    Q_PROPERTY(QObject *parts READ parts CONSTANT)
+    Q_PROPERTY(QVariant rootIndex READ rootIndex WRITE setRootIndex NOTIFY rootIndexChanged)
+    Q_CLASSINFO("DefaultProperty", "delegate")
+public:
+    QSGVisualDataModel();
+    QSGVisualDataModel(QDeclarativeContext *, QObject *parent=0);
+    virtual ~QSGVisualDataModel();
+
+    QVariant model() const;
+    void setModel(const QVariant &);
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    QVariant rootIndex() const;
+    void setRootIndex(const QVariant &root);
+
+    Q_INVOKABLE QVariant modelIndex(int idx) const;
+    Q_INVOKABLE QVariant parentModelIndex() const;
+
+    QString part() const;
+    void setPart(const QString &);
+
+    int count() const;
+    bool isValid() const { return delegate() != 0; }
+    QSGItem *item(int index, bool complete=true);
+    QSGItem *item(int index, const QByteArray &, bool complete=true);
+    ReleaseFlags release(QSGItem *item);
+    bool completePending() const;
+    void completeItem();
+    virtual QString stringValue(int index, const QString &role);
+    virtual void setWatchedRoles(QList<QByteArray> roles);
+
+    int indexOf(QSGItem *item, QObject *objectContext) const;
+
+    QObject *parts();
+
+Q_SIGNALS:
+    void createdPackage(int index, QDeclarativePackage *package);
+    void destroyingPackage(QDeclarativePackage *package);
+    void rootIndexChanged();
+
+private Q_SLOTS:
+    void _q_itemsChanged(int, int, const QList<int> &);
+    void _q_itemsInserted(int index, int count);
+    void _q_itemsRemoved(int index, int count);
+    void _q_itemsMoved(int from, int to, int count);
+    void _q_rowsInserted(const QModelIndex &,int,int);
+    void _q_rowsRemoved(const QModelIndex &,int,int);
+    void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
+    void _q_dataChanged(const QModelIndex&,const QModelIndex&);
+    void _q_layoutChanged();
+    void _q_modelReset();
+    void _q_createdPackage(int index, QDeclarativePackage *package);
+    void _q_destroyingPackage(QDeclarativePackage *package);
+
+private:
+    Q_DISABLE_COPY(QSGVisualDataModel)
+};
+
+class QSGVisualItemModelAttached : public QObject
+{
+    Q_OBJECT
+
+public:
+    QSGVisualItemModelAttached(QObject *parent)
+        : QObject(parent), m_index(0) {}
+    ~QSGVisualItemModelAttached() {
+        attachedProperties.remove(parent());
+    }
+
+    Q_PROPERTY(int index READ index NOTIFY indexChanged)
+    int index() const { return m_index; }
+    void setIndex(int idx) {
+        if (m_index != idx) {
+            m_index = idx;
+            emit indexChanged();
+        }
+    }
+
+    static QSGVisualItemModelAttached *properties(QObject *obj) {
+        QSGVisualItemModelAttached *rv = attachedProperties.value(obj);
+        if (!rv) {
+            rv = new QSGVisualItemModelAttached(obj);
+            attachedProperties.insert(obj, rv);
+        }
+        return rv;
+    }
+
+Q_SIGNALS:
+    void indexChanged();
+
+public:
+    int m_index;
+
+    static QHash<QObject*, QSGVisualItemModelAttached*> attachedProperties;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QSGVisualModel)
+QML_DECLARE_TYPE(QSGVisualItemModel)
+QML_DECLARE_TYPEINFO(QSGVisualItemModel, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(QSGVisualDataModel)
+
+QT_END_HEADER
+
+#endif // QSGVISUALITEMMODEL_P_H
diff --git a/src/declarative/items/syncexcludes b/src/declarative/items/syncexcludes
new file mode 100644
index 0000000000..ab7a374a5b
--- /dev/null
+++ b/src/declarative/items/syncexcludes
@@ -0,0 +1,11 @@
+qdeclarativegraphicswidget.cpp
+qdeclarativegraphicswidget_p.h
+qdeclarativetextlayout_p.h
+qdeclarativetextlayout.cpp
+qdeclarativelayoutitem.cpp
+qdeclarativelayoutitem_p.h
+qdeclarativefocuspanel.cpp
+qdeclarativefocuspanel_p.h
+qdeclarativepath_p.h
+qdeclarativepath_p_p.h
+qdeclarativepath.cpp
diff --git a/src/declarative/qml/qdeclarative.h b/src/declarative/qml/qdeclarative.h
index 5da7901528..9227260b64 100644
--- a/src/declarative/qml/qdeclarative.h
+++ b/src/declarative/qml/qdeclarative.h
@@ -53,6 +53,9 @@
 
 QT_BEGIN_HEADER
 
+#define QML_VERSION     0x020000
+#define QML_VERSION_STR "2.0"
+
 #define QML_DECLARE_TYPE(TYPE) \
     Q_DECLARE_METATYPE(TYPE *) \
     Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>) 
@@ -392,6 +395,8 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor,
 
 class QDeclarativeContext;
 class QDeclarativeEngine;
+class QScriptValue;
+class QScriptEngine;
 Q_DECLARATIVE_EXPORT void qmlExecuteDeferred(QObject *);
 Q_DECLARATIVE_EXPORT QDeclarativeContext *qmlContext(const QObject *);
 Q_DECLARATIVE_EXPORT QDeclarativeEngine *qmlEngine(const QObject *);
@@ -405,6 +410,34 @@ QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true)
     return qmlAttachedPropertiesObject(&idx, obj, &T::staticMetaObject, create);
 }
 
+inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
+                                QScriptValue (*callback)(QDeclarativeEngine *, QScriptEngine *))
+{
+    QDeclarativePrivate::RegisterModuleApi api = {
+        0,
+
+        uri, versionMajor, versionMinor,
+
+        callback, 0
+    };
+
+    return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
+}
+
+inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
+                                QObject *(*callback)(QDeclarativeEngine *, QScriptEngine *))
+{
+    QDeclarativePrivate::RegisterModuleApi api = {
+        0,
+
+        uri, versionMajor, versionMinor,
+
+        0, callback
+    };
+
+    return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
+}
+
 QT_END_NAMESPACE
 
 QML_DECLARE_TYPE(QObject)
diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp
index a5bd604c53..3e93ce7266 100644
--- a/src/declarative/qml/qdeclarativebinding.cpp
+++ b/src/declarative/qml/qdeclarativebinding.cpp
@@ -357,13 +357,17 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
 
         } else {
             QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(d->context()->engine);
+            ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation.
 
             bool isUndefined = false;
             QVariant value;
 
             QScriptValue scriptValue = d->scriptValue(0, &isUndefined);
-            if (wasDeleted)
+
+            if (wasDeleted) {
+                ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
                 return;
+            }
 
             if (d->property.propertyTypeCategory() == QDeclarativeProperty::List) {
                 value = ep->scriptValueToVariant(scriptValue, qMetaTypeId<QList<QObject *> >());
@@ -420,8 +424,10 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
             } else if (d->property.object() &&
                        !QDeclarativePropertyPrivate::write(d->property, value, flags)) {
 
-                if (wasDeleted)
+                if (wasDeleted) {
+                    ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
                     return;
+                }
 
                 QUrl url = QUrl(d->url);
                 int line = d->line;
@@ -440,14 +446,21 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
                                         QLatin1String(QMetaType::typeName(d->property.propertyType())));
             }
 
-            if (wasDeleted)
+            if (wasDeleted) {
+                ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
                 return;
+            }
 
             if (d->error.isValid()) {
                if (!d->addError(ep)) ep->warning(this->error());
             } else {
                 d->removeError();
             }
+
+            // at this point, the binding has been evaluated.  If any scarce
+            // resources were copied during the evaluation of the binding,
+            // we need to release those copies.
+            ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
         }
 
         d->updating = false;
diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
deleted file mode 100644
index a6fcce4c99..0000000000
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ /dev/null
@@ -1,2906 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// #define COMPILEDBINDINGS_DEBUG
-// #define REGISTER_CLEANUP_DEBUG
-
-#include "private/qdeclarativecompiledbindings_p.h"
-
-#include <QtDeclarative/qdeclarativeinfo.h>
-#include <private/qdeclarativecontext_p.h>
-#include <private/qdeclarativejsast_p.h>
-#include <private/qdeclarativejsengine_p.h>
-#include <private/qdeclarativeexpression_p.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qnumeric.h>
-#include <private/qdeclarativeanchors_p_p.h>
-#include <private/qdeclarativeglobal_p.h>
-#include <private/qdeclarativefastproperties_p.h>
-#include <private/qdeclarativedebugtrace_p.h>
-
-QT_BEGIN_NAMESPACE
-
-DEFINE_BOOL_CONFIG_OPTION(qmlExperimental, QML_EXPERIMENTAL);
-DEFINE_BOOL_CONFIG_OPTION(qmlDisableOptimizer, QML_DISABLE_OPTIMIZER);
-DEFINE_BOOL_CONFIG_OPTION(qmlDisableFastProperties, QML_DISABLE_FAST_PROPERTIES);
-DEFINE_BOOL_CONFIG_OPTION(bindingsDump, QML_BINDINGS_DUMP);
-
-Q_GLOBAL_STATIC(QDeclarativeFastProperties, fastProperties);
-
-#if defined(Q_CC_GNU) && (!defined(Q_CC_INTEL) || __INTEL_COMPILER >= 1200)
-#  define QML_THREADED_INTERPRETER
-#endif
-
-#define FOR_EACH_QML_INSTR(F) \
-    F(Noop)                    /* Nop */ \
-    F(BindingId)               /* id */ \
-    F(Subscribe)               /* subscribe */ \
-    F(SubscribeId)             /* subscribe */ \
-    F(FetchAndSubscribe)       /* fetchAndSubscribe */ \
-    F(LoadId)                  /* load */ \
-    F(LoadScope)               /* load */ \
-    F(LoadRoot)                /* load */ \
-    F(LoadAttached)            /* attached */ \
-    F(ConvertIntToReal)        /* unaryop */ \
-    F(ConvertRealToInt)        /* unaryop */ \
-    F(Real)                    /* real_value */ \
-    F(Int)                     /* int_value */ \
-    F(Bool)                    /* bool_value */ \
-    F(String)                  /* string_value */ \
-    F(AddReal)                 /* binaryop */ \
-    F(AddInt)                  /* binaryop */ \
-    F(AddString)               /* binaryop */ \
-    F(MinusReal)               /* binaryop */ \
-    F(MinusInt)                /* binaryop */ \
-    F(CompareReal)             /* binaryop */ \
-    F(CompareString)           /* binaryop */ \
-    F(NotCompareReal)          /* binaryop */ \
-    F(NotCompareString)        /* binaryop */ \
-    F(GreaterThanReal)         /* binaryop */ \
-    F(MaxReal)                 /* binaryop */ \
-    F(MinReal)                 /* binaryop */ \
-    F(NewString)               /* construct */ \
-    F(NewUrl)                  /* construct */ \
-    F(CleanupUrl)              /* cleanup */ \
-    F(CleanupString)           /* cleanup */ \
-    F(Copy)                    /* copy */ \
-    F(Fetch)                   /* fetch */ \
-    F(Store)                   /* store */ \
-    F(Skip)                    /* skip */ \
-    F(Done)                    /* done */ \
-    /* Speculative property resolution */ \
-    F(InitString)              /* initstring */ \
-    F(FindGeneric)             /* find */ \
-    F(FindGenericTerminal)     /* find */ \
-    F(FindProperty)            /* find */ \
-    F(FindPropertyTerminal)    /* find */ \
-    F(CleanupGeneric)          /* cleanup */ \
-    F(ConvertGenericToReal)    /* unaryop */ \
-    F(ConvertGenericToBool)    /* unaryop */ \
-    F(ConvertGenericToString)  /* unaryop */ \
-    F(ConvertGenericToUrl)     /* unaryop */
-
-#define QML_INSTR_ENUM(I) I,
-#define QML_INSTR_ADDR(I) &&op_##I,
-
-#ifdef QML_THREADED_INTERPRETER
-#  define QML_BEGIN_INSTR(I) op_##I:
-#  define QML_END_INSTR(I) ++instr; goto *instr->common.code;
-#  define QML_INSTR_HEADER void *code;
-#else
-#  define QML_BEGIN_INSTR(I) case Instr::I:
-#  define QML_END_INSTR(I) break;
-#  define QML_INSTR_HEADER
-#endif
-
-
-using namespace QDeclarativeJS;
-
-namespace {
-// Supported types: int, qreal, QString (needs constr/destr), QObject*, bool
-struct Register {
-    void setUndefined() { type = 0; }
-    void setUnknownButDefined() { type = -1; }
-    void setNaN() { setqreal(qSNaN()); }
-    bool isUndefined() const { return type == 0; }
-
-    void setQObject(QObject *o) { *((QObject **)data) = o; type = QMetaType::QObjectStar; }
-    QObject *getQObject() const { return *((QObject **)data); }
-
-    void setqreal(qreal v) { *((qreal *)data) = v; type = QMetaType::QReal; }
-    qreal getqreal() const { return *((qreal *)data); }
-
-    void setint(int v) { *((int *)data) = v; type = QMetaType::Int; }
-    int getint() const { return *((int *)data); }
-
-    void setbool(bool v) { *((bool *)data) = v; type = QMetaType::Bool; }
-    bool getbool() const { return *((bool *)data); }
-
-    QVariant *getvariantptr() { return (QVariant *)typeDataPtr(); }
-    QString *getstringptr() { return (QString *)typeDataPtr(); }
-    QUrl *geturlptr() { return (QUrl *)typeDataPtr(); }
-    const QVariant *getvariantptr() const { return (QVariant *)typeDataPtr(); }
-    const QString *getstringptr() const { return (QString *)typeDataPtr(); }
-    const QUrl *geturlptr() const { return (QUrl *)typeDataPtr(); }
-
-    void *typeDataPtr() { return (void *)&data; }
-    void *typeMemory() { return (void *)data; }
-    const void *typeDataPtr() const { return (void *)&data; }
-    const void *typeMemory() const { return (void *)data; }
-
-    int gettype() const { return type; }
-    void settype(int t) { type = t; }
-
-    int type;          // Optional type
-    void *data[2];     // Object stored here
-
-#ifdef REGISTER_CLEANUP_DEBUG
-    Register() {
-        type = 0;
-    }
-
-    ~Register() {
-        int allowedTypes[] = { QMetaType::QObjectStar, QMetaType::QReal, QMetaType::Int, QMetaType::Bool, 0 };
-        bool found = (type == 0);
-        int *ctype = allowedTypes;
-        while (!found && *ctype) {
-            found = (*ctype == type);
-            ++ctype;
-        }
-        if (!found)
-            qWarning("Register leaked of type %d", type);
-    }
-#endif
-};
-}
-
-class QDeclarativeCompiledBindingsPrivate : public QObjectPrivate
-{
-    Q_DECLARE_PUBLIC(QDeclarativeCompiledBindings)
-
-public:
-    QDeclarativeCompiledBindingsPrivate();
-    virtual ~QDeclarativeCompiledBindingsPrivate();
-
-    struct Binding : public QDeclarativeAbstractBinding, public QDeclarativeDelayedError {
-        Binding() : enabled(false), updating(0), property(0),
-                    scope(0), target(0), parent(0) {}
-
-        // Inherited from QDeclarativeAbstractBinding
-        virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags flags);
-        virtual void update(QDeclarativePropertyPrivate::WriteFlags flags);
-        virtual void destroy();
-
-        int index:30;
-        bool enabled:1;
-        bool updating:1;
-        int property;
-        QObject *scope;
-        QObject *target;
-
-        QDeclarativeCompiledBindingsPrivate *parent;
-    };
-
-    typedef QDeclarativeNotifierEndpoint Subscription;
-    Subscription *subscriptions;
-    QScriptDeclarativeClass::PersistentIdentifier *identifiers;
-
-    void run(Binding *, QDeclarativePropertyPrivate::WriteFlags flags);
-
-    const char *programData;
-    Binding *m_bindings;
-    quint32 *m_signalTable;
-
-    static int methodCount;
-
-    void init();
-    void run(int instr, QDeclarativeContextData *context, 
-             QDeclarativeDelayedError *error, QObject *scope, QObject *output, QDeclarativePropertyPrivate::WriteFlags storeFlags);
-
-
-    inline void unsubscribe(int subIndex);
-    inline void subscribeId(QDeclarativeContextData *p, int idIndex, int subIndex);
-    inline void subscribe(QObject *o, int notifyIndex, int subIndex);
-
-    QDeclarativePropertyCache::Data *findproperty(QObject *obj, 
-                                                  const QScriptDeclarativeClass::Identifier &name,
-                                                  QDeclarativeEnginePrivate *enginePriv, 
-                                                  QDeclarativePropertyCache::Data &local);
-    bool findproperty(QObject *obj, 
-                      Register *output, 
-                      QDeclarativeEnginePrivate *enginePriv,
-                      int subIdx, 
-                      const QScriptDeclarativeClass::Identifier &name,
-                      bool isTerminal);
-    void findgeneric(Register *output,                                 // value output
-                     int subIdx,                                       // Subscription index in config
-                     QDeclarativeContextData *context,                 // Context to search in
-                     const QScriptDeclarativeClass::Identifier &name, 
-                     bool isTerminal);
-};
-
-QDeclarativeCompiledBindingsPrivate::QDeclarativeCompiledBindingsPrivate()
-: subscriptions(0), identifiers(0)
-{
-}
-
-QDeclarativeCompiledBindingsPrivate::~QDeclarativeCompiledBindingsPrivate()
-{
-    delete [] subscriptions; subscriptions = 0;
-    delete [] identifiers; identifiers = 0;
-}
-
-int QDeclarativeCompiledBindingsPrivate::methodCount = -1;
-
-QDeclarativeCompiledBindings::QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context)
-: QObject(*(new QDeclarativeCompiledBindingsPrivate))
-{
-    Q_D(QDeclarativeCompiledBindings);
-
-    if (d->methodCount == -1)
-        d->methodCount = QDeclarativeCompiledBindings::staticMetaObject.methodCount();
-
-    d->programData = program;
-
-    d->init();
-
-    QDeclarativeAbstractExpression::setContext(context);
-}
-
-QDeclarativeCompiledBindings::~QDeclarativeCompiledBindings()
-{
-    Q_D(QDeclarativeCompiledBindings);
-
-    delete [] d->m_bindings;
-}
-
-QDeclarativeAbstractBinding *QDeclarativeCompiledBindings::configBinding(int index, QObject *target, 
-                                                        QObject *scope, int property)
-{
-    Q_D(QDeclarativeCompiledBindings);
-
-    QDeclarativeCompiledBindingsPrivate::Binding *rv = d->m_bindings + index;
-
-    rv->index = index;
-    rv->property = property;
-    rv->target = target;
-    rv->scope = scope;
-    rv->parent = d;
-
-    addref(); // This is decremented in Binding::destroy()
-
-    return rv;
-}
-
-void QDeclarativeCompiledBindingsPrivate::Binding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteFlags flags)
-{
-    if (enabled != e) {
-        enabled = e;
-
-        if (e) update(flags);
-    }
-}
-
-void QDeclarativeCompiledBindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags)
-{
-    QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding);
-    parent->run(this, flags);
-    QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding);
-}
-
-void QDeclarativeCompiledBindingsPrivate::Binding::destroy()
-{
-    enabled = false;
-    removeFromObject();
-    clear();
-    parent->q_func()->release();
-}
-
-int QDeclarativeCompiledBindings::qt_metacall(QMetaObject::Call c, int id, void **)
-{
-    Q_D(QDeclarativeCompiledBindings);
-
-    if (c == QMetaObject::InvokeMetaMethod && id >= d->methodCount) {
-        id -= d->methodCount;
-
-        quint32 *reeval = d->m_signalTable + d->m_signalTable[id];
-        quint32 count = *reeval;
-        ++reeval;
-        for (quint32 ii = 0; ii < count; ++ii) {
-            d->run(d->m_bindings + reeval[ii], QDeclarativePropertyPrivate::DontRemoveBinding);
-        }
-    }
-    return -1;
-}
-
-void QDeclarativeCompiledBindingsPrivate::run(Binding *binding, QDeclarativePropertyPrivate::WriteFlags flags)
-{
-    Q_Q(QDeclarativeCompiledBindings);
-
-    if (!binding->enabled)
-        return;
-
-    QDeclarativeContextData *context = q->QDeclarativeAbstractExpression::context();
-    if (!context || !context->isValid()) 
-        return;
-
-    if (binding->updating) {
-        QString name;
-        if (binding->property & 0xFFFF0000) {
-            QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context->engine);
-
-            QDeclarativeValueType *vt = ep->valueTypes[(binding->property >> 16) & 0xFF];
-            Q_ASSERT(vt);
-
-            name = QLatin1String(binding->target->metaObject()->property(binding->property & 0xFFFF).name());
-            name.append(QLatin1String("."));
-            name.append(QLatin1String(vt->metaObject()->property(binding->property >> 24).name()));
-        } else {
-            name = QLatin1String(binding->target->metaObject()->property(binding->property).name());
-        }
-        qmlInfo(binding->target) << QCoreApplication::translate("QDeclarativeCompiledBindings", "Binding loop detected for property \"%1\"").arg(name);
-        return;
-    }
-
-    binding->updating = true;
-    if (binding->property & 0xFFFF0000) {
-        QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context->engine);
-
-        QDeclarativeValueType *vt = ep->valueTypes[(binding->property >> 16) & 0xFF];
-        Q_ASSERT(vt);
-        vt->read(binding->target, binding->property & 0xFFFF);
-
-        QObject *target = vt;
-        run(binding->index, context, binding, binding->scope, target, flags);
-
-        vt->write(binding->target, binding->property & 0xFFFF, flags);
-    } else {
-        run(binding->index, context, binding, binding->scope, binding->target, flags);
-    }
-    binding->updating = false;
-}
-
-namespace {
-// This structure is exactly 8-bytes in size
-struct Instr {
-    enum {
-        FOR_EACH_QML_INSTR(QML_INSTR_ENUM)
-    };
-
-    union {
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            quint8 packing[7];
-        } common;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            quint8 packing;
-            quint16 column;
-            quint32 line;
-        } id;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            quint8 packing[3];
-            quint16 subscriptions;
-            quint16 identifiers;
-        } init;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint16 offset;
-            quint32 index;
-        } subscribe;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[2];
-            quint32 index;
-        } load;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 reg;
-            quint8 exceptionId;
-            quint32 id;
-        } attached;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 reg;
-            quint8 exceptionId;
-            quint32 index;
-        } store;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 objectReg;
-            quint8 exceptionId;
-            quint16 subscription;
-            quint16 function;
-        } fetchAndSubscribe;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 objectReg;
-            quint8 exceptionId;
-            quint32 index;
-        } fetch;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            qint8 src;
-            quint8 packing[5];
-        } copy;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[6];
-        } construct;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[2];
-            float value;
-        } real_value;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[2];
-            int value;
-        } int_value;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            bool value;
-            quint8 packing[5];
-        } bool_value;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint16 length;
-            quint32 offset;
-        } string_value;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 src1;
-            qint8 src2;
-            quint8 packing[4];
-        } binaryop;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 output;
-            qint8 src;
-            quint8 packing[5];
-        } unaryop;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[2];
-            quint32 count;
-        } skip;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            qint8 src;
-            quint8 exceptionId;
-            quint16 name; 
-            quint16 subscribeIndex;
-        } find;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            qint8 reg;
-            quint8 packing[6];
-        } cleanup;
-        struct {
-            QML_INSTR_HEADER
-            quint8 type;
-            quint8 packing[1];
-            quint16 offset;
-            quint32 dataIdx;
-        } initstring;
-    };
-};
-
-struct Program {
-    quint32 bindings;
-    quint32 dataLength;
-    quint32 signalTableOffset;
-    quint32 exceptionDataOffset;
-    quint16 subscriptions;
-    quint16 identifiers;
-    quint16 instructionCount;
-    quint16 compiled;
-
-    const char *data() const { return ((const char *)this) + sizeof(Program); }
-    const Instr *instructions() const { return (const Instr *)(data() + dataLength); }
-};
-}
-
-struct QDeclarativeBindingCompilerPrivate
-{
-    struct Result {
-        Result() : unknownType(false), metaObject(0), type(-1), reg(-1) {}
-        bool operator==(const Result &o) const { 
-            return unknownType == o.unknownType &&
-                   metaObject == o.metaObject && 
-                   type == o.type &&
-                   reg == o.reg; 
-        }
-        bool operator!=(const Result &o) const { 
-            return !(*this == o);
-        }
-        bool unknownType;
-        const QMetaObject *metaObject;
-        int type;
-        int reg;
-
-        QSet<QString> subscriptionSet;
-    };
-
-    QDeclarativeBindingCompilerPrivate() : registers(0) {}
-
-    void resetInstanceState();
-    int commitCompile();
-
-    QDeclarativeParser::Object *context;
-    QDeclarativeParser::Object *component;
-    QDeclarativeParser::Property *destination;
-    QHash<QString, QDeclarativeParser::Object *> ids;
-    QDeclarativeImports imports;
-    QDeclarativeEnginePrivate *engine;
-
-    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((quintptr)context, 16); }
-
-    bool compile(QDeclarativeJS::AST::Node *);
-
-    bool parseExpression(QDeclarativeJS::AST::Node *, Result &);
-
-    bool tryName(QDeclarativeJS::AST::Node *);
-    bool parseName(QDeclarativeJS::AST::Node *, Result &);
-
-    bool tryArith(QDeclarativeJS::AST::Node *);
-    bool parseArith(QDeclarativeJS::AST::Node *, Result &);
-    bool numberArith(Result &, const Result &, const Result &, QSOperator::Op op);
-    bool stringArith(Result &, const Result &, const Result &, QSOperator::Op op);
-
-    bool tryLogic(QDeclarativeJS::AST::Node *);
-    bool parseLogic(QDeclarativeJS::AST::Node *, Result &);
-
-    bool tryConditional(QDeclarativeJS::AST::Node *);
-    bool parseConditional(QDeclarativeJS::AST::Node *, Result &);
-
-    bool tryConstant(QDeclarativeJS::AST::Node *);
-    bool parseConstant(QDeclarativeJS::AST::Node *, Result &);
-
-    bool tryMethod(QDeclarativeJS::AST::Node *);
-    bool parseMethod(QDeclarativeJS::AST::Node *, Result &);
-
-    bool buildName(QStringList &, QDeclarativeJS::AST::Node *, QList<QDeclarativeJS::AST::ExpressionNode *> *nodes = 0);
-    bool fetch(Result &type, const QMetaObject *, int reg, int idx, const QStringList &, QDeclarativeJS::AST::ExpressionNode *);
-
-    quint32 registers;
-    QHash<int, QPair<int, int> > registerCleanups;
-    int acquireReg(int cleanup = Instr::Noop, int cleanupType = 0);
-    void registerCleanup(int reg, int cleanup, int cleanupType = 0);
-    void releaseReg(int);
-
-    int registerLiteralString(const QString &);
-    int registerString(const QString &);
-    QHash<QString, QPair<int, int> > registeredStrings;
-    QByteArray data;
-
-    bool subscription(const QStringList &, Result *);
-    int subscriptionIndex(const QStringList &);
-    bool subscriptionNeutral(const QSet<QString> &base, const QSet<QString> &lhs, const QSet<QString> &rhs);
-
-    quint8 exceptionId(QDeclarativeJS::AST::ExpressionNode *);
-    QVector<quint64> exceptions;
-
-    QSet<int> usedSubscriptionIds;
-    QSet<QString> subscriptionSet;
-    QHash<QString, int> subscriptionIds;
-    QVector<Instr> bytecode;
-
-    // Committed binding data
-    struct {
-        QList<int> offsets;
-        QList<QSet<int> > dependencies;
-
-        QVector<Instr> bytecode;
-        QByteArray data;
-        QHash<QString, int> subscriptionIds;
-        QVector<quint64> exceptions;
-
-        QHash<QString, QPair<int, int> > registeredStrings;
-
-        int count() const { return offsets.count(); }
-    } committed;
-
-    QByteArray buildSignalTable() const;
-    QByteArray buildExceptionData() const;
-};
-
-void QDeclarativeCompiledBindingsPrivate::unsubscribe(int subIndex)
-{
-    QDeclarativeCompiledBindingsPrivate::Subscription *sub = (subscriptions + subIndex);
-    sub->disconnect();
-}
-
-void QDeclarativeCompiledBindingsPrivate::subscribeId(QDeclarativeContextData *p, int idIndex, int subIndex)
-{
-    Q_Q(QDeclarativeCompiledBindings);
-
-    unsubscribe(subIndex);
-
-    if (p->idValues[idIndex]) {
-        QDeclarativeCompiledBindingsPrivate::Subscription *sub = (subscriptions + subIndex);
-        sub->target = q;
-        sub->targetMethod = methodCount + subIndex;
-        sub->connect(&p->idValues[idIndex].bindings);
-    }
-}
- 
-void QDeclarativeCompiledBindingsPrivate::subscribe(QObject *o, int notifyIndex, int subIndex)
-{
-    Q_Q(QDeclarativeCompiledBindings);
-
-    QDeclarativeCompiledBindingsPrivate::Subscription *sub = (subscriptions + subIndex);
-    sub->target = q;
-    sub->targetMethod = methodCount + subIndex; 
-    if (o)
-        sub->connect(o, notifyIndex);
-    else
-        sub->disconnect();
-}
-
-// Conversion functions - these MUST match the QtScript expression path
-inline static qreal toReal(Register *reg, int type, bool *ok = 0)
-{
-    if (ok) *ok = true;
-
-    if (type == QMetaType::QReal) {
-        return reg->getqreal();
-    } else if (type == qMetaTypeId<QVariant>()) {
-        return reg->getvariantptr()->toReal();
-    } else {
-        if (ok) *ok = false;
-        return 0;
-    }
-}
-
-inline static QString toString(Register *reg, int type, bool *ok = 0)
-{
-    if (ok) *ok = true;
-
-    if (type == QMetaType::QReal) {
-        return QString::number(reg->getqreal());
-    } else if (type == QMetaType::Int) {
-        return QString::number(reg->getint());
-    } else if (type == qMetaTypeId<QVariant>()) {
-        return reg->getvariantptr()->toString();
-    } else if (type == QMetaType::QString) {
-        return *reg->getstringptr();
-    } else {
-        if (ok) *ok = false;
-        return QString();
-    }
-}
-
-inline static bool toBool(Register *reg, int type, bool *ok = 0)
-{
-    if (ok) *ok = true;
-
-    if (type == QMetaType::Bool) {
-        return reg->getbool();
-    } else if (type == qMetaTypeId<QVariant>()) {
-        return reg->getvariantptr()->toBool();
-    } else {
-        if (ok) *ok = false;
-        return false;
-    }
-}
-
-inline static QUrl toUrl(Register *reg, int type, QDeclarativeContextData *context, bool *ok = 0)
-{
-    if (ok) *ok = true;
-
-    QUrl base;
-    if (type == qMetaTypeId<QVariant>()) {
-        QVariant *var = reg->getvariantptr();
-        int vt = var->type();
-        if (vt == QVariant::Url) {
-            base = var->toUrl();
-        } else if (vt == QVariant::ByteArray) {
-            base = QUrl(QString::fromUtf8(var->toByteArray()));
-        } else if (vt == QVariant::String) {
-            base = QUrl(var->toString());
-        } else {
-            if (ok) *ok = false;
-            return QUrl();
-        }
-    } else if (type == QMetaType::QString) {
-        base = QUrl(*reg->getstringptr());
-    } else {
-        if (ok) *ok = false;
-        return QUrl();
-    }
-
-    if (!base.isEmpty() && base.isRelative())
-        return context->url.resolved(base);
-    else
-        return base;
-}
-
-static QObject *variantToQObject(const QVariant &value, bool *ok)
-{
-    if (ok) *ok = true;
-
-    if (value.userType() == QMetaType::QObjectStar) {
-        return qvariant_cast<QObject*>(value);
-    } else {
-        if (ok) *ok = false;
-        return 0;
-    }
-}
-
-bool QDeclarativeCompiledBindingsPrivate::findproperty(QObject *obj, Register *output, 
-                                                       QDeclarativeEnginePrivate *enginePriv,
-                                                       int subIdx, const QScriptDeclarativeClass::Identifier &name,
-                                                       bool isTerminal)
-{
-    if (!obj) {
-        output->setUndefined();
-        return false;
-    }
-
-    QDeclarativePropertyCache::Data local;
-    QDeclarativePropertyCache::Data *property = 
-        QDeclarativePropertyCache::property(QDeclarativeEnginePrivate::get(enginePriv), obj, name, local);
-
-    if (property) {
-        if (subIdx != -1)
-            subscribe(obj, property->notifyIndex, subIdx);
-
-        if (property->flags & QDeclarativePropertyCache::Data::IsQObjectDerived) {
-            void *args[] = { output->typeDataPtr(), 0 };
-            QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-            output->settype(QMetaType::QObjectStar);
-        } else if (property->propType == qMetaTypeId<QVariant>()) {
-            QVariant v;
-            void *args[] = { &v, 0 };
-            QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-
-            if (isTerminal) {
-                new (output->typeDataPtr()) QVariant(v);
-                output->settype(qMetaTypeId<QVariant>());
-            } else {
-                bool ok;
-                output->setQObject(variantToQObject(v, &ok));
-                if (!ok) 
-                    output->setUndefined();
-                else
-                    output->settype(QMetaType::QObjectStar);
-            }
-
-        } else {
-            if (!isTerminal) {
-                output->setUndefined();
-            } else if (property->propType == QMetaType::QReal) {
-                void *args[] = { output->typeDataPtr(), 0 };
-                QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-                output->settype(QMetaType::QReal);
-            } else if (property->propType == QMetaType::Int) {
-                void *args[] = { output->typeDataPtr(), 0 };
-                QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-                output->settype(QMetaType::Int);
-            } else if (property->propType == QMetaType::Bool) {
-                void *args[] = { output->typeDataPtr(), 0 };
-                QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-                output->settype(QMetaType::Bool);
-            } else if (property->propType == QMetaType::QString) {
-                new (output->typeDataPtr()) QString();
-                void *args[] = { output->typeDataPtr(), 0 };
-                QMetaObject::metacall(obj, QMetaObject::ReadProperty, property->coreIndex, args);
-                output->settype(QMetaType::QString);
-            } else {
-                new (output->typeDataPtr()) 
-                    QVariant(obj->metaObject()->property(property->coreIndex).read(obj));
-                output->settype(qMetaTypeId<QVariant>());
-            }
-        }
-
-        return true;
-    } else {
-        output->setUndefined();
-        return false;
-    }
-}
-
-void QDeclarativeCompiledBindingsPrivate::findgeneric(Register *output, 
-                                                      int subIdx,      
-                                                      QDeclarativeContextData *context,
-                                                      const QScriptDeclarativeClass::Identifier &name, 
-                                                      bool isTerminal)
-{
-    QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(context->engine);
-
-    while (context) {
-
-        int contextPropertyIndex = context->propertyNames?context->propertyNames->value(name):-1;
-
-
-        if (contextPropertyIndex != -1) {
-
-            if (contextPropertyIndex < context->idValueCount) {
-                output->setQObject(context->idValues[contextPropertyIndex]);
-                output->settype(QMetaType::QObjectStar);
-
-                if (subIdx != -1) 
-                    subscribeId(context, contextPropertyIndex, subIdx);
-
-            } else {
-                QDeclarativeContextPrivate *cp = context->asQDeclarativeContextPrivate();
-                const QVariant &value = cp->propertyValues.at(contextPropertyIndex);
-
-                if (isTerminal) {
-                    new (output->typeDataPtr()) QVariant(value);
-                    output->settype(qMetaTypeId<QVariant>());
-                } else {
-                    bool ok;
-                    output->setQObject(variantToQObject(value, &ok));
-                    if (!ok) { output->setUndefined(); }
-                    else { output->settype(QMetaType::QObjectStar); }
-                    return;
-                }
-
-                if (subIdx != -1) 
-                    subscribe(context->asQDeclarativeContext(), contextPropertyIndex + cp->notifyIndex, subIdx);
-
-
-            }
-
-            return;
-        }
-
-        if (QObject *root = context->contextObject) {
-
-            if (findproperty(root, output, enginePriv, subIdx, name, isTerminal))
-                return;
-
-        }
-
-        context = context->parent;
-    }
-
-    output->setUndefined();
-}
-
-void QDeclarativeCompiledBindingsPrivate::init()
-{
-    Program *program = (Program *)programData;
-    if (program->subscriptions)
-        subscriptions = new QDeclarativeCompiledBindingsPrivate::Subscription[program->subscriptions];
-    if (program->identifiers)
-        identifiers = new QScriptDeclarativeClass::PersistentIdentifier[program->identifiers];
-
-    m_signalTable = (quint32 *)(program->data() + program->signalTableOffset);
-    m_bindings = new QDeclarativeCompiledBindingsPrivate::Binding[program->bindings];
-}
-
-static void throwException(int id, QDeclarativeDelayedError *error, 
-                           Program *program, QDeclarativeContextData *context,
-                           const QString &description = QString())
-{
-    error->error.setUrl(context->url);
-    if (description.isEmpty())
-        error->error.setDescription(QLatin1String("TypeError: Result of expression is not an object"));
-    else
-        error->error.setDescription(description);
-    if (id != 0xFF) {
-        quint64 e = *((quint64 *)(program->data() + program->exceptionDataOffset) + id); 
-        error->error.setLine((e >> 32) & 0xFFFFFFFF);
-        error->error.setColumn(e & 0xFFFFFFFF); 
-    } else {
-        error->error.setLine(-1);
-        error->error.setColumn(-1);
-    }
-    if (!context->engine || !error->addError(QDeclarativeEnginePrivate::get(context->engine)))
-        QDeclarativeEnginePrivate::warning(context->engine, error->error);
-}
-
-static void dumpInstruction(const Instr *instr)
-{
-    switch (instr->common.type) {
-    case Instr::Noop:
-        qWarning().nospace() << "\t" << "Noop";
-        break;
-    case Instr::BindingId:
-        qWarning().nospace() << instr->id.line << ":" << instr->id.column << ":";
-        break;
-    case Instr::Subscribe:
-        qWarning().nospace() << "\t" << "Subscribe" << "\t\t" << instr->subscribe.offset << "\t" << instr->subscribe.reg << "\t" << instr->subscribe.index;
-        break;
-    case Instr::SubscribeId:
-        qWarning().nospace() << "\t" << "SubscribeId" << "\t\t" << instr->subscribe.offset << "\t" << instr->subscribe.reg << "\t" << instr->subscribe.index;
-        break;
-    case Instr::FetchAndSubscribe:
-        qWarning().nospace() << "\t" << "FetchAndSubscribe" << "\t" << instr->fetchAndSubscribe.output << "\t" << instr->fetchAndSubscribe.objectReg << "\t" << instr->fetchAndSubscribe.subscription;
-        break;
-    case Instr::LoadId:
-        qWarning().nospace() << "\t" << "LoadId" << "\t\t\t" << instr->load.index << "\t" << instr->load.reg;
-        break;
-    case Instr::LoadScope:
-        qWarning().nospace() << "\t" << "LoadScope" << "\t\t" << instr->load.index << "\t" << instr->load.reg;
-        break;
-    case Instr::LoadRoot:
-        qWarning().nospace() << "\t" << "LoadRoot" << "\t\t" << instr->load.index << "\t" << instr->load.reg;
-        break;
-    case Instr::LoadAttached:
-        qWarning().nospace() << "\t" << "LoadAttached" << "\t\t" << instr->attached.output << "\t" << instr->attached.reg << "\t" << instr->attached.id;
-        break;
-    case Instr::ConvertIntToReal:
-        qWarning().nospace() << "\t" << "ConvertIntToReal" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    case Instr::ConvertRealToInt:
-        qWarning().nospace() << "\t" << "ConvertRealToInt" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    case Instr::Real:
-        qWarning().nospace() << "\t" << "Real" << "\t\t\t" << instr->real_value.reg << "\t" << instr->real_value.value;
-        break;
-    case Instr::Int:
-        qWarning().nospace() << "\t" << "Int" << "\t\t\t" << instr->int_value.reg << "\t" << instr->int_value.value;
-        break;
-    case Instr::Bool:
-        qWarning().nospace() << "\t" << "Bool" << "\t\t\t" << instr->bool_value.reg << "\t" << instr->bool_value.value;
-        break;
-    case Instr::String:
-        qWarning().nospace() << "\t" << "String" << "\t\t\t" << instr->string_value.reg << "\t" << instr->string_value.offset << "\t" << instr->string_value.length;
-        break;
-    case Instr::AddReal:
-        qWarning().nospace() << "\t" << "AddReal" << "\t\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::AddInt:
-        qWarning().nospace() << "\t" << "AddInt" << "\t\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::AddString:
-        qWarning().nospace() << "\t" << "AddString" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::MinusReal:
-        qWarning().nospace() << "\t" << "MinusReal" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::MinusInt:
-        qWarning().nospace() << "\t" << "MinusInt" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::CompareReal:
-        qWarning().nospace() << "\t" << "CompareReal" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::CompareString:
-        qWarning().nospace() << "\t" << "CompareString" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::NotCompareReal:
-        qWarning().nospace() << "\t" << "NotCompareReal" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::NotCompareString:
-        qWarning().nospace() << "\t" << "NotCompareString" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::GreaterThanReal:
-        qWarning().nospace() << "\t" << "GreaterThanReal" << "\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::MaxReal:
-        qWarning().nospace() << "\t" << "MaxReal" << "\t\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::MinReal:
-        qWarning().nospace() << "\t" << "MinReal" << "\t\t\t" << instr->binaryop.output << "\t" << instr->binaryop.src1 << "\t" << instr->binaryop.src2;
-        break;
-    case Instr::NewString:
-        qWarning().nospace() << "\t" << "NewString" << "\t\t" << instr->construct.reg;
-        break;
-    case Instr::NewUrl:
-        qWarning().nospace() << "\t" << "NewUrl" << "\t\t\t" << instr->construct.reg;
-        break;
-    case Instr::CleanupString:
-        qWarning().nospace() << "\t" << "CleanupString" << "\t\t" << instr->cleanup.reg;
-        break;
-    case Instr::CleanupUrl:
-        qWarning().nospace() << "\t" << "CleanupUrl" << "\t\t" << instr->cleanup.reg;
-        break;
-    case Instr::Fetch:
-        qWarning().nospace() << "\t" << "Fetch" << "\t\t\t" << instr->fetch.output << "\t" << instr->fetch.index << "\t" << instr->fetch.objectReg;
-        break;
-    case Instr::Store:
-        qWarning().nospace() << "\t" << "Store" << "\t\t\t" << instr->store.output << "\t" << instr->store.index << "\t" << instr->store.reg;
-        break;
-    case Instr::Copy:
-        qWarning().nospace() << "\t" << "Copy" << "\t\t\t" << instr->copy.reg << "\t" << instr->copy.src;
-        break;
-    case Instr::Skip:
-        qWarning().nospace() << "\t" << "Skip" << "\t\t\t" << instr->skip.reg << "\t" << instr->skip.count;
-        break;
-    case Instr::Done:
-        qWarning().nospace() << "\t" << "Done";
-        break;
-    case Instr::InitString:
-        qWarning().nospace() << "\t" << "InitString" << "\t\t" << instr->initstring.offset << "\t" << instr->initstring.dataIdx;
-        break;
-    case Instr::FindGeneric:
-        qWarning().nospace() << "\t" << "FindGeneric" << "\t\t" << instr->find.reg << "\t" << instr->find.name;
-        break;
-    case Instr::FindGenericTerminal:
-        qWarning().nospace() << "\t" << "FindGenericTerminal" << "\t" << instr->find.reg << "\t" <<  instr->find.name;
-        break;
-    case Instr::FindProperty:
-        qWarning().nospace() << "\t" << "FindProperty" << "\t\t" << instr->find.reg << "\t" << instr->find.src << "\t" << instr->find.name;
-        break;
-    case Instr::FindPropertyTerminal:
-        qWarning().nospace() << "\t" << "FindPropertyTerminal" << "\t" << instr->find.reg << "\t" << instr->find.src << "\t" << instr->find.name;
-        break;
-    case Instr::CleanupGeneric:
-        qWarning().nospace() << "\t" << "CleanupGeneric" << "\t\t" << instr->cleanup.reg;
-        break;
-    case Instr::ConvertGenericToReal:
-        qWarning().nospace() << "\t" << "ConvertGenericToReal" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    case Instr::ConvertGenericToBool:
-        qWarning().nospace() << "\t" << "ConvertGenericToBool" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    case Instr::ConvertGenericToString:
-        qWarning().nospace() << "\t" << "ConvertGenericToString" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    case Instr::ConvertGenericToUrl:
-        qWarning().nospace() << "\t" << "ConvertGenericToUrl" << "\t" << instr->unaryop.output << "\t" << instr->unaryop.src;
-        break;
-    default:
-        qWarning().nospace() << "\t" << "Unknown";
-        break;
-    }
-}
-
-void QDeclarativeCompiledBindingsPrivate::run(int instrIndex,
-                                              QDeclarativeContextData *context, QDeclarativeDelayedError *error,
-                                              QObject *scope, QObject *output, QDeclarativePropertyPrivate::WriteFlags storeFlags)
-{
-    Q_Q(QDeclarativeCompiledBindings);
-
-    error->removeError();
-
-    Register registers[32];
-
-    QDeclarativeEnginePrivate *engine = QDeclarativeEnginePrivate::get(context->engine);
-    Program *program = (Program *)programData;
-    const Instr *instr = program->instructions();
-    instr += instrIndex;
-    const char *data = program->data();
-
-#ifdef QML_THREADED_INTERPRETER
-    static void *decode_instr[] = {
-        FOR_EACH_QML_INSTR(QML_INSTR_ADDR)
-    };
-
-    if (!program->compiled) {
-        program->compiled = true;
-        const Instr *inop = program->instructions();
-        for (int i = 0; i < program->instructionCount; ++i) {
-            Instr *op = (Instr *) inop++;
-            op->common.code = decode_instr[op->common.type];
-        }
-    }
-
-    goto *instr->common.code;
-#else
-    // return;
-
-#ifdef COMPILEDBINDINGS_DEBUG
-    qWarning().nospace() << "Begin binding run";
-#endif
-
-    while (instr) {
-        switch (instr->common.type) {
-
-#ifdef COMPILEDBINDINGS_DEBUG
-        dumpInstruction(instr);
-#endif
-
-#endif
-
-    QML_BEGIN_INSTR(Noop)
-    QML_END_INSTR(Noop)
-
-    QML_BEGIN_INSTR(BindingId)
-    QML_END_INSTR(BindingId)
-
-    QML_BEGIN_INSTR(SubscribeId)
-        subscribeId(context, instr->subscribe.index, instr->subscribe.offset);
-    QML_END_INSTR(SubscribeId)
-
-    QML_BEGIN_INSTR(Subscribe)
-    {
-        QObject *o = 0;
-        const Register &object = registers[instr->subscribe.reg];
-        if (!object.isUndefined()) o = object.getQObject();
-        subscribe(o, instr->subscribe.index, instr->subscribe.offset);
-    }
-    QML_END_INSTR(Subscribe)
-
-    QML_BEGIN_INSTR(FetchAndSubscribe)
-    {
-        const Register &input = registers[instr->fetchAndSubscribe.objectReg];
-        Register &output = registers[instr->fetchAndSubscribe.output];
-
-        if (input.isUndefined()) {
-            throwException(instr->fetchAndSubscribe.exceptionId, error, program, context);
-            return;
-        }
-
-        QObject *object = input.getQObject();
-        if (!object) {
-            output.setUndefined();
-        } else {
-            int subIdx = instr->fetchAndSubscribe.subscription;
-            QDeclarativeCompiledBindingsPrivate::Subscription *sub = 0;
-            if (subIdx != -1) {
-                sub = (subscriptions + subIdx);
-                sub->target = q;
-                sub->targetMethod = methodCount + subIdx; 
-            }
-            fastProperties()->accessor(instr->fetchAndSubscribe.function)(object, output.typeDataPtr(), sub);
-        }
-    }
-    QML_END_INSTR(FetchAndSubscribe)
-
-    QML_BEGIN_INSTR(LoadId)
-        registers[instr->load.reg].setQObject(context->idValues[instr->load.index].data());
-    QML_END_INSTR(LoadId)
-
-    QML_BEGIN_INSTR(LoadScope)
-        registers[instr->load.reg].setQObject(scope);
-    QML_END_INSTR(LoadScope)
-
-    QML_BEGIN_INSTR(LoadRoot)
-        registers[instr->load.reg].setQObject(context->contextObject);
-    QML_END_INSTR(LoadRoot)
-
-    QML_BEGIN_INSTR(LoadAttached)
-    {
-        const Register &input = registers[instr->attached.reg];
-        Register &output = registers[instr->attached.output];
-        if (input.isUndefined()) {
-            throwException(instr->attached.exceptionId, error, program, context);
-            return;
-        }
-
-        QObject *object = registers[instr->attached.reg].getQObject();
-        if (!object) {
-            output.setUndefined();
-        } else {
-            QObject *attached = 
-                qmlAttachedPropertiesObjectById(instr->attached.id, 
-                                                registers[instr->attached.reg].getQObject(), 
-                                                true);
-            Q_ASSERT(attached);
-            output.setQObject(attached);
-        }
-    }
-    QML_END_INSTR(LoadAttached)
-
-    QML_BEGIN_INSTR(ConvertIntToReal)
-    {
-        const Register &input = registers[instr->unaryop.src];
-        Register &output = registers[instr->unaryop.output];
-        if (input.isUndefined()) output.setUndefined();
-        else output.setqreal(qreal(input.getint()));
-    }
-    QML_END_INSTR(ConvertIntToReal)
-
-    QML_BEGIN_INSTR(ConvertRealToInt)
-    {
-        const Register &input = registers[instr->unaryop.src];
-        Register &output = registers[instr->unaryop.output];
-        if (input.isUndefined()) output.setUndefined();
-        else output.setint(qRound(input.getqreal()));
-    }
-    QML_END_INSTR(ConvertRealToInt)
-
-    QML_BEGIN_INSTR(Real)
-        registers[instr->real_value.reg].setqreal(instr->real_value.value);
-    QML_END_INSTR(Real)
-
-    QML_BEGIN_INSTR(Int)
-        registers[instr->int_value.reg].setint(instr->int_value.value);
-    QML_END_INSTR(Int)
-        
-    QML_BEGIN_INSTR(Bool)
-        registers[instr->bool_value.reg].setbool(instr->bool_value.value);
-    QML_END_INSTR(Bool)
-
-    QML_BEGIN_INSTR(String)
-    {
-        Register &output = registers[instr->string_value.reg];
-        new (output.getstringptr()) 
-            QString((QChar *)(data + instr->string_value.offset), instr->string_value.length);
-        output.settype(QMetaType::QString);
-    }
-    QML_END_INSTR(String)
-
-    QML_BEGIN_INSTR(AddReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setqreal(lhs.getqreal() + rhs.getqreal());
-    }
-    QML_END_INSTR(AddReal)
-
-    QML_BEGIN_INSTR(AddInt)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setint(lhs.getint() + rhs.getint());
-    }
-    QML_END_INSTR(AddInt)
-        
-    QML_BEGIN_INSTR(AddString)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() && rhs.isUndefined()) { output.setNaN(); }
-        else {
-            if (lhs.isUndefined())
-                new (output.getstringptr())
-                    QString(QLatin1String("undefined") + *registers[instr->binaryop.src2].getstringptr());
-            else if (rhs.isUndefined())
-                new (output.getstringptr())
-                    QString(*registers[instr->binaryop.src1].getstringptr() + QLatin1String("undefined"));
-            else
-                new (output.getstringptr()) 
-                    QString(*registers[instr->binaryop.src1].getstringptr() + 
-                            *registers[instr->binaryop.src2].getstringptr());
-            output.settype(QMetaType::QString);
-        }
-    }
-    QML_END_INSTR(AddString)
-
-    QML_BEGIN_INSTR(MinusReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setqreal(lhs.getqreal() - rhs.getqreal());
-    }
-    QML_END_INSTR(MinusReal)
-
-    QML_BEGIN_INSTR(MinusInt)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setint(lhs.getint() - rhs.getint());
-    }
-    QML_END_INSTR(MinusInt)
-
-    QML_BEGIN_INSTR(CompareReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setbool(lhs.isUndefined() == rhs.isUndefined());
-        else output.setbool(lhs.getqreal() == rhs.getqreal());
-    }
-    QML_END_INSTR(CompareReal)
-
-    QML_BEGIN_INSTR(CompareString)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setbool(lhs.isUndefined() == rhs.isUndefined());
-        else output.setbool(*lhs.getstringptr() == *rhs.getstringptr());
-    }
-    QML_END_INSTR(CompareString)
-
-    QML_BEGIN_INSTR(NotCompareReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setbool(lhs.isUndefined() != rhs.isUndefined());
-        else output.setbool(lhs.getqreal() != rhs.getqreal());
-    }
-    QML_END_INSTR(NotCompareReal)
-
-    QML_BEGIN_INSTR(NotCompareString)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setbool(lhs.isUndefined() != rhs.isUndefined());
-        else output.setbool(*lhs.getstringptr() != *rhs.getstringptr());
-    }
-    QML_END_INSTR(NotCompareString)
-
-    QML_BEGIN_INSTR(GreaterThanReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setbool(false);
-        else output.setbool(lhs.getqreal() > rhs.getqreal());
-    }
-    QML_END_INSTR(GreaterThanReal)
-
-    QML_BEGIN_INSTR(MaxReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setqreal(qMax(lhs.getqreal(), rhs.getqreal()));
-    }
-    QML_END_INSTR(MaxReal)
-
-    QML_BEGIN_INSTR(MinReal)
-    {
-        const Register &lhs = registers[instr->binaryop.src1];
-        const Register &rhs = registers[instr->binaryop.src2];
-        Register &output = registers[instr->binaryop.output];
-        if (lhs.isUndefined() || rhs.isUndefined()) output.setNaN();
-        else output.setqreal(qMin(lhs.getqreal(), rhs.getqreal()));
-    }
-    QML_END_INSTR(MinReal)
-
-    QML_BEGIN_INSTR(NewString)
-    {
-        Register &output = registers[instr->construct.reg];
-        new (output.getstringptr()) QString;
-        output.settype(QMetaType::QString);
-    }
-    QML_END_INSTR(NewString)
-
-    QML_BEGIN_INSTR(NewUrl)
-    {
-        Register &output = registers[instr->construct.reg];
-        new (output.geturlptr()) QUrl;
-        output.settype(QMetaType::QUrl);
-    }
-    QML_END_INSTR(NewUrl)
-
-    QML_BEGIN_INSTR(CleanupString)
-        registers[instr->cleanup.reg].getstringptr()->~QString();
-#ifdef REGISTER_CLEANUP_DEBUG
-        registers[instr->cleanup.reg].setUndefined();
-#endif
-    QML_END_INSTR(CleanupString)
-
-    QML_BEGIN_INSTR(CleanupUrl)
-        registers[instr->cleanup.reg].geturlptr()->~QUrl();
-#ifdef REGISTER_CLEANUP_DEBUG
-        registers[instr->cleanup.reg].setUndefined();
-#endif
-    QML_END_INSTR(CleanupUrl)
-
-    QML_BEGIN_INSTR(Fetch)
-    {
-        const Register &input = registers[instr->fetch.objectReg];
-        Register &output = registers[instr->fetch.output];
-
-        if (input.isUndefined()) {
-            throwException(instr->fetch.exceptionId, error, program, context);
-            return;
-        }
-
-        QObject *object = input.getQObject();
-        if (!object) {
-            output.setUndefined();
-        } else {
-            void *argv[] = { output.typeDataPtr(), 0 };
-            QMetaObject::metacall(object, QMetaObject::ReadProperty, instr->fetch.index, argv);
-        }
-    }
-    QML_END_INSTR(Fetch)
-
-    QML_BEGIN_INSTR(Store)
-    {
-        Register &data = registers[instr->store.reg];
-        if (data.isUndefined()) {
-            throwException(instr->store.exceptionId, error, program, context,
-                           QLatin1String("Unable to assign undefined value"));
-            return;
-        }
-
-        int status = -1;
-        void *argv[] = { data.typeDataPtr(), 0, &status, &storeFlags };
-        QMetaObject::metacall(output, QMetaObject::WriteProperty, 
-                              instr->store.index, argv);
-    }
-    QML_END_INSTR(Store)
-
-    QML_BEGIN_INSTR(Copy)
-        registers[instr->copy.reg] = registers[instr->copy.src];
-    QML_END_INSTR(Copy)
-
-    QML_BEGIN_INSTR(Skip)
-        if (instr->skip.reg == -1 || !registers[instr->skip.reg].getbool()) 
-            instr += instr->skip.count;
-    QML_END_INSTR(Skip)
-
-    QML_BEGIN_INSTR(Done)
-        return;
-    QML_END_INSTR(Done)
-
-    QML_BEGIN_INSTR(InitString)
-        if (!identifiers[instr->initstring.offset].identifier) {
-            quint32 len = *(quint32 *)(data + instr->initstring.dataIdx);
-            QChar *strdata = (QChar *)(data + instr->initstring.dataIdx + sizeof(quint32)); 
-
-            QString str = QString::fromRawData(strdata, len);
-
-            identifiers[instr->initstring.offset] = engine->objectClass->createPersistentIdentifier(str);
-        }
-    QML_END_INSTR(InitString)
-
-    QML_BEGIN_INSTR(FindGenericTerminal)
-        // We start the search in the parent context, as we know that the 
-        // name is not present in the current context or it would have been
-        // found during the static compile
-        findgeneric(registers + instr->find.reg, instr->find.subscribeIndex, 
-                    context->parent,
-                    identifiers[instr->find.name].identifier, 
-                    instr->common.type == Instr::FindGenericTerminal);
-    QML_END_INSTR(FindGenericTerminal)
-
-    QML_BEGIN_INSTR(FindGeneric)
-        // We start the search in the parent context, as we know that the
-        // name is not present in the current context or it would have been
-        // found during the static compile
-        findgeneric(registers + instr->find.reg, instr->find.subscribeIndex,
-                    context->parent,
-                    identifiers[instr->find.name].identifier,
-                    instr->common.type == Instr::FindGenericTerminal);
-    QML_END_INSTR(FindGeneric)
-
-    QML_BEGIN_INSTR(FindPropertyTerminal)
-    {
-        const Register &object = registers[instr->find.src];
-        if (object.isUndefined()) {
-            throwException(instr->find.exceptionId, error, program, context);
-            return;
-        }
-
-        findproperty(object.getQObject(), registers + instr->find.reg, 
-                     QDeclarativeEnginePrivate::get(context->engine), 
-                     instr->find.subscribeIndex, identifiers[instr->find.name].identifier, 
-                     instr->common.type == Instr::FindPropertyTerminal);
-    }
-    QML_END_INSTR(FindPropertyTerminal)
-
-    QML_BEGIN_INSTR(FindProperty)
-    {
-        const Register &object = registers[instr->find.src];
-        if (object.isUndefined()) {
-            throwException(instr->find.exceptionId, error, program, context);
-            return;
-        }
-
-        findproperty(object.getQObject(), registers + instr->find.reg,
-                     QDeclarativeEnginePrivate::get(context->engine),
-                     instr->find.subscribeIndex, identifiers[instr->find.name].identifier,
-                     instr->common.type == Instr::FindPropertyTerminal);
-    }
-    QML_END_INSTR(FindProperty)
-
-    QML_BEGIN_INSTR(CleanupGeneric)
-    {
-        int type = registers[instr->cleanup.reg].gettype();
-        if (type == qMetaTypeId<QVariant>()) {
-            registers[instr->cleanup.reg].getvariantptr()->~QVariant();
-#ifdef REGISTER_CLEANUP_DEBUG
-        registers[instr->cleanup.reg].setUndefined();
-#endif
-        } else if (type == QMetaType::QString) {
-            registers[instr->cleanup.reg].getstringptr()->~QString();
-#ifdef REGISTER_CLEANUP_DEBUG
-        registers[instr->cleanup.reg].setUndefined();
-#endif
-        } else if (type == QMetaType::QUrl) {
-            registers[instr->cleanup.reg].geturlptr()->~QUrl();
-#ifdef REGISTER_CLEANUP_DEBUG
-        registers[instr->cleanup.reg].setUndefined();
-#endif
-        }
-    }
-    QML_END_INSTR(CleanupGeneric)
-
-    QML_BEGIN_INSTR(ConvertGenericToReal)
-    {
-        Register &output = registers[instr->unaryop.output];
-        Register &input = registers[instr->unaryop.src];
-        bool ok = true;
-        output.setqreal(toReal(&input, input.gettype(), &ok));
-        if (!ok) output.setUndefined();
-    }
-    QML_END_INSTR(ConvertGenericToReal)
-
-    QML_BEGIN_INSTR(ConvertGenericToBool)
-    {
-        Register &output = registers[instr->unaryop.output];
-        Register &input = registers[instr->unaryop.src];
-        bool ok = true;
-        output.setbool(toBool(&input, input.gettype(), &ok));
-        if (!ok) output.setUndefined();
-    }
-    QML_END_INSTR(ConvertGenericToBool)
-
-    QML_BEGIN_INSTR(ConvertGenericToString)
-    {
-        Register &output = registers[instr->unaryop.output];
-        Register &input = registers[instr->unaryop.src];
-        bool ok = true;
-        QString str = toString(&input, input.gettype(), &ok);
-        if (ok) { new (output.getstringptr()) QString(str); output.settype(QMetaType::QString); }
-        else { output.setUndefined(); }
-    }
-    QML_END_INSTR(ConvertGenericToString)
-
-    QML_BEGIN_INSTR(ConvertGenericToUrl)
-    {
-        Register &output = registers[instr->unaryop.output];
-        Register &input = registers[instr->unaryop.src];
-        bool ok = true;
-        QUrl url = toUrl(&input, input.gettype(), context, &ok);
-        if (ok) { new (output.geturlptr()) QUrl(url); output.settype(QMetaType::QUrl); }
-        else { output.setUndefined(); }
-    }
-    QML_END_INSTR(ConvertGenericToUrl)
-
-#ifdef QML_THREADED_INTERPRETER
-    // nothing to do
-#else
-    default:
-        qFatal("EEK");
-        break;
-    } // switch
-
-    ++instr;
-    } // while
-#endif
-}
-
-void QDeclarativeBindingCompiler::dump(const QByteArray &programData)
-{
-    const Program *program = (const Program *)programData.constData();
-
-    qWarning() << "Program.bindings:" << program->bindings;
-    qWarning() << "Program.dataLength:" << program->dataLength;
-    qWarning() << "Program.subscriptions:" << program->subscriptions;
-    qWarning() << "Program.indentifiers:" << program->identifiers;
-
-    int count = program->instructionCount;
-    const Instr *instr = program->instructions();
-
-    while (count--) {
-
-        dumpInstruction(instr);
-        ++instr;
-    }
-}
-
-/*!
-Clear the state associated with attempting to compile a specific binding.
-This does not clear the global "committed binding" states.
-*/
-void QDeclarativeBindingCompilerPrivate::resetInstanceState()
-{
-    registers = 0;
-    registerCleanups.clear();
-    data = committed.data;
-    exceptions = committed.exceptions;
-    usedSubscriptionIds.clear();
-    subscriptionSet.clear();
-    subscriptionIds = committed.subscriptionIds;
-    registeredStrings = committed.registeredStrings;
-    bytecode.clear();
-}
-
-/*!
-Mark the last compile as successful, and add it to the "committed data"
-section.
-
-Returns the index for the committed binding.
-*/
-int QDeclarativeBindingCompilerPrivate::commitCompile()
-{
-    int rv = committed.count();
-    committed.offsets << committed.bytecode.count();
-    committed.dependencies << usedSubscriptionIds;
-    committed.bytecode << bytecode;
-    committed.data = data;
-    committed.exceptions = exceptions;
-    committed.subscriptionIds = subscriptionIds;
-    committed.registeredStrings = registeredStrings;
-    return rv;
-}
-
-bool QDeclarativeBindingCompilerPrivate::compile(QDeclarativeJS::AST::Node *node)
-{
-    resetInstanceState();
-
-    if (destination->type == -1)
-        return false;
-
-    if (bindingsDump()) {
-        QDeclarativeJS::AST::ExpressionNode *n = node->expressionCast();
-        if (n) {
-            Instr id;
-            id.common.type = Instr::BindingId;
-            id.id.column = n->firstSourceLocation().startColumn;
-            id.id.line = n->firstSourceLocation().startLine;
-            bytecode << id;
-        }
-    }
-
-    Result type;
-
-    if (!parseExpression(node, type)) 
-        return false;
-
-    if (subscriptionSet.count() > 0xFFFF ||
-            registeredStrings.count() > 0xFFFF)
-        return false;
-
-    if (type.unknownType) {
-        if (!qmlExperimental())
-            return false;
-
-        if (destination->type != QMetaType::QReal &&
-            destination->type != QVariant::String &&
-            destination->type != QMetaType::Bool &&
-            destination->type != QVariant::Url)
-            return false;
-
-        int convertReg = acquireReg();
-        if (convertReg == -1)
-            return false;
-
-        if (destination->type == QMetaType::QReal) {
-            Instr convert;
-            convert.common.type = Instr::ConvertGenericToReal;
-            convert.unaryop.output = convertReg;
-            convert.unaryop.src = type.reg;
-            bytecode << convert;
-        } else if (destination->type == QVariant::String) {
-            Instr convert;
-            convert.common.type = Instr::ConvertGenericToString;
-            convert.unaryop.output = convertReg;
-            convert.unaryop.src = type.reg;
-            bytecode << convert;
-        } else if (destination->type == QMetaType::Bool) {
-            Instr convert;
-            convert.common.type = Instr::ConvertGenericToBool;
-            convert.unaryop.output = convertReg;
-            convert.unaryop.src = type.reg;
-            bytecode << convert;
-        } else if (destination->type == QVariant::Url) {
-            Instr convert;
-            convert.common.type = Instr::ConvertGenericToUrl;
-            convert.unaryop.output = convertReg;
-            convert.unaryop.src = type.reg;
-            bytecode << convert;
-        }
-
-        Instr cleanup;
-        cleanup.common.type = Instr::CleanupGeneric;
-        cleanup.cleanup.reg = type.reg;
-        bytecode << cleanup;
-
-        Instr instr;
-        instr.common.type = Instr::Store;
-        instr.store.output = 0;
-        instr.store.index = destination->index;
-        instr.store.reg = convertReg;
-        instr.store.exceptionId = exceptionId(node->expressionCast());
-        bytecode << instr;
-
-        if (destination->type == QVariant::String) {
-            Instr cleanup;
-            cleanup.common.type = Instr::CleanupString;
-            cleanup.cleanup.reg = convertReg;
-            bytecode << cleanup;
-        } else if (destination->type == QVariant::Url) {
-            Instr cleanup;
-            cleanup.common.type = Instr::CleanupUrl;
-            cleanup.cleanup.reg = convertReg;
-            bytecode << cleanup;
-        }
-
-        releaseReg(convertReg);
-
-        Instr done;
-        done.common.type = Instr::Done;
-        bytecode << done;
-
-    } else {
-        // Can we store the final value?
-        if (type.type == QVariant::Int &&
-            destination->type == QMetaType::QReal) {
-            Instr instr;
-            instr.common.type = Instr::ConvertIntToReal;
-            instr.unaryop.output = type.reg;
-            instr.unaryop.src = type.reg;
-            bytecode << instr;
-            type.type = QMetaType::QReal;
-        } else if (type.type == QMetaType::QReal &&
-                   destination->type == QVariant::Int) {
-            Instr instr;
-            instr.common.type = Instr::ConvertRealToInt;
-            instr.unaryop.output = type.reg;
-            instr.unaryop.src = type.reg;
-            bytecode << instr;
-            type.type = QVariant::Int;
-        } else if (type.type == destination->type) {
-        } else {
-            const QMetaObject *from = type.metaObject;
-            const QMetaObject *to = engine->rawMetaObjectForType(destination->type);
-
-            if (QDeclarativePropertyPrivate::canConvert(from, to))
-                type.type = destination->type;
-        }
-
-        if (type.type == destination->type) {
-            Instr instr;
-            instr.common.type = Instr::Store;
-            instr.store.output = 0;
-            instr.store.index = destination->index;
-            instr.store.reg = type.reg;
-            instr.store.exceptionId = exceptionId(node->expressionCast());
-            bytecode << instr;
-
-            releaseReg(type.reg);
-
-            Instr done;
-            done.common.type = Instr::Done;
-            bytecode << done;
-        } else {
-            return false;
-        }
-    }
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseExpression(QDeclarativeJS::AST::Node *node, Result &type)
-{
-    while (node->kind == AST::Node::Kind_NestedExpression)
-        node = static_cast<AST::NestedExpression *>(node)->expression;
-
-    if (tryArith(node)) {
-        if (!parseArith(node, type)) return false;
-    } else if (tryLogic(node)) {
-        if (!parseLogic(node, type)) return false;
-    } else if (tryConditional(node)) {
-        if (!parseConditional(node, type)) return false;
-    } else if (tryName(node)) {
-        if (!parseName(node, type)) return false;
-    } else if (tryConstant(node)) {
-        if (!parseConstant(node, type)) return false;
-    } else if (tryMethod(node)) {
-        if (!parseMethod(node, type)) return false;
-    } else {
-        return false;
-    }
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryName(QDeclarativeJS::AST::Node *node)
-{
-    return node->kind == AST::Node::Kind_IdentifierExpression ||
-           node->kind == AST::Node::Kind_FieldMemberExpression;
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseName(AST::Node *node, Result &type)
-{
-    QStringList nameParts;
-    QList<AST::ExpressionNode *> nameNodes;
-    if (!buildName(nameParts, node, &nameNodes))
-        return false;
-
-    int reg = acquireReg();
-    if (reg == -1)
-        return false;
-    type.reg = reg;
-
-    QDeclarativeParser::Object *absType = 0;
-
-    QStringList subscribeName;
-
-    bool wasAttachedObject = false;
-
-    for (int ii = 0; ii < nameParts.count(); ++ii) {
-        const QString &name = nameParts.at(ii);
-
-        // We don't handle signal properties or attached properties
-        if (name.length() > 2 && name.startsWith(QLatin1String("on")) &&
-            name.at(2).isUpper())
-            return false;
-
-        QDeclarativeType *attachType = 0;
-        if (name.at(0).isUpper()) {
-            // Could be an attached property
-            if (ii == nameParts.count() - 1)
-                return false;
-            if (nameParts.at(ii + 1).at(0).isUpper())
-                return false;
-
-            QDeclarativeImportedNamespace *ns = 0;
-            if (!imports.resolveType(name.toUtf8(), &attachType, 0, 0, 0, &ns))
-                return false;
-            if (ns || !attachType || !attachType->attachedPropertiesType())
-                return false;
-
-            wasAttachedObject = true;
-        } 
-
-        if (ii == 0) {
-
-            if (attachType) {
-                Instr instr;
-                instr.common.type = Instr::LoadScope;
-                instr.load.index = 0;
-                instr.load.reg = reg;
-                bytecode << instr;
-
-                Instr attach;
-                attach.common.type = Instr::LoadAttached;
-                attach.attached.output = reg;
-                attach.attached.reg = reg;
-                attach.attached.id = attachType->attachedPropertiesId();
-                attach.attached.exceptionId = exceptionId(nameNodes.at(ii));
-                bytecode << attach;
-
-                subscribeName << contextName();
-                subscribeName << QLatin1String("$$$ATTACH_") + name;
-
-                absType = 0;
-                type.metaObject = attachType->attachedPropertiesType();
-
-                continue;
-            } else if (ids.contains(name)) {
-                QDeclarativeParser::Object *idObject = ids.value(name);
-                absType = idObject;
-                type.metaObject = absType->metaObject();
-
-                // We check if the id object is the root or 
-                // scope object to avoid a subscription
-                if (idObject == component) {
-                    Instr instr;
-                    instr.common.type = Instr::LoadRoot;
-                    instr.load.index = 0;
-                    instr.load.reg = reg;
-                    bytecode << instr;
-                } else if (idObject == context) {
-                    Instr instr;
-                    instr.common.type = Instr::LoadScope;
-                    instr.load.index = 0;
-                    instr.load.reg = reg;
-                    bytecode << instr;
-                } else {
-                    Instr instr;
-                    instr.common.type = Instr::LoadId;
-                    instr.load.index = idObject->idIndex;
-                    instr.load.reg = reg;
-                    bytecode << instr;
-
-                    subscribeName << QLatin1String("$$$ID_") + name;
-
-                    if (subscription(subscribeName, &type)) {
-                        Instr sub;
-                        sub.common.type = Instr::SubscribeId;
-                        sub.subscribe.offset = subscriptionIndex(subscribeName);
-                        sub.subscribe.reg = reg;
-                        sub.subscribe.index = instr.load.index;
-                        bytecode << sub;
-                    }
-                }
-
-            } else {
-
-                QByteArray utf8Name = name.toUtf8();
-                const char *cname = utf8Name.constData();
-
-                int d0Idx = (context == component)?-1:context->metaObject()->indexOfProperty(cname);
-                int d1Idx = -1;
-                if (d0Idx == -1)
-                    d1Idx = component->metaObject()->indexOfProperty(cname);
-
-                if (d0Idx != -1) {
-                    Instr instr;
-                    instr.common.type = Instr::LoadScope;
-                    instr.load.index = 0;
-                    instr.load.reg = reg;
-                    bytecode << instr;
-
-                    subscribeName << contextName();
-                    subscribeName << name;
-
-                    if (!fetch(type, context->metaObject(), reg, d0Idx, subscribeName, nameNodes.at(ii)))
-                        return false;
-                } else if(d1Idx != -1) {
-                    Instr instr;
-                    instr.common.type = Instr::LoadRoot;
-                    instr.load.index = 0;
-                    instr.load.reg = reg;
-                    bytecode << instr;
-
-                    subscribeName << QLatin1String("$$$ROOT");
-                    subscribeName << name;
-
-                    if (!fetch(type, component->metaObject(), reg, d1Idx, subscribeName, nameNodes.at(ii)))
-                        return false;
-                } else if (qmlExperimental()) {
-                    Instr find;
-                    if (nameParts.count() == 1)
-                        find.common.type = Instr::FindGenericTerminal;
-                    else
-                        find.common.type = Instr::FindGeneric;
-
-                    find.find.reg = reg;
-                    find.find.src = -1;
-                    find.find.name = registerString(name);
-                    find.find.exceptionId = exceptionId(nameNodes.at(ii));
-
-                    subscribeName << QString(QLatin1String("$$$Generic_") + name);
-                    if (subscription(subscribeName, &type)) 
-                        find.find.subscribeIndex = subscriptionIndex(subscribeName);
-                    else
-                        find.find.subscribeIndex = -1;
-
-                    bytecode << find;
-                    type.unknownType = true;
-                } 
-
-                if (!type.unknownType && type.type == -1)
-                    return false; // Couldn't fetch that type
-            } 
-
-        } else {
-
-            if (attachType) {
-                Instr attach;
-                attach.common.type = Instr::LoadAttached;
-                attach.attached.output = reg;
-                attach.attached.reg = reg;
-                attach.attached.id = attachType->attachedPropertiesId();
-                bytecode << attach;
-
-                absType = 0;
-                type.metaObject = attachType->attachedPropertiesType();
-
-                subscribeName << QLatin1String("$$$ATTACH_") + name;
-                continue;
-            }
-
-            const QMetaObject *mo = 0;
-            if (absType)
-                mo = absType->metaObject();
-            else if (type.metaObject)
-                mo = type.metaObject;
-
-            QByteArray utf8Name = name.toUtf8();
-            const char *cname = utf8Name.constData();
-            int idx = mo?mo->indexOfProperty(cname):-1;
-            if (absType && idx == -1)
-                return false;
-
-            subscribeName << name;
-
-            if (absType || (wasAttachedObject && idx != -1) || (mo && mo->property(idx).isFinal())) {
-                absType = 0; 
-                if (!fetch(type, mo, reg, idx, subscribeName, nameNodes.at(ii)))
-                    return false;
-            } else {
-
-                Instr prop;
-                if (ii == nameParts.count() -1 ) 
-                    prop.common.type = Instr::FindPropertyTerminal;
-                else
-                    prop.common.type = Instr::FindProperty;
-
-                prop.find.reg = reg;
-                prop.find.src = reg;
-                prop.find.name = registerString(name);
-                prop.find.exceptionId = exceptionId(nameNodes.at(ii));
-
-                if (subscription(subscribeName, &type))
-                    prop.find.subscribeIndex = subscriptionIndex(subscribeName);
-                else
-                    prop.find.subscribeIndex = -1;
-
-                type.unknownType = true;
-                type.metaObject = 0;
-                type.type = -1;
-                type.reg = reg;
-                bytecode << prop;
-            }
-        }
-
-        wasAttachedObject = false;
-    }
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryArith(QDeclarativeJS::AST::Node *node)
-{
-    if (node->kind != AST::Node::Kind_BinaryExpression)
-        return false;
-
-    AST::BinaryExpression *expression = static_cast<AST::BinaryExpression *>(node);
-    if (expression->op == QSOperator::Add ||
-        expression->op == QSOperator::Sub)
-        return true;
-    else
-        return false;
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseArith(QDeclarativeJS::AST::Node *node, Result &type)
-{
-    AST::BinaryExpression *expression = static_cast<AST::BinaryExpression *>(node);
-
-    type.reg = acquireReg();
-    if (type.reg == -1)
-        return false;
-
-    Result lhs;
-    Result rhs;
-
-    if (!parseExpression(expression->left, lhs)) return false;
-    if (!parseExpression(expression->right, rhs)) return false;
-
-    if ((lhs.type == QVariant::Int || lhs.type == QMetaType::QReal) &&
-        (rhs.type == QVariant::Int || rhs.type == QMetaType::QReal))
-        return numberArith(type, lhs, rhs, (QSOperator::Op)expression->op);
-    else if(expression->op == QSOperator::Sub)
-        return numberArith(type, lhs, rhs, (QSOperator::Op)expression->op);
-    else if ((lhs.type == QMetaType::QString || lhs.unknownType) && 
-             (rhs.type == QMetaType::QString || rhs.unknownType) && 
-             (lhs.type == QMetaType::QString || rhs.type == QMetaType::QString))
-        return stringArith(type, lhs, rhs, (QSOperator::Op)expression->op);
-    else
-        return false;
-}
-
-bool QDeclarativeBindingCompilerPrivate::numberArith(Result &type, const Result &lhs, const Result &rhs, QSOperator::Op op)
-{
-    bool nativeReal = rhs.type == QMetaType::QReal ||
-                      lhs.type == QMetaType::QReal ||
-                      lhs.unknownType ||
-                      rhs.unknownType;
-
-    if (nativeReal && lhs.type == QMetaType::Int) {
-        Instr convert;
-        convert.common.type = Instr::ConvertIntToReal;
-        convert.unaryop.output = lhs.reg;
-        convert.unaryop.src = lhs.reg;
-        bytecode << convert;
-    }
-
-    if (nativeReal && rhs.type == QMetaType::Int) {
-        Instr convert;
-        convert.common.type = Instr::ConvertIntToReal;
-        convert.unaryop.output = rhs.reg;
-        convert.unaryop.src = rhs.reg;
-        bytecode << convert;
-    }
-
-    int lhsTmp = -1;
-    int rhsTmp = -1;
-
-    if (lhs.unknownType) {
-        if (!qmlExperimental())
-            return false;
-
-        lhsTmp = acquireReg();
-        if (lhsTmp == -1)
-            return false;
-
-        Instr conv;
-        conv.common.type = Instr::ConvertGenericToReal;
-        conv.unaryop.output = lhsTmp;
-        conv.unaryop.src = lhs.reg;
-        bytecode << conv;
-    }
-
-    if (rhs.unknownType) {
-        if (!qmlExperimental())
-            return false;
-
-        rhsTmp = acquireReg();
-        if (rhsTmp == -1)
-            return false;
-
-        Instr conv;
-        conv.common.type = Instr::ConvertGenericToReal;
-        conv.unaryop.output = rhsTmp;
-        conv.unaryop.src = rhs.reg;
-        bytecode << conv;
-    }
-
-    Instr arith;
-    if (op == QSOperator::Add) {
-        arith.common.type = nativeReal?Instr::AddReal:Instr::AddInt;
-    } else if (op == QSOperator::Sub) {
-        arith.common.type = nativeReal?Instr::MinusReal:Instr::MinusInt;
-    } else {
-        qFatal("Unsupported arithmetic operator");
-    }
-
-    arith.binaryop.output = type.reg;
-    arith.binaryop.src1 = (lhsTmp == -1)?lhs.reg:lhsTmp;
-    arith.binaryop.src2 = (rhsTmp == -1)?rhs.reg:rhsTmp;
-    bytecode << arith;
-
-    type.metaObject = 0;
-    type.type = nativeReal?QMetaType::QReal:QMetaType::Int;
-    type.subscriptionSet.unite(lhs.subscriptionSet);
-    type.subscriptionSet.unite(rhs.subscriptionSet);
-
-    if (lhsTmp != -1) releaseReg(lhsTmp);
-    if (rhsTmp != -1) releaseReg(rhsTmp);
-    releaseReg(lhs.reg);
-    releaseReg(rhs.reg);
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::stringArith(Result &type, const Result &lhs, const Result &rhs, QSOperator::Op op)
-{
-    if (op != QSOperator::Add)
-        return false;
-
-    int lhsTmp = -1;
-    int rhsTmp = -1;
-
-    if (lhs.unknownType) {
-        if (!qmlExperimental())
-            return false;
-
-        lhsTmp = acquireReg(Instr::CleanupString);
-        if (lhsTmp == -1)
-            return false;
-
-        Instr convert;
-        convert.common.type = Instr::ConvertGenericToString;
-        convert.unaryop.output = lhsTmp;
-        convert.unaryop.src = lhs.reg;
-        bytecode << convert;
-    }
-
-    if (rhs.unknownType) {
-        if (!qmlExperimental())
-            return false;
-
-        rhsTmp = acquireReg(Instr::CleanupString);
-        if (rhsTmp == -1)
-            return false;
-
-        Instr convert;
-        convert.common.type = Instr::ConvertGenericToString;
-        convert.unaryop.output = rhsTmp;
-        convert.unaryop.src = rhs.reg;
-        bytecode << convert;
-    }
-
-    type.reg = acquireReg(Instr::CleanupString);
-    if (type.reg == -1)
-        return false;
-
-    type.type = QMetaType::QString;
-
-    Instr add;
-    add.common.type = Instr::AddString;
-    add.binaryop.output = type.reg;
-    add.binaryop.src1 = (lhsTmp == -1)?lhs.reg:lhsTmp;
-    add.binaryop.src2 = (rhsTmp == -1)?rhs.reg:rhsTmp;
-    bytecode << add;
-
-    if (lhsTmp != -1) releaseReg(lhsTmp);
-    if (rhsTmp != -1) releaseReg(rhsTmp);
-    releaseReg(lhs.reg);
-    releaseReg(rhs.reg);
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryLogic(QDeclarativeJS::AST::Node *node)
-{
-    if (node->kind != AST::Node::Kind_BinaryExpression)
-        return false;
-
-    AST::BinaryExpression *expression = static_cast<AST::BinaryExpression *>(node);
-    if (expression->op == QSOperator::Gt ||
-        expression->op == QSOperator::Equal ||
-        expression->op == QSOperator::NotEqual)
-        return true;
-    else
-        return false;
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseLogic(QDeclarativeJS::AST::Node *node, Result &type)
-{
-    AST::BinaryExpression *expression = static_cast<AST::BinaryExpression *>(node);
-
-    Result lhs;
-    Result rhs;
-
-    if (!parseExpression(expression->left, lhs)) return false;
-    if (!parseExpression(expression->right, rhs)) return false;
-
-    type.reg = acquireReg();
-    if (type.reg == -1)
-        return false;
-
-    type.metaObject = 0;
-    type.type = QVariant::Bool;
-
-    if (lhs.type == QMetaType::QReal && rhs.type == QMetaType::QReal) {
-
-        Instr op;
-        if (expression->op == QSOperator::Gt)
-            op.common.type = Instr::GreaterThanReal;
-        else if (expression->op == QSOperator::Equal)
-            op.common.type = Instr::CompareReal;
-        else if (expression->op == QSOperator::NotEqual)
-            op.common.type = Instr::NotCompareReal;
-        else
-            return false;
-        op.binaryop.output = type.reg;
-        op.binaryop.src1 = lhs.reg;
-        op.binaryop.src2 = rhs.reg;
-        bytecode << op;
-
-
-    } else if (lhs.type == QMetaType::QString && rhs.type == QMetaType::QString) {
-
-        Instr op;
-        if (expression->op == QSOperator::Equal)
-            op.common.type = Instr::CompareString;
-        else if (expression->op == QSOperator::NotEqual)
-            op.common.type = Instr::NotCompareString;
-        else
-            return false;
-        op.binaryop.output = type.reg;
-        op.binaryop.src1 = lhs.reg;
-        op.binaryop.src2 = rhs.reg;
-        bytecode << op;
-
-    } else {
-        return false;
-    }
-
-    releaseReg(lhs.reg);
-    releaseReg(rhs.reg);
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryConditional(QDeclarativeJS::AST::Node *node)
-{
-    return (node->kind == AST::Node::Kind_ConditionalExpression);
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseConditional(QDeclarativeJS::AST::Node *node, Result &type)
-{
-    AST::ConditionalExpression *expression = static_cast<AST::ConditionalExpression *>(node);
-
-    AST::Node *test = expression->expression;
-    if (test->kind == AST::Node::Kind_NestedExpression)
-        test = static_cast<AST::NestedExpression*>(test)->expression;
-
-    Result etype;
-    if (!parseExpression(test, etype)) return false;
-
-    if (etype.type != QVariant::Bool) 
-        return false;
-
-    Instr skip;
-    skip.common.type = Instr::Skip;
-    skip.skip.reg = etype.reg;
-    skip.skip.count = 0;
-    int skipIdx = bytecode.count();
-    bytecode << skip;
-
-    // Release to allow reuse of reg
-    releaseReg(etype.reg);
-
-    QSet<QString> preSubSet = subscriptionSet;
-
-    // int preConditionalSubscriptions = subscriptionSet.count();
-
-    Result ok;
-    if (!parseExpression(expression->ok, ok)) return false;
-    if (ok.unknownType) return false;
-
-    int skipIdx2 = bytecode.count();
-    skip.skip.reg = -1;
-    bytecode << skip;
-
-    // Release to allow reuse of reg
-    releaseReg(ok.reg);
-    bytecode[skipIdx].skip.count = bytecode.count() - skipIdx - 1;
-
-    subscriptionSet = preSubSet;
-
-    Result ko;
-    if (!parseExpression(expression->ko, ko)) return false;
-    if (ko.unknownType) return false;
-
-    // Release to allow reuse of reg
-    releaseReg(ko.reg);
-    bytecode[skipIdx2].skip.count = bytecode.count() - skipIdx2 - 1;
-
-    if (ok != ko)
-        return false; // Must be same type and in same register
-
-    subscriptionSet = preSubSet;
-
-    if (!subscriptionNeutral(subscriptionSet, ok.subscriptionSet, ko.subscriptionSet))
-        return false; // Conditionals cannot introduce new subscriptions
-
-    type = ok;
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryConstant(QDeclarativeJS::AST::Node *node)
-{
-    return node->kind == AST::Node::Kind_TrueLiteral ||
-           node->kind == AST::Node::Kind_FalseLiteral ||
-           node->kind == AST::Node::Kind_NumericLiteral ||
-           node->kind == AST::Node::Kind_StringLiteral;
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseConstant(QDeclarativeJS::AST::Node *node, Result &type)
-{
-    type.metaObject = 0;
-    type.type = -1;
-    type.reg = acquireReg();
-    if (type.reg == -1)
-        return false;
-
-    if (node->kind == AST::Node::Kind_TrueLiteral) {
-        type.type = QVariant::Bool;
-        Instr instr;
-        instr.common.type = Instr::Bool;
-        instr.bool_value.reg = type.reg;
-        instr.bool_value.value = true;
-        bytecode << instr;
-        return true;
-    } else if (node->kind == AST::Node::Kind_FalseLiteral) {
-        type.type = QVariant::Bool;
-        Instr instr;
-        instr.common.type = Instr::Bool;
-        instr.bool_value.reg = type.reg;
-        instr.bool_value.value = false;
-        bytecode << instr;
-        return true;
-    } else if (node->kind == AST::Node::Kind_NumericLiteral) {
-        qreal value = qreal(static_cast<AST::NumericLiteral *>(node)->value);
-
-        if (qreal(float(value)) != value)
-            return false;
-
-        type.type = QMetaType::QReal;
-        Instr instr;
-        instr.common.type = Instr::Real;
-        instr.real_value.reg = type.reg;
-        instr.real_value.value = float(value);
-        bytecode << instr;
-        return true;
-    } else if (node->kind == AST::Node::Kind_StringLiteral) {
-        QString str = static_cast<AST::StringLiteral *>(node)->value->asString();
-        type.type = QMetaType::QString;
-        type.reg = registerLiteralString(str);
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool QDeclarativeBindingCompilerPrivate::tryMethod(QDeclarativeJS::AST::Node *node)
-{
-    return node->kind == AST::Node::Kind_CallExpression; 
-}
-
-bool QDeclarativeBindingCompilerPrivate::parseMethod(QDeclarativeJS::AST::Node *node, Result &result)
-{
-    AST::CallExpression *expr = static_cast<AST::CallExpression *>(node);
-
-    QStringList name;
-    if (!buildName(name, expr->base))
-        return false;
-
-    if (name.count() != 2 || name.at(0) != QLatin1String("Math"))
-        return false;
-
-    QString method = name.at(1);
-
-    AST::ArgumentList *args = expr->arguments;
-    if (!args) return false;
-    AST::ExpressionNode *arg0 = args->expression;
-    args = args->next;
-    if (!args) return false;
-    AST::ExpressionNode *arg1 = args->expression;
-    if (args->next != 0) return false;
-    if (!arg0 || !arg1) return false;
-
-    Result r0;
-    if (!parseExpression(arg0, r0)) return false;
-    Result r1;
-    if (!parseExpression(arg1, r1)) return false;
-
-    if (r0.type != QMetaType::QReal || r1.type != QMetaType::QReal)
-        return false;
-
-    Instr op;
-    if (method == QLatin1String("max")) {
-        op.common.type = Instr::MaxReal;
-    } else if (method == QLatin1String("min")) {
-        op.common.type = Instr::MinReal;
-    } else {
-        return false;
-    }
-    // We release early to reuse registers
-    releaseReg(r0.reg);
-    releaseReg(r1.reg);
-
-    op.binaryop.output = acquireReg();
-    if (op.binaryop.output == -1)
-        return false;
-
-    op.binaryop.src1 = r0.reg;
-    op.binaryop.src2 = r1.reg;
-    bytecode << op;
-
-    result.type = QMetaType::QReal;
-    result.reg = op.binaryop.output;
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::buildName(QStringList &name,
-                                       QDeclarativeJS::AST::Node *node,
-                                       QList<QDeclarativeJS::AST::ExpressionNode *> *nodes)
-{
-    if (node->kind == AST::Node::Kind_IdentifierExpression) {
-        name << static_cast<AST::IdentifierExpression*>(node)->name->asString();
-        if (nodes) *nodes << static_cast<AST::IdentifierExpression*>(node);
-    } else if (node->kind == AST::Node::Kind_FieldMemberExpression) {
-        AST::FieldMemberExpression *expr =
-            static_cast<AST::FieldMemberExpression *>(node);
-
-        if (!buildName(name, expr->base, nodes))
-            return false;
-
-        name << expr->name->asString();
-        if (nodes) *nodes << expr;
-    } else {
-        return false;
-    }
-
-    return true;
-}
-
-bool QDeclarativeBindingCompilerPrivate::fetch(Result &rv, const QMetaObject *mo, int reg, 
-                                               int idx, const QStringList &subName, 
-                                               QDeclarativeJS::AST::ExpressionNode *node)
-{
-    QMetaProperty prop = mo->property(idx);
-    rv.metaObject = 0;
-    rv.type = 0;
-
-    //XXX binding optimizer doesn't handle properties with a revision
-    if (prop.revision() > 0)
-        return false;
-
-    int fastFetchIndex = fastProperties()->accessorIndexForProperty(mo, idx);
-
-    Instr fetch;
-
-    if (!qmlDisableFastProperties() && fastFetchIndex != -1) {
-        fetch.common.type = Instr::FetchAndSubscribe;
-        fetch.fetchAndSubscribe.objectReg = reg;
-        fetch.fetchAndSubscribe.output = reg;
-        fetch.fetchAndSubscribe.function = fastFetchIndex;
-        fetch.fetchAndSubscribe.subscription = subscriptionIndex(subName);
-        fetch.fetchAndSubscribe.exceptionId = exceptionId(node);
-    } else {
-        if (subscription(subName, &rv) && prop.hasNotifySignal() && prop.notifySignalIndex() != -1) {
-            Instr sub;
-            sub.common.type = Instr::Subscribe;
-            sub.subscribe.offset = subscriptionIndex(subName);
-            sub.subscribe.reg = reg;
-            sub.subscribe.index = prop.notifySignalIndex();
-            bytecode << sub;
-        }
-
-        fetch.common.type = Instr::Fetch;
-        fetch.fetch.objectReg = reg;
-        fetch.fetch.index = idx;
-        fetch.fetch.output = reg;
-        fetch.fetch.exceptionId = exceptionId(node);
-    }
-
-    rv.type = prop.userType();
-    rv.metaObject = engine->metaObjectForType(rv.type);
-    rv.reg = reg;
-
-    if (rv.type == QMetaType::QString) {
-        int tmp = acquireReg();
-        if (tmp == -1)
-            return false;
-        Instr copy;
-        copy.common.type = Instr::Copy;
-        copy.copy.reg = tmp;
-        copy.copy.src = reg;
-        bytecode << copy;
-        releaseReg(tmp);
-        fetch.fetch.objectReg = tmp;
-
-        Instr setup;
-        setup.common.type = Instr::NewString;
-        setup.construct.reg = reg;
-        bytecode << setup;
-        registerCleanup(reg, Instr::CleanupString);
-    }
-
-    bytecode << fetch;
-
-    if (!rv.metaObject &&
-        rv.type != QMetaType::QReal &&
-        rv.type != QMetaType::Int &&
-        rv.type != QMetaType::Bool &&
-        rv.type != qMetaTypeId<QDeclarativeAnchorLine>() &&
-        rv.type != QMetaType::QString) {
-        rv.metaObject = 0;
-        rv.type = 0;
-        return false; // Unsupported type (string not supported yet);
-    }
-
-    return true;
-}
-
-void QDeclarativeBindingCompilerPrivate::registerCleanup(int reg, int cleanup, int cleanupType)
-{
-    registerCleanups.insert(reg, qMakePair(cleanup, cleanupType));
-}
-
-int QDeclarativeBindingCompilerPrivate::acquireReg(int cleanup, int cleanupType)
-{
-    for (int ii = 0; ii < 32; ++ii) {
-        if (!(registers & (1 << ii))) {
-            registers |= (1 << ii);
-
-            if (cleanup != Instr::Noop)
-                registerCleanup(ii, cleanup, cleanupType);
-
-            return ii;
-        }
-    }
-    return -1;
-}
-
-void QDeclarativeBindingCompilerPrivate::releaseReg(int reg)
-{
-    Q_ASSERT(reg >= 0 && reg <= 31);
-
-    if (registerCleanups.contains(reg)) {
-        QPair<int, int> c = registerCleanups[reg];
-        registerCleanups.remove(reg);
-        Instr cleanup;
-        cleanup.common.type = (quint8)c.first;
-        cleanup.cleanup.reg = reg;
-        bytecode << cleanup;
-    }
-
-    quint32 mask = 1 << reg;
-    registers &= ~mask;
-}
-
-// Returns a reg
-int QDeclarativeBindingCompilerPrivate::registerLiteralString(const QString &str)
-{
-    QByteArray strdata((const char *)str.constData(), str.length() * sizeof(QChar));
-    int offset = data.count();
-    data += strdata;
-
-    int reg = acquireReg(Instr::CleanupString);
-    if (reg == -1)
-        return false;
-
-    Instr string;
-    string.common.type = Instr::String;
-    string.string_value.reg = reg;
-    string.string_value.offset = offset;
-    string.string_value.length = str.length();
-    bytecode << string;
-
-    return reg;
-}
-
-// Returns an identifier offset
-int QDeclarativeBindingCompilerPrivate::registerString(const QString &string)
-{
-    Q_ASSERT(!string.isEmpty());
-
-    QHash<QString, QPair<int, int> >::ConstIterator iter = registeredStrings.find(string);
-
-    if (iter == registeredStrings.end()) {
-        quint32 len = string.length();
-        QByteArray lendata((const char *)&len, sizeof(quint32));
-        QByteArray strdata((const char *)string.constData(), string.length() * sizeof(QChar));
-        strdata.prepend(lendata);
-        int rv = data.count();
-        data += strdata;
-
-        iter = registeredStrings.insert(string, qMakePair(registeredStrings.count(), rv));
-    } 
-
-    Instr reg;
-    reg.common.type = Instr::InitString;
-    reg.initstring.offset = iter->first;
-    reg.initstring.dataIdx = iter->second;
-    bytecode << reg;
-    return reg.initstring.offset;
-}
-
-bool QDeclarativeBindingCompilerPrivate::subscription(const QStringList &sub, Result *result)
-{
-    QString str = sub.join(QLatin1String("."));
-    result->subscriptionSet.insert(str);
-
-    if (subscriptionSet.contains(str)) {
-        return false;
-    } else {
-        subscriptionSet.insert(str);
-        return true;
-    }
-}
-
-int QDeclarativeBindingCompilerPrivate::subscriptionIndex(const QStringList &sub)
-{
-    QString str = sub.join(QLatin1String("."));
-    QHash<QString, int>::ConstIterator iter = subscriptionIds.find(str);
-    if (iter == subscriptionIds.end()) 
-        iter = subscriptionIds.insert(str, subscriptionIds.count());
-    usedSubscriptionIds.insert(*iter);
-    return *iter;
-}
-
-/*
-    Returns true if lhs contains no subscriptions that aren't also in base or rhs AND
-    rhs contains no subscriptions that aren't also in base or lhs.
-*/ 
-bool QDeclarativeBindingCompilerPrivate::subscriptionNeutral(const QSet<QString> &base, 
-                                             const QSet<QString> &lhs, 
-                                             const QSet<QString> &rhs)
-{
-    QSet<QString> difflhs = lhs;
-    difflhs.subtract(rhs);
-    QSet<QString> diffrhs = rhs;
-    diffrhs.subtract(lhs);
-
-    difflhs.unite(diffrhs);
-    difflhs.subtract(base);
-
-    return difflhs.isEmpty();
-}
-
-quint8 QDeclarativeBindingCompilerPrivate::exceptionId(QDeclarativeJS::AST::ExpressionNode *n)
-{
-    quint8 rv = 0xFF;
-    if (n && exceptions.count() < 0xFF) {
-        rv = (quint8)exceptions.count();
-        QDeclarativeJS::AST::SourceLocation l = n->firstSourceLocation();
-        quint64 e = l.startLine;
-        e <<= 32;
-        e |= l.startColumn;
-        exceptions.append(e);
-    }
-    return rv;
-}
-
-QDeclarativeBindingCompiler::QDeclarativeBindingCompiler()
-: d(new QDeclarativeBindingCompilerPrivate)
-{
-}
-
-QDeclarativeBindingCompiler::~QDeclarativeBindingCompiler()
-{
-    delete d; d = 0;
-}
-
-/* 
-Returns true if any bindings were compiled.
-*/
-bool QDeclarativeBindingCompiler::isValid() const
-{
-    return !d->committed.bytecode.isEmpty();
-}
-
-/* 
--1 on failure, otherwise the binding index to use.
-*/
-int QDeclarativeBindingCompiler::compile(const Expression &expression, QDeclarativeEnginePrivate *engine)
-{
-    if (!expression.expression.asAST()) return false;
-
-    if (!qmlExperimental() && expression.property->isValueTypeSubProperty)
-        return -1;
-
-    if (qmlDisableOptimizer())
-        return -1;
-
-    d->context = expression.context;
-    d->component = expression.component;
-    d->destination = expression.property;
-    d->ids = expression.ids;
-    d->imports = expression.imports;
-    d->engine = engine;
-
-    if (d->compile(expression.expression.asAST())) {
-        return d->commitCompile();
-    } else {
-        return -1;
-    }
-}
-
-
-QByteArray QDeclarativeBindingCompilerPrivate::buildSignalTable() const
-{
-    QHash<int, QList<int> > table;
-
-    for (int ii = 0; ii < committed.count(); ++ii) {
-        const QSet<int> &deps = committed.dependencies.at(ii);
-        for (QSet<int>::ConstIterator iter = deps.begin(); iter != deps.end(); ++iter) 
-            table[*iter].append(ii);
-    }
-
-    QVector<quint32> header;
-    QVector<quint32> data;
-    for (int ii = 0; ii < committed.subscriptionIds.count(); ++ii) {
-        header.append(committed.subscriptionIds.count() + data.count());
-        const QList<int> &bindings = table[ii];
-        data.append(bindings.count());
-        for (int jj = 0; jj < bindings.count(); ++jj)
-            data.append(bindings.at(jj));
-    }
-    header << data;
-
-    return QByteArray((const char *)header.constData(), header.count() * sizeof(quint32));
-}
-
-QByteArray QDeclarativeBindingCompilerPrivate::buildExceptionData() const
-{
-    QByteArray rv;
-    rv.resize(committed.exceptions.count() * sizeof(quint64));
-    ::memcpy(rv.data(), committed.exceptions.constData(), rv.size());
-    return rv;
-}
-
-/* 
-Returns the compiled program.
-*/
-QByteArray QDeclarativeBindingCompiler::program() const
-{
-    QByteArray programData;
-
-    if (isValid()) {
-        Program prog;
-        prog.bindings = d->committed.count();
-
-        QVector<Instr> bytecode;
-        Instr skip;
-        skip.common.type = Instr::Skip;
-        skip.skip.reg = -1;
-        for (int ii = 0; ii < d->committed.count(); ++ii) {
-            skip.skip.count = d->committed.count() - ii - 1;
-            skip.skip.count+= d->committed.offsets.at(ii);
-            bytecode << skip;
-        }
-        bytecode << d->committed.bytecode;
-
-        QByteArray data = d->committed.data;
-        while (data.count() % 4) data.append('\0');
-        prog.signalTableOffset = data.count();
-        data += d->buildSignalTable();
-        while (data.count() % 4) data.append('\0');
-        prog.exceptionDataOffset = data.count();
-        data += d->buildExceptionData();
-
-        prog.dataLength = 4 * ((data.size() + 3) / 4);
-        prog.subscriptions = d->committed.subscriptionIds.count();
-        prog.identifiers = d->committed.registeredStrings.count();
-        prog.instructionCount = bytecode.count();
-        prog.compiled = false;
-        int size = sizeof(Program) + bytecode.count() * sizeof(Instr);
-        size += prog.dataLength;
-
-        programData.resize(size);
-        memcpy(programData.data(), &prog, sizeof(Program));
-        if (prog.dataLength)
-            memcpy((char *)((Program *)programData.data())->data(), data.constData(), 
-                   data.size());
-        memcpy((char *)((Program *)programData.data())->instructions(), bytecode.constData(), 
-               bytecode.count() * sizeof(Instr));
-    } 
-
-    return programData;
-}
-
-
-
-QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecompileddata.cpp b/src/declarative/qml/qdeclarativecompileddata.cpp
index 03deea1e36..3d1e9255ad 100644
--- a/src/declarative/qml/qdeclarativecompileddata.cpp
+++ b/src/declarative/qml/qdeclarativecompileddata.cpp
@@ -181,6 +181,9 @@ QDeclarativeCompiledData::~QDeclarativeCompiledData()
     for (int ii = 0; ii < contextCaches.count(); ++ii)
         contextCaches.at(ii)->release();
 
+    for (int ii = 0; ii < scripts.count(); ++ii)
+        scripts.at(ii)->release();
+
     if (importCache)
         importCache->release();
 
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index f57f842004..d325ac48dd 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -63,7 +63,7 @@
 #include "private/qdeclarativeglobal_p.h"
 #include "private/qdeclarativescriptparser_p.h"
 #include "private/qdeclarativebinding_p.h"
-#include "private/qdeclarativecompiledbindings_p.h"
+#include "private/qdeclarativev4compiler_p.h"
 #include "private/qdeclarativeglobalscriptclass_p.h"
 
 #include <QColor>
@@ -79,7 +79,6 @@ QT_BEGIN_NAMESPACE
 
 DEFINE_BOOL_CONFIG_OPTION(compilerDump, QML_COMPILER_DUMP);
 DEFINE_BOOL_CONFIG_OPTION(compilerStatDump, QML_COMPILER_STATS);
-DEFINE_BOOL_CONFIG_OPTION(bindingsDump, QML_BINDINGS_DUMP);
 
 using namespace QDeclarativeParser;
 
@@ -201,6 +200,9 @@ bool QDeclarativeCompiler::testLiteralAssignment(const QMetaProperty &prop,
         case QVariant::String:
             if (!v->value.isString()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: string expected"));
             break;
+        case QVariant::ByteArray:
+            if (!v->value.isString()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: byte array expected"));
+            break;
         case QVariant::Url:
             if (!v->value.isString()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: url expected"));
             break;
@@ -320,16 +322,20 @@ bool QDeclarativeCompiler::testLiteralAssignment(const QMetaProperty &prop,
 void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop,
                                        QDeclarativeParser::Value *v)
 {
-    QString string = v->value.asString();
-
     QDeclarativeInstruction instr;
     instr.line = v->location.start.line;
     if (prop.isEnumType()) {
         int value;
-        if (prop.isFlagType()) {
-            value = prop.enumerator().keysToValue(string.toUtf8().constData());
-        } else
-            value = prop.enumerator().keyToValue(string.toUtf8().constData());
+        if (v->value.isNumber()) {
+            // Preresolved enum
+            value = (int)v->value.asNumber();
+        } else {
+            // Must be a string
+            if (prop.isFlagType()) {
+                value = prop.enumerator().keysToValue(v->value.asString().toUtf8().constData());
+            } else
+                value = prop.enumerator().keyToValue(v->value.asString().toUtf8().constData());
+        }
 
         instr.type = QDeclarativeInstruction::StoreInteger;
         instr.storeInteger.propertyIndex = prop.propertyIndex();
@@ -338,6 +344,8 @@ void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop,
         return;
     }
 
+    QString string = v->value.asString();
+
     int type = prop.userType();
     switch(type) {
         case -1:
@@ -371,6 +379,13 @@ void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop,
             instr.storeString.value = output->indexForString(string);
             }
             break;
+        case QVariant::ByteArray:
+            {
+            instr.type = QDeclarativeInstruction::StoreByteArray;
+            instr.storeByteArray.propertyIndex = prop.propertyIndex();
+            instr.storeByteArray.value = output->indexForByteArray(string.toLatin1());
+            }
+            break;
         case QVariant::Url:
             {
             instr.type = QDeclarativeInstruction::StoreUrl;
@@ -642,6 +657,31 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
     compileState.root = tree;
     componentStat.lineNumber = tree->location.start.line;
 
+    // Build global import scripts
+    QStringList importedScriptIndexes;
+
+    foreach (const QDeclarativeTypeData::ScriptReference &script, unit->resolvedScripts()) {
+        importedScriptIndexes.append(script.qualifier);
+
+        QDeclarativeInstruction import;
+        import.type = QDeclarativeInstruction::StoreImportedScript;
+        import.line = 0;
+        import.storeScript.value = output->scripts.count();
+
+        QDeclarativeScriptData *scriptData = script.script->scriptData();
+        scriptData->addref();
+        output->scripts << scriptData;
+        output->bytecode << import;
+    }
+
+    // We generate the importCache before we build the tree so that
+    // it can be used in the binding compiler.  Given we "expect" the
+    // QML compilation to succeed, this isn't a waste.
+    output->importCache = new QDeclarativeTypeNameCache(engine);
+    for (int ii = 0; ii < importedScriptIndexes.count(); ++ii) 
+        output->importCache->add(importedScriptIndexes.at(ii), ii);
+    unit->imports().populateCache(output->importCache, engine);
+
     if (!buildObject(tree, BindingContext()) || !completeComponentBuild())
         return;
 
@@ -657,38 +697,6 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
         init.init.compiledBinding = output->indexForByteArray(compileState.compiledBindingData);
     output->bytecode << init;
 
-    // Build global import scripts
-    QHash<QString, Object::ScriptBlock> importedScripts;
-    QStringList importedScriptIndexes;
-
-    foreach (const QDeclarativeTypeData::ScriptReference &script, unit->resolvedScripts()) {
-        QString scriptCode = script.script->scriptSource();
-        Object::ScriptBlock::Pragmas pragmas = script.script->pragmas();
-
-        Q_ASSERT(!importedScripts.contains(script.qualifier));
-
-        if (!scriptCode.isEmpty()) {
-            Object::ScriptBlock &scriptBlock = importedScripts[script.qualifier];
-
-            scriptBlock.code = scriptCode;
-            scriptBlock.file = script.script->finalUrl().toString();
-            scriptBlock.pragmas = pragmas;
-        }
-    }
-
-    for (QHash<QString, Object::ScriptBlock>::Iterator iter = importedScripts.begin(); 
-         iter != importedScripts.end(); ++iter) {
-
-        importedScriptIndexes.append(iter.key());
-
-        QDeclarativeInstruction import;
-        import.type = QDeclarativeInstruction::StoreImportedScript;
-        import.line = 0;
-        import.storeScript.value = output->scripts.count();
-        output->scripts << *iter;
-        output->bytecode << import;
-    }
-
     genObject(tree);
 
     QDeclarativeInstruction def;
@@ -696,13 +704,6 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
     def.type = QDeclarativeInstruction::SetDefault;
     output->bytecode << def;
 
-    output->importCache = new QDeclarativeTypeNameCache(engine);
-
-    for (int ii = 0; ii < importedScriptIndexes.count(); ++ii) 
-        output->importCache->add(importedScriptIndexes.at(ii), ii);
-
-    unit->imports().populateCache(output->importCache, engine);
-
     Q_ASSERT(tree->metatype);
 
     if (tree->metadata.isEmpty()) {
@@ -1283,6 +1284,7 @@ bool QDeclarativeCompiler::buildComponentFromRoot(QDeclarativeParser::Object *ob
 
     compileState = ComponentCompileState();
     compileState.root = obj;
+    compileState.nested = true;
 
     componentStat = ComponentStat();
     componentStat.lineNumber = obj->location.start.line;
@@ -1442,8 +1444,6 @@ bool QDeclarativeCompiler::buildProperty(QDeclarativeParser::Property *prop,
         unit->imports().resolveType(prop->name, &type, 0, 0, 0, &typeNamespace);
 
         if (typeNamespace) {
-            // ### We might need to indicate that this property is a namespace 
-            // for the DOM API
             COMPILE_CHECK(buildPropertyInNamespace(typeNamespace, prop, obj, 
                                                    ctxt));
             return true;
@@ -2227,20 +2227,35 @@ bool QDeclarativeCompiler::testQualifiedEnumAssignment(const QMetaProperty &prop
             objTypeName = objType->qmlTypeName();
     }
 
-    if (!type || objTypeName != type->qmlTypeName())
+    if (!type)
         return true;
 
     QString enumValue = parts.at(1);
-    int value;
-    if (prop.isFlagType()) {
-        value = prop.enumerator().keysToValue(enumValue.toUtf8().constData());
-    } else
-        value = prop.enumerator().keyToValue(enumValue.toUtf8().constData());
+    int value = -1;
+
+    if (objTypeName == type->qmlTypeName()) {
+        // When these two match, we can short cut the search
+        if (prop.isFlagType()) {
+            value = prop.enumerator().keysToValue(enumValue.toUtf8().constData());
+        } else {
+            value = prop.enumerator().keyToValue(enumValue.toUtf8().constData());
+        }
+    } else {
+        // Otherwise we have to search the whole type
+        // This matches the logic in QDeclarativeTypeNameScriptClass
+        QByteArray enumName = enumValue.toUtf8();
+        const QMetaObject *metaObject = type->baseMetaObject();
+        for (int ii = metaObject->enumeratorCount() - 1; value == -1 && ii >= 0; --ii) {
+            QMetaEnum e = metaObject->enumerator(ii);
+            value = e.keyToValue(enumName.constData());
+        }
+    }
+
     if (value == -1)
         return true;
 
     v->type = Value::Literal;
-    v->value = QDeclarativeParser::Variant(enumValue);
+    v->value = QDeclarativeParser::Variant((double)value);
     *isAssignment = true;
 
     return true;
@@ -2412,7 +2427,7 @@ bool QDeclarativeCompiler::buildDynamicMeta(QDeclarativeParser::Object *obj, Dyn
     newClassName.append("_QML_");
     int idx = classIndexCounter()->fetchAndAddRelaxed(1);
     newClassName.append(QByteArray::number(idx));
-    if (compileState.root == obj) {
+    if (compileState.root == obj && !compileState.nested) {
         QString path = output->url.path();
         int lastSlash = path.lastIndexOf(QLatin1Char('/'));
         if (lastSlash > -1) {
@@ -2888,25 +2903,26 @@ bool QDeclarativeCompiler::completeComponentBuild()
         COMPILE_CHECK(buildDynamicMeta(aliasObject, ResolveAliases));
     }
 
-    QDeclarativeBindingCompiler::Expression expr;
+    QDeclarativeV4Compiler::Expression expr;
     expr.component = compileState.root;
     expr.ids = compileState.ids;
+    expr.importCache = output->importCache;
+    expr.imports = unit->imports();
 
-    QDeclarativeBindingCompiler bindingCompiler;
+    QDeclarativeV4Compiler bindingCompiler;
 
     for (QHash<QDeclarativeParser::Value*,BindingReference>::Iterator iter = compileState.bindings.begin(); 
          iter != compileState.bindings.end(); ++iter) {
 
         BindingReference &binding = *iter;
 
-        expr.context = binding.bindingContext.object;
-        expr.property = binding.property;
-        expr.expression = binding.expression;
-        expr.imports = unit->imports();
-
         // ### We don't currently optimize for bindings on alias's - because 
         // of the solution to QTBUG-13719
         if (!binding.property->isAlias) {
+            expr.context = binding.bindingContext.object;
+            expr.property = binding.property;
+            expr.expression = binding.expression;
+
             int index = bindingCompiler.compile(expr, enginePrivate);
             if (index != -1) {
                 binding.dataType = BindingReference::Experimental;
@@ -2947,11 +2963,8 @@ bool QDeclarativeCompiler::completeComponentBuild()
         componentStat.scriptBindings.append(iter.key()->location);
     }
 
-    if (bindingCompiler.isValid()) {
+    if (bindingCompiler.isValid()) 
         compileState.compiledBindingData = bindingCompiler.program();
-        if (bindingsDump()) 
-            QDeclarativeBindingCompiler::dump(compileState.compiledBindingData);
-    }
 
     saveComponentState();
 
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index 93b6a0961e..49bab759be 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -122,7 +122,7 @@ public:
     QList<QScriptValue *> cachedClosures;
     QList<QDeclarativePropertyCache *> propertyCaches;
     QList<QDeclarativeIntegerCache *> contextCaches;
-    QList<QDeclarativeParser::Object::ScriptBlock> scripts;
+    QList<QDeclarativeScriptData *> scripts;
     QList<QUrl> urls;
 
     void dumpInstructions();
@@ -305,11 +305,12 @@ private:
     struct ComponentCompileState
     {
         ComponentCompileState() 
-            : parserStatusCount(0), pushedProperties(0), root(0) {}
+            : parserStatusCount(0), pushedProperties(0), nested(false), root(0) {}
         QHash<QString, QDeclarativeParser::Object *> ids;
         QHash<int, QDeclarativeParser::Object *> idIndexes;
         int parserStatusCount;
         int pushedProperties;
+        bool nested;
 
         QByteArray compiledBindingData;
 
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 8238252db2..aa1bbd156f 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -836,6 +836,34 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context, cons
     return begin(context, creationContext, cc, start, count, &state, 0, bindings);
 }
 
+/*
+    Try to do what's necessary for a reasonable display of the type
+    name, but no more (just enough for the client to do more extensive cleanup).
+
+    Should only be called when debugging is enabled.
+*/
+static inline QString buildTypeNameForDebug(const QMetaObject *metaObject)
+{
+    static const QString qmlMarker(QLatin1String("_QML"));
+    static const QChar underscore(QLatin1Char('_'));
+    static const QChar asterisk(QLatin1Char('*'));
+    QDeclarativeType *type = QDeclarativeMetaType::qmlType(metaObject);
+    QString typeName = type ? QLatin1String(type->qmlTypeName()) : QLatin1String(metaObject->className());
+    if (!type) {
+        //### optimize further?
+        int marker = typeName.indexOf(qmlMarker);
+        if (marker != -1 && marker < typeName.count() - 1) {
+            if (typeName[marker + 1] == underscore) {
+                const QString className = typeName.left(marker) + asterisk;
+                type = QDeclarativeMetaType::qmlType(QMetaType::type(className.toLatin1()));
+                if (type)
+                    typeName = QLatin1String(type->qmlTypeName());
+            }
+        }
+    }
+    return typeName;
+}
+
 QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentContext, 
                                               QDeclarativeContextData *componentCreationContext,
                                               QDeclarativeCompiledData *component, int start, int count,
@@ -848,10 +876,8 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
     Q_ASSERT(!isRoot || state); // Either this isn't a root component, or a state data must be provided
     Q_ASSERT((state != 0) ^ (errors != 0)); // One of state or errors (but not both) must be provided
 
-    if (isRoot) {
+    if (isRoot)
         QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Creating);
-        QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, component->url);
-    }
 
     QDeclarativeContextData *ctxt = new QDeclarativeContextData;
     ctxt->isInternal = true;
@@ -868,7 +894,9 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
     enginePriv->inBeginCreate = true;
 
     QDeclarativeVME vme;
+    enginePriv->referenceScarceResources(); // "hold" scarce resources in memory during evaluation.
     QObject *rv = vme.run(ctxt, component, start, count, bindings);
+    enginePriv->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
 
     if (vme.isError()) {
        if(errors) *errors = vme.errors();
@@ -897,6 +925,11 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
         if  (!parentContext->isInternal)
             parentContext->asQDeclarativeContextPrivate()->instances.append(rv);
         QDeclarativeEngineDebugServer::instance()->objectCreated(parentContext->engine, rv);
+        if (isRoot) {
+            QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, buildTypeNameForDebug(rv->metaObject()));
+            QDeclarativeData *data = QDeclarativeData::get(rv);
+            QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, component->url, data ? data->lineNumber : -1);
+        }
     }
 
     return rv;
diff --git a/src/declarative/qml/qdeclarativecomponent.h b/src/declarative/qml/qdeclarativecomponent.h
index 9a60a8b4f7..f46ffdf2cf 100644
--- a/src/declarative/qml/qdeclarativecomponent.h
+++ b/src/declarative/qml/qdeclarativecomponent.h
@@ -117,7 +117,6 @@ private:
 
     Q_DISABLE_COPY(QDeclarativeComponent)
     friend class QDeclarativeVME;
-    friend class QDeclarativeCompositeTypeData;
     friend class QDeclarativeTypeData;
 };
 
diff --git a/src/declarative/qml/qdeclarativecontext.cpp b/src/declarative/qml/qdeclarativecontext.cpp
index 7637b72eb3..4f0d704d95 100644
--- a/src/declarative/qml/qdeclarativecontext.cpp
+++ b/src/declarative/qml/qdeclarativecontext.cpp
@@ -46,9 +46,9 @@
 #include "private/qdeclarativeexpression_p.h"
 #include "private/qdeclarativeengine_p.h"
 #include "qdeclarativeengine.h"
-#include "private/qdeclarativecompiledbindings_p.h"
 #include "qdeclarativeinfo.h"
 #include "private/qdeclarativeglobalscriptclass_p.h"
+#include "private/qdeclarativev4bindings_p.h"
 
 #include <qscriptengine.h>
 #include <QtCore/qvarlengtharray.h>
@@ -498,7 +498,7 @@ QObject *QDeclarativeContextPrivate::context_at(QDeclarativeListProperty<QObject
 
 
 QDeclarativeContextData::QDeclarativeContextData()
-: parent(0), engine(0), isInternal(false), publicContext(0), propertyNames(0), contextObject(0),
+: parent(0), engine(0), isInternal(false), ownedByParent(false), publicContext(0), propertyNames(0), contextObject(0),
   imports(0), childContexts(0), nextChild(0), prevChild(0), expressions(0), contextObjects(0),
   contextGuards(0), idValues(0), idValueCount(0), optimizedBindings(0), linkedContext(0),
   componentAttached(0)
@@ -506,7 +506,7 @@ QDeclarativeContextData::QDeclarativeContextData()
 }
 
 QDeclarativeContextData::QDeclarativeContextData(QDeclarativeContext *ctxt)
-: parent(0), engine(0), isInternal(false), publicContext(ctxt), propertyNames(0), contextObject(0),
+: parent(0), engine(0), isInternal(false), ownedByParent(false), publicContext(ctxt), propertyNames(0), contextObject(0),
   imports(0), childContexts(0), nextChild(0), prevChild(0), expressions(0), contextObjects(0),
   contextGuards(0), idValues(0), idValueCount(0), optimizedBindings(0), linkedContext(0),
   componentAttached(0)
@@ -515,8 +515,13 @@ QDeclarativeContextData::QDeclarativeContextData(QDeclarativeContext *ctxt)
 
 void QDeclarativeContextData::invalidate()
 {
-    while (childContexts)
-        childContexts->invalidate();
+    while (childContexts) {
+        if (childContexts->ownedByParent) {
+            childContexts->destroy();
+        } else {
+            childContexts->invalidate();
+        }
+    }
 
     while (componentAttached) {
         QDeclarativeComponentAttached *a = componentAttached;
@@ -614,7 +619,7 @@ void QDeclarativeContextData::destroy()
     delete this;
 }
 
-void QDeclarativeContextData::setParent(QDeclarativeContextData *p)
+void QDeclarativeContextData::setParent(QDeclarativeContextData *p, bool parentTakesOwnership)
 {
     if (p) {
         parent = p;
@@ -623,6 +628,7 @@ void QDeclarativeContextData::setParent(QDeclarativeContextData *p)
         if (nextChild) nextChild->prevChild = &nextChild;
         prevChild = &p->childContexts;
         p->childContexts = this;
+        ownedByParent = parentTakesOwnership;
     }
 }
 
@@ -662,72 +668,6 @@ void QDeclarativeContextData::addObject(QObject *o)
     contextObjects = data;
 }
 
-void QDeclarativeContextData::addImportedScript(const QDeclarativeParser::Object::ScriptBlock &script)
-{
-    if (!engine)
-        return;
-
-    QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
-    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
-
-    const QString &code = script.code;
-    const QString &url = script.file;
-    const QDeclarativeParser::Object::ScriptBlock::Pragmas &pragmas = script.pragmas;
-
-    Q_ASSERT(!url.isEmpty());
-
-    if (pragmas & QDeclarativeParser::Object::ScriptBlock::Shared) {
-
-        QHash<QString, QScriptValue>::Iterator iter = enginePriv->m_sharedScriptImports.find(url);
-        if (iter == enginePriv->m_sharedScriptImports.end()) {
-            QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
-
-            scriptContext->pushScope(enginePriv->contextClass->newUrlContext(url));
-            scriptContext->pushScope(enginePriv->globalClass->staticGlobalObject());
-
-            QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(scriptEngine);
-            scriptContext->pushScope(scope);
-
-            scriptEngine->evaluate(code, url, 1);
-
-            if (scriptEngine->hasUncaughtException()) {
-                QDeclarativeError error;
-                QDeclarativeExpressionPrivate::exceptionToError(scriptEngine, error);
-                enginePriv->warning(error);
-            }
-
-            scriptEngine->popContext();
-
-            iter = enginePriv->m_sharedScriptImports.insert(url, scope);
-        }
-
-        importedScripts.append(*iter);
-
-    } else {
-
-        QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
-
-        scriptContext->pushScope(enginePriv->contextClass->newUrlContext(this, 0, url));
-        scriptContext->pushScope(enginePriv->globalClass->staticGlobalObject());
-
-        QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(scriptEngine);
-        scriptContext->pushScope(scope);
-
-        scriptEngine->evaluate(code, url, 1);
-
-        if (scriptEngine->hasUncaughtException()) {
-            QDeclarativeError error;
-            QDeclarativeExpressionPrivate::exceptionToError(scriptEngine, error);
-            enginePriv->warning(error);
-        }
-
-        scriptEngine->popContext();
-
-        importedScripts.append(scope);
-
-    }
-}
-
 void QDeclarativeContextData::setIdProperty(int idx, QObject *obj)
 {
     idValues[idx] = obj;
diff --git a/src/declarative/qml/qdeclarativecontext_p.h b/src/declarative/qml/qdeclarativecontext_p.h
index b7e4c6aa7c..29ca091fc2 100644
--- a/src/declarative/qml/qdeclarativecontext_p.h
+++ b/src/declarative/qml/qdeclarativecontext_p.h
@@ -77,7 +77,7 @@ class QDeclarativeEngine;
 class QDeclarativeExpression;
 class QDeclarativeExpressionPrivate;
 class QDeclarativeAbstractExpression;
-class QDeclarativeCompiledBindings;
+class QDeclarativeV4Bindings;
 class QDeclarativeContextData;
 
 class QDeclarativeContextPrivate : public QObjectPrivate
@@ -124,7 +124,7 @@ public:
     QDeclarativeContextData *parent;
     QDeclarativeEngine *engine;
 
-    void setParent(QDeclarativeContextData *);
+    void setParent(QDeclarativeContextData *, bool parentTakesOwnership = false);
     void refreshExpressions();
 
     void addObject(QObject *);
@@ -135,7 +135,9 @@ public:
     // If internal is false publicContext owns this.
     QDeclarativeContext *asQDeclarativeContext();
     QDeclarativeContextPrivate *asQDeclarativeContextPrivate();
-    bool isInternal;
+    quint32 isInternal:1;
+    quint32 ownedByParent:1; // unrelated to isInternal; parent context deletes children if true.
+    quint32 dummy:30;
     QDeclarativeContext *publicContext;
 
     // Property name cache
@@ -146,7 +148,6 @@ public:
 
     // Any script blocks that exist on this context
     QList<QScriptValue> importedScripts;
-    void addImportedScript(const QDeclarativeParser::Object::ScriptBlock &script);
 
     // Context base url
     QUrl url;
@@ -188,7 +189,7 @@ public:
     void setIdPropertyData(QDeclarativeIntegerCache *);
 
     // Optimized binding pointer
-    QDeclarativeCompiledBindings *optimizedBindings;
+    QDeclarativeV4Bindings *optimizedBindings;
 
     // Linked contexts. this owns linkedContext.
     QDeclarativeContextData *linkedContext;
diff --git a/src/declarative/qml/qdeclarativedirparser.cpp b/src/declarative/qml/qdeclarativedirparser.cpp
index b5ad33d63e..97f7f4dda8 100644
--- a/src/declarative/qml/qdeclarativedirparser.cpp
+++ b/src/declarative/qml/qdeclarativedirparser.cpp
@@ -142,7 +142,7 @@ bool QDeclarativeDirParser::parse()
         } else if (sections[0] == QLatin1String("plugin")) {
             if (sectionCount < 2) {
                 reportError(lineNumber, -1,
-                            QString::fromUtf8("plugin directive requires 2 arguments, but %1 were provided").arg(sectionCount + 1));
+                            QString::fromUtf8("plugin directive requires one or two arguments, but %1 were provided").arg(sectionCount - 1));
 
                 continue;
             }
@@ -154,12 +154,22 @@ bool QDeclarativeDirParser::parse()
         } else if (sections[0] == QLatin1String("internal")) {
             if (sectionCount != 3) {
                 reportError(lineNumber, -1,
-                            QString::fromUtf8("internal types require 2 arguments, but %1 were provided").arg(sectionCount + 1));
+                            QString::fromUtf8("internal types require 2 arguments, but %1 were provided").arg(sectionCount - 1));
                 continue;
             }
             Component entry(sections[1], sections[2], -1, -1);
             entry.internal = true;
             _components.append(entry);
+        } else if (sections[0] == QLatin1String("typeinfo")) {
+            if (sectionCount != 2) {
+                reportError(lineNumber, -1,
+                            QString::fromUtf8("typeinfo requires 1 argument, but %1 were provided").arg(sectionCount - 1));
+                continue;
+            }
+#ifdef QT_CREATOR
+            TypeInfo typeInfo(sections[1]);
+            _typeInfos.append(typeInfo);
+#endif
 
         } else if (sectionCount == 2) {
             // No version specified (should only be used for relative qmldir files)
@@ -189,7 +199,7 @@ bool QDeclarativeDirParser::parse()
             }
         } else {
             reportError(lineNumber, -1, 
-                        QString::fromUtf8("a component declaration requires 3 arguments, but %1 were provided").arg(sectionCount + 1));
+                        QString::fromUtf8("a component declaration requires two or three arguments, but %1 were provided").arg(sectionCount));
         }
     }
 
@@ -229,4 +239,11 @@ QList<QDeclarativeDirParser::Component> QDeclarativeDirParser::components() cons
     return _components;
 }
 
+#ifdef QT_CREATOR
+QList<TypeInfo> QDeclarativeDirParser::typeInfos() const
+{
+    return _typeInfos;
+}
+#endif
+
 QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativedirparser_p.h b/src/declarative/qml/qdeclarativedirparser_p.h
index 95f14bc487..d09b90e7a2 100644
--- a/src/declarative/qml/qdeclarativedirparser_p.h
+++ b/src/declarative/qml/qdeclarativedirparser_p.h
@@ -109,6 +109,19 @@ public:
     QList<Component> components() const;
     QList<Plugin> plugins() const;
 
+#ifdef QT_CREATOR
+    struct TypeInfo
+    {
+        TypeInfo() {}
+        TypeInfo(const QString &fileName)
+            : fileName(fileName) {}
+
+        QString fileName;
+    };
+
+    QList<TypeInfo> typeInfos() const;
+#endif
+
 private:
     void reportError(int line, int column, const QString &message);
 
@@ -118,6 +131,9 @@ private:
     QString _source;
     QList<Component> _components;
     QList<Plugin> _plugins;
+#ifdef QT_CREATOR
+    QList<TypeInfo> _typeInfos;
+#endif
     unsigned _isParsed: 1;
 };
 
diff --git a/src/declarative/qml/qdeclarativedom.cpp b/src/declarative/qml/qdeclarativedom.cpp
deleted file mode 100644
index f1296aaf18..0000000000
--- a/src/declarative/qml/qdeclarativedom.cpp
+++ /dev/null
@@ -1,1835 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativedom_p.h"
-#include "private/qdeclarativedom_p_p.h"
-
-#include "private/qdeclarativecompiler_p.h"
-#include "private/qdeclarativeengine_p.h"
-#include "private/qdeclarativescriptparser_p.h"
-#include "private/qdeclarativeglobal_p.h"
-
-#include <QtCore/QByteArray>
-#include <QtCore/QDebug>
-#include <QtCore/QString>
-
-QT_BEGIN_NAMESPACE
-
-QDeclarativeDomDocumentPrivate::QDeclarativeDomDocumentPrivate()
-: root(0)
-{
-}
-
-QDeclarativeDomDocumentPrivate::~QDeclarativeDomDocumentPrivate()
-{
-    if (root) root->release();
-}
-
-/*!
-    \class QDeclarativeDomDocument
-    \internal
-    \brief The QDeclarativeDomDocument class represents the root of a QML document
-
-    A QML document is a self-contained snippet of QML, usually contained in a
-    single file. Each document has a root object, accessible through
-    QDeclarativeDomDocument::rootObject().
-
-    The QDeclarativeDomDocument class allows the programmer to inspect a QML document by
-    calling QDeclarativeDomDocument::load().
-
-    The following example loads a QML file from disk, and prints out its root
-    object type and the properties assigned in the root object.
-    \code
-    QFile file(inputFileName);
-    file.open(QIODevice::ReadOnly);
-    QByteArray xmlData = file.readAll();
-
-    QDeclarativeDomDocument document;
-    document.load(qmlengine, xmlData);
-
-    QDeclarativeDomObject rootObject = document.rootObject();
-    qDebug() << rootObject.objectType();
-    foreach(QDeclarativeDomProperty property, rootObject.properties())
-        qDebug() << property.propertyName();
-    \endcode
-*/
-
-/*!
-    Construct an empty QDeclarativeDomDocument.
-*/
-QDeclarativeDomDocument::QDeclarativeDomDocument()
-: d(new QDeclarativeDomDocumentPrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomDocument.
-*/
-QDeclarativeDomDocument::QDeclarativeDomDocument(const QDeclarativeDomDocument &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomDocument
-*/
-QDeclarativeDomDocument::~QDeclarativeDomDocument()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomDocument.
-*/
-QDeclarativeDomDocument &QDeclarativeDomDocument::operator=(const QDeclarativeDomDocument &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Returns all import statements in qml.
-*/
-QList<QDeclarativeDomImport> QDeclarativeDomDocument::imports() const
-{
-    return d->imports;
-}
-
-/*!
-    Loads a QDeclarativeDomDocument from \a data.  \a data should be valid QML
-    data.  On success, true is returned.  If the \a data is malformed, false
-    is returned and QDeclarativeDomDocument::errors() contains an error description.
-
-    \sa QDeclarativeDomDocument::loadError()
-*/
-bool QDeclarativeDomDocument::load(QDeclarativeEngine *engine, const QByteArray &data, const QUrl &url)
-{
-    d->errors.clear();
-    d->imports.clear();
-
-    QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
-    QDeclarativeTypeData *td = ep->typeLoader.get(data, url, QDeclarativeTypeLoader::PreserveParser);
-
-    if(td->isError()) {
-        d->errors = td->errors();
-        td->release();
-        return false;
-    } else if(!td->isCompleteOrError()) {
-        QDeclarativeError error;
-        error.setDescription(QLatin1String("QDeclarativeDomDocument supports local types only"));
-        d->errors << error;
-        td->release();
-        return false;
-    }
-
-    for (int i = 0; i < td->parser().imports().size(); ++i) {
-        QDeclarativeScriptParser::Import parserImport = td->parser().imports().at(i);
-        QDeclarativeDomImport domImport;
-        domImport.d->type = static_cast<QDeclarativeDomImportPrivate::Type>(parserImport.type);
-        domImport.d->uri = parserImport.uri;
-        domImport.d->qualifier = parserImport.qualifier;
-        domImport.d->version = parserImport.version;
-        d->imports += domImport;
-    }
-
-    if (td->parser().tree()) {
-        d->root = td->parser().tree();
-        d->root->addref();
-    }
-
-    td->release();
-    return true;
-}
-
-/*!
-    Returns the last load errors.  The load errors will be reset after a
-    successful call to load().
-
-    \sa load()
-*/
-QList<QDeclarativeError> QDeclarativeDomDocument::errors() const
-{
-    return d->errors;
-}
-
-/*!
-    Returns the document's root object, or an invalid QDeclarativeDomObject if the
-    document has no root.
-
-    In the sample QML below, the root object will be the QDeclarativeItem type.
-    \qml
-Item {
-    Text {
-        text: "Hello World"
-    }
-}
-    \endqml
-*/
-QDeclarativeDomObject QDeclarativeDomDocument::rootObject() const
-{
-    QDeclarativeDomObject rv;
-    rv.d->object = d->root;
-    if (rv.d->object) rv.d->object->addref();
-    return rv;
-}
-
-QDeclarativeDomPropertyPrivate::QDeclarativeDomPropertyPrivate()
-: property(0)
-{
-}
-
-QDeclarativeDomPropertyPrivate::~QDeclarativeDomPropertyPrivate()
-{
-    if (property) property->release();
-}
-
-QDeclarativeDomDynamicPropertyPrivate::QDeclarativeDomDynamicPropertyPrivate():
-        valid(false)
-{
-}
-
-QDeclarativeDomDynamicPropertyPrivate::~QDeclarativeDomDynamicPropertyPrivate()
-{
-    if (valid && property.defaultValue) property.defaultValue->release();
-}
-
-/*!
-    \class QDeclarativeDomProperty
-    \internal
-    \brief The QDeclarativeDomProperty class represents one property assignment in the
-    QML DOM tree
-
-    Properties in QML can be assigned QML \l {QDeclarativeDomValue}{values}.
-
-    \sa QDeclarativeDomObject
-*/
-
-/*!
-    Construct an invalid QDeclarativeDomProperty.
-*/
-QDeclarativeDomProperty::QDeclarativeDomProperty()
-: d(new QDeclarativeDomPropertyPrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomProperty.
-*/
-QDeclarativeDomProperty::QDeclarativeDomProperty(const QDeclarativeDomProperty &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomProperty.
-*/
-QDeclarativeDomProperty::~QDeclarativeDomProperty()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomProperty.
-*/
-QDeclarativeDomProperty &QDeclarativeDomProperty::operator=(const QDeclarativeDomProperty &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Returns true if this is a valid QDeclarativeDomProperty, false otherwise.
-*/
-bool QDeclarativeDomProperty::isValid() const
-{
-    return d->property != 0;
-}
-
-
-/*!
-    Return the name of this property.
-
-    \qml
-Text {
-    x: 10
-    y: 10
-    font.bold: true
-}
-    \endqml
-
-    As illustrated above, a property name can be a simple string, such as "x" or
-    "y", or a more complex "dot property", such as "font.bold".  In both cases
-    the full name is returned ("x", "y" and "font.bold") by this method.
-
-    For dot properties, a split version of the name can be accessed by calling
-    QDeclarativeDomProperty::propertyNameParts().
-
-    \sa QDeclarativeDomProperty::propertyNameParts()
-*/
-QByteArray QDeclarativeDomProperty::propertyName() const
-{
-    return d->propertyName;
-}
-
-/*!
-    Return the name of this property, split into multiple parts in the case
-    of dot properties.
-
-    \qml
-Text {
-    x: 10
-    y: 10
-    font.bold: true
-}
-    \endqml
-
-    For each of the properties shown above, this method would return ("x"),
-    ("y") and ("font", "bold").
-
-    \sa QDeclarativeDomProperty::propertyName()
-*/
-QList<QByteArray> QDeclarativeDomProperty::propertyNameParts() const
-{
-    if (d->propertyName.isEmpty()) return QList<QByteArray>();
-    else return d->propertyName.split('.');
-}
-
-/*!
-    Return true if this property is used as a default property in the QML
-    document.
-
-    \code
-<Text text="hello"/>
-<Text>hello</Text>
-    \endcode
-
-    The above two examples return the same DOM tree, except that the second has
-    the default property flag set on the text property.  Observe that whether
-    or not a property has isDefaultProperty set is determined by how the
-    property is used, and not only by whether the property is the types default
-    property.
-*/
-bool QDeclarativeDomProperty::isDefaultProperty() const
-{
-    return d->property && d->property->isDefault;
-}
-
-/*!
-    Returns the QDeclarativeDomValue that is assigned to this property, or an invalid
-    QDeclarativeDomValue if no value is assigned.
-*/
-QDeclarativeDomValue QDeclarativeDomProperty::value() const
-{
-    QDeclarativeDomValue rv;
-    if (d->property) {
-        rv.d->property = d->property;
-        if (d->property->values.count())
-            rv.d->value = d->property->values.at(0);
-        else
-            rv.d->value = d->property->onValues.at(0);
-        rv.d->property->addref();
-        rv.d->value->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns the position in the input data where the property ID startd, or -1 if
- the property is invalid.
-*/
-int QDeclarativeDomProperty::position() const
-{
-    if (d && d->property) {
-        return d->property->location.range.offset;
-    } else
-        return -1;
-}
-
-/*!
-    Returns the length in the input data from where the property ID started upto
- the end of it, or -1 if the property is invalid.
-*/
-int QDeclarativeDomProperty::length() const
-{
-    if (d && d->property)
-        return d->property->location.range.length;
-    else
-        return -1;
-}
-
-/*!
-    Construct an invalid QDeclarativeDomDynamicProperty.
-*/
-QDeclarativeDomDynamicProperty::QDeclarativeDomDynamicProperty():
-        d(new QDeclarativeDomDynamicPropertyPrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomDynamicProperty.
-*/
-QDeclarativeDomDynamicProperty::QDeclarativeDomDynamicProperty(const QDeclarativeDomDynamicProperty &other):
-        d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomDynamicProperty.
-*/
-QDeclarativeDomDynamicProperty::~QDeclarativeDomDynamicProperty()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomDynamicProperty.
-*/
-QDeclarativeDomDynamicProperty &QDeclarativeDomDynamicProperty::operator=(const QDeclarativeDomDynamicProperty &other)
-{
-    d = other.d;
-    return *this;
-}
-
-bool QDeclarativeDomDynamicProperty::isValid() const
-{
-    return d && d->valid;
-}
-
-/*!
-    Return the name of this dynamic property.
-
-    \qml
-Item {
-    property int count: 10;
-}
-    \endqml
-
-    As illustrated above, a dynamic property name can have a name and a
-    default value ("10").
-*/
-QByteArray QDeclarativeDomDynamicProperty::propertyName() const
-{
-    if (isValid())
-        return d->property.name;
-    else
-        return QByteArray();
-}
-
-/*!
-   Returns the type of the dynamic property. Note that when the property is an
-   alias property, this will return -1. Use QDeclarativeDomProperty::isAlias() to check
-   if the property is an alias.
-*/
-int QDeclarativeDomDynamicProperty::propertyType() const
-{
-    if (isValid()) {
-        switch (d->property.type) {
-            case QDeclarativeParser::Object::DynamicProperty::Bool:
-                return QMetaType::type("bool");
-
-            case QDeclarativeParser::Object::DynamicProperty::Color:
-                return QMetaType::type("QColor");
-
-            case QDeclarativeParser::Object::DynamicProperty::Time:
-                return QMetaType::type("QTime");
-
-            case QDeclarativeParser::Object::DynamicProperty::Date:
-                return QMetaType::type("QDate");
-
-            case QDeclarativeParser::Object::DynamicProperty::DateTime:
-                return QMetaType::type("QDateTime");
-
-            case QDeclarativeParser::Object::DynamicProperty::Int:
-                return QMetaType::type("int");
-
-            case QDeclarativeParser::Object::DynamicProperty::Real:
-                return sizeof(qreal) == sizeof(double) ? QMetaType::type("double") : QMetaType::type("float");
-
-            case QDeclarativeParser::Object::DynamicProperty::String:
-                return QMetaType::type("QString");
-
-            case QDeclarativeParser::Object::DynamicProperty::Url:
-                return QMetaType::type("QUrl");
-
-            case QDeclarativeParser::Object::DynamicProperty::Variant:
-                return QMetaType::type("QVariant");
-
-            default:
-                break;
-        }
-    }
-
-    return -1;
-}
-
-QByteArray QDeclarativeDomDynamicProperty::propertyTypeName() const
-{
-    if (isValid())
-        return d->property.customType;
-
-    return QByteArray();
-}
-
-/*!
-    Return true if this property is used as a default property in the QML
-    document.
-
-    \code
-<Text text="hello"/>
-<Text>hello</Text>
-    \endcode
-
-    The above two examples return the same DOM tree, except that the second has
-    the default property flag set on the text property.  Observe that whether
-    or not a property has isDefaultProperty set is determined by how the
-    property is used, and not only by whether the property is the types default
-    property.
-*/
-bool QDeclarativeDomDynamicProperty::isDefaultProperty() const
-{
-    if (isValid())
-        return d->property.isDefaultProperty;
-    else
-        return false;
-}
-
-/*!
-    Returns the default value as a QDeclarativeDomProperty.
-*/
-QDeclarativeDomProperty QDeclarativeDomDynamicProperty::defaultValue() const
-{
-    QDeclarativeDomProperty rp;
-
-    if (isValid() && d->property.defaultValue) {
-        rp.d->property = d->property.defaultValue;
-        rp.d->propertyName = propertyName();
-        rp.d->property->addref();
-    }
-
-    return rp;
-}
-
-/*!
-    Returns true if this dynamic property is an alias for another property,
-    false otherwise.
-*/
-bool QDeclarativeDomDynamicProperty::isAlias() const
-{
-    if (isValid())
-        return d->property.type == QDeclarativeParser::Object::DynamicProperty::Alias;
-    else
-        return false;
-}
-
-/*!
-    Returns the position in the input data where the property ID startd, or 0 if
- the property is invalid.
-*/
-int QDeclarativeDomDynamicProperty::position() const
-{
-    if (isValid()) {
-        return d->property.location.range.offset;
-    } else
-        return -1;
-}
-
-/*!
-    Returns the length in the input data from where the property ID started upto
- the end of it, or 0 if the property is invalid.
-*/
-int QDeclarativeDomDynamicProperty::length() const
-{
-    if (isValid())
-        return d->property.location.range.length;
-    else
-        return -1;
-}
-
-QDeclarativeDomObjectPrivate::QDeclarativeDomObjectPrivate()
-: object(0)
-{
-}
-
-QDeclarativeDomObjectPrivate::~QDeclarativeDomObjectPrivate()
-{
-    if (object) object->release();
-}
-
-QDeclarativeDomObjectPrivate::Properties
-QDeclarativeDomObjectPrivate::properties() const
-{
-    Properties rv;
-
-    for (QHash<QByteArray, QDeclarativeParser::Property *>::ConstIterator iter =
-            object->properties.begin();
-            iter != object->properties.end();
-            ++iter) {
-
-        rv << properties(*iter);
-
-    }
-    return rv;
-}
-
-QDeclarativeDomObjectPrivate::Properties
-QDeclarativeDomObjectPrivate::properties(QDeclarativeParser::Property *property) const
-{
-    Properties rv;
-
-    if (property->value) {
-
-        for (QHash<QByteArray, QDeclarativeParser::Property *>::ConstIterator iter =
-                property->value->properties.begin();
-                iter != property->value->properties.end();
-                ++iter) {
-
-            rv << properties(*iter);
-
-        }
-
-        QByteArray name(property->name + '.');
-        for (Properties::Iterator iter = rv.begin(); iter != rv.end(); ++iter)
-            iter->second.prepend(name);
-
-    } else {
-        rv << qMakePair(property, property->name);
-    }
-
-    return rv;
-}
-
-/*!
-    \class QDeclarativeDomObject
-    \internal
-    \brief The QDeclarativeDomObject class represents an object instantiation.
-
-    Each object instantiated in a QML file has a corresponding QDeclarativeDomObject
-    node in the QML DOM.
-
-    In addition to the type information that determines the object to
-    instantiate, QDeclarativeDomObject's also have a set of associated QDeclarativeDomProperty's.
-    Each QDeclarativeDomProperty represents a QML property assignment on the instantiated
-    object.  For example,
-
-    \qml
-QGraphicsWidget {
-    opacity: 0.5
-    size: "100x100"
-}
-    \endqml
-
-    describes a single QDeclarativeDomObject - "QGraphicsWidget" - with two properties,
-    "opacity" and "size".  Obviously QGraphicsWidget has many more properties than just
-    these two, but the QML DOM representation only contains those assigned
-    values (or bindings) in the QML file.
-*/
-
-/*!
-    Construct an invalid QDeclarativeDomObject.
-*/
-QDeclarativeDomObject::QDeclarativeDomObject()
-: d(new QDeclarativeDomObjectPrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomObject.
-*/
-QDeclarativeDomObject::QDeclarativeDomObject(const QDeclarativeDomObject &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomObject.
-*/
-QDeclarativeDomObject::~QDeclarativeDomObject()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomObject.
-*/
-QDeclarativeDomObject &QDeclarativeDomObject::operator=(const QDeclarativeDomObject &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Returns true if this is a valid QDeclarativeDomObject, false otherwise.
-*/
-bool QDeclarativeDomObject::isValid() const
-{
-    return d->object != 0;
-}
-
-/*!
-    Returns the fully-qualified type name of this object.
-
-    For example, the type of this object would be "Qt/4.6/Rectangle".
-    \qml
-Rectangle { }
-    \endqml
-*/
-QByteArray QDeclarativeDomObject::objectType() const
-{
-    if (d->object) return d->object->typeName;
-    else return QByteArray();
-}
-
-/*!
-    Returns the type name as referenced in the qml file.
-
-    For example, the type of this object would be "Rectangle".
-    \qml
-Rectangle { }
-    \endqml
-*/
-QByteArray QDeclarativeDomObject::objectClassName() const
-{
-    if (d->object)
-        return d->object->className;
-    else
-        return QByteArray();
-}
-
-int QDeclarativeDomObject::objectTypeMajorVersion() const
-{
-    if (d->object)
-        return d->object->majorVersion;
-    else
-        return -1;
-}
-
-int QDeclarativeDomObject::objectTypeMinorVersion() const
-{
-    if (d->object)
-        return d->object->minorVersion;
-    else
-        return -1;
-}
-
-/*!
-    Returns the QML id assigned to this object, or an empty QByteArray if no id
-    has been assigned.
-
-    For example, the object id of this object would be "MyText".
-    \qml
-Text { id: myText }
-    \endqml
-*/
-QString QDeclarativeDomObject::objectId() const
-{
-    if (d->object) {
-        return d->object->id;
-    } else {
-        return QString();
-    }
-}
-
-/*!
-    Returns the list of assigned properties on this object.
-
-    In the following example, "text" and "x" properties would be returned.
-    \qml
-Text {
-    text: "Hello world!"
-    x: 100
-}
-    \endqml
-*/
-QList<QDeclarativeDomProperty> QDeclarativeDomObject::properties() const
-{
-    QList<QDeclarativeDomProperty> rv;
-
-    if (!d->object || isComponent())
-        return rv;
-
-    QDeclarativeDomObjectPrivate::Properties properties = d->properties();
-    for (int ii = 0; ii < properties.count(); ++ii) {
-
-        QDeclarativeDomProperty domProperty;
-        domProperty.d->property = properties.at(ii).first;
-        domProperty.d->property->addref();
-        domProperty.d->propertyName = properties.at(ii).second;
-        rv << domProperty;
-
-    }
-
-    if (d->object->defaultProperty) {
-        QDeclarativeDomProperty domProperty;
-        domProperty.d->property = d->object->defaultProperty;
-        domProperty.d->property->addref();
-        domProperty.d->propertyName = d->object->defaultProperty->name;
-        rv << domProperty;
-    }
-
-    return rv;
-}
-
-/*!
-    Returns the object's \a name property if a value has been assigned to
-    it, or an invalid QDeclarativeDomProperty otherwise.
-
-    In the example below, \c {object.property("source")} would return a valid
-    QDeclarativeDomProperty, and \c {object.property("tile")} an invalid QDeclarativeDomProperty.
-
-    \qml
-Image { source: "sample.jpg" }
-    \endqml
-*/
-QDeclarativeDomProperty QDeclarativeDomObject::property(const QByteArray &name) const
-{
-    QList<QDeclarativeDomProperty> props = properties();
-    for (int ii = 0; ii < props.count(); ++ii)
-        if (props.at(ii).propertyName() == name)
-            return props.at(ii);
-    return QDeclarativeDomProperty();
-}
-
-QList<QDeclarativeDomDynamicProperty> QDeclarativeDomObject::dynamicProperties() const
-{
-    QList<QDeclarativeDomDynamicProperty> properties;
-
-    for (int i = 0; i < d->object->dynamicProperties.size(); ++i) {
-        QDeclarativeDomDynamicProperty p;
-        p.d = new QDeclarativeDomDynamicPropertyPrivate;
-        p.d->property = d->object->dynamicProperties.at(i);
-        p.d->valid = true;
-
-        if (p.d->property.defaultValue)
-            p.d->property.defaultValue->addref();
-
-        properties.append(p);
-    }
-
-    return properties;
-}
-
-QDeclarativeDomDynamicProperty QDeclarativeDomObject::dynamicProperty(const QByteArray &name) const
-{
-    QDeclarativeDomDynamicProperty p;
-
-    if (!isValid())
-        return p;
-
-    for (int i = 0; i < d->object->dynamicProperties.size(); ++i) {
-        if (d->object->dynamicProperties.at(i).name == name) {
-            p.d = new QDeclarativeDomDynamicPropertyPrivate;
-            p.d->property = d->object->dynamicProperties.at(i);
-            if (p.d->property.defaultValue) p.d->property.defaultValue->addref();
-            p.d->valid = true;
-        }
-    }
-
-    return p;
-}
-
-/*!
-    Returns true if this object is a custom type.  Custom types are special
-    types that allow embeddeding non-QML data, such as SVG or HTML data,
-    directly into QML files.
-
-    \note Currently this method will always return false, and is a placekeeper
-    for future functionality.
-
-    \sa QDeclarativeDomObject::customTypeData()
-*/
-bool QDeclarativeDomObject::isCustomType() const
-{
-    return false;
-}
-
-/*!
-    If this object represents a custom type, returns the data associated with
-    the custom type, otherwise returns an empty QByteArray().
-    QDeclarativeDomObject::isCustomType() can be used to check if this object represents
-    a custom type.
-*/
-QByteArray QDeclarativeDomObject::customTypeData() const
-{
-    return QByteArray();
-}
-
-/*!
-    Returns true if this object is a sub-component object.  Sub-component
-    objects can be converted into QDeclarativeDomComponent instances by calling
-    QDeclarativeDomObject::toComponent().
-
-    \sa QDeclarativeDomObject::toComponent()
-*/
-bool QDeclarativeDomObject::isComponent() const
-{
-    return (d->object && (d->object->typeName == "Qt/Component" || d->object->typeName == "QtQuick/Component"));
-}
-
-/*!
-    Returns a QDeclarativeDomComponent for this object if it is a sub-component, or
-    an invalid QDeclarativeDomComponent if not.  QDeclarativeDomObject::isComponent() can be used
-    to check if this object represents a sub-component.
-
-    \sa QDeclarativeDomObject::isComponent()
-*/
-QDeclarativeDomComponent QDeclarativeDomObject::toComponent() const
-{
-    QDeclarativeDomComponent rv;
-    if (isComponent())
-        rv.d = d;
-    return rv;
-}
-
-/*!
-    Returns the position in the input data where the property assignment started
-, or -1 if the property is invalid.
-*/
-int QDeclarativeDomObject::position() const
-{
-    if (d && d->object)
-        return d->object->location.range.offset;
-    else
-        return -1;
-}
-
-/*!
-    Returns the length in the input data from where the property assignment star
-ted upto the end of it, or -1 if the property is invalid.
-*/
-int QDeclarativeDomObject::length() const
-{
-    if (d && d->object)
-        return d->object->location.range.length;
-    else
-        return -1;
-}
-
-// Returns the URL of the type, if it is an external type, or an empty URL if
-// not
-QUrl QDeclarativeDomObject::url() const
-{
-    if (d && d->object)
-        return d->object->url;
-    else
-        return QUrl();
-}
-
-QDeclarativeDomBasicValuePrivate::QDeclarativeDomBasicValuePrivate()
-: value(0)
-{
-}
-
-QDeclarativeDomBasicValuePrivate::~QDeclarativeDomBasicValuePrivate()
-{
-    if (value) value->release();
-}
-
-/*!
-    \class QDeclarativeDomValueLiteral
-    \internal
-    \brief The QDeclarativeDomValueLiteral class represents a literal value.
-
-    A literal value is a simple value, written inline with the QML.  In the
-    example below, the "x", "y" and "color" properties are being assigned
-    literal values.
-
-    \qml
-Rectangle {
-    x: 10
-    y: 10
-    color: "red"
-}
-    \endqml
-*/
-
-/*!
-    Construct an empty QDeclarativeDomValueLiteral.
-*/
-QDeclarativeDomValueLiteral::QDeclarativeDomValueLiteral():
-    d(new QDeclarativeDomBasicValuePrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomValueLiteral.
-*/
-QDeclarativeDomValueLiteral::QDeclarativeDomValueLiteral(const QDeclarativeDomValueLiteral &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomValueLiteral.
-*/
-QDeclarativeDomValueLiteral::~QDeclarativeDomValueLiteral()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomValueLiteral.
-*/
-QDeclarativeDomValueLiteral &QDeclarativeDomValueLiteral::operator=(const QDeclarativeDomValueLiteral &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Return the literal value.
-
-    In the example below, the literal value will be the string "10".
-    \qml
-Rectangle { x: 10 }
-    \endqml
-*/
-QString QDeclarativeDomValueLiteral::literal() const
-{
-    if (d->value) return d->value->primitive();
-    else return QString();
-}
-
-/*!
-    \class QDeclarativeDomValueBinding
-    \internal
-    \brief The QDeclarativeDomValueBinding class represents a property binding.
-
-    A property binding is an ECMAScript expression assigned to a property.  In
-    the example below, the "x" property is being assigned a property binding.
-
-    \qml
-Rectangle { x: Other.x }
-    \endqml
-*/
-
-/*!
-    Construct an empty QDeclarativeDomValueBinding.
-*/
-QDeclarativeDomValueBinding::QDeclarativeDomValueBinding():
-        d(new QDeclarativeDomBasicValuePrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomValueBinding.
-*/
-QDeclarativeDomValueBinding::QDeclarativeDomValueBinding(const QDeclarativeDomValueBinding &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomValueBinding.
-*/
-QDeclarativeDomValueBinding::~QDeclarativeDomValueBinding()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomValueBinding.
-*/
-QDeclarativeDomValueBinding &QDeclarativeDomValueBinding::operator=(const QDeclarativeDomValueBinding &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Return the binding expression.
-
-    In the example below, the string "Other.x" will be returned.
-    \qml
-Rectangle { x: Other.x }
-    \endqml
-*/
-QString QDeclarativeDomValueBinding::binding() const
-{
-    if (d->value)
-        return d->value->value.asScript();
-    else
-        return QString();
-}
-
-/*!
-    \class QDeclarativeDomValueValueSource
-    \internal
-    \brief The QDeclarativeDomValueValueSource class represents a value source assignment value.
-
-    In QML, value sources are special value generating types that may be
-    assigned to properties.  Value sources inherit the QDeclarativePropertyValueSource
-    class.  In the example below, the "x" property is being assigned the
-    NumberAnimation value source.
-
-    \qml
-Rectangle {
-    x: NumberAnimation {
-        from: 0
-        to: 100
-        loops: Animation.Infinite
-    }
-}
-    \endqml
-*/
-
-/*!
-    Construct an empty QDeclarativeDomValueValueSource.
-*/
-QDeclarativeDomValueValueSource::QDeclarativeDomValueValueSource():
-        d(new QDeclarativeDomBasicValuePrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomValueValueSource.
-*/
-QDeclarativeDomValueValueSource::QDeclarativeDomValueValueSource(const QDeclarativeDomValueValueSource &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomValueValueSource.
-*/
-QDeclarativeDomValueValueSource::~QDeclarativeDomValueValueSource()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomValueValueSource.
-*/
-QDeclarativeDomValueValueSource &QDeclarativeDomValueValueSource::operator=(const QDeclarativeDomValueValueSource &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Return the value source object.
-
-    In the example below, an object representing the NumberAnimation will be
-    returned.
-    \qml
-Rectangle {
-    x: NumberAnimation {
-        from: 0
-        to: 100
-        loops: Animation.Infinite
-    }
-}
-    \endqml
-*/
-QDeclarativeDomObject QDeclarativeDomValueValueSource::object() const
-{
-    QDeclarativeDomObject rv;
-    if (d->value) {
-        rv.d->object = d->value->object;
-        rv.d->object->addref();
-    }
-    return rv;
-}
-
-/*!
-    \class QDeclarativeDomValueValueInterceptor
-    \internal
-    \brief The QDeclarativeDomValueValueInterceptor class represents a value interceptor assignment value.
-
-    In QML, value interceptor are special write-intercepting types that may be
-    assigned to properties.  Value interceptor inherit the QDeclarativePropertyValueInterceptor
-    class.  In the example below, the "x" property is being assigned the
-    Behavior value interceptor.
-
-    \qml
-Rectangle {
-    Behavior on x { NumberAnimation { duration: 500 } }
-}
-    \endqml
-*/
-
-/*!
-    Construct an empty QDeclarativeDomValueValueInterceptor.
-*/
-QDeclarativeDomValueValueInterceptor::QDeclarativeDomValueValueInterceptor():
-        d(new QDeclarativeDomBasicValuePrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomValueValueInterceptor.
-*/
-QDeclarativeDomValueValueInterceptor::QDeclarativeDomValueValueInterceptor(const QDeclarativeDomValueValueInterceptor &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomValueValueInterceptor.
-*/
-QDeclarativeDomValueValueInterceptor::~QDeclarativeDomValueValueInterceptor()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomValueValueInterceptor.
-*/
-QDeclarativeDomValueValueInterceptor &QDeclarativeDomValueValueInterceptor::operator=(const QDeclarativeDomValueValueInterceptor &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Return the value interceptor object.
-
-    In the example below, an object representing the Behavior will be
-    returned.
-    \qml
-Rectangle {
-    Behavior on x { NumberAnimation { duration: 500 } }
-}
-    \endqml
-*/
-QDeclarativeDomObject QDeclarativeDomValueValueInterceptor::object() const
-{
-    QDeclarativeDomObject rv;
-    if (d->value) {
-        rv.d->object = d->value->object;
-        rv.d->object->addref();
-    }
-    return rv;
-}
-
-QDeclarativeDomValuePrivate::QDeclarativeDomValuePrivate()
-: property(0), value(0)
-{
-}
-
-QDeclarativeDomValuePrivate::~QDeclarativeDomValuePrivate()
-{
-    if (property) property->release();
-    if (value) value->release();
-}
-
-/*!
-    \class QDeclarativeDomValue
-    \internal
-    \brief The QDeclarativeDomValue class represents a generic Qml value.
-
-    QDeclarativeDomValue's can be assigned to QML \l {QDeclarativeDomProperty}{properties}.  In
-    QML, properties can be assigned various different values, including basic
-    literals, property bindings, property value sources, objects and lists of
-    values.  The QDeclarativeDomValue class allows a programmer to determine the specific
-    value type being assigned and access more detailed information through a
-    corresponding value type class.
-
-    For example, in the following example,
-
-    \qml
-Text {
-    text: "Hello World!"
-    y: Other.y
-}
-    \endqml
-
-    The text property is being assigned a literal, and the y property a property
-    binding.  To output the values assigned to the text and y properties in the
-    above example from C++,
-
-    \code
-    QDeclarativeDomDocument document;
-    QDeclarativeDomObject root = document.rootObject();
-
-    QDeclarativeDomProperty text = root.property("text");
-    if (text.value().isLiteral()) {
-        QDeclarativeDomValueLiteral literal = text.value().toLiteral();
-        qDebug() << literal.literal();
-    }
-
-    QDeclarativeDomProperty y = root.property("y");
-    if (y.value().isBinding()) {
-        QDeclarativeDomValueBinding binding = y.value().toBinding();
-        qDebug() << binding.binding();
-    }
-    \endcode
-*/
-
-/*!
-    Construct an invalid QDeclarativeDomValue.
-*/
-QDeclarativeDomValue::QDeclarativeDomValue()
-: d(new QDeclarativeDomValuePrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomValue.
-*/
-QDeclarativeDomValue::QDeclarativeDomValue(const QDeclarativeDomValue &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomValue
-*/
-QDeclarativeDomValue::~QDeclarativeDomValue()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomValue.
-*/
-QDeclarativeDomValue &QDeclarativeDomValue::operator=(const QDeclarativeDomValue &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    \enum QDeclarativeDomValue::Type
-
-    The type of the QDeclarativeDomValue node.
-
-    \value Invalid The QDeclarativeDomValue is invalid.
-    \value Literal The QDeclarativeDomValue is a literal value assignment.  Use QDeclarativeDomValue::toLiteral() to access the type instance.
-    \value PropertyBinding The QDeclarativeDomValue is a property binding.  Use QDeclarativeDomValue::toBinding() to access the type instance.
-    \value ValueSource The QDeclarativeDomValue is a property value source.  Use QDeclarativeDomValue::toValueSource() to access the type instance.
-    \value ValueInterceptor The QDeclarativeDomValue is a property value interceptor.  Use QDeclarativeDomValue::toValueInterceptor() to access the type instance.
-    \value Object The QDeclarativeDomValue is an object assignment.  Use QDeclarativeDomValue::toObject() to access the type instnace.
-    \value List The QDeclarativeDomValue is a list of other values.  Use QDeclarativeDomValue::toList() to access the type instance.
-*/
-
-/*!
-    Returns the type of this QDeclarativeDomValue.
-*/
-QDeclarativeDomValue::Type QDeclarativeDomValue::type() const
-{
-    if (d->property)
-        if (QDeclarativeMetaType::isList(d->property->type) ||
-           (d->property && (d->property->values.count() + d->property->onValues.count()) > 1))
-            return List;
-
-    QDeclarativeParser::Value *value = d->value;
-    if (!value && !d->property)
-        return Invalid;
-
-    switch(value->type) {
-    case QDeclarativeParser::Value::Unknown:
-        return Invalid;
-    case QDeclarativeParser::Value::Literal:
-        return Literal;
-    case QDeclarativeParser::Value::PropertyBinding:
-        return PropertyBinding;
-    case QDeclarativeParser::Value::ValueSource:
-        return ValueSource;
-    case QDeclarativeParser::Value::ValueInterceptor:
-        return ValueInterceptor;
-    case QDeclarativeParser::Value::CreatedObject:
-        return Object;
-    case QDeclarativeParser::Value::SignalObject:
-        return Invalid;
-    case QDeclarativeParser::Value::SignalExpression:
-        return Literal;
-    case QDeclarativeParser::Value::Id:
-        return Literal;
-    }
-    return Invalid;
-}
-
-/*!
-    Returns true if this is an invalid value, otherwise false.
-*/
-bool QDeclarativeDomValue::isInvalid() const
-{
-    return type() == Invalid;
-}
-
-/*!
-    Returns true if this is a literal value, otherwise false.
-*/
-bool QDeclarativeDomValue::isLiteral() const
-{
-    return type() == Literal;
-}
-
-/*!
-    Returns true if this is a property binding value, otherwise false.
-*/
-bool QDeclarativeDomValue::isBinding() const
-{
-    return type() == PropertyBinding;
-}
-
-/*!
-    Returns true if this is a value source value, otherwise false.
-*/
-bool QDeclarativeDomValue::isValueSource() const
-{
-    return type() == ValueSource;
-}
-
-/*!
-    Returns true if this is a value interceptor value, otherwise false.
-*/
-bool QDeclarativeDomValue::isValueInterceptor() const
-{
-    return type() == ValueInterceptor;
-}
-
-/*!
-    Returns true if this is an object value, otherwise false.
-*/
-bool QDeclarativeDomValue::isObject() const
-{
-    return type() == Object;
-}
-
-/*!
-    Returns true if this is a list value, otherwise false.
-*/
-bool QDeclarativeDomValue::isList() const
-{
-    return type() == List;
-}
-
-/*!
-    Returns a QDeclarativeDomValueLiteral if this value is a literal type, otherwise
-    returns an invalid QDeclarativeDomValueLiteral.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomValueLiteral QDeclarativeDomValue::toLiteral() const
-{
-    QDeclarativeDomValueLiteral rv;
-    if (type() == Literal) {
-        rv.d->value = d->value;
-        rv.d->value->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns a QDeclarativeDomValueBinding if this value is a property binding type,
-    otherwise returns an invalid QDeclarativeDomValueBinding.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomValueBinding QDeclarativeDomValue::toBinding() const
-{
-    QDeclarativeDomValueBinding rv;
-    if (type() == PropertyBinding) {
-        rv.d->value = d->value;
-        rv.d->value->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns a QDeclarativeDomValueValueSource if this value is a property value source
-    type, otherwise returns an invalid QDeclarativeDomValueValueSource.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomValueValueSource QDeclarativeDomValue::toValueSource() const
-{
-    QDeclarativeDomValueValueSource rv;
-    if (type() == ValueSource) {
-        rv.d->value = d->value;
-        rv.d->value->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns a QDeclarativeDomValueValueInterceptor if this value is a property value interceptor
-    type, otherwise returns an invalid QDeclarativeDomValueValueInterceptor.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomValueValueInterceptor QDeclarativeDomValue::toValueInterceptor() const
-{
-    QDeclarativeDomValueValueInterceptor rv;
-    if (type() == ValueInterceptor) {
-        rv.d->value = d->value;
-        rv.d->value->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns a QDeclarativeDomObject if this value is an object assignment type, otherwise
-    returns an invalid QDeclarativeDomObject.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomObject QDeclarativeDomValue::toObject() const
-{
-    QDeclarativeDomObject rv;
-    if (type() == Object) {
-        rv.d->object = d->value->object;
-        rv.d->object->addref();
-    }
-    return rv;
-}
-
-/*!
-    Returns a QDeclarativeDomList if this value is a list type, otherwise returns an
-    invalid QDeclarativeDomList.
-
-    \sa QDeclarativeDomValue::type()
-*/
-QDeclarativeDomList QDeclarativeDomValue::toList() const
-{
-    QDeclarativeDomList rv;
-    if (type() == List) {
-        rv.d = d;
-    }
-    return rv;
-}
-
-/*!
-    Returns the position in the input data where the property value startd, or -1
- if the value is invalid.
-*/
-int QDeclarativeDomValue::position() const
-{
-    if (type() == Invalid)
-        return -1;
-    else
-        return d->value->location.range.offset;
-}
-
-/*!
-    Returns the length in the input data from where the property value started u
-pto the end of it, or -1 if the value is invalid.
-*/
-int QDeclarativeDomValue::length() const
-{
-    if (type() == Invalid)
-        return -1;
-    else
-        return d->value->location.range.length;
-}
-
-/*!
-    \class QDeclarativeDomList
-    \internal
-    \brief The QDeclarativeDomList class represents a list of values assigned to a QML property.
-
-    Lists of values can be assigned to properties.  For example, the following
-    example assigns multiple objects to Item's "children" property
-    \qml
-Item {
-    children: [
-        Text { },
-        Rectangle { }
-    ]
-}
-    \endqml
-
-    Lists can also be implicitly created by assigning multiple
-    \l {QDeclarativeDomValueValueSource}{value sources} or constants to a property.
-    \qml
-Item {
-    x: 10
-    x: NumberAnimation {
-        running: false
-        from: 0
-        to: 100
-    }
-}
-    \endqml
-*/
-
-/*!
-    Construct an empty QDeclarativeDomList.
-*/
-QDeclarativeDomList::QDeclarativeDomList()
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomList.
-*/
-QDeclarativeDomList::QDeclarativeDomList(const QDeclarativeDomList &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomList.
-*/
-QDeclarativeDomList::~QDeclarativeDomList()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomList.
-*/
-QDeclarativeDomList &QDeclarativeDomList::operator=(const QDeclarativeDomList &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-    Returns the list of QDeclarativeDomValue's.
-*/
-QList<QDeclarativeDomValue> QDeclarativeDomList::values() const
-{
-    QList<QDeclarativeDomValue> rv;
-    if (!d->property)
-        return rv;
-
-    for (int ii = 0; ii < d->property->values.count(); ++ii) {
-        QDeclarativeDomValue v;
-        v.d->value = d->property->values.at(ii);
-        v.d->value->addref();
-        rv << v;
-    }
-
-    for (int ii = 0; ii < d->property->onValues.count(); ++ii) {
-        QDeclarativeDomValue v;
-        v.d->value = d->property->onValues.at(ii);
-        v.d->value->addref();
-        rv << v;
-    }
-
-    return rv;
-}
-
-/*!
-    Returns the position in the input data where the list started, or -1 if
- the property is invalid.
-*/
-int QDeclarativeDomList::position() const
-{
-    if (d && d->property) {
-        return d->property->listValueRange.offset;
-    } else
-        return -1;
-}
-
-/*!
-    Returns the length in the input data from where the list started upto
- the end of it, or 0 if the property is invalid.
-*/
-int QDeclarativeDomList::length() const
-{
-    if (d && d->property)
-        return d->property->listValueRange.length;
-    else
-        return -1;
-}
-
-/*!
-  Returns a list of positions of the commas in the QML file.
-*/
-QList<int> QDeclarativeDomList:: commaPositions() const
-{
-    if (d && d->property)
-        return d->property->listCommaPositions;
-    else
-        return QList<int>();
-}
-
-/*!
-    \class QDeclarativeDomComponent
-    \internal
-    \brief The QDeclarativeDomComponent class represents sub-component within a QML document.
-
-    Sub-components are QDeclarativeComponents defined within a QML document.  The
-    following example shows the definition of a sub-component with the id
-    "listDelegate".
-
-    \qml
-Item {
-    Component {
-        id: listDelegate
-        Text {
-            text: modelData.text
-        }
-    }
-}
-    \endqml
-
-    Like QDeclarativeDomDocument's, components contain a single root object.
-*/
-
-/*!
-    Construct an empty QDeclarativeDomComponent.
-*/
-QDeclarativeDomComponent::QDeclarativeDomComponent()
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomComponent.
-*/
-QDeclarativeDomComponent::QDeclarativeDomComponent(const QDeclarativeDomComponent &other)
-: QDeclarativeDomObject(other)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomComponent.
-*/
-QDeclarativeDomComponent::~QDeclarativeDomComponent()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomComponent.
-*/
-QDeclarativeDomComponent &QDeclarativeDomComponent::operator=(const QDeclarativeDomComponent &other)
-{
-    static_cast<QDeclarativeDomObject &>(*this) = other;
-    return *this;
-}
-
-/*!
-    Returns the component's root object.
-
-    In the example below, the root object is the "Text" object.
-    \qml
-Item {
-    Component {
-        id: listDelegate
-        Text {
-            text: modelData.text
-        }
-    }
-}
-    \endqml
-*/
-QDeclarativeDomObject QDeclarativeDomComponent::componentRoot() const
-{
-    QDeclarativeDomObject rv;
-    if (d->object) {
-        QDeclarativeParser::Object *obj = 0;
-        if (d->object->defaultProperty &&
-           d->object->defaultProperty->values.count() == 1 &&
-           d->object->defaultProperty->values.at(0)->object)
-            obj = d->object->defaultProperty->values.at(0)->object;
-
-        if (obj) {
-            rv.d->object = obj;
-            rv.d->object->addref();
-        }
-    }
-
-    return rv;
-}
-
-QDeclarativeDomImportPrivate::QDeclarativeDomImportPrivate()
-: type(File)
-{
-}
-
-QDeclarativeDomImportPrivate::~QDeclarativeDomImportPrivate()
-{
-}
-
-/*!
-    \class QDeclarativeDomImport
-    \internal
-    \brief The QDeclarativeDomImport class represents an import statement.
-*/
-
-/*!
-    Construct an empty QDeclarativeDomImport.
-*/
-QDeclarativeDomImport::QDeclarativeDomImport()
-: d(new QDeclarativeDomImportPrivate)
-{
-}
-
-/*!
-    Create a copy of \a other QDeclarativeDomImport.
-*/
-QDeclarativeDomImport::QDeclarativeDomImport(const QDeclarativeDomImport &other)
-: d(other.d)
-{
-}
-
-/*!
-    Destroy the QDeclarativeDomImport.
-*/
-QDeclarativeDomImport::~QDeclarativeDomImport()
-{
-}
-
-/*!
-    Assign \a other to this QDeclarativeDomImport.
-*/
-QDeclarativeDomImport &QDeclarativeDomImport::operator=(const QDeclarativeDomImport &other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*!
-  Returns the type of the import.
-  */
-QDeclarativeDomImport::Type QDeclarativeDomImport::type() const
-{
-    return static_cast<QDeclarativeDomImport::Type>(d->type);
-}
-
-/*!
-  Returns the URI of the import (e.g. 'subdir' or 'com.nokia.Qt')
-  */
-QString QDeclarativeDomImport::uri() const
-{
-    return d->uri;
-}
-
-/*!
-  Returns the version specified by the import. An empty string if no version was specified.
-  */
-QString QDeclarativeDomImport::version() const
-{
-    return d->version;
-}
-
-/*!
-  Returns the (optional) qualifier string (the token following the 'as' keyword) of the import.
-  */
-QString QDeclarativeDomImport::qualifier() const
-{
-    return d->qualifier;
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativedom_p.h b/src/declarative/qml/qdeclarativedom_p.h
deleted file mode 100644
index 64300d47e7..0000000000
--- a/src/declarative/qml/qdeclarativedom_p.h
+++ /dev/null
@@ -1,362 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEDOM_P_H
-#define QDECLARATIVEDOM_P_H
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the Qt API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qdeclarativeerror.h"
-
-#include <QtCore/qlist.h>
-#include <QtCore/qshareddata.h>
-
-#include <private/qdeclarativeglobal_p.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QString;
-class QByteArray;
-class QDeclarativeDomObject;
-class QDeclarativeDomList;
-class QDeclarativeDomValue;
-class QDeclarativeEngine;
-class QDeclarativeDomComponent;
-class QDeclarativeDomImport;
-class QIODevice;
-
-class QDeclarativeDomDocumentPrivate;
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomDocument
-{
-public:
-    QDeclarativeDomDocument();
-    QDeclarativeDomDocument(const QDeclarativeDomDocument &);
-    ~QDeclarativeDomDocument();
-    QDeclarativeDomDocument &operator=(const QDeclarativeDomDocument &);
-
-    QList<QDeclarativeDomImport> imports() const;
-
-    QList<QDeclarativeError> errors() const;
-    bool load(QDeclarativeEngine *, const QByteArray &, const QUrl & = QUrl());
-
-    QDeclarativeDomObject rootObject() const;
-
-private:
-    QSharedDataPointer<QDeclarativeDomDocumentPrivate> d;
-};
-
-class QDeclarativeDomPropertyPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomProperty
-{
-public:
-    QDeclarativeDomProperty();
-    QDeclarativeDomProperty(const QDeclarativeDomProperty &);
-    ~QDeclarativeDomProperty();
-    QDeclarativeDomProperty &operator=(const QDeclarativeDomProperty &);
-
-    bool isValid() const;
-
-    QByteArray propertyName() const;
-    QList<QByteArray> propertyNameParts() const;
-
-    bool isDefaultProperty() const;
-
-    QDeclarativeDomValue value() const;
-
-    int position() const;
-    int length() const;
-
-private:
-    friend class QDeclarativeDomObject;
-    friend class QDeclarativeDomDynamicProperty;
-    QSharedDataPointer<QDeclarativeDomPropertyPrivate> d;
-};
-
-class QDeclarativeDomDynamicPropertyPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomDynamicProperty
-{
-public:
-    QDeclarativeDomDynamicProperty();
-    QDeclarativeDomDynamicProperty(const QDeclarativeDomDynamicProperty &);
-    ~QDeclarativeDomDynamicProperty();
-    QDeclarativeDomDynamicProperty &operator=(const QDeclarativeDomDynamicProperty &);
-
-    bool isValid() const;
-
-    QByteArray propertyName() const;
-    int propertyType() const;
-    QByteArray propertyTypeName() const;
-
-    bool isDefaultProperty() const;
-    QDeclarativeDomProperty defaultValue() const;
-
-    bool isAlias() const;
-
-    int position() const;
-    int length() const;
-
-private:
-    friend class QDeclarativeDomObject;
-    QSharedDataPointer<QDeclarativeDomDynamicPropertyPrivate> d;
-};
-
-class QDeclarativeDomObjectPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomObject
-{
-public:
-    QDeclarativeDomObject();
-    QDeclarativeDomObject(const QDeclarativeDomObject &);
-    ~QDeclarativeDomObject();
-    QDeclarativeDomObject &operator=(const QDeclarativeDomObject &);
-
-    bool isValid() const;
-
-    QByteArray objectType() const;
-    QByteArray objectClassName() const;
-
-    int objectTypeMajorVersion() const;
-    int objectTypeMinorVersion() const;
-
-    QString objectId() const;
-
-    QList<QDeclarativeDomProperty> properties() const;
-    QDeclarativeDomProperty property(const QByteArray &) const;
-
-    QList<QDeclarativeDomDynamicProperty> dynamicProperties() const;
-    QDeclarativeDomDynamicProperty dynamicProperty(const QByteArray &) const;
-
-    bool isCustomType() const;
-    QByteArray customTypeData() const;
-
-    bool isComponent() const;
-    QDeclarativeDomComponent toComponent() const;
-
-    int position() const;
-    int length() const;
-
-    QUrl url() const;
-private:
-    friend class QDeclarativeDomDocument;
-    friend class QDeclarativeDomComponent;
-    friend class QDeclarativeDomValue;
-    friend class QDeclarativeDomValueValueSource;
-    friend class QDeclarativeDomValueValueInterceptor;
-    QSharedDataPointer<QDeclarativeDomObjectPrivate> d;
-};
-
-class QDeclarativeDomValuePrivate;
-class QDeclarativeDomBasicValuePrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomValueLiteral
-{
-public:
-    QDeclarativeDomValueLiteral();
-    QDeclarativeDomValueLiteral(const QDeclarativeDomValueLiteral &);
-    ~QDeclarativeDomValueLiteral();
-    QDeclarativeDomValueLiteral &operator=(const QDeclarativeDomValueLiteral &);
-
-    QString literal() const;
-
-private:
-    friend class QDeclarativeDomValue;
-    QSharedDataPointer<QDeclarativeDomBasicValuePrivate> d;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomValueBinding
-{
-public:
-    QDeclarativeDomValueBinding();
-    QDeclarativeDomValueBinding(const QDeclarativeDomValueBinding &);
-    ~QDeclarativeDomValueBinding();
-    QDeclarativeDomValueBinding &operator=(const QDeclarativeDomValueBinding &);
-
-    QString binding() const;
-
-private:
-    friend class QDeclarativeDomValue;
-    QSharedDataPointer<QDeclarativeDomBasicValuePrivate> d;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomValueValueSource
-{
-public:
-    QDeclarativeDomValueValueSource();
-    QDeclarativeDomValueValueSource(const QDeclarativeDomValueValueSource &);
-    ~QDeclarativeDomValueValueSource();
-    QDeclarativeDomValueValueSource &operator=(const QDeclarativeDomValueValueSource &);
-
-    QDeclarativeDomObject object() const;
-
-private:
-    friend class QDeclarativeDomValue;
-    QSharedDataPointer<QDeclarativeDomBasicValuePrivate> d;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomValueValueInterceptor
-{
-public:
-    QDeclarativeDomValueValueInterceptor();
-    QDeclarativeDomValueValueInterceptor(const QDeclarativeDomValueValueInterceptor &);
-    ~QDeclarativeDomValueValueInterceptor();
-    QDeclarativeDomValueValueInterceptor &operator=(const QDeclarativeDomValueValueInterceptor &);
-
-    QDeclarativeDomObject object() const;
-
-private:
-    friend class QDeclarativeDomValue;
-    QSharedDataPointer<QDeclarativeDomBasicValuePrivate> d;
-};
-
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomComponent : public QDeclarativeDomObject
-{
-public:
-    QDeclarativeDomComponent();
-    QDeclarativeDomComponent(const QDeclarativeDomComponent &);
-    ~QDeclarativeDomComponent();
-    QDeclarativeDomComponent &operator=(const QDeclarativeDomComponent &);
-
-    QDeclarativeDomObject componentRoot() const;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomValue
-{
-public:
-    enum Type { 
-        Invalid,
-        Literal, 
-        PropertyBinding, 
-        ValueSource,
-        ValueInterceptor,
-        Object,
-        List 
-    };
-
-    QDeclarativeDomValue();
-    QDeclarativeDomValue(const QDeclarativeDomValue &);
-    ~QDeclarativeDomValue();
-    QDeclarativeDomValue &operator=(const QDeclarativeDomValue &);
-
-    Type type() const;
-
-    bool isInvalid() const;
-    bool isLiteral() const;
-    bool isBinding() const;
-    bool isValueSource() const;
-    bool isValueInterceptor() const;
-    bool isObject() const;
-    bool isList() const;
-
-    QDeclarativeDomValueLiteral toLiteral() const;
-    QDeclarativeDomValueBinding toBinding() const;
-    QDeclarativeDomValueValueSource toValueSource() const;
-    QDeclarativeDomValueValueInterceptor toValueInterceptor() const;
-    QDeclarativeDomObject toObject() const;
-    QDeclarativeDomList toList() const;
-
-    int position() const;
-    int length() const;
-
-private:
-    friend class QDeclarativeDomProperty;
-    friend class QDeclarativeDomList;
-    QSharedDataPointer<QDeclarativeDomValuePrivate> d;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomList
-{
-public:
-    QDeclarativeDomList();
-    QDeclarativeDomList(const QDeclarativeDomList &);
-    ~QDeclarativeDomList();
-    QDeclarativeDomList &operator=(const QDeclarativeDomList &);
-
-    QList<QDeclarativeDomValue> values() const;
-
-    int position() const;
-    int length() const;
-
-    QList<int> commaPositions() const;
-
-private:
-    friend class QDeclarativeDomValue;
-    QSharedDataPointer<QDeclarativeDomValuePrivate> d;
-};
-
-class QDeclarativeDomImportPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDomImport
-{
-public:
-    enum Type { Library, File };
-
-    QDeclarativeDomImport();
-    QDeclarativeDomImport(const QDeclarativeDomImport &);
-    ~QDeclarativeDomImport();
-    QDeclarativeDomImport &operator=(const QDeclarativeDomImport &);
-
-    Type type() const;
-    QString uri() const;
-    QString version() const;
-    QString qualifier() const;
-
-private:
-    friend class QDeclarativeDomDocument;
-    QSharedDataPointer<QDeclarativeDomImportPrivate> d;
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEDOM_P_H
diff --git a/src/declarative/qml/qdeclarativedom_p_p.h b/src/declarative/qml/qdeclarativedom_p_p.h
deleted file mode 100644
index 7ce99ec74d..0000000000
--- a/src/declarative/qml/qdeclarativedom_p_p.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEDOM_P_P_H
-#define QDECLARATIVEDOM_P_P_H
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the Qt API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeparser_p.h"
-
-#include <QtCore/QtGlobal>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeDomDocumentPrivate : public QSharedData
-{
-public:
-    QDeclarativeDomDocumentPrivate();
-    QDeclarativeDomDocumentPrivate(const QDeclarativeDomDocumentPrivate &o)
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomDocumentPrivate();
-
-    QList<QDeclarativeError> errors;
-    QList<QDeclarativeDomImport> imports;
-    QDeclarativeParser::Object *root;
-    QList<int> automaticSemicolonOffsets;
-};
-
-class QDeclarativeDomObjectPrivate : public QSharedData
-{
-public:
-    QDeclarativeDomObjectPrivate();
-    QDeclarativeDomObjectPrivate(const QDeclarativeDomObjectPrivate &o)
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomObjectPrivate();
-
-    typedef QList<QPair<QDeclarativeParser::Property *, QByteArray> > Properties;
-    Properties properties() const;
-    Properties properties(QDeclarativeParser::Property *) const;
-
-    QDeclarativeParser::Object *object;
-};
-
-class QDeclarativeDomPropertyPrivate : public QSharedData
-{
-public:
-    QDeclarativeDomPropertyPrivate();
-    QDeclarativeDomPropertyPrivate(const QDeclarativeDomPropertyPrivate &o)
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomPropertyPrivate();
-
-    QByteArray propertyName;
-    QDeclarativeParser::Property *property;
-};
-
-class QDeclarativeDomDynamicPropertyPrivate : public QSharedData
-{
-public:
-    QDeclarativeDomDynamicPropertyPrivate();
-    QDeclarativeDomDynamicPropertyPrivate(const QDeclarativeDomDynamicPropertyPrivate &o)
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomDynamicPropertyPrivate();
-
-    bool valid;
-    QDeclarativeParser::Object::DynamicProperty property;
-};
-
-class QDeclarativeDomValuePrivate : public QSharedData
-{
-public:
-    QDeclarativeDomValuePrivate();
-    QDeclarativeDomValuePrivate(const QDeclarativeDomValuePrivate &o)
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomValuePrivate();
-
-    QDeclarativeParser::Property *property;
-    QDeclarativeParser::Value *value;
-};
-
-class QDeclarativeDomBasicValuePrivate : public QSharedData
-{
-public:
-    QDeclarativeDomBasicValuePrivate();
-    QDeclarativeDomBasicValuePrivate(const QDeclarativeDomBasicValuePrivate &o) 
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomBasicValuePrivate();
-
-    QDeclarativeParser::Value *value;
-};
-
-class QDeclarativeDomImportPrivate : public QSharedData
-{
-public:
-    QDeclarativeDomImportPrivate();
-    QDeclarativeDomImportPrivate(const QDeclarativeDomImportPrivate &o) 
-    : QSharedData(o) { qFatal("Not impl"); }
-    ~QDeclarativeDomImportPrivate();
-
-    enum Type { Library, File };
-
-    Type type;
-    QString uri;
-    QString version;
-    QString qualifier;
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEDOM_P_P_H
-
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 9fde18c81c..b30b4cfb55 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -55,6 +55,7 @@
 #include "private/qdeclarativestringconverters_p.h"
 #include "private/qdeclarativexmlhttprequest_p.h"
 #include "private/qdeclarativesqldatabase_p.h"
+#include "private/qdeclarativescarceresourcescriptclass_p.h"
 #include "private/qdeclarativetypenamescriptclass_p.h"
 #include "private/qdeclarativelistscriptclass_p.h"
 #include "qdeclarativescriptstring.h"
@@ -103,6 +104,8 @@
 
 #include <private/qdeclarativeitemsmodule_p.h>
 #include <private/qdeclarativeutilmodule_p.h>
+#include <private/qsgitemsmodule_p.h>
+#include <qsgtexture.h>
 
 #ifdef Q_OS_WIN // for %APPDATA%
 #include <qt_windows.h>
@@ -349,13 +352,15 @@ QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e)
   objectClass(0), valueTypeClass(0), globalClass(0), cleanup(0), erroredBindings(0),
   inProgressCreations(0), scriptEngine(this), workerScriptEngine(0), componentAttached(0),
   inBeginCreate(false), networkAccessManager(0), networkAccessManagerFactory(0),
-  typeLoader(e), importDatabase(e), uniqueId(1)
+  scarceResources(0), scarceResourcesRefCount(0), typeLoader(e), importDatabase(e), uniqueId(1),
+  sgContext(0)
 {
     if (!qt_QmlQtModule_registered) {
         qt_QmlQtModule_registered = true;
         QDeclarativeItemModule::defineModule();
         QDeclarativeUtilModule::defineModule();
         QDeclarativeEnginePrivate::defineModule();
+        QSGItemsModule::defineModule();
         QDeclarativeValueTypeFactory::registerValueTypes();
     }
     globalClass = new QDeclarativeGlobalScriptClass(&scriptEngine);
@@ -499,6 +504,8 @@ QDeclarativeEnginePrivate::~QDeclarativeEnginePrivate()
     contextClass = 0;
     delete objectClass;
     objectClass = 0;
+    delete scarceResourceClass;
+    scarceResourceClass = 0;
     delete valueTypeClass;
     valueTypeClass = 0;
     delete typeNameClass;
@@ -514,7 +521,10 @@ QDeclarativeEnginePrivate::~QDeclarativeEnginePrivate()
         (*iter)->release();
     for(QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *>::Iterator iter = typePropertyCache.begin(); iter != typePropertyCache.end(); ++iter)
         (*iter)->release();
-
+    for(QHash<QDeclarativeMetaType::ModuleApi, QDeclarativeMetaType::ModuleApiInstance *>::Iterator iter = moduleApiInstances.begin(); iter != moduleApiInstances.end(); ++iter) {
+        delete (*iter)->qobjectApi;
+        delete *iter;
+    }
 }
 
 void QDeclarativeEnginePrivate::clear(SimpleList<QDeclarativeAbstractBinding> &bvs)
@@ -571,6 +581,7 @@ void QDeclarativeEnginePrivate::init()
 
     contextClass = new QDeclarativeContextScriptClass(q);
     objectClass = new QDeclarativeObjectScriptClass(q);
+    scarceResourceClass = new QDeclarativeScarceResourceScriptClass(q);
     valueTypeClass = new QDeclarativeValueTypeScriptClass(q);
     typeNameClass = new QDeclarativeTypeNameScriptClass(q);
     listClass = new QDeclarativeListScriptClass(q);
@@ -647,6 +658,22 @@ QDeclarativeEngine::~QDeclarativeEngine()
     Q_D(QDeclarativeEngine);
     if (d->isDebugging)
         QDeclarativeEngineDebugServer::instance()->remEngine(this);
+
+    // if we are the parent of any of the qobject module api instances,
+    // we need to remove them from our internal list, in order to prevent
+    // a segfault in engine private dtor.
+    QList<QDeclarativeMetaType::ModuleApi> keys = d->moduleApiInstances.keys();
+    QObject *currQObjectApi = 0;
+    QDeclarativeMetaType::ModuleApiInstance *currInstance = 0;
+    foreach (const QDeclarativeMetaType::ModuleApi &key, keys) {
+        currInstance = d->moduleApiInstances.value(key);
+        currQObjectApi = currInstance->qobjectApi;
+        if (this->children().contains(currQObjectApi)) {
+            delete currQObjectApi;
+            delete currInstance;
+            d->moduleApiInstances.remove(key);
+        }
+    }
 }
 
 /*! \fn void QDeclarativeEngine::quit()
@@ -813,6 +840,18 @@ QDeclarativeImageProvider::ImageType QDeclarativeEnginePrivate::getImageProvider
     return static_cast<QDeclarativeImageProvider::ImageType>(-1);
 }
 
+QSGTexture *QDeclarativeEnginePrivate::getTextureFromProvider(const QUrl &url, QSize *size, const QSize& req_size)
+{
+    QMutexLocker locker(&mutex);
+    QSharedPointer<QDeclarativeImageProvider> provider = imageProviders.value(url.host());
+    locker.unlock();
+    if (provider) {
+        QString imageId = url.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).mid(1);
+        return provider->requestTexture(imageId, size, req_size);
+    }
+    return 0;
+}
+
 QImage QDeclarativeEnginePrivate::getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size)
 {
     QMutexLocker locker(&mutex);
@@ -2056,7 +2095,9 @@ QScriptValue QDeclarativeEnginePrivate::tint(QScriptContext *ctxt, QScriptEngine
 
 QScriptValue QDeclarativeEnginePrivate::scriptValueFromVariant(const QVariant &val)
 {
-    if (val.userType() == qMetaTypeId<QDeclarativeListReference>()) {
+    if (variantIsScarceResource(val)) {
+        return scarceResourceClass->newScarceResource(val);
+    } else if (val.userType() == qMetaTypeId<QDeclarativeListReference>()) {
         QDeclarativeListReferencePrivate *p =
             QDeclarativeListReferencePrivate::get((QDeclarativeListReference*)val.constData());
         if (p->object) {
@@ -2085,11 +2126,69 @@ QScriptValue QDeclarativeEnginePrivate::scriptValueFromVariant(const QVariant &v
     }
 }
 
+/*
+   If the variant is a scarce resource (consumes a large amount of memory, or
+   only a limited number of them can be held in memory at any given time without
+   exhausting supply for future use) we need to release the scarce resource
+   after evaluation of the javascript binding is complete.
+ */
+bool QDeclarativeEnginePrivate::variantIsScarceResource(const QVariant& val)
+{
+    if (val.type() == QVariant::Pixmap) {
+        return true;
+    } else if (val.type() == QVariant::Image) {
+        return true;
+    }
+
+    return false;
+}
+
+/*
+   This function should be called prior to evaluation of any js expression,
+   so that scarce resources are not freed prematurely (eg, if there is a
+   nested javascript expression).
+ */
+void QDeclarativeEnginePrivate::referenceScarceResources()
+{
+    scarceResourcesRefCount += 1;
+}
+
+/*
+   This function should be called after evaluation of the js expression is
+   complete, and so the scarce resources may be freed safely.
+ */
+void QDeclarativeEnginePrivate::dereferenceScarceResources()
+{
+    Q_ASSERT(scarceResourcesRefCount > 0);
+    scarceResourcesRefCount -= 1;
+
+    // if the refcount is zero, then evaluation of the "top level"
+    // expression must have completed.  We can safely release the
+    // scarce resources.
+    if (scarceResourcesRefCount == 0) {
+        // iterate through the list and release them all.
+        // note that the actual SRD is owned by the JS engine,
+        // so we cannot delete the SRD; but we can free the
+        // memory used by the variant in the SRD.
+        ScarceResourceData *srd = 0;
+        while (scarceResources) {
+            srd = scarceResources; // srd points to the "old" (current) head of the list
+            scarceResources = srd->next; // srd->next is the "new" head of the list
+            if (srd->next) srd->next->prev = &scarceResources; // newHead->prev = listptr.
+            srd->next = 0;
+            srd->prev = 0;
+            srd->releaseResource(); // release the old head node.
+        }
+    }
+}
+
 QVariant QDeclarativeEnginePrivate::scriptValueToVariant(const QScriptValue &val, int hint)
 {
     QScriptDeclarativeClass *dc = QScriptDeclarativeClass::scriptClass(val);
     if (dc == objectClass)
         return QVariant::fromValue(objectClass->toQObject(val));
+    else if (dc == scarceResourceClass)
+        return scarceResourceClass->toVariant(val);
     else if (dc == valueTypeClass)
         return valueTypeClass->toVariant(val);
     else if (dc == contextClass)
@@ -2214,6 +2313,20 @@ void QDeclarativeEngine::setPluginPathList(const QStringList &paths)
 }
 
 
+/*!
+  Imports the plugin named \a filePath with the \a uri provided.
+  Returns true if the plugin was successfully imported; otherwise returns false.
+
+  On failure and if non-null, the \a errors list will have any errors which occurred prepended to it.
+
+  The plugin has to be a Qt plugin which implements the QDeclarativeExtensionPlugin interface.
+*/
+bool QDeclarativeEngine::importPlugin(const QString &filePath, const QString &uri, QList<QDeclarativeError> *errors)
+{
+    Q_D(QDeclarativeEngine);
+    return d->importDatabase.importPlugin(filePath, uri, errors);
+}
+
 /*!
   Imports the plugin named \a filePath with the \a uri provided.
   Returns true if the plugin was successfully imported; otherwise returns false.
@@ -2225,7 +2338,18 @@ void QDeclarativeEngine::setPluginPathList(const QStringList &paths)
 bool QDeclarativeEngine::importPlugin(const QString &filePath, const QString &uri, QString *errorString)
 {
     Q_D(QDeclarativeEngine);
-    return d->importDatabase.importPlugin(filePath, uri, errorString);
+    QList<QDeclarativeError> errors;
+    bool retn = d->importDatabase.importPlugin(filePath, uri, &errors);
+    if (!errors.isEmpty()) {
+        QString builtError;
+        for (int i = 0; i < errors.size(); ++i) {
+            builtError = QString(QLatin1String("%1\n        %2"))
+                    .arg(builtError)
+                    .arg(errors.at(i).toString());
+        }
+        *errorString = builtError;
+    }
+    return retn;
 }
 
 /*!
diff --git a/src/declarative/qml/qdeclarativeengine.h b/src/declarative/qml/qdeclarativeengine.h
index 631fc5ec57..8db3db8096 100644
--- a/src/declarative/qml/qdeclarativeengine.h
+++ b/src/declarative/qml/qdeclarativeengine.h
@@ -86,7 +86,8 @@ public:
     void setPluginPathList(const QStringList &paths);
     void addPluginPath(const QString& dir);
 
-    bool importPlugin(const QString &filePath, const QString &uri, QString *errorString);
+    bool importPlugin(const QString &filePath, const QString &uri, QString *errorString); // XXX: Qt 5: Remove this function
+    bool importPlugin(const QString &filePath, const QString &uri, QList<QDeclarativeError> *errors);
 
     void setNetworkAccessManagerFactory(QDeclarativeNetworkAccessManagerFactory *);
     QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory() const;
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
index 88b4e800f8..fadedf41dd 100644
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ b/src/declarative/qml/qdeclarativeengine_p.h
@@ -67,6 +67,7 @@
 #include "private/qdeclarativeproperty_p.h"
 #include "private/qdeclarativepropertycache_p.h"
 #include "private/qdeclarativeobjectscriptclass_p.h"
+#include "private/qdeclarativescarceresourcescriptclass_p.h"
 #include "private/qdeclarativecontextscriptclass_p.h"
 #include "private/qdeclarativevaluetypescriptclass_p.h"
 #include "private/qdeclarativemetatype_p.h"
@@ -93,6 +94,8 @@ class QDeclarativeExpression;
 class QDeclarativeContextScriptClass;
 class QDeclarativeImportDatabase;
 class QDeclarativeObjectScriptClass;
+class QDeclarativeScarceResourceScriptClass;
+class ScarceResourceData;
 class QDeclarativeTypeNameScriptClass;
 class QDeclarativeValueTypeScriptClass;
 class QScriptEngineDebugger;
@@ -110,6 +113,8 @@ class QDeclarativeDelayedError;
 class QDeclarativeWorkerScriptEngine;
 class QDeclarativeGlobalScriptClass;
 class QDir;
+class QSGTexture;
+class QSGContext;
 
 class QDeclarativeScriptEngine : public QScriptEngine
 {
@@ -169,6 +174,7 @@ public:
     QDeclarativeContextData *sharedContext;
     QObject *sharedScope;
     QDeclarativeObjectScriptClass *objectClass;
+    QDeclarativeScarceResourceScriptClass *scarceResourceClass;
     QDeclarativeValueTypeScriptClass *valueTypeClass;
     QDeclarativeTypeNameScriptClass *typeNameClass;
     QDeclarativeListScriptClass *listClass;
@@ -233,9 +239,22 @@ public:
 
     QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
     QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
+    QSGTexture *getTextureFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
     QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
     QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
 
+    /*
+       A scarce resource (like a large pixmap or texture) will be cached in a
+       JavaScript wrapper object when accessed in a binding or other js expression.
+       We need some way to automatically release that scarce resource prior to normal
+       garbage collection (unless the user explicitly preserves the resource).
+     */
+    ScarceResourceData* scarceResources;
+    int scarceResourcesRefCount;
+    static bool variantIsScarceResource(const QVariant& val);
+    void referenceScarceResources();
+    void dereferenceScarceResources();
+
     mutable QMutex mutex;
 
     QDeclarativeTypeLoader typeLoader;
@@ -250,6 +269,8 @@ public:
 
     QDeclarativeValueTypeFactory valueTypes;
 
+    QHash<QDeclarativeMetaType::ModuleApi, QDeclarativeMetaType::ModuleApiInstance *> moduleApiInstances;
+
     QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
     QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
     inline QDeclarativePropertyCache *cache(QObject *obj);
@@ -270,8 +291,6 @@ public:
     QHash<int, int> m_qmlLists;
     QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
 
-    QHash<QString, QScriptValue> m_sharedScriptImports;
-
     QScriptValue scriptValueFromVariant(const QVariant &);
     QVariant scriptValueToVariant(const QScriptValue &, int hint = QVariant::Invalid);
 
@@ -327,6 +346,8 @@ public:
     static void defineModule();
 
     static bool qml_debugging_enabled;
+
+    QSGContext *sgContext;
 };
 
 /*!
diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp
index 7a85adaa6e..afd1be1025 100644
--- a/src/declarative/qml/qdeclarativeexpression.cpp
+++ b/src/declarative/qml/qdeclarativeexpression.cpp
@@ -630,7 +630,6 @@ QScriptValue QDeclarativeExpressionPrivate::scriptValue(QObject *secondaryScope,
     if (!expressionFunctionValid) {
         QDeclarativeEngine *engine = context()->engine;
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
-
         QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
 
         QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
@@ -663,8 +662,10 @@ QVariant QDeclarativeExpressionPrivate::value(QObject *secondaryScope, bool *isU
     }
 
     QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(q->engine());
-
-    return ep->scriptValueToVariant(scriptValue(secondaryScope, isUndefined), qMetaTypeId<QList<QObject*> >());
+    ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation.
+    QVariant retn(ep->scriptValueToVariant(scriptValue(secondaryScope, isUndefined), qMetaTypeId<QList<QObject*> >()));
+    ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
+    return retn;
 }
 
 /*!
diff --git a/src/declarative/qml/qdeclarativeimageprovider.cpp b/src/declarative/qml/qdeclarativeimageprovider.cpp
index f111c201fa..c9b399cc32 100644
--- a/src/declarative/qml/qdeclarativeimageprovider.cpp
+++ b/src/declarative/qml/qdeclarativeimageprovider.cpp
@@ -159,6 +159,8 @@ public:
         requestImage() method will be called for all image requests.
     \value Pixmap The Image Provider provides QPixmap images. The 
         requestPixmap() method will be called for all image requests.
+    \value Texture The Image Provider provides QSGTextureProvider based images.
+        The requestTexture() method will be called for all image requests. \omitvalue
 */
 
 /*!
@@ -243,5 +245,36 @@ QPixmap QDeclarativeImageProvider::requestPixmap(const QString &id, QSize *size,
     return QPixmap();
 }
 
+
+/*!
+    Implement this method to return the texture with \a id. The default
+    implementation returns 0.
+
+    The \a id is the requested image source, with the "image:" scheme and
+    provider identifier removed. For example, if the image \l{Image::}{source}
+    was "image://myprovider/icons/home", the given \a id would be "icons/home".
+
+    The \a requestedSize corresponds to the \l {Image::sourceSize} requested by
+    an Image element. If \a requestedSize is a valid size, the image
+    returned should be of that size.
+
+    In all cases, \a size must be set to the original size of the image. This
+    is used to set the \l {Item::}{width} and \l {Item::}{height} of the
+    relevant \l Image if these values have not been set explicitly.
+
+    \note this method may be called by multiple threads, so ensure the
+    implementation of this method is reentrant.
+*/
+
+QSGTexture *QDeclarativeImageProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)
+{
+    Q_UNUSED(id);
+    Q_UNUSED(size);
+    Q_UNUSED(requestedSize);
+    if (d->type == Texture)
+        qWarning("ImageProvider supports Texture type but has not implemented requestTexture()");
+    return 0;
+}
+
 QT_END_NAMESPACE
 
diff --git a/src/declarative/qml/qdeclarativeimageprovider.h b/src/declarative/qml/qdeclarativeimageprovider.h
index 7f13fda85b..e5e80f227c 100644
--- a/src/declarative/qml/qdeclarativeimageprovider.h
+++ b/src/declarative/qml/qdeclarativeimageprovider.h
@@ -52,13 +52,15 @@ QT_BEGIN_NAMESPACE
 QT_MODULE(Declarative)
 
 class QDeclarativeImageProviderPrivate;
+class QSGTexture;
 
 class Q_DECLARATIVE_EXPORT QDeclarativeImageProvider
 {
 public:
     enum ImageType {
         Image,
-        Pixmap
+        Pixmap,
+        Texture
     };
 
     QDeclarativeImageProvider(ImageType type);
@@ -68,6 +70,7 @@ public:
 
     virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize);
     virtual QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize);
+    virtual QSGTexture *requestTexture(const QString &id, QSize *size, const QSize &requestedSize);
 
 private:
     QDeclarativeImageProviderPrivate *d;
diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp
index e8d593fd1a..c5abe2c75d 100644
--- a/src/declarative/qml/qdeclarativeimport.cpp
+++ b/src/declarative/qml/qdeclarativeimport.cpp
@@ -83,7 +83,7 @@ public:
                                  QDeclarativeType** type_return, QUrl* url_return,
                                  QUrl *base = 0, bool *typeRecursionDetected = 0);
     bool find(const QByteArray& type, int *vmajor, int *vminor, QDeclarativeType** type_return,
-              QUrl* url_return, QUrl *base = 0, QString *errorString = 0);
+              QUrl* url_return, QUrl *base = 0, QList<QDeclarativeError> *errors = 0);
 };
 
 class QDeclarativeImportsPrivate {
@@ -93,15 +93,15 @@ public:
 
     bool importExtension(const QString &absoluteFilePath, const QString &uri, 
                          QDeclarativeImportDatabase *database, QDeclarativeDirComponents* components, 
-                         QString *errorString);
+                         QList<QDeclarativeError> *errors);
 
     QString resolvedUri(const QString &dir_arg, QDeclarativeImportDatabase *database);
     bool add(const QDeclarativeDirComponents &qmldircomponentsnetwork, 
              const QString& uri_arg, const QString& prefix, 
              int vmaj, int vmin, QDeclarativeScriptParser::Import::Type importType, 
-             QDeclarativeImportDatabase *database, QString *errorString);
+             QDeclarativeImportDatabase *database, QList<QDeclarativeError> *errors);
     bool find(const QByteArray& type, int *vmajor, int *vminor, 
-              QDeclarativeType** type_return, QUrl* url_return, QString *errorString);
+              QDeclarativeType** type_return, QUrl* url_return, QList<QDeclarativeError> *errors);
 
     QDeclarativeImportedNamespace *findNamespace(const QString& type);
 
@@ -163,7 +163,7 @@ QUrl QDeclarativeImports::baseUrl() const
 
 static QDeclarativeTypeNameCache *
 cacheForNamespace(QDeclarativeEngine *engine, const QDeclarativeImportedNamespace &set, 
-                  QDeclarativeTypeNameCache *cache)
+                  QDeclarativeTypeNameCache *cache, bool importWasQualified)
 {
     if (!cache)
         cache = new QDeclarativeTypeNameCache(engine);
@@ -171,10 +171,27 @@ cacheForNamespace(QDeclarativeEngine *engine, const QDeclarativeImportedNamespac
     QList<QDeclarativeType *> types = QDeclarativeMetaType::qmlTypes();
 
     for (int ii = 0; ii < set.uris.count(); ++ii) {
-        QByteArray base = set.uris.at(ii).toUtf8() + '/';
+        QByteArray uri = set.uris.at(ii).toUtf8();
         int major = set.majversions.at(ii);
         int minor = set.minversions.at(ii);
 
+        if (importWasQualified) {
+            QDeclarativeMetaType::ModuleApi moduleApi = QDeclarativeMetaType::moduleApi(uri, major, minor);
+            if (moduleApi.script || moduleApi.qobject) {
+                QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
+                QDeclarativeMetaType::ModuleApiInstance *a = ep->moduleApiInstances.value(moduleApi);
+                if (!a) {
+                    a = new QDeclarativeMetaType::ModuleApiInstance;
+                    a->scriptCallback = moduleApi.script;
+                    a->qobjectCallback = moduleApi.qobject;
+                    ep->moduleApiInstances.insert(moduleApi, a);
+                }
+                cache->setModuleApi(a);
+            }
+        }
+
+        QByteArray base = uri + '/';
+
         foreach (QDeclarativeType *type, types) {
             if (type->qmlTypeName().startsWith(base) &&
                 type->qmlTypeName().lastIndexOf('/') == (base.length() - 1) &&
@@ -200,15 +217,15 @@ void QDeclarativeImports::populateCache(QDeclarativeTypeNameCache *cache, QDecla
         QDeclarativeTypeNameCache::Data *d = cache->data(iter.key());
         if (d) {
             if (!d->typeNamespace)
-                cacheForNamespace(engine, *(*iter), d->typeNamespace);
+                cacheForNamespace(engine, *(*iter), d->typeNamespace, true);
         } else {
-            QDeclarativeTypeNameCache *nc = cacheForNamespace(engine, *(*iter), 0);
+            QDeclarativeTypeNameCache *nc = cacheForNamespace(engine, *(*iter), 0, true);
             cache->add(iter.key(), nc);
             nc->release();
         }
     }
 
-    cacheForNamespace(engine, set, cache);
+    cacheForNamespace(engine, set, cache, false);
 }
 
 /*!
@@ -227,7 +244,7 @@ void QDeclarativeImports::populateCache(QDeclarativeTypeNameCache *cache, QDecla
 */
 bool QDeclarativeImports::resolveType(const QByteArray& type, 
                                       QDeclarativeType** type_return, QUrl* url_return, int *vmaj, int *vmin,
-                                      QDeclarativeImportedNamespace** ns_return, QString *errorString) const
+                                      QDeclarativeImportedNamespace** ns_return, QList<QDeclarativeError> *errors) const
 {
     QDeclarativeImportedNamespace* ns = d->findNamespace(QString::fromUtf8(type));
     if (ns) {
@@ -236,7 +253,7 @@ bool QDeclarativeImports::resolveType(const QByteArray& type,
         return true;
     }
     if (type_return || url_return) {
-        if (d->find(type,vmaj,vmin,type_return,url_return, errorString)) {
+        if (d->find(type,vmaj,vmin,type_return,url_return, errors)) {
             if (qmlImportTrace()) {
                 if (type_return && *type_return && url_return && !url_return->isEmpty())
                     qDebug().nospace() << "QDeclarativeImports(" << qPrintable(baseUrl().toString()) << ")" << "::resolveType: " 
@@ -351,13 +368,16 @@ QDeclarativeImportsPrivate::~QDeclarativeImportsPrivate()
 
 bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath, const QString &uri, 
                                                  QDeclarativeImportDatabase *database, 
-                                                 QDeclarativeDirComponents* components, QString *errorString) 
+                                                 QDeclarativeDirComponents* components, QList<QDeclarativeError> *errors)
 {
     QFile file(absoluteFilePath);
     QString filecontent;
     if (!QDeclarative_isFileCaseCorrect(absoluteFilePath)) {
-        if (errorString)
-            *errorString = QDeclarativeImportDatabase::tr("cannot load module \"%1\": File name case mismatch for \"%2\"").arg(uri).arg(absoluteFilePath);
+        if (errors) {
+            QDeclarativeError error;
+            error.setDescription(QDeclarativeImportDatabase::tr("cannot load module \"%1\": File name case mismatch for \"%2\"").arg(uri).arg(absoluteFilePath));
+            errors->prepend(error);
+        }
         return false;
     } else if (file.open(QFile::ReadOnly)) {
         filecontent = QString::fromUtf8(file.readAll());
@@ -365,15 +385,29 @@ bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath
             qDebug().nospace() << "QDeclarativeImports(" << qPrintable(base.toString()) << "::importExtension: "
                                << "loaded " << absoluteFilePath;
     } else {
-        if (errorString)
-            *errorString = QDeclarativeImportDatabase::tr("module \"%1\" definition \"%2\" not readable").arg(uri).arg(absoluteFilePath);
+        if (errors) {
+            QDeclarativeError error;
+            error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" definition \"%2\" not readable").arg(uri).arg(absoluteFilePath));
+            errors->prepend(error);
+        }
         return false;
     }
     QDir dir = QFileInfo(file).dir();
+    QUrl url = QUrl::fromLocalFile(absoluteFilePath);
 
     QDeclarativeDirParser qmldirParser;
     qmldirParser.setSource(filecontent);
-    qmldirParser.parse();
+    qmldirParser.setUrl(url);
+
+    // propagate any errors reported by the parser back up to the typeloader.
+    if (qmldirParser.parse()) {
+        if (errors) {
+            for (int i = 0; i < qmldirParser.errors().size(); ++i) {
+                errors->prepend(qmldirParser.errors().at(i));
+            }
+        }
+        return false;
+    }
 
     if (! qmlDirFilesForWhichPluginsHaveBeenLoaded.contains(absoluteFilePath)) {
         qmlDirFilesForWhichPluginsHaveBeenLoaded.insert(absoluteFilePath);
@@ -390,14 +424,26 @@ bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath
             }
 #endif
             if (!resolvedFilePath.isEmpty()) {
-                if (!database->importPlugin(resolvedFilePath, uri, errorString)) {
-                    if (errorString)
-                        *errorString = QDeclarativeImportDatabase::tr("plugin cannot be loaded for module \"%1\": %2").arg(uri).arg(*errorString);
+                if (!database->importPlugin(resolvedFilePath, uri, errors)) {
+                    if (errors) {
+                        // XXX TODO: should we leave the import plugin error alone?
+                        // Here, we pop it off the top and coalesce it into this error's message.
+                        // The reason is that the lower level may add url and line/column numbering information.
+                        QDeclarativeError poppedError = errors->takeFirst();
+                        QDeclarativeError error;
+                        error.setDescription(QDeclarativeImportDatabase::tr("plugin cannot be loaded for module \"%1\": %2").arg(uri).arg(poppedError.description()));
+                        error.setUrl(url);
+                        errors->prepend(error);
+                    }
                     return false;
                 }
             } else {
-                if (errorString)
-                    *errorString = QDeclarativeImportDatabase::tr("module \"%1\" plugin \"%2\" not found").arg(uri).arg(plugin.name);
+                if (errors) {
+                    QDeclarativeError error;
+                    error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" plugin \"%2\" not found").arg(uri).arg(plugin.name));
+                    error.setUrl(url);
+                    errors->prepend(error);
+                }
                 return false;
             }
         }
@@ -443,7 +489,7 @@ QString QDeclarativeImportsPrivate::resolvedUri(const QString &dir_arg, QDeclara
 bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomponentsnetwork, 
                                      const QString& uri_arg, const QString& prefix, int vmaj, int vmin, 
                                      QDeclarativeScriptParser::Import::Type importType, 
-                                     QDeclarativeImportDatabase *database, QString *errorString)
+                                     QDeclarativeImportDatabase *database, QList<QDeclarativeError> *errors)
 {
     QDeclarativeDirComponents qmldircomponents = qmldircomponentsnetwork;
     QString uri = uri_arg;
@@ -477,7 +523,7 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
 
                     url = QUrl::fromLocalFile(fi.absolutePath()).toString();
                     uri = resolvedUri(dir, database);
-                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
                         return false;
                     break;
                 }
@@ -496,7 +542,7 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
 
                     url = QUrl::fromLocalFile(fi.absolutePath()).toString();
                     uri = resolvedUri(dir, database);
-                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
                         return false;
                     break;
                 }
@@ -516,7 +562,7 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
 
                     url = QUrl::fromLocalFile(fi.absolutePath()).toString();
                     uri = resolvedUri(dir, database);
-                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+                    if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
                         return false;
                     break;
                 }
@@ -527,12 +573,14 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
             versionFound = true;
 
         if (!versionFound && qmldircomponents.isEmpty()) {
-            if (errorString) {
+            if (errors) {
                 bool anyversion = QDeclarativeMetaType::isModule(uri.toUtf8(), -1, -1);
+                QDeclarativeError error; // we don't set the url or line or column as these will be set by the loader.
                 if (anyversion)
-                    *errorString = QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin);
+                    error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin));
                 else
-                    *errorString = QDeclarativeImportDatabase::tr("module \"%1\" is not installed").arg(uri_arg);
+                    error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" is not installed").arg(uri_arg));
+                errors->prepend(error);
             }
             return false;
         }
@@ -545,15 +593,19 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
                 QString dir = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(base.resolved(QUrl(uri)));
                 QFileInfo dirinfo(dir);
                 if (dir.isEmpty() || !dirinfo.exists() || !dirinfo.isDir()) {
-                    if (errorString)
-                        *errorString = QDeclarativeImportDatabase::tr("\"%1\": no such directory").arg(uri_arg);
+                    if (errors) {
+                        QDeclarativeError error; // we don't set the line or column as these will be set by the loader.
+                        error.setDescription(QDeclarativeImportDatabase::tr("\"%1\": no such directory").arg(uri_arg));
+                        error.setUrl(importUrl);
+                        errors->prepend(error);
+                    }
                     return false; // local import dirs must exist
                 }
                 uri = resolvedUri(QDeclarativeEnginePrivate::urlToLocalFileOrQrc(base.resolved(QUrl(uri))), database);
                 if (uri.endsWith(QLatin1Char('/')))
                     uri.chop(1);
                 if (QFile::exists(localFileOrQrc)) {
-                    if (!importExtension(localFileOrQrc,uri,database,&qmldircomponents,errorString))
+                    if (!importExtension(localFileOrQrc,uri,database,&qmldircomponents,errors))
                         return false;
                 }
             } else {
@@ -562,11 +614,14 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
                     QString localFileOrQrc = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(base.resolved(QUrl(uri)));
                     QFileInfo dirinfo(localFileOrQrc);
                     if (localFileOrQrc.isEmpty() || !dirinfo.exists() || !dirinfo.isDir()) {
-                        if (errorString) {
+                        if (errors) {
+                            QDeclarativeError error; // we don't set the line or column as these will be set by the loader.
                             if (localFileOrQrc.isEmpty())
-                                *errorString = QDeclarativeImportDatabase::tr("import \"%1\" has no qmldir and no namespace").arg(uri);
+                                error.setDescription(QDeclarativeImportDatabase::tr("import \"%1\" has no qmldir and no namespace").arg(uri));
                             else
-                                *errorString = QDeclarativeImportDatabase::tr("\"%1\": no such directory").arg(uri);
+                                error.setDescription(QDeclarativeImportDatabase::tr("\"%1\": no such directory").arg(uri));
+                            error.setUrl(importUrl);
+                            errors->prepend(error);
                         }
                         return false;
                     }
@@ -598,7 +653,11 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
         if (lowest_maj > vmaj || (lowest_maj == vmaj && lowest_min > vmin)
             || highest_maj < vmaj || (highest_maj == vmaj && highest_min < vmin))
         {
-            *errorString = QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin);
+            if (errors) {
+                QDeclarativeError error; // we don't set the url or line or column information, as these will be set by the loader.
+                error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin));
+                errors->prepend(error);
+            }
             return false;
         }
     }
@@ -613,7 +672,7 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
 }
 
 bool QDeclarativeImportsPrivate::find(const QByteArray& type, int *vmajor, int *vminor, QDeclarativeType** type_return,
-                                      QUrl* url_return, QString *errorString)
+                                      QUrl* url_return, QList<QDeclarativeError> *errors)
 {
     QDeclarativeImportedNamespace *s = 0;
     int slash = type.indexOf('/');
@@ -621,14 +680,20 @@ bool QDeclarativeImportsPrivate::find(const QByteArray& type, int *vmajor, int *
         QString namespaceName = QString::fromUtf8(type.left(slash));
         s = set.value(namespaceName);
         if (!s) {
-            if (errorString)
-                *errorString = QDeclarativeImportDatabase::tr("- %1 is not a namespace").arg(namespaceName);
+            if (errors) {
+                QDeclarativeError error;
+                error.setDescription(QDeclarativeImportDatabase::tr("- %1 is not a namespace").arg(namespaceName));
+                errors->prepend(error);
+            }
             return false;
         }
         int nslash = type.indexOf('/',slash+1);
         if (nslash > 0) {
-            if (errorString)
-                *errorString = QDeclarativeImportDatabase::tr("- nested namespaces not allowed");
+            if (errors) {
+                QDeclarativeError error;
+                error.setDescription(QDeclarativeImportDatabase::tr("- nested namespaces not allowed"));
+                errors->prepend(error);
+            }
             return false;
         }
     } else {
@@ -636,7 +701,7 @@ bool QDeclarativeImportsPrivate::find(const QByteArray& type, int *vmajor, int *
     }
     QByteArray unqualifiedtype = slash < 0 ? type : type.mid(slash+1); // common-case opt (QString::mid works fine, but slower)
     if (s) {
-        if (s->find(unqualifiedtype,vmajor,vminor,type_return,url_return, &base, errorString))
+        if (s->find(unqualifiedtype,vmajor,vminor,type_return,url_return, &base, errors))
             return true;
         if (s->urls.count() == 1 && !s->isLibrary[0] && url_return && s != &unqualifiedset) {
             // qualified, and only 1 url
@@ -654,7 +719,7 @@ QDeclarativeImportedNamespace *QDeclarativeImportsPrivate::findNamespace(const Q
 }
 
 bool QDeclarativeImportedNamespace::find(const QByteArray& type, int *vmajor, int *vminor, QDeclarativeType** type_return,
-          QUrl* url_return, QUrl *base, QString *errorString)
+          QUrl* url_return, QUrl *base, QList<QDeclarativeError> *errors)
 {
     bool typeRecursionDetected = false;
     for (int i=0; i<urls.count(); ++i) {
@@ -663,7 +728,7 @@ bool QDeclarativeImportedNamespace::find(const QByteArray& type, int *vmajor, in
                 // check for type clashes
                 for (int j = i+1; j<urls.count(); ++j) {
                     if (find_helper(j, type, vmajor, vminor, 0, 0, base)) {
-                        if (errorString) {
+                        if (errors) {
                             QString u1 = urls.at(i);
                             QString u2 = urls.at(j);
                             if (base) {
@@ -683,16 +748,16 @@ bool QDeclarativeImportedNamespace::find(const QByteArray& type, int *vmajor, in
                                 }
                             }
 
-                            if (u1 != u2)
-                                *errorString
-                                        = QDeclarativeImportDatabase::tr("is ambiguous. Found in %1 and in %2")
-                                .arg(u1).arg(u2);
-                            else
-                                *errorString
-                                        = QDeclarativeImportDatabase::tr("is ambiguous. Found in %1 in version %2.%3 and %4.%5")
-                                          .arg(u1)
-                                          .arg(majversions.at(i)).arg(minversions.at(i))
-                                          .arg(majversions.at(j)).arg(minversions.at(j));
+                            QDeclarativeError error;
+                            if (u1 != u2) {
+                                error.setDescription(QDeclarativeImportDatabase::tr("is ambiguous. Found in %1 and in %2").arg(u1).arg(u2));
+                            } else {
+                                error.setDescription(QDeclarativeImportDatabase::tr("is ambiguous. Found in %1 in version %2.%3 and %4.%5")
+                                                        .arg(u1)
+                                                        .arg(majversions.at(i)).arg(minversions.at(i))
+                                                        .arg(majversions.at(j)).arg(minversions.at(j)));
+                            }
+                            errors->prepend(error);
                         }
                         return false;
                     }
@@ -701,11 +766,13 @@ bool QDeclarativeImportedNamespace::find(const QByteArray& type, int *vmajor, in
             return true;
         }
     }
-    if (errorString) {
+    if (errors) {
+        QDeclarativeError error;
         if (typeRecursionDetected)
-            *errorString = QDeclarativeImportDatabase::tr("is instantiated recursively");
+            error.setDescription(QDeclarativeImportDatabase::tr("is instantiated recursively"));
         else
-            *errorString = QDeclarativeImportDatabase::tr("is not a type");
+            error.setDescription(QDeclarativeImportDatabase::tr("is not a type"));
+        errors->prepend(error);
     }
     return false;
 }
@@ -790,7 +857,7 @@ bool QDeclarativeImports::addImport(QDeclarativeImportDatabase *importDb,
                                     const QString& uri, const QString& prefix, int vmaj, int vmin, 
                                     QDeclarativeScriptParser::Import::Type importType, 
                                     const QDeclarativeDirComponents &qmldircomponentsnetwork, 
-                                    QString *errorString) 
+                                    QList<QDeclarativeError> *errors)
 {
     if (qmlImportTrace())
         qDebug().nospace() << "QDeclarativeImports(" << qPrintable(baseUrl().toString()) << ")" << "::addImport: " 
@@ -798,7 +865,7 @@ bool QDeclarativeImports::addImport(QDeclarativeImportDatabase *importDb,
                            << (importType==QDeclarativeScriptParser::Import::Library? "Library" : "File") 
                            << " as " << prefix;
 
-    return d->add(qmldircomponentsnetwork, uri, prefix, vmaj, vmin, importType, importDb, errorString);
+    return d->add(qmldircomponentsnetwork, uri, prefix, vmaj, vmin, importType, importDb, errors);
 }
 
 /*!
@@ -1013,7 +1080,7 @@ void QDeclarativeImportDatabase::setImportPathList(const QStringList &paths)
 /*!
     \internal
 */
-bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QString &uri, QString *errorString)
+bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QString &uri, QList<QDeclarativeError> *errors)
 {
     if (qmlImportTrace())
         qDebug().nospace() << "QDeclarativeImportDatabase::importPlugin: " << uri << " from " << filePath;
@@ -1033,15 +1100,21 @@ bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QSt
 
     if (!engineInitialized || !typesRegistered) {
         if (!QDeclarative_isFileCaseCorrect(absoluteFilePath)) {
-            if (errorString) 
-                *errorString = tr("File name case mismatch for \"%2\"").arg(absoluteFilePath);
+            if (errors) {
+                QDeclarativeError error;
+                error.setDescription(tr("File name case mismatch for \"%2\"").arg(absoluteFilePath));
+                errors->prepend(error);
+            }
             return false;
         }
         QPluginLoader loader(absoluteFilePath);
 
         if (!loader.load()) {
-            if (errorString)
-                *errorString = loader.errorString();
+            if (errors) {
+                QDeclarativeError error;
+                error.setDescription(loader.errorString());
+                errors->prepend(error);
+            }
             return false;
         }
 
@@ -1063,8 +1136,11 @@ bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QSt
                 iface->initializeEngine(engine, moduleId);
             }
         } else {
-            if (errorString)
-                *errorString = loader.errorString();
+            if (errors) {
+                QDeclarativeError error;
+                error.setDescription(loader.errorString());
+                errors->prepend(error);
+            }
             return false;
         }
     }
diff --git a/src/declarative/qml/qdeclarativeimport_p.h b/src/declarative/qml/qdeclarativeimport_p.h
index 1c910fd5bf..9d140bf106 100644
--- a/src/declarative/qml/qdeclarativeimport_p.h
+++ b/src/declarative/qml/qdeclarativeimport_p.h
@@ -84,7 +84,7 @@ public:
                      QDeclarativeType** type_return, QUrl* url_return,
                      int *version_major, int *version_minor,
                      QDeclarativeImportedNamespace** ns_return,
-                     QString *errorString = 0) const;
+                     QList<QDeclarativeError> *errors = 0) const;
     bool resolveType(QDeclarativeImportedNamespace*, 
                      const QByteArray& type,
                      QDeclarativeType** type_return, QUrl* url_return,
@@ -94,7 +94,7 @@ public:
                    const QString& uri, const QString& prefix, int vmaj, int vmin, 
                    QDeclarativeScriptParser::Import::Type importType,
                    const QDeclarativeDirComponents &qmldircomponentsnetwork, 
-                   QString *errorString);
+                   QList<QDeclarativeError> *errors);
 
     void populateCache(QDeclarativeTypeNameCache *cache, QDeclarativeEngine *) const;
 
@@ -110,7 +110,7 @@ public:
     QDeclarativeImportDatabase(QDeclarativeEngine *);
     ~QDeclarativeImportDatabase();
 
-    bool importPlugin(const QString &filePath, const QString &uri, QString *errorString);
+    bool importPlugin(const QString &filePath, const QString &uri, QList<QDeclarativeError> *errors);
 
     QStringList importPathList() const;
     void setImportPathList(const QStringList &paths);
diff --git a/src/declarative/qml/qdeclarativeinfo.cpp b/src/declarative/qml/qdeclarativeinfo.cpp
index 7c8f73bc61..8449578c65 100644
--- a/src/declarative/qml/qdeclarativeinfo.cpp
+++ b/src/declarative/qml/qdeclarativeinfo.cpp
@@ -129,6 +129,18 @@ QDeclarativeInfo::~QDeclarativeInfo()
                     int marker = typeName.indexOf(QLatin1String("_QMLTYPE_"));
                     if (marker != -1)
                         typeName = typeName.left(marker);
+
+                    marker = typeName.indexOf(QLatin1String("_QML_"));
+                    if (marker != -1) {
+                        typeName = typeName.left(marker) + "*";
+                        type = QDeclarativeMetaType::qmlType(QMetaType::type(typeName.toLatin1()));
+                        if (type) {
+                            typeName = QLatin1String(type->qmlTypeName());
+                            int lastSlash = typeName.lastIndexOf(QLatin1Char('/'));
+                            if (lastSlash != -1)
+                                typeName = typeName.mid(lastSlash+1);
+                        }
+                    }
                 }
 
                 d->buffer.prepend(QLatin1String("QML ") + typeName + QLatin1String(": "));
diff --git a/src/declarative/qml/qdeclarativeinstruction.cpp b/src/declarative/qml/qdeclarativeinstruction.cpp
index 0c99cefb04..556b7bc343 100644
--- a/src/declarative/qml/qdeclarativeinstruction.cpp
+++ b/src/declarative/qml/qdeclarativeinstruction.cpp
@@ -96,6 +96,9 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
     case QDeclarativeInstruction::StoreString:
         qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_STRING\t\t" << instr->storeString.propertyIndex << "\t" << instr->storeString.value << "\t\t" << primitives.at(instr->storeString.value);
         break;
+    case QDeclarativeInstruction::StoreByteArray:
+        qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_BYTEARRAY" << instr->storeByteArray.propertyIndex << "\t" << instr->storeByteArray.value << "\t\t" << datas.at(instr->storeByteArray.value);
+        break;
     case QDeclarativeInstruction::StoreUrl:
         qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_URL\t\t" << instr->storeUrl.propertyIndex << "\t" << instr->storeUrl.value << "\t\t" << urls.at(instr->storeUrl.value);
         break;
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h
index 20be889252..a5521b6425 100644
--- a/src/declarative/qml/qdeclarativeinstruction_p.h
+++ b/src/declarative/qml/qdeclarativeinstruction_p.h
@@ -88,6 +88,7 @@ public:
         //    StoreInteger - Store a int or uint in a core property
         //    StoreBool - Store a bool in a core property
         //    StoreString - Store a QString in a core property
+        //    StoreByteArray - Store a QByteArray in a core property
         //    StoreUrl - Store a QUrl in a core property
         //    StoreColor - Store a QColor in a core property
         //    StoreDate - Store a QDate in a core property
@@ -101,6 +102,7 @@ public:
         StoreInteger,             /* storeInteger */
         StoreBool,                /* storeBool */
         StoreString,              /* storeString */
+        StoreByteArray,           /* storeByteArray */
         StoreUrl,                 /* storeUrl */
         StoreColor,               /* storeColor */
         StoreDate,                /* storeDate */
@@ -245,6 +247,10 @@ public:
         int propertyIndex;
         int value;
     };
+    struct StoreByteArrayInstruction {
+        int propertyIndex;
+        int value;
+    };
     struct StoreScriptStringInstruction {
         int propertyIndex;
         int value;
@@ -332,6 +338,7 @@ public:
         StoreIntegerInstruction storeInteger;
         StoreBoolInstruction storeBool;
         StoreStringInstruction storeString;
+        StoreByteArrayInstruction storeByteArray;
         StoreScriptStringInstruction storeScriptString;
         StoreScriptInstruction storeScript;
         StoreUrlInstruction storeUrl;
diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp
index bf1f699c72..ede02e9f30 100644
--- a/src/declarative/qml/qdeclarativemetatype.cpp
+++ b/src/declarative/qml/qdeclarativemetatype.cpp
@@ -88,6 +88,7 @@ QT_BEGIN_NAMESPACE
 
 struct QDeclarativeMetaTypeData
 {
+    QDeclarativeMetaTypeData();
     ~QDeclarativeMetaTypeData();
     QList<QDeclarativeType *> types;
     typedef QHash<int, QDeclarativeType *> Ids;
@@ -98,6 +99,14 @@ struct QDeclarativeMetaTypeData
     MetaObjects metaObjectToType;
     typedef QHash<int, QDeclarativeMetaType::StringConverter> StringConverters;
     StringConverters stringConverters;
+    struct ModuleApiList {
+        ModuleApiList() : sorted(true) {}
+        QList<QDeclarativeMetaType::ModuleApi> moduleApis;
+        bool sorted;
+    };
+    typedef QHash<QByteArray, ModuleApiList> ModuleApis;
+    ModuleApis moduleApis;
+    int moduleApiCount;
 
     struct ModuleInfo {
         ModuleInfo(int major, int minor)
@@ -119,6 +128,11 @@ struct QDeclarativeMetaTypeData
 Q_GLOBAL_STATIC(QDeclarativeMetaTypeData, metaTypeData)
 Q_GLOBAL_STATIC(QReadWriteLock, metaTypeDataLock)
 
+QDeclarativeMetaTypeData::QDeclarativeMetaTypeData()
+: moduleApiCount(0)
+{
+}
+
 QDeclarativeMetaTypeData::~QDeclarativeMetaTypeData()
 {
     for (int i = 0; i < types.count(); ++i)
@@ -664,6 +678,34 @@ int registerType(const QDeclarativePrivate::RegisterType &type)
     return index;
 }
 
+int registerModuleApi(const QDeclarativePrivate::RegisterModuleApi &api)
+{
+    QWriteLocker lock(metaTypeDataLock());
+
+    QDeclarativeMetaTypeData *data = metaTypeData();
+    QByteArray uri(api.uri);
+    QDeclarativeMetaType::ModuleApi import;
+    import.major = api.versionMajor;
+    import.minor = api.versionMinor;
+    import.script = api.scriptApi;
+    import.qobject = api.qobjectApi;
+
+    int index = data->moduleApiCount++;
+
+    QDeclarativeMetaTypeData::ModuleApis::Iterator iter = data->moduleApis.find(uri);
+    if (iter == data->moduleApis.end()) {
+        QDeclarativeMetaTypeData::ModuleApiList apis;
+        apis.moduleApis << import;
+        data->moduleApis.insert(uri, apis);
+    } else {
+        iter->moduleApis << import;
+        iter->sorted = false;
+    }
+
+    return index;
+}
+
+
 /*
 This method is "over generalized" to allow us to (potentially) register more types of things in
 the future without adding exported symbols.
@@ -676,13 +718,16 @@ int QDeclarativePrivate::qmlregister(RegistrationType type, void *data)
         return registerInterface(*reinterpret_cast<RegisterInterface *>(data));
     } else if (type == AutoParentRegistration) {
         return registerAutoParentFunction(*reinterpret_cast<RegisterAutoParent *>(data));
+    } else if (type == ModuleApiRegistration) {
+        return registerModuleApi(*reinterpret_cast<RegisterModuleApi *>(data));
     }
     return -1;
 }
 
 /*
-    Have any types been registered for \a module with at least versionMajor.versionMinor, and types
-    for \a module with at most versionMajor.versionMinor.
+    Returns true if any type or API has been registered for the given \a module with at least
+    versionMajor.versionMinor, or if types have been registered for \a module with at most
+    versionMajor.versionMinor.
 
     So if only 4.7 and 4.9 have been registered, 4.7,4.8, and 4.9 are valid, but not 4.6 nor 4.10.
 
@@ -691,13 +736,27 @@ int QDeclarativePrivate::qmlregister(RegistrationType type, void *data)
 bool QDeclarativeMetaType::isModule(const QByteArray &module, int versionMajor, int versionMinor)
 {
     QDeclarativeMetaTypeData *data = metaTypeData();
+
+    // first, check Types
     QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.find(module);
-    return it != data->modules.end()
+    if (it != data->modules.end()
         && ((versionMajor<0 && versionMinor<0) ||
                 (((*it).vmajor_max > versionMajor ||
                     ((*it).vmajor_max == versionMajor && (*it).vminor_max >= versionMinor))
                 && ((*it).vmajor_min < versionMajor ||
-                    ((*it).vmajor_min == versionMajor && (*it).vminor_min <= versionMinor))));
+                    ((*it).vmajor_min == versionMajor && (*it).vminor_min <= versionMinor))))) {
+        return true;
+    }
+
+    // then, check ModuleApis
+    foreach (const QDeclarativeMetaType::ModuleApi &mApi, data->moduleApis.value(module).moduleApis) {
+        if ((versionMajor<0 && versionMinor<0)
+                || (mApi.major == versionMajor && mApi.minor == versionMinor)) {
+            return true;
+        }
+    }
+
+    return false;
 }
 
 QList<QDeclarativePrivate::AutoParentFunction> QDeclarativeMetaType::parentFunctions()
@@ -707,6 +766,35 @@ QList<QDeclarativePrivate::AutoParentFunction> QDeclarativeMetaType::parentFunct
     return data->parentFunctions;
 }
 
+static bool operator<(const QDeclarativeMetaType::ModuleApi &lhs, const QDeclarativeMetaType::ModuleApi &rhs)
+{
+    return lhs.major < rhs.major || (lhs.major == rhs.major && lhs.minor < rhs.minor);
+}
+
+QDeclarativeMetaType::ModuleApi
+QDeclarativeMetaType::moduleApi(const QByteArray &uri, int versionMajor, int versionMinor)
+{
+    QReadLocker lock(metaTypeDataLock());
+    QDeclarativeMetaTypeData *data = metaTypeData();
+
+    QDeclarativeMetaTypeData::ModuleApis::Iterator iter = data->moduleApis.find(uri);
+    if (iter == data->moduleApis.end())
+        return ModuleApi();
+
+    if (iter->sorted == false) {
+        qSort(iter->moduleApis.begin(), iter->moduleApis.end());
+        iter->sorted = true;
+    }
+
+    for (int ii = iter->moduleApis.count() - 1; ii >= 0; --ii) {
+        const ModuleApi &import = iter->moduleApis.at(ii);
+        if (import.major == versionMajor && import.minor <= versionMinor)
+            return import;
+    }
+
+    return ModuleApi();
+}
+
 QObject *QDeclarativeMetaType::toQObject(const QVariant &v, bool *ok)
 {
     if (!isQObject(v.userType())) {
diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h
index aab1c31ef5..291bc38222 100644
--- a/src/declarative/qml/qdeclarativemetatype_p.h
+++ b/src/declarative/qml/qdeclarativemetatype_p.h
@@ -59,6 +59,7 @@
 #include <QtCore/qvariant.h>
 #include <QtCore/qbitarray.h>
 #include <private/qdeclarativeglobal_p.h>
+#include <QtScript/qscriptvalue.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -106,6 +107,25 @@ public:
     static bool isModule(const QByteArray &module, int versionMajor, int versionMinor);
 
     static QList<QDeclarativePrivate::AutoParentFunction> parentFunctions();
+
+    struct ModuleApiInstance {
+        ModuleApiInstance()
+            : scriptCallback(0), qobjectCallback(0), qobjectApi(0) {}
+
+        QScriptValue (*scriptCallback)(QDeclarativeEngine *, QScriptEngine *);
+        QObject *(*qobjectCallback)(QDeclarativeEngine *, QScriptEngine *);
+        QScriptValue scriptApi;
+        QObject *qobjectApi;
+    };
+    struct ModuleApi {
+        inline ModuleApi();
+        inline bool operator==(const ModuleApi &) const;
+        int major;
+        int minor;
+        QScriptValue (*script)(QDeclarativeEngine *, QScriptEngine *);
+        QObject *(*qobject)(QDeclarativeEngine *, QScriptEngine *);
+    };
+    static ModuleApi moduleApi(const QByteArray &, int, int);
 };
 
 class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeType
@@ -168,6 +188,25 @@ private:
     QDeclarativeTypePrivate *d;
 };
 
+QDeclarativeMetaType::ModuleApi::ModuleApi()
+//    : major(0), minor(0), script(0), qobject(0)
+{
+    major = 0;
+    minor = 0;
+    script = 0;
+    qobject = 0;
+}
+
+bool QDeclarativeMetaType::ModuleApi::operator==(const ModuleApi &other) const
+{
+    return major == other.major && minor == other.minor && script == other.script && qobject == other.qobject;
+}
+
+inline uint qHash(const QDeclarativeMetaType::ModuleApi &import)
+{
+    return import.major ^ import.minor ^ quintptr(import.script) ^ quintptr(import.qobject);
+}
+
 QT_END_NAMESPACE
 
 #endif // QDECLARATIVEMETATYPE_P_H
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index 9eecc65e3c..edc1755a72 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -403,6 +403,33 @@ void QDeclarativeObjectScriptClass::setProperty(QObject *obj,
     } else if (value.isFunction() && !value.isRegExp()) {
         // this is handled by the binding creation above
     } else {
+        //### expand optimization for other known types
+        if (lastData->propType == QMetaType::Int && value.isNumber()) {
+            int rawValue = qRound(value.toNumber());
+            int status = -1;
+            int flags = 0;
+            void *a[] = { (void *)&rawValue, 0, &status, &flags };
+            QMetaObject::metacall(obj, QMetaObject::WriteProperty,
+                                  lastData->coreIndex, a);
+            return;
+        } else if (lastData->propType == QMetaType::QReal && value.isNumber()) {
+            qreal rawValue = qreal(value.toNumber());
+            int status = -1;
+            int flags = 0;
+            void *a[] = { (void *)&rawValue, 0, &status, &flags };
+            QMetaObject::metacall(obj, QMetaObject::WriteProperty,
+                                  lastData->coreIndex, a);
+            return;
+        } else if (lastData->propType == QMetaType::QString && value.isString()) {
+            const QString &rawValue = value.toString();
+            int status = -1;
+            int flags = 0;
+            void *a[] = { (void *)&rawValue, 0, &status, &flags };
+            QMetaObject::metacall(obj, QMetaObject::WriteProperty,
+                                  lastData->coreIndex, a);
+            return;
+        }
+
         QVariant v;
         if (lastData->flags & QDeclarativePropertyCache::Data::IsQList)
             v = enginePriv->scriptValueToVariant(value, qMetaTypeId<QList<QObject *> >());
diff --git a/src/declarative/qml/qdeclarativeprivate.h b/src/declarative/qml/qdeclarativeprivate.h
index 7ac3369fc7..fea9eae109 100644
--- a/src/declarative/qml/qdeclarativeprivate.h
+++ b/src/declarative/qml/qdeclarativeprivate.h
@@ -74,6 +74,9 @@ public:
 };
 
 
+class QScriptValue;
+class QScriptEngine;
+class QDeclarativeEngine;
 class QDeclarativeCustomParser;
 namespace QDeclarativePrivate
 {
@@ -233,10 +236,22 @@ namespace QDeclarativePrivate
         AutoParentFunction function;
     };
 
+    struct RegisterModuleApi {
+        int version;
+
+        const char *uri;
+        int versionMajor;
+        int versionMinor;
+
+        QScriptValue (*scriptApi)(QDeclarativeEngine *, QScriptEngine *);
+        QObject *(*qobjectApi)(QDeclarativeEngine *, QScriptEngine *);
+    };
+
     enum RegistrationType {
         TypeRegistration       = 0, 
         InterfaceRegistration  = 1,
-        AutoParentRegistration = 2
+        AutoParentRegistration = 2,
+        ModuleApiRegistration  = 3,
     };
 
     int Q_DECLARATIVE_EXPORT qmlregister(RegistrationType, void *);
diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp
index 6a39a65532..9cbb4fa8cc 100644
--- a/src/declarative/qml/qdeclarativepropertycache.cpp
+++ b/src/declarative/qml/qdeclarativepropertycache.cpp
@@ -61,6 +61,8 @@ QDeclarativePropertyCache::Data::Flags QDeclarativePropertyCache::Data::flagsFor
         flags |= Data::IsWritable;
     if (p.isResettable())
         flags |= Data::IsResettable;
+    if (p.isFinal())
+        flags |= Data::IsFinal;
 
     if (propType == qMetaTypeId<QDeclarativeBinding *>()) {
         flags |= Data::IsQmlBinding;
diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h
index eeeff1aea1..65a8725b8f 100644
--- a/src/declarative/qml/qdeclarativepropertycache_p.h
+++ b/src/declarative/qml/qdeclarativepropertycache_p.h
@@ -84,20 +84,21 @@ public:
                     IsWritable        = 0x00000002,
                     IsResettable      = 0x00000004,
                     IsAlias           = 0x00000008,
+                    IsFinal           = 0x00000010,
 
                     // These are mutualy exclusive
-                    IsFunction        = 0x00000010,
-                    IsQObjectDerived  = 0x00000020,
-                    IsEnumType        = 0x00000040,
-                    IsQList           = 0x00000080,
-                    IsQmlBinding      = 0x00000100,
-                    IsQScriptValue    = 0x00000200,
+                    IsFunction        = 0x00000020,
+                    IsQObjectDerived  = 0x00000040,
+                    IsEnumType        = 0x00000080,
+                    IsQList           = 0x00000100,
+                    IsQmlBinding      = 0x00000200,
+                    IsQScriptValue    = 0x00000400,
 
                     // Apply only to IsFunctions
-                    IsVMEFunction     = 0x00000400,
-                    HasArguments      = 0x00000800,
-                    IsSignal          = 0x00001000,
-                    IsVMESignal       = 0x00002000
+                    IsVMEFunction     = 0x00000800,
+                    HasArguments      = 0x00001000,
+                    IsSignal          = 0x00002000,
+                    IsVMESignal       = 0x00004000
         };
         Q_DECLARE_FLAGS(Flags, Flag)
 
diff --git a/src/declarative/qml/qdeclarativescarceresourcescriptclass.cpp b/src/declarative/qml/qdeclarativescarceresourcescriptclass.cpp
new file mode 100644
index 0000000000..121d0a1a35
--- /dev/null
+++ b/src/declarative/qml/qdeclarativescarceresourcescriptclass.cpp
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "private/qdeclarativescarceresourcescriptclass_p.h"
+
+#include "private/qdeclarativeengine_p.h"
+#include "private/qdeclarativecontext_p.h"
+#include "private/qdeclarativedata_p.h"
+#include "private/qdeclarativetypenamescriptclass_p.h"
+#include "private/qdeclarativelistscriptclass_p.h"
+#include "private/qdeclarativebinding_p.h"
+#include "private/qdeclarativeguard_p.h"
+#include "private/qdeclarativevmemetaobject_p.h"
+
+#include <QtCore/qtimer.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtScript/qscriptcontextinfo.h>
+
+Q_DECLARE_METATYPE(QScriptValue);
+
+QT_BEGIN_NAMESPACE
+
+QDeclarativeScarceResourceScriptClass::QDeclarativeScarceResourceScriptClass(QDeclarativeEngine *bindEngine)
+    : QScriptDeclarativeClass(QDeclarativeEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine)
+{
+    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
+
+    // Properties of this type can be explicitly preserved by clients,
+    // which prevents the scarce resource from being automatically
+    // released after the binding has been evaluated.
+    m_preserve = scriptEngine->newFunction(preserve);
+    m_preserveId = createPersistentIdentifier(QLatin1String("preserve"));
+
+    // Similarly, they can be explicitly destroyed by clients,
+    // which releases the scarce resource.
+    m_destroy = scriptEngine->newFunction(destroy);
+    m_destroyId = createPersistentIdentifier(QLatin1String("destroy"));
+}
+
+QDeclarativeScarceResourceScriptClass::~QDeclarativeScarceResourceScriptClass()
+{
+}
+
+/*
+  Returns a JavaScript object whose instance data is a new scarce resource data.
+  The scarce resource is added to the doubly-linked-list of scarce resources in the engine
+  so that the scarce resource can be released after evaluation completes.
+ */
+QScriptValue QDeclarativeScarceResourceScriptClass::newScarceResource(const QVariant &v)
+{
+    // create the scarce resource
+    ScarceResourceData *srd = new ScarceResourceData(v);
+
+    // insert into the linked list
+    QDeclarativeEnginePrivate *enginePrivate = QDeclarativeEnginePrivate::get(engine);
+    srd->insertInto(&enginePrivate->scarceResources);
+    Q_ASSERT(enginePrivate->scarceResourcesRefCount > 0);
+
+    // return the javascript object with the scarce resource instance data
+    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
+    return QScriptDeclarativeClass::newObject(scriptEngine, this, srd); // JSC takes ownership of srd.
+}
+
+QVariant QDeclarativeScarceResourceScriptClass::toVariant(Object *object, bool *ok)
+{
+    ScarceResourceData *obj = static_cast<ScarceResourceData*>(object);
+    if (ok) *ok = true;
+    return obj->resource;
+}
+
+QVariant QDeclarativeScarceResourceScriptClass::toVariant(const QScriptValue &value)
+{
+    Q_ASSERT(scriptClass(value) == this);
+
+    return toVariant(object(value), 0);
+}
+
+// The destroy() and preserve() function properties are readable.
+QScriptClass::QueryFlags
+QDeclarativeScarceResourceScriptClass::queryProperty(Object *object, const Identifier &name,
+                                                     QScriptClass::QueryFlags flags)
+{
+    Q_UNUSED(object)
+    Q_UNUSED(flags)
+
+    if (name == m_destroyId.identifier || name == m_preserveId.identifier)
+        return (QScriptClass::HandlesReadAccess);
+    return 0;
+}
+
+// Return the (function) values which may be evaluated by clients.
+QDeclarativeScarceResourceScriptClass::Value
+QDeclarativeScarceResourceScriptClass::property(Object *object, const Identifier &name)
+{
+    Q_UNUSED(object)
+
+    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
+
+    // functions
+    if (name == m_preserveId.identifier)
+        return Value(scriptEngine, m_preserve);
+    else if (name == m_destroyId.identifier)
+        return Value(scriptEngine, m_destroy);
+
+    return Value();
+}
+
+/*
+   The user explicitly wants to preserve the resource.
+   We remove the scarce resource from the engine's linked list
+   of resources to release after evaluation completes.
+ */
+QScriptValue QDeclarativeScarceResourceScriptClass::preserve(QScriptContext *context, QScriptEngine *engine)
+{
+    QDeclarativeEnginePrivate *p = QDeclarativeEnginePrivate::get(engine);
+    QScriptValue that = context->thisObject();
+
+    if (scriptClass(that) != p->scarceResourceClass)
+        return engine->undefinedValue();
+
+    // The client wishes to preserve the resource in this SRD.
+    ScarceResourceData *data = static_cast<ScarceResourceData *>(p->scarceResourceClass->object(that));
+    if (!data)
+        return engine->undefinedValue();
+
+    // remove node from list, without releasing the resource.
+    data->removeNode();
+
+    return engine->undefinedValue();
+}
+
+/*
+   The user explicitly wants to release the resource.
+   We set the internal scarce resource variant to the invalid variant.
+ */
+QScriptValue QDeclarativeScarceResourceScriptClass::destroy(QScriptContext *context, QScriptEngine *engine)
+{
+    QDeclarativeEnginePrivate *p = QDeclarativeEnginePrivate::get(engine);
+    QScriptValue that = context->thisObject();
+
+    if (scriptClass(that) != p->scarceResourceClass)
+        return engine->undefinedValue();
+
+    // the client wishes to release the resource in this SRD.
+    ScarceResourceData *data = static_cast<ScarceResourceData *>(p->scarceResourceClass->object(that));
+    if (!data)
+        return engine->undefinedValue();
+
+    // release the resource and remove the node from the list.
+    data->releaseResource();
+
+    return engine->undefinedValue();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativescarceresourcescriptclass_p.h b/src/declarative/qml/qdeclarativescarceresourcescriptclass_p.h
new file mode 100644
index 0000000000..2a1390a230
--- /dev/null
+++ b/src/declarative/qml/qdeclarativescarceresourcescriptclass_p.h
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVESCARCERESOURCESCRIPTCLASS_P_H
+#define QDECLARATIVESCARCERESOURCESCRIPTCLASS_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "private/qdeclarativepropertycache_p.h"
+#include "private/qdeclarativetypenamecache_p.h"
+
+#include <private/qscriptdeclarativeclass_p.h>
+#include <QtScript/qscriptengine.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeEngine;
+
+/*
+   Scarce resources (like pixmaps and textures) are managed manually
+   in that the variant will be set to the invalid variant once the
+   JavaScript engine has finished using the JavaScript object whose
+   instance data is the ScarceResourceData (but before the garbage
+   collector frees the JavaScript object itself).
+
+   The engine stores a doubly-linked-list of scarce resources which
+   will to be cleaned up after a binding is successfully evaluated
+   (unless the user explicitly preserves the scarce resource).
+
+   A ScarceResourceData pointer should not be deleted manually, as
+   all instances of a ScarceResourceData should be owned by the
+   JavaScript engine.
+ */
+struct ScarceResourceData : public QScriptDeclarativeClass::Object {
+    ScarceResourceData(const QVariant &v) : resource(v), prev(0), next(0)
+    {
+    }
+
+    virtual ~ScarceResourceData()
+    {
+        releaseResource();
+    }
+
+    // Insert this resource into the given list of resources.
+    void insertInto(ScarceResourceData **list)
+    {
+        // This node becomes the head of the list.
+        next = *list; // so our next = old list head
+        *list = this; // list now points to us (we're the head)
+        prev = list;  // as we're the head, our prev ptr becomes the list ptr.
+
+        // and the next node's prev pointer must contain a ptr to our next ptr,
+        // since per definition, prev always contains a pointer to the previous node's "next" ptr,
+        // and the "this" node is the "this->next" node's "prev" node.
+        if (next) next->prev = &next;
+    }
+
+    // Remove this resource from the list of resources, without releasing the resource.
+    void removeNode()
+    {
+        // whatever previously pointed to this node (ie, as that node's "next" node)
+        // should now point to our next node (since we no longer exist in the list).
+        // and the next node's prev ptr should point to our prev node.
+        if (prev) *prev = next;
+        if (next) next->prev = prev;
+        prev = 0;
+        next = 0;
+    }
+
+    // Release this resource, and remove from the list.
+    void releaseResource()
+    {
+        resource = QVariant();
+        removeNode();
+    }
+
+    QVariant resource;
+
+    // prev always contains a pointer to the previous node's "next" ptr.
+    // :. for the head node, [*prev] will be engine->scarceResources
+    // :. for every other node, [*prev] will be the previous node's "next" ptr.
+    ScarceResourceData **prev;
+    ScarceResourceData  *next;
+};
+
+class Q_AUTOTEST_EXPORT QDeclarativeScarceResourceScriptClass : public QScriptDeclarativeClass
+{
+public:
+    QDeclarativeScarceResourceScriptClass(QDeclarativeEngine *);
+    ~QDeclarativeScarceResourceScriptClass();
+
+    // Creates a new JavaScript object whose instance data is the scarce resource v
+    QScriptValue newScarceResource(const QVariant &v);
+
+    // inherited from QScriptDeclarativeClass
+    virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &,
+                                                   QScriptClass::QueryFlags flags);
+    virtual Value property(Object *, const Identifier &);
+    virtual QVariant toVariant(Object *, bool *ok = 0);
+    QVariant toVariant(const QScriptValue &value);
+
+private:
+    PersistentIdentifier m_preserveId;
+    PersistentIdentifier m_destroyId;
+    QScriptValue m_preserve;
+    QScriptValue m_destroy;
+
+    static QScriptValue preserve(QScriptContext *context, QScriptEngine *engine);
+    static QScriptValue destroy(QScriptContext *context, QScriptEngine *engine);
+
+    QDeclarativeEngine *engine;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDECLARATIVESCARCERESOURCESCRIPTCLASS_P_H
diff --git a/src/declarative/qml/qdeclarativescriptparser.cpp b/src/declarative/qml/qdeclarativescriptparser.cpp
index e04cfc52af..352e341437 100644
--- a/src/declarative/qml/qdeclarativescriptparser.cpp
+++ b/src/declarative/qml/qdeclarativescriptparser.cpp
@@ -59,6 +59,22 @@ QT_BEGIN_NAMESPACE
 using namespace QDeclarativeJS;
 using namespace QDeclarativeParser;
 
+void QDeclarativeScriptParser::Import::extractVersion(int *maj, int *min) const
+{
+    *maj = -1; *min = -1;
+
+    if (!version.isEmpty()) {
+        int dot = version.indexOf(QLatin1Char('.'));
+        if (dot < 0) {
+            *maj = version.toInt();
+            *min = 0;
+        } else {
+            *maj = version.left(dot).toInt();
+            *min = version.mid(dot+1).toInt();
+        }
+    }
+}
+
 namespace {
 
 class ProcessAST: protected AST::Visitor
@@ -896,6 +912,19 @@ static void replaceWithSpace(QString &str, int idx, int n)
         *data++ = space;
 }
 
+static QDeclarativeParser::LocationSpan
+locationFromLexer(const QDeclarativeJS::Lexer &lex, int startLine, int startColumn, int startOffset)
+{
+    QDeclarativeParser::LocationSpan l;
+
+    l.start.line = startLine; l.start.column = startColumn;
+    l.end.line = lex.endLineNo(); l.end.column = lex.endColumnNo();
+    l.range.offset = startOffset;
+    l.range.length = lex.tokenOffset() + lex.tokenLength() - startOffset;
+
+    return l;
+}
+
 /*
 Searches for ".pragma <value>" declarations within \a script.  Currently supported pragmas
 are:
@@ -1024,7 +1053,8 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
             return rv;
 
         int startOffset = l.tokenOffset();
-        int startLine = l.currentLineNo();
+        int startLine = l.startLineNo();
+        int startColumn = l.startColumnNo();
 
         token = l.lex();
 
@@ -1062,8 +1092,11 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
                 if (!importId.at(0).isUpper())
                     return rv;
 
+                QDeclarativeParser::LocationSpan location =
+                    locationFromLexer(l, startLine, startColumn, startOffset);
+
                 token = l.lex();
-                if (l.currentLineNo() == startLine)
+                if (l.startLineNo() == startLine)
                     return rv;
 
                 replaceWithSpace(script, startOffset, endOffset - startOffset);
@@ -1072,9 +1105,9 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
                 import.type = Import::Script;
                 import.uri = file;
                 import.qualifier = importId;
+                import.location = location;
 
                 rv.imports << import;
-
             } else {
                 // URI
                 QString uri;
@@ -1117,8 +1150,11 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
                 if (!importId.at(0).isUpper())
                     return rv;
 
+                QDeclarativeParser::LocationSpan location =
+                    locationFromLexer(l, startLine, startColumn, startOffset);
+
                 token = l.lex();
-                if (l.currentLineNo() == startLine)
+                if (l.startLineNo() == startLine)
                     return rv;
 
                 replaceWithSpace(script, startOffset, endOffset - startOffset);
@@ -1128,6 +1164,7 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
                 import.uri = uri;
                 import.version = version;
                 import.qualifier = importId;
+                import.location = location;
 
                 rv.imports << import;
             }
@@ -1143,7 +1180,7 @@ QDeclarativeScriptParser::JavaScriptMetaData QDeclarativeScriptParser::extractMe
             QString pragmaValue = script.mid(l.tokenOffset(), l.tokenLength());
             int endOffset = l.tokenLength() + l.tokenOffset();
 
-            if (pragmaValue == QLatin1String("library")) {
+            if (pragmaValue == library) {
                 pragmas |= QDeclarativeParser::Object::ScriptBlock::Shared;
                 replaceWithSpace(script, startOffset, endOffset - startOffset);
             } else {
diff --git a/src/declarative/qml/qdeclarativescriptparser_p.h b/src/declarative/qml/qdeclarativescriptparser_p.h
index e5e0d7075d..fd89f757cc 100644
--- a/src/declarative/qml/qdeclarativescriptparser_p.h
+++ b/src/declarative/qml/qdeclarativescriptparser_p.h
@@ -82,6 +82,8 @@ public:
         QString qualifier;
         QString version;
 
+        void extractVersion(int *maj, int *min) const;
+
         QDeclarativeParser::LocationSpan location;
     };
 
diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp
index 26f3996871..1c1eeee2cf 100644
--- a/src/declarative/qml/qdeclarativetypeloader.cpp
+++ b/src/declarative/qml/qdeclarativetypeloader.cpp
@@ -607,7 +607,7 @@ void QDeclarativeDataLoader::setData(QDeclarativeDataBlob *blob, const QByteArra
     if (!blob->isError() && !blob->isWaiting())
         blob->allDependenciesDone();
 
-    if (blob->status() != QDeclarativeDataBlob::Error) 
+    if (blob->status() != QDeclarativeDataBlob::Error)
         blob->m_status = QDeclarativeDataBlob::WaitingForDependencies;
 
     blob->m_inCallback = false;
@@ -674,24 +674,23 @@ QDeclarativeTypeData *QDeclarativeTypeLoader::get(const QByteArray &data, const
 }
 
 /*!
-Return a QDeclarativeScriptData for \a url.  The QDeclarativeScriptData may be cached.
+Return a QDeclarativeScriptBlob for \a url.  The QDeclarativeScriptData may be cached.
 */
-QDeclarativeScriptData *QDeclarativeTypeLoader::getScript(const QUrl &url)
+QDeclarativeScriptBlob *QDeclarativeTypeLoader::getScript(const QUrl &url)
 {
     Q_ASSERT(!url.isRelative() && 
             (QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url).isEmpty() || 
              !QDir::isRelativePath(QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url))));
 
-    QDeclarativeScriptData *scriptData = m_scriptCache.value(url);
+    QDeclarativeScriptBlob *scriptBlob = m_scriptCache.value(url);
 
-    if (!scriptData) {
-        scriptData = new QDeclarativeScriptData(url);
-        m_scriptCache.insert(url, scriptData);
-        QDeclarativeDataLoader::load(scriptData);
+    if (!scriptBlob) {
+        scriptBlob = new QDeclarativeScriptBlob(url, this);
+        m_scriptCache.insert(url, scriptBlob);
+        QDeclarativeDataLoader::load(scriptBlob);
     }
 
-    scriptData->addref();
-    return scriptData;
+    return scriptBlob;
 }
 
 /*!
@@ -868,13 +867,14 @@ void QDeclarativeTypeData::dataReceived(const QByteArray &data)
             }
         } else if (import.type == QDeclarativeScriptParser::Import::Script) {
             QUrl scriptUrl = finalUrl().resolved(QUrl(import.uri));
-            QDeclarativeScriptData *data = typeLoader()->getScript(scriptUrl);
-            addDependency(data);
+            QDeclarativeScriptBlob *blob = typeLoader()->getScript(scriptUrl);
+            addDependency(blob);
 
             ScriptReference ref;
             ref.location = import.location.start;
             ref.qualifier = import.qualifier;
-            ref.script = data;
+            ref.script = blob;
+            blob->addref();
             m_scripts << ref;
 
         }
@@ -933,14 +933,31 @@ void QDeclarativeTypeData::resolveTypes()
     // For local urls, add an implicit import "." as first (most overridden) lookup. 
     // This will also trigger the loading of the qmldir and the import of any native 
     // types from available plugins.
+    QList<QDeclarativeError> errors;
     if (QDeclarativeQmldirData *qmldir = qmldirForUrl(finalUrl().resolved(QUrl(QLatin1String("./qmldir"))))) {
         m_imports.addImport(importDatabase, QLatin1String("."),
                             QString(), -1, -1, QDeclarativeScriptParser::Import::File, 
-                            qmldir->dirComponents(), 0);
+                            qmldir->dirComponents(), &errors);
     } else {
         m_imports.addImport(importDatabase, QLatin1String("."), 
                             QString(), -1, -1, QDeclarativeScriptParser::Import::File, 
-                            QDeclarativeDirComponents(), 0);
+                            QDeclarativeDirComponents(), &errors);
+    }
+
+    // remove any errors which are due to the implicit import which aren't real errors.
+    // for example, if the implicitly included qmldir file doesn't exist, that is not an error.
+    QList<QDeclarativeError> realErrors;
+    for (int i = 0; i < errors.size(); ++i) {
+        if (errors.at(i).description() != QDeclarativeImportDatabase::tr("import \".\" has no qmldir and no namespace")
+                && errors.at(i).description() != QDeclarativeImportDatabase::tr("\".\": no such directory")) {
+            realErrors.prepend(errors.at(i)); // this is a real error.
+        }
+    }
+
+    // report any real errors which occurred during plugin loading or qmldir parsing.
+    if (!realErrors.isEmpty()) {
+        setError(realErrors);
+        return;
     }
 
     foreach (const QDeclarativeScriptParser::Import &import, scriptParser.imports()) {
@@ -950,34 +967,31 @@ void QDeclarativeTypeData::resolveTypes()
 
         if (import.type == QDeclarativeScriptParser::Import::File && import.qualifier.isEmpty()) {
             QUrl qmldirUrl = finalUrl().resolved(QUrl(import.uri + QLatin1String("/qmldir")));
-            if (QDeclarativeQmldirData *qmldir = qmldirForUrl(qmldirUrl)) 
+            if (QDeclarativeQmldirData *qmldir = qmldirForUrl(qmldirUrl))
                 qmldircomponentsnetwork = qmldir->dirComponents();
         }
 
         int vmaj = -1;
         int vmin = -1;
+        import.extractVersion(&vmaj, &vmin);
 
-        if (!import.version.isEmpty()) {
-            int dot = import.version.indexOf(QLatin1Char('.'));
-            if (dot < 0) {
-                vmaj = import.version.toInt();
-                vmin = 0;
-            } else {
-                vmaj = import.version.left(dot).toInt();
-                vmin = import.version.mid(dot+1).toInt();
-            }
-        }
-
-        QString errorString;
+        QList<QDeclarativeError> errors;
         if (!m_imports.addImport(importDatabase, import.uri, import.qualifier,
-                                 vmaj, vmin, import.type, qmldircomponentsnetwork, &errorString)) {
+                                 vmaj, vmin, import.type, qmldircomponentsnetwork, &errors)) {
             QDeclarativeError error;
+            if (errors.size()) {
+                error = errors.takeFirst();
+            } else {
+                // this should not be possible!
+                // Description should come from error provided by addImport() function.
+                error.setDescription(QDeclarativeTypeLoader::tr("Unreported error adding script import to import database"));
+            }
             error.setUrl(m_imports.baseUrl());
-            error.setDescription(errorString);
             error.setLine(import.location.start.line);
             error.setColumn(import.location.start.column);
+            errors.prepend(error); // put it back on the list after filling out information.
 
-            setError(error);
+            setError(errors);
             return;
         }
     }
@@ -991,29 +1005,38 @@ void QDeclarativeTypeData::resolveTypes()
         int majorVersion;
         int minorVersion;
         QDeclarativeImportedNamespace *typeNamespace = 0;
-        QString errorString;
+        QList<QDeclarativeError> errors;
 
         if (!m_imports.resolveType(typeName, &ref.type, &url, &majorVersion, &minorVersion,
-                                   &typeNamespace, &errorString) || typeNamespace) {
+                                   &typeNamespace, &errors) || typeNamespace) {
             // Known to not be a type:
             //  - known to be a namespace (Namespace {})
             //  - type with unknown namespace (UnknownNamespace.SomeType {})
             QDeclarativeError error;
-            error.setUrl(m_imports.baseUrl());
             QString userTypeName = parserRef->name;
             userTypeName.replace(QLatin1Char('/'),QLatin1Char('.'));
-            if (typeNamespace)
+            if (typeNamespace) {
                 error.setDescription(QDeclarativeTypeLoader::tr("Namespace %1 cannot be used as a type").arg(userTypeName));
-            else
-                error.setDescription(QDeclarativeTypeLoader::tr("%1 %2").arg(userTypeName).arg(errorString));
+            } else {
+                if (errors.size()) {
+                    error = errors.takeFirst();
+                } else {
+                    // this should not be possible!
+                    // Description should come from error provided by addImport() function.
+                    error.setDescription(QDeclarativeTypeLoader::tr("Unreported error adding script import to import database"));
+                }
+                error.setUrl(m_imports.baseUrl());
+                error.setDescription(QDeclarativeTypeLoader::tr("%1 %2").arg(userTypeName).arg(error.description()));
+            }
 
             if (!parserRef->refObjects.isEmpty()) {
                 QDeclarativeParser::Object *obj = parserRef->refObjects.first();
                 error.setLine(obj->location.start.line);
                 error.setColumn(obj->location.start.column);
             }
-            
-            setError(error);
+
+            errors.prepend(error);
+            setError(errors);
             return;
         }
 
@@ -1046,25 +1069,156 @@ QDeclarativeQmldirData *QDeclarativeTypeData::qmldirForUrl(const QUrl &url)
     return 0;
 }
 
-QDeclarativeScriptData::QDeclarativeScriptData(const QUrl &url)
-: QDeclarativeDataBlob(url, JavaScriptFile), m_pragmas(QDeclarativeParser::Object::ScriptBlock::None)
+QDeclarativeScriptData::QDeclarativeScriptData(QDeclarativeEngine *engine)
+: QDeclarativeCleanup(engine), importCache(0), pragmas(QDeclarativeParser::Object::ScriptBlock::None),
+  m_loaded(false)
+{
+}
+
+QDeclarativeScriptData::~QDeclarativeScriptData()
 {
+    clear();
 }
 
-QDeclarativeParser::Object::ScriptBlock::Pragmas QDeclarativeScriptData::pragmas() const
+void QDeclarativeScriptData::clear()
+{
+    if (importCache) {
+        importCache->release();
+        importCache = 0;
+    }
+
+    for (int ii = 0; ii < scripts.count(); ++ii)
+        scripts.at(ii)->release();
+    scripts.clear();
+}
+
+QDeclarativeScriptBlob::QDeclarativeScriptBlob(const QUrl &url, QDeclarativeTypeLoader *loader)
+: QDeclarativeDataBlob(url, JavaScriptFile), m_pragmas(QDeclarativeParser::Object::ScriptBlock::None),
+  m_scriptData(0), m_typeLoader(loader)
+{
+}
+
+QDeclarativeScriptBlob::~QDeclarativeScriptBlob()
+{
+    if (m_scriptData) {
+        m_scriptData->release();
+        m_scriptData = 0;
+    }
+}
+
+QDeclarativeParser::Object::ScriptBlock::Pragmas QDeclarativeScriptBlob::pragmas() const
 {
     return m_pragmas;
 }
 
-QString QDeclarativeScriptData::scriptSource() const
+QString QDeclarativeScriptBlob::scriptSource() const
 {
     return m_source;
 }
 
-void QDeclarativeScriptData::dataReceived(const QByteArray &data)
+QDeclarativeTypeLoader *QDeclarativeScriptBlob::typeLoader() const
+{
+    return m_typeLoader;
+}
+
+const QDeclarativeImports &QDeclarativeScriptBlob::imports() const
+{
+    return m_imports;
+}
+
+QDeclarativeScriptData *QDeclarativeScriptBlob::scriptData() const
+{
+    return m_scriptData;
+}
+
+void QDeclarativeScriptBlob::dataReceived(const QByteArray &data)
 {
+    QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(m_typeLoader->engine());
+    QDeclarativeImportDatabase *importDatabase = &ep->importDatabase;
+
     m_source = QString::fromUtf8(data);
-    m_pragmas = QDeclarativeScriptParser::extractPragmas(m_source);
+
+    QDeclarativeScriptParser::JavaScriptMetaData metadata =
+        QDeclarativeScriptParser::extractMetaData(m_source);
+
+    m_imports.setBaseUrl(finalUrl());
+
+    m_pragmas = metadata.pragmas;
+
+    foreach (const QDeclarativeScriptParser::Import &import, metadata.imports) {
+        Q_ASSERT(import.type != QDeclarativeScriptParser::Import::File);
+
+        if (import.type == QDeclarativeScriptParser::Import::Script) {
+            QUrl scriptUrl = finalUrl().resolved(QUrl(import.uri));
+            QDeclarativeScriptBlob *blob = typeLoader()->getScript(scriptUrl);
+            addDependency(blob);
+
+            ScriptReference ref;
+            ref.location = import.location.start;
+            ref.qualifier = import.qualifier;
+            ref.script = blob;
+            blob->addref();
+            m_scripts << ref;
+        } else {
+            Q_ASSERT(import.type == QDeclarativeScriptParser::Import::Library);
+            int vmaj = -1;
+            int vmin = -1;
+            import.extractVersion(&vmaj, &vmin);
+
+            QList<QDeclarativeError> errors;
+            if (!m_imports.addImport(importDatabase, import.uri, import.qualifier, vmaj, vmin,
+                                     import.type, QDeclarativeDirComponents(), &errors)) {
+                QDeclarativeError error = errors.takeFirst();
+                // description should be set by addImport().
+                error.setUrl(m_imports.baseUrl());
+                error.setLine(import.location.start.line);
+                error.setColumn(import.location.start.column);
+                errors.prepend(error);
+
+                setError(errors);
+                return;
+            }
+        }
+    }
+}
+
+void QDeclarativeScriptBlob::done()
+{
+    // Check all script dependencies for errors
+    for (int ii = 0; !isError() && ii < m_scripts.count(); ++ii) {
+        const ScriptReference &script = m_scripts.at(ii);
+        Q_ASSERT(script.script->isCompleteOrError());
+        if (script.script->isError()) {
+            QList<QDeclarativeError> errors = script.script->errors();
+            QDeclarativeError error;
+            error.setUrl(finalUrl());
+            error.setLine(script.location.line);
+            error.setColumn(script.location.column);
+            error.setDescription(typeLoader()->tr("Script %1 unavailable").arg(script.script->url().toString()));
+            errors.prepend(error);
+            setError(errors);
+        }
+    }
+
+    if (isError())
+        return;
+
+    QDeclarativeEngine *engine = typeLoader()->engine();
+    m_scriptData = new QDeclarativeScriptData(engine);
+    m_scriptData->url = finalUrl();
+    m_scriptData->importCache = new QDeclarativeTypeNameCache(engine);
+
+    for (int ii = 0; !isError() && ii < m_scripts.count(); ++ii) {
+        const ScriptReference &script = m_scripts.at(ii);
+
+        m_scriptData->scripts.append(script.script);
+        m_scriptData->importCache->add(script.qualifier, ii);
+    }
+
+    m_imports.populateCache(m_scriptData->importCache, engine);
+
+    m_scriptData->pragmas = m_pragmas;
+    m_scriptData->m_program = QScriptProgram(m_source, finalUrl().toString());
 }
 
 QDeclarativeQmldirData::QDeclarativeQmldirData(const QUrl &url)
diff --git a/src/declarative/qml/qdeclarativetypeloader_p.h b/src/declarative/qml/qdeclarativetypeloader_p.h
index 7f487a0e24..1c0798d67b 100644
--- a/src/declarative/qml/qdeclarativetypeloader_p.h
+++ b/src/declarative/qml/qdeclarativetypeloader_p.h
@@ -55,8 +55,11 @@
 
 #include <QtCore/qobject.h>
 #include <QtNetwork/qnetworkreply.h>
+#include <QtScript/qscriptvalue.h>
+#include <QtScript/qscriptprogram.h>
 #include <QtDeclarative/qdeclarativeerror.h>
 #include <QtDeclarative/qdeclarativeengine.h>
+#include <private/qdeclarativecleanup_p.h>
 #include <private/qdeclarativescriptparser_p.h>
 #include <private/qdeclarativedirparser_p.h>
 #include <private/qdeclarativeimport_p.h>
@@ -64,6 +67,7 @@
 QT_BEGIN_NAMESPACE
 
 class QDeclarativeScriptData;
+class QDeclarativeScriptBlob;
 class QDeclarativeQmldirData;
 class QDeclarativeTypeLoader;
 class QDeclarativeCompiledData;
@@ -140,7 +144,7 @@ private:
     QUrl m_finalUrl;
 
     // List of QDeclarativeDataBlob's that are waiting for me to complete.
-    QList<QDeclarativeDataBlob *> m_waitingOnMe;     
+    QList<QDeclarativeDataBlob *> m_waitingOnMe;
 
     // List of QDeclarativeDataBlob's that I am waiting for to complete.
     QList<QDeclarativeDataBlob *> m_waitingFor;
@@ -178,7 +182,6 @@ private:
     NetworkReplies m_networkReplies;
 };
 
-
 class Q_AUTOTEST_EXPORT QDeclarativeTypeLoader : public QDeclarativeDataLoader
 {
     Q_OBJECT
@@ -196,11 +199,11 @@ public:
     QDeclarativeTypeData *get(const QByteArray &, const QUrl &url, Options = None);
     void clearCache();
 
-    QDeclarativeScriptData *getScript(const QUrl &);
+    QDeclarativeScriptBlob *getScript(const QUrl &);
     QDeclarativeQmldirData *getQmldir(const QUrl &);
 private:
     typedef QHash<QUrl, QDeclarativeTypeData *> TypeCache;
-    typedef QHash<QUrl, QDeclarativeScriptData *> ScriptCache;
+    typedef QHash<QUrl, QDeclarativeScriptBlob *> ScriptCache;
     typedef QHash<QUrl, QDeclarativeQmldirData *> QmldirCache;
 
     TypeCache m_typeCache;
@@ -230,7 +233,7 @@ public:
 
         QDeclarativeParser::Location location;
         QString qualifier;
-        QDeclarativeScriptData *script;
+        QDeclarativeScriptBlob *script;
     };
 
     QDeclarativeTypeData(const QUrl &, QDeclarativeTypeLoader::Options, QDeclarativeTypeLoader *);
@@ -285,20 +288,65 @@ private:
     QDeclarativeTypeLoader *m_typeLoader;
 };
 
-class Q_AUTOTEST_EXPORT QDeclarativeScriptData : public QDeclarativeDataBlob
+class Q_AUTOTEST_EXPORT QDeclarativeScriptData : public QDeclarativeRefCount, public QDeclarativeCleanup
 {
 public:
-    QDeclarativeScriptData(const QUrl &);
+    QDeclarativeScriptData(QDeclarativeEngine *);
+    ~QDeclarativeScriptData();
+
+    QUrl url;
+    QDeclarativeTypeNameCache *importCache;
+    QList<QDeclarativeScriptBlob *> scripts;
+    QDeclarativeParser::Object::ScriptBlock::Pragmas pragmas;
+
+protected:
+    virtual void clear(); // From QDeclarativeCleanup
+
+private:
+    friend class QDeclarativeVME;
+    friend class QDeclarativeScriptBlob;
+
+    bool m_loaded;
+    QScriptProgram m_program;
+    QScriptValue m_value;
+};
+
+class Q_AUTOTEST_EXPORT QDeclarativeScriptBlob : public QDeclarativeDataBlob
+{
+public:
+    QDeclarativeScriptBlob(const QUrl &, QDeclarativeTypeLoader *);
+    ~QDeclarativeScriptBlob();
+
+    struct ScriptReference
+    {
+        ScriptReference() : script(0) {}
+
+        QDeclarativeParser::Location location;
+        QString qualifier;
+        QDeclarativeScriptBlob *script;
+    };
 
     QDeclarativeParser::Object::ScriptBlock::Pragmas pragmas() const;
     QString scriptSource() const;
 
+    QDeclarativeTypeLoader *typeLoader() const;
+    const QDeclarativeImports &imports() const;
+
+    QDeclarativeScriptData *scriptData() const;
+
 protected:
     virtual void dataReceived(const QByteArray &);
+    virtual void done();
 
 private:
     QDeclarativeParser::Object::ScriptBlock::Pragmas m_pragmas;
     QString m_source;
+
+    QDeclarativeImports m_imports;
+    QList<ScriptReference> m_scripts;
+    QDeclarativeScriptData *m_scriptData;
+
+    QDeclarativeTypeLoader *m_typeLoader;
 };
 
 class Q_AUTOTEST_EXPORT QDeclarativeQmldirData : public QDeclarativeDataBlob
diff --git a/src/declarative/qml/qdeclarativetypenamecache.cpp b/src/declarative/qml/qdeclarativetypenamecache.cpp
index 48c72a7fef..b9577c17fa 100644
--- a/src/declarative/qml/qdeclarativetypenamecache.cpp
+++ b/src/declarative/qml/qdeclarativetypenamecache.cpp
@@ -46,7 +46,7 @@
 QT_BEGIN_NAMESPACE
 
 QDeclarativeTypeNameCache::QDeclarativeTypeNameCache(QDeclarativeEngine *e)
-: QDeclarativeCleanup(e), engine(e)
+: QDeclarativeCleanup(e), engine(e), m_moduleApi(0)
 {
 }
 
@@ -60,6 +60,7 @@ void QDeclarativeTypeNameCache::clear()
     qDeleteAll(stringCache);
     stringCache.clear();
     identifierCache.clear();
+    m_moduleApi = 0;
     engine = 0;
 }
 
@@ -114,5 +115,10 @@ QDeclarativeTypeNameCache::Data *QDeclarativeTypeNameCache::data(const QString &
     return stringCache.value(id);
 }
 
+void QDeclarativeTypeNameCache::setModuleApi(QDeclarativeMetaType::ModuleApiInstance *api)
+{
+    m_moduleApi = api;
+}
+
 QT_END_NAMESPACE
 
diff --git a/src/declarative/qml/qdeclarativetypenamecache_p.h b/src/declarative/qml/qdeclarativetypenamecache_p.h
index f2562da777..bcca41f4d5 100644
--- a/src/declarative/qml/qdeclarativetypenamecache_p.h
+++ b/src/declarative/qml/qdeclarativetypenamecache_p.h
@@ -55,6 +55,7 @@
 
 #include "private/qdeclarativerefcount_p.h"
 #include "private/qdeclarativecleanup_p.h"
+#include "private/qdeclarativemetatype_p.h"
 
 #include <private/qscriptdeclarativeclass_p.h>
 
@@ -82,6 +83,10 @@ public:
 
     Data *data(const QString &) const;
     inline Data *data(const QScriptDeclarativeClass::Identifier &id) const;
+    inline bool isEmpty() const;
+
+    inline QDeclarativeMetaType::ModuleApiInstance *moduleApi() const;
+    void setModuleApi(QDeclarativeMetaType::ModuleApiInstance *);
 
 protected:
     virtual void clear();
@@ -96,6 +101,7 @@ private:
     StringCache stringCache;
     IdentifierCache identifierCache;
     QDeclarativeEngine *engine;
+    QDeclarativeMetaType::ModuleApiInstance *m_moduleApi;
 };
 
 QDeclarativeTypeNameCache::Data::Data()
@@ -113,6 +119,16 @@ QDeclarativeTypeNameCache::Data *QDeclarativeTypeNameCache::data(const QScriptDe
     return identifierCache.value(id);
 }
 
+bool QDeclarativeTypeNameCache::isEmpty() const
+{
+    return identifierCache.isEmpty();
+}
+
+QDeclarativeMetaType::ModuleApiInstance *QDeclarativeTypeNameCache::moduleApi() const
+{
+    return m_moduleApi;
+}
+
 QT_END_NAMESPACE
 
 #endif // QDECLARATIVETYPENAMECACHE_P_H
diff --git a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
index a7c0b2cfbe..d628b7065a 100644
--- a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
+++ b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
@@ -63,7 +63,7 @@ struct TypeNameData : public QScriptDeclarativeClass::Object {
 
 QDeclarativeTypeNameScriptClass::QDeclarativeTypeNameScriptClass(QDeclarativeEngine *bindEngine)
 : QScriptDeclarativeClass(QDeclarativeEnginePrivate::getScriptEngine(bindEngine)), 
-  engine(bindEngine), object(0), type(0)
+  engine(bindEngine), object(0), type(0), api(0)
 {
 }
 
@@ -95,14 +95,35 @@ QDeclarativeTypeNameScriptClass::queryProperty(Object *obj, const Identifier &na
 
     object = 0;
     type = 0;
+    api = 0;
     QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
 
     if (data->typeNamespace) {
-
         QDeclarativeTypeNameCache::Data *d = data->typeNamespace->data(name);
         if (d && d->type) {
             type = d->type;
             return QScriptClass::HandlesReadAccess;
+        } else if (QDeclarativeMetaType::ModuleApiInstance *moduleApi = data->typeNamespace->moduleApi()) {
+            if (moduleApi->scriptCallback) {
+                moduleApi->scriptApi = moduleApi->scriptCallback(engine, &ep->scriptEngine);
+                moduleApi->scriptCallback = 0;
+                moduleApi->qobjectCallback = 0;
+            } else if (moduleApi->qobjectCallback) {
+                moduleApi->qobjectApi = moduleApi->qobjectCallback(engine, &ep->scriptEngine);
+                moduleApi->scriptCallback = 0;
+                moduleApi->qobjectCallback = 0;
+            }
+
+            api = moduleApi;
+            if (api->qobjectApi) {
+                return ep->objectClass->queryProperty(api->qobjectApi, name, flags, 0,
+                                                      QDeclarativeObjectScriptClass::SkipAttachedProperties);
+            } else {
+                return QScriptClass::HandlesReadAccess;
+            }
+
+            return 0;
+
         } else {
             return 0;
         }
@@ -147,6 +168,10 @@ QDeclarativeTypeNameScriptClass::property(Object *obj, const Identifier &name)
         return Value(scriptEngine, newObject(((TypeNameData *)obj)->object, type, ((TypeNameData *)obj)->mode));
     } else if (object) {
         return ep->objectClass->property(object, name);
+    } else if (api && api->qobjectApi) {
+        return ep->objectClass->property(api->qobjectApi, name);
+    } else if (api) {
+        return propertyValue(api->scriptApi, name);
     } else {
         return Value(scriptEngine, enumValue);
     }
@@ -154,11 +179,16 @@ QDeclarativeTypeNameScriptClass::property(Object *obj, const Identifier &name)
 
 void QDeclarativeTypeNameScriptClass::setProperty(Object *, const Identifier &n, const QScriptValue &v)
 {
-    Q_ASSERT(object);
     Q_ASSERT(!type);
 
     QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
-    ep->objectClass->setProperty(object, n, v, context());
+    if (api) {
+        Q_ASSERT(api->qobjectApi);
+        ep->objectClass->setProperty(api->qobjectApi, n, v, context());
+    } else {
+        Q_ASSERT(object);
+        ep->objectClass->setProperty(object, n, v, context());
+    }
 }
 
 QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativetypenamescriptclass_p.h b/src/declarative/qml/qdeclarativetypenamescriptclass_p.h
index cf7dbc8480..49e1ae809e 100644
--- a/src/declarative/qml/qdeclarativetypenamescriptclass_p.h
+++ b/src/declarative/qml/qdeclarativetypenamescriptclass_p.h
@@ -83,6 +83,7 @@ private:
     QDeclarativeEngine *engine;
     QObject *object;
     QDeclarativeType *type;
+    QDeclarativeMetaType::ModuleApiInstance *api;
     quint32 enumValue;
 };
 
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index 781e1b8ea3..6bbc47bcaf 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -57,8 +57,9 @@
 #include "private/qdeclarativevmemetaobject_p.h"
 #include "private/qdeclarativebinding_p_p.h"
 #include "private/qdeclarativecontext_p.h"
-#include "private/qdeclarativecompiledbindings_p.h"
+#include "private/qdeclarativev4bindings_p.h"
 #include "private/qdeclarativeglobal_p.h"
+#include "private/qdeclarativeglobalscriptclass_p.h"
 #include "qdeclarativescriptstring.h"
 
 #include <QStack>
@@ -71,6 +72,7 @@
 #include <QtCore/qvarlengtharray.h>
 #include <QtCore/qcoreapplication.h>
 #include <QtCore/qdatetime.h>
+#include <QtScript/qscriptvalue.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -158,7 +160,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
     const QList<int> &intData = comp->intData;
     const QList<float> &floatData = comp->floatData;
     const QList<QDeclarativePropertyCache *> &propertyCaches = comp->propertyCaches;
-    const QList<QDeclarativeParser::Object::ScriptBlock> &scripts = comp->scripts;
+    const QList<QDeclarativeScriptData *> &scripts = comp->scripts;
     const QList<QUrl> &urls = comp->urls;
 
     QDeclarativeEnginePrivate::SimpleList<QDeclarativeAbstractBinding> bindValues;
@@ -186,7 +188,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
                 if (instr.init.contextCache != -1) 
                     ctxt->setIdPropertyData(comp->contextCaches.at(instr.init.contextCache));
                 if (instr.init.compiledBinding != -1) 
-                    ctxt->optimizedBindings = new QDeclarativeCompiledBindings(datas.at(instr.init.compiledBinding).constData(), ctxt);
+                    ctxt->optimizedBindings = new QDeclarativeV4Bindings(datas.at(instr.init.compiledBinding).constData(), ctxt);
             }
             break;
 
@@ -409,6 +411,15 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
             }
             break;
 
+        case QDeclarativeInstruction::StoreByteArray:
+            {
+                QObject *target = stack.top();
+                void *a[] = { (void *)&datas.at(instr.storeByteArray.value), 0, &status, &flags };
+                QMetaObject::metacall(target, QMetaObject::WriteProperty,
+                                      instr.storeByteArray.propertyIndex, a);
+            }
+            break;
+
         case QDeclarativeInstruction::StoreUrl:
             {
                 QObject *target = stack.top();
@@ -701,7 +712,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
 
         case QDeclarativeInstruction::StoreImportedScript:
             {
-                ctxt->addImportedScript(scripts.at(instr.storeScript.value));
+                ctxt->importedScripts << run(ctxt, scripts.at(instr.storeScript.value));
             }
             break;
 
@@ -1054,5 +1065,68 @@ QDeclarativeCompiledData::TypeReference::createInstance(QDeclarativeContextData
     } 
 }
 
+QScriptValue QDeclarativeVME::run(QDeclarativeContextData *parentCtxt, QDeclarativeScriptData *script)
+{
+    if (script->m_loaded)
+        return script->m_value;
+
+    QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(parentCtxt->engine);
+    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(parentCtxt->engine);
+
+    bool shared = script->pragmas & QDeclarativeParser::Object::ScriptBlock::Shared;
+
+    // Create the script context if required
+    QDeclarativeContextData *ctxt = 0;
+    if (!shared) {
+        ctxt = new QDeclarativeContextData;
+        ctxt->isInternal = true;
+        ctxt->url = script->url;
+
+        // For backward compatibility, if there are no imports, we need to use the
+        // imports from the parent context.  See QTBUG-17518.
+        if (!script->importCache->isEmpty()) {
+            ctxt->imports = script->importCache;
+        } else {
+            ctxt->imports = parentCtxt->imports;
+        }
+
+        if (ctxt->imports) {
+            ctxt->imports->addref();
+        }
+
+        ctxt->setParent(parentCtxt, true);
+
+        for (int ii = 0; ii < script->scripts.count(); ++ii)
+            ctxt->importedScripts << run(ctxt, script->scripts.at(ii)->scriptData());
+    }
+
+    QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
+    if (shared) {
+        scriptContext->pushScope(enginePriv->contextClass->newUrlContext(script->url.toString())); // XXX toString()?
+    } else {
+        scriptContext->pushScope(enginePriv->contextClass->newUrlContext(ctxt, 0, script->url.toString()));
+    }
+
+    scriptContext->pushScope(enginePriv->globalClass->staticGlobalObject());
+    QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(scriptEngine);
+    scriptContext->pushScope(scope);
+
+    scriptEngine->evaluate(script->m_program);
+
+    if (scriptEngine->hasUncaughtException()) {
+        QDeclarativeError error;
+        QDeclarativeExpressionPrivate::exceptionToError(scriptEngine, error);
+        enginePriv->warning(error);
+    }
+
+    scriptEngine->popContext();
+
+    if (shared) {
+        script->m_loaded = true;
+        script->m_value = scope;
+    }
+
+    return scope;
+}
 
 QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativevme_p.h b/src/declarative/qml/qdeclarativevme_p.h
index 77c016c1a8..4c010f19d8 100644
--- a/src/declarative/qml/qdeclarativevme_p.h
+++ b/src/declarative/qml/qdeclarativevme_p.h
@@ -62,6 +62,8 @@
 QT_BEGIN_NAMESPACE
 
 class QObject;
+class QScriptValue;
+class QDeclarativeScriptData;
 class QDeclarativeInstruction;
 class QDeclarativeCompiledData;
 class QDeclarativeCompiledData;
@@ -103,6 +105,8 @@ public:
     QObject *run(QDeclarativeContextData *, QDeclarativeCompiledData *, 
                  int start = -1, int count = -1, 
                  const QBitField & = QBitField());
+    QScriptValue run(QDeclarativeContextData *, QDeclarativeScriptData *);
+
     void runDeferred(QObject *);
 
     bool isError() const;
diff --git a/src/declarative/qml/qdeclarativevmemetaobject.cpp b/src/declarative/qml/qdeclarativevmemetaobject.cpp
index ad1bf0dd3a..6eb74b3bad 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject.cpp
+++ b/src/declarative/qml/qdeclarativevmemetaobject.cpp
@@ -647,6 +647,7 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
                     return -1; // We can't run the method
 
                 QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(ctxt->engine);
+                ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation.
 
                 QScriptValue function = method(id);
 
@@ -657,10 +658,19 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
                         args << ep->scriptValueFromVariant(*(QVariant *)a[ii + 1]);
                     }
                 }
+
                 QScriptValue rv = function.call(ep->objectClass->newQObject(object), args);
+                if (ep->scriptEngine.hasUncaughtException()) {
+                    QDeclarativeError error;
+                    QDeclarativeExpressionPrivate::exceptionToError(&ep->scriptEngine, error);
+                    if (error.isValid()) {
+                        ep->warning(error);
+                    }
+                }
 
                 if (a[0]) *reinterpret_cast<QVariant *>(a[0]) = ep->scriptValueToVariant(rv);
 
+                ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete.
                 return -1;
             }
             return -1;
diff --git a/src/declarative/qml/qdeclarativexmlhttprequest.cpp b/src/declarative/qml/qdeclarativexmlhttprequest.cpp
index aefc896f5b..930d345285 100644
--- a/src/declarative/qml/qdeclarativexmlhttprequest.cpp
+++ b/src/declarative/qml/qdeclarativexmlhttprequest.cpp
@@ -101,6 +101,8 @@ QT_BEGIN_NAMESPACE
 
 DEFINE_BOOL_CONFIG_OPTION(xhrDump, QML_XHR_DUMP);
 
+namespace {
+
 class DocumentImpl;
 class NodeImpl 
 {
@@ -323,6 +325,8 @@ public:
     static QScriptValue load(QScriptEngine *engine, const QByteArray &data);
 };
 
+}
+
 QT_END_NAMESPACE
 
 Q_DECLARE_METATYPE(Node)
@@ -1231,6 +1235,18 @@ void QDeclarativeXMLHttpRequest::downloadProgress(qint64 bytes)
     }
 }
 
+static const char *errorToString(QNetworkReply::NetworkError error)
+{
+    int idx = QNetworkReply::staticMetaObject.indexOfEnumerator("NetworkError");
+    if (idx == -1) return "EnumLookupFailed";
+
+    QMetaEnum e = QNetworkReply::staticMetaObject.enumerator(idx);
+
+    const char *name = e.valueToKey(error);
+    if (!name) return "EnumLookupFailed";
+    else return name;
+}
+
 void QDeclarativeXMLHttpRequest::error(QNetworkReply::NetworkError error)
 {
     Q_UNUSED(error)
@@ -1245,6 +1261,11 @@ void QDeclarativeXMLHttpRequest::error(QNetworkReply::NetworkError error)
     m_data.clear();
     destroyNetwork();
 
+    if (xhrDump()) {
+        qWarning().nospace() << "XMLHttpRequest: ERROR " << qPrintable(m_url.toString());
+        qWarning().nospace() << "    " << error << " " << errorToString(error) << " " << m_statusText;
+    }
+
     if (error == QNetworkReply::ContentAccessDenied ||
         error == QNetworkReply::ContentOperationNotPermittedError ||
         error == QNetworkReply::ContentNotFoundError ||
diff --git a/src/declarative/qml/qintrusivelist.cpp b/src/declarative/qml/qintrusivelist.cpp
new file mode 100644
index 0000000000..6c27af0777
--- /dev/null
+++ b/src/declarative/qml/qintrusivelist.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qintrusivelist_p.h"
+
+/*!
+\class QIntrusiveList
+\brief The QIntrusiveList class is a template class that provides a list of objects using static storage.
+\internal
+
+QIntrusiveList creates a linked list of objects.  Adding and removing objects from the 
+QIntrusiveList is a constant time operation and is very quick.  The list performs no memory
+allocations, but does require the objects being added to the list to contain a QIntrusiveListNode
+instance for the list's use.  Even so, for small lists QIntrusiveList uses less memory than Qt's
+other list classes.
+
+As QIntrusiveList uses storage inside the objects in the list, each object can only be in one
+list at a time.  Objects are inserted by the insert() method.  If the object is already
+in a list (including the one it is being inserted into) it is first removed, and then inserted
+at the head of the list.  QIntrusiveList is a last-in-first-out list.  That is, following an
+insert() the inserted object becomes the list's first() object.
+
+\code
+struct MyObject {
+    MyObject(int value) : value(value) {}
+
+    int value;
+    QIntrusiveListNode node;
+};
+typedef QIntrusiveList<MyObject, &MyObject::node> MyObjectList;
+
+void foo() {
+    MyObjectList list;
+
+    MyObject m0(0);
+    MyObject m1(1);
+    MyObject m2(2);
+
+    list.insert(&m0);
+    list.insert(&m1);
+    list.insert(&m2);
+
+    // QIntrusiveList is LIFO, so will print: 2... 1... 0...
+    for (MyObjectList::iterator iter = list.begin(); iter != list.end(); ++iter) {
+        qWarning() << iter->value;
+    }
+}
+\endcode
+*/
+
+
+/*!
+\fn QIntrusiveList::QIntrusiveList();
+
+Construct an empty list.
+*/
+
+/*!
+\fn QIntrusiveList::~QIntrusiveList();
+
+Destroy the list.  All entries are removed.
+*/
+
+/*!
+\fn void QIntrusiveList::insert(N *object);
+
+Insert \a object into the list.  If \a object is a member of this, or another list, it will be 
+removed and inserted at the head of this list.
+*/
+
+/*!
+\fn void QIntrusiveList::remove(N *object);
+
+Remove \a object from the list.  \a object must not be null.
+*/
+
+/*!
+\fn N *QIntrusiveList::first() const
+
+Returns the first entry in this list, or null if the list is empty.
+*/
+
+/*!
+\fn N *QIntrusiveList::next(N *current)
+
+Returns the next object after \a current, or null if \a current is the last object.  \a current cannot be null.
+*/
+
+/*!
+\fn iterator QIntrusiveList::begin()
+
+Returns an STL-style interator pointing to the first item in the list.
+
+\sa end()
+*/
+
+/*!
+\fn iterator QIntrusiveList::end()
+
+Returns an STL-style iterator pointing to the imaginary item after the last item in the list.
+
+\sa begin()
+*/
+
+/*!
+iterator &QInplacelist::iterator::erase()
+
+Remove the current object from the list, and return an iterator to the next element.
+*/
+
+
+/*!
+\fn QIntrusiveListNode::QIntrusiveListNode()
+
+Create a QIntrusiveListNode.
+*/
+
+/*!
+\fn QIntrusiveListNode::~QIntrusiveListNode()
+
+Destroy the QIntrusiveListNode.  If the node is in a list, it is removed.
+*/
+
+/*!
+\fn void QIntrusiveListNode::remove()
+
+If in a list, remove this node otherwise do nothing.
+*/
+
+/*!
+\fn bool QIntrusiveListNode::isInList() const
+
+Returns true if this node is in a list, false otherwise.
+*/
+
diff --git a/src/declarative/qml/qintrusivelist_p.h b/src/declarative/qml/qintrusivelist_p.h
new file mode 100644
index 0000000000..459d051d07
--- /dev/null
+++ b/src/declarative/qml/qintrusivelist_p.h
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QINTRUSIVELIST_P_H
+#define QINTRUSIVELIST_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+class QIntrusiveListNode;
+template<class N, QIntrusiveListNode N::*member>
+class QIntrusiveList
+{
+public:
+    inline QIntrusiveList();
+    inline ~QIntrusiveList();
+
+    inline void insert(N *n);
+    inline void remove(N *n);
+
+    class iterator {
+    public:
+        inline iterator();
+        inline iterator(N *value);
+
+        inline N *operator*() const;
+        inline N *operator->() const;
+        inline bool operator==(const iterator &other) const;
+        inline bool operator!=(const iterator &other) const;
+        inline iterator &operator++();
+
+        inline iterator &erase();
+        
+    private:
+        N *_value;
+    };
+    typedef iterator Iterator;
+
+    inline N *first() const;
+    static inline N *next(N *current);
+
+    inline iterator begin();
+    inline iterator end();
+
+private:
+    static inline N *nodeToN(QIntrusiveListNode *node);
+
+    QIntrusiveListNode *__first;
+};
+
+class QIntrusiveListNode
+{
+public:
+    inline QIntrusiveListNode();
+    inline ~QIntrusiveListNode();
+
+    inline void remove();
+    inline bool isInList() const;
+
+    QIntrusiveListNode *_next;
+    QIntrusiveListNode**_prev;
+};
+
+template<class N, QIntrusiveListNode N::*member>
+QIntrusiveList<N, member>::iterator::iterator() 
+: _value(0) 
+{
+}
+
+template<class N, QIntrusiveListNode N::*member>
+QIntrusiveList<N, member>::iterator::iterator(N *value) 
+: _value(value) 
+{
+}
+
+template<class N, QIntrusiveListNode N::*member>
+N *QIntrusiveList<N, member>::iterator::operator*() const 
+{ 
+    return _value; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+N *QIntrusiveList<N, member>::iterator::operator->() const 
+{ 
+    return _value; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+bool QIntrusiveList<N, member>::iterator::operator==(const iterator &other) const 
+{ 
+    return other._value == _value; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+bool QIntrusiveList<N, member>::iterator::operator!=(const iterator &other) const 
+{ 
+    return other._value != _value; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+typename QIntrusiveList<N, member>::iterator &QIntrusiveList<N, member>::iterator::operator++() 
+{ 
+    _value = QIntrusiveList<N, member>::next(_value); 
+    return *this; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+typename QIntrusiveList<N, member>::iterator &QIntrusiveList<N, member>::iterator::erase() 
+{ 
+    N *old = _value; 
+    _value = QIntrusiveList<N, member>::next(_value); 
+    (old->*member).remove(); 
+    return *this;
+}
+        
+template<class N, QIntrusiveListNode N::*member>
+QIntrusiveList<N, member>::QIntrusiveList() 
+: __first(0) 
+{
+}
+
+template<class N, QIntrusiveListNode N::*member>
+QIntrusiveList<N, member>::~QIntrusiveList()
+{
+    while (__first) __first->remove();
+}
+
+template<class N, QIntrusiveListNode N::*member>
+void QIntrusiveList<N, member>::insert(N *n) 
+{
+    QIntrusiveListNode *nnode = &(n->*member);
+    nnode->remove();
+
+    nnode->_next = __first;
+    if (nnode->_next) nnode->_next->_prev = &nnode->_next;
+    __first = nnode;
+    nnode->_prev = &__first;
+}
+
+template<class N, QIntrusiveListNode N::*member>
+void QIntrusiveList<N, member>::remove(N *n)
+{
+    QIntrusiveListNode *nnode = &(n->*member);
+    nnode->remove();
+}
+
+template<class N, QIntrusiveListNode N::*member>
+N *QIntrusiveList<N, member>::first() const 
+{ 
+    return __first?nodeToN(__first):0; 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+N *QIntrusiveList<N, member>::next(N *current) 
+{
+    QIntrusiveListNode *nextnode = (current->*member)._next;
+    N *nextstruct = nextnode?nodeToN(nextnode):0;
+    return nextstruct;
+}
+
+template<class N, QIntrusiveListNode N::*member>
+typename QIntrusiveList<N, member>::iterator QIntrusiveList<N, member>::begin() 
+{ 
+    return __first?iterator(nodeToN(__first)):iterator(); 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+typename QIntrusiveList<N, member>::iterator QIntrusiveList<N, member>::end() 
+{ 
+    return iterator(); 
+}
+
+template<class N, QIntrusiveListNode N::*member>
+N *QIntrusiveList<N, member>::nodeToN(QIntrusiveListNode *node) 
+{
+    return (N *)((char *)node - ((char *)&(((N *)0)->*member) - (char *)0));
+}
+
+QIntrusiveListNode::QIntrusiveListNode()
+: _next(0), _prev(0)
+{
+}
+
+QIntrusiveListNode::~QIntrusiveListNode()
+{
+    remove();
+}
+
+void QIntrusiveListNode::remove()
+{
+    if (_prev) *_prev = _next;
+    if (_next) _next->_prev = _prev;
+    _prev = 0;
+    _next = 0;
+}
+
+bool QIntrusiveListNode::isInList() const
+{
+    return _prev != 0;
+}
+
+QT_END_NAMESPACE
+
+#endif // QINTRUSIVELIST_P_H
diff --git a/src/declarative/qml/qmetaobjectbuilder.cpp b/src/declarative/qml/qmetaobjectbuilder.cpp
index dc941e2601..a63656bc28 100644
--- a/src/declarative/qml/qmetaobjectbuilder.cpp
+++ b/src/declarative/qml/qmetaobjectbuilder.cpp
@@ -101,7 +101,7 @@ bool isVariantType(const char* type)
     return qvariant_nameToType(type) != 0;
 }
 
-// copied from qmetaobject.cpp
+// copied from qmetaobject_p.h
 // do not touch without touching the moc as well
 enum PropertyFlags  {
     Invalid = 0x00000000,
@@ -111,6 +111,8 @@ enum PropertyFlags  {
     EnumOrFlag = 0x00000008,
     StdCppSet = 0x00000100,
 //    Override = 0x00000200,
+    Constant = 0x00000400,
+    Final = 0x00000800,
     Designable = 0x00001000,
     ResolveDesignable = 0x00002000,
     Scriptable = 0x00004000,
@@ -618,6 +620,8 @@ QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QMetaProperty& protot
     property.setUser(prototype.isUser());
     property.setStdCppSet(prototype.hasStdCppSet());
     property.setEnumOrFlag(prototype.isEnumType());
+    property.setConstant(prototype.isConstant());
+    property.setFinal(prototype.isFinal());
     if (prototype.hasNotifySignal()) {
         // Find an existing method for the notify signal, or add a new one.
         QMetaMethod method = prototype.notifySignal();
@@ -2277,6 +2281,32 @@ bool QMetaPropertyBuilder::isEnumOrFlag() const
         return false;
 }
 
+/*!
+    Returns true if the property is constant; otherwise returns false.
+    The default value is false.
+*/
+bool QMetaPropertyBuilder::isConstant() const
+{
+    QMetaPropertyBuilderPrivate *d = d_func();
+    if (d)
+        return d->flag(Constant);
+    else
+        return false;
+}
+
+/*!
+    Returns true if the property is final; otherwise returns false.
+    The default value is false.
+*/
+bool QMetaPropertyBuilder::isFinal() const
+{
+    QMetaPropertyBuilderPrivate *d = d_func();
+    if (d)
+        return d->flag(Final);
+    else
+        return false;
+}
+
 /*!
     Sets this property to readable if \a value is true.
 
@@ -2400,6 +2430,31 @@ void QMetaPropertyBuilder::setEnumOrFlag(bool value)
         d->setFlag(EnumOrFlag, value);
 }
 
+/*!
+    Sets the \c CONSTANT flag on this property to \a value.
+
+    \sa isConstant()
+*/
+void QMetaPropertyBuilder::setConstant(bool value)
+{
+    QMetaPropertyBuilderPrivate *d = d_func();
+    if (d)
+        d->setFlag(Constant, value);
+}
+
+/*!
+    Sets the \c FINAL flag on this property to \a value.
+
+    \sa isFinal()
+*/
+void QMetaPropertyBuilder::setFinal(bool value)
+{
+    QMetaPropertyBuilderPrivate *d = d_func();
+    if (d)
+        d->setFlag(Final, value);
+}
+
+
 /*!
     \class QMetaEnumBuilder
     \internal
diff --git a/src/declarative/qml/qmetaobjectbuilder_p.h b/src/declarative/qml/qmetaobjectbuilder_p.h
index d7085f8784..335a825be3 100644
--- a/src/declarative/qml/qmetaobjectbuilder_p.h
+++ b/src/declarative/qml/qmetaobjectbuilder_p.h
@@ -258,6 +258,8 @@ public:
     bool isUser() const;
     bool hasStdCppSet() const;
     bool isEnumOrFlag() const;
+    bool isConstant() const;
+    bool isFinal() const;
 
     void setReadable(bool value);
     void setWritable(bool value);
@@ -269,6 +271,8 @@ public:
     void setUser(bool value);
     void setStdCppSet(bool value);
     void setEnumOrFlag(bool value);
+    void setConstant(bool value);
+    void setFinal(bool value);
 
 private:
     const QMetaObjectBuilder *_mobj;
diff --git a/src/declarative/qml/qml.pri b/src/declarative/qml/qml.pri
index bf9e54a986..62c1f97d60 100644
--- a/src/declarative/qml/qml.pri
+++ b/src/declarative/qml/qml.pri
@@ -18,7 +18,6 @@ SOURCES += \
     $$PWD/qdeclarativecompiler.cpp \
     $$PWD/qdeclarativecompileddata.cpp \
     $$PWD/qdeclarativeboundsignal.cpp \
-    $$PWD/qdeclarativedom.cpp \
     $$PWD/qdeclarativerefcount.cpp \
     $$PWD/qdeclarativemetatype.cpp \
     $$PWD/qdeclarativestringconverters.cpp \
@@ -30,7 +29,6 @@ SOURCES += \
     $$PWD/qdeclarativeenginedebug.cpp \
     $$PWD/qdeclarativerewrite.cpp \
     $$PWD/qdeclarativevaluetype.cpp \
-    $$PWD/qdeclarativecompiledbindings.cpp \
     $$PWD/qdeclarativefastproperties.cpp \
     $$PWD/qdeclarativexmlhttprequest.cpp \
     $$PWD/qdeclarativesqldatabase.cpp \
@@ -44,6 +42,7 @@ SOURCES += \
     $$PWD/qdeclarativetypenamecache.cpp \
     $$PWD/qdeclarativescriptstring.cpp \
     $$PWD/qdeclarativeobjectscriptclass.cpp \
+    $$PWD/qdeclarativescarceresourcescriptclass.cpp \
     $$PWD/qdeclarativecontextscriptclass.cpp \
     $$PWD/qdeclarativeglobalscriptclass.cpp \
     $$PWD/qdeclarativevaluetypescriptclass.cpp \
@@ -56,7 +55,8 @@ SOURCES += \
     $$PWD/qdeclarativeextensionplugin.cpp \
     $$PWD/qdeclarativeimport.cpp \
     $$PWD/qdeclarativelist.cpp \ 
-    $$PWD/qperformancetimer.cpp
+    $$PWD/qperformancetimer.cpp \
+    $$PWD/qintrusivelist.cpp \
 
 HEADERS += \
     $$PWD/qdeclarativeparser_p.h \
@@ -81,8 +81,6 @@ HEADERS += \
     $$PWD/qdeclarativeengine_p.h \
     $$PWD/qdeclarativeexpression_p.h \
     $$PWD/qdeclarativeprivate.h \
-    $$PWD/qdeclarativedom_p.h \
-    $$PWD/qdeclarativedom_p_p.h \
     $$PWD/qdeclarativerefcount_p.h \
     $$PWD/qdeclarativemetatype_p.h \
     $$PWD/qdeclarativeengine.h \
@@ -104,7 +102,6 @@ HEADERS += \
     $$PWD/qpodvector_p.h \
     $$PWD/qbitfield_p.h \
     $$PWD/qdeclarativevaluetype_p.h \
-    $$PWD/qdeclarativecompiledbindings_p.h \
     $$PWD/qdeclarativefastproperties_p.h \
     $$PWD/qdeclarativexmlhttprequest_p.h \
     $$PWD/qdeclarativesqldatabase_p.h \
@@ -118,6 +115,7 @@ HEADERS += \
     $$PWD/qdeclarativetypenamecache_p.h \
     $$PWD/qdeclarativescriptstring.h \
     $$PWD/qdeclarativeobjectscriptclass_p.h \
+    $$PWD/qdeclarativescarceresourcescriptclass_p.h \
     $$PWD/qdeclarativecontextscriptclass_p.h \
     $$PWD/qdeclarativeglobalscriptclass_p.h \
     $$PWD/qdeclarativevaluetypescriptclass_p.h \
@@ -131,11 +129,13 @@ HEADERS += \
     $$PWD/qdeclarativeextensioninterface.h \
     $$PWD/qdeclarativeimport_p.h \
     $$PWD/qdeclarativeextensionplugin.h \
-    $$PWD/qperformancetimer_p.h
+    $$PWD/qperformancetimer_p.h \
+    $$PWD/qintrusivelist_p.h \
 
 QT += sql
 include(parser/parser.pri)
 include(rewriter/rewriter.pri)
+include(v4/v4.pri)
 
 # mirrors logic in corelib/kernel/kernel.pri
 unix:!symbian: contains(QT_CONFIG, clock-gettime):include($$QT_SOURCE_TREE/config.tests/unix/clock-gettime/clock-gettime.pri)
diff --git a/src/declarative/qml/v4/qdeclarativev4bindings.cpp b/src/declarative/qml/v4/qdeclarativev4bindings.cpp
new file mode 100644
index 0000000000..80c7a68697
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4bindings.cpp
@@ -0,0 +1,1530 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// #define REGISTER_CLEANUP_DEBUG
+
+#include "private/qdeclarativev4bindings_p.h"
+#include "private/qdeclarativev4program_p.h"
+#include "private/qdeclarativev4compiler_p.h"
+
+#include <private/qdeclarativefastproperties_p.h>
+#include <private/qdeclarativedebugtrace_p.h>
+#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
+#include <private/qsganchors_p_p.h> // For AnchorLine
+
+#include <QtDeclarative/qdeclarativeinfo.h>
+#include <QtCore/qnumeric.h>
+#include <QtCore/qmath.h>
+#include <math.h> // ::fmod
+
+QT_BEGIN_NAMESPACE
+
+using namespace QDeclarativeJS;
+
+namespace {
+struct Register {
+    typedef QDeclarativeRegisterType Type;
+
+    void setUndefined() { dataType = UndefinedType; }
+    void setNaN() { setqreal(qSNaN()); }
+    bool isUndefined() const { return dataType == UndefinedType; }
+
+    void setQObject(QObject *o) { *((QObject **)data) = o; dataType = QObjectStarType; }
+    QObject *getQObject() const { return *((QObject **)data); }
+
+    void setqreal(qreal v) { *((qreal *)data) = v; dataType = QRealType; }
+    qreal getqreal() const { return *((qreal *)data); }
+    qreal &getqrealref() const { return *((qreal *)data); }
+
+    void setint(int v) { *((int *)data) = v; dataType = IntType; }
+    int getint() const { return *((int *)data); }
+    int &getintref() const { return *((int *)data); }
+
+    void setbool(bool v) { *((bool *)data) = v; dataType = BoolType; }
+    bool getbool() const { return *((bool *)data); }
+    bool &getboolref() const { return *((bool *)data); }
+
+    QVariant *getvariantptr() { return (QVariant *)typeDataPtr(); }
+    QString *getstringptr() { return (QString *)typeDataPtr(); }
+    QUrl *geturlptr() { return (QUrl *)typeDataPtr(); }
+    const QVariant *getvariantptr() const { return (QVariant *)typeDataPtr(); }
+    const QString *getstringptr() const { return (QString *)typeDataPtr(); }
+    const QUrl *geturlptr() const { return (QUrl *)typeDataPtr(); }
+
+    void *typeDataPtr() { return (void *)&data; }
+    void *typeMemory() { return (void *)data; }
+    const void *typeDataPtr() const { return (void *)&data; }
+    const void *typeMemory() const { return (void *)data; }
+
+    Type gettype() const { return dataType; }
+    void settype(Type t) { dataType = t; }
+
+    // int type;          // Optional type
+
+    Type dataType;     // Type of data
+    void *data[2];     // Object stored here
+
+    inline void cleanup();
+    inline void cleanupString();
+    inline void cleanupUrl();
+    inline void cleanupVariant();
+
+    inline void copy(const Register &other);
+    inline void init(Type type);
+#ifdef REGISTER_CLEANUP_DEBUG
+    Register() {
+        type = 0;
+    }
+
+    ~Register() {
+        if (dataType >= FirstCleanupType)
+            qWarning("Register leaked of type %d", dataType);
+    }
+#endif
+};
+
+void Register::cleanup()
+{
+    if (dataType >= FirstCleanupType) {
+        if (dataType == QStringType) {
+            getstringptr()->~QString();
+        } else if (dataType == QUrlType) {
+            geturlptr()->~QUrl();
+        } else if (dataType == QVariantType) {
+            getvariantptr()->~QVariant();
+        }
+    }
+    setUndefined();
+}
+
+void Register::cleanupString()
+{
+    getstringptr()->~QString();
+    setUndefined();
+}
+
+void Register::cleanupUrl()
+{
+    geturlptr()->~QUrl();
+    setUndefined();
+}
+
+void Register::cleanupVariant()
+{
+    getvariantptr()->~QVariant();
+    setUndefined();
+}
+
+void Register::copy(const Register &other)
+{
+    *this = other;
+    if (other.dataType >= FirstCleanupType) {
+        if (other.dataType == QStringType) 
+            new (getstringptr()) QString(*other.getstringptr());
+        else if (other.dataType == QUrlType)
+            new (geturlptr()) QUrl(*other.geturlptr());
+        else if (other.dataType == QVariantType)
+            new (getvariantptr()) QVariant(*other.getvariantptr());
+    } 
+}
+
+void Register::init(Type type)
+{
+    dataType = type;
+    if (dataType >= FirstCleanupType) {
+        if (dataType == QStringType) 
+            new (getstringptr()) QString();
+        else if (dataType == QUrlType)
+            new (geturlptr()) QUrl();
+        else if (dataType == QVariantType)
+            new (getvariantptr()) QVariant();
+    }
+}
+
+} // end of anonymous namespace
+
+class QDeclarativeV4BindingsPrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QDeclarativeV4Bindings)
+
+public:
+    QDeclarativeV4BindingsPrivate();
+    virtual ~QDeclarativeV4BindingsPrivate();
+
+    struct Binding : public QDeclarativeAbstractBinding, public QDeclarativeDelayedError {
+        Binding() : enabled(false), updating(0), property(0),
+                    scope(0), target(0), executedBlocks(0), parent(0) {}
+
+        // Inherited from QDeclarativeAbstractBinding
+        virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags flags);
+        virtual void update(QDeclarativePropertyPrivate::WriteFlags flags);
+        virtual void destroy();
+
+        int index:30;
+        bool enabled:1;
+        bool updating:1;
+        int property;
+        QObject *scope;
+        QObject *target;
+        quint32 executedBlocks;
+
+        QDeclarativeV4BindingsPrivate *parent;
+    };
+
+    typedef QDeclarativeNotifierEndpoint Subscription;
+    Subscription *subscriptions;
+    QScriptDeclarativeClass::PersistentIdentifier *identifiers;
+
+    void run(Binding *, QDeclarativePropertyPrivate::WriteFlags flags);
+
+    QDeclarativeV4Program *program;
+    Binding *bindings;
+
+    static int methodCount;
+
+    void init();
+    void run(int instr, quint32 &executedBlocks, QDeclarativeContextData *context,
+             QDeclarativeDelayedError *error, QObject *scope, QObject *output, 
+             QDeclarativePropertyPrivate::WriteFlags storeFlags
+#ifdef QML_THREADED_INTERPRETER
+             , void ***decode_instr = 0
+#endif
+             );
+
+
+    inline void unsubscribe(int subIndex);
+    inline void subscribeId(QDeclarativeContextData *p, int idIndex, int subIndex);
+    inline void subscribe(QObject *o, int notifyIndex, int subIndex);
+
+    inline static qint32 toInt32(qsreal n);
+    static const qsreal D32;
+    static quint32 toUint32(qsreal n);
+};
+
+QDeclarativeV4BindingsPrivate::QDeclarativeV4BindingsPrivate()
+: subscriptions(0), identifiers(0), program(0), bindings(0)
+{
+}
+
+QDeclarativeV4BindingsPrivate::~QDeclarativeV4BindingsPrivate()
+{
+    delete [] subscriptions; subscriptions = 0;
+    delete [] identifiers; identifiers = 0;
+}
+
+int QDeclarativeV4BindingsPrivate::methodCount = -1;
+
+QDeclarativeV4Bindings::QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context)
+: QObject(*(new QDeclarativeV4BindingsPrivate))
+{
+    Q_D(QDeclarativeV4Bindings);
+
+    if (d->methodCount == -1)
+        d->methodCount = QDeclarativeV4Bindings::staticMetaObject.methodCount();
+
+    d->program = (QDeclarativeV4Program *)program;
+
+    if (program) {
+        d->init();
+
+        QDeclarativeAbstractExpression::setContext(context);
+    }
+}
+
+QDeclarativeV4Bindings::~QDeclarativeV4Bindings()
+{
+    Q_D(QDeclarativeV4Bindings);
+
+    delete [] d->bindings;
+}
+
+QDeclarativeAbstractBinding *QDeclarativeV4Bindings::configBinding(int index, QObject *target, 
+                                                        QObject *scope, int property)
+{
+    Q_D(QDeclarativeV4Bindings);
+
+    QDeclarativeV4BindingsPrivate::Binding *rv = d->bindings + index;
+
+    rv->index = index;
+    rv->property = property;
+    rv->target = target;
+    rv->scope = scope;
+    rv->parent = d;
+
+    addref(); // This is decremented in Binding::destroy()
+
+    return rv;
+}
+
+void QDeclarativeV4BindingsPrivate::Binding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteFlags flags)
+{
+    if (enabled != e) {
+        enabled = e;
+
+        if (e) update(flags);
+    }
+}
+
+void QDeclarativeV4BindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags)
+{
+    QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding);
+    parent->run(this, flags);
+    QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding);
+}
+
+void QDeclarativeV4BindingsPrivate::Binding::destroy()
+{
+    enabled = false;
+    removeFromObject();
+    clear();
+    parent->q_func()->release();
+}
+
+int QDeclarativeV4Bindings::qt_metacall(QMetaObject::Call c, int id, void **)
+{
+    Q_D(QDeclarativeV4Bindings);
+
+    if (c == QMetaObject::InvokeMetaMethod && id >= d->methodCount) {
+        id -= d->methodCount;
+
+        QDeclarativeV4Program::BindingReferenceList *list = d->program->signalTable(id);
+
+        for (quint32 ii = 0; ii < list->count; ++ii) {
+            QDeclarativeV4Program::BindingReference *bindingRef = list->bindings + ii;
+
+            QDeclarativeV4BindingsPrivate::Binding *binding = d->bindings + bindingRef->binding;
+            if (binding->executedBlocks & bindingRef->blockMask)
+                d->run(binding, QDeclarativePropertyPrivate::DontRemoveBinding);
+        }
+    }
+    return -1;
+}
+
+void QDeclarativeV4BindingsPrivate::run(Binding *binding, QDeclarativePropertyPrivate::WriteFlags flags)
+{
+    Q_Q(QDeclarativeV4Bindings);
+
+    if (!binding->enabled)
+        return;
+
+    QDeclarativeContextData *context = q->QDeclarativeAbstractExpression::context();
+    if (!context || !context->isValid()) 
+        return;
+
+    if (binding->updating) {
+        QString name;
+        if (binding->property & 0xFFFF0000) {
+            QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context->engine);
+
+            QDeclarativeValueType *vt = ep->valueTypes[(binding->property >> 16) & 0xFF];
+            Q_ASSERT(vt);
+
+            name = QLatin1String(binding->target->metaObject()->property(binding->property & 0xFFFF).name());
+            name.append(QLatin1String("."));
+            name.append(QLatin1String(vt->metaObject()->property(binding->property >> 24).name()));
+        } else {
+            name = QLatin1String(binding->target->metaObject()->property(binding->property).name());
+        }
+        qmlInfo(binding->target) << QCoreApplication::translate("QDeclarativeV4Bindings", "Binding loop detected for property \"%1\"").arg(name);
+        return;
+    }
+
+    binding->updating = true;
+    if (binding->property & 0xFFFF0000) {
+        QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context->engine);
+
+        QDeclarativeValueType *vt = ep->valueTypes[(binding->property >> 16) & 0xFF];
+        Q_ASSERT(vt);
+        vt->read(binding->target, binding->property & 0xFFFF);
+
+        QObject *target = vt;
+        run(binding->index, binding->executedBlocks, context, binding, binding->scope, target, flags);
+
+        vt->write(binding->target, binding->property & 0xFFFF, flags);
+    } else {
+        run(binding->index, binding->executedBlocks, context, binding, binding->scope, binding->target, flags);
+    }
+    binding->updating = false;
+}
+
+
+void QDeclarativeV4BindingsPrivate::unsubscribe(int subIndex)
+{
+    QDeclarativeV4BindingsPrivate::Subscription *sub = (subscriptions + subIndex);
+    sub->disconnect();
+}
+
+void QDeclarativeV4BindingsPrivate::subscribeId(QDeclarativeContextData *p, int idIndex, int subIndex)
+{
+    Q_Q(QDeclarativeV4Bindings);
+
+    unsubscribe(subIndex);
+
+    if (p->idValues[idIndex]) {
+        QDeclarativeV4BindingsPrivate::Subscription *sub = (subscriptions + subIndex);
+        sub->target = q;
+        sub->targetMethod = methodCount + subIndex;
+        sub->connect(&p->idValues[idIndex].bindings);
+    }
+}
+ 
+void QDeclarativeV4BindingsPrivate::subscribe(QObject *o, int notifyIndex, int subIndex)
+{
+    Q_Q(QDeclarativeV4Bindings);
+
+    QDeclarativeV4BindingsPrivate::Subscription *sub = (subscriptions + subIndex);
+    sub->target = q;
+    sub->targetMethod = methodCount + subIndex; 
+    if (o)
+        sub->connect(o, notifyIndex);
+    else
+        sub->disconnect();
+}
+
+// Conversion functions - these MUST match the QtScript expression path
+inline static qreal toReal(Register *reg, int type, bool *ok = 0)
+{
+    if (ok) *ok = true;
+
+    if (type == QMetaType::QReal) {
+        return reg->getqreal();
+    } else if (type == qMetaTypeId<QVariant>()) {
+        return reg->getvariantptr()->toReal();
+    } else {
+        if (ok) *ok = false;
+        return 0;
+    }
+}
+
+inline static QString toString(Register *reg, int type, bool *ok = 0)
+{
+    if (ok) *ok = true;
+
+    if (type == QMetaType::QReal) {
+        return QString::number(reg->getqreal());
+    } else if (type == QMetaType::Int) {
+        return QString::number(reg->getint());
+    } else if (type == qMetaTypeId<QVariant>()) {
+        return reg->getvariantptr()->toString();
+    } else if (type == QMetaType::QString) {
+        return *reg->getstringptr();
+    } else {
+        if (ok) *ok = false;
+        return QString();
+    }
+}
+
+inline static bool toBool(Register *reg, int type, bool *ok = 0)
+{
+    if (ok) *ok = true;
+
+    if (type == QMetaType::Bool) {
+        return reg->getbool();
+    } else if (type == qMetaTypeId<QVariant>()) {
+        return reg->getvariantptr()->toBool();
+    } else {
+        if (ok) *ok = false;
+        return false;
+    }
+}
+
+inline static QUrl toUrl(Register *reg, int type, QDeclarativeContextData *context, bool *ok = 0)
+{
+    if (ok) *ok = true;
+
+    QUrl base;
+    if (type == qMetaTypeId<QVariant>()) {
+        QVariant *var = reg->getvariantptr();
+        int vt = var->type();
+        if (vt == QVariant::Url) {
+            base = var->toUrl();
+        } else if (vt == QVariant::ByteArray) {
+            base = QUrl(QString::fromUtf8(var->toByteArray()));
+        } else if (vt == QVariant::String) {
+            base = QUrl(var->toString());
+        } else {
+            if (ok) *ok = false;
+            return QUrl();
+        }
+    } else if (type == QMetaType::QString) {
+        base = QUrl(*reg->getstringptr());
+    } else {
+        if (ok) *ok = false;
+        return QUrl();
+    }
+
+    if (!base.isEmpty() && base.isRelative())
+        return context->url.resolved(base);
+    else
+        return base;
+}
+
+static QObject *variantToQObject(const QVariant &value, bool *ok)
+{
+    if (ok) *ok = true;
+
+    if (value.userType() == QMetaType::QObjectStar) {
+        return qvariant_cast<QObject*>(value);
+    } else {
+        if (ok) *ok = false;
+        return 0;
+    }
+}
+
+void QDeclarativeV4BindingsPrivate::init()
+{
+    if (program->subscriptions)
+        subscriptions = new QDeclarativeV4BindingsPrivate::Subscription[program->subscriptions];
+    if (program->identifiers)
+        identifiers = new QScriptDeclarativeClass::PersistentIdentifier[program->identifiers];
+
+    bindings = new QDeclarativeV4BindingsPrivate::Binding[program->bindings];
+}
+
+static bool testCompareVariants(const QVariant &qtscriptRaw, const QVariant &v4)
+{
+    QVariant qtscript = qtscriptRaw;
+
+    if (qtscript.userType() == v4.userType()) {
+    } else if (qtscript.canConvert((QVariant::Type)v4.userType())) {
+        qtscript.convert((QVariant::Type)v4.userType());
+    } else if (qtscript.userType() == QVariant::Invalid && v4.userType() == QMetaType::QObjectStar) {
+        qtscript = qVariantFromValue<QObject *>(0);
+    } else {
+        return false;
+    }
+
+    int type = qtscript.userType();
+    
+    if (type == qMetaTypeId<QDeclarativeAnchorLine>()) {
+        QDeclarativeAnchorLine la = qvariant_cast<QDeclarativeAnchorLine>(qtscript);
+        QDeclarativeAnchorLine ra = qvariant_cast<QDeclarativeAnchorLine>(v4);
+
+        return la == ra;
+    } else if (type == qMetaTypeId<QSGAnchorLine>()) {
+        QSGAnchorLine la = qvariant_cast<QSGAnchorLine>(qtscript);
+        QSGAnchorLine ra = qvariant_cast<QSGAnchorLine>(v4);
+
+        return la == ra;
+    } else if (type == QMetaType::Double) {
+
+        double la = qvariant_cast<double>(qtscript);
+        double lr = qvariant_cast<double>(v4);
+
+        return la == lr || (qIsNaN(la) && qIsNaN(lr));
+
+    } else if (type == QMetaType::Float) {
+
+        float la = qvariant_cast<float>(qtscript);
+        float lr = qvariant_cast<float>(v4);
+
+        return la == lr || (qIsNaN(la) && qIsNaN(lr));
+
+    } else {
+        return qtscript == v4;
+    }
+}
+
+QByteArray testResultToString(const QVariant &result, bool undefined)
+{
+    if (undefined) {
+        return "undefined";
+    } else {
+        QString rv;
+        QDebug d(&rv);
+        d << result;
+        return rv.toUtf8();
+    }
+}
+
+static void testBindingResult(const QString &binding, int line, int column, 
+                              QDeclarativeContextData *context, QObject *scope, 
+                              const Register &result, int resultType)
+{
+    QDeclarativeExpression expression(context->asQDeclarativeContext(), scope, binding);
+    bool isUndefined = false;
+    QVariant value = expression.evaluate(&isUndefined);
+
+    bool iserror = false;
+    QByteArray qtscriptResult;
+    QByteArray v4Result;
+
+    if (expression.hasError()) {
+        iserror = true;
+        qtscriptResult = "exception";
+    } else {
+        qtscriptResult = testResultToString(value, isUndefined);
+    }
+
+    if (isUndefined && result.isUndefined()) {
+        return;
+    } else if(isUndefined != result.isUndefined()) {
+        iserror = true;
+    } 
+    
+    QVariant v4value;
+    if (!result.isUndefined()) {
+        switch (resultType) {
+        case QMetaType::QString:
+            v4value = *result.getstringptr();
+            break;
+        case QMetaType::QUrl:
+            v4value = *result.geturlptr();
+            break;
+        case QMetaType::QObjectStar:
+            v4value = qVariantFromValue<QObject *>(result.getQObject());
+            break;
+        case QMetaType::Bool:
+            v4value = result.getbool();
+            break;
+        case QMetaType::Int:
+            v4value = result.getint();
+            break;
+        case QMetaType::QReal:
+            v4value = result.getqreal();
+            break;
+        default:
+            if (resultType == qMetaTypeId<QDeclarativeAnchorLine>()) {
+                v4value = qVariantFromValue<QDeclarativeAnchorLine>(*(QDeclarativeAnchorLine *)result.typeDataPtr());
+            } else if (resultType == qMetaTypeId<QSGAnchorLine>()) {
+                v4value = qVariantFromValue<QSGAnchorLine>(*(QSGAnchorLine *)result.typeDataPtr());
+            } else {
+                iserror = true;
+                v4Result = "Unknown V4 type";
+            }
+        }
+    }
+    if (v4Result.isEmpty())
+        v4Result = testResultToString(v4value, result.isUndefined());
+
+    if (!testCompareVariants(value, v4value)) 
+        iserror = true;
+
+    if (iserror) {
+        qWarning().nospace() << "QDeclarativeV4: Optimization error @" << context->url.toString().toUtf8().constData() << ":" << line << ":" << column;
+
+        qWarning().nospace() << "    Binding:  " << binding;
+        qWarning().nospace() << "    QtScript: " << qtscriptResult.constData();
+        qWarning().nospace() << "    V4:       " << v4Result.constData();
+    }
+}
+
+static void testBindingException(const QString &binding, int line, int column, 
+                                 QDeclarativeContextData *context, QObject *scope)
+{
+    QDeclarativeExpression expression(context->asQDeclarativeContext(), scope, binding);
+    bool isUndefined = false;
+    QVariant value = expression.evaluate(&isUndefined);
+
+    if (!expression.hasError()) {
+        QByteArray qtscriptResult = testResultToString(value, isUndefined);
+        qWarning().nospace() << "QDeclarativeV4: Optimization error @" << context->url.toString().toUtf8().constData() << ":" << line << ":" << column;
+        qWarning().nospace() << "    Binding:  " << binding;
+        qWarning().nospace() << "    QtScript: " << qtscriptResult.constData();
+        qWarning().nospace() << "    V4:       exception";
+    }
+}
+
+static void throwException(int id, QDeclarativeDelayedError *error, 
+                           QDeclarativeV4Program *program, QDeclarativeContextData *context,
+                           const QString &description = QString())
+{
+    error->error.setUrl(context->url);
+    if (description.isEmpty())
+        error->error.setDescription(QLatin1String("TypeError: Result of expression is not an object"));
+    else
+        error->error.setDescription(description);
+    if (id != 0xFF) {
+        quint64 e = *((quint64 *)(program->data() + program->exceptionDataOffset) + id); 
+        error->error.setLine((e >> 32) & 0xFFFFFFFF);
+        error->error.setColumn(e & 0xFFFFFFFF); 
+    } else {
+        error->error.setLine(-1);
+        error->error.setColumn(-1);
+    }
+    if (!context->engine || !error->addError(QDeclarativeEnginePrivate::get(context->engine)))
+        QDeclarativeEnginePrivate::warning(context->engine, error->error);
+}
+
+const qsreal QDeclarativeV4BindingsPrivate::D32 = 4294967296.0;
+
+qint32 QDeclarativeV4BindingsPrivate::toInt32(qsreal n)
+{
+    if (qIsNaN(n) || qIsInf(n) || (n == 0))
+        return 0;
+
+    double sign = (n < 0) ? -1.0 : 1.0;
+    qsreal abs_n = fabs(n);
+
+    n = ::fmod(sign * ::floor(abs_n), D32);
+    const double D31 = D32 / 2.0;
+
+    if (sign == -1 && n < -D31)
+        n += D32;
+
+    else if (sign != -1 && n >= D31)
+        n -= D32;
+
+    return qint32 (n);
+}
+
+inline quint32 QDeclarativeV4BindingsPrivate::toUint32(qsreal n)
+{
+    if (qIsNaN(n) || qIsInf(n) || (n == 0))
+        return 0;
+
+    double sign = (n < 0) ? -1.0 : 1.0;
+    qsreal abs_n = fabs(n);
+
+    n = ::fmod(sign * ::floor(abs_n), D32);
+
+    if (n < 0)
+        n += D32;
+
+    return quint32 (n);
+}
+
+#define THROW_EXCEPTION_STR(id, str) { \
+    if (testBinding) testBindingException(*testBindingSource, bindingLine, bindingColumn, context, scope); \
+    throwException((id), error, program, context, (str)); \
+    goto exceptionExit; \
+} 
+
+#define THROW_EXCEPTION(id) THROW_EXCEPTION_STR(id, QString())
+
+#define MARK_REGISTER(reg) cleanupRegisterMask |= (1 << (reg))
+#define MARK_CLEAN_REGISTER(reg) cleanupRegisterMask &= ~(1 << (reg))
+
+#define STRING_REGISTER(reg) { \
+    registers[(reg)].settype(QStringType); \
+    MARK_REGISTER(reg); \
+}
+
+#define URL_REGISTER(reg) { \
+    registers[(reg)].settype(QUrlType); \
+    MARK_REGISTER(reg); \
+}
+
+#define VARIANT_REGISTER(reg) { \
+    registers[(reg)].settype(QVariantType); \
+    MARK_REGISTER(reg); \
+}
+
+#ifdef QML_THREADED_INTERPRETER
+void **QDeclarativeV4Bindings::getDecodeInstrTable()
+{
+    static void **decode_instr;
+    if (!decode_instr) {
+        QDeclarativeV4Bindings dummy(0, 0);
+        quint32 executedBlocks = 0;
+        dummy.d_func()->run(0, executedBlocks, 0, 0, 0, 0, QDeclarativePropertyPrivate::BypassInterceptor, &decode_instr);
+    }
+    return decode_instr;
+}
+#endif
+
+void QDeclarativeV4BindingsPrivate::run(int instrIndex, quint32 &executedBlocks,
+                                        QDeclarativeContextData *context, QDeclarativeDelayedError *error,
+                                        QObject *scope, QObject *output, QDeclarativePropertyPrivate::WriteFlags storeFlags
+#ifdef QML_THREADED_INTERPRETER
+                                        ,void ***table
+#endif
+                                        )
+{
+    Q_Q(QDeclarativeV4Bindings);
+
+#ifdef QML_THREADED_INTERPRETER
+    if (table) {
+        static void *decode_instr[] = {
+            FOR_EACH_QML_INSTR(QML_INSTR_ADDR)
+        };
+
+        *table = decode_instr;
+        return;
+    }
+#endif
+
+
+    error->removeError();
+
+    Register registers[32];
+    quint32 cleanupRegisterMask = 0;
+
+    executedBlocks = 0;
+
+    QDeclarativeEnginePrivate *engine = QDeclarativeEnginePrivate::get(context->engine);
+    const char *code = program->instructions();
+    code += instrIndex * QML_INSTR_SIZE(Jump, jump);
+    const Instr *instr = (const Instr *) code;
+
+    const char *data = program->data();
+
+    QString *testBindingSource = 0;
+    bool testBinding = false;
+    int bindingLine = 0;
+    int bindingColumn = 0;
+
+#ifdef QML_THREADED_INTERPRETER
+    goto *instr->common.code;
+#else
+    for (;;) {
+        switch (instr->common.type) {
+#endif
+
+    QML_BEGIN_INSTR(Noop, common)
+    QML_END_INSTR(Noop, common)
+
+    QML_BEGIN_INSTR(BindingId, id)
+        bindingLine = instr->id.line;
+        bindingColumn = instr->id.column;
+    QML_END_INSTR(BindingId, id)
+
+    QML_BEGIN_INSTR(SubscribeId, subscribeop)
+        subscribeId(context, instr->subscribeop.index, instr->subscribeop.offset);
+    QML_END_INSTR(SubscribeId, subscribeop)
+
+    QML_BEGIN_INSTR(Subscribe, subscribeop)
+    {
+        QObject *o = 0;
+        const Register &object = registers[instr->subscribeop.reg];
+        if (!object.isUndefined()) o = object.getQObject();
+        subscribe(o, instr->subscribeop.index, instr->subscribeop.offset);
+    }
+    QML_END_INSTR(Subscribe, subscribeop)
+
+    QML_BEGIN_INSTR(FetchAndSubscribe, fetchAndSubscribe)
+    {
+        Register &reg = registers[instr->fetchAndSubscribe.reg];
+
+        if (reg.isUndefined()) 
+            THROW_EXCEPTION(instr->fetchAndSubscribe.exceptionId);
+
+        QObject *object = reg.getQObject();
+        if (!object) {
+            reg.setUndefined();
+        } else {
+            int subIdx = instr->fetchAndSubscribe.subscription;
+            QDeclarativeV4BindingsPrivate::Subscription *sub = 0;
+            if (subIdx != -1) {
+                sub = (subscriptions + subIdx);
+                sub->target = q;
+                sub->targetMethod = methodCount + subIdx;
+            }
+            reg.init((Register::Type)instr->fetchAndSubscribe.valueType);
+            if (instr->fetchAndSubscribe.valueType >= FirstCleanupType)
+                MARK_REGISTER(instr->fetchAndSubscribe.reg);
+            QDeclarativeV4Compiler::fastPropertyAccessor()->accessor(instr->fetchAndSubscribe.function)(object, reg.typeDataPtr(), sub);
+        }
+    }
+    QML_END_INSTR(FetchAndSubscribe, fetchAndSubscribe)
+
+    QML_BEGIN_INSTR(LoadId, load)
+        registers[instr->load.reg].setQObject(context->idValues[instr->load.index].data());
+    QML_END_INSTR(LoadId, load)
+
+    QML_BEGIN_INSTR(LoadScope, load)
+        registers[instr->load.reg].setQObject(scope);
+    QML_END_INSTR(LoadScope, load)
+
+    QML_BEGIN_INSTR(LoadRoot, load)
+        registers[instr->load.reg].setQObject(context->contextObject);
+    QML_END_INSTR(LoadRoot, load)
+
+    QML_BEGIN_INSTR(LoadAttached, attached)
+    {
+        const Register &input = registers[instr->attached.reg];
+        Register &output = registers[instr->attached.output];
+        if (input.isUndefined()) 
+            THROW_EXCEPTION(instr->attached.exceptionId);
+
+        QObject *object = registers[instr->attached.reg].getQObject();
+        if (!object) {
+            output.setUndefined();
+        } else {
+            QObject *attached = qmlAttachedPropertiesObjectById(instr->attached.id, input.getQObject(), true);
+            Q_ASSERT(attached);
+            output.setQObject(attached);
+        }
+    }
+    QML_END_INSTR(LoadAttached, attached)
+
+    QML_BEGIN_INSTR(UnaryNot, unaryop)
+    {
+        registers[instr->unaryop.output].setbool(!registers[instr->unaryop.src].getbool());
+    }
+    QML_END_INSTR(UnaryNot, unaryop)
+
+    QML_BEGIN_INSTR(UnaryMinusReal, unaryop)
+    {
+        registers[instr->unaryop.output].setqreal(-registers[instr->unaryop.src].getqreal());
+    }
+    QML_END_INSTR(UnaryMinusReal, unaryop)
+
+    QML_BEGIN_INSTR(UnaryMinusInt, unaryop)
+    {
+        registers[instr->unaryop.output].setint(-registers[instr->unaryop.src].getint());
+    }
+    QML_END_INSTR(UnaryMinusInt, unaryop)
+
+    QML_BEGIN_INSTR(UnaryPlusReal, unaryop)
+    {
+        registers[instr->unaryop.output].setqreal(+registers[instr->unaryop.src].getqreal());
+    }
+    QML_END_INSTR(UnaryPlusReal, unaryop)
+
+    QML_BEGIN_INSTR(UnaryPlusInt, unaryop)
+    {
+        registers[instr->unaryop.output].setint(+registers[instr->unaryop.src].getint());
+    }
+    QML_END_INSTR(UnaryPlusInt, unaryop)
+
+    QML_BEGIN_INSTR(ConvertBoolToInt, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setint(src.getbool());
+    }
+    QML_END_INSTR(ConvertBoolToInt, unaryop)
+
+    QML_BEGIN_INSTR(ConvertBoolToReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setqreal(src.getbool());
+    }
+    QML_END_INSTR(ConvertBoolToReal, unaryop)
+
+    QML_BEGIN_INSTR(ConvertBoolToString, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else { 
+            new (output.getstringptr()) QString(QLatin1String(src.getbool() ? "true" : "false"));
+            STRING_REGISTER(instr->unaryop.output);
+        }
+    }
+    QML_END_INSTR(ConvertBoolToString, unaryop)
+
+    QML_BEGIN_INSTR(ConvertIntToBool, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setbool(src.getint());
+    }
+    QML_END_INSTR(ConvertIntToBool, unaryop)
+
+    QML_BEGIN_INSTR(ConvertIntToReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setqreal(qreal(src.getint()));
+    }
+    QML_END_INSTR(ConvertIntToReal, unaryop)
+
+    QML_BEGIN_INSTR(ConvertIntToString, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else { 
+            new (output.getstringptr()) QString(QString::number(src.getint()));
+            STRING_REGISTER(instr->unaryop.output);
+        }
+    }
+    QML_END_INSTR(ConvertIntToString, unaryop)
+
+    QML_BEGIN_INSTR(ConvertRealToBool, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setbool(src.getqreal() != 0);
+    }
+    QML_END_INSTR(ConvertRealToBool, unaryop)
+
+    QML_BEGIN_INSTR(ConvertRealToInt, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setint(toInt32(src.getqreal()));
+    }
+    QML_END_INSTR(ConvertRealToInt, unaryop)
+
+    QML_BEGIN_INSTR(ConvertRealToString, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        // ### NaN
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else {
+            new (output.getstringptr()) QString(QString::number(src.getqreal()));
+            STRING_REGISTER(instr->unaryop.output);
+        }
+    }
+    QML_END_INSTR(ConvertRealToString, unaryop)
+
+    QML_BEGIN_INSTR(ConvertStringToBool, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        // ### NaN
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else {
+            // Delegate the conversion. This is pretty fast and it doesn't require a QScriptEngine.
+            // Ideally we should just call the methods in the QScript namespace directly.
+            QScriptValue tmp(*src.getstringptr());
+            if (instr->unaryop.src == instr->unaryop.output) {
+                output.cleanupString();
+                MARK_CLEAN_REGISTER(instr->unaryop.output);
+            }
+            output.setbool(tmp.toBool());
+        }
+    }
+    QML_END_INSTR(ConvertStringToBool, unaryop)
+
+    QML_BEGIN_INSTR(ConvertStringToInt, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        // ### NaN
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else {
+            // Delegate the conversion. This is pretty fast and it doesn't require a QScriptEngine.
+            // Ideally we should just call the methods in the QScript namespace directly.
+            QScriptValue tmp(*src.getstringptr());
+            if (instr->unaryop.src == instr->unaryop.output) {
+                output.cleanupString();
+                MARK_CLEAN_REGISTER(instr->unaryop.output);
+            }
+            output.setint(tmp.toInt32());
+        }
+    }
+    QML_END_INSTR(ConvertStringToInt, unaryop)
+
+    QML_BEGIN_INSTR(ConvertStringToReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        // ### NaN
+        if (src.isUndefined()) {
+            output.setUndefined();
+        } else {
+            // Delegate the conversion. This is pretty fast and it doesn't require a QScriptEngine.
+            // Ideally we should just call the methods in the QScript namespace directly.
+            QScriptValue tmp(*src.getstringptr());
+            if (instr->unaryop.src == instr->unaryop.output) {
+                output.cleanupString();
+                MARK_CLEAN_REGISTER(instr->unaryop.output);
+            }
+            output.setqreal(tmp.toNumber());
+        }
+    }
+    QML_END_INSTR(ConvertStringToReal, unaryop)
+
+    QML_BEGIN_INSTR(MathSinReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setqreal(qSin(src.getqreal()));
+    }
+    QML_END_INSTR(MathSinReal, unaryop)
+
+    QML_BEGIN_INSTR(MathCosReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setqreal(qCos(src.getqreal()));
+    }
+    QML_END_INSTR(MathCosReal, unaryop)
+
+    QML_BEGIN_INSTR(MathRoundReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setint(qRound(src.getqreal()));
+    }
+    QML_END_INSTR(MathRoundReal, unaryop)
+
+    QML_BEGIN_INSTR(MathFloorReal, unaryop)
+    {
+        const Register &src = registers[instr->unaryop.src];
+        Register &output = registers[instr->unaryop.output];
+        if (src.isUndefined()) output.setUndefined();
+        else output.setint(qFloor(src.getqreal()));
+    }
+    QML_END_INSTR(MathFloorReal, unaryop)
+
+    QML_BEGIN_INSTR(MathPIReal, unaryop)
+    {
+        static const qsreal qmlPI = 2.0 * qAsin(1.0);
+        Register &output = registers[instr->unaryop.output];
+        output.setqreal(qmlPI);
+    }
+    QML_END_INSTR(MathPIReal, unaryop)
+
+    QML_BEGIN_INSTR(Real, real_value)
+        registers[instr->real_value.reg].setqreal(instr->real_value.value);
+    QML_END_INSTR(Real, real_value)
+
+    QML_BEGIN_INSTR(Int, int_value)
+        registers[instr->int_value.reg].setint(instr->int_value.value);
+    QML_END_INSTR(Int, int_value)
+
+    QML_BEGIN_INSTR(Bool, bool_value)
+        registers[instr->bool_value.reg].setbool(instr->bool_value.value);
+    QML_END_INSTR(Bool, bool_value)
+
+    QML_BEGIN_INSTR(String, string_value)
+    {
+        Register &output = registers[instr->string_value.reg];
+        QChar *string = (QChar *)(data + instr->string_value.offset);
+        new (output.getstringptr()) QString(string, instr->string_value.length);
+        STRING_REGISTER(instr->string_value.reg);
+    }
+    QML_END_INSTR(String, string_value)
+
+    QML_BEGIN_INSTR(EnableV4Test, string_value)
+    {
+        testBindingSource = new QString((QChar *)(data + instr->string_value.offset), instr->string_value.length);
+        testBinding = true;
+    }
+    QML_END_INSTR(String, string_value)
+
+    QML_BEGIN_INSTR(BitAndInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint(registers[instr->binaryop.left].getint() & 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(BitAndInt, binaryop)
+
+    QML_BEGIN_INSTR(BitOrInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint(registers[instr->binaryop.left].getint() | 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(BitAndInt, binaryop)
+
+    QML_BEGIN_INSTR(BitXorInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint(registers[instr->binaryop.left].getint() ^ 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(BitXorInt, binaryop)
+
+    QML_BEGIN_INSTR(AddReal, binaryop)
+    {
+        registers[instr->binaryop.output].setqreal(registers[instr->binaryop.left].getqreal() + 
+                                                   registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(AddReal, binaryop)
+
+    QML_BEGIN_INSTR(AddString, binaryop)
+    {
+        QString &string = *registers[instr->binaryop.output].getstringptr();
+        if (instr->binaryop.output == instr->binaryop.left) {
+            string += registers[instr->binaryop.right].getstringptr();
+        } else {
+            string = *registers[instr->binaryop.left].getstringptr() + 
+                     *registers[instr->binaryop.right].getstringptr();
+        }
+    }
+    QML_END_INSTR(AddString, binaryop)
+
+    QML_BEGIN_INSTR(SubReal, binaryop)
+    {
+        registers[instr->binaryop.output].setqreal(registers[instr->binaryop.left].getqreal() - 
+                                                   registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(SubReal, binaryop)
+
+    QML_BEGIN_INSTR(MulReal, binaryop)
+    {
+        registers[instr->binaryop.output].setqreal(registers[instr->binaryop.left].getqreal() * 
+                                                   registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(MulReal, binaryop)
+
+    QML_BEGIN_INSTR(DivReal, binaryop)
+    {
+        registers[instr->binaryop.output].setqreal(registers[instr->binaryop.left].getqreal() / 
+                                                   registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(DivReal, binaryop)
+
+    QML_BEGIN_INSTR(ModReal, binaryop)
+    {
+        Register &target = registers[instr->binaryop.output];
+        const Register &left = registers[instr->binaryop.left];
+        const Register &right = registers[instr->binaryop.right];
+        if (QMetaType::QReal == QMetaType::Float)
+            target.setqreal(::fmodf(left.getqreal(), right.getqreal()));
+        else
+            target.setqreal(::fmod(left.getqreal(), right.getqreal()));
+    }
+    QML_END_INSTR(ModInt, binaryop)
+
+    QML_BEGIN_INSTR(LShiftInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint(registers[instr->binaryop.left].getint() << 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(LShiftInt, binaryop)
+
+    QML_BEGIN_INSTR(RShiftInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint(registers[instr->binaryop.left].getint() >> 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(RShiftInt, binaryop)
+
+    QML_BEGIN_INSTR(URShiftInt, binaryop)
+    {
+        registers[instr->binaryop.output].setint((unsigned)registers[instr->binaryop.left].getint() >> 
+                                                 registers[instr->binaryop.right].getint());
+    }
+    QML_END_INSTR(URShiftInt, binaryop)
+
+    QML_BEGIN_INSTR(GtReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() > 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(GtReal, binaryop)
+
+    QML_BEGIN_INSTR(LtReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() < 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(LtReal, binaryop)
+
+    QML_BEGIN_INSTR(GeReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() >= 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(GeReal, binaryop)
+
+    QML_BEGIN_INSTR(LeReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() <= 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(LeReal, binaryop)
+
+    QML_BEGIN_INSTR(EqualReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() == 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(EqualReal, binaryop)
+
+    QML_BEGIN_INSTR(NotEqualReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() != 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(NotEqualReal, binaryop)
+
+    QML_BEGIN_INSTR(StrictEqualReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() == 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(StrictEqualReal, binaryop)
+
+    QML_BEGIN_INSTR(StrictNotEqualReal, binaryop)
+    {
+        registers[instr->binaryop.output].setbool(registers[instr->binaryop.left].getqreal() != 
+                                                  registers[instr->binaryop.right].getqreal());
+    }
+    QML_END_INSTR(StrictNotEqualReal, binaryop)
+
+    QML_BEGIN_INSTR(GtString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a > b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(GtString, binaryop)
+
+    QML_BEGIN_INSTR(LtString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a < b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(LtString, binaryop)
+
+    QML_BEGIN_INSTR(GeString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a >= b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(GeString, binaryop)
+
+    QML_BEGIN_INSTR(LeString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a <= b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(LeString, binaryop)
+
+    QML_BEGIN_INSTR(EqualString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a == b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(EqualString, binaryop)
+
+    QML_BEGIN_INSTR(NotEqualString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a != b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(NotEqualString, binaryop)
+
+    QML_BEGIN_INSTR(StrictEqualString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a == b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(StrictEqualString, binaryop)
+
+    QML_BEGIN_INSTR(StrictNotEqualString, binaryop)
+    {
+        const QString &a = *registers[instr->binaryop.left].getstringptr();
+        const QString &b = *registers[instr->binaryop.right].getstringptr();
+        bool result = a != b;
+        if (instr->binaryop.left == instr->binaryop.output) {
+            registers[instr->binaryop.output].cleanupString();
+            MARK_CLEAN_REGISTER(instr->binaryop.output);
+        }
+        registers[instr->binaryop.output].setbool(result);
+    }
+    QML_END_INSTR(StrictNotEqualString, binaryop)
+
+    QML_BEGIN_INSTR(NewString, construct)
+    {
+        Register &output = registers[instr->construct.reg];
+        new (output.getstringptr()) QString;
+        STRING_REGISTER(instr->construct.reg);
+    }
+    QML_END_INSTR(NewString, construct)
+
+    QML_BEGIN_INSTR(NewUrl, construct)
+    {
+        Register &output = registers[instr->construct.reg];
+        new (output.geturlptr()) QUrl;
+        URL_REGISTER(instr->construct.reg);
+    }
+    QML_END_INSTR(NewUrl, construct)
+
+    QML_BEGIN_INSTR(Fetch, fetch)
+    {
+        Register &reg = registers[instr->fetch.reg];
+
+        if (reg.isUndefined()) 
+            THROW_EXCEPTION(instr->fetch.exceptionId);
+
+        QObject *object = reg.getQObject();
+        if (!object) {
+            THROW_EXCEPTION(instr->fetch.exceptionId);
+        } else {
+            reg.init((Register::Type)instr->fetch.valueType);
+            if (instr->fetch.valueType >= FirstCleanupType)
+                MARK_REGISTER(instr->fetch.reg);
+            void *argv[] = { reg.typeDataPtr(), 0 };
+            QMetaObject::metacall(object, QMetaObject::ReadProperty, instr->fetch.index, argv);
+        }
+    }
+    QML_END_INSTR(Fetch, fetch)
+
+    QML_BEGIN_INSTR(TestV4Store, storetest)
+    {
+        Register &data = registers[instr->storetest.reg];
+        testBindingResult(*testBindingSource, bindingLine, bindingColumn, context, 
+                          scope, data, instr->storetest.regType);
+    }
+    QML_END_INSTR(TestV4Store, storetest)
+
+    QML_BEGIN_INSTR(Store, store)
+    {
+        Register &data = registers[instr->store.reg];
+
+        if (data.isUndefined()) 
+            THROW_EXCEPTION_STR(instr->store.exceptionId, QLatin1String("Unable to assign undefined value"));
+
+        int status = -1;
+        void *argv[] = { data.typeDataPtr(), 0, &status, &storeFlags };
+        QMetaObject::metacall(output, QMetaObject::WriteProperty,
+                              instr->store.index, argv);
+
+        goto programExit;
+    }
+    QML_END_INSTR(Store, store)
+
+    QML_BEGIN_INSTR(Copy, copy)
+        registers[instr->copy.reg].copy(registers[instr->copy.src]);
+        if (registers[instr->copy.reg].gettype() >= FirstCleanupType)
+            MARK_REGISTER(instr->copy.reg);
+    QML_END_INSTR(Copy, copy)
+
+    QML_BEGIN_INSTR(Jump, jump)
+        if (instr->jump.reg == -1 || !registers[instr->jump.reg].getbool())
+            code += instr->jump.count;
+    QML_END_INSTR(Jump, jump)
+
+    QML_BEGIN_INSTR(BranchTrue, branchop)
+        if (registers[instr->branchop.reg].getbool())
+            code += instr->branchop.offset;
+    QML_END_INSTR(BranchTrue, branchop)
+
+    QML_BEGIN_INSTR(BranchFalse, branchop)
+        if (! registers[instr->branchop.reg].getbool())
+            code += instr->branchop.offset;
+    QML_END_INSTR(BranchFalse, branchop)
+
+    QML_BEGIN_INSTR(Branch, branchop)
+        code += instr->branchop.offset;
+    QML_END_INSTR(Branch, branchop)
+
+    QML_BEGIN_INSTR(Block, blockop)
+        executedBlocks |= instr->blockop.block;
+    QML_END_INSTR(Block, blockop)
+
+    QML_BEGIN_INSTR(InitString, initstring)
+        if (!identifiers[instr->initstring.offset].identifier) {
+            quint32 len = *(quint32 *)(data + instr->initstring.dataIdx);
+            QChar *strdata = (QChar *)(data + instr->initstring.dataIdx + sizeof(quint32));
+
+            QString str = QString::fromRawData(strdata, len);
+
+            identifiers[instr->initstring.offset] = engine->objectClass->createPersistentIdentifier(str);
+        }
+    QML_END_INSTR(InitString, initstring)
+
+    QML_BEGIN_INSTR(CleanupRegister, cleanup)
+        registers[instr->cleanup.reg].cleanup();
+    QML_END_INSTR(CleanupRegister, cleanup)
+
+#ifdef QML_THREADED_INTERPRETER
+    // nothing to do
+#else
+    default:
+        qFatal("QDeclarativeV4: Unknown instruction %d encountered.", instr->common.type);
+        break;
+    } // switch
+
+    } // while
+#endif
+
+    Q_ASSERT(!"Unreachable code reached");
+
+programExit:
+exceptionExit:
+    delete testBindingSource;
+
+    int reg = 0;
+    while (cleanupRegisterMask) {
+        if (cleanupRegisterMask & 0x1) 
+            registers[reg].cleanup();
+
+        reg++;
+        cleanupRegisterMask >>= 1;
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/v4/qdeclarativev4bindings_p.h b/src/declarative/qml/v4/qdeclarativev4bindings_p.h
new file mode 100644
index 0000000000..9f225b65b6
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4bindings_p.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4BINDINGS_P_H
+#define QDECLARATIVEV4BINDINGS_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "private/qdeclarativeexpression_p.h"
+#include "private/qdeclarativebinding_p.h"
+#include "private/qdeclarativev4instruction_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeV4BindingsPrivate;
+class QDeclarativeV4Bindings : public QObject, 
+                               public QDeclarativeAbstractExpression, 
+                               public QDeclarativeRefCount
+{
+public:
+    QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context);
+    virtual ~QDeclarativeV4Bindings();
+
+    QDeclarativeAbstractBinding *configBinding(int index, QObject *target, QObject *scope, int property);
+
+#ifdef QML_THREADED_INTERPRETER
+    static void **getDecodeInstrTable();
+#endif
+
+protected:
+    int qt_metacall(QMetaObject::Call, int, void **);
+
+private:
+    Q_DISABLE_COPY(QDeclarativeV4Bindings)
+    Q_DECLARE_PRIVATE(QDeclarativeV4Bindings)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4BINDINGS_P_H
+
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler.cpp b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
new file mode 100644
index 0000000000..a7eecce0c9
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
@@ -0,0 +1,1340 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativev4compiler_p.h"
+#include "qdeclarativev4compiler_p_p.h"
+#include "qdeclarativev4program_p.h"
+#include "qdeclarativev4ir_p.h"
+#include "qdeclarativev4irbuilder_p.h"
+
+#include <private/qdeclarativejsast_p.h>
+#include <private/qdeclarativefastproperties_p.h>
+#include <private/qdeclarativejsengine_p.h>
+#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
+#include <private/qsganchors_p_p.h> // For AnchorLine
+
+QT_BEGIN_NAMESPACE
+
+DEFINE_BOOL_CONFIG_OPTION(bindingsDump, QML_BINDINGS_DUMP)
+DEFINE_BOOL_CONFIG_OPTION(qmlDisableOptimizer, QML_DISABLE_OPTIMIZER)
+DEFINE_BOOL_CONFIG_OPTION(qmlExperimental, QML_EXPERIMENTAL)
+DEFINE_BOOL_CONFIG_OPTION(qmlVerboseCompiler, QML_VERBOSE_COMPILER)
+DEFINE_BOOL_CONFIG_OPTION(qmlBindingsTestEnv, QML_BINDINGS_TEST)
+
+Q_GLOBAL_STATIC(QDeclarativeFastProperties, fastProperties)
+
+static bool qmlBindingsTest = false;
+
+using namespace QDeclarativeJS;
+QDeclarativeV4CompilerPrivate::QDeclarativeV4CompilerPrivate()
+: _function(0) , _block(0) , _discarded(false)
+{
+}
+
+//
+// tracing
+//
+void QDeclarativeV4CompilerPrivate::trace(int line, int column)
+{
+    bytecode.clear();
+
+    this->currentReg = _function->tempCount;
+
+    foreach (IR::BasicBlock *bb, _function->basicBlocks) {
+        if (! bb->isTerminated() && (bb->index + 1) < _function->basicBlocks.size())
+            bb->JUMP(_function->basicBlocks.at(bb->index + 1));
+    }
+
+    QVector<IR::BasicBlock *> blocks;
+    trace(&blocks);
+    currentBlockMask = 0x00000001;
+
+
+    for (int i = 0; i < blocks.size(); ++i) {
+        IR::BasicBlock *block = blocks.at(i);
+        IR::BasicBlock *next = i + 1 < blocks.size() ? blocks.at(i + 1) : 0;
+        if (IR::Stmt *terminator = block->terminator()) {
+            if (IR::CJump *cj = terminator->asCJump()) {
+                if (cj->iffalse != next) {
+                    block->i(new IR::Jump(cj->iffalse));
+                }
+            } else if (IR::Jump *j = terminator->asJump()) {
+                if (j->target == next) {
+                    delete block->statements.back();
+                    block->statements.resize(block->statements.size() - 1);
+                }
+            }
+        }
+
+        block->offset = bytecode.size();
+
+        if (bytecode.isEmpty()) {
+            if (qmlBindingsTest || bindingsDump()) {
+                Instr id;
+                id.common.type = Instr::BindingId;
+                id.id.column = column;
+                id.id.line = line;
+                gen(id);
+            }
+
+            if (qmlBindingsTest) {
+                QString str = expression->expression.asScript();
+                QByteArray strdata((const char *)str.constData(), str.length() * sizeof(QChar));
+                int offset = data.count();
+                data += strdata;
+
+                Instr test;
+                test.common.type = Instr::EnableV4Test;
+                test.string_value.reg = 0;
+                test.string_value.offset = offset;
+                test.string_value.length = str.length();
+                gen(test);
+            }
+        }
+
+        bool usic = false;
+        int patchesCount = patches.count();
+        qSwap(usedSubscriptionIdsChanged, usic);
+
+        int blockopIndex = bytecode.size();
+        Instr blockop;
+        blockop.block(currentBlockMask);
+        gen(blockop);
+
+        foreach (IR::Stmt *s, block->statements)
+            s->accept(this);
+
+        qSwap(usedSubscriptionIdsChanged, usic);
+
+        if (usic) {
+            if (currentBlockMask == 0x80000000) {
+                discard();
+                return;
+            }
+            currentBlockMask <<= 1;
+        } else {
+            const int adjust = bytecode.remove(blockopIndex);
+            // Correct patches
+            for (int ii = patchesCount; ii < patches.count(); ++ii) 
+                patches[ii].offset -= adjust;
+        }
+    }
+
+#ifdef DEBUG_IR_STRUCTURE
+    IR::IRDump dump;
+    for (int i = 0; i < blocks.size(); ++i) {
+        dump.basicblock(blocks.at(i));
+    }
+#endif
+
+
+    // back patching
+    foreach (const Patch &patch, patches) {
+        Instr &instr = bytecode[patch.offset];
+        instr.branchop.offset = patch.block->offset - patch.offset - instr.size();
+    }
+
+    patches.clear();
+}
+
+void QDeclarativeV4CompilerPrivate::trace(QVector<IR::BasicBlock *> *blocks)
+{
+    QList<IR::BasicBlock *> todo = QList<IR::BasicBlock *>::fromVector(_function->basicBlocks);
+    while (! todo.isEmpty()) {
+        IR::BasicBlock *block = todo.takeFirst();
+
+        while (! blocks->contains(block)) {
+            blocks->append(block);
+
+            if (IR::Stmt *terminator = block->terminator()) {
+                if (IR::CJump *cj = terminator->asCJump())
+                    block = cj->iffalse;
+                else if (IR::Jump *j = terminator->asJump())
+                    block = j->target;
+            }
+        }
+    }
+}
+
+void QDeclarativeV4CompilerPrivate::traceExpression(IR::Expr *e, quint8 r)
+{
+    if (!e) {
+        discard();
+    } else {
+        qSwap(currentReg, r);
+        e->accept(this);
+        qSwap(currentReg, r);
+    }
+}
+
+//
+// expressions
+//
+void QDeclarativeV4CompilerPrivate::visitConst(IR::Const *e)
+{
+    Instr i;
+    switch (e->type) {
+    case IR::BoolType:
+        i.move_reg_bool(currentReg, e->value);
+        gen(i);
+        break;
+
+    case IR::IntType:
+        i.move_reg_int(currentReg, e->value);
+        gen(i);
+        break;
+
+    case IR::RealType:
+        i.move_reg_qreal(currentReg, e->value);
+        gen(i);
+        break;
+
+    default:
+        if (qmlVerboseCompiler())
+            qWarning() << Q_FUNC_INFO << "unexpected type";
+        discard();
+    }
+}
+
+void QDeclarativeV4CompilerPrivate::visitString(IR::String *e)
+{
+    registerLiteralString(currentReg, e->value);
+}
+
+void QDeclarativeV4CompilerPrivate::visitName(IR::Name *e)
+{
+    if (e->base) {
+        // fetch the object and store it in reg.
+        traceExpression(e->base, currentReg);
+    } else {
+        _subscribeName.clear();
+    }
+
+    if (e->storage == IR::Name::RootStorage) {
+
+        Instr instr;
+        instr.load_root(currentReg);
+        gen(instr);
+
+        if (e->symbol == IR::Name::IdObject) {
+            // The ID is a reference to the root object
+            return;
+        }
+
+    } else if (e->storage == IR::Name::ScopeStorage) {
+
+        Instr instr;
+        instr.load_scope(currentReg);
+        gen(instr);
+
+        _subscribeName << contextName();
+
+    } else if (e->storage == IR::Name::IdStorage) {
+
+        Instr instr;
+        instr.load_id(currentReg, e->index);
+        gen(instr);
+
+        _subscribeName << QLatin1String("$$$ID_") + e->id;
+
+        if (blockNeedsSubscription(_subscribeName)) {
+            Instr sub;
+            sub.subscribeId(currentReg, subscriptionIndex(_subscribeName), instr.load.index);
+            gen(sub);
+        }
+
+        return;
+    } else {
+        // No action needed
+    }
+
+    switch (e->symbol) {
+    case IR::Name::Unbound: 
+    case IR::Name::IdObject: 
+    case IR::Name::Slot:
+    case IR::Name::Object: {
+        Q_ASSERT(!"Unreachable");
+        discard();
+    } break;
+
+    case IR::Name::AttachType: {
+        _subscribeName << e->id;
+
+        Instr attached;
+        attached.common.type = Instr::LoadAttached;
+        attached.attached.output = currentReg;
+        attached.attached.reg = currentReg;
+        attached.attached.exceptionId = exceptionId(e->line, e->column);
+        Q_ASSERT(e->declarativeType->attachedPropertiesId() != -1);
+        attached.attached.id = e->declarativeType->attachedPropertiesId();
+        gen(attached);
+    } break;
+
+    case IR::Name::Property: {
+        _subscribeName << e->id;
+
+        QMetaProperty prop = e->meta->property(e->index);
+        int fastFetchIndex = fastProperties()->accessorIndexForProperty(e->meta, e->index);
+
+        const int propTy = prop.userType();
+        QDeclarativeRegisterType regType;
+
+        switch (propTy) {
+        case QMetaType::QReal:
+            regType = QRealType;
+            break;
+        case QMetaType::Bool:
+            regType = BoolType;
+            break;
+        case QMetaType::Int:
+            regType = IntType;
+            break;
+        case QMetaType::QString:
+            regType = QStringType;
+            break;
+
+        default:
+            if (propTy == qMetaTypeId<QDeclarativeAnchorLine>()) {
+                regType = PODValueType;
+            } else if (propTy == qMetaTypeId<QSGAnchorLine>()) {
+                regType = PODValueType;
+            } else if (QDeclarativeMetaType::isQObject(propTy)) {
+                regType = QObjectStarType;
+            } else {
+                if (qmlVerboseCompiler())
+                    qWarning() << "Discard unsupported property type:" << QMetaType::typeName(propTy);
+                discard(); // Unsupported type
+                return;
+            }
+
+            break;
+        } // switch
+
+        Instr fetch;
+
+        if (fastFetchIndex != -1) {
+            fetch.common.type = Instr::FetchAndSubscribe;
+            fetch.fetchAndSubscribe.reg = currentReg;
+            fetch.fetchAndSubscribe.function = fastFetchIndex;
+            fetch.fetchAndSubscribe.subscription = subscriptionIndex(_subscribeName);
+            fetch.fetchAndSubscribe.exceptionId = exceptionId(e->line, e->column);
+            fetch.fetchAndSubscribe.valueType = regType;
+        } else {
+            if (blockNeedsSubscription(_subscribeName) && prop.hasNotifySignal() && prop.notifySignalIndex() != -1) {
+                Instr sub;
+                sub.subscribe(currentReg, subscriptionIndex(_subscribeName), prop.notifySignalIndex());
+                gen(sub);
+            }
+
+            fetch.common.type = Instr::Fetch;
+            fetch.fetch.reg = currentReg;
+            fetch.fetch.index = e->index;
+            fetch.fetch.exceptionId = exceptionId(e->line, e->column);
+            fetch.fetch.valueType = regType;
+        }
+
+        gen(fetch);
+
+    } break;
+    } // switch
+}
+
+void QDeclarativeV4CompilerPrivate::visitTemp(IR::Temp *e)
+{
+    if (currentReg != e->index) {
+        Instr i;
+        i.move_reg_reg(currentReg, e->index);
+        gen(i);
+    }
+}
+
+void QDeclarativeV4CompilerPrivate::visitUnop(IR::Unop *e)
+{
+    Instr i;
+
+    quint8 src = currentReg;
+    
+    if (IR::Temp *temp = e->expr->asTemp()) {
+        src = temp->index;
+    } else {
+        traceExpression(e->expr, src);
+    }
+
+    switch (e->op) {
+    case IR::OpInvalid:
+        Q_ASSERT(!"unreachable");
+        break;
+
+    case IR::OpIfTrue:
+        if (src != currentReg) {
+            i.move_reg_reg(currentReg, src);
+            gen(i);
+        } else {
+            // nothing to do
+        }
+        break;
+
+    case IR::OpNot:
+        i.unary_not(currentReg, src);
+        gen(i);
+        break;
+
+    case IR::OpUMinus:
+        if (e->expr->type == IR::RealType) {
+            i.uminus_real(currentReg, src);
+            gen(i);
+        } else if (e->expr->type == IR::IntType) {
+            convertToReal(e->expr, currentReg);
+            i.uminus_real(currentReg, src);
+            gen(i);
+        } else {
+            discard();
+        }
+        break;
+
+    case IR::OpUPlus:
+        if (e->expr->type == IR::RealType) {
+            i.uplus_real(currentReg, src);
+            gen(i);
+        } else if (e->expr->type == IR::IntType) {
+            convertToReal(e->expr, currentReg);
+            i.uplus_real(currentReg, src);
+            gen(i);
+        } else {
+            discard();
+        }
+        break;
+
+    case IR::OpCompl:
+        i.ucompl_real(currentReg, src);
+        gen(i);
+        discard(); // ???
+        break;
+
+    case IR::OpBitAnd:
+    case IR::OpBitOr:
+    case IR::OpBitXor:
+    case IR::OpAdd:
+    case IR::OpSub:
+    case IR::OpMul:
+    case IR::OpDiv:
+    case IR::OpMod:
+    case IR::OpLShift:
+    case IR::OpRShift:
+    case IR::OpURShift:
+    case IR::OpGt:
+    case IR::OpLt:
+    case IR::OpGe:
+    case IR::OpLe:
+    case IR::OpEqual:
+    case IR::OpNotEqual:
+    case IR::OpStrictEqual:
+    case IR::OpStrictNotEqual:
+    case IR::OpAnd:
+    case IR::OpOr:
+        Q_ASSERT(!"unreachable");
+        break;
+    } // switch
+}
+
+void QDeclarativeV4CompilerPrivate::convertToReal(IR::Expr *expr, int reg)
+{
+    if (expr->type == IR::RealType)
+        return;
+
+    Instr conv;
+    conv.unaryop.output = reg;
+    conv.unaryop.src = reg;
+
+    switch (expr->type) {
+    case IR::BoolType:
+        conv.common.type = Instr::ConvertBoolToReal;
+        gen(conv);
+        break;
+
+    case IR::IntType:
+        conv.common.type = Instr::ConvertIntToReal;
+        gen(conv);
+        break;
+
+    case IR::RealType:
+        // nothing to do
+        return;
+
+    default:
+        discard();
+        break;
+    } // switch
+}
+
+void QDeclarativeV4CompilerPrivate::convertToInt(IR::Expr *expr, int reg)
+{
+    if (expr->type == IR::IntType)
+        return;
+
+    Instr conv;
+    conv.unaryop.output = reg;
+    conv.unaryop.src = reg;
+
+    switch (expr->type) {
+    case IR::BoolType:
+        conv.common.type = Instr::ConvertBoolToInt;
+        gen(conv);
+        break;
+
+    case IR::IntType:
+        // nothing to do
+        return;
+
+    case IR::RealType:
+        conv.common.type = Instr::ConvertRealToInt;
+        gen(conv);
+        break;
+
+    default:
+        discard();
+        break;
+    } // switch
+}
+
+void QDeclarativeV4CompilerPrivate::convertToBool(IR::Expr *expr, int reg)
+{
+    if (expr->type == IR::BoolType)
+        return;
+
+    Instr conv;
+    conv.unaryop.output = reg;
+    conv.unaryop.src = reg;
+
+    switch (expr->type) {
+    case IR::BoolType:
+        // nothing to do
+        break;
+
+    case IR::IntType:
+        conv.common.type = Instr::ConvertIntToBool;
+        gen(conv);
+        break;
+
+    case IR::RealType:
+        conv.common.type = Instr::ConvertRealToBool;
+        gen(conv);
+        return;
+
+    case IR::StringType:
+        conv.common.type = Instr::ConvertStringToBool;
+        gen(conv);
+        return;
+
+    default:
+        discard();
+        break;
+    } // switch
+}
+
+quint8 QDeclarativeV4CompilerPrivate::instructionOpcode(IR::Binop *e)
+{
+    switch (e->op) {
+    case IR::OpInvalid:
+        return Instr::Noop;
+
+    case IR::OpIfTrue:
+    case IR::OpNot:
+    case IR::OpUMinus:
+    case IR::OpUPlus:
+    case IR::OpCompl:
+        return Instr::Noop;
+
+    case IR::OpBitAnd:
+        return Instr::BitAndInt;
+
+    case IR::OpBitOr:
+        return Instr::BitOrInt;
+
+    case IR::OpBitXor:
+        return Instr::BitXorInt;
+
+    case IR::OpAdd:
+        if (e->type == IR::StringType)
+            return Instr::AddString;
+        return Instr::AddReal;
+
+    case IR::OpSub:
+        return Instr::SubReal;
+
+    case IR::OpMul:
+        return Instr::MulReal;
+
+    case IR::OpDiv:
+        return Instr::DivReal;
+
+    case IR::OpMod:
+        return Instr::ModReal;
+
+    case IR::OpLShift:
+        return Instr::LShiftInt;
+
+    case IR::OpRShift:
+        return Instr::RShiftInt;
+
+    case IR::OpURShift:
+        return Instr::URShiftInt;
+
+    case IR::OpGt:
+        if (e->left->type == IR::StringType)
+            return Instr::GtString;
+        return Instr::GtReal;
+
+    case IR::OpLt:
+        if (e->left->type == IR::StringType)
+            return Instr::LtString;
+        return Instr::LtReal;
+
+    case IR::OpGe:
+        if (e->left->type == IR::StringType)
+            return Instr::GeString;
+        return Instr::GeReal;
+
+    case IR::OpLe:
+        if (e->left->type == IR::StringType)
+            return Instr::LeString;
+        return Instr::LeReal;
+
+    case IR::OpEqual:
+        if (e->left->type == IR::StringType)
+            return Instr::EqualString;
+        return Instr::EqualReal;
+
+    case IR::OpNotEqual:
+        if (e->left->type == IR::StringType)
+            return Instr::NotEqualString;
+        return Instr::NotEqualReal;
+
+    case IR::OpStrictEqual:
+        if (e->left->type == IR::StringType)
+            return Instr::StrictEqualString;
+        return Instr::StrictEqualReal;
+
+    case IR::OpStrictNotEqual:
+        if (e->left->type == IR::StringType)
+            return Instr::StrictNotEqualString;
+        return Instr::StrictNotEqualReal;
+
+    case IR::OpAnd:
+    case IR::OpOr:
+        return Instr::Noop;
+
+    } // switch
+
+    return Instr::Noop;
+}
+
+void QDeclarativeV4CompilerPrivate::visitBinop(IR::Binop *e)
+{
+    int left = currentReg;
+    int right = currentReg + 1; 
+
+    if (e->left->asTemp() && e->type != IR::StringType)  // Not sure if the e->type != String test is needed
+        left = e->left->asTemp()->index;
+    else
+        traceExpression(e->left, left);
+
+    if (IR::Temp *t = e->right->asTemp())
+        right = t->index;
+    else
+        traceExpression(e->right, right);
+
+    if (e->left->type != e->right->type) {
+        if (qmlVerboseCompiler())
+            qWarning().nospace() << "invalid operands to binary operator " << IR::binaryOperator(e->op)
+                                 << "(`" << IR::binaryOperator(e->left->type)
+                                 << "' and `"
+                                 << IR::binaryOperator(e->right->type)
+                                 << "'";
+        discard();
+        return;
+    }
+
+    switch (e->op) {
+    case IR::OpInvalid:
+        discard();
+        break;
+
+    // unary
+    case IR::OpIfTrue:
+    case IR::OpNot:
+    case IR::OpUMinus:
+    case IR::OpUPlus:
+    case IR::OpCompl:
+        discard();
+        break;
+
+    case IR::OpBitAnd:
+    case IR::OpBitOr:
+    case IR::OpBitXor:
+    case IR::OpLShift:
+    case IR::OpRShift:
+    case IR::OpURShift:
+        convertToInt(e->left, left);
+        convertToInt(e->right, right);
+        break;
+
+    case IR::OpAdd:
+        if (e->type != IR::StringType) {
+            convertToReal(e->left, left);
+            convertToReal(e->right, right);
+        }
+        break;
+
+    case IR::OpSub:
+    case IR::OpMul:
+    case IR::OpDiv:
+    case IR::OpMod:
+        convertToReal(e->left, left);
+        convertToReal(e->right, right);
+        break;
+
+    case IR::OpGt:
+    case IR::OpLt:
+    case IR::OpGe:
+    case IR::OpLe:
+    case IR::OpEqual:
+    case IR::OpNotEqual:
+    case IR::OpStrictEqual:
+    case IR::OpStrictNotEqual:
+        if (e->left->type != IR::StringType) {
+            convertToReal(e->left, left);
+            convertToReal(e->right, right);
+        }
+        break;
+
+    case IR::OpAnd:
+    case IR::OpOr:
+        discard(); // ### unreachable
+        break;
+    } // switch
+
+    const quint8 opcode = instructionOpcode(e);
+    if (opcode != Instr::Noop) {
+        Instr instr;
+        instr.common.type = opcode;
+        instr.binaryop.output = currentReg;
+        instr.binaryop.left = left;
+        instr.binaryop.right = right;
+        gen(instr);
+    }
+}
+
+void QDeclarativeV4CompilerPrivate::visitCall(IR::Call *call)
+{
+    if (IR::Name *name = call->base->asName()) {
+        if (call->args.size() == 1 && call->args.at(0)->type == IR::RealType) {
+            traceExpression(call->args.at(0), currentReg);
+
+            Instr instr;
+            instr.common.type = Instr::Noop;
+
+            switch (name->builtin) {
+            case IR::NoBuiltinSymbol:
+                break;
+
+            case IR::MathSinBultinFunction:
+                instr.math_sin_real(currentReg);
+                break;
+
+            case IR::MathCosBultinFunction:
+                instr.math_cos_real(currentReg);
+                break;
+
+            case IR::MathRoundBultinFunction:
+                instr.math_round_real(currentReg);
+                break;
+
+            case IR::MathFloorBultinFunction:
+                instr.math_floor_real(currentReg);
+                break;
+
+            case IR::MathPIBuiltinConstant:
+                break;
+            } // switch
+
+            if (instr.common.type != Instr::Noop) {
+                gen(instr);
+                return;
+            }
+        }
+    }
+
+    if (qmlVerboseCompiler())
+        qWarning() << "TODO:" << Q_FUNC_INFO << __LINE__;
+    discard();
+}
+
+
+//
+// statements
+//
+void QDeclarativeV4CompilerPrivate::visitExp(IR::Exp *s)
+{
+    traceExpression(s->expr, currentReg);
+}
+
+void QDeclarativeV4CompilerPrivate::visitMove(IR::Move *s)
+{
+    IR::Temp *target = s->target->asTemp();
+    Q_ASSERT(target != 0);
+
+    quint8 dest = target->index;
+
+    if (target->type != s->source->type) {
+        quint8 src = dest;
+
+        if (IR::Temp *t = s->source->asTemp()) 
+            src = t->index;
+        else
+            traceExpression(s->source, dest);
+
+        Instr conv;
+        conv.common.type = Instr::Noop;
+        if (target->type == IR::BoolType) {
+            switch (s->source->type) {
+            case IR::IntType: conv.common.type = Instr::ConvertIntToBool; break;
+            case IR::RealType: conv.common.type = Instr::ConvertRealToBool; break;
+            case IR::StringType: conv.common.type = Instr::ConvertStringToBool; break;
+            default: break;
+            } // switch
+        } else if (target->type == IR::IntType) {
+            switch (s->source->type) {
+            case IR::BoolType: conv.common.type = Instr::ConvertBoolToInt; break;
+            case IR::RealType: {
+                if (s->isMoveForReturn)
+                    conv.common.type = Instr::MathRoundReal;
+                else
+                    conv.common.type = Instr::ConvertRealToInt; 
+                break;
+            }
+            case IR::StringType: conv.common.type = Instr::ConvertStringToInt; break;
+            default: break;
+            } // switch
+        } else if (target->type == IR::RealType) {
+            switch (s->source->type) {
+            case IR::BoolType: conv.common.type = Instr::ConvertBoolToReal; break;
+            case IR::IntType: conv.common.type = Instr::ConvertIntToReal; break;
+            case IR::StringType: conv.common.type = Instr::ConvertStringToReal; break;
+            default: break;
+            } // switch
+        } else if (target->type == IR::StringType) {
+            switch (s->source->type) {
+            case IR::BoolType: conv.common.type = Instr::ConvertBoolToString; break;
+            case IR::IntType: conv.common.type = Instr::ConvertIntToString; break;
+            case IR::RealType: conv.common.type = Instr::ConvertRealToString; break;
+            default: break;
+            } // switch
+        }
+        if (conv.common.type != Instr::Noop) {
+            conv.unaryop.output = dest;
+            conv.unaryop.src = src;
+            gen(conv);
+        } else {
+            discard();
+        }
+    } else {
+        traceExpression(s->source, dest);
+    }
+}
+
+void QDeclarativeV4CompilerPrivate::visitJump(IR::Jump *s)
+{
+    patches.append(Patch(s->target, bytecode.size()));
+
+    Instr i;
+    i.branch(0); // ### backpatch
+    gen(i);
+}
+
+void QDeclarativeV4CompilerPrivate::visitCJump(IR::CJump *s)
+{
+    traceExpression(s->cond, currentReg);
+
+    patches.append(Patch(s->iftrue, bytecode.size()));
+
+    Instr i;
+    i.branch_true(currentReg, 0); // ### backpatch
+    gen(i);
+}
+
+void QDeclarativeV4CompilerPrivate::visitRet(IR::Ret *s)
+{
+    Q_ASSERT(s->expr != 0);
+
+    int storeReg = currentReg;
+
+    if (IR::Temp *temp = s->expr->asTemp()) {
+        storeReg = temp->index;
+    } else {
+        traceExpression(s->expr, storeReg);
+    }
+
+    if (qmlBindingsTest) {
+        Instr test;
+        test.common.type = Instr::TestV4Store;
+        test.storetest.reg = storeReg;
+        switch (s->type) {
+        case IR::StringType:
+            test.storetest.regType = QMetaType::QString;
+            break;
+        case IR::UrlType:
+            test.storetest.regType = QMetaType::QUrl;
+            break;
+        case IR::AnchorLineType:
+            test.storetest.regType = qMetaTypeId<QDeclarativeAnchorLine>();
+            break;
+        case IR::SGAnchorLineType:
+            test.storetest.regType = qMetaTypeId<QSGAnchorLine>();
+            break;
+        case IR::ObjectType:
+            test.storetest.regType = QMetaType::QObjectStar;
+            break;
+        case IR::BoolType:
+            test.storetest.regType = QMetaType::Bool;
+            break;
+        case IR::IntType:
+            test.storetest.regType = QMetaType::Int;
+            break;
+        case IR::RealType:
+            test.storetest.regType = QMetaType::QReal;
+            break;
+        default:
+            discard();
+            return;
+        }
+        gen(test);
+    }
+
+    Instr store;
+    store.common.type = Instr::Store;
+    store.store.output = 0;
+    store.store.index = expression->property->index;
+    store.store.reg = storeReg;
+    store.store.exceptionId = exceptionId(s->line, s->column);
+    gen(store);
+}
+
+void QDeclarativeV4Compiler::dump(const QByteArray &programData)
+{
+    const QDeclarativeV4Program *program = (const QDeclarativeV4Program *)programData.constData();
+
+    qWarning() << "Program.bindings:" << program->bindings;
+    qWarning() << "Program.dataLength:" << program->dataLength;
+    qWarning() << "Program.subscriptions:" << program->subscriptions;
+    qWarning() << "Program.indentifiers:" << program->identifiers;
+
+    const int programSize = program->instructionCount;
+    const char *start = program->instructions();
+    const char *code = start;
+    const char *end = code + programSize;
+    while (code < end) {
+        Instr *instr = (Instr *) code;
+        instr->dump(code - start);
+        code += instr->size();
+    }
+}
+
+QDeclarativeFastProperties *QDeclarativeV4Compiler::fastPropertyAccessor()
+{
+    return fastProperties();
+}
+
+/*!
+Clear the state associated with attempting to compile a specific binding.
+This does not clear the global "committed binding" states.
+*/
+void QDeclarativeV4CompilerPrivate::resetInstanceState()
+{
+    registerCleanups.clear();
+    data = committed.data;
+    exceptions = committed.exceptions;
+    usedSubscriptionIds.clear();
+    subscriptionIds = committed.subscriptionIds;
+    registeredStrings = committed.registeredStrings;
+    bytecode.clear();
+    patches.clear();
+    currentReg = 0;
+}
+
+/*!
+Mark the last compile as successful, and add it to the "committed data"
+section.
+
+Returns the index for the committed binding.
+*/
+int QDeclarativeV4CompilerPrivate::commitCompile()
+{
+    int rv = committed.count();
+    committed.offsets << committed.bytecode.count();
+    committed.dependencies << usedSubscriptionIds;
+    committed.bytecode += bytecode.code();
+    committed.data = data;
+    committed.exceptions = exceptions;
+    committed.subscriptionIds = subscriptionIds;
+    committed.registeredStrings = registeredStrings;
+    return rv;
+}
+
+bool QDeclarativeV4CompilerPrivate::compile(QDeclarativeJS::AST::Node *node)
+{
+    resetInstanceState();
+
+    if (expression->property->type == -1)
+        return false;
+
+    AST::SourceLocation location;
+    if (AST::ExpressionNode *astExpression = node->expressionCast()) {
+        location = astExpression->firstSourceLocation();
+    } else if (AST::Statement *astStatement = node->statementCast()) {
+        if (AST::Block *block = AST::cast<AST::Block *>(astStatement))
+            location = block->lbraceToken;
+        else if (AST::IfStatement *ifStmt = AST::cast<AST::IfStatement *>(astStatement))
+            location = ifStmt->ifToken;
+        else
+            return false;
+    } else {
+        return false;
+    }
+
+    IR::Module module;
+    IR::Function *function = 0;
+
+    QDeclarativeV4IRBuilder irBuilder(expression, engine);
+    if (!(function = irBuilder(&module, node)))
+        return false;
+
+    bool discarded = false;
+    qSwap(_discarded, discarded);
+    qSwap(_function, function);
+    trace(location.startLine, location.startColumn);
+    qSwap(_function, function);
+    qSwap(_discarded, discarded);
+
+    if (qmlVerboseCompiler()) {
+        QTextStream qerr(stderr, QIODevice::WriteOnly);
+        if (discarded)
+            qerr << "======== TODO ====== " << endl;
+        else 
+            qerr << "==================== " << endl;
+        qerr << "\tline: " << location.startLine
+             << "\tcolumn: " << location.startColumn
+             << endl;
+        foreach (IR::BasicBlock *bb, function->basicBlocks)
+            bb->dump(qerr);
+        qerr << endl;
+    }
+
+    if (discarded || subscriptionIds.count() > 0xFFFF || registeredStrings.count() > 0xFFFF)
+        return false;
+
+    return true;
+}
+
+// Returns a reg
+int QDeclarativeV4CompilerPrivate::registerLiteralString(quint8 reg, const QString &str)
+{
+    // ### string cleanup
+
+    QByteArray strdata((const char *)str.constData(), str.length() * sizeof(QChar));
+    int offset = data.count();
+    data += strdata;
+
+    Instr string;
+    string.common.type = Instr::String;
+    string.string_value.reg = reg;
+    string.string_value.offset = offset;
+    string.string_value.length = str.length();
+    gen(string);
+
+    return reg;
+}
+
+// Returns an identifier offset
+int QDeclarativeV4CompilerPrivate::registerString(const QString &string)
+{
+    Q_ASSERT(!string.isEmpty());
+
+    QHash<QString, QPair<int, int> >::ConstIterator iter = registeredStrings.find(string);
+
+    if (iter == registeredStrings.end()) {
+        quint32 len = string.length();
+        QByteArray lendata((const char *)&len, sizeof(quint32));
+        QByteArray strdata((const char *)string.constData(), string.length() * sizeof(QChar));
+        strdata.prepend(lendata);
+        int rv = data.count();
+        data += strdata;
+
+        iter = registeredStrings.insert(string, qMakePair(registeredStrings.count(), rv));
+    } 
+
+    Instr reg;
+    reg.common.type = Instr::InitString;
+    reg.initstring.offset = iter->first;
+    reg.initstring.dataIdx = iter->second;
+    gen(reg);
+    return reg.initstring.offset;
+}
+
+/*!
+Returns true if the current expression has not already subscribed to \a sub in currentBlockMask.
+*/
+bool QDeclarativeV4CompilerPrivate::blockNeedsSubscription(const QStringList &sub)
+{
+    QString str = sub.join(QLatin1String("."));
+
+    QHash<QString, int>::ConstIterator iter = subscriptionIds.find(str);
+    if (iter == subscriptionIds.end())
+        return true;
+
+    QHash<int, quint32>::ConstIterator uiter = usedSubscriptionIds.find(*iter);
+    if (uiter == usedSubscriptionIds.end())
+        return true;
+    else
+        return !(*uiter & currentBlockMask);
+}
+
+int QDeclarativeV4CompilerPrivate::subscriptionIndex(const QStringList &sub)
+{
+    QString str = sub.join(QLatin1String("."));
+    QHash<QString, int>::ConstIterator iter = subscriptionIds.find(str);
+    if (iter == subscriptionIds.end()) 
+        iter = subscriptionIds.insert(str, subscriptionIds.count());
+    if (!(usedSubscriptionIds[*iter] & currentBlockMask)) {
+        usedSubscriptionIds[*iter] |= currentBlockMask;
+        usedSubscriptionIdsChanged = true;
+    }
+    return *iter;
+}
+
+quint32 QDeclarativeV4CompilerPrivate::subscriptionBlockMask(const QStringList &sub)
+{
+    QString str = sub.join(QLatin1String("."));
+
+    QHash<QString, int>::ConstIterator iter = subscriptionIds.find(str);
+    Q_ASSERT(iter != subscriptionIds.end());
+
+    QHash<int, quint32>::ConstIterator uiter = usedSubscriptionIds.find(*iter);
+    Q_ASSERT(uiter != usedSubscriptionIds.end());
+
+    return *uiter;
+}
+
+quint8 QDeclarativeV4CompilerPrivate::exceptionId(quint32 line, quint32 column)
+{
+    quint8 rv = 0xFF;
+    if (exceptions.count() < 0xFF) {
+        rv = (quint8)exceptions.count();
+        quint64 e = line;
+        e <<= 32;
+        e |= column;
+        exceptions.append(e);
+    }
+    return rv;
+}
+
+quint8 QDeclarativeV4CompilerPrivate::exceptionId(QDeclarativeJS::AST::ExpressionNode *n)
+{
+    quint8 rv = 0xFF;
+    if (n && exceptions.count() < 0xFF) {
+        QDeclarativeJS::AST::SourceLocation l = n->firstSourceLocation();
+        rv = exceptionId(l.startLine, l.startColumn);
+    }
+    return rv;
+}
+
+QDeclarativeV4Compiler::QDeclarativeV4Compiler()
+: d(new QDeclarativeV4CompilerPrivate)
+{
+    qmlBindingsTest |= qmlBindingsTestEnv();
+}
+
+QDeclarativeV4Compiler::~QDeclarativeV4Compiler()
+{
+    delete d; d = 0;
+}
+
+/* 
+Returns true if any bindings were compiled.
+*/
+bool QDeclarativeV4Compiler::isValid() const
+{
+    return !d->committed.bytecode.isEmpty();
+}
+
+/* 
+-1 on failure, otherwise the binding index to use.
+*/
+int QDeclarativeV4Compiler::compile(const Expression &expression, QDeclarativeEnginePrivate *engine)
+{
+    if (!expression.expression.asAST()) return false;
+
+    if (!qmlExperimental() && expression.property->isValueTypeSubProperty)
+        return -1;
+
+    if (qmlDisableOptimizer())
+        return -1;
+
+    d->expression = &expression;
+    d->engine = engine;
+
+    if (d->compile(expression.expression.asAST())) {
+        return d->commitCompile();
+    } else {
+        return -1;
+    }
+}
+
+QByteArray QDeclarativeV4CompilerPrivate::buildSignalTable() const
+{
+    QHash<int, QList<QPair<int, quint32> > > table;
+
+    for (int ii = 0; ii < committed.count(); ++ii) {
+        const QHash<int, quint32> &deps = committed.dependencies.at(ii);
+        for (QHash<int, quint32>::ConstIterator iter = deps.begin(); iter != deps.end(); ++iter) 
+            table[iter.key()].append(qMakePair(ii, iter.value()));
+    }
+
+    QVector<quint32> header;
+    QVector<quint32> data;
+    for (int ii = 0; ii < committed.subscriptionIds.count(); ++ii) {
+        header.append(committed.subscriptionIds.count() + data.count());
+        const QList<QPair<int, quint32> > &bindings = table[ii];
+        data.append(bindings.count());
+        for (int jj = 0; jj < bindings.count(); ++jj) {
+            data.append(bindings.at(jj).first);
+            data.append(bindings.at(jj).second);
+        }
+    }
+    header << data;
+
+    return QByteArray((const char *)header.constData(), header.count() * sizeof(quint32));
+}
+
+QByteArray QDeclarativeV4CompilerPrivate::buildExceptionData() const
+{
+    QByteArray rv;
+    rv.resize(committed.exceptions.count() * sizeof(quint64));
+    ::memcpy(rv.data(), committed.exceptions.constData(), rv.size());
+    return rv;
+}
+
+/* 
+Returns the compiled program.
+*/
+QByteArray QDeclarativeV4Compiler::program() const
+{
+    QByteArray programData;
+
+    if (isValid()) {
+        QDeclarativeV4Program prog;
+        prog.bindings = d->committed.count();
+
+        Bytecode bc;
+        Instr jump;
+        jump.common.type = Instr::Jump;
+        jump.jump.reg = -1;
+
+        for (int ii = 0; ii < d->committed.count(); ++ii) {
+            jump.jump.count = d->committed.count() - ii - 1;
+            jump.jump.count*= jump.size();
+            jump.jump.count+= d->committed.offsets.at(ii);
+            bc.append(jump);
+        }
+
+
+        QByteArray bytecode = bc.code();
+        bytecode += d->committed.bytecode;
+
+        QByteArray data = d->committed.data;
+        while (data.count() % 4) data.append('\0');
+        prog.signalTableOffset = data.count();
+        data += d->buildSignalTable();
+        while (data.count() % 4) data.append('\0');
+        prog.exceptionDataOffset = data.count();
+        data += d->buildExceptionData();
+
+        prog.dataLength = 4 * ((data.size() + 3) / 4);
+        prog.subscriptions = d->committed.subscriptionIds.count();
+        prog.identifiers = d->committed.registeredStrings.count();
+        prog.instructionCount = bytecode.count();
+        int size = sizeof(QDeclarativeV4Program) + bytecode.count();
+        size += prog.dataLength;
+
+        programData.resize(size);
+        memcpy(programData.data(), &prog, sizeof(QDeclarativeV4Program));
+        if (prog.dataLength)
+            memcpy((char *)((QDeclarativeV4Program *)programData.data())->data(), data.constData(), 
+                   data.size());
+        memcpy((char *)((QDeclarativeV4Program *)programData.data())->instructions(), bytecode.constData(),
+               bytecode.count());
+    } 
+
+    if (bindingsDump()) {
+        qWarning().nospace() << "Subscription slots:";
+
+        for (QHash<QString, int>::ConstIterator iter = d->committed.subscriptionIds.begin();
+                iter != d->committed.subscriptionIds.end();
+                ++iter) {
+            qWarning().nospace() << "    " << iter.value() << "\t-> " << iter.key();
+        }
+
+
+        QDeclarativeV4Compiler::dump(programData);
+    }
+
+    return programData;
+}
+
+void QDeclarativeV4Compiler::enableBindingsTest(bool e)
+{
+    if (e)
+        qmlBindingsTest = true;
+    else 
+        qmlBindingsTest = qmlBindingsTestEnv();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecompiledbindings_p.h b/src/declarative/qml/v4/qdeclarativev4compiler_p.h
similarity index 73%
rename from src/declarative/qml/qdeclarativecompiledbindings_p.h
rename to src/declarative/qml/v4/qdeclarativev4compiler_p.h
index f3d8b4b804..c10691dc87 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings_p.h
+++ b/src/declarative/qml/v4/qdeclarativev4compiler_p.h
@@ -39,8 +39,8 @@
 **
 ****************************************************************************/
 
-#ifndef QDECLARATIVEBINDINGOPTIMIZATIONS_P_H
-#define QDECLARATIVEBINDINGOPTIMIZATIONS_P_H
+#ifndef QDECLARATIVEV4COMPILER_P_H
+#define QDECLARATIVEV4COMPILER_P_H
 
 //
 //  W A R N I N G
@@ -60,12 +60,14 @@ QT_BEGIN_HEADER
 
 QT_BEGIN_NAMESPACE
 
-struct QDeclarativeBindingCompilerPrivate;
-class QDeclarativeBindingCompiler
+class QDeclarativeFastProperties;
+class QDeclarativeTypeNameCache;
+class QDeclarativeV4CompilerPrivate;
+class Q_AUTOTEST_EXPORT QDeclarativeV4Compiler
 {
 public:
-    QDeclarativeBindingCompiler();
-    ~QDeclarativeBindingCompiler();
+    QDeclarativeV4Compiler();
+    ~QDeclarativeV4Compiler();
 
     // Returns true if bindings were compiled
     bool isValid() const;
@@ -77,6 +79,7 @@ public:
         QDeclarativeParser::Property *property;
         QDeclarativeParser::Variant expression;
         QHash<QString, QDeclarativeParser::Object *> ids;
+        QDeclarativeTypeNameCache *importCache;
         QDeclarativeImports imports;
     };
 
@@ -87,30 +90,15 @@ public:
     QByteArray program() const;
 
     static void dump(const QByteArray &);
+    static QDeclarativeFastProperties *fastPropertyAccessor();
+    static void enableBindingsTest(bool);
 private:
-    QDeclarativeBindingCompilerPrivate *d;
-};
-
-class QDeclarativeCompiledBindingsPrivate;
-class QDeclarativeCompiledBindings : public QObject, public QDeclarativeAbstractExpression, public QDeclarativeRefCount
-{
-public:
-    QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context);
-    virtual ~QDeclarativeCompiledBindings();
-
-    QDeclarativeAbstractBinding *configBinding(int index, QObject *target, QObject *scope, int property);
-
-protected:
-    int qt_metacall(QMetaObject::Call, int, void **);
-
-private:
-    Q_DISABLE_COPY(QDeclarativeCompiledBindings)
-    Q_DECLARE_PRIVATE(QDeclarativeCompiledBindings)
+    QDeclarativeV4CompilerPrivate *d;
 };
 
 QT_END_NAMESPACE
 
 QT_END_HEADER
 
-#endif // QDECLARATIVEBINDINGOPTIMIZATIONS_P_H
+#endif // QDECLARATIVEV4COMPILER_P_H
 
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h b/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
new file mode 100644
index 0000000000..1b2a998422
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4COMPILER_P_P_H
+#define QDECLARATIVEV4COMPILER_P_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qdeclarativev4instruction_p.h"
+#include "qdeclarativev4ir_p.h"
+#include <private/qdeclarativeparser_p.h>
+#include <private/qdeclarativeimport_p.h>
+#include <private/qdeclarativeengine_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeV4CompilerPrivate: protected QDeclarativeJS::IR::ExprVisitor, 
+                                     protected QDeclarativeJS::IR::StmtVisitor
+{
+public:
+    QDeclarativeV4CompilerPrivate();
+
+    void resetInstanceState();
+    int commitCompile();
+
+    const QDeclarativeV4Compiler::Expression *expression;
+    QDeclarativeEnginePrivate *engine;
+
+    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((quintptr)expression->context, 16); }
+
+    bool compile(QDeclarativeJS::AST::Node *);
+
+    QHash<int, QPair<int, int> > registerCleanups;
+
+    int registerLiteralString(quint8 reg, const QString &);
+    int registerString(const QString &);
+    QHash<QString, QPair<int, int> > registeredStrings;
+    QByteArray data;
+
+    bool blockNeedsSubscription(const QStringList &);
+    int subscriptionIndex(const QStringList &);
+    quint32 subscriptionBlockMask(const QStringList &);
+
+    quint8 exceptionId(quint32 line, quint32 column);
+    quint8 exceptionId(QDeclarativeJS::AST::ExpressionNode *);
+    QVector<quint64> exceptions;
+
+    QHash<int, quint32> usedSubscriptionIds;
+
+    QHash<QString, int> subscriptionIds;
+    QDeclarativeJS::Bytecode bytecode;
+
+    // back patching
+    struct Patch {
+        QDeclarativeJS::IR::BasicBlock *block; // the basic block
+        int offset; // the index of the instruction to patch
+        Patch(QDeclarativeJS::IR::BasicBlock *block = 0, int index = -1)
+            : block(block), offset(index) {}
+    };
+    QVector<Patch> patches;
+
+    // Committed binding data
+    struct {
+        QList<int> offsets;
+        QList<QHash<int, quint32> > dependencies;
+
+        //QDeclarativeJS::Bytecode bytecode;
+        QByteArray bytecode;
+        QByteArray data;
+        QHash<QString, int> subscriptionIds;
+        QVector<quint64> exceptions;
+
+        QHash<QString, QPair<int, int> > registeredStrings;
+
+        int count() const { return offsets.count(); }
+    } committed;
+
+    QByteArray buildSignalTable() const;
+    QByteArray buildExceptionData() const;
+
+    void convertToReal(QDeclarativeJS::IR::Expr *expr, int reg);    
+    void convertToInt(QDeclarativeJS::IR::Expr *expr, int reg);
+    void convertToBool(QDeclarativeJS::IR::Expr *expr, int reg);
+    quint8 instructionOpcode(QDeclarativeJS::IR::Binop *e);
+
+protected:
+
+    //
+    // tracing
+    //
+    void trace(int line, int column);
+    void trace(QVector<QDeclarativeJS::IR::BasicBlock *> *blocks);
+    void traceExpression(QDeclarativeJS::IR::Expr *e, quint8 r);
+
+    inline void gen(const QDeclarativeJS::Instr &i) { bytecode.append(i); }
+
+    //
+    // expressions
+    //
+    virtual void visitConst(QDeclarativeJS::IR::Const *e);
+    virtual void visitString(QDeclarativeJS::IR::String *e);
+    virtual void visitName(QDeclarativeJS::IR::Name *e);
+    virtual void visitTemp(QDeclarativeJS::IR::Temp *e);
+    virtual void visitUnop(QDeclarativeJS::IR::Unop *e);
+    virtual void visitBinop(QDeclarativeJS::IR::Binop *e);
+    virtual void visitCall(QDeclarativeJS::IR::Call *e);
+
+    //
+    // statements
+    //
+    virtual void visitExp(QDeclarativeJS::IR::Exp *s);
+    virtual void visitMove(QDeclarativeJS::IR::Move *s);
+    virtual void visitJump(QDeclarativeJS::IR::Jump *s);
+    virtual void visitCJump(QDeclarativeJS::IR::CJump *s);
+    virtual void visitRet(QDeclarativeJS::IR::Ret *s);
+
+private:
+    QStringList _subscribeName;
+    QDeclarativeJS::IR::Function *_function;
+    QDeclarativeJS::IR::BasicBlock *_block;
+    void discard() { _discarded = true; }
+    bool _discarded;
+    quint8 currentReg;
+
+    bool usedSubscriptionIdsChanged;
+    quint32 currentBlockMask;
+};
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4COMPILER_P_P_H
+
diff --git a/src/declarative/qml/v4/qdeclarativev4instruction.cpp b/src/declarative/qml/v4/qdeclarativev4instruction.cpp
new file mode 100644
index 0000000000..1f24f30c25
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4instruction.cpp
@@ -0,0 +1,559 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativev4instruction_p.h"
+#include "qdeclarativev4bindings_p.h"
+
+#include <QtCore/qdebug.h>
+#include <private/qdeclarativeglobal_p.h>
+
+// Define this to do a test dump of all the instructions at startup.  This is 
+// helpful to test that each instruction's Instr::dump() case uses the correct
+// number of tabs etc and otherwise looks correct.
+// #define DEBUG_INSTR_DUMP
+
+QT_BEGIN_NAMESPACE
+
+DEFINE_BOOL_CONFIG_OPTION(qmlVerboseCompiler, QML_VERBOSE_COMPILER)
+
+namespace QDeclarativeJS {
+
+#ifdef DEBUG_INSTR_DUMP
+static struct DumpInstrAtStartup {
+    DumpInstrAtStartup() {
+#define DUMP_INSTR_AT_STARTUP(Type, FMT) { Instr i; i.common.type = Instr::Type; i.dump(0); }
+        FOR_EACH_QML_INSTR(DUMP_INSTR_AT_STARTUP);
+    }
+} dump_instr_at_startup;
+#endif
+
+int Instr::size() const
+{
+#define QML_RETURN_INSTR_SIZE(I, FMT) case I: return QML_INSTR_SIZE(I, FMT);
+    switch (common.type) {
+    FOR_EACH_QML_INSTR(QML_RETURN_INSTR_SIZE)
+    }
+#undef QML_RETURN_INSTR_SIZE
+    return 0;
+}
+
+void Instr::dump(int address) const
+{
+    QByteArray leading;
+    if (address != -1) {
+        leading = QByteArray::number(address);
+        leading.prepend(QByteArray(8 - leading.count(), ' '));
+        leading.append("\t");
+    }
+
+#define INSTR_DUMP qWarning().nospace() << leading.constData() 
+
+    switch (common.type) {
+    case Instr::Noop:
+        INSTR_DUMP << "\t" << "Noop";
+        break;
+    case Instr::BindingId:
+        INSTR_DUMP << id.line << ":" << id.column << ":";
+        break;
+    case Instr::Subscribe:
+        INSTR_DUMP << "\t" << "Subscribe" << "\t\t" << "Object_Reg(" << subscribeop.reg << ") Notify_Signal(" << subscribeop.index << ") -> Subscribe_Slot(" << subscribeop.offset << ")";
+        break;
+    case Instr::SubscribeId:
+        INSTR_DUMP << "\t" << "SubscribeId" << "\t\t" << "Id_Offset(" << subscribeop.index << ") -> Subscribe_Slot(" << subscribeop.offset << ")";
+        break;
+    case Instr::FetchAndSubscribe:
+        INSTR_DUMP << "\t" << "FetchAndSubscribe" << "\t" << "Object_Reg(" << fetchAndSubscribe.reg << ") Fast_Accessor(" << fetchAndSubscribe.function << ") -> Output_Reg(" << fetchAndSubscribe.reg << ") Subscription_Slot(" <<  fetchAndSubscribe.subscription << ")";
+        break;
+    case Instr::LoadId:
+        INSTR_DUMP << "\t" << "LoadId" << "\t\t\t" << "Id_Offset(" << load.index << ") -> Output_Reg(" << load.reg << ")";
+        break;
+    case Instr::LoadScope:
+        INSTR_DUMP << "\t" << "LoadScope" << "\t\t" << "-> Output_Reg(" << load.reg << ")";
+        break;
+    case Instr::LoadRoot:
+        INSTR_DUMP << "\t" << "LoadRoot" << "\t\t" << "-> Output_Reg(" << load.reg << ")";
+        break;
+    case Instr::LoadAttached:
+        INSTR_DUMP << "\t" << "LoadAttached" << "\t\t" << "Object_Reg(" << attached.reg << ") Attached_Index(" << attached.id << ") -> Output_Reg(" << attached.output << ")";
+        break;
+    case Instr::UnaryNot:
+        INSTR_DUMP << "\t" << "UnaryNot" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::UnaryMinusReal:
+        INSTR_DUMP << "\t" << "UnaryMinusReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::UnaryMinusInt:
+        INSTR_DUMP << "\t" << "UnaryMinusInt" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::UnaryPlusReal:
+        INSTR_DUMP << "\t" << "UnaryPlusReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::UnaryPlusInt:
+        INSTR_DUMP << "\t" << "UnaryPlusInt" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertBoolToInt:
+        INSTR_DUMP << "\t" << "ConvertBoolToInt" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertBoolToReal:
+        INSTR_DUMP << "\t" << "ConvertBoolToReal" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertBoolToString:
+        INSTR_DUMP << "\t" << "ConvertBoolToString" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertIntToBool:
+        INSTR_DUMP << "\t" << "ConvertIntToBool" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertIntToReal:
+        INSTR_DUMP << "\t" << "ConvertIntToReal" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertIntToString:
+        INSTR_DUMP << "\t" << "ConvertIntToString" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertRealToBool:
+        INSTR_DUMP << "\t" << "ConvertRealToBool" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertRealToInt:
+        INSTR_DUMP << "\t" << "ConvertRealToInt" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertRealToString:
+        INSTR_DUMP << "\t" << "ConvertRealToString" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertStringToBool:
+        INSTR_DUMP << "\t" << "ConvertStringToBool" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertStringToInt:
+        INSTR_DUMP << "\t" << "ConvertStringToInt" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::ConvertStringToReal:
+        INSTR_DUMP << "\t" << "ConvertStringToReal" << "\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::MathSinReal:
+        INSTR_DUMP << "\t" << "MathSinReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::MathCosReal:
+        INSTR_DUMP << "\t" << "MathCosReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::MathRoundReal:
+        INSTR_DUMP << "\t" << "MathRoundReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::MathFloorReal:
+        INSTR_DUMP << "\t" << "MathFloorReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::MathPIReal:
+        INSTR_DUMP << "\t" << "MathPIReal" << "\t\t" << "Input_Reg(" << unaryop.src << ") -> Output_Reg(" << unaryop.output << ")";
+        break;
+    case Instr::Real:
+        INSTR_DUMP << "\t" << "Real" << "\t\t\t" << "Constant(" << real_value.value << ") -> Output_Reg(" << real_value.reg << ")";
+        break;
+    case Instr::Int:
+        INSTR_DUMP << "\t" << "Int" << "\t\t\t" << "Constant(" << int_value.value << ") -> Output_Reg(" << int_value.reg << ")";
+        break;
+    case Instr::Bool:
+        INSTR_DUMP << "\t" << "Bool" << "\t\t\t" << "Constant(" << bool_value.value << ") -> Output_Reg(" << bool_value.reg << ")";
+        break;
+    case Instr::String:
+        INSTR_DUMP << "\t" << "String" << "\t\t\t" << "String_DataIndex(" << string_value.offset << ") String_Length(" << string_value.length << ") -> Output_Register(" << string_value.reg << ")";
+        break;
+    case Instr::EnableV4Test:
+        INSTR_DUMP << "\t" << "EnableV4Test" << "\t\t" << "String_DataIndex(" << string_value.offset << ") String_Length(" << string_value.length << ")";
+        break;
+    case Instr::TestV4Store:
+        INSTR_DUMP << "\t" << "TestV4Store" << "\t\t" << "Input_Reg(" << storetest.reg << ") Reg_Type(" << storetest.regType << ")";
+        break;
+    case Instr::BitAndInt:
+        INSTR_DUMP << "\t" << "BitAndInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::BitOrInt:
+        INSTR_DUMP << "\t" << "BitOrInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::BitXorInt:
+        INSTR_DUMP << "\t" << "BitXorInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::AddReal:
+        INSTR_DUMP << "\t" << "AddReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::AddString:
+        INSTR_DUMP << "\t" << "AddString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::SubReal:
+        INSTR_DUMP << "\t" << "SubReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::MulReal:
+        INSTR_DUMP << "\t" << "MulReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::DivReal:
+        INSTR_DUMP << "\t" << "DivReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::ModReal:
+        INSTR_DUMP << "\t" << "ModReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::LShiftInt:
+        INSTR_DUMP << "\t" << "LShiftInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::RShiftInt:
+        INSTR_DUMP << "\t" << "RShiftInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::URShiftInt:
+        INSTR_DUMP << "\t" << "URShiftInt" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::GtReal:
+        INSTR_DUMP << "\t" << "GtReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::LtReal:
+        INSTR_DUMP << "\t" << "LtReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::GeReal:
+        INSTR_DUMP << "\t" << "GeReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::LeReal:
+        INSTR_DUMP << "\t" << "LeReal" << "\t\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::EqualReal:
+        INSTR_DUMP << "\t" << "EqualReal" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::NotEqualReal:
+        INSTR_DUMP << "\t" << "NotEqualReal" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::StrictEqualReal:
+        INSTR_DUMP << "\t" << "StrictEqualReal" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::StrictNotEqualReal:
+        INSTR_DUMP << "\t" << "StrictNotEqualReal" << "\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::GtString:
+        INSTR_DUMP << "\t" << "GtString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::LtString:
+        INSTR_DUMP << "\t" << "LtString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::GeString:
+        INSTR_DUMP << "\t" << "GeString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::LeString:
+        INSTR_DUMP << "\t" << "LeString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::EqualString:
+        INSTR_DUMP << "\t" << "EqualString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::NotEqualString:
+        INSTR_DUMP << "\t" << "NotEqualString" << "\t\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::StrictEqualString:
+        INSTR_DUMP << "\t" << "StrictEqualString" << "\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::StrictNotEqualString:
+        INSTR_DUMP << "\t" << "StrictNotEqualString" << "\t" << "Input_Reg(" << binaryop.left << ") Input_Reg(" << binaryop.right << ") -> Output_Reg(" << binaryop.output << ")";
+        break;
+    case Instr::NewString:
+        INSTR_DUMP << "\t" << "NewString" << "\t\t" << "Register(" << construct.reg << ")";
+        break;
+    case Instr::NewUrl:
+        INSTR_DUMP << "\t" << "NewUrl" << "\t\t\t" << "Register(" << construct.reg << ")";
+        break;
+    case Instr::CleanupRegister:
+        INSTR_DUMP << "\t" << "CleanupRegister" << "\t\t" << "Register(" << cleanup.reg << ")";
+        break;
+    case Instr::Fetch:
+        INSTR_DUMP << "\t" << "Fetch" << "\t\t\t" << "Object_Reg(" << fetch.reg << ") Property_Index(" << fetch.index << ") -> Output_Reg(" << fetch.reg << ")";
+        break;
+    case Instr::Store:
+        INSTR_DUMP << "\t" << "Store" << "\t\t\t" << "Input_Reg(" << store.reg << ") -> Object_Reg(" << store.output << ") Property_Index(" << store.index << ")";
+        break;
+    case Instr::Copy:
+        INSTR_DUMP << "\t" << "Copy" << "\t\t\t" << "Input_Reg(" << copy.src << ") -> Output_Reg(" << copy.reg << ")";
+        break;
+    case Instr::Jump:
+        if (jump.reg != -1) {
+            INSTR_DUMP << "\t" << "Jump" << "\t\t\t" << "Address(" << (address + size() + jump.count) << ") [if false == Input_Reg(" << jump.reg << ")]";
+        } else {
+            INSTR_DUMP << "\t" << "Jump" << "\t\t\t" << "Address(" << (address + size() + jump.count) << ")";
+        }
+        break;
+    case Instr::BranchFalse:
+        INSTR_DUMP << "\t" << "BranchFalse" << "\t\t" << "Address(" << (address + size() + branchop.offset) << ") [if false == Input_Reg(" << branchop.reg << ")]";
+        break;
+    case Instr::BranchTrue:
+        INSTR_DUMP << "\t" << "BranchTrue" << "\t\t" << "Address(" << (address + size() + branchop.offset) << ") [if true == Input_Reg(" << branchop.reg << ")]";
+        break;
+    case Instr::Branch:
+        INSTR_DUMP << "\t" << "Branch" << "\t\t\t" << "Address(" << (address + size() + branchop.offset) << ")";
+        break;
+    case Instr::InitString:
+        INSTR_DUMP << "\t" << "InitString" << "\t\t" << "String_DataIndex(" << initstring.dataIdx << ") -> String_Slot(" << initstring.offset << ")";
+        break;
+    case Instr::Block:
+        INSTR_DUMP << "\t" << "Block" << "\t\t\t" << "Mask(" << QByteArray::number(blockop.block, 16).constData()  << ")";
+        break;
+    default:
+        INSTR_DUMP << "\t" << "Unknown";
+        break;
+    }
+}
+
+void Instr::noop()
+{
+    common.type = Noop;
+}
+
+void Instr::load_root(quint8 reg)
+{
+    common.type = LoadRoot;
+    load.reg = reg;
+    load.index = 0;
+}
+
+void Instr::load_scope(quint8 reg)
+{
+    common.type = LoadScope;
+    load.reg = reg;
+    load.index = 0;
+}
+
+void Instr::load_id(quint8 reg, quint32 idIndex)
+{
+    common.type = LoadId;
+    load.reg = reg;
+    load.index = idIndex;
+}
+
+void Instr::subscribe(qint8 reg, quint16 subscribeSlot, quint32 notifyIndex)
+{
+    common.type = Instr::Subscribe;
+    subscribeop.reg = reg;
+    subscribeop.offset = subscribeSlot;
+    subscribeop.index = notifyIndex; 
+}
+
+void Instr::subscribeId(qint8 reg, quint16 subscribeSlot, quint32 idIndex)
+{
+    common.type = Instr::SubscribeId;
+    subscribeop.reg = reg;
+    subscribeop.offset = subscribeSlot;
+    subscribeop.index = idIndex;
+}
+
+void Instr::move_reg_bool(quint8 reg, bool value)
+{
+    common.type = Bool;
+    bool_value.reg = reg;
+    bool_value.value = value;
+}
+
+void Instr::move_reg_int(quint8 reg, int value)
+{
+    common.type = Int;
+    int_value.reg = reg;
+    int_value.value = value;
+}
+
+void Instr::move_reg_qreal(quint8 reg, qreal value)
+{
+    common.type = Real;
+    real_value.reg = reg;
+    real_value.value = value;
+}
+
+void Instr::move_reg_reg(quint8 reg, quint8 src)
+{
+    common.type = Copy;
+    copy.reg = reg;
+    copy.src = src;
+}
+
+void Instr::unary_not(quint8 dest, quint8 src)
+{
+    common.type = UnaryNot;
+    unaryop.src = src;
+    unaryop.output = dest;
+}
+
+void Instr::uminus_real(quint8 dest, quint8 src)
+{
+    common.type = UnaryMinusReal;
+    unaryop.src = src;
+    unaryop.output = dest;
+}
+
+void Instr::uminus_int(quint8 dest, quint8 src)
+{
+    common.type = UnaryMinusInt;
+    unaryop.src = src;
+    unaryop.output = dest;
+}
+
+void Instr::uplus_real(quint8 dest, quint8 src)
+{
+    common.type = UnaryPlusReal;
+    unaryop.src = src;
+    unaryop.output = dest;
+}
+
+void Instr::uplus_int(quint8 dest, quint8 src)
+{
+    common.type = UnaryPlusInt;
+    unaryop.src = src;
+    unaryop.output = dest;
+}
+
+void Instr::ucompl_real(quint8 dest, quint8 src)
+{
+    Q_UNUSED(dest);
+    Q_UNUSED(src);
+    if (qmlVerboseCompiler())
+        qWarning() << "TODO" << Q_FUNC_INFO;
+}
+
+void Instr::ucompl_int(quint8 dest, quint8 src)
+{
+    Q_UNUSED(dest);
+    Q_UNUSED(src);
+    if (qmlVerboseCompiler())
+        qWarning() << "TODO" << Q_FUNC_INFO;
+}
+
+void Instr::math_sin_real(quint8 reg)
+{
+    common.type = MathSinReal;
+    unaryop.src = reg;
+    unaryop.output = reg;
+}
+
+void Instr::math_cos_real(quint8 reg)
+{
+    common.type = MathCosReal;
+    unaryop.src = reg;
+    unaryop.output = reg;
+}
+
+void Instr::math_round_real(quint8 reg)
+{
+    common.type = MathRoundReal;
+    unaryop.src = reg;
+    unaryop.output = reg;
+}
+
+void Instr::math_floor_real(quint8 reg)
+{
+    common.type = MathFloorReal;
+    unaryop.src = reg;
+    unaryop.output = reg;
+}
+
+void Instr::math_pi_real(quint8 reg)
+{
+    common.type = MathPIReal;
+    unaryop.src = reg;
+    unaryop.output = reg;
+}
+
+void Instr::branch_true(quint8 reg, qint16 offset)
+{
+    common.type = BranchTrue;
+    branchop.reg = reg;
+    branchop.offset = offset;
+}
+
+void Instr::branch_false(quint8 reg, qint16 offset)
+{
+    common.type = BranchFalse;
+    branchop.reg = reg;
+    branchop.offset = offset;
+}
+
+void Instr::branch(qint16 offset)
+{
+    common.type = Branch;
+    branchop.offset = offset;
+}
+
+void Instr::block(quint32 mask)
+{
+    common.type = Block;
+    blockop.block = mask;
+}
+
+Bytecode::Bytecode()
+{
+#ifdef QML_THREADED_INTERPRETER
+    decodeInstr = QDeclarativeV4Bindings::getDecodeInstrTable();
+#endif
+}
+
+void Bytecode::append(const Instr &instr)
+{
+    const char *it;
+#ifdef QML_THREADED_INTERPRETER
+    Instr i = instr;
+    i.common.code = decodeInstr[i.common.type];
+    it = (const char *) &i;
+#else
+    it = (const char *) &instr;
+#endif
+    d.append(it, instr.size());
+}
+
+void Bytecode::append(const QVector<Instr> &instrs)
+{
+    foreach (const Instr &i, instrs)
+        append(i);
+}
+
+int Bytecode::remove(int offset)
+{
+    const Instr *instr = (const Instr *) (d.begin() + offset);
+    const int instrSize = instr->size();
+    d.remove(offset, instrSize);
+    return instrSize;
+}
+
+const Instr &Bytecode::operator[](int offset) const
+{
+    return *((const Instr *) (d.begin() + offset));
+}
+
+Instr &Bytecode::operator[](int offset)
+{
+    return *((Instr *) (d.begin() + offset));
+}
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/v4/qdeclarativev4instruction_p.h b/src/declarative/qml/v4/qdeclarativev4instruction_p.h
new file mode 100644
index 0000000000..f6e0bc734a
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4instruction_p.h
@@ -0,0 +1,444 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4INSTRUCTION_P_H
+#define QDECLARATIVEV4INSTRUCTION_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qbytearray.h>
+#include <QtCore/qvector.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+#define FOR_EACH_QML_INSTR(F) \
+    F(Noop, common) \
+    F(BindingId, id) \
+    F(Subscribe, subscribeop) \
+    F(SubscribeId, subscribeop) \
+    F(FetchAndSubscribe, fetchAndSubscribe) \
+    F(LoadId, load) \
+    F(LoadScope, load) \
+    F(LoadRoot, load) \
+    F(LoadAttached, attached) \
+    F(UnaryNot, unaryop) \
+    F(UnaryMinusReal, unaryop) \
+    F(UnaryMinusInt, unaryop) \
+    F(UnaryPlusReal, unaryop) \
+    F(UnaryPlusInt, unaryop) \
+    F(ConvertBoolToInt, unaryop) \
+    F(ConvertBoolToReal, unaryop) \
+    F(ConvertBoolToString, unaryop) \
+    F(ConvertIntToBool, unaryop) \
+    F(ConvertIntToReal, unaryop) \
+    F(ConvertIntToString, unaryop) \
+    F(ConvertRealToBool, unaryop) \
+    F(ConvertRealToInt, unaryop) \
+    F(ConvertRealToString, unaryop) \
+    F(ConvertStringToBool, unaryop) \
+    F(ConvertStringToInt, unaryop) \
+    F(ConvertStringToReal, unaryop) \
+    F(MathSinReal, unaryop) \
+    F(MathCosReal, unaryop) \
+    F(MathRoundReal, unaryop) \
+    F(MathFloorReal, unaryop) \
+    F(MathPIReal, unaryop) \
+    F(Real, real_value) \
+    F(Int, int_value) \
+    F(Bool, bool_value) \
+    F(String, string_value) \
+    F(EnableV4Test, string_value) \
+    F(TestV4Store, storetest) \
+    F(BitAndInt, binaryop) \
+    F(BitOrInt, binaryop) \
+    F(BitXorInt, binaryop) \
+    F(AddReal, binaryop) \
+    F(AddString, binaryop) \
+    F(SubReal, binaryop) \
+    F(MulReal, binaryop) \
+    F(DivReal, binaryop) \
+    F(ModReal, binaryop) \
+    F(LShiftInt, binaryop) \
+    F(RShiftInt, binaryop) \
+    F(URShiftInt, binaryop) \
+    F(GtReal, binaryop) \
+    F(LtReal, binaryop) \
+    F(GeReal, binaryop) \
+    F(LeReal, binaryop) \
+    F(EqualReal, binaryop) \
+    F(NotEqualReal, binaryop) \
+    F(StrictEqualReal, binaryop) \
+    F(StrictNotEqualReal, binaryop) \
+    F(GtString, binaryop) \
+    F(LtString, binaryop) \
+    F(GeString, binaryop) \
+    F(LeString, binaryop) \
+    F(EqualString, binaryop) \
+    F(NotEqualString, binaryop) \
+    F(StrictEqualString, binaryop) \
+    F(StrictNotEqualString, binaryop) \
+    F(NewString, construct) \
+    F(NewUrl, construct) \
+    F(CleanupRegister, cleanup) \
+    F(Copy, copy) \
+    F(Fetch, fetch) \
+    F(Store, store) \
+    F(Jump, jump) \
+    F(BranchTrue, branchop) \
+    F(BranchFalse, branchop) \
+    F(Branch, branchop) \
+    F(Block, blockop) \
+    /* Speculative property resolution */ \
+    F(InitString, initstring)
+
+#if defined(Q_CC_GNU) && (!defined(Q_CC_INTEL) || __INTEL_COMPILER >= 1200)
+#  define QML_THREADED_INTERPRETER
+#endif
+
+#ifdef Q_ALIGNOF
+#  define QML_INSTR_ALIGN_MASK (Q_ALIGNOF(Instr) - 1)
+#else
+#  define QML_INSTR_ALIGN_MASK (sizeof(void *) - 1)
+#endif
+
+#define QML_INSTR_ENUM(I, FMT) I,
+#define QML_INSTR_ADDR(I, FMT) &&op_##I,
+#define QML_INSTR_SIZE(I, FMT) ((sizeof(Instr::instr_##FMT) + QML_INSTR_ALIGN_MASK) & ~QML_INSTR_ALIGN_MASK)
+
+#ifdef QML_THREADED_INTERPRETER
+#  define QML_BEGIN_INSTR(I,FMT) op_##I:
+#  define QML_END_INSTR(I,FMT) code += QML_INSTR_SIZE(I, FMT); instr = (const Instr *) code; goto *instr->common.code;
+#  define QML_INSTR_HEADER void *code;
+#else
+#  define QML_BEGIN_INSTR(I,FMT) case Instr::I:
+#  define QML_END_INSTR(I,FMT) code += QML_INSTR_SIZE(I, FMT); instr = (const Instr *) code; break;
+#  define QML_INSTR_HEADER
+#endif
+
+namespace QDeclarativeJS {
+
+union Instr {
+    int size() const;
+    void dump(int = -1) const;
+    void noop();
+    void load_root(quint8 reg);
+    void load_scope(quint8 reg);
+    void load_id(quint8 reg, quint32 idIndex);
+    void subscribe(qint8 reg, quint16 offset, quint32 index);
+    void subscribeId(qint8 reg, quint16 offset, quint32 index);
+    void move_reg_bool(quint8 reg, bool value);
+    void move_reg_int(quint8 reg, int value);
+    void move_reg_qreal(quint8 reg, qreal value);
+    void move_reg_reg(quint8 reg, quint8 src);
+
+    void unary_not(quint8 dest, quint8 src);
+    void uminus_real(quint8 dest, quint8 src);
+    void uminus_int(quint8 dest, quint8 src);
+    void uplus_real(quint8 dest, quint8 src);
+    void uplus_int(quint8 dest, quint8 src);
+    void ucompl_real(quint8 dest, quint8 src);
+    void ucompl_int(quint8 dest, quint8 src);
+
+    void math_sin_real(quint8 reg);
+    void math_cos_real(quint8 reg);
+    void math_round_real(quint8 reg);
+    void math_floor_real(quint8 reg);
+    void math_pi_real(quint8 reg);
+    void branch_true(quint8 reg, qint16 offset);
+    void branch_false(quint8 reg, qint16 offset);
+    void branch(qint16 offset);
+    void block(quint32 mask);
+
+    enum {
+        FOR_EACH_QML_INSTR(QML_INSTR_ENUM)
+    };
+
+    struct instr_common {
+        QML_INSTR_HEADER
+        quint8 type;
+    };
+
+    struct instr_id {
+        QML_INSTR_HEADER
+        quint8 type;
+        quint16 column;
+        quint32 line;
+    };
+
+    struct instr_init {
+        QML_INSTR_HEADER
+        quint8 type;
+        quint16 subscriptions;
+        quint16 identifiers;
+    };
+
+    struct instr_subscribeop {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint16 offset;
+        quint32 index;
+    };
+
+    struct instr_load {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint32 index;
+    };
+
+    struct instr_attached {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 output;
+        qint8 reg;
+        quint8 exceptionId;
+        quint32 id;
+    };
+
+    struct instr_store {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 output;
+        qint8 reg;
+        quint8 exceptionId;
+        quint32 index;
+    };
+
+    struct instr_storetest {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        qint32 regType;
+    };
+
+    struct instr_fetchAndSubscribe {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint8 exceptionId;
+        quint8 valueType;
+        quint16 subscription;
+        quint16 function;
+    };
+
+    struct instr_fetch{
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint8 exceptionId;
+        quint8 valueType;
+        quint32 index;
+    };
+
+    struct instr_copy {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        qint8 src;
+    };
+
+    struct instr_construct {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+    };
+
+    struct instr_real_value {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        qreal value; // XXX Makes the instruction 12 bytes
+    };
+
+    struct instr_int_value {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        int value;
+    };
+
+    struct instr_bool_value {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        bool value;
+    };
+
+    struct instr_string_value {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint16 length;
+        quint32 offset;
+    };
+
+    struct instr_binaryop {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 output;
+        qint8 left;
+        qint8 right;
+    };
+
+    struct instr_unaryop {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 output;
+        qint8 src;
+    };
+
+    struct instr_jump {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        quint32 count;
+    };
+
+    struct instr_find {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+        qint8 src;
+        quint8 exceptionId;
+        quint16 name;
+        quint16 subscribeIndex;
+    };
+
+    struct instr_cleanup {
+        QML_INSTR_HEADER
+        quint8 type;
+        qint8 reg;
+    };
+
+    struct instr_initstring {
+        QML_INSTR_HEADER
+        quint8 type;
+        quint16 offset;
+        quint32 dataIdx;
+    };
+
+    struct instr_branchop {
+        QML_INSTR_HEADER
+        quint8 type;
+        quint8 reg;
+        qint16 offset;
+    };
+
+    struct instr_blockop {
+        QML_INSTR_HEADER
+        quint8 type;
+        quint32 block;
+    };
+
+    instr_common common;
+    instr_id id;
+    instr_init init;
+    instr_subscribeop subscribeop;
+    instr_load load;
+    instr_attached attached;
+    instr_store store;
+    instr_storetest storetest;
+    instr_fetchAndSubscribe fetchAndSubscribe;
+    instr_fetch fetch;
+    instr_copy copy;
+    instr_construct construct;
+    instr_real_value real_value;
+    instr_int_value int_value;
+    instr_bool_value bool_value;
+    instr_string_value string_value;
+    instr_binaryop binaryop;
+    instr_unaryop unaryop;
+    instr_jump jump;
+    instr_find find;
+    instr_cleanup cleanup;
+    instr_initstring initstring;
+    instr_branchop branchop;
+    instr_blockop blockop;
+};
+
+class Bytecode
+{
+    Q_DISABLE_COPY(Bytecode)
+
+public:
+    Bytecode();
+
+    QByteArray code() const { return d; }
+    const char *constData() const { return d.constData(); }
+    int size() const { return d.size(); }
+    int count() const { return d.count(); }
+    void clear() { d.clear(); }
+    bool isEmpty() const { return d.isEmpty(); }
+    void append(const Instr &instr);
+    void append(const QVector<Instr> &instrs);
+    int remove(int index);
+
+    const Instr &operator[](int offset) const;
+    Instr &operator[](int offset);
+
+private:
+    QByteArray d;
+#ifdef QML_THREADED_INTERPRETER
+    void **decodeInstr;
+#endif
+};
+
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4INSTRUCTION_P_H
+
diff --git a/src/declarative/qml/v4/qdeclarativev4ir.cpp b/src/declarative/qml/v4/qdeclarativev4ir.cpp
new file mode 100644
index 0000000000..7876e6ccea
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4ir.cpp
@@ -0,0 +1,832 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativev4ir_p.h"
+
+#include <QtCore/qtextstream.h>
+#include <QtCore/qdebug.h>
+#include <math.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QDeclarativeJS {
+namespace IR {
+
+inline const char *typeName(Type t)
+{
+    switch (t) {
+    case InvalidType: return "invalid";
+    case UndefinedType: return "undefined";
+    case NullType: return "null";
+    case VoidType: return "void";
+    case StringType: return "string";
+    case UrlType: return "url";
+    case AnchorLineType: return "AnchorLine";
+    case SGAnchorLineType: return "SGAnchorLine";
+    case AttachType: return "AttachType";
+    case ObjectType: return "object";
+    case BoolType: return "bool";
+    case IntType: return "int";
+    case RealType: return "qreal";
+    case RealNaNType: return "NaN";
+    default: return "invalid";
+    }
+}
+
+IR::Type maxType(IR::Type left, IR::Type right)
+{
+    if (left == right)
+        return left;
+    else if (left >= IR::FirstNumberType && right >= IR::FirstNumberType)
+        return qMax(left, right);
+    else if ((left >= IR::FirstNumberType && right == IR::StringType) ||
+             (right >= IR::FirstNumberType && left == IR::StringType))
+        return IR::StringType;
+    else
+        return IR::InvalidType;
+}
+
+
+const char *opname(AluOp op)
+{
+    switch (op) {
+    case OpInvalid: return "?";
+
+    case OpIfTrue: return "(bool)";
+    case OpNot: return "!";
+    case OpUMinus: return "-";
+    case OpUPlus: return "+";
+    case OpCompl: return "~";
+
+    case OpBitAnd: return "&";
+    case OpBitOr: return "|";
+    case OpBitXor: return "^";
+
+    case OpAdd: return "+";
+    case OpSub: return "-";
+    case OpMul: return "*";
+    case OpDiv: return "/";
+    case OpMod: return "%";
+
+    case OpLShift: return "<<";
+    case OpRShift: return ">>";
+    case OpURShift: return ">>>";
+
+    case OpGt: return ">";
+    case OpLt: return "<";
+    case OpGe: return ">=";
+    case OpLe: return "<=";
+    case OpEqual: return "==";
+    case OpNotEqual: return "!=";
+    case OpStrictEqual: return "===";
+    case OpStrictNotEqual: return "!==";
+
+    case OpAnd: return "&&";
+    case OpOr: return "||";
+
+    default: return "?";
+
+    } // switch
+}
+
+AluOp binaryOperator(int op)
+{
+    switch (static_cast<QSOperator::Op>(op)) {
+    case QSOperator::Add: return OpAdd;
+    case QSOperator::And: return OpAnd;
+    case QSOperator::BitAnd: return OpBitAnd;
+    case QSOperator::BitOr: return OpBitOr;
+    case QSOperator::BitXor: return OpBitXor;
+    case QSOperator::Div: return OpDiv;
+    case QSOperator::Equal: return OpEqual;
+    case QSOperator::Ge: return OpGe;
+    case QSOperator::Gt: return OpGt;
+    case QSOperator::Le: return OpLe;
+    case QSOperator::LShift: return OpLShift;
+    case QSOperator::Lt: return OpLt;
+    case QSOperator::Mod: return OpMod;
+    case QSOperator::Mul: return OpMul;
+    case QSOperator::NotEqual: return OpNotEqual;
+    case QSOperator::Or: return OpOr;
+    case QSOperator::RShift: return OpRShift;
+    case QSOperator::StrictEqual: return OpStrictEqual;
+    case QSOperator::StrictNotEqual: return OpStrictNotEqual;
+    case QSOperator::Sub: return OpSub;
+    case QSOperator::URShift: return OpURShift;
+    default: return OpInvalid;
+    }
+}
+
+void Const::dump(QTextStream &out)
+{
+    out << value;
+}
+
+void String::dump(QTextStream &out)
+{
+    out << '"' << escape(value) << '"';
+}
+
+QString String::escape(const QString &s)
+{
+    QString r;
+    foreach (const QChar &ch, s) {
+        if (ch == QLatin1Char('\n'))
+            r += QLatin1String("\\n");
+        else if (ch == QLatin1Char('\r'))
+            r += QLatin1String("\\r");
+        else if (ch == QLatin1Char('\\'))
+            r += QLatin1String("\\\\");
+        else if (ch == QLatin1Char('"'))
+            r += QLatin1String("\\\"");
+        else if (ch == QLatin1Char('\''))
+            r += QLatin1String("\\'");
+        else
+            r += ch;
+    }
+    return r;
+}
+
+Name::Name(Name *base, Type type, const QString &id, Symbol symbol, quint32 line, quint32 column)
+: Expr(type)
+  , base(base)
+  , id(id)
+  , symbol(symbol)
+  , ptr(0)
+  , index(-1)
+  , storage(MemberStorage)
+  , builtin(NoBuiltinSymbol)
+  , line(line)
+  , column(column)
+{
+    if (id.length() == 8 && id == QLatin1String("Math.sin")) {
+        builtin = MathSinBultinFunction;
+    } else if (id.length() == 8 && id == QLatin1String("Math.cos")) {
+        builtin = MathCosBultinFunction;
+    } else if (id.length() == 10 && id == QLatin1String("Math.round")) {
+        builtin = MathRoundBultinFunction;
+    } else if (id.length() == 10 && id == QLatin1String("Math.floor)")) {
+        builtin = MathFloorBultinFunction;
+    } else if (id.length() == 7 && id == QLatin1String("Math.PI")) {
+        builtin = MathPIBuiltinConstant;
+        type = RealType;
+    }
+}
+
+void Name::dump(QTextStream &out)
+{
+    if (base) {
+        base->dump(out);
+        out << '.';
+    }
+
+    out << id;
+}
+
+void Temp::dump(QTextStream &out)
+{
+    out << 't' << index;
+}
+
+void Unop::dump(QTextStream &out)
+{
+    out << opname(op);
+    expr->dump(out);
+}
+
+Type Unop::typeForOp(AluOp op, Expr *expr)
+{
+    switch (op) {
+    case OpIfTrue: return BoolType;
+    case OpNot: return BoolType;
+
+    case OpUMinus:
+    case OpUPlus:
+    case OpCompl:
+        return maxType(expr->type, RealType);
+
+    default:
+        break;
+    }
+
+    return InvalidType;
+}
+
+void Binop::dump(QTextStream &out)
+{
+    left->dump(out);
+    out << ' ' << opname(op) << ' ';
+    right->dump(out);
+}
+
+Type Binop::typeForOp(AluOp op, Expr *left, Expr *right)
+{
+    if (! (left && right))
+        return InvalidType;
+
+    switch (op) {
+    case OpInvalid:
+        return InvalidType;
+
+    // unary operators
+    case OpIfTrue:
+    case OpNot:
+    case OpUMinus:
+    case OpUPlus:
+    case OpCompl:
+        return InvalidType;
+
+    // bit fields
+    case OpBitAnd:
+    case OpBitOr:
+    case OpBitXor:
+        return IntType;
+
+    case OpAdd:
+        if (left->type == StringType)
+            return StringType;
+        return RealType;
+
+    case OpSub:
+    case OpMul:
+    case OpDiv:
+    case OpMod:
+        return RealType;
+
+    case OpLShift:
+    case OpRShift:
+    case OpURShift:
+        return IntType;
+
+    case OpAnd:
+    case OpOr:
+        return BoolType;
+
+    case OpGt:
+    case OpLt:
+    case OpGe:
+    case OpLe:
+    case OpEqual:
+    case OpNotEqual:
+    case OpStrictEqual:
+    case OpStrictNotEqual:
+        return BoolType;
+    } // switch
+
+    return InvalidType;
+}
+
+void Call::dump(QTextStream &out)
+{
+    base->dump(out);
+    out << '(';
+    for (int i = 0; i < args.size(); ++i) {
+        if (i)
+            out << ", ";
+        args.at(i)->dump(out);
+    }
+    out << ')';
+}
+
+Type Call::typeForFunction(Expr *base)
+{
+    if (! base)
+        return InvalidType;
+
+    if (Name *name = base->asName()) {
+        switch (name->builtin) {
+        case MathSinBultinFunction:
+        case MathCosBultinFunction:
+            return RealType;
+
+        case MathRoundBultinFunction:
+        case MathFloorBultinFunction:
+            return IntType;
+
+        case NoBuiltinSymbol:
+        case MathPIBuiltinConstant:
+            break;
+        }
+    } // switch
+
+    return InvalidType;
+}
+
+void Exp::dump(QTextStream &out, Mode)
+{
+    out << "(void) ";
+    expr->dump(out);
+    out << ';';
+}
+
+void Move::dump(QTextStream &out, Mode)
+{
+    target->dump(out);
+    out << " = ";
+    if (source->type != target->type)
+        out << typeName(source->type) << "_to_" << typeName(target->type) << '(';
+    source->dump(out);
+    if (source->type != target->type)
+        out << ')';
+    out << ';';
+}
+
+void Jump::dump(QTextStream &out, Mode mode)
+{
+    Q_UNUSED(mode);
+    out << "goto " << 'L' << target << ';';
+}
+
+void CJump::dump(QTextStream &out, Mode mode)
+{
+    Q_UNUSED(mode);
+    out << "if (";
+    cond->dump(out);
+    out << ") goto " << 'L' << iftrue << "; else goto " << 'L' << iffalse << ';';
+}
+
+void Ret::dump(QTextStream &out, Mode)
+{
+    out << "return";
+    if (expr) {
+        out << ' ';
+        expr->dump(out);
+    }
+    out << ';';
+}
+
+Function::~Function()
+{
+    qDeleteAll(basicBlocks);
+    qDeleteAll(temps);
+}
+
+BasicBlock *Function::newBasicBlock()
+{
+    const int index = basicBlocks.size();
+    return i(new BasicBlock(this, index));
+}
+
+void Function::dump(QTextStream &out)
+{
+    QString fname;
+    if (name)
+        fname = name->asString();
+    else
+        fname = QLatin1String("$anonymous");
+    out << "function " << fname << "() {" << endl;
+    foreach (BasicBlock *bb, basicBlocks) {
+        bb->dump(out);
+    }
+    out << '}' << endl;
+}
+
+Temp *BasicBlock::TEMP(Type type, int index) 
+{ 
+    return function->e(new Temp(type, index)); 
+}
+
+Temp *BasicBlock::TEMP(Type type) 
+{ 
+    return TEMP(type, function->tempCount++); 
+}
+
+Expr *BasicBlock::CONST(double value) 
+{ 
+    return CONST(IR::RealType, value); 
+}
+
+Expr *BasicBlock::CONST(Type type, double value) 
+{ 
+    return function->e(new Const(type, value)); 
+}
+
+Expr *BasicBlock::STRING(const QString &value) 
+{ 
+    return function->e(new String(value)); 
+}
+
+Name *BasicBlock::NAME(const QString &id, quint32 line, quint32 column)
+{ 
+    return NAME(0, id, line, column);
+}
+
+Name *BasicBlock::NAME(Name *base, const QString &id, quint32 line, quint32 column)
+{ 
+    return function->e(new Name(base, InvalidType, id, Name::Unbound, line, column));
+}
+
+Name *BasicBlock::SYMBOL(Type type, const QString &id, const QMetaObject *meta, int index, Name::Storage storage,
+                         quint32 line, quint32 column)
+{
+    Name *name = SYMBOL(/*base = */ 0, type, id, meta, index, line, column);
+    name->storage = storage;
+    return name;
+}
+
+Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index, Name::Storage storage,
+                         quint32 line, quint32 column)
+{
+    Name *name = new Name(base, type, id, Name::Property, line, column);
+    name->meta = meta;
+    name->index = index;
+    name->storage = storage;
+    return function->e(name);
+}
+
+Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index,
+                         quint32 line, quint32 column)
+{
+    Name *name = new Name(base, type, id, Name::Property, line, column);
+    name->meta = meta;
+    name->index = index;
+    return function->e(name);
+}
+
+Name *BasicBlock::ID_OBJECT(const QString &id, const QDeclarativeParser::Object *object, quint32 line, quint32 column)
+{
+    Name *name = new Name(/*base = */ 0, IR::ObjectType, id, Name::IdObject, line, column);
+    name->idObject = object;
+    name->index = object->idIndex;
+    name->storage = Name::IdStorage;
+    return function->e(name);
+}
+
+Name *BasicBlock::ATTACH_TYPE(const QString &id, const QDeclarativeType *attachType, Name::Storage storage,
+                              quint32 line, quint32 column)
+{ 
+    Name *name = new Name(/*base = */ 0, IR::AttachType, id, Name::AttachType, line, column);
+    name->declarativeType = attachType;
+    name->storage = storage;
+    return function->e(name);
+}
+
+
+Expr *BasicBlock::UNOP(AluOp op, Expr *expr) 
+{ 
+    return function->e(new Unop(op, expr)); 
+}
+
+Expr *BasicBlock::BINOP(AluOp op, Expr *left, Expr *right)
+{
+    if (left && right) {
+        if (Const *c1 = left->asConst()) {
+            if (Const *c2 = right->asConst()) {
+                switch (op) {
+                case OpAdd: return CONST(c1->value + c2->value);
+                case OpAnd: return CONST(c1->value ? c2->value : 0);
+                case OpBitAnd: return CONST(int(c1->value) & int(c2->value));
+                case OpBitOr: return CONST(int(c1->value) | int(c2->value));
+                case OpBitXor: return CONST(int(c1->value) ^ int(c2->value));
+                case OpDiv: return CONST(c1->value / c2->value);
+                case OpEqual: return CONST(c1->value == c2->value);
+                case OpGe: return CONST(c1->value >= c2->value);
+                case OpGt: return CONST(c1->value > c2->value);
+                case OpLe: return CONST(c1->value <= c2->value);
+                case OpLShift: return CONST(int(c1->value) << int(c2->value));
+                case OpLt: return CONST(c1->value < c2->value);
+                case OpMod: return CONST(::fmod(c1->value, c2->value));
+                case OpMul: return CONST(c1->value * c2->value);
+                case OpNotEqual: return CONST(c1->value != c2->value);
+                case OpOr: return CONST(c1->value ? c1->value : c2->value);
+                case OpRShift: return CONST(int(c1->value) >> int(c2->value));
+                case OpStrictEqual: return CONST(c1->value == c2->value);
+                case OpStrictNotEqual: return CONST(c1->value != c2->value);
+                case OpSub: return CONST(c1->value - c2->value);
+                case OpURShift: return CONST(unsigned(c1->value) >> int(c2->value));
+
+                case OpIfTrue: // unary ops
+                case OpNot:
+                case OpUMinus:
+                case OpUPlus:
+                case OpCompl:
+                case OpInvalid:
+                    break;
+                }
+            }
+        }
+    }
+
+    return function->e(new Binop(op, left, right));
+}
+
+Expr *BasicBlock::CALL(Expr *base, const QVector<Expr *> &args) 
+{ 
+    return function->e(new Call(base, args));
+}
+
+Stmt *BasicBlock::EXP(Expr *expr) 
+{ 
+    return i(new Exp(expr));
+}
+
+Stmt *BasicBlock::MOVE(Expr *target, Expr *source, bool isMoveForReturn) 
+{ 
+    return i(new Move(target, source, isMoveForReturn));
+}
+
+Stmt *BasicBlock::JUMP(BasicBlock *target) 
+{
+    if (isTerminated())
+        return 0;
+    else
+        return i(new Jump(target));
+}
+
+Stmt *BasicBlock::CJUMP(Expr *cond, BasicBlock *iftrue, BasicBlock *iffalse) 
+{
+    if (isTerminated())
+        return 0;
+    return i(new CJump(cond, iftrue, iffalse));
+}
+
+Stmt *BasicBlock::RET(Expr *expr, Type type, quint32 line, quint32 column)
+{
+    if (isTerminated())
+        return 0;
+    else
+        return i(new Ret(expr, type, line, column));
+}
+
+void BasicBlock::dump(QTextStream &out)
+{
+    out << 'L' << this << ':' << endl;
+    foreach (Stmt *s, statements) {
+        out << '\t';
+        s->dump(out);
+        out << endl;
+    }
+}
+
+void Module::dump(QTextStream &out)
+{
+    foreach (Function *fun, functions) {
+        fun->dump(out);
+        out << endl;
+    }
+}
+
+#ifdef DEBUG_IR_STRUCTURE
+
+static const char *symbolname(Name::Symbol s) 
+{
+    switch (s) {
+    case Name::Unbound:
+        return "Unbound";
+    case Name::IdObject:
+        return "IdObject";
+    case Name::AttachType:
+        return "AttachType";
+    case Name::Object:
+        return "Object";
+    case Name::Property:
+        return "Property";
+    case Name::Slot:
+        return "Slot";
+    default:
+        Q_ASSERT(!"Unreachable");
+        return "Unknown"; 
+    }
+}
+
+static const char *storagename(Name::Storage s)
+{
+    switch (s) {
+    case Name::MemberStorage:
+        return "MemberStorage";
+    case Name::IdStorage:
+        return "IdStorage";
+    case Name::RootStorage:
+        return "RootStorage";
+    case Name::ScopeStorage:
+        return "ScopeStorage";
+    default:
+        Q_ASSERT(!"Unreachable");
+        return "UnknownStorage";
+    }
+}
+
+IRDump::IRDump()
+: indentSize(0)
+{
+}
+
+void IRDump::inc()
+{
+    indentSize++;
+    indentData = QByteArray(indentSize * 4, ' ');
+}
+
+void IRDump::dec()
+{
+    indentSize--;
+    indentData = QByteArray(indentSize * 4, ' ');
+}
+
+void IRDump::dec();
+
+void IRDump::expression(QDeclarativeJS::IR::Expr *e)
+{
+    inc();
+
+    e->accept(this);
+
+    dec();
+}
+
+void IRDump::basicblock(QDeclarativeJS::IR::BasicBlock *b)
+{
+    inc();
+
+    qWarning().nospace() << indent() << "BasicBlock " << b << " {";
+    for (int ii = 0; ii < b->statements.count(); ++ii) {
+        statement(b->statements.at(ii));
+        if (ii != (b->statements.count() - 1))
+            qWarning();
+    }
+    qWarning().nospace() << indent() << "}";
+
+    dec();
+}
+
+void IRDump::statement(QDeclarativeJS::IR::Stmt *s)
+{
+    inc();
+
+    s->accept(this);
+
+    dec();
+}
+
+void IRDump::function(QDeclarativeJS::IR::Function *f)
+{
+    inc();
+
+    qWarning().nospace() << indent() << "Function {";
+    for (int ii = 0; ii < f->basicBlocks.count(); ++ii) {
+        basicblock(f->basicBlocks.at(ii));
+    }
+    qWarning().nospace() << indent() << "}";
+
+    dec();
+}
+
+const char *IRDump::indent()
+{
+    return indentData.constData();
+}
+
+void IRDump::visitConst(QDeclarativeJS::IR::Const *e)
+{
+    qWarning().nospace() << indent() << "Const:Expr { type: " << typeName(e->type) << ", value: " << e->value << "}";
+}
+
+void IRDump::visitString(QDeclarativeJS::IR::String *e)
+{
+    qWarning().nospace() << indent() << "String:Expr { type: " << typeName(e->type) << ", value: " << e->value << "}";
+}
+
+static void namedumprecur(QDeclarativeJS::IR::Name *e, const char *indent) 
+{
+    if (e->base) namedumprecur(e->base, indent);
+    qWarning().nospace() << indent << "    { type: " << typeName(e->type) << ", symbol: " << symbolname(e->symbol) << ", storage: " << storagename(e->storage) << ", id: " << e->id << "}";
+}
+
+void IRDump::visitName(QDeclarativeJS::IR::Name *e)
+{
+    qWarning().nospace() << indent() << "Name:Expr {";
+    namedumprecur(e, indent());
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitTemp(QDeclarativeJS::IR::Temp *e)
+{
+    qWarning().nospace() << indent() << "Temp:Expr { type: " << typeName(e->type) << ", index: " << e->index << " }";
+}
+
+void IRDump::visitUnop(QDeclarativeJS::IR::Unop *e)
+{
+    qWarning().nospace() << indent() << "Unop:Expr { ";
+    qWarning().nospace() << indent() << "    type: " << typeName(e->type) << ", op: " << opname(e->op);
+    qWarning().nospace() << indent() << "    expr: {";
+    expression(e->expr);
+    qWarning().nospace() << indent() << "    }";
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitBinop(QDeclarativeJS::IR::Binop *e)
+{
+    qWarning().nospace() << indent() << "Binop:Expr { ";
+    qWarning().nospace() << indent() << "    type: " << typeName(e->type) << ", op: " << opname(e->op);
+    qWarning().nospace() << indent() << "    left: {";
+    inc();
+    expression(e->left);
+    dec();
+    qWarning().nospace() << indent() << "    },";
+    qWarning().nospace() << indent() << "    right: {";
+    inc();
+    expression(e->right);
+    dec();
+    qWarning().nospace() << indent() << "    }";
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitCall(QDeclarativeJS::IR::Call *e)
+{
+    Q_UNUSED(e);
+    qWarning().nospace() << indent() << "Exp::Call { }";
+}
+
+void IRDump::visitExp(QDeclarativeJS::IR::Exp *s)
+{
+    qWarning().nospace() << indent() << "Exp:Stmt {";
+    expression(s->expr);
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitMove(QDeclarativeJS::IR::Move *s)
+{
+    qWarning().nospace() << indent() << "Move:Stmt {";
+    qWarning().nospace() << indent() << "    isMoveForReturn: " << s->isMoveForReturn;
+    qWarning().nospace() << indent() << "    target: {";
+    inc();
+    expression(s->target);
+    dec();
+    qWarning().nospace() << indent() << "    },";
+    qWarning().nospace() << indent() << "    source: {";
+    inc();
+    expression(s->source);
+    dec();
+    qWarning().nospace() << indent() << "    }";
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitJump(QDeclarativeJS::IR::Jump *s)
+{
+    qWarning().nospace() << indent() << "Jump:Stmt { BasicBlock(" << s->target << ") }";
+}
+
+void IRDump::visitCJump(QDeclarativeJS::IR::CJump *s)
+{
+    qWarning().nospace() << indent() << "CJump:Stmt {";
+    qWarning().nospace() << indent() << "    cond: {";
+    inc();
+    expression(s->cond);
+    dec();
+    qWarning().nospace() << indent() << "    }";
+    qWarning().nospace() << indent() << "    iftrue: BasicBlock(" << s->iftrue << ")";
+    qWarning().nospace() << indent() << "    iffalse: BasicBlock(" << s->iffalse << ")";
+    qWarning().nospace() << indent() << "}";
+}
+
+void IRDump::visitRet(QDeclarativeJS::IR::Ret *s)
+{
+    qWarning().nospace() << indent() << "Ret:Stmt {";
+    qWarning().nospace() << indent() << "    type: " << typeName(s->type);
+    expression(s->expr);
+    qWarning().nospace() << indent() << "}";
+}
+#endif
+
+} // end of namespace IR
+} // end of namespace QDeclarativeJS
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/v4/qdeclarativev4ir_p.h b/src/declarative/qml/v4/qdeclarativev4ir_p.h
new file mode 100644
index 0000000000..93815e9154
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4ir_p.h
@@ -0,0 +1,546 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4IR_P_H
+#define QDECLARATIVEV4IR_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qdeclarativejsast_p.h>
+#include <private/qdeclarativejsengine_p.h>
+#include <private/qdeclarativeparser_p.h>
+#include <private/qdeclarativeimport_p.h>
+#include <private/qdeclarativeengine_p.h>
+#include <private/qdeclarativev4compiler_p.h>
+
+#include <QtCore/qvector.h>
+
+// #define DEBUG_IR_STRUCTURE
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QTextStream;
+class QDeclarativeType;
+
+namespace QDeclarativeJS {
+
+namespace IR {
+
+struct BasicBlock;
+struct Function;
+struct Module;
+
+struct Stmt;
+struct Expr;
+
+// expressions
+struct Const;
+struct String;
+struct Name;
+struct Temp;
+struct Unop;
+struct Binop;
+struct Call;
+
+// statements
+struct Exp;
+struct Move;
+struct Jump;
+struct CJump;
+struct Ret;
+
+enum AluOp {
+    OpInvalid = 0,
+
+    OpIfTrue,
+    OpNot,
+    OpUMinus,
+    OpUPlus,
+    OpCompl,
+
+    OpBitAnd,
+    OpBitOr,
+    OpBitXor,
+
+    OpAdd,
+    OpSub,
+    OpMul,
+    OpDiv,
+    OpMod,
+
+    OpLShift,
+    OpRShift,
+    OpURShift,
+
+    OpGt,
+    OpLt,
+    OpGe,
+    OpLe,
+    OpEqual,
+    OpNotEqual,
+    OpStrictEqual,
+    OpStrictNotEqual,
+
+    OpAnd,
+    OpOr
+};
+AluOp binaryOperator(int op);
+
+enum Type {
+    InvalidType,
+    UndefinedType,
+    NullType,
+    VoidType,
+    StringType,
+    UrlType,
+    AnchorLineType,
+    SGAnchorLineType,
+    AttachType,
+    ObjectType,
+
+    FirstNumberType,
+    BoolType = FirstNumberType,
+    IntType,
+    RealType,
+    RealNaNType
+};
+Type maxType(IR::Type left, IR::Type right);
+
+struct ExprVisitor {
+    virtual ~ExprVisitor() {}
+    virtual void visitConst(Const *) {}
+    virtual void visitString(String *) {}
+    virtual void visitName(Name *) {}
+    virtual void visitTemp(Temp *) {}
+    virtual void visitUnop(Unop *) {}
+    virtual void visitBinop(Binop *) {}
+    virtual void visitCall(Call *) {}
+};
+
+struct StmtVisitor {
+    virtual ~StmtVisitor() {}
+    virtual void visitExp(Exp *) {}
+    virtual void visitMove(Move *) {}
+    virtual void visitJump(Jump *) {}
+    virtual void visitCJump(CJump *) {}
+    virtual void visitRet(Ret *) {}
+};
+
+struct Expr {
+    Type type;
+
+    Expr(Type type): type(type) {}
+    virtual ~Expr() {}
+    virtual void accept(ExprVisitor *) = 0;
+    virtual Const *asConst() { return 0; }
+    virtual String *asString() { return 0; }
+    virtual Name *asName() { return 0; }
+    virtual Temp *asTemp() { return 0; }
+    virtual Unop *asUnop() { return 0; }
+    virtual Binop *asBinop() { return 0; }
+    virtual Call *asCall() { return 0; }
+    virtual void dump(QTextStream &out) = 0;
+};
+
+struct Const: Expr {
+    double value;
+    Const(Type type, double value): Expr(type), value(value) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitConst(this); }
+    virtual Const *asConst() { return this; }
+
+    virtual void dump(QTextStream &out);
+};
+
+struct String: Expr {
+    QString value;
+    String(const QString &value): Expr(StringType), value(value) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitString(this); }
+    virtual String *asString() { return this; }
+
+    virtual void dump(QTextStream &out);
+    static QString escape(const QString &s);
+};
+
+enum BuiltinSymbol {
+    NoBuiltinSymbol,
+    MathSinBultinFunction,
+    MathCosBultinFunction,
+    MathRoundBultinFunction,
+    MathFloorBultinFunction,
+
+    MathPIBuiltinConstant
+};
+
+struct Name: Expr {
+    enum Symbol {
+        Unbound,
+        IdObject,      // This is a load of a id object.  Storage will always be IdStorage
+        AttachType,    // This is a load of an attached object 
+        Object,        // XXX what is this for?
+        Property,      // This is a load of a regular property
+        Slot           // XXX what is this for?
+    };
+
+    enum Storage {
+        MemberStorage, // This is a property of a previously fetched object
+        IdStorage,     // This is a load of a id object.  Symbol will always be IdObject
+        RootStorage,   // This is a property of the root object
+        ScopeStorage   // This is a property of the scope object
+    };
+
+    Name *base;
+    QString id;
+    Symbol symbol;
+    union {
+        void *ptr;
+        const QMetaObject *meta;
+        const QDeclarativeType *declarativeType;
+        const QDeclarativeParser::Object *idObject;
+    };
+    int index;
+    Storage storage;
+    BuiltinSymbol builtin;
+    quint32 line;
+    quint32 column;
+
+    Name(Name *base, Type type, const QString &id, Symbol symbol, quint32 line, quint32 column);
+
+    inline bool is(Symbol s) const { return s == symbol; }
+    inline bool isNot(Symbol s) const { return s != symbol; }
+
+    virtual void accept(ExprVisitor *v) { v->visitName(this); }
+    virtual Name *asName() { return this; }
+
+    virtual void dump(QTextStream &out);
+};
+
+struct Temp: Expr {
+    int index;
+    Temp(Type type, int index): Expr(type), index(index) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitTemp(this); }
+    virtual Temp *asTemp() { return this; }
+
+    virtual void dump(QTextStream &out);
+};
+
+struct Unop: Expr {
+    AluOp op;
+    Expr *expr;
+
+    Unop(AluOp op, Expr *expr)
+        : Expr(typeForOp(op, expr)), op(op), expr(expr) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitUnop(this); }
+    virtual Unop *asUnop() { return this; }
+
+    virtual void dump(QTextStream &out);
+
+private:
+    static Type typeForOp(AluOp op, Expr *expr);
+};
+
+struct Binop: Expr {
+    AluOp op;
+    Expr *left;
+    Expr *right;
+    Binop(AluOp op, Expr *left, Expr *right)
+        : Expr(typeForOp(op, left, right)), op(op), left(left), right(right) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitBinop(this); }
+    virtual Binop *asBinop() { return this; }
+
+    virtual void dump(QTextStream &out);
+
+private:
+    static Type typeForOp(AluOp op, Expr *left, Expr *right);
+};
+
+struct Call: Expr {
+    Expr *base;
+    QVector<Expr *> args;
+
+    Call(Expr *base, const QVector<Expr *> &args)
+        : Expr(typeForFunction(base)), base(base), args(args) {}
+
+    virtual void accept(ExprVisitor *v) { v->visitCall(this); }
+    virtual Call *asCall() { return this; }
+
+    virtual void dump(QTextStream &out);
+
+private:
+    static Type typeForFunction(Expr *base);
+};
+
+struct Stmt {
+    enum Mode {
+        HIR,
+        MIR
+    };
+
+    virtual ~Stmt() {}
+    virtual Stmt *asTerminator() { return 0; }
+
+    virtual void accept(StmtVisitor *) = 0;
+    virtual Exp *asExp() { return 0; }
+    virtual Move *asMove() { return 0; }
+    virtual Jump *asJump() { return 0; }
+    virtual CJump *asCJump() { return 0; }
+    virtual Ret *asRet() { return 0; }
+    virtual void dump(QTextStream &out, Mode mode = HIR) = 0;
+};
+
+struct Exp: Stmt {
+    Expr *expr;
+    Exp(Expr *expr): expr(expr) {}
+
+    virtual void accept(StmtVisitor *v) { v->visitExp(this); }
+    virtual Exp *asExp() { return this; }
+
+    virtual void dump(QTextStream &out, Mode);
+};
+
+struct Move: Stmt {
+    Expr *target;
+    Expr *source;
+    bool isMoveForReturn;
+    Move(Expr *target, Expr *source, bool isMoveForReturn): target(target), source(source), isMoveForReturn(isMoveForReturn) {}
+
+    virtual void accept(StmtVisitor *v) { v->visitMove(this); }
+    virtual Move *asMove() { return this; }
+
+    virtual void dump(QTextStream &out, Mode);
+};
+
+struct Jump: Stmt {
+    BasicBlock *target;
+    Jump(BasicBlock *target): target(target) {}
+
+    virtual Stmt *asTerminator() { return this; }
+
+    virtual void accept(StmtVisitor *v) { v->visitJump(this); }
+    virtual Jump *asJump() { return this; }
+
+    virtual void dump(QTextStream &out, Mode mode);
+};
+
+struct CJump: Stmt {
+    Expr *cond;
+    BasicBlock *iftrue;
+    BasicBlock *iffalse;
+    CJump(Expr *cond, BasicBlock *iftrue, BasicBlock *iffalse)
+        : cond(cond), iftrue(iftrue), iffalse(iffalse) {}
+
+    virtual Stmt *asTerminator() { return this; }
+
+    virtual void accept(StmtVisitor *v) { v->visitCJump(this); }
+    virtual CJump *asCJump() { return this; }
+
+    virtual void dump(QTextStream &out, Mode mode);
+};
+
+struct Ret: Stmt {
+    Expr *expr;
+    Type type;
+    quint32 line;
+    quint32 column;
+    Ret(Expr *expr, Type type, quint32 line, quint32 column): expr(expr), type(type), line(line), column(column) {}
+
+    virtual Stmt *asTerminator() { return this; }
+
+    virtual void accept(StmtVisitor *v) { v->visitRet(this); }
+    virtual Ret *asRet() { return this; }
+
+    virtual void dump(QTextStream &out, Mode);
+};
+
+struct Function {
+    Module *module;
+    const NameId *name;
+    int tempCount;
+    QVector<BasicBlock *> basicBlocks;
+    QVector<Expr *> temps;
+
+    template <typename BB> inline BB i(BB i) { basicBlocks.append(i); return i; }
+    template <typename E> inline E e(E e) { temps.append(e); return e; }
+
+    Function(Module *module, const NameId *name = 0): module(module), name(name), tempCount(0) {}
+    ~Function();
+
+    BasicBlock *newBasicBlock();
+
+    virtual void dump(QTextStream &out);
+};
+
+struct BasicBlock {
+    Function *function;
+    int index;
+    QVector<Stmt *> statements;
+    int offset;
+
+    BasicBlock(Function *function, int index): function(function), index(index), offset(-1) {}
+    ~BasicBlock() { qDeleteAll(statements); }
+
+    template <typename Instr> inline Instr i(Instr i) { statements.append(i); return i; }
+
+    inline bool isEmpty() const {
+        return statements.isEmpty();
+    }
+
+    inline Stmt *terminator() const {
+        if (! statements.isEmpty() && statements.last()->asTerminator() != 0)
+            return statements.last();
+        return 0;
+    }
+
+    inline bool isTerminated() const {
+        if (terminator() != 0)
+            return true;
+        return false;
+    }
+
+    Temp *TEMP(Type type, int index);
+    Temp *TEMP(Type type);
+
+    Expr *CONST(double value);
+    Expr *CONST(Type type, double value);
+    Expr *STRING(const QString &value);
+
+    Name *NAME(const QString &id, quint32 line, quint32 column);
+    Name *NAME(Name *base, const QString &id, quint32 line, quint32 column);
+    Name *SYMBOL(Type type, const QString &id, const QMetaObject *meta, int index, Name::Storage storage, quint32 line, quint32 column);
+    Name *SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index, quint32 line, quint32 column);
+    Name *SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index, Name::Storage storage, quint32 line, quint32 column);
+    Name *ID_OBJECT(const QString &id, const QDeclarativeParser::Object *object, quint32 line, quint32 column);
+    Name *ATTACH_TYPE(const QString &id, const QDeclarativeType *attachType, Name::Storage storage, quint32 line, quint32 column);
+
+    Expr *UNOP(AluOp op, Expr *expr);
+    Expr *BINOP(AluOp op, Expr *left, Expr *right);
+    Expr *CALL(Expr *base, const QVector<Expr *> &args);
+
+    Stmt *EXP(Expr *expr);
+    Stmt *MOVE(Expr *target, Expr *source, bool = false);
+
+    Stmt *JUMP(BasicBlock *target);
+    Stmt *CJUMP(Expr *cond, BasicBlock *iftrue, BasicBlock *iffalse);
+    Stmt *RET(Expr *expr, Type type, quint32 line, quint32 column);
+
+    virtual void dump(QTextStream &out);
+};
+
+struct Module {
+    QVector<Function *> functions;
+
+    Module() {}
+    ~Module() { qDeleteAll(functions); }
+
+    template <typename BB> inline BB i(BB i) { functions.append(i); return i; }
+
+    Function *newFunction(const NameId *name = 0) { return i(new Function(this, name)); }
+
+    virtual void dump(QTextStream &out);
+};
+
+#ifdef DEBUG_IR_STRUCTURE
+struct IRDump : public ExprVisitor,
+                public StmtVisitor 
+{
+public:
+    IRDump();
+
+    void expression(QDeclarativeJS::IR::Expr *);
+    void basicblock(QDeclarativeJS::IR::BasicBlock *);
+    void statement(QDeclarativeJS::IR::Stmt *);
+    void function(QDeclarativeJS::IR::Function *);
+protected:
+
+    const char *indent();
+
+    //
+    // expressions
+    //
+    virtual void visitConst(QDeclarativeJS::IR::Const *e);
+    virtual void visitString(QDeclarativeJS::IR::String *e);
+    virtual void visitName(QDeclarativeJS::IR::Name *e);
+    virtual void visitTemp(QDeclarativeJS::IR::Temp *e);
+    virtual void visitUnop(QDeclarativeJS::IR::Unop *e);
+    virtual void visitBinop(QDeclarativeJS::IR::Binop *e);
+    virtual void visitCall(QDeclarativeJS::IR::Call *e);
+
+    //
+    // statements
+    //
+    virtual void visitExp(QDeclarativeJS::IR::Exp *s);
+    virtual void visitMove(QDeclarativeJS::IR::Move *s);
+    virtual void visitJump(QDeclarativeJS::IR::Jump *s);
+    virtual void visitCJump(QDeclarativeJS::IR::CJump *s);
+    virtual void visitRet(QDeclarativeJS::IR::Ret *s);
+
+private:
+    int indentSize;
+    QByteArray indentData;
+    void inc();
+    void dec();
+};
+#endif
+
+} // end of namespace IR
+
+} // end of namespace QDeclarativeJS
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4IR_P_H
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
new file mode 100644
index 0000000000..103d5ba0df
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
@@ -0,0 +1,1315 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativev4irbuilder_p.h"
+
+#include <private/qdeclarativeglobalscriptclass_p.h> // For illegalNames
+#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
+#include <private/qsganchors_p_p.h> // For AnchorLine
+#include <private/qdeclarativetypenamecache_p.h>
+
+DEFINE_BOOL_CONFIG_OPTION(qmlVerboseCompiler, QML_VERBOSE_COMPILER)
+
+QT_BEGIN_NAMESPACE
+
+using namespace QDeclarativeJS;
+
+static IR::Type irTypeFromVariantType(int t, QDeclarativeEnginePrivate *engine, const QMetaObject *meta)
+{
+    switch (t) {
+    case QMetaType::Bool:
+        return IR::BoolType;
+
+    case QMetaType::Int:
+        return IR::IntType;
+
+    case QMetaType::QReal:
+        return IR::RealType;
+
+    case QMetaType::QString:
+        return IR::StringType;
+
+    case QMetaType::QUrl:
+        return IR::UrlType;
+
+    default:
+        if (t == qMetaTypeId<QDeclarativeAnchorLine>())
+            return IR::AnchorLineType;
+        else if (t == qMetaTypeId<QSGAnchorLine>())
+            return IR::SGAnchorLineType;
+        else if (const QMetaObject *m = engine->metaObjectForType(t)) {
+            meta = m;
+            return IR::ObjectType;
+        }
+
+        return IR::InvalidType;
+    }
+}
+
+QDeclarativeV4IRBuilder::QDeclarativeV4IRBuilder(const QDeclarativeV4Compiler::Expression *expr, 
+                                                             QDeclarativeEnginePrivate *engine)
+: m_expression(expr), m_engine(engine), _module(0), _function(0), _block(0), _discard(false)
+{
+}
+
+QDeclarativeJS::IR::Function *
+QDeclarativeV4IRBuilder::operator()(QDeclarativeJS::IR::Module *module, 
+                                         QDeclarativeJS::AST::Node *ast)
+{
+    bool discarded = false;
+
+    qSwap(_module, module);
+
+    IR::Function *function = _module->newFunction();
+    IR::BasicBlock *block = function->newBasicBlock();
+
+    qSwap(_discard, discarded);
+    qSwap(_function, function);
+    qSwap(_block, block);
+
+    ExprResult r;
+    AST::SourceLocation location;
+    if (AST::ExpressionNode *asExpr = ast->expressionCast()) {
+        r = expression(asExpr);
+        location = asExpr->firstSourceLocation();
+    } else if (AST::Statement *asStmt = ast->statementCast()) {
+        r = statement(asStmt);
+        location = asStmt->firstSourceLocation();
+    }
+
+    //_block->MOVE(_block->TEMP(IR::InvalidType), r.code);
+    if (r.code) {
+        const QMetaObject *m = 0;
+        const IR::Type targetType = irTypeFromVariantType(m_expression->property->type, m_engine, m);
+        if (targetType != r.type()) {
+            IR::Expr *x = _block->TEMP(targetType);
+            _block->MOVE(x, r, true);
+            r.code = x;
+        }
+        _block->RET(r.code, targetType, location.startLine, location.startColumn);
+    }
+
+    qSwap(_block, block);
+    qSwap(_function, function);
+    qSwap(_discard, discarded);
+
+    qSwap(_module, module);
+
+    return discarded?0:function;
+}
+
+bool QDeclarativeV4IRBuilder::buildName(QStringList &name,
+                                              AST::Node *node,
+                                              QList<AST::ExpressionNode *> *nodes)
+{
+    if (node->kind == AST::Node::Kind_IdentifierExpression) {
+        name << static_cast<AST::IdentifierExpression*>(node)->name->asString();
+        if (nodes) *nodes << static_cast<AST::IdentifierExpression*>(node);
+    } else if (node->kind == AST::Node::Kind_FieldMemberExpression) {
+        AST::FieldMemberExpression *expr =
+            static_cast<AST::FieldMemberExpression *>(node);
+
+        if (!buildName(name, expr->base, nodes))
+            return false;
+
+        name << expr->name->asString();
+        if (nodes) *nodes << expr;
+    } else {
+        return false;
+    }
+
+    return true;
+}
+
+void QDeclarativeV4IRBuilder::discard() 
+{ 
+    _discard = true; 
+}
+
+QDeclarativeV4IRBuilder::ExprResult 
+QDeclarativeV4IRBuilder::expression(AST::ExpressionNode *ast)
+{
+    ExprResult r;
+    if (ast) {
+        qSwap(_expr, r);
+        accept(ast);
+        qSwap(_expr, r);
+
+        if (r.is(IR::InvalidType))
+            discard();
+        else {
+            Q_ASSERT(r.hint == r.format);
+        }
+    }
+
+    return r;
+}
+
+void QDeclarativeV4IRBuilder::condition(AST::ExpressionNode *ast, IR::BasicBlock *iftrue, IR::BasicBlock *iffalse)
+{
+    if (! ast)
+        return;
+    ExprResult r(iftrue, iffalse);
+    qSwap(_expr, r);
+    accept(ast);
+    qSwap(_expr, r);
+
+    if (r.format != ExprResult::cx) {
+        if (! r.code)
+            discard();
+
+        Q_ASSERT(r.hint == ExprResult::cx);
+        Q_ASSERT(r.format == ExprResult::ex);
+
+        if (r.type() != IR::BoolType) {
+            IR::Temp *t = _block->TEMP(IR::BoolType);
+            _block->MOVE(t, r);
+            r = t;
+        }
+
+        _block->CJUMP(_block->UNOP(IR::OpIfTrue, r), iftrue, iffalse);
+    }
+}
+
+QDeclarativeV4IRBuilder::ExprResult
+QDeclarativeV4IRBuilder::statement(AST::Statement *ast)
+{
+    ExprResult r;
+    if (ast) {
+        qSwap(_expr, r);
+        accept(ast);
+        qSwap(_expr, r);
+
+        if (r.is(IR::InvalidType))
+            discard();
+        else {
+            Q_ASSERT(r.hint == r.format);
+        }
+    }
+
+    return r;
+}
+
+void QDeclarativeV4IRBuilder::sourceElement(AST::SourceElement *ast)
+{
+    accept(ast);
+}
+
+void QDeclarativeV4IRBuilder::implicitCvt(ExprResult &expr, IR::Type type)
+{
+    if (expr.type() == type)
+        return; // nothing to do
+
+    IR::Expr *x = _block->TEMP(type);
+    _block->MOVE(x, expr.code);
+    expr.code = x;
+}
+
+// QML
+bool QDeclarativeV4IRBuilder::visit(AST::UiProgram *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiImportList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiImport *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiPublicMember *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiSourceElement *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiObjectDefinition *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiObjectInitializer *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiObjectBinding *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiScriptBinding *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiArrayBinding *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiObjectMemberList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiArrayMemberList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiQualifiedId *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiSignature *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiFormalList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UiFormal *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+
+// JS
+bool QDeclarativeV4IRBuilder::visit(AST::Program *ast)
+{
+    _function = _module->newFunction();
+    _block = _function->newBasicBlock();
+    accept(ast->elements);
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::SourceElements *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FunctionSourceElement *)
+{
+    return true; // look inside
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::StatementSourceElement *)
+{
+    return true; // look inside
+}
+
+// object literals
+bool QDeclarativeV4IRBuilder::visit(AST::PropertyNameAndValueList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::IdentifierPropertyName *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::StringLiteralPropertyName *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NumericLiteralPropertyName *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+
+// array literals
+bool QDeclarativeV4IRBuilder::visit(AST::ElementList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::Elision *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+
+// function calls
+bool QDeclarativeV4IRBuilder::visit(AST::ArgumentList *)
+{
+    Q_ASSERT(!"unreachable");
+    return false;
+}
+
+// expressions
+bool QDeclarativeV4IRBuilder::visit(AST::ObjectLiteral *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ArrayLiteral *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ThisExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::IdentifierExpression *ast)
+{
+    const quint32 line = ast->identifierToken.startLine;
+    const quint32 column = ast->identifierToken.startColumn;
+
+    const QString name = ast->name->asString();
+
+    if (name.at(0) == QLatin1Char('u') && name.length() == 9 && name == QLatin1String("undefined")) {
+        _expr.code = _block->CONST(IR::UndefinedType, 0); // ### undefined value
+    } else if(m_engine->globalClass->illegalNames().contains(name) ) {
+        if (qmlVerboseCompiler()) qWarning() << "*** illegal symbol:" << name;
+        return false;
+    } else if (const QDeclarativeParser::Object *obj = m_expression->ids.value(name)) {
+        IR::Name *code = _block->ID_OBJECT(name, obj, line, column);
+        if (obj == m_expression->component)
+            code->storage = IR::Name::RootStorage;
+        _expr.code = code;
+    } else if (QDeclarativeTypeNameCache::Data *typeNameData = m_expression->importCache->data(name)) {
+        if (typeNameData->importedScriptIndex != -1) {
+            // We don't support invoking imported scripts
+        } else if (typeNameData->type) {
+            _expr.code = _block->ATTACH_TYPE(name, typeNameData->type, IR::Name::ScopeStorage, line, column);
+        } else if (typeNameData->typeNamespace) {
+            // We don't support namespaces
+        } else {
+            Q_ASSERT(!"Unreachable");
+        }
+    } else {
+        bool found = false;
+
+        if (m_expression->context != m_expression->component) {
+            // RootStorage is more efficient than ScopeStorage, so prefer that if they are the same
+            QDeclarativePropertyCache *cache = m_expression->context->synthCache;
+            const QMetaObject *metaObject = m_expression->context->metaObject();
+            if (!cache) cache = m_engine->cache(metaObject);
+
+            QDeclarativePropertyCache::Data *data = cache->property(name);
+
+            if (data && data->revision != 0) {
+                if (qmlVerboseCompiler()) 
+                    qWarning() << "*** versioned symbol:" << name;
+                discard();
+                return false;
+            }
+
+            if (data && !(data->flags & QDeclarativePropertyCache::Data::IsFunction)) {
+                IR::Type irType = irTypeFromVariantType(data->propType, m_engine, metaObject);
+                _expr.code = _block->SYMBOL(irType, name, metaObject, data->coreIndex, IR::Name::ScopeStorage, line, column);
+                found = true;
+            } 
+        }
+
+        if (!found) {
+            QDeclarativePropertyCache *cache = m_expression->component->synthCache;
+            const QMetaObject *metaObject = m_expression->component->metaObject();
+            if (!cache) cache = m_engine->cache(metaObject);
+
+            QDeclarativePropertyCache::Data *data = cache->property(name);
+
+            if (data && data->revision != 0) {
+                if (qmlVerboseCompiler()) 
+                    qWarning() << "*** versioned symbol:" << name;
+                discard();
+                return false;
+            }
+
+            if (data && !(data->flags & QDeclarativePropertyCache::Data::IsFunction)) {
+                IR::Type irType = irTypeFromVariantType(data->propType, m_engine, metaObject);
+                _expr.code = _block->SYMBOL(irType, name, metaObject, data->coreIndex, IR::Name::RootStorage, line, column);
+                found = true;
+            } 
+        }
+
+        if (!found && qmlVerboseCompiler())
+            qWarning() << "*** unknown symbol:" << name;
+    }
+
+    if (_expr.code && _expr.hint == ExprResult::cx) {
+        _expr.format = ExprResult::cx;
+
+        if (_expr.type() != IR::BoolType) {
+            IR::Temp *t = _block->TEMP(IR::BoolType);
+            _block->MOVE(t, _expr);
+            _expr.code = t;
+        }
+
+        _block->CJUMP(_expr.code, _expr.iftrue, _expr.iffalse);
+        _expr.code = 0;
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NullExpression *)
+{
+    // ### TODO: cx format
+    _expr.code = _block->CONST(IR::NullType, 0);
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::TrueLiteral *)
+{
+    // ### TODO: cx format
+    _expr.code = _block->CONST(IR::BoolType, 1);
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FalseLiteral *)
+{
+    // ### TODO: cx format
+    _expr.code = _block->CONST(IR::BoolType, 0);
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::StringLiteral *ast)
+{
+    // ### TODO: cx format
+    _expr.code = _block->STRING(ast->value->asString());
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NumericLiteral *ast)
+{
+    if (_expr.hint == ExprResult::cx) {
+        _expr.format = ExprResult::cx;
+        _block->JUMP(ast->value ? _expr.iftrue : _expr.iffalse);
+    } else {
+        _expr.code = _block->CONST(ast->value);
+    }
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::RegExpLiteral *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NestedExpression *)
+{
+    return true; // the value of the nested expression
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ArrayMemberExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FieldMemberExpression *ast)
+{
+    if (IR::Expr *left = expression(ast->base)) {
+        if (IR::Name *baseName = left->asName()) {
+            const quint32 line = ast->identifierToken.startLine;
+            const quint32 column = ast->identifierToken.startColumn;
+
+            QString name = ast->name->asString();
+
+            switch(baseName->symbol) {
+            case IR::Name::Unbound:
+                break;
+
+            case IR::Name::AttachType:
+                if (name.at(0).isUpper()) {
+                    QByteArray utf8Name = name.toUtf8();
+                    const char *enumName = utf8Name.constData();
+
+                    const QMetaObject *meta = baseName->declarativeType->metaObject();
+                    bool found = false;
+                    for (int ii = 0; !found && ii < meta->enumeratorCount(); ++ii) {
+                        QMetaEnum e = meta->enumerator(ii);
+                        for (int jj = 0; !found && jj < e.keyCount(); ++jj) {
+                            if (0 == strcmp(e.key(jj), enumName)) {
+                                found = true;
+                                _expr.code = _block->CONST(IR::IntType, e.value(jj));
+                            }
+                        }
+                    }
+
+                    if (!found && qmlVerboseCompiler())
+                        qWarning() << "*** unresolved enum:" 
+                                   << (baseName->id + QLatin1String(".") + ast->name->asString());
+                } else if(const QMetaObject *attachedMeta = baseName->declarativeType->attachedPropertiesType()) {
+                    QDeclarativePropertyCache *cache = m_engine->cache(attachedMeta);
+                    QDeclarativePropertyCache::Data *data = cache->property(name);
+
+                    if (!data || data->flags & QDeclarativePropertyCache::Data::IsFunction)
+                        return false; // Don't support methods (or non-existing properties ;)
+
+                    if(!(data->flags & QDeclarativePropertyCache::Data::IsFinal)) {
+                        if (qmlVerboseCompiler())
+                            qWarning() << "*** non-final attached property:"
+                                       << (baseName->id + QLatin1String(".") + ast->name->asString());
+                        return false; // We don't know enough about this property
+                    }
+
+                    IR::Type irType = irTypeFromVariantType(data->propType, m_engine, attachedMeta);
+                    _expr.code = _block->SYMBOL(baseName, irType, name, attachedMeta, data->coreIndex, line, column);
+                }
+                break;
+
+            case IR::Name::IdObject: {
+                const QDeclarativeParser::Object *idObject = baseName->idObject;
+                QDeclarativePropertyCache *cache = 
+                    idObject->synthCache?idObject->synthCache:m_engine->cache(idObject->metaObject());
+
+                QDeclarativePropertyCache::Data *data = cache->property(name);
+
+                if (!data || data->flags & QDeclarativePropertyCache::Data::IsFunction)
+                    return false; // Don't support methods (or non-existing properties ;)
+
+                if (data->revision != 0) {
+                    if (qmlVerboseCompiler()) 
+                        qWarning() << "*** versioned symbol:" << name;
+                    discard();
+                    return false;
+                }
+
+                IR::Type irType = irTypeFromVariantType(data->propType, m_engine, idObject->metaObject());
+                _expr.code = _block->SYMBOL(baseName, irType, name,
+                                            idObject->metaObject(), data->coreIndex, line, column);
+                }
+                break;
+
+            case IR::Name::Property: 
+                if (baseName->type == IR::ObjectType) {
+                    const QMetaObject *m = 
+                        m_engine->metaObjectForType(baseName->meta->property(baseName->index).userType());
+                    QDeclarativePropertyCache *cache = m_engine->cache(m);
+
+                    QDeclarativePropertyCache::Data *data = cache->property(name);
+
+                    if (!data || data->flags & QDeclarativePropertyCache::Data::IsFunction)
+                        return false; // Don't support methods (or non-existing properties ;)
+
+                    if(!(data->flags & QDeclarativePropertyCache::Data::IsFinal)) {
+                        if (qmlVerboseCompiler())
+                            qWarning() << "*** non-final property access:"
+                                << (baseName->id + QLatin1String(".") + ast->name->asString());
+                        return false; // We don't know enough about this property
+                    }
+
+                    IR::Type irType = irTypeFromVariantType(data->propType, m_engine, baseName->meta);
+                    _expr.code = _block->SYMBOL(baseName, irType, name,
+                                                baseName->meta, data->coreIndex, line, column);
+                }
+                break;
+
+            case IR::Name::Object: 
+            case IR::Name::Slot:
+                break;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NewMemberExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NewExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::CallExpression *ast)
+{
+    QStringList names;
+    QList<AST::ExpressionNode *> nameNodes;
+    if (buildName(names, ast->base, &nameNodes)) {
+        //ExprResult base = expression(ast->base);
+        const QString id = names.join(QLatin1String("."));
+        const quint32 line = nameNodes.last()->firstSourceLocation().startLine;
+        const quint32 column = nameNodes.last()->firstSourceLocation().startColumn;
+        IR::Expr *base = _block->NAME(id, line, column);
+
+        QVector<IR::Expr *> args;
+        for (AST::ArgumentList *it = ast->arguments; it; it = it->next)
+            args.append(expression(it->expression));
+
+        IR::Temp *r = _block->TEMP(IR::InvalidType);
+        IR::Expr *call = _block->CALL(base, args);
+        _block->MOVE(r, call);
+        r->type = call->type;
+        _expr.code = r;
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::PostIncrementExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::PostDecrementExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::DeleteExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::VoidExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::TypeOfExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::PreIncrementExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::PreDecrementExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UnaryPlusExpression *ast)
+{
+    ExprResult expr = expression(ast->expression);
+    if (expr.isNot(IR::InvalidType)) {
+        if (expr.code->asConst() != 0) {
+            _expr = expr;
+            return false;
+        }
+
+        IR::Expr *code = _block->UNOP(IR::OpUPlus, expr);
+        _expr.code = _block->TEMP(code->type);
+        _block->MOVE(_expr, code);
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::UnaryMinusExpression *ast)
+{
+    ExprResult expr = expression(ast->expression);
+    if (expr.isNot(IR::InvalidType)) {
+        if (IR::Const *c = expr.code->asConst()) {
+            _expr = expr;
+            _expr.code = _block->CONST(-c->value);
+            return false;
+        }
+
+        IR::Expr *code = _block->UNOP(IR::OpUMinus, expr);
+        _expr.code = _block->TEMP(code->type);
+        _block->MOVE(_expr, code);
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::TildeExpression *ast)
+{
+    ExprResult expr = expression(ast->expression);
+    if (expr.isNot(IR::InvalidType)) {
+        if (IR::Const *c = expr.code->asConst()) {
+            _expr = expr;
+            _expr.code = _block->CONST(~int(c->value));
+            return false;
+        }
+        IR::Expr *code = _block->UNOP(IR::OpCompl, expr);
+        _expr.code = _block->TEMP(code->type);
+        _block->MOVE(_expr, code);
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::NotExpression *ast)
+{
+    ExprResult expr = expression(ast->expression);
+
+    if (expr.isNot(IR::InvalidType)) {
+        if (IR::Const *c = expr.code->asConst()) {
+            _expr = expr;
+            _expr.code = _block->CONST(!c->value);
+            return false;
+        }
+
+        IR::Expr *code = _block->UNOP(IR::OpNot, expr);
+        _expr.code = _block->TEMP(code->type);
+        _block->MOVE(_expr, code);
+
+    } else if (expr.hint == ExprResult::cx) {
+        expr.format = ExprResult::cx;
+        _block->CJUMP(_block->UNOP(IR::OpNot, expr), _expr.iftrue, _expr.iffalse);
+        return false;
+    }
+
+    return false;
+}
+
+void QDeclarativeV4IRBuilder::binop(AST::BinaryExpression *ast, ExprResult left, ExprResult right)
+{
+    if (IR::Type t = maxType(left.type(), right.type())) {
+        implicitCvt(left, t);
+        implicitCvt(right, t);
+
+        if (_expr.hint == ExprResult::cx) {
+            _expr.format = ExprResult::cx;
+            _block->CJUMP(_block->BINOP(IR::binaryOperator(ast->op), left, right), _expr.iftrue, _expr.iffalse);
+        } else {
+            IR::Expr *code = _block->BINOP(IR::binaryOperator(ast->op), left, right);
+            _expr.code = _block->TEMP(code->type);
+            _block->MOVE(_expr.code, code);
+        }
+    }
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::BinaryExpression *ast)
+{
+    switch (ast->op) {
+    case QSOperator::And: {
+        if (_expr.hint == ExprResult::cx) {
+            _expr.format = ExprResult::cx;
+
+            Q_ASSERT(_expr.iffalse != 0);
+            Q_ASSERT(_expr.iftrue != 0);
+
+            IR::BasicBlock *iftrue = _function->newBasicBlock();
+            condition(ast->left, iftrue, _expr.iffalse);
+
+            _block = iftrue;
+            condition(ast->right, _expr.iftrue, _expr.iffalse);
+        } else {
+            IR::BasicBlock *iftrue = _function->newBasicBlock();
+            IR::BasicBlock *iffalse = _function->newBasicBlock();
+            IR::BasicBlock *endif = _function->newBasicBlock();
+
+            condition(ast->left, iftrue, iffalse);
+
+            IR::Temp *r = _block->TEMP(IR::InvalidType);
+
+            _block = iffalse;
+            _block->MOVE(r, _block->CONST(0)); // ### use the right null value
+            _block->JUMP(endif);
+
+            _block = iftrue;
+            ExprResult right = expression(ast->right);
+            _block->MOVE(r, right);
+            _block->JUMP(endif);
+
+            _block = endif;
+
+            r->type = right.type(); // ### not exactly, it can be IR::BoolType.
+            _expr.code = r;
+        }
+    } break;
+
+    case QSOperator::Or: {
+        IR::BasicBlock *iftrue = _function->newBasicBlock();
+        IR::BasicBlock *endif = _function->newBasicBlock();
+
+        ExprResult left = expression(ast->left);
+        IR::Temp *r = _block->TEMP(left.type());
+        _block->MOVE(r, left);
+
+        IR::Expr *cond = r;
+        if (r->type != IR::BoolType) {
+            cond = _block->TEMP(IR::BoolType);
+            _block->MOVE(cond, r);
+        }
+
+        _block->CJUMP(_block->UNOP(IR::OpNot, cond), iftrue, endif);
+
+        _block = iftrue;
+        ExprResult right = expression(ast->right);
+        _block->MOVE(r, right);
+
+        if (left.type() != right.type())
+            discard();
+
+        _expr.code = r;
+
+        _block = endif;
+    } break;
+
+    case QSOperator::Lt:
+    case QSOperator::Gt:
+    case QSOperator::Le:
+    case QSOperator::Ge: {
+        ExprResult left = expression(ast->left);
+        ExprResult right = expression(ast->right);
+        if (left.type() == IR::StringType && right.type() == IR::StringType) {
+            binop(ast, left, right);
+        } else if (left.isValid() && right.isValid()) {
+            implicitCvt(left, IR::RealType);
+            implicitCvt(right, IR::RealType);
+            binop(ast, left, right);
+        }
+    } break;
+
+    case QSOperator::NotEqual:
+    case QSOperator::Equal: {
+        ExprResult left = expression(ast->left);
+        ExprResult right = expression(ast->right);
+        if ((left.type() == IR::NullType || left.type() == IR::UndefinedType) &&
+                (right.type() == IR::NullType || right.type() == IR::UndefinedType)) {
+            const bool isEq = ast->op == QSOperator::Equal;
+            if (_expr.hint == ExprResult::cx) {
+                _expr.format = ExprResult::cx;
+                _block->JUMP(isEq ? _expr.iftrue : _expr.iffalse);
+            } else {
+                _expr.code = _block->CONST(IR::BoolType, isEq ? 1 : 0);
+            }
+        } else if ((left.type() == IR::StringType && right.type() >= IR::FirstNumberType) ||
+                   (left.type() >= IR::FirstNumberType && right.type() == IR::StringType)) {
+            implicitCvt(left, IR::RealType);
+            implicitCvt(right, IR::RealType);
+            binop(ast, left, right);
+        } else if (left.type() == IR::BoolType || right.type() == IR::BoolType) {
+            implicitCvt(left, IR::BoolType);
+            implicitCvt(right, IR::BoolType);
+        } else if (left.isValid() && right.isValid()) {
+            binop(ast, left, right);
+        }
+    } break;
+
+    case QSOperator::StrictEqual:
+    case QSOperator::StrictNotEqual: {
+        ExprResult left = expression(ast->left);
+        ExprResult right = expression(ast->right);
+        if (left.type() == right.type()) {
+            binop(ast, left, right);
+        } else if (left.type() >= IR::BoolType && right.type() >= IR::BoolType) {
+            // left and right have numeric type (int or real)
+            binop(ast, left, right);
+        } else if (left.isValid() && right.isValid()) {
+            const bool isEq = ast->op == QSOperator::StrictEqual;
+            if (_expr.hint == ExprResult::cx) {
+                _expr.format = ExprResult::cx;
+                _block->JUMP(isEq ? _expr.iftrue : _expr.iffalse);
+            } else {
+                _expr.code = _block->CONST(IR::BoolType, isEq ? 1 : 0);
+            }
+        }
+    } break;
+
+    case QSOperator::BitAnd:
+    case QSOperator::BitOr:
+    case QSOperator::BitXor:
+    case QSOperator::LShift:
+    case QSOperator::RShift:
+    case QSOperator::URShift: {
+        ExprResult left = expression(ast->left);
+        if (left.is(IR::InvalidType))
+            return false;
+
+        ExprResult right = expression(ast->right);
+        if (right.is(IR::InvalidType))
+            return false;
+
+        implicitCvt(left, IR::IntType);
+        implicitCvt(right, IR::IntType);
+
+        IR::Expr *code = _block->BINOP(IR::binaryOperator(ast->op), left, right);
+        _expr.code = _block->TEMP(code->type);
+        _block->MOVE(_expr.code, code);
+
+    } break;
+
+    case QSOperator::Add: {
+        ExprResult left = expression(ast->left);
+        if (left.is(IR::InvalidType))
+            return false;
+
+        ExprResult right = expression(ast->right);
+        if (right.is(IR::InvalidType))
+            return false;
+
+        if (left.isPrimitive() && right.isPrimitive()) {
+            if (left.type() == IR::StringType || right.type() == IR::StringType) {
+                implicitCvt(left, IR::StringType);
+                implicitCvt(right, IR::StringType);
+            }
+            binop(ast, left, right);
+        }
+    } break;
+
+    case QSOperator::Div:
+    case QSOperator::Mod:
+    case QSOperator::Mul:
+    case QSOperator::Sub: {
+        ExprResult left = expression(ast->left);
+        if (left.is(IR::InvalidType))
+            return false;
+
+        ExprResult right = expression(ast->right);
+        if (right.is(IR::InvalidType))
+            return false;
+
+        IR::Type t = maxType(left.type(), right.type());
+        if (t >= IR::FirstNumberType) {
+            implicitCvt(left, IR::RealType);
+            implicitCvt(right, IR::RealType);
+
+            IR::Expr *code = _block->BINOP(IR::binaryOperator(ast->op), left, right);
+            _expr.code = _block->TEMP(code->type);
+            _block->MOVE(_expr.code, code);
+        }
+    } break;
+
+    case QSOperator::In:
+    case QSOperator::InstanceOf:
+    case QSOperator::Assign:
+    case QSOperator::InplaceAnd:
+    case QSOperator::InplaceSub:
+    case QSOperator::InplaceDiv:
+    case QSOperator::InplaceAdd:
+    case QSOperator::InplaceLeftShift:
+    case QSOperator::InplaceMod:
+    case QSOperator::InplaceMul:
+    case QSOperator::InplaceOr:
+    case QSOperator::InplaceRightShift:
+    case QSOperator::InplaceURightShift:
+    case QSOperator::InplaceXor:
+        // yup, we don't do those.
+        break;
+    } // switch
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ConditionalExpression *ast)
+{
+    IR::BasicBlock *iftrue = _function->newBasicBlock();
+    IR::BasicBlock *iffalse = _function->newBasicBlock();
+    IR::BasicBlock *endif = _function->newBasicBlock();
+
+    condition(ast->expression, iftrue, iffalse);
+
+    IR::Temp *r = _block->TEMP(IR::InvalidType);
+
+    qSwap(_block, iftrue);
+    ExprResult ok = expression(ast->ok);
+    _block->MOVE(r, ok);
+    _block->JUMP(endif);
+    qSwap(_block, iftrue);
+
+    qSwap(_block, iffalse);
+    ExprResult ko = expression(ast->ko);
+    _block->MOVE(r, ko);
+    _block->JUMP(endif);
+    qSwap(_block, iffalse);
+
+    r->type = maxType(ok.type(), ko.type());
+    _expr.code = r;
+
+    _block = endif;
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::Expression *ast)
+{
+    _block->EXP(expression(ast->left));
+    _expr = expression(ast->right);
+
+    return false;
+}
+
+
+// statements
+bool QDeclarativeV4IRBuilder::visit(AST::Block *ast)
+{
+    if (ast->statements && ! ast->statements->next) {
+        // we have one and only one statement
+        accept(ast->statements->statement);
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::StatementList *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::VariableStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::VariableDeclarationList *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::VariableDeclaration *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::EmptyStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ExpressionStatement *ast)
+{
+    if (ast->expression) {
+         // return the value of this expression
+        return true;
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::IfStatement *ast)
+{
+    if (! ast->ko) {
+        // This is an if statement without an else branch.
+        discard();
+    } else {
+        IR::BasicBlock *iftrue = _function->newBasicBlock();
+        IR::BasicBlock *iffalse = _function->newBasicBlock();
+        IR::BasicBlock *endif = _function->newBasicBlock();
+
+        condition(ast->expression, iftrue, iffalse);
+
+        IR::Temp *r = _block->TEMP(IR::InvalidType);
+
+        qSwap(_block, iftrue);
+        ExprResult ok = statement(ast->ok);
+        _block->MOVE(r, ok);
+        _block->JUMP(endif);
+        qSwap(_block, iftrue);
+
+        qSwap(_block, iffalse);
+        ExprResult ko = statement(ast->ko);
+        _block->MOVE(r, ko);
+        _block->JUMP(endif);
+        qSwap(_block, iffalse);
+
+        r->type = maxType(ok.type(), ko.type());
+        _expr.code = r;
+
+        _block = endif;
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::DoWhileStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::WhileStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ForStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::LocalForStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ForEachStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::LocalForEachStatement *)
+{
+    discard();
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ContinueStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::BreakStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ReturnStatement *ast)
+{
+    if (ast->expression) {
+        // return the value of the expression
+        return true;
+    }
+
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::WithStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::SwitchStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::CaseBlock *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::CaseClauses *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::CaseClause *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::DefaultClause *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::LabelledStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::ThrowStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::TryStatement *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::Catch *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::Finally *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FunctionDeclaration *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FunctionExpression *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FormalParameterList *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::FunctionBody *)
+{
+    return false;
+}
+
+bool QDeclarativeV4IRBuilder::visit(AST::DebuggerStatement *)
+{
+    return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h b/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h
new file mode 100644
index 0000000000..f0bfd6624c
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h
@@ -0,0 +1,242 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4IRBUILDER_P_H
+#define QDECLARATIVEV4IRBUILDER_P_H
+
+#include <QtCore/qglobal.h>
+
+#include "qdeclarativev4ir_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeV4IRBuilder : public QDeclarativeJS::AST::Visitor
+{
+public:
+    QDeclarativeV4IRBuilder(const QDeclarativeV4Compiler::Expression *, QDeclarativeEnginePrivate *);
+
+    QDeclarativeJS::IR::Function *operator()(QDeclarativeJS::IR::Module *, QDeclarativeJS::AST::Node *);
+
+protected:
+    struct ExprResult {
+        enum Format {
+            ex, // expression
+            cx  // condition
+        };
+
+        QDeclarativeJS::IR::Expr *code;
+        QDeclarativeJS::IR::BasicBlock *iftrue;
+        QDeclarativeJS::IR::BasicBlock *iffalse;
+        Format hint; // requested format
+        Format format; // instruction format
+
+        ExprResult(QDeclarativeJS::IR::Expr *expr = 0)
+            : code(expr), iftrue(0), iffalse(0), hint(ex), format(ex) {}
+
+        ExprResult(QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse)
+            : code(0), iftrue(iftrue), iffalse(iffalse), hint(cx), format(ex) {}
+
+        inline QDeclarativeJS::IR::Type type() const { return code ? code->type : QDeclarativeJS::IR::InvalidType; }
+
+        inline QDeclarativeJS::IR::Expr *get() const { return code; }
+        inline operator QDeclarativeJS::IR::Expr *() const  { return get(); }
+        inline QDeclarativeJS::IR::Expr *operator->() const { return get(); }
+        inline bool isValid() const { return code ? code->type != QDeclarativeJS::IR::InvalidType : false; }
+        inline bool is(QDeclarativeJS::IR::Type t) const { return type() == t; }
+        inline bool isNot(QDeclarativeJS::IR::Type t) const { return type() != t; }
+
+        bool isPrimitive() const {
+            switch (type()) {
+            case QDeclarativeJS::IR::UndefinedType: // ### TODO
+            case QDeclarativeJS::IR::NullType: // ### TODO
+            case QDeclarativeJS::IR::UrlType: // ### TODO
+                return false;
+
+            case QDeclarativeJS::IR::StringType:
+            case QDeclarativeJS::IR::BoolType:
+            case QDeclarativeJS::IR::IntType:
+            case QDeclarativeJS::IR::RealType:
+            case QDeclarativeJS::IR::RealNaNType:
+                return true;
+
+            default:
+                return false;
+            } // switch
+        }
+    };
+
+    inline void accept(QDeclarativeJS::AST::Node *ast) { QDeclarativeJS::AST::Node::accept(ast, this); }
+
+    ExprResult expression(QDeclarativeJS::AST::ExpressionNode *ast);
+    ExprResult statement(QDeclarativeJS::AST::Statement *ast);
+    void sourceElement(QDeclarativeJS::AST::SourceElement *ast);
+    void condition(QDeclarativeJS::AST::ExpressionNode *ast, QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse);
+    void binop(QDeclarativeJS::AST::BinaryExpression *ast, ExprResult left, ExprResult right);
+
+    void implicitCvt(ExprResult &expr, QDeclarativeJS::IR::Type type);
+
+    // QML
+    virtual bool visit(QDeclarativeJS::AST::UiProgram *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiImportList *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiImport *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiPublicMember *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiSourceElement *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiObjectDefinition *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiObjectInitializer *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiObjectBinding *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiScriptBinding *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiArrayBinding *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiObjectMemberList *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiSignature *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiFormalList *ast);
+    virtual bool visit(QDeclarativeJS::AST::UiFormal *ast);
+
+    // JS
+    virtual bool visit(QDeclarativeJS::AST::Program *ast);
+    virtual bool visit(QDeclarativeJS::AST::SourceElements *ast);
+    virtual bool visit(QDeclarativeJS::AST::FunctionSourceElement *ast);
+    virtual bool visit(QDeclarativeJS::AST::StatementSourceElement *ast);
+
+    // object literals
+    virtual bool visit(QDeclarativeJS::AST::PropertyNameAndValueList *ast);
+    virtual bool visit(QDeclarativeJS::AST::IdentifierPropertyName *ast);
+    virtual bool visit(QDeclarativeJS::AST::StringLiteralPropertyName *ast);
+    virtual bool visit(QDeclarativeJS::AST::NumericLiteralPropertyName *ast);
+
+    // array literals
+    virtual bool visit(QDeclarativeJS::AST::ElementList *ast);
+    virtual bool visit(QDeclarativeJS::AST::Elision *ast);
+
+    // function calls
+    virtual bool visit(QDeclarativeJS::AST::ArgumentList *ast);
+
+    // expressions
+    virtual bool visit(QDeclarativeJS::AST::ObjectLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::ArrayLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::ThisExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::IdentifierExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::NullExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::TrueLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::FalseLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::StringLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::NumericLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::RegExpLiteral *ast);
+    virtual bool visit(QDeclarativeJS::AST::NestedExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::ArrayMemberExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::FieldMemberExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::NewMemberExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::NewExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::CallExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::PostIncrementExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::PostDecrementExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::DeleteExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::VoidExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::TypeOfExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::PreIncrementExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::PreDecrementExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::UnaryPlusExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::UnaryMinusExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::TildeExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::NotExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::BinaryExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::ConditionalExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::Expression *ast);
+
+    // statements
+    virtual bool visit(QDeclarativeJS::AST::Block *ast);
+    virtual bool visit(QDeclarativeJS::AST::StatementList *ast);
+    virtual bool visit(QDeclarativeJS::AST::VariableStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::VariableDeclarationList *ast);
+    virtual bool visit(QDeclarativeJS::AST::VariableDeclaration *ast);
+    virtual bool visit(QDeclarativeJS::AST::EmptyStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ExpressionStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::IfStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::DoWhileStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::WhileStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ForStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::LocalForStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ForEachStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::LocalForEachStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ContinueStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::BreakStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ReturnStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::WithStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::SwitchStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::CaseBlock *ast);
+    virtual bool visit(QDeclarativeJS::AST::CaseClauses *ast);
+    virtual bool visit(QDeclarativeJS::AST::CaseClause *ast);
+    virtual bool visit(QDeclarativeJS::AST::DefaultClause *ast);
+    virtual bool visit(QDeclarativeJS::AST::LabelledStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::ThrowStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::TryStatement *ast);
+    virtual bool visit(QDeclarativeJS::AST::Catch *ast);
+    virtual bool visit(QDeclarativeJS::AST::Finally *ast);
+    virtual bool visit(QDeclarativeJS::AST::FunctionDeclaration *ast);
+    virtual bool visit(QDeclarativeJS::AST::FunctionExpression *ast);
+    virtual bool visit(QDeclarativeJS::AST::FormalParameterList *ast);
+    virtual bool visit(QDeclarativeJS::AST::FunctionBody *ast);
+    virtual bool visit(QDeclarativeJS::AST::DebuggerStatement *ast);
+
+private:
+    bool buildName(QStringList &name, QDeclarativeJS::AST::Node *node, 
+                   QList<QDeclarativeJS::AST::ExpressionNode *> *nodes);
+    void discard();
+
+    const QDeclarativeV4Compiler::Expression *m_expression;
+    QDeclarativeEnginePrivate *m_engine;
+
+    QDeclarativeJS::IR::Module *_module;
+    QDeclarativeJS::IR::Function *_function;
+    QDeclarativeJS::IR::BasicBlock *_block;
+    bool _discard;
+
+    ExprResult _expr;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4IRBUILDER_P_H 
diff --git a/src/declarative/qml/v4/qdeclarativev4program_p.h b/src/declarative/qml/v4/qdeclarativev4program_p.h
new file mode 100644
index 0000000000..d036bd6f73
--- /dev/null
+++ b/src/declarative/qml/v4/qdeclarativev4program_p.h
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEV4PROGRAM_P_H
+#define QDECLARATIVEV4PROGRAM_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qdeclarativev4instruction_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+struct QDeclarativeV4Program {
+    quint32 bindings;
+    quint32 dataLength;
+    quint32 signalTableOffset;
+    quint32 exceptionDataOffset;
+    quint16 subscriptions;
+    quint16 identifiers;
+    quint16 instructionCount;
+
+    struct BindingReference {
+        quint32 binding;
+        quint32 blockMask;
+    };
+    
+    struct BindingReferenceList {
+        quint32 count;
+        BindingReference bindings[];
+    };
+
+    inline const char *data() const;
+    inline const char *instructions() const;
+    inline BindingReferenceList *signalTable(int signalIndex) const;
+};
+
+enum QDeclarativeRegisterType { 
+    UndefinedType,
+    QObjectStarType,
+    QRealType,
+    IntType,
+    BoolType,
+
+    PODValueType,
+
+    FirstCleanupType, 
+    QStringType = FirstCleanupType,
+    QUrlType,
+    QVariantType,
+};
+
+const char *QDeclarativeV4Program::data() const 
+{ 
+    return ((const char *)this) + sizeof(QDeclarativeV4Program); 
+}
+
+const char *QDeclarativeV4Program::instructions() const
+{ 
+    return (const char *)(data() + dataLength);
+}
+
+QDeclarativeV4Program::BindingReferenceList *QDeclarativeV4Program::signalTable(int signalIndex) const 
+{ 
+    quint32 *signalTable = (quint32 *)(data() + signalTableOffset);
+    return (BindingReferenceList *)(signalTable + signalTable[signalIndex]);
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEV4PROGRAM_P_H
+
diff --git a/src/declarative/qml/v4/v4.pri b/src/declarative/qml/v4/v4.pri
new file mode 100644
index 0000000000..085f0ae443
--- /dev/null
+++ b/src/declarative/qml/v4/v4.pri
@@ -0,0 +1,17 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+    $$PWD/qdeclarativev4compiler_p.h \
+    $$PWD/qdeclarativev4compiler_p_p.h \
+    $$PWD/qdeclarativev4ir_p.h \
+    $$PWD/qdeclarativev4irbuilder_p.h \
+    $$PWD/qdeclarativev4instruction_p.h \
+    $$PWD/qdeclarativev4bindings_p.h \
+    $$PWD/qdeclarativev4program_p.h \
+
+SOURCES += \
+    $$PWD/qdeclarativev4compiler.cpp \
+    $$PWD/qdeclarativev4ir.cpp \
+    $$PWD/qdeclarativev4irbuilder.cpp \
+    $$PWD/qdeclarativev4instruction.cpp \
+    $$PWD/qdeclarativev4bindings.cpp \
diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
new file mode 100644
index 0000000000..05e502535a
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
@@ -0,0 +1,458 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#define GL_GLEXT_PROTOTYPES
+
+#include "qsgdefaultrenderer_p.h"
+#include "qsgmaterial.h"
+
+#include <QtCore/qvarlengtharray.h>
+#include <QtGui/qapplication.h>
+#include <QtCore/qpair.h>
+
+//#define FORCE_NO_REORDER
+
+QT_BEGIN_NAMESPACE
+
+static bool nodeLessThan(QSGGeometryNode *a, QSGGeometryNode *b)
+{
+    // Sort by clip...
+    if (a->clipList() != b->clipList())
+        return a->clipList() < b->clipList();
+
+    // Sort by material definition
+    QSGMaterialType *aDef = a->material()->type();
+    QSGMaterialType *bDef = b->material()->type();
+
+    if (aDef != bDef)
+        return aDef < bDef;
+
+    // Sort by material state
+    int cmp = a->material()->compare(b->material());
+    if (cmp != 0)
+        return cmp < 0;
+
+    return a->matrix() < b->matrix();
+}
+
+static bool nodeLessThanWithRenderOrder(QSGGeometryNode *a, QSGGeometryNode *b)
+{
+    // Sort by clip...
+    if (a->clipList() != b->clipList())
+        return a->clipList() < b->clipList();
+
+    // Sort by material definition
+    QSGMaterialType *aDef = a->material()->type();
+    QSGMaterialType *bDef = b->material()->type();
+
+    if (!(a->material()->flags() & QSGMaterial::Blending)) {
+        int aOrder = a->renderOrder();
+        int bOrder = b->renderOrder();
+        if (aOrder != bOrder)
+            return aOrder > bOrder;
+    }
+
+    if (aDef != bDef)
+        return aDef < bDef;
+
+    // Sort by material state
+    int cmp = a->material()->compare(b->material());
+    if (cmp != 0)
+        return cmp < 0;
+
+    return a->matrix() < b->matrix();
+}
+
+// Minimum heap.
+template <typename T, int prealloc = 256>
+class Heap
+{
+public:
+    void insert(const T &x);
+    const T &top() const { return v[0]; }
+    T pop();
+    bool isEmpty() const { return v.isEmpty(); }
+private:
+    static int parent(int i) { return (i - 1) >> 1; }
+    static int left(int i) { return (i << 1) | 1; }
+    static int right(int i) { return (i + 1) << 1; }
+    QVarLengthArray<T, prealloc> v;
+};
+
+template <typename T, int prealloc>
+void Heap<T, prealloc>::insert(const T &x)
+{
+    int i = v.size();
+    v.append(x);
+    while (i != 0 && v[i] < v[parent(i)]) {
+        qSwap(v[parent(i)], v[i]);
+        i = parent(i);
+    }
+}
+
+template <typename T, int prealloc>
+T Heap<T, prealloc>::pop()
+{
+    T x = top();
+    if (v.size() > 1)
+        qSwap(v[0], v[v.size() - 1]);
+    v.resize(v.size() - 1);
+    int i = 0;
+    while (left(i) < v.size()) {
+        int low = left(i);
+        if (right(i) < v.size() && v[right(i)] < v[low])
+            low = right(i);
+        if (!(v[low] < v[i]))
+            break;
+        qSwap(v[i], v[low]);
+        i = low;
+    }
+    return x;
+}
+
+
+QMLRenderer::QMLRenderer(QSGContext *context)
+    : QSGRenderer(context)
+    , m_rebuild_lists(false)
+    , m_needs_sorting(false)
+    , m_sort_front_to_back(false)
+    , m_currentRenderOrder(1)
+{
+    QStringList args = qApp->arguments();
+#if defined(QML_RUNTIME_TESTING)
+    m_render_opaque_nodes = !args.contains(QLatin1String("--no-opaque-nodes"));
+    m_render_alpha_nodes = !args.contains(QLatin1String("--no-alpha-nodes"));
+#endif
+}
+
+void QMLRenderer::nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags)
+{
+    QSGRenderer::nodeChanged(node, flags);
+
+    quint32 rebuildFlags = QSGNode::DirtyNodeAdded | QSGNode::DirtyNodeRemoved | QSGNode::DirtyMaterial | QSGNode::DirtyOpacity;
+
+    if (flags & rebuildFlags)
+        m_rebuild_lists = true;
+
+    if (flags & (rebuildFlags | QSGNode::DirtyClipList))
+        m_needs_sorting = true;
+}
+
+void QMLRenderer::render()
+{
+#if defined (QML_RUNTIME_TESTING)
+    static bool dumpTree = qApp->arguments().contains(QLatin1String("--dump-tree"));
+    if (dumpTree) {
+        printf("\n\n");
+        QSGNodeDumper::dump(rootNode());
+    }
+#endif
+
+    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+    glDisable(GL_BLEND);
+
+    glFrontFace(isMirrored() ? GL_CW : GL_CCW);
+    glDisable(GL_CULL_FACE);
+
+    glEnable(GL_DEPTH_TEST);
+    glDepthMask(true);
+    glDepthFunc(GL_GREATER);
+#if defined(QT_OPENGL_ES)
+    glClearDepthf(0);
+#else
+    glClearDepth(0);
+#endif
+
+    glDisable(GL_SCISSOR_TEST);
+    glClearColor(m_clear_color.redF(), m_clear_color.greenF(), m_clear_color.blueF(), m_clear_color.alphaF());
+
+    bindable()->clear(clearMode());
+
+    QRect r = viewportRect();
+    glViewport(r.x(), deviceRect().bottom() - r.bottom(), r.width(), r.height());
+    m_projectionMatrix = projectMatrix();
+    m_projectionMatrix.push();
+    m_modelViewMatrix.setToIdentity();
+
+    m_currentClip = 0;
+    glDisable(GL_STENCIL_TEST);
+
+    m_currentMaterial = 0;
+    m_currentProgram = 0;
+    m_currentMatrix = 0;
+
+    if (m_rebuild_lists) {
+        m_opaqueNodes.clear();
+        m_transparentNodes.clear();
+        m_currentRenderOrder = 1;
+        buildLists(rootNode());
+        m_rebuild_lists = false;
+    }
+
+    if (m_needs_sorting) {
+        qSort(m_opaqueNodes.begin(), m_opaqueNodes.end(),
+              m_sort_front_to_back
+              ? nodeLessThanWithRenderOrder
+              : nodeLessThan);
+        m_needs_sorting = false;
+    }
+
+    m_renderOrderMatrix.setToIdentity();
+    m_renderOrderMatrix.scale(1, 1, qreal(1) / m_currentRenderOrder);
+
+    glDisable(GL_BLEND);
+    glDepthMask(true);
+#ifdef QML_RUNTIME_TESTING
+    if (m_render_opaque_nodes)
+#endif
+    {
+#if defined (QML_RUNTIME_TESTING)
+        if (dumpTree)
+            qDebug() << "Opaque Nodes:";
+#endif
+        renderNodes(m_opaqueNodes);
+    }
+
+    glEnable(GL_BLEND);
+    glDepthMask(false);
+#ifdef QML_RUNTIME_TESTING
+    if (m_render_alpha_nodes)
+#endif
+    {
+#if defined (QML_RUNTIME_TESTING)
+        if (dumpTree)
+            qDebug() << "Alpha Nodes:";
+#endif
+        renderNodes(m_transparentNodes);
+    }
+
+    if (m_currentProgram)
+        m_currentProgram->deactivate();
+
+    m_projectionMatrix.pop();
+}
+
+class Foo : public QPair<int, QSGGeometryNode *>
+{
+public:
+    Foo() { }
+    Foo(int i, QSGGeometryNode *n) : QPair<int, QSGGeometryNode *>(i, n) { }
+    bool operator < (const Foo &other) const { return nodeLessThan(second, other.second); }
+};
+
+void QMLRenderer::setSortFrontToBackEnabled(bool sort)
+{
+    printf("setting sorting to... %d\n", sort);
+    m_sort_front_to_back = sort;
+}
+
+bool QMLRenderer::isSortFrontToBackEnabled() const
+{
+    return m_sort_front_to_back;
+}
+
+void QMLRenderer::buildLists(QSGNode *node)
+{
+    if (node->isSubtreeBlocked())
+        return;
+
+    if (node->type() == QSGNode::GeometryNodeType) {
+        QSGGeometryNode *geomNode = static_cast<QSGGeometryNode *>(node);
+        qreal opacity = geomNode->inheritedOpacity();
+        QSGMaterial *m = geomNode->activeMaterial();
+
+#ifdef FORCE_NO_REORDER
+        if (true) {
+#else
+        if ((m->flags() & QSGMaterial::Blending) || opacity < 1) {
+#endif
+            geomNode->setRenderOrder(m_currentRenderOrder - 1);
+            m_transparentNodes.append(geomNode);
+        } else {
+            geomNode->setRenderOrder(m_currentRenderOrder);
+            m_opaqueNodes.append(geomNode);
+            m_currentRenderOrder += 2;
+        }
+    }
+
+    int count = node->childCount();
+    if (!count)
+        return;
+
+#ifdef FORCE_NO_REORDER
+    static bool reorder = false;
+#else
+    static bool reorder = !qApp->arguments().contains(QLatin1String("--no-reorder"));
+#endif
+
+    if (reorder && count > 1 && (node->flags() & QSGNode::ChildrenDoNotOverloap)) {
+        QVarLengthArray<int, 16> beginIndices(count);
+        QVarLengthArray<int, 16> endIndices(count);
+        int baseCount = m_transparentNodes.size();
+        for (int i = 0; i < count; ++i) {
+            beginIndices[i] = m_transparentNodes.size();
+            buildLists(node->childAtIndex(i));
+            endIndices[i] = m_transparentNodes.size();
+        }
+
+        Heap<Foo, 16> heap;
+        m_tempNodes.clear();
+        int childNodeCount = m_transparentNodes.size() - baseCount;
+        while (childNodeCount) {
+            for (int i = 0; i < count; ++i) {
+                if (beginIndices[i] != endIndices[i])
+                    heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++)));
+            }
+            while (!heap.isEmpty()) {
+                Foo foo = heap.pop();
+                m_tempNodes.append(foo.second);
+                --childNodeCount;
+                int i = foo.first;
+                if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), foo.second))
+                    heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++)));
+            }
+        }
+        Q_ASSERT(m_tempNodes.size() == m_transparentNodes.size() - baseCount);
+
+        m_transparentNodes.resize(baseCount);
+        m_transparentNodes << m_tempNodes;
+    } else {
+        for (int i = 0; i < count; ++i)
+            buildLists(node->childAtIndex(i));
+    }
+}
+
+void QMLRenderer::renderNodes(const QVector<QSGGeometryNode *> &list)
+{
+    const float scale = 1.0f / m_currentRenderOrder;
+    int count = list.count();
+    int currentRenderOrder = 0x80000000;
+
+    //int clipChangeCount = 0;
+    //int programChangeCount = 0;
+    //int materialChangeCount = 0;
+
+    for (int i = 0; i < count; ++i) {
+        QSGGeometryNode *geomNode = list.at(i);
+
+        QSGMaterialShader::RenderState::DirtyStates updates;
+
+#if defined (QML_RUNTIME_TESTING)
+        static bool dumpTree = qApp->arguments().contains(QLatin1String("--dump-tree"));
+        if (dumpTree)
+            qDebug() << geomNode;
+#endif
+
+        bool changeMatrix = m_currentMatrix != geomNode->matrix();
+
+        if (changeMatrix) {
+            m_currentMatrix = geomNode->matrix();
+            if (m_currentMatrix)
+                m_modelViewMatrix = *m_currentMatrix;
+            else
+                m_modelViewMatrix.setToIdentity();
+            updates |= QSGMaterialShader::RenderState::DirtyMatrix;
+        }
+
+        bool changeOpacity = m_render_opacity != geomNode->inheritedOpacity();
+        if (changeOpacity) {
+            updates |= QSGMaterialShader::RenderState::DirtyOpacity;
+            m_render_opacity = geomNode->inheritedOpacity();
+        }
+
+
+        Q_ASSERT(geomNode->activeMaterial());
+
+        QSGMaterial *material = geomNode->activeMaterial();
+        QSGMaterialShader *program = m_context->prepareMaterial(material);
+
+        bool changeClip = geomNode->clipList() != m_currentClip;
+        QSGRenderer::ClipType clipType = QSGRenderer::NoClip;
+        if (changeClip) {
+            clipType = updateStencilClip(geomNode->clipList());
+            m_currentClip = geomNode->clipList();
+#ifdef FORCE_NO_REORDER
+            glDepthMask(false);
+#else
+            glDepthMask((material->flags() & QSGMaterial::Blending) == 0 && m_render_opacity == 1);
+#endif
+            //++clipChangeCount;
+        }
+
+        bool changeProgram = (changeClip && clipType == QSGRenderer::StencilClip) || m_currentProgram != program;
+        if (changeProgram) {
+            if (m_currentProgram)
+                m_currentProgram->deactivate();
+            m_currentProgram = program;
+            m_currentProgram->activate();
+            //++programChangeCount;
+            updates |= (QSGMaterialShader::RenderState::DirtyMatrix | QSGMaterialShader::RenderState::DirtyOpacity);
+        }
+
+        bool changeRenderOrder = currentRenderOrder != geomNode->renderOrder();
+        if (changeRenderOrder) {
+            currentRenderOrder = geomNode->renderOrder();
+            m_renderOrderMatrix(2, 3) = currentRenderOrder * scale;
+            m_projectionMatrix.pop();
+            m_projectionMatrix.push();
+            m_projectionMatrix *= m_renderOrderMatrix;
+            updates |= QSGMaterialShader::RenderState::DirtyMatrix;
+        }
+
+        if (changeProgram || m_currentMaterial != material) {
+            program->updateState(state(updates), material, changeProgram ? 0 : m_currentMaterial);
+            m_currentMaterial = material;
+            //++materialChangeCount;
+        }
+
+        //glDepthRange((geomNode->renderOrder() + 0.1) * scale, (geomNode->renderOrder() + 0.9) * scale);
+
+        const QSGGeometry *g = geomNode->geometry();
+        bindGeometry(program, g);
+        draw(geomNode);
+    }
+    //qDebug("Clip: %i, shader program: %i, material: %i times changed while drawing %s items",
+    //    clipChangeCount, programChangeCount, materialChangeCount,
+    //    &list == &m_transparentNodes ? "transparent" : "opaque");
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h
new file mode 100644
index 0000000000..805388a06f
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMLRENDERER_H
+#define QMLRENDERER_H
+
+#include "qsgrenderer_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QMLRenderer : public QSGRenderer
+{
+    Q_OBJECT
+public:
+    QMLRenderer(QSGContext *context);
+
+    void render();
+
+    void nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags);
+
+    void setSortFrontToBackEnabled(bool sort);
+    bool isSortFrontToBackEnabled() const;
+
+private:
+    void buildLists(QSGNode *node);
+    void renderNodes(const QVector <QSGGeometryNode *> &list);
+
+    const QSGClipNode *m_currentClip;
+    QSGMaterial *m_currentMaterial;
+    QSGMaterialShader *m_currentProgram;
+    const QMatrix4x4 *m_currentMatrix;
+    QMatrix4x4 m_renderOrderMatrix;
+    QVector<QSGGeometryNode *> m_opaqueNodes;
+    QVector<QSGGeometryNode *> m_transparentNodes;
+    QVector<QSGGeometryNode *> m_tempNodes;
+
+    bool m_rebuild_lists;
+    bool m_needs_sorting;
+    bool m_sort_front_to_back;
+    int m_currentRenderOrder;
+
+
+
+#ifdef QML_RUNTIME_TESTING
+    bool m_render_opaque_nodes;
+    bool m_render_alpha_nodes;
+#endif
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QMLRENDERER_H
diff --git a/src/declarative/scenegraph/coreapi/qsggeometry.cpp b/src/declarative/scenegraph/coreapi/qsggeometry.cpp
new file mode 100644
index 0000000000..1bfffae0bf
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsggeometry.cpp
@@ -0,0 +1,310 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt scene graph research project.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsggeometry.h"
+
+QT_BEGIN_NAMESPACE
+
+
+/*!
+    Convenience function which returns attributes to be used for 2D solid
+    color drawing.
+ */
+
+const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_Point2D()
+{
+    static Attribute data[] = {
+        { 0, 2, GL_FLOAT }
+    };
+    static AttributeSet attrs = { 1, sizeof(float) * 2, data };
+    return attrs;
+}
+
+/*!
+    Convenience function which returns attributes to be used for textured 2D drawing.
+ */
+
+const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_TexturedPoint2D()
+{
+    static Attribute data[] = {
+        { 0, 2, GL_FLOAT },
+        { 1, 2, GL_FLOAT }
+    };
+    static AttributeSet attrs = { 2, sizeof(float) * 4, data };
+    return attrs;
+}
+
+/*!
+    Convenience function which returns attributes to be used for per vertex colored 2D drawing.
+ */
+
+const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_ColoredPoint2D()
+{
+    static Attribute data[] = {
+        { 0, 2, GL_FLOAT },
+        { 1, 4, GL_UNSIGNED_BYTE }
+    };
+    static AttributeSet attrs = { 2, 2 * sizeof(float) + 4 * sizeof(char), data };
+    return attrs;
+}
+
+
+/*!
+    \class QSGGeometry
+    \brief The QSGGeometry class provides low-level storage for graphics primitives
+    in the QML Scene Graph.
+
+    The QSGGeometry class provides a few convenience attributes and attribute accessors
+    by default. The defaultAttributes_Point2D() function returns attributes to be used
+    in normal solid color rectangles, while the defaultAttributes_TexturedPoint2D function
+    returns attributes to be used for the common pixmap usecase.
+ */
+
+
+/*!
+    Constructs a geometry object based on \a attributes.
+
+    The object allocate space for \a vertexCount vertices based on the accumulated
+    size in \a attributes and for \a indexCount.
+
+    Geometry objects are constructed with GL_TRIANGLE_STRIP as default drawing mode.
+
+    The attribute structure is assumed to be POD and the geometry object
+    assumes this will not go away. There is no memory management involved.
+ */
+
+QSGGeometry::QSGGeometry(const QSGGeometry::AttributeSet &attributes,
+                         int vertexCount,
+                         int indexCount,
+                         int indexType)
+    : m_drawing_mode(GL_TRIANGLE_STRIP)
+    , m_vertex_count(0)
+    , m_index_count(0)
+    , m_index_type(indexType)
+    , m_attributes(attributes)
+    , m_data(0)
+    , m_index_data_offset(-1)
+    , m_owns_data(false)
+{
+    Q_ASSERT(m_attributes.count > 0);
+    Q_ASSERT(m_attributes.stride > 0);
+
+    // Because allocate reads m_vertex_count, m_index_count and m_owns_data, these
+    // need to be set before calling allocate...
+    allocate(vertexCount, indexCount);
+}
+
+QSGGeometry::~QSGGeometry()
+{
+    if (m_owns_data)
+        qFree(m_data);
+}
+
+/*!
+    \fn int QSGGeometry::vertexCount() const
+
+    Returns the number of vertices in this geometry object.
+ */
+
+/*!
+    \fn int QSGGeometry::indexCount() const
+
+    Returns the number of indices in this geometry object.
+ */
+
+
+
+/*!
+    \fn void *QSGGeometry::vertexData()
+
+    Returns a pointer to the raw vertex data of this geometry object.
+
+    \sa vertexDataAsPoint2D(), vertexDataAsTexturedPoint2D
+ */
+
+/*!
+    \fn const void *QSGGeometry::vertexData() const
+
+    Returns a pointer to the raw vertex data of this geometry object.
+
+    \sa vertexDataAsPoint2D(), vertexDataAsTexturedPoint2D
+ */
+
+/*!
+    Returns a pointer to the raw index data of this geometry object.
+
+    \sa indexDataAsUShort(), indexDataAsUInt()
+ */
+void *QSGGeometry::indexData()
+{
+    return m_index_data_offset < 0
+            ? 0
+            : ((char *) m_data + m_index_data_offset);
+}
+
+/*!
+    Returns a pointer to the raw index data of this geometry object.
+
+    \sa indexDataAsUShort(), indexDataAsUInt()
+ */
+const void *QSGGeometry::indexData() const
+{
+    return m_index_data_offset < 0
+            ? 0
+            : ((char *) m_data + m_index_data_offset);
+}
+
+/*!
+    Sets the drawing mode to be used for this geometry.
+
+    The default value is GL_TRIANGLE_STRIP.
+ */
+void QSGGeometry::setDrawingMode(GLenum mode)
+{
+    m_drawing_mode = mode;
+}
+
+/*!
+    \fn int QSGGeometry::drawingMode() const
+
+    Returns the drawing mode of this geometry.
+
+    The default value is GL_TRIANGLE_STRIP.
+ */
+
+/*!
+    \fn int QSGGeometry::indexType() const
+
+    Returns the primitive type used for indices in this
+    geometry object.
+ */
+
+
+/*!
+    Resizes the vertex and index data of this geometry object to fit \a vertexCount
+    vertices and \a indexCount indices.
+
+    Vertex and index data will be invalidated after this call and the caller must
+ */
+void QSGGeometry::allocate(int vertexCount, int indexCount)
+{
+    if (vertexCount == m_vertex_count && indexCount == m_index_count)
+        return;
+
+    m_vertex_count = vertexCount;
+    m_index_count = indexCount;
+
+    bool canUsePrealloc = m_index_count <= 0;
+    int vertexByteSize = m_attributes.stride * m_vertex_count;
+
+    if (m_owns_data)
+        qFree(m_data);
+
+    if (canUsePrealloc && vertexByteSize <= (int) sizeof(m_prealloc)) {
+        m_data = (void *) &m_prealloc[0];
+        m_index_data_offset = -1;
+        m_owns_data = false;
+    } else {
+        Q_ASSERT(m_index_type == GL_UNSIGNED_INT || m_index_type == GL_UNSIGNED_SHORT);
+        int indexByteSize = indexCount * (m_index_type == GL_UNSIGNED_SHORT ? sizeof(quint16) : sizeof(quint32));
+        m_data = (void *) qMalloc(vertexByteSize + indexByteSize);
+        m_index_data_offset = vertexByteSize;
+        m_owns_data = true;
+    }
+
+}
+
+/*!
+    Updates the geometry \a g with the coordinates in \a rect.
+
+    The function assumes the geometry object contains a single triangle strip
+    of QSGGeometry::Point2D vertices
+ */
+void QSGGeometry::updateRectGeometry(QSGGeometry *g, const QRectF &rect)
+{
+    Point2D *v = g->vertexDataAsPoint2D();
+    v[0].x = rect.left();
+    v[0].y = rect.top();
+
+    v[1].x = rect.left();
+    v[1].y = rect.bottom();
+
+    v[2].x = rect.right();
+    v[2].y = rect.top();
+
+    v[3].x = rect.right();
+    v[3].y = rect.bottom();
+}
+
+/*!
+    Updates the geometry \a g with the coordinates in \a rect and texture
+    coordinates from \a textureRect.
+
+    \a textureRect should be in normalized coordinates.
+
+    \a g is assumed to be a triangle strip of four vertices of type
+    QSGGeometry::TexturedPoint2D.
+ */
+void QSGGeometry::updateTexturedRectGeometry(QSGGeometry *g, const QRectF &rect, const QRectF &textureRect)
+{
+    TexturedPoint2D *v = g->vertexDataAsTexturedPoint2D();
+    v[0].x = rect.left();
+    v[0].y = rect.top();
+    v[0].tx = textureRect.left();
+    v[0].ty = textureRect.top();
+
+    v[1].x = rect.left();
+    v[1].y = rect.bottom();
+    v[1].tx = textureRect.left();
+    v[1].ty = textureRect.bottom();
+
+    v[2].x = rect.right();
+    v[2].y = rect.top();
+    v[2].tx = textureRect.right();
+    v[2].ty = textureRect.top();
+
+    v[3].x = rect.right();
+    v[3].y = rect.bottom();
+    v[3].tx = textureRect.right();
+    v[3].ty = textureRect.bottom();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsggeometry.h b/src/declarative/scenegraph/coreapi/qsggeometry.h
new file mode 100644
index 0000000000..514fdc466f
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsggeometry.h
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt scene graph research project.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGGEOMETRY_H
+#define QSGGEOMETRY_H
+
+#include <QtOpenGL/qgl.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_DECLARATIVE_EXPORT QSGGeometry
+{
+public:
+    struct Attribute
+    {
+        int position;
+        int tupleSize;
+        int type;
+    };
+
+    struct AttributeSet {
+        int count;
+        int stride;
+        const Attribute *attributes;
+    };
+
+    struct Point2D {
+        float x, y;
+        void set(float nx, float ny) {
+            x = nx; y = ny;
+        }
+    };
+    struct TexturedPoint2D {
+        float x, y;
+        float tx, ty;
+        void set(float nx, float ny, float ntx, float nty) {
+            x = nx; y = ny; tx = ntx; ty = nty;
+        }
+    };
+    struct ColoredPoint2D {
+        float x, y;
+        unsigned char r, g, b, a;
+        void set(float nx, float ny, uchar nr, uchar ng, uchar nb, uchar na) {
+            x = nx; y = ny;
+            r = nr; g = ng, b = nb; a = na;
+        }
+    };
+
+    static const AttributeSet &defaultAttributes_Point2D();
+    static const AttributeSet &defaultAttributes_TexturedPoint2D();
+    static const AttributeSet &defaultAttributes_ColoredPoint2D();
+
+    QSGGeometry(const QSGGeometry::AttributeSet &attribs,
+                int vertexCount,
+                int indexCount = 0,
+                int indexType = GL_UNSIGNED_SHORT);
+    virtual ~QSGGeometry();
+
+    void setDrawingMode(GLenum mode);
+    inline GLenum drawingMode() const { return m_drawing_mode; }
+
+    void allocate(int vertexCount, int indexCount = 0);
+
+    int vertexCount() const { return m_vertex_count; }
+
+    void *vertexData() { return m_data; }
+    inline Point2D *vertexDataAsPoint2D();
+    inline TexturedPoint2D *vertexDataAsTexturedPoint2D();
+    inline ColoredPoint2D *vertexDataAsColoredPoint2D();
+
+    inline const void *vertexData() const { return m_data; }
+    inline const Point2D *vertexDataAsPoint2D() const;
+    inline const TexturedPoint2D *vertexDataAsTexturedPoint2D() const;
+    inline const ColoredPoint2D *vertexDataAsColoredPoint2D() const;
+
+    inline int indexType() const { return m_index_type; }
+
+    int indexCount() const { return m_index_count; }
+
+    void *indexData();
+    inline uint *indexDataAsUInt();
+    inline quint16 *indexDataAsUShort();
+
+    const void *indexData() const;
+    inline const uint *indexDataAsUInt() const;
+    inline const quint16 *indexDataAsUShort() const;
+
+    inline int attributeCount() const { return m_attributes.count; }
+    inline const Attribute *attributes() const { return m_attributes.attributes; }
+    inline int stride() const { return m_attributes.stride; }
+
+    static void updateRectGeometry(QSGGeometry *g, const QRectF &rect);
+    static void updateTexturedRectGeometry(QSGGeometry *g, const QRectF &rect, const QRectF &sourceRect);
+
+private:
+    int m_drawing_mode;
+    int m_vertex_count;
+    int m_index_count;
+    int m_index_type;
+    const AttributeSet &m_attributes;
+    void *m_data;
+    int m_index_data_offset;
+
+    void *m_reserved_pointer;
+
+    uint m_owns_data : 1;
+    uint m_reserved_bits : 31;
+
+    float m_prealloc[16];
+};
+
+inline uint *QSGGeometry::indexDataAsUInt()
+{
+    Q_ASSERT(m_index_type == GL_UNSIGNED_INT);
+    return (uint *) indexData();
+}
+
+inline quint16 *QSGGeometry::indexDataAsUShort()
+{
+    Q_ASSERT(m_index_type == GL_UNSIGNED_SHORT);
+    return (quint16 *) indexData();
+}
+
+inline const uint *QSGGeometry::indexDataAsUInt() const
+{
+    Q_ASSERT(m_index_type == GL_UNSIGNED_INT);
+    return (uint *) indexData();
+}
+
+inline const quint16 *QSGGeometry::indexDataAsUShort() const
+{
+    Q_ASSERT(m_index_type == GL_UNSIGNED_SHORT);
+    return (quint16 *) indexData();
+}
+
+inline QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D()
+{
+    Q_ASSERT(m_attributes.count == 1);
+    Q_ASSERT(m_attributes.stride == 2 * sizeof(float));
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    return (Point2D *) m_data;
+}
+
+inline QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D()
+{
+    Q_ASSERT(m_attributes.count == 2);
+    Q_ASSERT(m_attributes.stride == 4 * sizeof(float));
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[1].position == 1);
+    Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[1].type == GL_FLOAT);
+    return (TexturedPoint2D *) m_data;
+}
+
+inline QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D()
+{
+    Q_ASSERT(m_attributes.count == 2);
+    Q_ASSERT(m_attributes.stride == 2 * sizeof(float) + 4 * sizeof(char));
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[1].position == 1);
+    Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
+    Q_ASSERT(m_attributes.attributes[1].type == GL_UNSIGNED_BYTE);
+    return (ColoredPoint2D *) m_data;
+}
+
+inline const QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D() const
+{
+    Q_ASSERT(m_attributes.count == 1);
+    Q_ASSERT(m_attributes.stride == 2 * sizeof(float));
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    return (const Point2D *) m_data;
+}
+
+inline const QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D() const
+{
+    Q_ASSERT(m_attributes.count == 2);
+    Q_ASSERT(m_attributes.stride == 4 * sizeof(float));
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[1].position == 1);
+    Q_ASSERT(m_attributes.attributes[1].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[1].type == GL_FLOAT);
+    return (const TexturedPoint2D *) m_data;
+}
+
+inline const QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D() const
+{
+    Q_ASSERT(m_attributes.count == 2);
+    Q_ASSERT(m_attributes.stride == 2 * sizeof(float) + 4 * sizeof(char));
+    Q_ASSERT(m_attributes.attributes[0].position == 0);
+    Q_ASSERT(m_attributes.attributes[0].tupleSize == 2);
+    Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT);
+    Q_ASSERT(m_attributes.attributes[1].position == 1);
+    Q_ASSERT(m_attributes.attributes[1].tupleSize == 4);
+    Q_ASSERT(m_attributes.attributes[1].type == GL_UNSIGNED_BYTE);
+    return (const ColoredPoint2D *) m_data;
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGGEOMETRY_H
diff --git a/src/declarative/scenegraph/coreapi/qsgmaterial.cpp b/src/declarative/scenegraph/coreapi/qsgmaterial.cpp
new file mode 100644
index 0000000000..4c4274419e
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgmaterial.cpp
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgmaterial.h"
+#include "qsgrenderer_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QSGMaterialShader::QSGMaterialShader()
+    : m_compiled(false)
+{
+}
+
+void QSGMaterialShader::activate()
+{
+    if (!m_compiled)
+        compile();
+
+    m_program.bind();
+    char const *const *attr = attributeNames();
+    for (int i = 0; attr[i]; ++i) {
+        if (*attr[i])
+            m_program.enableAttributeArray(i);
+    }
+}
+
+void QSGMaterialShader::deactivate()
+{
+    char const *const *attr = attributeNames();
+    for (int i = 0; attr[i]; ++i) {
+        if (*attr[i])
+            m_program.disableAttributeArray(i);
+    }
+}
+
+void QSGMaterialShader::updateState(const RenderState &, QSGMaterial *, QSGMaterial *)
+{
+}
+
+void QSGMaterialShader::compile()
+{
+    Q_ASSERT(!m_compiled);
+
+    m_program.addShaderFromSourceCode(QGLShader::Vertex, vertexShader());
+    m_program.addShaderFromSourceCode(QGLShader::Fragment, fragmentShader());
+
+    char const *const *attr = attributeNames();
+#ifndef QT_NO_DEBUG
+    int maxVertexAttribs = 0;
+    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
+    for (int i = 0; attr[i]; ++i) {
+        if (i >= maxVertexAttribs) {
+            qFatal("List of attribute names is either too long or not null-terminated.\n"
+                   "Maximum number of attributes on this hardware is %i.\n"
+                   "Vertex shader:\n%s\n"
+                   "Fragment shader:\n%s\n",
+                   maxVertexAttribs, vertexShader(), fragmentShader());
+        }
+        if (*attr[i])
+            m_program.bindAttributeLocation(attr[i], i);
+    }
+#else
+    for (int i = 0; attr[i]; ++i) {
+        if (*attr[i])
+            m_program.bindAttributeLocation(attr[i], i);
+    }
+#endif
+
+    if (!m_program.link()) {
+        qWarning("QSGMaterialShader: Shader compilation failed:");
+        qWarning() << m_program.log();
+    }
+
+    m_compiled = true;
+    initialize();
+}
+
+
+float QSGMaterialShader::RenderState::opacity() const
+{
+    Q_ASSERT(m_data);
+    return static_cast<const QSGRenderer *>(m_data)->renderOpacity();
+}
+
+QMatrix4x4 QSGMaterialShader::RenderState::combinedMatrix() const
+{
+    Q_ASSERT(m_data);
+    return static_cast<const QSGRenderer *>(m_data)->combinedMatrix();
+}
+
+QMatrix4x4 QSGMaterialShader::RenderState::modelViewMatrix() const
+{
+    Q_ASSERT(m_data);
+    return const_cast<QSGRenderer *>(static_cast<const QSGRenderer *>(m_data))->modelViewMatrix().top();
+}
+
+QRect QSGMaterialShader::RenderState::viewportRect() const
+{
+    Q_ASSERT(m_data);
+    return static_cast<const QSGRenderer *>(m_data)->viewportRect();
+}
+
+QRect QSGMaterialShader::RenderState::deviceRect() const
+{
+    Q_ASSERT(m_data);
+    return static_cast<const QSGRenderer *>(m_data)->deviceRect();
+}
+
+const QGLContext *QSGMaterialShader::RenderState::context() const
+{
+    return static_cast<const QSGRenderer *>(m_data)->glContext();
+}
+
+
+#ifndef QT_NO_DEBUG
+static int qt_material_count = 0;
+
+static void qt_print_material_count()
+{
+    qDebug("Number of leaked materials: %i", qt_material_count);
+    qt_material_count = -1;
+}
+#endif
+
+QSGMaterial::QSGMaterial()
+    : m_flags(0)
+{
+#ifndef QT_NO_DEBUG
+    ++qt_material_count;
+    static bool atexit_registered = false;
+    if (!atexit_registered) {
+        atexit(qt_print_material_count);
+        atexit_registered = true;
+    }
+#endif
+}
+
+QSGMaterial::~QSGMaterial()
+{
+#ifndef QT_NO_DEBUG
+    --qt_material_count;
+    if (qt_material_count < 0)
+        qDebug("Material destroyed after qt_print_material_count() was called.");
+#endif
+}
+
+void QSGMaterial::setFlag(Flags flags, bool set)
+{
+    if (set)
+        m_flags |= flags;
+    else
+        m_flags &= ~flags;
+}
+
+int QSGMaterial::compare(const QSGMaterial *other) const
+{
+    Q_ASSERT(other && type() == other->type());
+    return qint64(this) - qint64(other);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgmaterial.h b/src/declarative/scenegraph/coreapi/qsgmaterial.h
new file mode 100644
index 0000000000..c1513956d0
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgmaterial.h
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MATERIAL_H
+#define MATERIAL_H
+
+#include <qglshaderprogram.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGMaterial;
+
+class Q_DECLARATIVE_EXPORT QSGMaterialShader
+{
+public:
+    class Q_DECLARATIVE_EXPORT RenderState {
+    public:
+        enum DirtyState
+        {
+            DirtyMatrix         = 0x0001,
+            DirtyOpacity        = 0x0002
+        };
+        Q_DECLARE_FLAGS(DirtyStates, DirtyState)
+
+        inline DirtyStates dirtyState() const { return m_dirty; }
+
+        inline bool isMatrixDirty() const { return m_dirty & DirtyMatrix; }
+        inline bool isOpacityDirty() const { return m_dirty & DirtyOpacity; }
+
+        float opacity() const;
+        QMatrix4x4 combinedMatrix() const;
+        QMatrix4x4 modelViewMatrix() const;
+        QRect viewportRect() const;
+        QRect deviceRect() const;
+
+        const QGLContext *context() const;
+
+    private:
+        friend class QSGRenderer;
+        DirtyStates m_dirty;
+        const void *m_data;
+    };
+
+    QSGMaterialShader();
+
+    virtual void activate();
+    virtual void deactivate();
+    // First time a material is used, oldMaterial is null.
+    virtual void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial);
+    virtual char const *const *attributeNames() const = 0; // Array must end with null.
+
+protected:
+    void compile();
+    virtual void initialize() { }
+
+    virtual const char *vertexShader() const = 0;
+    virtual const char *fragmentShader() const = 0;
+
+    QGLShaderProgram m_program;
+    bool m_compiled;
+    void *m_reserved;
+};
+
+struct QSGMaterialType { };
+
+class Q_DECLARATIVE_EXPORT QSGMaterial
+{
+public:
+    enum Flag {
+        Blending = 0x0001
+    };
+    Q_DECLARE_FLAGS(Flags, Flag)
+
+    QSGMaterial();
+    virtual ~QSGMaterial();
+
+    virtual QSGMaterialType *type() const = 0;
+    virtual QSGMaterialShader *createShader() const = 0;
+    virtual int compare(const QSGMaterial *other) const;
+
+    QSGMaterial::Flags flags() const { return m_flags; }
+
+protected:
+    void setFlag(Flags flags, bool set);
+
+private:
+    Flags m_flags;
+    void *m_reserved;
+    Q_DISABLE_COPY(QSGMaterial)
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterial::Flags)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterialShader::RenderState::DirtyStates)
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.cpp b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.cpp
new file mode 100644
index 0000000000..07ba21d17c
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.cpp
@@ -0,0 +1,380 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgmatrix4x4stack.h"
+#include "qsgmatrix4x4stack_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \class QSGMatrix4x4Stack
+    \brief The QSGMatrix4x4Stack class manages stacks of transformation matrices in GL applications.
+    \since 4.8
+    \ingroup qt3d
+    \ingroup qt3d::enablers
+
+    Transformation matrices are one of the basic building blocks of
+    3D applications, allowing object models to be positioned, scaled,
+    rotated, and projected onto the screen.
+
+    GL systems support several standard kinds of matrices, particularly
+    modelview and projection matrices.  These matrices are typically
+    organized into stacks, which allow the current matrix state to be
+    saved with push() and restored later with pop().
+
+    QSGMatrix4x4Stack assists QGLPainter with the management of matrix
+    stacks, providing operations to set and modify transformation
+    matrices in each of the standard matrix stacks.
+
+    In the following example, a standard orthographic projection matrix for a
+    view is set via the QGLPainter::projectionMatrix() stack, and
+    then a modelview matrix is set via the QGLPainter::modelViewMatrix()
+    stack to scale and translate an object prior to drawing:
+
+    \code
+    QGLPainter painter(this);
+
+    QMatrix4x4 projm;
+    projm.ortho(window->rect());
+    painter.projectionMatrix() = projm;
+
+    painter.modelViewMatrix().setToIdentity();
+    painter.modelViewMatrix().translate(-1.0f, 2.0f, 0.0f);
+    painter.modelViewMatrix().scale(0.5f);
+    \endcode
+
+    Later, the application can save the current modelview matrix state
+    and draw a different object with a different modelview matrix:
+
+    \code
+    painter.modelViewMatrix().push();
+    painter.modelViewMatrix().setToIdentity();
+    painter.modelViewMatrix().scale(2.0f);
+    \endcode
+
+    For efficiency, the matrix values are kept client-side until they
+    are needed by a QGLPainter::draw() operation.  Until then, changes
+    to the matrix will not be reflected in the GL server.  The application
+    can force the GL server to update the server with a call to
+    QGLPainter::update().
+
+    QSGMatrix4x4Stack is supported on all GL platforms, including OpenGL/ES 2.0
+    which doesn't support matrix stacks natively.  On that platform, the
+    matrix stack is simulated in client memory.  When the application
+    selects a shader program to draw under OpenGL/ES 2.0, it calls
+    top() to obtain the actual value to be set on the shader program.
+
+    \sa QGLPainter
+*/
+
+/*!
+    Creates a matrix stack.
+*/
+QSGMatrix4x4Stack::QSGMatrix4x4Stack()
+    : d_ptr(new QSGMatrix4x4StackPrivate)
+{
+}
+
+/*!
+    Destroy this matrix stack.
+*/
+QSGMatrix4x4Stack::~QSGMatrix4x4Stack()
+{
+}
+
+/*!
+    Pushes the current matrix onto the matrix stack.  The matrix can
+    be restored with pop().  The new top of stack will have the
+    same value as the previous top of stack.
+
+    The depths of the traditional \c{GL_MODELVIEW} and \c{GL_PROJECTION}
+    matrix stacks in the GL server are system-dependent and easy to
+    overflow in nested rendering code using \c{glPushMatrix()}.
+    By contrast, the push() function provides an arbitrary-sized stack
+    in client memory.
+
+    \sa pop(), top()
+*/
+void QSGMatrix4x4Stack::push()
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->stack.push(d->matrix);
+}
+
+/*!
+    Pops the top-most matrix from this matrix stack and sets the
+    current matrix to the next value down.  Does nothing if the
+    matrix stack contains a single entry.
+
+    \sa push()
+*/
+void QSGMatrix4x4Stack::pop()
+{
+    Q_D(QSGMatrix4x4Stack);
+    if (!d->stack.isEmpty())
+        d->matrix = d->stack.pop();
+    d->isDirty = true;
+}
+
+/*!
+    Set the matrix at the top of this matrix stack to the identity matrix.
+
+    \sa operator=()
+*/
+void QSGMatrix4x4Stack::setToIdentity()
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.setToIdentity();
+    d->isDirty = true;
+}
+
+/*!
+    Returns a const reference to the current matrix at the top of this
+    matrix stack.  This is typically used to fetch the matrix so it can
+    be set on user-defined shader programs.
+
+    \sa operator=()
+*/
+const QMatrix4x4 &QSGMatrix4x4Stack::top() const
+{
+    Q_D(const QSGMatrix4x4Stack);
+    return d->matrix;
+}
+
+/*!
+    \fn QSGMatrix4x4Stack::operator const QMatrix4x4 &() const
+
+    Returns a const reference to the current matrix at the top of
+    this matrix stack.
+
+    \sa top()
+*/
+
+/*!
+    Assigns \a matrix to the matrix at the top of this matrix stack.
+
+    \sa top()
+*/
+QSGMatrix4x4Stack& QSGMatrix4x4Stack::operator=(const QMatrix4x4& matrix)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix = matrix;
+    d->isDirty = true;
+    return *this;
+}
+
+/*!
+    Multiplies the matrix at the top of this matrix stack by \a matrix.
+
+    \sa top()
+*/
+QSGMatrix4x4Stack& QSGMatrix4x4Stack::operator*=(const QMatrix4x4& matrix)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix *= matrix;
+    d->isDirty = true;
+    return *this;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that translates coordinates by (\a x, \a y, \a z).  The following example
+    translates the modelview matrix by (1, -3, 0):
+
+    \code
+    QGLPainter painter(this);
+    painter.modelViewMatrix().translate(1.0f, -3.0f, 0.0f);
+    \endcode
+
+    \sa scale(), rotate()
+*/
+void QSGMatrix4x4Stack::translate(qreal x, qreal y, qreal z)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.translate(x, y, z);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix statck by another
+    that translates coordinates by the components of \a vector.
+
+    \sa scale(), rotate()
+*/
+void QSGMatrix4x4Stack::translate(const QVector3D& vector)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.translate(vector);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that scales coordinates by the components \a x, \a y, and \a z.
+    The following example scales the modelview matrix by (1, 2, 1):
+
+    \code
+    QGLPainter painter(this);
+    painter.modelViewMatrix().scale(1.0f, 2.0f, 1.0f);
+    \endcode
+
+    \sa translate(), rotate()
+*/
+void QSGMatrix4x4Stack::scale(qreal x, qreal y, qreal z)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.scale(x, y, z);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that scales coordinates by the given \a factor.  The following example
+    scales the modelview matrix by a factor of 2:
+
+    \code
+    QGLPainter painter(this);
+    painter.modelViewMatrix().scale(2.0f);
+    \endcode
+
+    \sa translate(), rotate()
+*/
+void QSGMatrix4x4Stack::scale(qreal factor)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.scale(factor);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that scales coordinates by the components of \a vector.
+
+    \sa translate(), rotate()
+*/
+void QSGMatrix4x4Stack::scale(const QVector3D& vector)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.scale(vector);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that rotates coordinates through \a angle degrees about the vector
+    (\a x, \a y, \a z).  The following example rotates the modelview
+    matrix by 45 degress about the vector (1, -3, 0):
+
+    \code
+    QGLPainter painter(this);
+    painter.modelViewMatrix().rotate(45.0f, 1.0f, -3.0f, 0.0f);
+    \endcode
+
+    \sa scale(), translate()
+*/
+void QSGMatrix4x4Stack::rotate(qreal angle, qreal x, qreal y, qreal z)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.rotate(angle, x, y, z);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by another
+    that rotates coordinates through \a angle degrees about \a vector.
+
+    \sa scale(), translate()
+*/
+void QSGMatrix4x4Stack::rotate(qreal angle, const QVector3D& vector)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.rotate(angle, vector);
+    d->isDirty = true;
+}
+
+/*!
+    Multiplies the current matrix at the top of this matrix stack by the
+    \a quaternion.  Thus \c {painter->modelViewMatrix().rotate(quaternion)}
+    is equivalent to the following code:
+    \code
+    QMatrix4x4 mat;
+    mat.rotate(quaternion);
+    painter->modelViewMatrix() *= mat;
+    \endcode
+    which rotates coordinates according to the given \a quaternion.
+
+    \sa scale(), translate()
+*/
+void QSGMatrix4x4Stack::rotate(const QQuaternion &quaternion)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->matrix.rotate(quaternion);
+    d->isDirty = true;
+}
+
+/*!
+    Returns true if the top of this matrix stack has been modified;
+    false otherwise.
+
+    \sa setDirty()
+*/
+bool QSGMatrix4x4Stack::isDirty() const
+{
+    Q_D(const QSGMatrix4x4Stack);
+    return d->isDirty;
+}
+
+/*!
+    Sets the \a dirty flag on this matrix stack, which indicates
+    if it has been modified.
+
+    A matrix stack may also be set to dirty by translate(),
+    scale(), operator*(), etc.
+
+    \sa isDirty()
+*/
+void QSGMatrix4x4Stack::setDirty(bool dirty)
+{
+    Q_D(QSGMatrix4x4Stack);
+    d->isDirty = dirty;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.h b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.h
new file mode 100644
index 0000000000..2336598fdc
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGMATRIX4X4STACK_H
+#define QSGMATRIX4X4STACK_H
+
+#include <QtGui/qmatrix4x4.h>
+#include <QtCore/qscopedpointer.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGMatrix4x4StackPrivate;
+
+class Q_DECLARATIVE_EXPORT QSGMatrix4x4Stack
+{
+public:
+    QSGMatrix4x4Stack();
+    ~QSGMatrix4x4Stack();
+
+    const QMatrix4x4 &top() const;
+
+    void push();
+    void pop();
+
+    void setToIdentity();
+
+    void translate(qreal x, qreal y, qreal z);
+    void translate(const QVector3D& vector);
+    void scale(qreal x, qreal y, qreal z);
+    void scale(qreal factor);
+    void scale(const QVector3D& vector);
+    void rotate(qreal angle, qreal x, qreal y, qreal z);
+    void rotate(qreal angle, const QVector3D& vector);
+    void rotate(const QQuaternion &quaternion);
+
+    QSGMatrix4x4Stack& operator=(const QMatrix4x4& matrix);
+    QSGMatrix4x4Stack& operator*=(const QMatrix4x4& matrix);
+
+    operator const QMatrix4x4 &() const;
+
+    bool isDirty() const;
+    void setDirty(bool dirty);
+
+private:
+    Q_DISABLE_COPY(QSGMatrix4x4Stack)
+    Q_DECLARE_PRIVATE(QSGMatrix4x4Stack)
+
+    QScopedPointer<QSGMatrix4x4StackPrivate> d_ptr;
+
+    friend class QGLPainter;
+};
+
+inline QSGMatrix4x4Stack::operator const QMatrix4x4 &() const
+{
+    return top();
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack_p.h b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack_p.h
new file mode 100644
index 0000000000..6e5c08ca03
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgmatrix4x4stack_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGMATRIX4X4STACK_P_H
+#define QSGMATRIX4X4STACK_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/qmatrix4x4.h>
+#include <QtCore/qstack.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGMatrix4x4StackPrivate
+{
+public:
+    QSGMatrix4x4StackPrivate() : isDirty(true) {}
+
+    QMatrix4x4 matrix;
+    QStack<QMatrix4x4> stack;
+    bool isDirty;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/declarative/scenegraph/coreapi/qsgnode.cpp b/src/declarative/scenegraph/coreapi/qsgnode.cpp
new file mode 100644
index 0000000000..5d84086457
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgnode.cpp
@@ -0,0 +1,837 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgnode.h"
+#include "qsgrenderer_p.h"
+#include "qsgnodeupdater_p.h"
+#include "qsgmaterial.h"
+
+#include "limits.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_DEBUG
+static int qt_node_count = 0;
+
+static void qt_print_node_count()
+{
+    qDebug("Number of leaked nodes: %i", qt_node_count);
+    qt_node_count = -1;
+}
+#endif
+
+/*!
+    \class QSGNode
+    \bried The QSGNode class is the base class for all nodes in the scene graph.
+
+    The QSGNode class can be used as a child container. Children are added with
+    the appendChildNode(), prependChildNode(), insertChildNodeBefore() and
+    insertChildNodeAfter(). Ordering is important as nodes are rendered in
+    order. Actually, the scene may reorder nodes freely, but the resulting visual
+    order is still guaranteed.
+
+    If nodes change every frame, the preprocess() function can be used to
+    apply changes to a node for every frame its rendered. The use of preprocess()
+    must be explicitly enabled by setting the QSGNode::UsePreprocess flag
+    on the node.
+
+    The virtual isSubtreeBlocked() function can be used to disable a subtree all
+    together. Nodes in a blocked subtree will not be preprocessed() and not
+    rendered.
+
+    Anything related to QSGNode should happen on the scene graph rendering thread.
+ */
+
+QSGNode::QSGNode()
+    : m_parent(0)
+    , m_nodeFlags(OwnedByParent)
+    , m_flags(0)
+{
+#ifndef QT_NO_DEBUG
+    ++qt_node_count;
+    static bool atexit_registered = false;
+    if (!atexit_registered) {
+        atexit(qt_print_node_count);
+        atexit_registered = true;
+    }
+#endif
+
+}
+
+QSGNode::~QSGNode()
+{
+#ifndef QT_NO_DEBUG
+    --qt_node_count;
+    if (qt_node_count < 0)
+        qDebug("Material destroyed after qt_print_node_count() was called.");
+#endif
+    destroy();
+}
+
+
+/*!
+    \fn void QSGNode::preprocess()
+
+    Override this function to do processing on the node before it is rendered.
+
+    Preprocessing needs to be explicitly enabled by setting the flag
+    QSGNode::UsePreprocess. The flag needs to be set before the node is added
+    to the scene graph and will cause the preprocess() function to be called
+    for every frame the node is rendered.
+
+    The preprocess function is called before the update pass that propegates
+    opacity and transformations through the scene graph. That means that
+    functions like QSGOpacityNode::combinedOpacity() and
+    QSGTransformNode::combinedMatrix() will not contain up-to-date values.
+    If such values are changed during the preprocess, these changes will be
+    propegated through the scene graph before it is rendered.
+
+    \warning Beware of deleting nodes while they are being preprocessed. It is
+    possible, with a small performance hit, to delete a single node during its
+    own preprocess call. Deleting a subtree which has nodes that also use
+    preprocessing may result in a segmentation fault. This is done for
+    performance reasons.
+ */
+
+
+
+
+/*!
+    \fn bool QSGNode::isSubtreeBlocked() const
+
+    Returns whether this node and its subtree is available for use.
+
+    Blocked subtrees will not get their dirty states updated and they
+    will not be rendered.
+
+    The QSGOpacityNode will return a blocked subtree when accumulated opacity
+    is 0, for instance.
+ */
+
+
+void QSGNode::destroy()
+{
+    if (m_parent) {
+        m_parent->removeChildNode(this);
+        Q_ASSERT(m_parent == 0);
+    }
+    for (int ii = m_children.count() - 1; ii >= 0; --ii) {
+        QSGNode *child = m_children.at(ii);
+        removeChildNode(child);
+        Q_ASSERT(child->m_parent == 0);
+        if (child->flags() & OwnedByParent)
+            delete child;
+    }
+    Q_ASSERT(m_children.isEmpty());
+}
+
+void QSGNode::prependChildNode(QSGNode *node)
+{
+    Q_ASSERT_X(!m_children.contains(node), "QSGNode::prependChildNode", "QSGNode is already a child!");
+    Q_ASSERT_X(!node->m_parent, "QSGNode::prependChildNode", "QSGNode already has a parent");
+
+#ifndef QT_NO_DEBUG
+    if (node->type() == QSGNode::GeometryNodeType) {
+        QSGGeometryNode *g = static_cast<QSGGeometryNode *>(node);
+        Q_ASSERT_X(g->material(), "QSGNode::prependChildNode", "QSGGeometryNode is missing material");
+        Q_ASSERT_X(g->geometry(), "QSGNode::prependChildNode", "QSGGeometryNode is missing geometry");
+    }
+#endif
+
+    m_children.prepend(node);
+    node->m_parent = this;
+
+    node->markDirty(DirtyNodeAdded);
+}
+
+void QSGNode::appendChildNode(QSGNode *node)
+{
+    Q_ASSERT_X(!m_children.contains(node), "QSGNode::appendChildNode", "QSGNode is already a child!");
+    Q_ASSERT_X(!node->m_parent, "QSGNode::appendChildNode", "QSGNode already has a parent");
+
+#ifndef QT_NO_DEBUG
+    if (node->type() == QSGNode::GeometryNodeType) {
+        QSGGeometryNode *g = static_cast<QSGGeometryNode *>(node);
+        Q_ASSERT_X(g->material(), "QSGNode::appendChildNode", "QSGGeometryNode is missing material");
+        Q_ASSERT_X(g->geometry(), "QSGNode::appendChildNode", "QSGGeometryNode is missing geometry");
+    }
+#endif
+
+    m_children.append(node);
+    node->m_parent = this;
+
+    node->markDirty(DirtyNodeAdded);
+}
+
+void QSGNode::insertChildNodeBefore(QSGNode *node, QSGNode *before)
+{
+    Q_ASSERT_X(!m_children.contains(node), "QSGNode::insertChildNodeBefore", "QSGNode is already a child!");
+    Q_ASSERT_X(!node->m_parent, "QSGNode::insertChildNodeBefore", "QSGNode already has a parent");
+    Q_ASSERT_X(node->type() != RootNodeType, "QSGNode::insertChildNodeBefore", "RootNodes cannot be children of other nodes");
+
+#ifndef QT_NO_DEBUG
+    if (node->type() == QSGNode::GeometryNodeType) {
+        QSGGeometryNode *g = static_cast<QSGGeometryNode *>(node);
+        Q_ASSERT_X(g->material(), "QSGNode::insertChildNodeBefore", "QSGGeometryNode is missing material");
+        Q_ASSERT_X(g->geometry(), "QSGNode::insertChildNodeBefore", "QSGGeometryNode is missing geometry");
+    }
+#endif
+
+    int idx = before?m_children.indexOf(before):-1;
+    if (idx == -1)
+        m_children.append(node);
+    else
+        m_children.insert(idx, node);
+    node->m_parent = this;
+
+    node->markDirty(DirtyNodeAdded);
+}
+
+void QSGNode::insertChildNodeAfter(QSGNode *node, QSGNode *after)
+{
+    Q_ASSERT_X(!m_children.contains(node), "QSGNode::insertChildNodeAfter", "QSGNode is already a child!");
+    Q_ASSERT_X(!node->m_parent, "QSGNode::insertChildNodeAfter", "QSGNode already has a parent");
+    Q_ASSERT_X(node->type() != RootNodeType, "QSGNode::insertChildNodeAfter", "RootNodes cannot be children of other nodes");
+
+#ifndef QT_NO_DEBUG
+    if (node->type() == QSGNode::GeometryNodeType) {
+        QSGGeometryNode *g = static_cast<QSGGeometryNode *>(node);
+        Q_ASSERT_X(g->material(), "QSGNode::insertChildNodeAfter", "QSGGeometryNode is missing material");
+        Q_ASSERT_X(g->geometry(), "QSGNode::insertChildNodeAfter", "QSGGeometryNode is missing geometry");
+    }
+#endif
+
+    int idx = after?m_children.indexOf(after):-1;
+    if (idx == -1)
+        m_children.append(node);
+    else
+        m_children.insert(idx + 1, node);
+    node->m_parent = this;
+
+    node->markDirty(DirtyNodeAdded);
+}
+
+void QSGNode::removeChildNode(QSGNode *node)
+{
+    Q_ASSERT(m_children.contains(node));
+    Q_ASSERT(node->parent() == this);
+
+    m_children.removeOne(node);
+
+    node->markDirty(DirtyNodeRemoved);
+    node->m_parent = 0;
+}
+
+
+/*!
+    Sets the flag \a f on this node if \a enabled is true;
+    otherwise clears the flag.
+
+    \sa flags()
+*/
+
+void QSGNode::setFlag(Flag f, bool enabled)
+{
+    if (enabled)
+        m_nodeFlags |= f;
+    else
+        m_nodeFlags &= ~f;
+}
+
+
+/*!
+    Sets the flags \a f on this node if \a enabled is true;
+    otherwise clears the flags.
+
+    \sa flags()
+*/
+
+void QSGNode::setFlags(Flags f, bool enabled)
+{
+    if (enabled)
+        m_nodeFlags |= f;
+    else
+        m_nodeFlags &= ~f;
+}
+
+
+void QSGNode::markDirty(DirtyFlags flags)
+{
+    m_flags |= (flags & DirtyPropagationMask);
+
+    DirtyFlags subtreeFlags = DirtyFlags((flags & DirtyPropagationMask) << 16);
+    QSGNode *p = m_parent;
+    while (p) {
+        p->m_flags |= subtreeFlags;
+        if (p->type() == RootNodeType)
+            static_cast<QSGRootNode *>(p)->notifyNodeChange(this, flags);
+        p = p->m_parent;
+    }
+}
+
+QSGBasicGeometryNode::QSGBasicGeometryNode()
+    : m_geometry(0)
+    , m_matrix(0)
+    , m_clip_list(0)
+{
+}
+
+QSGBasicGeometryNode::~QSGBasicGeometryNode()
+{
+    destroy();
+    if (flags() & OwnsGeometry)
+        delete m_geometry;
+}
+
+void QSGBasicGeometryNode::setGeometry(QSGGeometry *geometry)
+{
+    if (flags() & OwnsGeometry)
+        delete m_geometry;
+    m_geometry = geometry;
+    markDirty(DirtyGeometry);
+}
+
+
+QSGGeometryNode::QSGGeometryNode()
+    : m_render_order(0)
+    , m_material(0)
+    , m_opaque_material(0)
+    , m_opacity(1)
+{
+}
+
+QSGGeometryNode::~QSGGeometryNode()
+{
+    destroy();
+    if (flags() & OwnsMaterial)
+        delete m_material;
+    if (flags() & OwnsOpaqueMaterial)
+        delete m_opaque_material;
+}
+
+/*!
+    Sets the render order of this node to be \a order.
+
+    GeometryNodes are rendered in an order that visually looks like
+    low order nodes are rendered prior to high order nodes. For opaque
+    geometry there is little difference as z-testing will handle
+    the discard, but for translucent objects, the rendering should
+    normally be specified in the order of back-to-front.
+
+    The default render order is 0.
+
+    \internal
+  */
+void QSGGeometryNode::setRenderOrder(int order)
+{
+    m_render_order = order;
+}
+
+
+
+/*!
+    Sets the material of this geometry node to \a material.
+
+    GeometryNodes must have a material before they can be added to the
+    scene graph.
+ */
+void QSGGeometryNode::setMaterial(QSGMaterial *material)
+{
+    if (flags() & OwnsMaterial)
+        delete m_material;
+    m_material = material;
+#ifndef QT_NO_DEBUG
+    if (m_material != 0 && m_opaque_material == m_material)
+        qWarning("QSGGeometryNode: using same material for both opaque and translucent");
+#endif
+    markDirty(DirtyMaterial);
+}
+
+
+
+/*!
+    Sets the opaque material of this geometry to \a material.
+
+    The opaque material will be preferred by the renderer over the
+    default material, as returned by the material() function, if
+    it is not null and the geometry item has an inherited opacity of
+    1.
+
+    The opaqueness refers to scene graph opacity, the material is still
+    allowed to set QSGMaterial::Blending to true and draw transparent
+    pixels.
+ */
+void QSGGeometryNode::setOpaqueMaterial(QSGMaterial *material)
+{
+    if (flags() & OwnsOpaqueMaterial)
+        delete m_opaque_material;
+    m_opaque_material = material;
+#ifndef QT_NO_DEBUG
+    if (m_opaque_material != 0 && m_opaque_material == m_material)
+        qWarning("QSGGeometryNode: using same material for both opaque and translucent");
+#endif
+
+    markDirty(DirtyMaterial);
+}
+
+
+
+/*!
+    Returns the material which should currently be used for geometry node.
+
+    If the inherited opacity of the node is 1 and there is an opaque material
+    set on this node, it will be returned; otherwise, the default material
+    will be returned.
+
+    \warning This function requires the scene graph above this item to be
+    completely free of dirty states, so it can only be called during rendering
+
+    \internal
+
+    \sa setMaterial, setOpaqueMaterial
+ */
+QSGMaterial *QSGGeometryNode::activeMaterial() const
+{
+    Q_ASSERT_X(dirtyFlags() == 0, "QSGGeometryNode::activeMaterial()", "function assumes that all dirty states are cleaned up");
+    if (m_opaque_material && m_opacity > 0.999)
+        return m_opaque_material;
+    return m_material;
+}
+
+
+/*!
+    Sets the inherited opacity of this geometry to \a opacity.
+
+    This function is meant to be called by the node preprocessing
+    prior to rendering the tree, so it will not mark the tree as
+    dirty.
+
+    \internal
+  */
+void QSGGeometryNode::setInheritedOpacity(qreal opacity)
+{
+    Q_ASSERT(opacity >= 0 && opacity <= 1);
+    m_opacity = opacity;
+}
+
+
+
+QSGClipNode::QSGClipNode()
+{
+}
+
+QSGClipNode::~QSGClipNode()
+{
+    destroy();
+}
+
+/*!
+    Sets whether this clip node has a rectangular clip to \a rectHint.
+ */
+void QSGClipNode::setIsRectangular(bool rectHint)
+{
+    m_is_rectangular = rectHint;
+}
+
+
+/*!
+    Sets the clip rect of this clip node to \a rect.
+
+    When a rectangular clip is set in combination with setIsRectangular
+    the renderer may in some cases use a more optimal clip method.
+ */
+void QSGClipNode::setClipRect(const QRectF &rect)
+{
+    m_clip_rect = rect;
+}
+
+
+QSGTransformNode::QSGTransformNode()
+{
+}
+
+QSGTransformNode::~QSGTransformNode()
+{
+    destroy();
+}
+
+void QSGTransformNode::setMatrix(const QMatrix4x4 &matrix)
+{
+    m_matrix = matrix;
+    markDirty(DirtyMatrix);
+}
+
+
+/*!
+    Sets the combined matrix of this matrix to \a transform.
+
+    This function is meant to be called by the node preprocessing
+    prior to rendering the tree, so it will not mark the tree as
+    dirty.
+
+    \internal
+  */
+void QSGTransformNode::setCombinedMatrix(const QMatrix4x4 &matrix)
+{
+    m_combined_matrix = matrix;
+}
+
+
+
+QSGRootNode::~QSGRootNode()
+{
+    while (!m_renderers.isEmpty())
+        m_renderers.last()->setRootNode(0);
+    destroy();
+}
+
+
+void QSGRootNode::notifyNodeChange(QSGNode *node, DirtyFlags flags)
+{
+    for (int i=0; i<m_renderers.size(); ++i) {
+        m_renderers.at(i)->nodeChanged(node, flags);
+    }
+}
+
+/*!
+    Constructs an opacity node with a default opacity of 1.
+
+    Opacity accumulate downwards in the scene graph so a node with two
+    QSGOpacityNode instances above it, both with opacity of 0.5, will have
+    effective opacity of 0.25.
+
+    The default opacity of nodes is 1.
+  */
+QSGOpacityNode::QSGOpacityNode()
+    : m_opacity(1)
+    , m_combined_opacity(1)
+{
+}
+
+
+QSGOpacityNode::~QSGOpacityNode()
+{
+    destroy();
+}
+
+
+/*!
+    Sets the opacity of this node to \a opacity.
+
+    Before rendering the graph, the renderer will do an update pass
+    over the subtree to propegate the opacity to its children.
+
+    The value will be bounded to the range 0 to 1.
+ */
+void QSGOpacityNode::setOpacity(qreal opacity)
+{
+    opacity = qBound<qreal>(0, opacity, 1);
+    if (m_opacity == opacity)
+        return;
+    m_opacity = opacity;
+    markDirty(DirtyOpacity);
+}
+
+
+/*!
+    Sets the combined opacity of this node to \a opacity.
+
+    This function is meant to be called by the node preprocessing
+    prior to rendering the tree, so it will not mark the tree as
+    dirty.
+
+    \internal
+ */
+void QSGOpacityNode::setCombinedOpacity(qreal opacity)
+{
+    m_combined_opacity = opacity;
+}
+
+
+bool QSGOpacityNode::isSubtreeBlocked() const
+{
+    return m_combined_opacity < 0.001;
+}
+
+
+QSGNodeVisitor::~QSGNodeVisitor()
+{
+
+}
+
+
+void QSGNodeVisitor::visitNode(QSGNode *n)
+{
+    switch (n->type()) {
+    case QSGNode::TransformNodeType: {
+        QSGTransformNode *t = static_cast<QSGTransformNode *>(n);
+        enterTransformNode(t);
+        visitChildren(t);
+        leaveTransformNode(t);
+        break; }
+    case QSGNode::GeometryNodeType: {
+        QSGGeometryNode *g = static_cast<QSGGeometryNode *>(n);
+        enterGeometryNode(g);
+        visitChildren(g);
+        leaveGeometryNode(g);
+        break; }
+    case QSGNode::ClipNodeType: {
+        QSGClipNode *c = static_cast<QSGClipNode *>(n);
+        enterClipNode(c);
+        visitChildren(c);
+        leaveClipNode(c);
+        break; }
+    case QSGNode::OpacityNodeType: {
+        QSGOpacityNode *o = static_cast<QSGOpacityNode *>(n);
+        enterOpacityNode(o);
+        visitChildren(o);
+        leaveOpacityNode(o);
+        break; }
+    default:
+        visitChildren(n);
+        break;
+    }
+}
+
+void QSGNodeVisitor::visitChildren(QSGNode *n)
+{
+    int count = n->childCount();
+    for (int i=0; i<count; ++i) {
+        visitNode(n->childAtIndex(i));
+    }
+}
+
+
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug d, const QSGGeometryNode *n)
+{
+    if (!n) {
+        d << "QSGGeometryNode(null)";
+        return d;
+    }
+    d << "QSGGeometryNode(" << hex << (void *) n << dec;
+
+    const QSGGeometry *g = n->geometry();
+
+    if (!g) {
+        d << "no geometry";
+    } else {
+
+        switch (g->drawingMode()) {
+        case GL_TRIANGLE_STRIP: d << "strip"; break;
+        case GL_TRIANGLE_FAN: d << "fan"; break;
+        case GL_TRIANGLES: d << "triangles"; break;
+        default: break;
+        }
+
+         d << g->vertexCount();
+
+         if (g->attributeCount() > 0 && g->attributes()->type == GL_FLOAT) {
+             float x1 = 1e10, x2 = -1e10, y1=1e10, y2=-1e10;
+             int stride = g->stride();
+             for (int i = 0; i < g->vertexCount(); ++i) {
+                 float x = ((float *)((char *)const_cast<QSGGeometry *>(g)->vertexData() + i * stride))[0];
+                 float y = ((float *)((char *)const_cast<QSGGeometry *>(g)->vertexData() + i * stride))[1];
+
+                 x1 = qMin(x1, x);
+                 x2 = qMax(x2, x);
+                 y1 = qMin(y1, y);
+                 y2 = qMax(y2, y);
+             }
+
+             d << "x1=" << x1 << "y1=" << y1 << "x2=" << x2 << "y2=" << y2;
+         }
+    }
+
+    d << "order=" << n->renderOrder();
+    if (n->material())
+        d << "effect=" << n->material() << "type=" << n->material()->type();
+
+
+    d << ")";
+#ifdef QML_RUNTIME_TESTING
+    d << n->description;
+#endif
+    d << "dirty=" << hex << (int) n->dirtyFlags() << dec;
+    return d;
+}
+
+QDebug operator<<(QDebug d, const QSGClipNode *n)
+{
+    if (!n) {
+        d << "QSGClipNode(null)";
+        return d;
+    }
+    d << "QSGClipNode(" << hex << (void *) n << dec;
+
+    if (n->childCount())
+        d << "children=" << n->childCount();
+
+    d << "is rect?" << (n->isRectangular() ? "yes" : "no");
+
+    d << ")";
+#ifdef QML_RUNTIME_TESTING
+    d << n->description;
+#endif
+    d << "dirty=" << hex << (int) n->dirtyFlags() << dec << (n->isSubtreeBlocked() ? "*BLOCKED*" : "");
+    return d;
+}
+
+QDebug operator<<(QDebug d, const QSGTransformNode *n)
+{
+    if (!n) {
+        d << "QSGTransformNode(null)";
+        return d;
+    }
+    const QMatrix4x4 m = n->matrix();
+    d << "QSGTransformNode(";
+    d << hex << (void *) n << dec;
+    if (m.isIdentity())
+        d << "identity";
+    else if (m.determinant() == 1 && m(0, 0) == 1 && m(1, 1) == 1 && m(2, 2) == 1)
+        d << "translate" << m(0, 3) << m(1, 3) << m(2, 3);
+    else
+        d << "det=" << n->matrix().determinant();
+#ifdef QML_RUNTIME_TESTING
+    d << n->description;
+#endif
+    d << "dirty=" << hex << (int) n->dirtyFlags() << dec << (n->isSubtreeBlocked() ? "*BLOCKED*" : "");
+    d << ")";
+    return d;
+}
+
+QDebug operator<<(QDebug d, const QSGOpacityNode *n)
+{
+    if (!n) {
+        d << "QSGOpacityNode(null)";
+        return d;
+    }
+    d << "QSGOpacityNode(";
+    d << hex << (void *) n << dec;
+    d << "opacity=" << n->opacity()
+      << "combined=" << n->combinedOpacity()
+      << (n->isSubtreeBlocked() ? "*BLOCKED*" : "");
+#ifdef QML_RUNTIME_TESTING
+    d << n->description;
+#endif
+    d << "dirty=" << hex << (int) n->dirtyFlags() << dec;
+    d << ")";
+    return d;
+}
+
+
+QDebug operator<<(QDebug d, const QSGRootNode *n)
+{
+    if (!n) {
+        d << "QSGRootNode(null)";
+        return d;
+    }
+    d << "QSGRootNode" << hex << (void *) n << "dirty=" << (int) n->dirtyFlags() << dec
+      << (n->isSubtreeBlocked() ? "*BLOCKED*" : "");
+#ifdef QML_RUNTIME_TESTING
+    d << n->description;
+#endif
+    d << ")";
+    return d;
+}
+
+
+
+QDebug operator<<(QDebug d, const QSGNode *n)
+{
+    if (!n) {
+        d << "QSGNode(null)";
+        return d;
+    }
+    switch (n->type()) {
+    case QSGNode::GeometryNodeType:
+        d << static_cast<const QSGGeometryNode *>(n);
+        break;
+    case QSGNode::TransformNodeType:
+        d << static_cast<const QSGTransformNode *>(n);
+        break;
+    case QSGNode::ClipNodeType:
+        d << static_cast<const QSGClipNode *>(n);
+        break;
+    case QSGNode::RootNodeType:
+        d << static_cast<const QSGRootNode *>(n);
+        break;
+    case QSGNode::OpacityNodeType:
+        d << static_cast<const QSGOpacityNode *>(n);
+        break;
+    default:
+        d << "QSGNode(" << hex << (void *) n << dec
+          << "dirty=" << hex << (int) n->dirtyFlags() << dec
+          << (n->isSubtreeBlocked() ? "*BLOCKED*" : "");
+#ifdef QML_RUNTIME_TESTING
+        d << n->description;
+#endif
+        d << ")";
+        break;
+    }
+    return d;
+}
+
+void QSGNodeDumper::dump(QSGNode *n)
+{
+    QSGNodeDumper dump;
+    dump.visitNode(n);
+}
+
+void QSGNodeDumper::visitNode(QSGNode *n)
+{
+    if (n->isSubtreeBlocked())
+        return;
+    qDebug() << QString(m_indent * 2, QLatin1Char(' ')) << n;
+    QSGNodeVisitor::visitNode(n);
+}
+
+void QSGNodeDumper::visitChildren(QSGNode *n)
+{
+    ++m_indent;
+    QSGNodeVisitor::visitChildren(n);
+    --m_indent;
+}
+
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgnode.h b/src/declarative/scenegraph/coreapi/qsgnode.h
new file mode 100644
index 0000000000..fd2bc82b22
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgnode.h
@@ -0,0 +1,363 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef NODE_H
+#define NODE_H
+
+#include "qsggeometry.h"
+#include <QtGui/QMatrix4x4>
+
+#include <float.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+#define QML_RUNTIME_TESTING
+
+class QSGRenderer;
+
+class QSGNode;
+class QSGRootNode;
+class QSGGeometryNode;
+class QSGTransformNode;
+class QSGClipNode;
+
+class Q_DECLARATIVE_EXPORT QSGNode
+{
+public:
+    enum NodeType {
+        BasicNodeType,
+        RootNodeType,
+        GeometryNodeType,
+        TransformNodeType,
+        ClipNodeType,
+        OpacityNodeType,
+        UserNodeType = 1024
+    };
+
+    enum DirtyFlag {
+        DirtyMatrix                 = 0x0001,
+        DirtyClipList               = 0x0002,
+        DirtyNodeAdded              = 0x0004,
+        DirtyNodeRemoved            = 0x0008,
+        DirtyGeometry               = 0x0010,
+        DirtyRenderOrder            = 0x0020,
+        DirtyMaterial               = 0x0100,
+        DirtyOpacity                = 0x0200,
+        DirtyAll                    = 0xffff,
+
+        DirtyPropagationMask        = DirtyMatrix
+                                      | DirtyClipList
+                                      | DirtyNodeAdded
+                                      | DirtyOpacity,
+
+    };
+    Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
+
+    enum Flag {
+        // Lower 16 bites reserved for general node
+        OwnedByParent               = 0x0001,
+        UsePreprocess               = 0x0002,
+        ChildrenDoNotOverloap       = 0x0004,
+
+        // Upper 16 bits reserved for node subclasses
+
+        // QSGBasicGeometryNode
+        OwnsGeometry                = 0x00010000,
+        OwnsMaterial                = 0x00020000,
+        OwnsOpaqueMaterial          = 0x00040000
+    };
+    Q_DECLARE_FLAGS(Flags, Flag)
+
+    QSGNode();
+    virtual ~QSGNode();
+
+    QSGNode *parent() const { return m_parent; }
+
+    void removeChildNode(QSGNode *node);
+    void prependChildNode(QSGNode *node);
+    void appendChildNode(QSGNode *node);
+    void insertChildNodeBefore(QSGNode *node, QSGNode *before);
+    void insertChildNodeAfter(QSGNode *node, QSGNode *after);
+
+    int childCount() const { return m_children.size(); }
+    QSGNode *childAtIndex(int i) const { return m_children.at(i); }
+
+    virtual NodeType type() const { return BasicNodeType; }
+
+    void clearDirty() { m_flags = 0; }
+    void markDirty(DirtyFlags flags);
+    DirtyFlags dirtyFlags() const { return m_flags; }
+
+    virtual bool isSubtreeBlocked() const { return false; }
+
+    Flags flags() const { return m_nodeFlags; }
+    void setFlag(Flag, bool = true);
+    void setFlags(Flags, bool = true);
+
+    virtual void preprocess() { }
+
+#ifdef QML_RUNTIME_TESTING
+    QString description;
+#endif
+
+protected:
+    // When a node is destroyed, it will detach from the scene graph and the renderer will be
+    // notified about the change. If the node is detached in the base node's destructor, the
+    // renderer can't check what type the node originally was because the node's type() method is
+    // virtual and will return the base node type. The renderer might therefore react incorrectly
+    // to the change. There are a few of ways I can think of to solve the problem:
+    // - The renderer must take into account that the notify method might be called from a node's
+    //   destructor.
+    // - The node can have a type property that is set in the constructor.
+    // - All the node destructors must call a common destroy method.
+    // I choose the third option since that will allow the renderer to treat the nodes as their
+    // proper types.
+
+    void destroy();
+
+private:
+    QSGNode *m_parent;
+    QList<QSGNode *> m_children;
+
+    Flags m_nodeFlags;
+    DirtyFlags m_flags;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGNode::DirtyFlags);
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGNode::Flags);
+
+class Q_DECLARATIVE_EXPORT QSGBasicGeometryNode : public QSGNode
+{
+public:
+//    enum  UsagePattern {
+//        Static,
+//        Dynamic,
+//        Stream
+//    };
+//    void setUsagePattern(UsagePattern pattern);
+//    UsagePattern usagePattern() const { return m_pattern; }
+
+    QSGBasicGeometryNode();
+    ~QSGBasicGeometryNode();
+
+    void setGeometry(QSGGeometry *geometry);
+    const QSGGeometry *geometry() const { return m_geometry; }
+    QSGGeometry *geometry() { return m_geometry; }
+
+    const QMatrix4x4 *matrix() const { return m_matrix; }
+    const QSGClipNode *clipList() const { return m_clip_list; }
+
+private:
+    friend class QSGNodeUpdater;
+    QSGGeometry *m_geometry;
+
+    int m_reserved_start_index;
+    int m_reserved_end_index;
+
+    const QMatrix4x4 *m_matrix;
+    const QSGClipNode *m_clip_list;
+
+//    UsagePattern m_pattern;
+};
+
+class QSGMaterial;
+
+class Q_DECLARATIVE_EXPORT QSGGeometryNode : public QSGBasicGeometryNode
+{
+public:
+    QSGGeometryNode();
+    ~QSGGeometryNode();
+
+    void setMaterial(QSGMaterial *material);
+    QSGMaterial *material() const { return m_material; }
+
+    void setOpaqueMaterial(QSGMaterial *material);
+    QSGMaterial *opaqueMaterial() const { return m_opaque_material; }
+
+    QSGMaterial *activeMaterial() const;
+
+    virtual NodeType type() const { return GeometryNodeType; }
+
+    void setRenderOrder(int order);
+    int renderOrder() const { return m_render_order; }
+
+    void setInheritedOpacity(qreal opacity);
+    qreal inheritedOpacity() const { return m_opacity; }
+
+private:
+    friend class QSGNodeUpdater;
+
+    int m_render_order;
+    QSGMaterial *m_material;
+    QSGMaterial *m_opaque_material;
+
+    qreal m_opacity;
+};
+
+class Q_DECLARATIVE_EXPORT QSGClipNode : public QSGBasicGeometryNode
+{
+public:
+    QSGClipNode();
+    ~QSGClipNode();
+
+    virtual NodeType type() const { return ClipNodeType; }
+
+    void setIsRectangular(bool rectHint);
+    bool isRectangular() const { return m_is_rectangular; }
+
+    void setClipRect(const QRectF &);
+    QRectF clipRect() const { return m_clip_rect; }
+
+private:
+    uint m_is_rectangular : 1;
+    uint m_reserved : 31;
+
+    QRectF m_clip_rect;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGTransformNode : public QSGNode
+{
+public:
+    QSGTransformNode();
+    ~QSGTransformNode();
+
+    virtual NodeType type() const { return TransformNodeType; }
+
+    void setMatrix(const QMatrix4x4 &matrix);
+    const QMatrix4x4 &matrix() const { return m_matrix; }
+
+    void setCombinedMatrix(const QMatrix4x4 &matrix);
+    const QMatrix4x4 &combinedMatrix() const { return m_combined_matrix; }
+
+private:
+    QMatrix4x4 m_matrix;
+    QMatrix4x4 m_combined_matrix;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGRootNode : public QSGNode
+{
+public:
+    ~QSGRootNode();
+    NodeType type() const { return RootNodeType; }
+
+private:
+    void notifyNodeChange(QSGNode *node, DirtyFlags flags);
+
+    friend class QSGRenderer;
+    friend class QSGNode;
+    friend class QSGGeometryNode;
+
+    QList<QSGRenderer *> m_renderers;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGOpacityNode : public QSGNode
+{
+public:
+    QSGOpacityNode();
+    ~QSGOpacityNode();
+
+    void setOpacity(qreal opacity);
+    qreal opacity() const { return m_opacity; }
+
+    void setCombinedOpacity(qreal opacity);
+    qreal combinedOpacity() const { return m_combined_opacity; }
+
+    virtual QSGNode::NodeType type() const { return OpacityNodeType; }
+
+    bool isSubtreeBlocked() const;
+
+
+private:
+    qreal m_opacity;
+    qreal m_combined_opacity;
+};
+
+class Q_DECLARATIVE_EXPORT QSGNodeVisitor {
+public:
+    virtual ~QSGNodeVisitor();
+
+protected:
+    virtual void enterTransformNode(QSGTransformNode *) {}
+    virtual void leaveTransformNode(QSGTransformNode *) {}
+    virtual void enterClipNode(QSGClipNode *) {}
+    virtual void leaveClipNode(QSGClipNode *) {}
+    virtual void enterGeometryNode(QSGGeometryNode *) {}
+    virtual void leaveGeometryNode(QSGGeometryNode *) {}
+    virtual void enterOpacityNode(QSGOpacityNode *) {}
+    virtual void leaveOpacityNode(QSGOpacityNode *) {}
+    virtual void visitNode(QSGNode *n);
+    virtual void visitChildren(QSGNode *n);
+};
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_DECLARATIVE_EXPORT QDebug operator<<(QDebug, const QSGNode *n);
+Q_DECLARATIVE_EXPORT QDebug operator<<(QDebug, const QSGGeometryNode *n);
+Q_DECLARATIVE_EXPORT QDebug operator<<(QDebug, const QSGTransformNode *n);
+Q_DECLARATIVE_EXPORT QDebug operator<<(QDebug, const QSGOpacityNode *n);
+Q_DECLARATIVE_EXPORT QDebug operator<<(QDebug, const QSGRootNode *n);
+
+class QSGNodeDumper : public QSGNodeVisitor {
+
+public:
+    static void dump(QSGNode *n);
+
+    QSGNodeDumper() : m_indent(0) {}
+    void visitNode(QSGNode *n);
+    void visitChildren(QSGNode *n);
+
+private:
+    int m_indent;
+};
+
+#endif
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // NODE_H
diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp
new file mode 100644
index 0000000000..d81248be3d
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgnodeupdater_p.h"
+
+QT_BEGIN_NAMESPACE
+
+// #define QSG_UPDATER_DEBUG
+
+QSGNodeUpdater::QSGNodeUpdater()
+    : m_current_clip(0)
+    , m_force_update(0)
+{
+    m_opacity_stack.push(1);
+}
+
+void QSGNodeUpdater::updateStates(QSGNode *n)
+{
+    m_current_clip = 0;
+    m_force_update = 0;
+
+    Q_ASSERT(m_opacity_stack.size() == 1); // The one we added in the constructr...
+    // Q_ASSERT(m_matrix_stack.isEmpty()); ### no such function?
+    Q_ASSERT(m_combined_matrix_stack.isEmpty());
+
+    visitNode(n);
+}
+
+/*!
+    \fn void QSGNodeUpdater::setToplevelOpacity(qreal opacity)
+
+    Sets the toplevel opacity that will be multiplied with the
+
+    The default opacity is 1. Any other value will cause artifacts, and is
+    primarily useful for debug purposes.
+
+    The changing the value during an update pass will have undefined results
+ */
+
+/*!
+    \fn qreal QSGNodeUpdater::toplevelOpacity() const
+
+    Returns the toplevel opacity for the node updater. The default
+    value is 1.
+ */
+
+
+/*!
+    Returns true if \a node is has something that blocks it in the chain from
+    \a node to \a root doing a full state update pass.
+
+    This function does not process dirty states, simply does a simple traversion
+    up to the top.
+
+    The function assumes that \a root exists in the parent chain of \a node.
+ */
+
+bool QSGNodeUpdater::isNodeBlocked(QSGNode *node, QSGNode *root) const
+{
+    qreal opacity = 1;
+    while (node != root) {
+        if (node->type() == QSGNode::OpacityNodeType) {
+            opacity *= static_cast<QSGOpacityNode *>(node)->opacity();
+            if (opacity < 0.001)
+                return true;
+        }
+        node = node->parent();
+
+        Q_ASSERT_X(node, "QSGNodeUpdater::isNodeBlocked", "node is not in the subtree of root");
+    }
+
+    return false;
+}
+
+
+void QSGNodeUpdater::enterTransformNode(QSGTransformNode *t)
+{
+    if (t->dirtyFlags() & QSGNode::DirtyMatrix)
+        ++m_force_update;
+
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "enter transform:" << t << "force=" << m_force_update;
+#endif
+
+    if (!t->matrix().isIdentity()) {
+        m_combined_matrix_stack.push(&t->combinedMatrix());
+
+        m_matrix_stack.push();
+        m_matrix_stack *= t->matrix();
+    }
+
+    t->setCombinedMatrix(m_matrix_stack.top());
+}
+
+
+void QSGNodeUpdater::leaveTransformNode(QSGTransformNode *t)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "leave transform:" << t;
+#endif
+
+    if (t->dirtyFlags() & QSGNode::DirtyMatrix)
+        --m_force_update;
+
+    if (!t->matrix().isIdentity()) {
+        m_matrix_stack.pop();
+        m_combined_matrix_stack.pop();
+    }
+
+}
+
+
+void QSGNodeUpdater::enterClipNode(QSGClipNode *c)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "enter clip:" << c;
+#endif
+
+    if (c->dirtyFlags() & QSGNode::DirtyClipList) {
+        ++m_force_update;
+    }
+
+    c->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.top();
+    c->m_clip_list = m_current_clip;
+    m_current_clip = c;
+}
+
+
+void QSGNodeUpdater::leaveClipNode(QSGClipNode *c)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "leave clip:" << c;
+#endif
+
+    if (c->dirtyFlags() & QSGNode::DirtyClipList) {
+        --m_force_update;
+    }
+
+    m_current_clip = c->m_clip_list;
+}
+
+
+void QSGNodeUpdater::enterGeometryNode(QSGGeometryNode *g)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "enter geometry:" << g;
+#endif
+
+    g->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.top();
+    g->m_clip_list = m_current_clip;
+    g->setInheritedOpacity(m_opacity_stack.top());
+}
+
+void QSGNodeUpdater::enterOpacityNode(QSGOpacityNode *o)
+{
+    if (o->dirtyFlags() & QSGNode::DirtyOpacity)
+        ++m_force_update;
+
+    qreal opacity = m_opacity_stack.top() * o->opacity();
+    o->setCombinedOpacity(opacity);
+    m_opacity_stack.push(opacity);
+
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "enter opacity" << o;
+#endif
+}
+
+void QSGNodeUpdater::leaveOpacityNode(QSGOpacityNode *o)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "leave opacity" << o;
+#endif
+    if (o->flags() & QSGNode::DirtyOpacity)
+        --m_force_update;
+
+    m_opacity_stack.pop();
+}
+
+void QSGNodeUpdater::visitChildren(QSGNode *n)
+{
+    if (!n->isSubtreeBlocked())
+        QSGNodeVisitor::visitChildren(n);
+}
+
+void QSGNodeUpdater::visitNode(QSGNode *n)
+{
+#ifdef QSG_UPDATER_DEBUG
+    qDebug() << "enter:" << n;
+#endif
+
+    if (n->dirtyFlags() || m_force_update) {
+        bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded);
+        if (forceUpdate)
+            ++m_force_update;
+
+        QSGNodeVisitor::visitNode(n);
+
+        if (forceUpdate)
+            --m_force_update;
+
+        n->clearDirty();
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h
new file mode 100644
index 0000000000..518cf9eff9
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef NODEUPDATER_P_H
+#define NODEUPDATER_P_H
+
+#include "qsgnode.h"
+#include "qsgmatrix4x4stack.h"
+#include <qstack.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_DECLARATIVE_EXPORT QSGNodeUpdater : public QSGNodeVisitor
+{
+public:
+    QSGNodeUpdater();
+
+    virtual void updateStates(QSGNode *n);
+    virtual bool isNodeBlocked(QSGNode *n, QSGNode *root) const;
+
+    void setToplevelOpacity(qreal alpha) { m_opacity_stack.top() = alpha; }
+    qreal toplevelOpacity() const { return m_opacity_stack.top(); }
+
+protected:
+    void enterTransformNode(QSGTransformNode *);
+    void leaveTransformNode(QSGTransformNode *);
+    void enterClipNode(QSGClipNode *c);
+    void leaveClipNode(QSGClipNode *c);
+    void enterOpacityNode(QSGOpacityNode *o);
+    void leaveOpacityNode(QSGOpacityNode *o);
+    void enterGeometryNode(QSGGeometryNode *);
+
+    void visitNode(QSGNode *n);
+    void visitChildren(QSGNode *n);
+
+
+    QSGMatrix4x4Stack m_matrix_stack;
+    QStack<const QMatrix4x4 *> m_combined_matrix_stack;
+    QStack<qreal> m_opacity_stack;
+    const QSGClipNode *m_current_clip;
+
+    int m_force_update;
+
+    qreal m_toplevel_alpha;
+};
+
+QT_END_NAMESPACE
+
+#endif // NODEUPDATER_P_H
diff --git a/src/declarative/scenegraph/coreapi/qsgrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp
new file mode 100644
index 0000000000..eb7b830ade
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp
@@ -0,0 +1,545 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgrenderer_p.h"
+#include "qsgnode.h"
+#include "qsgmaterial.h"
+#include "qsgnodeupdater_p.h"
+
+#include "private/qsgadaptationlayer_p.h"
+
+#include <QGLShaderProgram>
+#include <qglframebufferobject.h>
+#include <QtGui/qapplication.h>
+
+#include <qdatetime.h>
+
+QT_BEGIN_NAMESPACE
+
+//#define RENDERER_DEBUG
+//#define QT_GL_NO_SCISSOR_TEST
+
+// #define QSG_RENDERER_TIMING
+#ifdef QSG_RENDERER_TIMING
+static QTime frameTimer;
+static int preprocessTime;
+static int updatePassTime;
+static int frameNumber = 0;
+#endif
+
+void Bindable::clear(QSGRenderer::ClearMode mode) const
+{
+    GLuint bits = 0;
+    if (mode & QSGRenderer::ClearColorBuffer) bits |= GL_COLOR_BUFFER_BIT;
+    if (mode & QSGRenderer::ClearDepthBuffer) bits |= GL_DEPTH_BUFFER_BIT;
+    if (mode & QSGRenderer::ClearStencilBuffer) bits |= GL_STENCIL_BUFFER_BIT;
+    glClear(bits);
+}
+
+// Reactivate the color buffer after switching to the stencil.
+void Bindable::reactivate() const
+{
+    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+}
+
+BindableFbo::BindableFbo(QGLFramebufferObject *fbo) : m_fbo(fbo)
+{
+}
+
+
+void BindableFbo::bind() const
+{
+    m_fbo->bind();
+}
+
+/*!
+    \class QSGRenderer
+    \brief The renderer class is the abstract baseclass use for rendering the
+    QML scene graph.
+
+    The renderer is not tied to any particular surface. It expects a context to
+    be current and will render into that surface according to how the device rect,
+    viewport rect and projection transformation are set up.
+
+    Rendering is a sequence of steps initiated by calling renderScene(). This will
+    effectively draw the scene graph starting at the root node. The QSGNode::preprocess()
+    function will be called for all the nodes in the graph, followed by an update
+    pass which updates all matrices, opacity, clip states and similar in the graph.
+    Because the update pass is called after preprocess, it is safe to modify the graph
+    during preprocess. To run a custom update pass over the graph, install a custom
+    QSGNodeUpdater using setNodeUpdater(). Once all the graphs dirty states are updated,
+    the virtual render() function is called.
+
+    The render() function is implemented by QSGRenderer subclasses to render the graph
+    in the most optimal way for a given hardware.
+
+    The renderer can make use of stencil, depth and color buffers in addition to the
+    scissor rect.
+
+    \internal
+ */
+
+
+QSGRenderer::QSGRenderer(QSGContext *context)
+    : QObject()
+    , m_clear_color(Qt::transparent)
+    , m_clear_mode(ClearColorBuffer | ClearDepthBuffer)
+    , m_render_opacity(1)
+    , m_context(context)
+    , m_root_node(0)
+    , m_node_updater(0)
+    , m_changed_emitted(false)
+    , m_mirrored(false)
+    , m_is_rendering(false)
+    , m_bindable(0)
+{
+    initializeGLFunctions();
+}
+
+
+QSGRenderer::~QSGRenderer()
+{
+    setRootNode(0);
+    delete m_node_updater;
+}
+
+/*!
+    Returns the scene graph context for this renderer.
+
+    \internal
+ */
+
+QSGContext *QSGRenderer::context()
+{
+    return m_context;
+}
+
+
+
+
+/*!
+    Returns the node updater that this renderer uses to update states in the
+    scene graph.
+
+    If no updater is specified a default one is constructed.
+ */
+
+QSGNodeUpdater *QSGRenderer::nodeUpdater() const
+{
+    if (!m_node_updater)
+        const_cast<QSGRenderer *>(this)->m_node_updater = new QSGNodeUpdater();
+    return m_node_updater;
+}
+
+
+/*!
+    Sets the node updater that this renderer uses to update states in the
+    scene graph.
+
+    This will delete and override any existing node updater
+  */
+void QSGRenderer::setNodeUpdater(QSGNodeUpdater *updater)
+{
+    if (m_node_updater)
+        delete m_node_updater;
+    m_node_updater = updater;
+}
+
+
+void QSGRenderer::setRootNode(QSGRootNode *node)
+{
+    if (m_root_node == node)
+        return;
+    if (m_root_node) {
+        m_root_node->m_renderers.removeOne(this);
+        nodeChanged(m_root_node, QSGNode::DirtyNodeRemoved);
+    }
+    m_root_node = node;
+    if (m_root_node) {
+        Q_ASSERT(!m_root_node->m_renderers.contains(this));
+        m_root_node->m_renderers << this;
+        nodeChanged(m_root_node, QSGNode::DirtyNodeAdded);
+    }
+}
+
+
+void QSGRenderer::renderScene()
+{
+    class B : public Bindable
+    {
+    public:
+        B() : m_ctx(const_cast<QGLContext *>(QGLContext::currentContext())) { }
+        void bind() const { QGLFramebufferObject::bindDefault(); }
+    private:
+        QGLContext *m_ctx;
+    } b;
+    renderScene(b);
+}
+
+void QSGRenderer::renderScene(const Bindable &bindable)
+{
+    if (!m_root_node)
+        return;
+
+    m_is_rendering = true;
+#ifdef QSG_RENDERER_TIMING
+    frameTimer.start();
+#endif
+
+    m_bindable = &bindable;
+    preprocess();
+
+    bindable.bind();
+#ifdef QSG_RENDERER_TIMING
+    int bindTime = frameTimer.elapsed();
+#endif
+
+    render();
+#ifdef QSG_RENDERER_TIMING
+    int renderTime = frameTimer.elapsed();
+#endif
+
+    glDisable(GL_SCISSOR_TEST);
+    m_is_rendering = false;
+    m_changed_emitted = false;
+    m_bindable = 0;
+
+#ifdef QSG_RENDERER_TIMING
+    printf("Frame #%d: Breakdown of frametime: preprocess=%d, updates=%d, binding=%d, render=%d, total=%d\n",
+           ++frameNumber,
+           preprocessTime,
+           updatePassTime - preprocessTime,
+           bindTime - updatePassTime,
+           renderTime - bindTime,
+           renderTime);
+#endif
+}
+
+void QSGRenderer::setProjectMatrixToDeviceRect()
+{
+    setProjectMatrixToRect(m_device_rect);
+}
+
+void QSGRenderer::setProjectMatrixToRect(const QRectF &rect)
+{
+    QMatrix4x4 matrix;
+    matrix.ortho(rect.x(),
+                 rect.x() + rect.width(),
+                 rect.y() + rect.height(),
+                 rect.y(),
+                 qreal(0.01),
+                 -1);
+    setProjectMatrix(matrix);
+}
+
+void QSGRenderer::setProjectMatrix(const QMatrix4x4 &matrix)
+{
+    m_projection_matrix = matrix;
+    // Mirrored relative to the usual Qt coordinate system with origin in the top left corner.
+    m_mirrored = matrix(0, 0) * matrix(1, 1) - matrix(0, 1) * matrix(1, 0) > 0;
+}
+
+void QSGRenderer::setClearColor(const QColor &color)
+{
+    m_clear_color = color;
+}
+
+void QSGRenderer::nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags)
+{
+    Q_UNUSED(node);
+    Q_UNUSED(flags);
+
+    if (flags & QSGNode::DirtyNodeAdded)
+        addNodesToPreprocess(node);
+    if (flags & QSGNode::DirtyNodeRemoved)
+        removeNodesToPreprocess(node);
+
+    if (!m_changed_emitted && !m_is_rendering) {
+        // Premature overoptimization to avoid excessive signal emissions
+        m_changed_emitted = true;
+        emit sceneGraphChanged();
+    }
+}
+
+void QSGRenderer::materialChanged(QSGGeometryNode *, QSGMaterial *, QSGMaterial *)
+{
+}
+
+void QSGRenderer::preprocess()
+{
+    Q_ASSERT(m_root_node);
+
+    // We need to take a copy here, in case any of the preprocess calls deletes a node that
+    // is in the preprocess list and thus, changes the m_nodes_to_preprocess behind our backs
+    // For the default case, when this does not happen, the cost is neglishible.
+    QSet<QSGNode *> items = m_nodes_to_preprocess;
+
+    for (QSet<QSGNode *>::const_iterator it = items.constBegin();
+         it != items.constEnd(); ++it) {
+        QSGNode *n = *it;
+        if (!nodeUpdater()->isNodeBlocked(n, m_root_node)) {
+            n->preprocess();
+        }
+    }
+
+#ifdef QSG_RENDERER_TIMING
+    preprocessTime = frameTimer.elapsed();
+#endif
+
+    nodeUpdater()->setToplevelOpacity(context()->renderAlpha());
+    nodeUpdater()->updateStates(m_root_node);
+
+#ifdef QSG_RENDERER_TIMING
+    updatePassTime = frameTimer.elapsed();
+#endif
+
+}
+
+void QSGRenderer::addNodesToPreprocess(QSGNode *node)
+{
+    for (int i = 0; i < node->childCount(); ++i)
+        addNodesToPreprocess(node->childAtIndex(i));
+    if (node->flags() & QSGNode::UsePreprocess)
+        m_nodes_to_preprocess.insert(node);
+}
+
+void QSGRenderer::removeNodesToPreprocess(QSGNode *node)
+{
+    for (int i = 0; i < node->childCount(); ++i)
+        removeNodesToPreprocess(node->childAtIndex(i));
+    if (node->flags() & QSGNode::UsePreprocess)
+        m_nodes_to_preprocess.remove(node);
+}
+
+
+/*!
+    Convenience function to set up the stencil buffer for clipping based on \a clip.
+
+    If the clip is a pixel aligned rectangle, this function will use glScissor instead
+    of stencil.
+ */
+
+QSGRenderer::ClipType QSGRenderer::updateStencilClip(const QSGClipNode *clip)
+{
+    if (!clip) {
+        glDisable(GL_STENCIL_TEST);
+        glDisable(GL_SCISSOR_TEST);
+        return NoClip;
+    }
+
+    bool stencilEnabled = false;
+    bool scissorEnabled = false;
+
+    glDisable(GL_SCISSOR_TEST);
+
+    int clipDepth = 0;
+    QRect clipRect;
+    while (clip) {
+        QMatrix4x4 matrix = m_projectionMatrix.top();
+        if (clip->matrix())
+            matrix *= *clip->matrix();
+
+        const QMatrix4x4 &m = matrix;
+
+        // TODO: Check for multisampling and pixel grid alignment.
+        bool canUseScissor = clip->isRectangular()
+                           && qFuzzyIsNull(m(0, 1)) && qFuzzyIsNull(m(0, 2))
+                           && qFuzzyIsNull(m(1, 0)) && qFuzzyIsNull(m(1, 2));
+
+        if (canUseScissor) {
+            QRectF bbox = clip->clipRect();
+            qreal invW = 1 / m(3, 3);
+            qreal fx1 = (bbox.left() * m(0, 0) + m(0, 3)) * invW;
+            qreal fy1 = (bbox.bottom() * m(1, 1) + m(1, 3)) * invW;
+            qreal fx2 = (bbox.right() * m(0, 0) + m(0, 3)) * invW;
+            qreal fy2 = (bbox.top() * m(1, 1) + m(1, 3)) * invW;
+
+            GLint ix1 = qRound((fx1 + 1) * m_device_rect.width() * qreal(0.5));
+            GLint iy1 = qRound((fy1 + 1) * m_device_rect.height() * qreal(0.5));
+            GLint ix2 = qRound((fx2 + 1) * m_device_rect.width() * qreal(0.5));
+            GLint iy2 = qRound((fy2 + 1) * m_device_rect.height() * qreal(0.5));
+
+            if (!scissorEnabled) {
+                clipRect = QRect(ix1, iy1, ix2 - ix1, iy2 - iy1);
+                glEnable(GL_SCISSOR_TEST);
+                scissorEnabled = true;
+            } else {
+                clipRect &= QRect(ix1, iy1, ix2 - ix1, iy2 - iy1);
+            }
+
+            clipRect = clipRect.normalized();
+            glScissor(clipRect.x(), clipRect.y(), clipRect.width(), clipRect.height());
+        } else {
+            if (!stencilEnabled) {
+                if (!m_clip_program.isLinked()) {
+                    m_clip_program.addShaderFromSourceCode(QGLShader::Vertex,
+                        "attribute highp vec4 vCoord;       \n"
+                        "uniform highp mat4 matrix;         \n"
+                        "void main() {                      \n"
+                        "    gl_Position = matrix * vCoord; \n"
+                        "}");
+                    m_clip_program.addShaderFromSourceCode(QGLShader::Fragment,
+                        "void main() {                                   \n"
+                        "    gl_FragColor = vec4(0.81, 0.83, 0.12, 1.0); \n" // Trolltech green ftw!
+                        "}");
+                    m_clip_program.bindAttributeLocation("vCoord", 0);
+                    m_clip_program.link();
+                    m_clip_matrix_id = m_clip_program.uniformLocation("matrix");
+                }
+
+                glStencilMask(0xff); // write mask
+                glClearStencil(0);
+                glClear(GL_STENCIL_BUFFER_BIT);
+                glEnable(GL_STENCIL_TEST);
+                glDisable(GL_DEPTH_TEST);
+                glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+                glDepthMask(GL_FALSE);
+
+                m_clip_program.bind();
+                m_clip_program.enableAttributeArray(0);
+
+                stencilEnabled = true;
+            }
+
+            glStencilFunc(GL_EQUAL, clipDepth, 0xff); // stencil test, ref, test mask
+            glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); // stencil fail, z fail, z pass
+
+            const QSGGeometry *geometry = clip->geometry();
+            Q_ASSERT(geometry->attributeCount() > 0);
+            const QSGGeometry::Attribute *a = geometry->attributes();
+
+            glVertexAttribPointer(0, a->tupleSize, a->type, GL_FALSE, geometry->stride(), geometry->vertexData());
+
+            m_clip_program.setUniformValue(m_clip_matrix_id, m);
+            draw(clip);
+
+            ++clipDepth;
+        }
+
+        clip = clip->clipList();
+    }
+
+    if (stencilEnabled) {
+        m_clip_program.disableAttributeArray(0);
+        glEnable(GL_DEPTH_TEST);
+        glStencilFunc(GL_EQUAL, clipDepth, 0xff); // stencil test, ref, test mask
+        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // stencil fail, z fail, z pass
+        glStencilMask(0); // write mask
+        bindable()->reactivate();
+        //glDepthMask(GL_TRUE); // must be reset correctly by caller.
+    } else {
+        glDisable(GL_STENCIL_TEST);
+    }
+
+    if (!scissorEnabled)
+        glDisable(GL_SCISSOR_TEST);
+
+    return stencilEnabled ? StencilClip : ScissorClip;
+}
+
+
+/*!
+    Issues the GL draw call for \a geometryNode.
+
+    The function assumes that attributes have been bound and set up prior
+    to making this call.
+
+    \internal
+ */
+
+void QSGRenderer::draw(const QSGBasicGeometryNode *node)
+{
+    const QSGGeometry *g = node->geometry();
+    if (g->indexCount()) {
+        glDrawElements(g->drawingMode(), g->indexCount(), g->indexType(), g->indexData());
+    } else {
+        glDrawArrays(g->drawingMode(), 0, g->vertexCount());
+    }
+}
+
+
+static inline int size_of_type(GLenum type)
+{
+    static int sizes[] = {
+        sizeof(char),
+        sizeof(unsigned char),
+        sizeof(short),
+        sizeof(unsigned short),
+        sizeof(int),
+        sizeof(unsigned int),
+        sizeof(float),
+        2,
+        3,
+        4,
+        sizeof(double)
+    };
+    return sizes[type - GL_BYTE];
+}
+
+/*!
+    Convenience function to set up and bind the vertex data in \a g to the
+    required attribute positions defined in \a material.
+
+    \internal
+ */
+
+void QSGRenderer::bindGeometry(QSGMaterialShader *material, const QSGGeometry *g)
+{
+    char const *const *attrNames = material->attributeNames();
+    int offset = 0;
+    for (int j = 0; attrNames[j]; ++j) {
+        if (!*attrNames[j])
+            continue;
+        Q_ASSERT_X(j < g->attributeCount(), "QSGRenderer::bindGeometry()", "Geometry lacks attribute required by material");
+        const QSGGeometry::Attribute &a = g->attributes()[j];
+        Q_ASSERT_X(j == a.position, "QSGRenderer::bindGeometry()", "Geometry does not have continuous attribute positions");
+#if defined(QT_OPENGL_ES_2)
+        GLboolean normalize = a.type != GL_FLOAT;
+#else
+        GLboolean normalize = a.type != GL_FLOAT && a.type != GL_DOUBLE;
+#endif
+        glVertexAttribPointer(a.position, a.tupleSize, a.type, normalize, g->stride(), (char *) g->vertexData() + offset);
+        offset += a.tupleSize * size_of_type(a.type);
+    }
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/coreapi/qsgrenderer_p.h b/src/declarative/scenegraph/coreapi/qsgrenderer_p.h
new file mode 100644
index 0000000000..fcf966d819
--- /dev/null
+++ b/src/declarative/scenegraph/coreapi/qsgrenderer_p.h
@@ -0,0 +1,219 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include <qset.h>
+#include <qhash.h>
+
+#include "qsgmatrix4x4stack.h"
+
+#include <qglfunctions.h>
+#include <qglshaderprogram.h>
+
+#include "qsgnode.h"
+#include "qsgmaterial.h"
+#include "qsgtexture.h"
+
+#include <private/qsgcontext_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGMaterialShader;
+struct QSGMaterialType;
+class QGLFramebufferObject;
+class TextureReference;
+class Bindable;
+class QSGNodeUpdater;
+
+
+class Q_DECLARATIVE_EXPORT QSGRenderer : public QObject, public QGLFunctions
+{
+    Q_OBJECT
+public:
+    enum ClipType
+    {
+        NoClip,
+        ScissorClip,
+        StencilClip
+    };
+
+    enum ClearModeBit
+    {
+        ClearColorBuffer    = 0x0001,
+        ClearDepthBuffer    = 0x0002,
+        ClearStencilBuffer  = 0x0004
+    };
+    Q_DECLARE_FLAGS(ClearMode, ClearModeBit)
+
+    QSGRenderer(QSGContext *context);
+    virtual ~QSGRenderer();
+
+    void setRootNode(QSGRootNode *node);
+    QSGRootNode *rootNode() const { return m_root_node; }
+
+    void setDeviceRect(const QRect &rect) { m_device_rect = rect; }
+    inline void setDeviceRect(const QSize &size) { setDeviceRect(QRect(QPoint(), size)); }
+    QRect deviceRect() const { return m_device_rect; }
+
+    void setViewportRect(const QRect &rect) { m_viewport_rect = rect; }
+    inline void setViewportRect(const QSize &size) { setViewportRect(QRect(QPoint(), size)); }
+    QRect viewportRect() const { return m_viewport_rect; }
+
+    QSGMatrix4x4Stack &projectionMatrix() { return m_projectionMatrix; }
+    QSGMatrix4x4Stack &modelViewMatrix() { return m_modelViewMatrix; }
+    QMatrix4x4 combinedMatrix() const { return m_projectionMatrix.top() * m_modelViewMatrix.top(); }
+
+    void setProjectMatrixToDeviceRect();
+    void setProjectMatrixToRect(const QRectF &rect);
+    void setProjectMatrix(const QMatrix4x4 &matrix);
+    QMatrix4x4 projectMatrix() const { return m_projection_matrix; }
+    bool isMirrored() const { return m_mirrored; }
+
+    qreal renderOpacity() const { return m_render_opacity; }
+
+    void setClearColor(const QColor &color);
+    QColor clearColor() const { return m_clear_color; }
+
+    const QGLContext *glContext() const { Q_ASSERT(m_context); return m_context->glContext(); }
+
+    QSGContext *context();
+
+    void renderScene();
+    void renderScene(const Bindable &bindable);
+    virtual void nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags);
+    virtual void materialChanged(QSGGeometryNode *node, QSGMaterial *from, QSGMaterial *to);
+
+    QSGNodeUpdater *nodeUpdater() const;
+    void setNodeUpdater(QSGNodeUpdater *updater);
+
+    inline QSGMaterialShader::RenderState state(QSGMaterialShader::RenderState::DirtyStates dirty) const;
+
+    void setClearMode(ClearMode mode) { m_clear_mode = mode; }
+    ClearMode clearMode() const { return m_clear_mode; }
+
+signals:
+    void sceneGraphChanged(); // Add, remove, ChangeFlags changes...
+
+protected:
+    void draw(const QSGBasicGeometryNode *geometry);
+    void bindGeometry(QSGMaterialShader *material, const QSGGeometry *g);
+
+    virtual void render() = 0;
+    QSGRenderer::ClipType updateStencilClip(const QSGClipNode *clip);
+
+    const Bindable *bindable() const { return m_bindable; }
+
+    virtual void preprocess();
+
+    void addNodesToPreprocess(QSGNode *node);
+    void removeNodesToPreprocess(QSGNode *node);
+
+
+    QColor m_clear_color;
+    ClearMode m_clear_mode;
+    QSGMatrix4x4Stack m_projectionMatrix;
+    QSGMatrix4x4Stack m_modelViewMatrix;
+    qreal m_render_opacity;
+
+    QSGContext *m_context;
+
+private:
+    QSGRootNode *m_root_node;
+    QSGNodeUpdater *m_node_updater;
+
+    QRect m_device_rect;
+    QRect m_viewport_rect;
+
+    QSet<QSGNode *> m_nodes_to_preprocess;
+
+    QMatrix4x4 m_projection_matrix;
+    QGLShaderProgram m_clip_program;
+    int m_clip_matrix_id;
+
+    bool m_changed_emitted;
+    bool m_mirrored;
+    bool m_is_rendering;
+
+    const Bindable *m_bindable;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QSGRenderer::ClearMode)
+
+class Q_DECLARATIVE_EXPORT Bindable
+{
+public:
+    virtual ~Bindable() { }
+    virtual void bind() const = 0;
+    virtual void clear(QSGRenderer::ClearMode mode) const;
+    virtual void reactivate() const;
+};
+
+class BindableFbo : public Bindable
+{
+public:
+    BindableFbo(QGLFramebufferObject *fbo);
+    virtual void bind() const;
+private:
+    QGLFramebufferObject *m_fbo;
+};
+
+
+
+QSGMaterialShader::RenderState QSGRenderer::state(QSGMaterialShader::RenderState::DirtyStates dirty) const
+{
+    QSGMaterialShader::RenderState s;
+    s.m_dirty = dirty;
+    s.m_data = this;
+    return s;
+}
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // RENDERER_H
diff --git a/src/declarative/scenegraph/qsgadaptationlayer.cpp b/src/declarative/scenegraph/qsgadaptationlayer.cpp
new file mode 100644
index 0000000000..81fac6a1a8
--- /dev/null
+++ b/src/declarative/scenegraph/qsgadaptationlayer.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgadaptationlayer_p.h"
diff --git a/src/declarative/scenegraph/qsgadaptationlayer_p.h b/src/declarative/scenegraph/qsgadaptationlayer_p.h
new file mode 100644
index 0000000000..1e7c794ea9
--- /dev/null
+++ b/src/declarative/scenegraph/qsgadaptationlayer_p.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ADAPTATIONINTERFACES_H
+#define ADAPTATIONINTERFACES_H
+
+#include "qsgnode.h"
+#include "qsgtexture.h"
+
+#include <QtCore/qobject.h>
+#include <QtCore/qrect.h>
+#include <QtGui/qcolor.h>
+#include <QtCore/qsharedpointer.h>
+#include <QtGui/qglyphs.h>
+#include <QtCore/qurl.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGNode;
+class QImage;
+class TextureReference;
+
+// TODO: Rename from XInterface to AbstractX.
+class Q_DECLARATIVE_EXPORT QSGRectangleNode : public QSGGeometryNode
+{
+public:
+    virtual void setRect(const QRectF &rect) = 0;
+    virtual void setColor(const QColor &color) = 0;
+    virtual void setPenColor(const QColor &color) = 0;
+    virtual void setPenWidth(qreal width) = 0;
+    virtual void setGradientStops(const QGradientStops &stops) = 0;
+    virtual void setRadius(qreal radius) = 0;
+
+    virtual void update() = 0;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGImageNode : public QSGGeometryNode
+{
+public:
+    virtual void setTargetRect(const QRectF &rect) = 0;
+    virtual void setSourceRect(const QRectF &rect) = 0;
+    virtual void setTexture(QSGTexture *texture) = 0;
+
+    virtual void setMipmapFiltering(QSGTexture::Filtering filtering) = 0;
+    virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
+    virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
+    virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
+
+    virtual void update() = 0;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGGlyphNode : public QSGGeometryNode
+{
+public:
+    enum AntialiasingMode
+    {
+        GrayAntialiasing,
+        SubPixelAntialiasing
+    };
+
+    virtual void setGlyphs(const QPointF &position, const QGlyphs &glyphs) = 0;
+    virtual void setColor(const QColor &color) = 0;
+    virtual QPointF baseLine() const = 0;
+
+    virtual QRectF boundingRect() const { return m_bounding_rect; }
+    virtual void setBoundingRect(const QRectF &bounds) { m_bounding_rect = bounds; }
+
+    virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
+
+protected:
+    QRectF m_bounding_rect;
+};
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/qsgcontext.cpp b/src/declarative/scenegraph/qsgcontext.cpp
new file mode 100644
index 0000000000..2a43d03028
--- /dev/null
+++ b/src/declarative/scenegraph/qsgcontext.cpp
@@ -0,0 +1,428 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgrenderer_p.h>
+#include "qsgnode.h"
+
+#include <private/qsgdefaultrenderer_p.h>
+
+#include <private/qsgdefaultrectanglenode_p.h>
+#include <private/qsgdefaultimagenode_p.h>
+#include <private/qsgdefaultglyphnode_p.h>
+#include <private/qsgdistancefieldglyphnode_p.h>
+#include <private/qsgdistancefieldglyphcache_p.h>
+
+#include <private/qsgtexture_p.h>
+#include <qsgengine.h>
+
+#include <QApplication>
+#include <QGLContext>
+
+#include <private/qobject_p.h>
+#include <qmutex.h>
+
+DEFINE_BOOL_CONFIG_OPTION(qmlFlashMode, QML_FLASH_MODE)
+DEFINE_BOOL_CONFIG_OPTION(qmlTranslucentMode, QML_TRANSLUCENT_MODE)
+
+/*!
+    Comments about this class from Gunnar:
+
+    The QSGContext class is right now two things.. The first is the
+    adaptation layer and central storage ground for all the things
+    in the scene graph, like textures and materials. This part really
+    belongs inside the scene graph coreapi.
+
+    The other part is the QML adaptation classes, like how to implement
+    rectangle nodes. This is not part of the scene graph core API, but
+    more part of the QML adaptation of scene graph.
+
+    If we ever move the scene graph core API into its own thing, this class
+    needs to be split in two. Right now its one because we're lazy when it comes
+    to defining plugin interfaces..
+
+ */
+
+
+QT_BEGIN_NAMESPACE
+
+class QSGContextPrivate : public QObjectPrivate
+{
+public:
+    QSGContextPrivate()
+        : rootNode(0)
+        , renderer(0)
+        , gl(0)
+        , flashMode(qmlFlashMode())
+    {
+        renderAlpha = qmlTranslucentMode() ? 0.5 : 1;
+    }
+
+    ~QSGContextPrivate() 
+    {
+    }
+
+    QSGRootNode *rootNode;
+    QSGRenderer *renderer;
+
+    QGLContext *gl;
+
+    QSGEngine engine;
+
+    QHash<QSGMaterialType *, QSGMaterialShader *> materials;
+
+    QMutex textureMutex;
+    QList<QSGTexture *> texturesToClean;
+
+    bool flashMode;
+    float renderAlpha;
+};
+
+
+/*!
+    \class QSGContext
+
+    \brief The QSGContext holds the scene graph entry points for one QML engine.
+
+    The context is not ready for use until it has a QGLContext. Once that happens,
+    the scene graph population can start.
+
+    \internal
+ */
+
+QSGContext::QSGContext(QObject *parent) :
+    QObject(*(new QSGContextPrivate), parent)
+{
+    Q_D(QSGContext);
+    d->engine.setContext(this);
+}
+
+
+QSGContext::~QSGContext()
+{
+    Q_D(QSGContext);
+    delete d->renderer;
+    delete d->rootNode;
+    cleanupTextures();
+    qDeleteAll(d->materials.values());
+}
+
+/*!
+    Returns the scene graph engine for this context.
+
+    The main purpose of the QSGEngine is to serve as a public API
+    to the QSGContext.
+
+ */
+QSGEngine *QSGContext::engine() const
+{
+    return const_cast<QSGEngine *>(&d_func()->engine);
+}
+
+/*!
+    Schedules the texture to be cleaned up on the rendering thread
+    at a later time.
+
+    The texture can be considered as deleted after this function has
+    been called.
+  */
+void QSGContext::schdelueTextureForCleanup(QSGTexture *texture)
+{
+    Q_D(QSGContext);
+    d->textureMutex.lock();
+    Q_ASSERT(!d->texturesToClean.contains(texture));
+    d->texturesToClean << texture;
+    d->textureMutex.unlock();
+}
+
+
+
+/*!
+    Deletes all textures that have been scheduled for cleanup
+ */
+void QSGContext::cleanupTextures()
+{
+    Q_D(QSGContext);
+    d->textureMutex.lock();
+    qDeleteAll(d->texturesToClean);
+    d->texturesToClean.clear();
+    d->textureMutex.unlock();
+}
+
+/*!
+    Returns the renderer. The renderer instance is created through the adaptation layer.
+ */
+QSGRenderer *QSGContext::renderer() const
+{
+    Q_D(const QSGContext);
+    return d->renderer;
+}
+
+
+/*!
+    Returns the root node. The root node instance is only created once the scene graph
+    context becomes ready.
+ */
+QSGRootNode *QSGContext::rootNode() const
+{
+    Q_D(const QSGContext);
+    return d->rootNode;
+}
+
+
+QGLContext *QSGContext::glContext() const
+{
+    Q_D(const QSGContext);
+    return d->gl;
+}
+
+/*!
+    Initializes the scene graph context with the GL context \a context. This also
+    emits the ready() signal so that the QML graph can start building scene graph nodes.
+ */
+void QSGContext::initialize(QGLContext *context)
+{
+    Q_D(QSGContext);
+
+    Q_ASSERT(!d->gl);
+
+    d->gl = context;
+
+    d->renderer = createRenderer();
+    d->renderer->setClearColor(Qt::white);
+
+    d->rootNode = new QSGRootNode();
+    d->renderer->setRootNode(d->rootNode);
+
+    emit ready();
+}
+
+
+/*!
+    Returns if the scene graph context is ready or not, meaning that it has a valid
+    GL context.
+ */
+bool QSGContext::isReady() const
+{
+    Q_D(const QSGContext);
+    return d->gl;
+}
+
+
+void QSGContext::renderNextFrame()
+{
+    Q_D(QSGContext);
+
+    emit d->engine.beforeRendering();
+
+    cleanupTextures();
+    d->renderer->renderScene();
+
+    emit d->engine.afterRendering();
+
+}
+
+/*!
+    Factory function for scene graph backends of the Rectangle element.
+ */
+QSGRectangleNode *QSGContext::createRectangleNode()
+{
+    return new QSGDefaultRectangleNode(this);
+}
+
+/*!
+    Factory function for scene graph backends of the Image element.
+ */
+QSGImageNode *QSGContext::createImageNode()
+{
+    return new QSGDefaultImageNode;
+}
+
+/*!
+    Factory function for scene graph backends of the Text elements;
+ */
+QSGGlyphNode *QSGContext::createGlyphNode()
+{
+    if (QSGDistanceFieldGlyphCache::distanceFieldEnabled()) {
+        QSGGlyphNode *node = new QSGDistanceFieldGlyphNode;
+        if (qApp->arguments().contains(QLatin1String("--subpixel-antialiasing")))
+            node->setPreferredAntialiasingMode(QSGGlyphNode::SubPixelAntialiasing);
+        return node;
+    } else {
+        return new QSGDefaultGlyphNode;
+    }
+}
+
+/*!
+    Factory function for the scene graph renderers.
+
+    The renderers are used for the toplevel renderer and once for every
+    QSGShaderEffectSource used in the QML scene.
+ */
+QSGRenderer *QSGContext::createRenderer()
+{
+    QMLRenderer *renderer = new QMLRenderer(this);
+    if (qApp->arguments().contains(QLatin1String("--opaque-front-to-back"))) {
+        printf("QSGContext: Sorting opaque nodes front to back...\n");
+        renderer->setSortFrontToBackEnabled(true);
+    }
+    return renderer;
+}
+
+
+
+/*!
+    Return true if the image provider supports direct decoding of images,
+    straight into textures without going through a QImage first.
+
+    If the implementation returns true from this function, the decodeImageToTexture() function
+    will be called to read data from a QIODevice, rather than QML decoding
+    the image using QImageReader and passing the result to setImage().
+
+    \warning This function will be called from outside the GUI and rendering threads
+    and must not make use of OpenGL.
+ */
+
+bool QSGContext::canDecodeImageToTexture() const
+{
+    return true;
+}
+
+
+
+/*!
+    Decode the data in \a dev directly to a texture provider of \a requestSize size.
+    The size of the decoded data should be written to \a impsize.
+
+    If the implementation fails to decode the image data, it should return 0. The
+    image data will then be decoded normally.
+
+    \warning This function will be called from outside the GUI and renderer threads
+    and must not make use of GL calls.
+ */
+
+QSGTexture *QSGContext::decodeImageToTexture(QIODevice *dev,
+                                             QSize *size,
+                                             const QSize &requestSize)
+{
+    Q_UNUSED(dev);
+    Q_UNUSED(size);
+    Q_UNUSED(requestSize);
+    return 0;
+}
+
+
+/*!
+    Factory function for texture objects.
+
+    If \a image is a valid image, the QSGTexture::setImage function
+    will be called with \a image as argument.
+ */
+QSGTexture *QSGContext::createTexture(const QImage &image) const
+{
+    QSGPlainTexture *t = new QSGPlainTexture();
+    if (!image.isNull())
+        t->setImage(image);
+    return t;
+}
+
+
+/*!
+    Returns a material shader for the given material.
+ */
+QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material)
+{
+    Q_D(QSGContext);
+    QSGMaterialType *type = material->type();
+    QSGMaterialShader *shader = d->materials.value(type);
+    if (shader)
+        return shader;
+
+    shader = material->createShader();
+    d->materials[type] = shader;
+    return shader;
+}
+
+/*!
+    Sets weither the scene graph should render with flashing update rectangles or not
+  */
+void QSGContext::setFlashModeEnabled(bool enabled)
+{
+    d_func()->flashMode = enabled;
+}
+
+
+/*!
+    Returns true if the scene graph should be rendered with flashing update rectangles
+ */
+bool QSGContext::isFlashModeEnabled() const
+{
+    return d_func()->flashMode;
+}
+
+
+/*!
+    Sets the toplevel opacity for rendering. This value will be multiplied into all
+    drawing calls where possible.
+
+    The default value is 1. Any other value will cause artifacts and is primarily
+    useful for debugging.
+ */
+void QSGContext::setRenderAlpha(qreal renderAlpha)
+{
+    d_func()->renderAlpha = renderAlpha;
+}
+
+
+/*!
+    Returns the toplevel opacity used for rendering.
+
+    The default value is 1.
+
+    \sa setRenderAlpha()
+ */
+qreal QSGContext::renderAlpha() const
+{
+    return d_func()->renderAlpha;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgcontext_p.h b/src/declarative/scenegraph/qsgcontext_p.h
new file mode 100644
index 0000000000..848dd17ad0
--- /dev/null
+++ b/src/declarative/scenegraph/qsgcontext_p.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGCONTEXT_H
+#define QSGCONTEXT_H
+
+#include <QObject>
+#include <qabstractanimation.h>
+
+#include "qsgnode.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGContextPrivate;
+class QSGRectangleNode;
+class QSGImageNode;
+class QSGGlyphNode;
+class QSGRenderer;
+
+class QSGTexture;
+class QSGMaterial;
+class QSGMaterialShader;
+class QSGEngine;
+
+class QGLContext;
+
+class Q_DECLARATIVE_EXPORT QSGContext : public QObject
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGContext)
+
+public:
+    explicit QSGContext(QObject *parent = 0);
+    ~QSGContext();
+
+    virtual void initialize(QGLContext *context);
+
+    QSGRenderer *renderer() const;
+
+    void setRootNode(QSGRootNode *node);
+    QSGRootNode *rootNode() const;
+
+    QSGEngine *engine() const;
+    QGLContext *glContext() const;
+
+    bool isReady() const;
+
+    QSGMaterialShader *prepareMaterial(QSGMaterial *material);
+
+    virtual void renderNextFrame();
+
+    virtual QSGRectangleNode *createRectangleNode();
+    virtual QSGImageNode *createImageNode();
+    virtual QSGGlyphNode *createGlyphNode();
+    virtual QSGRenderer *createRenderer();
+
+    virtual bool canDecodeImageToTexture() const;
+    virtual QSGTexture *decodeImageToTexture(QIODevice *dev,
+                                                     QSize *size,
+                                                     const QSize &requestSize);
+    virtual QSGTexture *createTexture(const QImage &image = QImage()) const;
+
+    static QSGContext *createDefaultContext();
+
+    void schdelueTextureForCleanup(QSGTexture *texture);
+    void cleanupTextures();
+
+    void setFlashModeEnabled(bool enabled);
+    bool isFlashModeEnabled() const;
+
+    void setRenderAlpha(qreal renderAlpha);
+    qreal renderAlpha() const;
+
+signals:
+    void ready();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGCONTEXT_H
diff --git a/src/declarative/scenegraph/qsgcontextplugin.cpp b/src/declarative/scenegraph/qsgcontextplugin.cpp
new file mode 100644
index 0000000000..287db68fa3
--- /dev/null
+++ b/src/declarative/scenegraph/qsgcontextplugin.cpp
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgcontextplugin_p.h"
+#include <private/qsgcontext_p.h>
+#include <QtGui/qapplication.h>
+#include <QtCore/private/qfactoryloader_p.h>
+#include <QtCore/qlibraryinfo.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGContextPlugin::QSGContextPlugin(QObject *parent)
+    : QObject(parent)
+{
+}
+
+QSGContextPlugin::~QSGContextPlugin()
+{
+}
+
+#if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
+Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
+    (QSGContextFactoryInterface_iid, QLatin1String("/scenegraph")))
+#endif
+
+/*!
+    \fn QSGContext *QSGContext::createDefaultContext()
+
+    Creates a default scene graph context for the current hardware.
+    This may load a device-specific plugin.
+*/
+QSGContext *QSGContext::createDefaultContext()
+{
+    const QStringList args = QApplication::arguments();
+    QString device;
+    for (int index = 0; index < args.count(); ++index) {
+        if (args.at(index).startsWith(QLatin1String("--device="))) {
+            device = args.at(index).mid(9);
+            break;
+        }
+    }
+    if (device.isEmpty())
+        device = QString::fromLocal8Bit(qgetenv("QMLSCENE_DEVICE"));
+    if (device.isEmpty())
+        return new QSGContext();
+
+#if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
+    if (QSGContextFactoryInterface *factory
+            = qobject_cast<QSGContextFactoryInterface*>
+                (loader()->instance(device))) {
+        QSGContext *context = factory->create(device);
+        if (context)
+            return context;
+    }
+#ifndef QT_NO_DEBUG
+    qWarning("Could not create scene graph context for device '%s'"
+             " - check that plugins are installed correctly in %s",
+             qPrintable(device),
+             qPrintable(QLibraryInfo::location(QLibraryInfo::PluginsPath)));
+#endif
+#endif // QT_NO_LIBRARY || QT_NO_SETTINGS
+
+    return new QSGContext();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgcontextplugin_p.h b/src/declarative/scenegraph/qsgcontextplugin_p.h
new file mode 100644
index 0000000000..e36bc13a9b
--- /dev/null
+++ b/src/declarative/scenegraph/qsgcontextplugin_p.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGCONTEXTPLUGIN_H
+#define QSGCONTEXTPLUGIN_H
+
+#include <QtCore/qplugin.h>
+#include <QtCore/qfactoryinterface.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGContext;
+
+struct Q_DECLARATIVE_EXPORT QSGContextFactoryInterface : public QFactoryInterface
+{
+    virtual QSGContext *create(const QString &key) const = 0;
+};
+
+#define QSGContextFactoryInterface_iid \
+        "com.trolltech.Qt.QSGContextFactoryInterface"
+Q_DECLARE_INTERFACE(QSGContextFactoryInterface, QSGContextFactoryInterface_iid)
+
+class Q_DECLARATIVE_EXPORT QSGContextPlugin : public QObject, public QSGContextFactoryInterface
+{
+    Q_OBJECT
+    Q_INTERFACES(QSGContextFactoryInterface:QFactoryInterface)
+public:
+    explicit QSGContextPlugin(QObject *parent = 0);
+    virtual ~QSGContextPlugin();
+
+    virtual QStringList keys() const = 0;
+    virtual QSGContext *create(const QString &key) const = 0;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGCONTEXTPLUGIN_H
diff --git a/src/declarative/scenegraph/qsgdefaultglyphnode.cpp b/src/declarative/scenegraph/qsgdefaultglyphnode.cpp
new file mode 100644
index 0000000000..57482a9cf4
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultglyphnode.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdefaultglyphnode_p.h"
+#include "qsgdefaultglyphnode_p_p.h"
+
+#include <qglshaderprogram.h>
+#include <private/qfont_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGDefaultGlyphNode::QSGDefaultGlyphNode()
+    : m_material(0)
+    , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
+{
+    m_geometry.setDrawingMode(GL_TRIANGLES);
+    setGeometry(&m_geometry);
+}
+
+QSGDefaultGlyphNode::~QSGDefaultGlyphNode()
+{
+    delete m_material;
+}
+
+void QSGDefaultGlyphNode::setColor(const QColor &color)
+{
+    m_color = color;
+    if (m_material != 0) {
+        m_material->setColor(color);
+        setMaterial(m_material); // Indicate the material state has changed
+    }
+}
+
+void QSGDefaultGlyphNode::setGlyphs(const QPointF &position, const QGlyphs &glyphs)
+{
+    if (m_material != 0)
+        delete m_material;
+
+    QRawFont font = glyphs.font();
+    m_material = new QSGTextMaskMaterial(font);
+    m_material->setColor(m_color);
+
+    QRectF boundingRect;
+    m_material->populate(position, glyphs.glyphIndexes(), glyphs.positions(), geometry(),
+                         &boundingRect, &m_baseLine);
+
+    setMaterial(m_material);
+    setBoundingRect(boundingRect);
+
+    markDirty(DirtyGeometry);
+
+#ifdef QML_RUNTIME_TESTING
+    description = QLatin1String("glyphs");
+#endif
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdefaultglyphnode_p.cpp b/src/declarative/scenegraph/qsgdefaultglyphnode_p.cpp
new file mode 100644
index 0000000000..00090be9ea
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultglyphnode_p.cpp
@@ -0,0 +1,313 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdefaultglyphnode_p_p.h"
+
+#include <qglshaderprogram.h>
+
+#include <private/qtextureglyphcache_gl_p.h>
+#include <private/qfontengine_p.h>
+#include <private/qglextensions_p.h>
+
+#include <private/qsgtexture_p.h>
+
+#include <private/qrawfont_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGTextMaskMaterialData : public QSGMaterialShader
+{
+public:
+    QSGTextMaskMaterialData();
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+private:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    int m_matrix_id;
+    int m_color_id;
+    int m_textureScale_id;
+};
+
+const char *QSGTextMaskMaterialData::vertexShader() const {
+    return
+        "uniform highp mat4 matrix;                     \n"
+        "uniform highp vec2 textureScale;               \n"
+        "attribute highp vec4 vCoord;                   \n"
+        "attribute highp vec2 tCoord;                   \n"
+        "varying highp vec2 sampleCoord;                \n"
+        "void main() {                                  \n"
+        "     sampleCoord = tCoord * textureScale;      \n"
+        "     gl_Position = matrix * vCoord;            \n"
+        "}";
+}
+
+const char *QSGTextMaskMaterialData::fragmentShader() const {
+    return
+        "varying highp vec2 sampleCoord;                \n"
+        "uniform sampler2D texture;                     \n"
+        "uniform lowp vec4 color;                       \n"
+        "void main() {                                  \n"
+        "    gl_FragColor = color * texture2D(texture, sampleCoord).a; \n"
+        "}";
+}
+
+char const *const *QSGTextMaskMaterialData::attributeNames() const
+{
+    static char const *const attr[] = { "vCoord", "tCoord", 0 };
+    return attr;
+}
+
+QSGTextMaskMaterialData::QSGTextMaskMaterialData()
+{
+}
+
+void QSGTextMaskMaterialData::initialize()
+{
+    m_matrix_id = m_program.uniformLocation("matrix");
+    m_color_id = m_program.uniformLocation("color");
+    m_textureScale_id = m_program.uniformLocation("textureScale");
+}
+
+void QSGTextMaskMaterialData::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+    QSGTextMaskMaterial *material = static_cast<QSGTextMaskMaterial *>(newEffect);
+    QSGTextMaskMaterial *oldMaterial = static_cast<QSGTextMaskMaterial *>(oldEffect);
+
+    if (oldMaterial == 0 || material->color() != oldMaterial->color() || state.isOpacityDirty()) {
+        QVector4D color(material->color().redF(), material->color().greenF(),
+                        material->color().blueF(), material->color().alphaF());
+        color *= state.opacity();
+        m_program.setUniformValue(m_color_id, color);
+    }
+
+    bool updated = material->ensureUpToDate();
+    Q_ASSERT(material->texture());
+
+    Q_ASSERT(oldMaterial == 0 || oldMaterial->texture());
+    if (updated
+            || oldMaterial == 0
+            || oldMaterial->texture()->textureId() != material->texture()->textureId()) {
+        m_program.setUniformValue(m_textureScale_id, QVector2D(1.0 / material->cacheTextureWidth(),
+                                                               1.0 / material->cacheTextureHeight()));
+        glBindTexture(GL_TEXTURE_2D, material->texture()->textureId());
+
+        // Set the mag/min filters to be linear. We only need to do this when the texture
+        // has been recreated.
+        if (updated) {
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        }
+    }
+
+    if (state.isMatrixDirty())
+        m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+}
+
+QSGTextMaskMaterial::QSGTextMaskMaterial(const QRawFont &font)
+    : m_texture(0), m_glyphCache(), m_font(font)
+{
+    init();
+}
+
+QSGTextMaskMaterial::~QSGTextMaskMaterial()
+{
+}
+
+void QSGTextMaskMaterial::init()
+{
+    Q_ASSERT(m_font.isValid());
+
+    QFontEngineGlyphCache::Type type = QFontEngineGlyphCache::Raster_A8;
+    setFlag(Blending, true);
+
+    QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
+    Q_ASSERT(ctx != 0);
+
+    QRawFontPrivate *fontD = QRawFontPrivate::get(m_font);
+    if (fontD->fontEngine != 0) {
+        m_glyphCache = fontD->fontEngine->glyphCache(ctx, type, QTransform());
+        if (!m_glyphCache || m_glyphCache->cacheType() != type) {
+            m_glyphCache = new QGLTextureGlyphCache(ctx, type, QTransform());
+            fontD->fontEngine->setGlyphCache(ctx, m_glyphCache.data());
+        }
+    }
+
+#if !defined(QT_OPENGL_ES_2)
+    bool success = qt_resolve_version_2_0_functions(ctx)
+                   && qt_resolve_buffer_extensions(ctx);
+    Q_ASSERT(success);
+    Q_UNUSED(success);
+#endif
+}
+
+void QSGTextMaskMaterial::populate(const QPointF &p,
+                                const QVector<quint32> &glyphIndexes,
+                                const QVector<QPointF> &glyphPositions,
+                                QSGGeometry *geometry,
+                                QRectF *boundingRect,
+                                QPointF *baseLine)
+{
+    Q_ASSERT(m_font.isValid());
+    QVector<QFixedPoint> fixedPointPositions;
+    for (int i=0; i<glyphPositions.size(); ++i)
+        fixedPointPositions.append(QFixedPoint::fromPointF(glyphPositions.at(i)));
+
+    QTextureGlyphCache *cache = glyphCache();
+
+    QRawFontPrivate *fontD = QRawFontPrivate::get(m_font);
+    cache->populate(fontD->fontEngine, glyphIndexes.size(), glyphIndexes.constData(),
+                    fixedPointPositions.data());
+    cache->fillInPendingGlyphs();
+
+    int margin = cache->glyphMargin();
+
+    Q_ASSERT(geometry->indexType() == GL_UNSIGNED_SHORT);
+    geometry->allocate(glyphIndexes.size() * 4, glyphIndexes.size() * 6);
+    QVector4D *vp = (QVector4D *)geometry->vertexDataAsTexturedPoint2D();
+    Q_ASSERT(geometry->stride() == sizeof(QVector4D));
+    ushort *ip = geometry->indexDataAsUShort();
+
+    QPointF position(p.x(), p.y() - m_font.ascent());
+    bool supportsSubPixelPositions = fontD->fontEngine->supportsSubPixelPositions();
+    for (int i=0; i<glyphIndexes.size(); ++i) {
+         QFixed subPixelPosition;
+         if (supportsSubPixelPositions)
+             subPixelPosition = cache->subPixelPositionForX(QFixed::fromReal(glyphPositions.at(i).x()));
+
+         QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphIndexes.at(i), subPixelPosition);
+         const QTextureGlyphCache::Coord &c = cache->coords.value(glyph);
+
+         QPointF glyphPosition = glyphPositions.at(i) + position;
+         int x = qRound(glyphPosition.x()) + c.baseLineX - margin;
+         int y = qRound(glyphPosition.y()) - c.baseLineY - margin;
+
+         *boundingRect |= QRectF(x + margin, y + margin, c.w, c.h);
+
+         float cx1 = x;
+         float cx2 = x + c.w;
+         float cy1 = y;
+         float cy2 = y + c.h;
+
+         float tx1 = c.x;
+         float tx2 = (c.x + c.w);
+         float ty1 = c.y;
+         float ty2 = (c.y + c.h);
+
+         if (baseLine->isNull())
+             *baseLine = glyphPosition;
+
+         vp[4 * i + 0] = QVector4D(cx1, cy1, tx1, ty1);
+         vp[4 * i + 1] = QVector4D(cx2, cy1, tx2, ty1);
+         vp[4 * i + 2] = QVector4D(cx1, cy2, tx1, ty2);
+         vp[4 * i + 3] = QVector4D(cx2, cy2, tx2, ty2);
+
+         int o = i * 4;
+         ip[6 * i + 0] = o + 0;
+         ip[6 * i + 1] = o + 2;
+         ip[6 * i + 2] = o + 3;
+         ip[6 * i + 3] = o + 3;
+         ip[6 * i + 4] = o + 1;
+         ip[6 * i + 5] = o + 0;
+    }
+}
+
+QSGMaterialType *QSGTextMaskMaterial::type() const
+{
+    static QSGMaterialType type;
+    return &type;
+}
+
+QGLTextureGlyphCache *QSGTextMaskMaterial::glyphCache() const
+{
+    return static_cast<QGLTextureGlyphCache*>(m_glyphCache.data());
+}
+
+QSGMaterialShader *QSGTextMaskMaterial::createShader() const
+{
+    return new QSGTextMaskMaterialData;
+}
+
+int QSGTextMaskMaterial::compare(const QSGMaterial *o) const
+{
+    Q_ASSERT(o && type() == o->type());
+    const QSGTextMaskMaterial *other = static_cast<const QSGTextMaskMaterial *>(o);
+    if (m_glyphCache != other->m_glyphCache)
+        return m_glyphCache - other->m_glyphCache;
+    QRgb c1 = m_color.rgba();
+    QRgb c2 = other->m_color.rgba();
+    return int(c2 < c1) - int(c1 < c2);
+}
+
+bool QSGTextMaskMaterial::ensureUpToDate()
+{
+    QSize glyphCacheSize(glyphCache()->width(), glyphCache()->height());
+    if (glyphCacheSize != m_size) {
+        if (m_texture)
+            delete m_texture;
+        m_texture = new QSGPlainTexture();
+        m_texture->setTextureId(glyphCache()->texture());
+        m_texture->setTextureSize(QSize(glyphCache()->width(), glyphCache()->height()));
+        m_texture->setOwnsTexture(false);
+
+        m_size = glyphCacheSize;
+
+        return true;
+    } else {
+        return false;
+    }
+}
+
+int QSGTextMaskMaterial::cacheTextureWidth() const
+{
+    return glyphCache()->width();
+}
+
+int QSGTextMaskMaterial::cacheTextureHeight() const
+{
+    return glyphCache()->height();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdefaultglyphnode_p.h b/src/declarative/scenegraph/qsgdefaultglyphnode_p.h
new file mode 100644
index 0000000000..9e93bc4368
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultglyphnode_p.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEFAULT_GLYPHNODE_H
+#define DEFAULT_GLYPHNODE_H
+
+#include <private/qsgadaptationlayer_p.h>
+#include <qsgnode.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QGlyphs;
+class QSGTextMaskMaterial;
+class QSGDefaultGlyphNode: public QSGGlyphNode
+{
+public:
+    QSGDefaultGlyphNode();
+    ~QSGDefaultGlyphNode();
+
+    virtual QPointF baseLine() const { return m_baseLine; }
+    virtual void setGlyphs(const QPointF &position, const QGlyphs &glyphs);
+    virtual void setColor(const QColor &color);
+
+    virtual void setPreferredAntialiasingMode(AntialiasingMode) { }
+
+private:
+    QGlyphs m_glyphs;
+    QPointF m_position;
+    QColor m_color;
+
+    QPointF m_baseLine;
+    QSGTextMaskMaterial *m_material;
+
+    QSGGeometry m_geometry;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // DEFAULT_GLYPHNODE_H
diff --git a/src/declarative/scenegraph/qsgdefaultglyphnode_p_p.h b/src/declarative/scenegraph/qsgdefaultglyphnode_p_p.h
new file mode 100644
index 0000000000..b5f0d70020
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultglyphnode_p_p.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTMASKMATERIAL_H
+#define TEXTMASKMATERIAL_H
+
+#include <qsgmaterial.h>
+#include <qsgtexture.h>
+#include <qsggeometry.h>
+#include <qshareddata.h>
+#include <private/qsgtexture_p.h>
+#include <qrawfont.h>
+
+QT_BEGIN_NAMESPACE
+
+class QFontEngineGlyphCache;
+class QGLTextureGlyphCache;
+class QFontEngine;
+class Geometry;
+class QSGTextMaskMaterial: public QSGMaterial
+{
+public:
+    QSGTextMaskMaterial(const QRawFont &font);
+    ~QSGTextMaskMaterial();
+
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const;
+
+    void setColor(const QColor &color) { m_color = color; }
+    const QColor &color() const { return m_color; }
+
+    QSGTexture *texture() const { return m_texture; }
+
+    int cacheTextureWidth() const;
+    int cacheTextureHeight() const;
+
+    bool ensureUpToDate();
+
+    QGLTextureGlyphCache *glyphCache() const;
+    void populate(const QPointF &position,
+                  const QVector<quint32> &glyphIndexes, const QVector<QPointF> &glyphPositions,
+                  QSGGeometry *geometry, QRectF *boundingRect, QPointF *baseLine);
+
+private:
+    void init();
+
+    QSGPlainTexture *m_texture;
+    QExplicitlySharedDataPointer<QFontEngineGlyphCache> m_glyphCache;
+    QRawFont m_font;
+    QColor m_color;
+    QSize m_size;
+};
+
+QT_END_NAMESPACE
+
+#endif // TEXTMASKMATERIAL_H
diff --git a/src/declarative/scenegraph/qsgdefaultimagenode.cpp b/src/declarative/scenegraph/qsgdefaultimagenode.cpp
new file mode 100644
index 0000000000..a705e822c3
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultimagenode.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdefaultimagenode_p.h"
+
+#include <private/qsgtextureprovider_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGDefaultImageNode::QSGDefaultImageNode()
+    : m_sourceRect(0, 0, 1, 1)
+    , m_dirtyGeometry(false)
+    , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
+{
+    setMaterial(&m_materialO);
+    setOpaqueMaterial(&m_material);
+    setGeometry(&m_geometry);
+
+#ifdef QML_RUNTIME_TESTING
+    description = QLatin1String("image");
+#endif
+}
+
+void QSGDefaultImageNode::setTargetRect(const QRectF &rect)
+{
+    if (rect == m_targetRect)
+        return;
+    m_targetRect = rect;
+    m_dirtyGeometry = true;
+}
+
+void QSGDefaultImageNode::setSourceRect(const QRectF &rect)
+{
+    if (rect == m_sourceRect)
+        return;
+    m_sourceRect = rect;
+    m_dirtyGeometry = true;
+}
+
+
+void QSGDefaultImageNode::setFiltering(QSGTexture::Filtering filtering)
+{
+    if (m_material.filtering() == filtering)
+        return;
+
+    m_material.setFiltering(filtering);
+    m_materialO.setFiltering(filtering);
+    markDirty(DirtyMaterial);
+}
+
+
+void QSGDefaultImageNode::setMipmapFiltering(QSGTexture::Filtering filtering)
+{
+    if (m_material.mipmapFiltering() == filtering)
+        return;
+
+    m_material.setMipmapFiltering(filtering);
+    m_materialO.setMipmapFiltering(filtering);
+    markDirty(DirtyMaterial);
+}
+
+
+void QSGDefaultImageNode::setVerticalWrapMode(QSGTexture::WrapMode wrapMode)
+{
+    if (m_material.verticalWrapMode() == wrapMode)
+        return;
+
+    m_material.setVerticalWrapMode(wrapMode);
+    m_materialO.setVerticalWrapMode(wrapMode);
+    markDirty(DirtyMaterial);
+}
+
+void QSGDefaultImageNode::setHorizontalWrapMode(QSGTexture::WrapMode wrapMode)
+{
+    if (m_material.horizontalWrapMode() == wrapMode)
+        return;
+
+    m_material.setHorizontalWrapMode(wrapMode);
+    m_materialO.setHorizontalWrapMode(wrapMode);
+    markDirty(DirtyMaterial);
+}
+
+
+void QSGDefaultImageNode::setTexture(QSGTexture *texture)
+{
+    if (texture == m_material.texture())
+        return;
+
+    m_material.setTexture(texture);
+    m_materialO.setTexture(texture);
+    // Texture cleanup
+//    if (!texture.isNull())
+//        m_material.setBlending(texture->hasAlphaChannel());
+    markDirty(DirtyMaterial);
+
+    // Because the texture can be a different part of the atlas, we need to update it...
+    m_dirtyGeometry = true;
+}
+
+void QSGDefaultImageNode::update()
+{
+    if (m_dirtyGeometry)
+        updateGeometry();
+}
+
+void QSGDefaultImageNode::preprocess()
+{
+    bool doDirty = false;
+    QSGDynamicTexture *t = qobject_cast<QSGDynamicTexture *>(m_material.texture());
+    if (t) {
+        doDirty = t->updateTexture();
+        updateGeometry();
+    }
+// ### texture cleanup
+//    bool alpha = m_material.blending();
+//    if (!m_material->texture().isNull() && alpha != m_material.texture()->hasAlphaChannel()) {
+//        m_material.setBlending(!alpha);
+//        doDirty = true;
+//    }
+
+    if (doDirty)
+        markDirty(DirtyMaterial);
+}
+
+void QSGDefaultImageNode::updateGeometry()
+{
+    const QSGTexture *t = m_material.texture();
+    if (!t) {
+        QSGGeometry::updateTexturedRectGeometry(&m_geometry, QRectF(), QRectF());
+    } else {
+        QRectF textureRect = t->textureSubRect();
+        QRectF sr(textureRect.x() + m_sourceRect.x() * textureRect.width(),
+                  textureRect.y() + m_sourceRect.y() * textureRect.height(),
+                  m_sourceRect.width() * textureRect.width(),
+                  m_sourceRect.height() * textureRect.height());
+
+        QSGGeometry::updateTexturedRectGeometry(&m_geometry, m_targetRect, sr);
+    }
+    markDirty(DirtyGeometry);
+    m_dirtyGeometry = false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdefaultimagenode_p.h b/src/declarative/scenegraph/qsgdefaultimagenode_p.h
new file mode 100644
index 0000000000..8eb2c89a2a
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultimagenode_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef DEFAULT_PIXMAPNODE_H
+#define DEFAULT_PIXMAPNODE_H
+
+#include <private/qsgadaptationlayer_p.h>
+
+#include "qsgtexturematerial.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGDefaultImageNode : public QSGImageNode
+{
+public:
+    QSGDefaultImageNode();
+    virtual void setTargetRect(const QRectF &rect);
+    virtual void setSourceRect(const QRectF &rect);
+    virtual void setTexture(QSGTexture *t);
+    virtual void update();
+
+    virtual void setMipmapFiltering(QSGTexture::Filtering filtering);
+    virtual void setFiltering(QSGTexture::Filtering filtering);
+    virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode);
+    virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode);
+
+    virtual void preprocess();
+
+private:
+    void updateGeometry();
+
+    QRectF m_targetRect;
+    QRectF m_sourceRect;
+
+    QSGTextureMaterial m_material;
+    QSGTextureMaterialWithOpacity m_materialO;
+
+    uint m_dirtyGeometry : 1;
+
+    QSGGeometry m_geometry;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/qsgdefaultrectanglenode.cpp b/src/declarative/scenegraph/qsgdefaultrectanglenode.cpp
new file mode 100644
index 0000000000..a0220cef1f
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultrectanglenode.cpp
@@ -0,0 +1,550 @@
+
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+
+#include "qsgdefaultrectanglenode_p.h"
+
+#include <private/qsgvertexcolormaterial_p.h>
+#include "qsgtexturematerial.h"
+
+#include <private/qsgcontext_p.h>
+
+#include <QtCore/qmath.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGDefaultRectangleNode::QSGDefaultRectangleNode(QSGContext *context)
+    : m_border(0)
+    , m_radius(0)
+    , m_pen_width(0)
+    , m_gradient_is_opaque(true)
+    , m_dirty_geometry(false)
+    , m_default_geometry(QSGGeometry::defaultAttributes_Point2D(), 4)
+    , m_context(context)
+{
+    setGeometry(&m_default_geometry);
+    setMaterial(&m_fill_material);
+    m_border_material.setColor(QColor(0, 0, 0));
+
+    m_material_type = TypeFlat;
+
+#ifdef QML_RUNTIME_TESTING
+    description = QLatin1String("rectangle");
+#endif
+}
+
+QSGDefaultRectangleNode::~QSGDefaultRectangleNode()
+{
+    switch (m_material_type) {
+    case TypeFlat:
+        break;
+    case TypeVertexGradient:
+        delete material();
+        break;
+    }
+    delete m_border;
+}
+
+QSGGeometryNode *QSGDefaultRectangleNode::border()
+{
+    if (!m_border) {
+        m_border = new QSGGeometryNode;
+        m_border->setMaterial(&m_border_material);
+        QSGGeometry *geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0);
+        m_border->setGeometry(geometry);
+        m_border->setFlag(QSGNode::OwnsGeometry);
+    }
+    return m_border;
+}
+
+void QSGDefaultRectangleNode::setRect(const QRectF &rect)
+{
+    if (rect == m_rect)
+        return;
+    m_rect = rect;
+    m_dirty_geometry = true;
+}
+
+void QSGDefaultRectangleNode::setColor(const QColor &color)
+{
+    if (color == m_fill_material.color())
+        return;
+    if (m_gradient_stops.isEmpty()) {
+        Q_ASSERT(m_material_type == TypeFlat);
+        m_fill_material.setColor(color);
+        setMaterial(&m_fill_material); // Indicate that the material state has changed.
+    }
+}
+
+void QSGDefaultRectangleNode::setPenColor(const QColor &color)
+{
+    if (color == m_border_material.color())
+        return;
+    m_border_material.setColor(color);
+    border()->setMaterial(&m_border_material); // Indicate that the material state has changed.
+}
+
+void QSGDefaultRectangleNode::setPenWidth(qreal width)
+{
+    if (width == m_pen_width)
+        return;
+    m_pen_width = width;
+    QSGNode *b = border();
+    if (m_pen_width <= 0 && b->parent())
+        removeChildNode(b);
+    else if (m_pen_width > 0 && !b->parent())
+        appendChildNode(b);
+    m_dirty_geometry = true;
+}
+
+
+void QSGDefaultRectangleNode::setGradientStops(const QGradientStops &stops)
+{
+    if (stops.constData() == m_gradient_stops.constData())
+        return;
+
+    m_gradient_stops = stops;
+
+    m_gradient_is_opaque = true;
+    for (int i = 0; i < stops.size(); ++i)
+        m_gradient_is_opaque &= stops.at(i).second.alpha() == 0xff;
+
+    if (stops.isEmpty()) {
+        // No gradient specified, use flat color.
+        if (m_material_type != TypeFlat) {
+
+            delete material();
+            delete opaqueMaterial();
+            setOpaqueMaterial(0);
+
+            setMaterial(&m_fill_material);
+            m_material_type = TypeFlat;
+
+            setGeometry(&m_default_geometry);
+            setFlag(OwnsGeometry, false);
+        }
+    } else {
+        if (m_material_type == TypeFlat) {
+            QSGVertexColorMaterial *material = new QSGVertexColorMaterial;
+            setMaterial(material);
+            m_material_type = TypeVertexGradient;
+            QSGGeometry *g = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 0);
+            setGeometry(g);
+            setFlag(OwnsGeometry);
+        }
+        static_cast<QSGVertexColorMaterial *>(material())->setOpaque(m_gradient_is_opaque);
+    }
+
+    m_dirty_geometry = true;
+}
+
+void QSGDefaultRectangleNode::setRadius(qreal radius)
+{
+    if (radius == m_radius)
+        return;
+    m_radius = radius;
+    m_dirty_geometry = true;
+}
+
+void QSGDefaultRectangleNode::update()
+{
+    if (m_dirty_geometry) {
+        updateGeometry();
+        m_dirty_geometry = false;
+    }
+}
+
+struct Color4ub
+{
+    unsigned char r, g, b, a;
+};
+
+Color4ub operator *(Color4ub c, float t) { c.a *= t; c.r *= t; c.g *= t; c.b *= t; return c; }
+Color4ub operator +(Color4ub a, Color4ub b) {  a.a += b.a; a.r += b.r; a.g += b.g; a.b += b.b; return a; }
+
+static inline Color4ub colorToColor4ub(const QColor &c)
+{
+    Color4ub color = { c.redF() * c.alphaF() * 255,
+                       c.greenF() * c.alphaF() * 255,
+                       c.blueF() * c.alphaF() * 255,
+                       c.alphaF() * 255
+                     };
+    return color;
+}
+
+struct Vertex
+{
+    QVector2D position;
+};
+
+struct ColorVertex
+{
+    QVector2D position;
+    Color4ub color;
+};
+
+void QSGDefaultRectangleNode::updateGeometry()
+{
+    // fast path for the simple case...
+    if ((m_pen_width == 0 || m_border_material.color().alpha() == 0)
+            && m_radius == 0
+            && m_material_type == TypeFlat) {
+        QSGGeometry::updateRectGeometry(&m_default_geometry, m_rect);
+        return;
+    }
+
+
+    // ### This part down below is not optimal, using QVectors and reallocation for
+    // every change, but its all going to be fixed up in rewrite...
+
+    QSGGeometry *fill = geometry();
+
+    // Check that the vertex type matches the material.
+    Q_ASSERT(m_material_type != TypeFlat || fill->stride() == sizeof(Vertex));
+    Q_ASSERT(m_material_type != TypeVertexGradient || fill->stride() == sizeof(ColorVertex));
+
+    QSGGeometry *borderGeometry = 0;
+    if (m_border) {
+        borderGeometry = border()->geometry();
+        Q_ASSERT(borderGeometry->stride() == sizeof(QSGGeometry::Point2D));
+    }
+
+    int fillVertexCount = 0;
+    int borderVertexCount = 0;
+    int borderIndexCount = 0;
+
+    QVector<uchar> fillVertexData;
+    QVector<Vertex> borderVertexData;
+    QVector<ushort> borderIndexData;
+
+    Color4ub fillColor = colorToColor4ub(m_fill_material.color());
+    const QGradientStops &stops = m_gradient_stops;
+
+    if (m_radius > 0) {
+        // Rounded corners.
+
+        // Radius should never exceeds half of the width or half of the height
+        qreal radius = qMin(qMin(m_rect.width() / 2, m_rect.height() / 2), m_radius);
+        QRectF innerRect = m_rect;
+        innerRect.adjust(radius, radius, -radius, -radius);
+        if (m_pen_width & 1) {
+            // Pen width is odd, so add the offset as documented.
+            innerRect.moveLeft(innerRect.left() + qreal(0.5));
+            innerRect.moveTop(innerRect.top() + qreal(0.5));
+        }
+
+        qreal innerRadius = radius - m_pen_width * qreal(0.5);
+        qreal outerRadius = radius + m_pen_width * qreal(0.5);
+
+        int segments = qMin(30, qCeil(outerRadius)); // Number of segments per corner.
+
+        /*
+
+        --+-__
+          | segment
+          |       _+
+        --+-__  _-   \
+              -+  segment
+        --------+      \        <- gradient line
+                 +-----+
+                 |     |
+
+        */
+
+        // Overestimate the number of vertices and indices, reduce afterwards when the actual numbers are known.
+        if (m_pen_width) {
+            // The reason I add extra vertices where the gradient lines intersect the border is
+            // to avoid pixel sized gaps between the fill and the border caused by floating point
+            // inaccuracies.
+            borderVertexData.resize((segments + 1) * 2 * 4 + m_gradient_stops.size() * 2);
+        }
+        fillVertexData.resize(((segments + 1) * 4 + m_gradient_stops.size() * 2) * fill->stride());
+
+        Vertex *borderVertices = borderVertexData.data();
+        void *fillVertices = fillVertexData.data(); // Can be Vertex, ColorVertex or TextureVertex.
+
+
+        int nextGradientStop = 0;
+        qreal gradientPos = (radius - innerRadius) / (innerRect.height() + 2 * radius);
+        while (nextGradientStop < stops.size() && stops.at(nextGradientStop).first <= gradientPos)
+            ++nextGradientStop;
+
+        qreal py = 0; // previous inner y-coordinate.
+        qreal plx = 0; // previous inner left x-coordinate.
+        qreal prx = 0; // previous inner right x-coordinate.
+
+        for (int part = 0; part < 2; ++part) {
+            for (int i = 0; i <= segments; ++i) {
+                //### Should change to calculate sin/cos only once.
+                qreal angle = qreal(0.5 * M_PI) * (part + i / qreal(segments));
+                qreal s = qFastSin(angle);
+                qreal c = qFastCos(angle);
+                qreal y = (part ? innerRect.bottom() : innerRect.top()) - innerRadius * c; // current inner y-coordinate.
+                qreal lx = innerRect.left() - innerRadius * s; // current inner left x-coordinate.
+                qreal rx = innerRect.right() + innerRadius * s; // current inner right x-coordinate.
+                qreal Y = (part ? innerRect.bottom() : innerRect.top()) - outerRadius * c; // current outer y-coordinate.
+                qreal lX = innerRect.left() - outerRadius * s; // current outer left x-coordinate.
+                qreal rX = innerRect.right() + outerRadius * s; // current outer right x-coordinate.
+
+                gradientPos = ((part ? innerRect.height() : 0) + radius - innerRadius * c) / (innerRect.height() + 2 * radius);
+                while (nextGradientStop < stops.size() && stops.at(nextGradientStop).first <= gradientPos) {
+                    // Insert vertices at gradient stops.
+                    qreal gy = (innerRect.top() - radius) + stops.at(nextGradientStop).first * (innerRect.height() + 2 * radius);
+                    Q_ASSERT(fillVertexCount >= 2);
+                    qreal t = (gy - py) / (y - py);
+                    qreal glx = plx * (1 - t) + t * lx;
+                    qreal grx = prx * (1 - t) + t * rx;
+
+                    if (m_pen_width) {
+                        borderVertices[borderVertexCount++].position = QVector2D(grx, gy);
+                        borderVertices[borderVertexCount++].position = QVector2D(glx, gy);
+
+                        int first = borderIndexData.first();
+                        borderIndexData.prepend(borderVertexCount - 1);
+                        borderIndexData.prepend(first);
+
+                        int last = borderIndexData.at(borderIndexData.size() - 2);
+                        borderIndexData.append(last);
+                        borderIndexData.append(borderVertexCount - 2);
+                    }
+
+                    Q_ASSERT(QSGVertexColorMaterial::is(material()));
+                    ColorVertex *vertices = (ColorVertex *)fillVertices;
+
+                    fillColor = colorToColor4ub(stops.at(nextGradientStop).second);
+                    vertices[fillVertexCount].position = QVector2D(grx, gy);
+                    vertices[fillVertexCount].color = fillColor;
+                    ++fillVertexCount;
+                    vertices[fillVertexCount].position = QVector2D(glx, gy);
+                    vertices[fillVertexCount].color = fillColor;
+                    ++fillVertexCount;
+
+                    ++nextGradientStop;
+                }
+
+                if (m_pen_width) {
+                    borderVertices[borderVertexCount++].position = QVector2D(rX, Y);
+                    borderVertices[borderVertexCount++].position = QVector2D(lX, Y);
+                    borderVertices[borderVertexCount++].position = QVector2D(rx, y);
+                    borderVertices[borderVertexCount++].position = QVector2D(lx, y);
+
+                    borderIndexData.prepend(borderVertexCount - 1);
+                    borderIndexData.prepend(borderVertexCount - 3);
+                    borderIndexData.append(borderVertexCount - 4);
+                    borderIndexData.append(borderVertexCount - 2);
+                }
+
+                if (stops.isEmpty()) {
+                    Q_ASSERT(m_material_type == TypeFlat);
+                    Vertex *vertices = (Vertex *)fillVertices;
+                    vertices[fillVertexCount++].position = QVector2D(rx, y);
+                    vertices[fillVertexCount++].position = QVector2D(lx, y);
+                } else {
+                    if (nextGradientStop == 0) {
+                        fillColor = colorToColor4ub(stops.at(0).second);
+                    } else if (nextGradientStop == stops.size()) {
+                        fillColor = colorToColor4ub(stops.last().second);
+                    } else {
+                        const QGradientStop &prev = stops.at(nextGradientStop - 1);
+                        const QGradientStop &next = stops.at(nextGradientStop);
+                        qreal t = (gradientPos - prev.first) / (next.first - prev.first);
+                        fillColor = (colorToColor4ub(prev.second) * (1 - t) + colorToColor4ub(next.second) * t);
+                    }
+
+                    ColorVertex *vertices = (ColorVertex *)fillVertices;
+                    vertices[fillVertexCount].position = QVector2D(rx, y);
+                    vertices[fillVertexCount].color = fillColor;
+                    ++fillVertexCount;
+                    vertices[fillVertexCount].position = QVector2D(lx, y);
+                    vertices[fillVertexCount].color = fillColor;
+                    ++fillVertexCount;
+                }
+
+                py = y;
+                plx = lx;
+                prx = rx;
+            }
+        }
+
+
+        if (m_pen_width) {
+            // Close border.
+            ushort first = borderIndexData.at(0);
+            ushort second = borderIndexData.at(1);
+            borderIndexData.append(first);
+            borderIndexData.append(second);
+
+            borderIndexCount = borderIndexData.size();
+        }
+
+    } else {
+
+        // Straight corners.
+        QRectF innerRect = m_rect;
+        QRectF outerRect = m_rect;
+
+        qreal halfPenWidth = 0;
+        if (m_pen_width) {
+            if (m_pen_width & 1) {
+                // Pen width is odd, so add the offset as documented.
+                innerRect.moveLeft(innerRect.left() + qreal(0.5));
+                innerRect.moveTop(innerRect.top() + qreal(0.5));
+                outerRect = innerRect;
+            }
+            halfPenWidth = m_pen_width * qreal(0.5);
+            innerRect.adjust(halfPenWidth, halfPenWidth, -halfPenWidth, -halfPenWidth);
+            outerRect.adjust(-halfPenWidth, -halfPenWidth, halfPenWidth, halfPenWidth);
+        }
+
+        if (m_pen_width) {
+            borderVertexData.resize((2 + stops.size()) * 2 + 4);
+            borderIndexData.resize((2 + stops.size()) * 2 * 2 + 4);
+        }
+        fillVertexData.resize((2 + stops.size()) * 2 * fill->stride());
+
+        void *fillVertices = fillVertexData.data();
+        Vertex *borderVertices = (Vertex *) borderVertexData.data();
+        ushort *borderIndices = borderIndexData.data();
+
+        int nextGradientStop = 0;
+        qreal gradientPos = halfPenWidth / m_rect.height();
+        while (nextGradientStop < stops.size() && stops.at(nextGradientStop).first <= gradientPos)
+            ++nextGradientStop;
+
+        for (int part = 0; part < 2; ++part) {
+            qreal y = (part ? innerRect.bottom() : innerRect.top());
+            gradientPos = (y - innerRect.top() + halfPenWidth) / m_rect.height();
+
+            while (nextGradientStop < stops.size() && stops.at(nextGradientStop).first <= gradientPos) {
+                // Insert vertices at gradient stops.
+                qreal gy = (innerRect.top() - halfPenWidth) + stops.at(nextGradientStop).first * m_rect.height();
+                Q_ASSERT(fillVertexCount >= 2);
+
+                Q_ASSERT(QSGVertexColorMaterial::is(material()));
+                ColorVertex *vertices = (ColorVertex *)fillVertices;
+
+                fillColor = colorToColor4ub(stops.at(nextGradientStop).second);
+                vertices[fillVertexCount].position = QVector2D(innerRect.right(), gy);
+                vertices[fillVertexCount].color = fillColor;
+                ++fillVertexCount;
+                vertices[fillVertexCount].position = QVector2D(innerRect.left(), gy);
+                vertices[fillVertexCount].color = fillColor;
+                ++fillVertexCount;
+
+                if (m_pen_width) {
+                    borderVertices[borderVertexCount++].position = QVector2D(innerRect.right(), gy);
+                    borderVertices[borderVertexCount++].position = QVector2D(innerRect.left(), gy);
+                }
+
+                ++nextGradientStop;
+            }
+
+            if (stops.isEmpty()) {
+                Q_ASSERT(m_material_type == TypeFlat);
+                Vertex *vertices = (Vertex *)fillVertices;
+                vertices[fillVertexCount++].position = QVector2D(innerRect.right(), y);
+                vertices[fillVertexCount++].position = QVector2D(innerRect.left(), y);
+            } else {
+                if (nextGradientStop == 0) {
+                    fillColor = colorToColor4ub(stops.at(0).second);
+                } else if (nextGradientStop == stops.size()) {
+                    fillColor = colorToColor4ub(stops.last().second);
+                } else {
+                    const QGradientStop &prev = stops.at(nextGradientStop - 1);
+                    const QGradientStop &next = stops.at(nextGradientStop);
+                    qreal t = (gradientPos - prev.first) / (next.first - prev.first);
+                    fillColor = (colorToColor4ub(prev.second) * (1 - t) + colorToColor4ub(next.second) * t);
+                }
+
+                ColorVertex *vertices = (ColorVertex *)fillVertices;
+                vertices[fillVertexCount].position = QVector2D(innerRect.right(), y);
+                vertices[fillVertexCount].color = fillColor;
+                ++fillVertexCount;
+                vertices[fillVertexCount].position = QVector2D(innerRect.left(), y);
+                vertices[fillVertexCount].color = fillColor;
+                ++fillVertexCount;
+            }
+
+            if (m_pen_width) {
+                borderVertices[borderVertexCount++].position = QVector2D(innerRect.right(), y);
+                borderVertices[borderVertexCount++].position = QVector2D(innerRect.left(), y);
+            }
+        }
+
+        if (m_pen_width) {
+            // Add four corners.
+            borderVertices[borderVertexCount++].position = QVector2D(outerRect.right(), outerRect.top());
+            borderVertices[borderVertexCount++].position = QVector2D(outerRect.left(), outerRect.top());
+            borderVertices[borderVertexCount++].position = QVector2D(outerRect.right(), outerRect.bottom());
+            borderVertices[borderVertexCount++].position = QVector2D(outerRect.left(), outerRect.bottom());
+
+            for (int i = 0; i < fillVertexCount / 2; ++i) {
+                borderIndices[borderIndexCount++] = borderVertexCount - (i == 0 ? 4 : 2); // Upper or lower right corner.
+                borderIndices[borderIndexCount++] = 2 * i + 0;
+            }
+            for (int i = 0; i < fillVertexCount / 2; ++i) {
+                borderIndices[borderIndexCount++] = borderVertexCount - (i == 0 ? 1 : 3); // Lower or upper left corner.
+                borderIndices[borderIndexCount++] = fillVertexCount - 2 * i - 1;
+            }
+            borderIndices[borderIndexCount++] = fillVertexCount; // Upper right corner.
+            borderIndices[borderIndexCount++] = 0;
+            Q_ASSERT(fillVertexCount + 4 == borderVertexCount);
+        }
+    }
+
+    // Copy from temporary datastructures to geometry...
+    if (m_pen_width) {
+        borderGeometry->allocate(borderVertexCount, borderIndexCount);
+        memcpy(borderGeometry->indexData(), borderIndexData.constData(), borderIndexCount * sizeof(quint16));
+        memcpy(borderGeometry->vertexData(), borderVertexData.constData(), borderVertexCount * sizeof(Vertex));
+        m_border->markDirty(DirtyGeometry);
+    }
+
+    fill->allocate(fillVertexCount);
+    memcpy(fill->vertexData(), fillVertexData.constData(), fillVertexCount * fill->stride());
+
+    markDirty(DirtyGeometry);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdefaultrectanglenode_p.h b/src/declarative/scenegraph/qsgdefaultrectanglenode_p.h
new file mode 100644
index 0000000000..3bf14947de
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdefaultrectanglenode_p.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef DEFAULT_RECTANGLENODE_H
+#define DEFAULT_RECTANGLENODE_H
+
+#include <private/qsgadaptationlayer_p.h>
+
+#include "qsgflatcolormaterial.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGMaterial;
+class QSGContext;
+
+class QSGDefaultRectangleNode : public QSGRectangleNode
+{
+public:
+    QSGDefaultRectangleNode(QSGContext *context);
+    ~QSGDefaultRectangleNode();
+
+    virtual void setRect(const QRectF &rect);
+    virtual void setColor(const QColor &color);
+    virtual void setPenColor(const QColor &color);
+    virtual void setPenWidth(qreal width);
+    virtual void setGradientStops(const QGradientStops &stops);
+    virtual void setRadius(qreal radius);
+    virtual void update();
+
+private:
+    enum {
+        TypeFlat,
+        TypeVertexGradient
+    };
+    QSGGeometryNode *border();
+
+    void updateGeometry();
+    void updateGradientTexture();
+
+    QSGGeometryNode *m_border;
+    QSGFlatColorMaterial m_border_material;
+    QSGFlatColorMaterial m_fill_material;
+
+    QRectF m_rect;
+    QGradientStops m_gradient_stops;
+    qreal m_radius;
+    int m_pen_width;
+
+    uint m_gradient_is_opaque : 1;
+    uint m_dirty_geometry : 1;
+
+    uint m_material_type : 2; // Only goes up to 3
+
+    QSGGeometry m_default_geometry;
+
+    QSGContext *m_context;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp b/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp
new file mode 100644
index 0000000000..957632c46f
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp
@@ -0,0 +1,956 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdistancefieldglyphcache_p.h"
+
+#include <qmath.h>
+#include <private/qtriangulator_p.h>
+#include <private/qdeclarativeglobal_p.h>
+#include <qglshaderprogram.h>
+#include <private/qglengineshadersource_p.h>
+#include <private/qsgcontext_p.h>
+#include <private/qrawfont_p.h>
+#include <qglfunctions.h>
+#include <qglyphs.h>
+#include <qrawfont.h>
+
+QT_BEGIN_NAMESPACE
+
+#define QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE 54
+#define QT_DISTANCEFIELD_DEFAULT_TILESIZE 64
+#define QT_DISTANCEFIELD_DEFAULT_SCALE 16
+#define QT_DISTANCEFIELD_DEFAULT_RADIUS 80
+#define QT_DISTANCEFIELD_HIGHGLYPHCOUNT 2000
+
+#define QT_DISTANCEFIELD_BASEFONTSIZE \
+    (m_textureData->doubleGlyphResolution ? QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE * 2 : \
+                                           QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE)
+#define QT_DISTANCEFIELD_TILESIZE \
+    (m_textureData->doubleGlyphResolution ? QT_DISTANCEFIELD_DEFAULT_TILESIZE * 2 : \
+                                           QT_DISTANCEFIELD_DEFAULT_TILESIZE)
+#define QT_DISTANCEFIELD_SCALE \
+    (m_textureData->doubleGlyphResolution ? QT_DISTANCEFIELD_DEFAULT_SCALE / 2 : \
+                                           QT_DISTANCEFIELD_DEFAULT_SCALE)
+#define QT_DISTANCEFIELD_RADIUS \
+    (m_textureData->doubleGlyphResolution ? QT_DISTANCEFIELD_DEFAULT_RADIUS / 2 : \
+                                           QT_DISTANCEFIELD_DEFAULT_RADIUS)
+
+static inline int qt_next_power_of_two(int v)
+{
+    v--;
+    v |= v >> 1;
+    v |= v >> 2;
+    v |= v >> 4;
+    v |= v >> 8;
+    v |= v >> 16;
+    ++v;
+    return v;
+}
+
+struct DFPoint
+{
+    float x, y;
+};
+
+struct DFVertex
+{
+    DFPoint p;
+    float d;
+};
+
+static void drawRectangle(float *bits, int width, int height, const DFVertex *v1, const DFVertex *v2, const DFVertex *v3, const DFVertex *v4)
+{
+    float minY = qMin(qMin(v1->p.y, v2->p.y), qMin(v3->p.y, v4->p.y));
+    if (v2->p.y == minY) {
+        const DFVertex *tmp = v1;
+        v1 = v2;
+        v2 = v3;
+        v3 = v4;
+        v4 = tmp;
+    } else if (v3->p.y == minY) {
+        const DFVertex *tmp1 = v1;
+        const DFVertex *tmp2 = v2;
+        v1 = v3;
+        v2 = v4;
+        v3 = tmp1;
+        v4 = tmp2;
+    } else if (v4->p.y == minY) {
+        const DFVertex *tmp = v4;
+        v4 = v3;
+        v3 = v2;
+        v2 = v1;
+        v1 = tmp;
+    }
+
+    /*
+       v1
+      /  \
+     v4  v2
+      \  /
+       v3
+    */
+
+    int fromY = qMax(0, qCeil(v1->p.y));
+    int midY1 = qMin(height, qCeil(qMin(v2->p.y, v4->p.y)));
+    int midY2 = qMin(height, qCeil(qMax(v2->p.y, v4->p.y)));
+    int toY = qMin(height, qCeil(v3->p.y));
+
+    if (toY <= fromY)
+        return;
+
+    bits += width * fromY;
+    int y = fromY;
+
+    float leftDx = (v4->p.x - v1->p.x) / (v4->p.y - v1->p.y);
+    float leftDd = (v4->d - v1->d) / (v4->p.y - v1->p.y);
+    float leftX = v1->p.x + (fromY - v1->p.y) * leftDx;
+    float leftD = v1->d + (fromY - v1->p.y) * leftDd;
+
+    float rightDx = (v2->p.x - v1->p.x) / (v2->p.y - v1->p.y);
+    float rightDd = (v2->d - v1->d) / (v2->p.y - v1->p.y);
+    float rightX = v1->p.x + (fromY - v1->p.y) * rightDx;
+    float rightD = v1->d + (fromY - v1->p.y) * rightDd;
+
+    float dd = ((v2->d - v1->d) * (v3->p.y - v1->p.y) - (v2->p.y - v1->p.y) * (v3->d - v1->d))
+             / ((v2->p.x - v1->p.x) * (v3->p.y - v1->p.y) - (v2->p.y - v1->p.y) * (v3->p.x - v1->p.x));
+
+    for (; y < midY1; ++y, leftX += leftDx, leftD += leftDd, rightX += rightDx, rightD += rightDd, bits += width) {
+        int fromX = qMax(0, qCeil(leftX));
+        int toX = qMin(width, qCeil(rightX));
+        if (toX <= fromX)
+            continue;
+        float d = leftD + (fromX - leftX) * dd;
+        for (int x = fromX; x < toX; ++x, d += dd) {
+            if (abs(d) < abs(bits[x]))
+                bits[x] = d;
+        }
+    }
+
+    if (midY1 == toY)
+        return;
+
+    if (v2->p.y > v4->p.y) {
+        // Long right edge.
+        leftDx = (v3->p.x - v4->p.x) / (v3->p.y - v4->p.y);
+        leftDd = (v3->d - v4->d) / (v3->p.y - v4->p.y);
+        leftX = v4->p.x + (midY1 - v4->p.y) * leftDx;
+        leftD = v4->d + (midY1 - v4->p.y) * leftDd;
+    } else {
+        // Long left edge.
+        rightDx = (v3->p.x - v2->p.x) / (v3->p.y - v2->p.y);
+        rightDd = (v3->d - v2->d) / (v3->p.y - v2->p.y);
+        rightX = v2->p.x + (midY1 - v2->p.y) * rightDx;
+        rightD = v2->d + (midY1 - v2->p.y) * rightDd;
+    }
+
+    for (; y < midY2; ++y, leftX += leftDx, leftD += leftDd, rightX += rightDx, rightD += rightDd, bits += width) {
+        int fromX = qMax(0, qCeil(leftX));
+        int toX = qMin(width, qCeil(rightX));
+        if (toX <= fromX)
+            continue;
+        float d = leftD + (fromX - leftX) * dd;
+        for (int x = fromX; x < toX; ++x, d += dd) {
+            if (abs(d) < abs(bits[x]))
+                bits[x] = d;
+        }
+    }
+
+    if (midY2 == toY)
+        return;
+
+    if (v2->p.y > v4->p.y) {
+        // Long left edge.
+        rightDx = (v3->p.x - v2->p.x) / (v3->p.y - v2->p.y);
+        rightDd = (v3->d - v2->d) / (v3->p.y - v2->p.y);
+        rightX = v2->p.x + (midY2 - v2->p.y) * rightDx;
+        rightD = v2->d + (midY2 - v2->p.y) * rightDd;
+    } else {
+        // Long right edge.
+        leftDx = (v3->p.x - v4->p.x) / (v3->p.y - v4->p.y);
+        leftDd = (v3->d - v4->d) / (v3->p.y - v4->p.y);
+        leftX = v4->p.x + (midY2 - v4->p.y) * leftDx;
+        leftD = v4->d + (midY2 - v4->p.y) * leftDd;
+    }
+
+    for (; y < toY; ++y, leftX += leftDx, leftD += leftDd, rightX += rightDx, rightD += rightDd, bits += width) {
+        int fromX = qMax(0, qCeil(leftX));
+        int toX = qMin(width, qCeil(rightX));
+        if (toX <= fromX)
+            continue;
+        float d = leftD + (fromX - leftX) * dd;
+        for (int x = fromX; x < toX; ++x, d += dd) {
+            if (abs(d) < abs(bits[x]))
+                bits[x] = d;
+        }
+    }
+}
+
+static void drawTriangle(float *bits, int width, int height, const DFVertex *v1, const DFVertex *v2, const DFVertex *v3)
+{
+    float minY = qMin(qMin(v1->p.y, v2->p.y), v3->p.y);
+    if (v2->p.y == minY) {
+        const DFVertex *tmp = v1;
+        v1 = v2;
+        v2 = v3;
+        v3 = tmp;
+    } else if (v3->p.y == minY) {
+        const DFVertex *tmp = v3;
+        v3 = v2;
+        v2 = v1;
+        v1 = tmp;
+    }
+
+    //   v1
+    //  /  \
+    // v3--v2
+
+    int fromY = qMax(0, qCeil(v1->p.y));
+    int midY = qMin(height, qCeil(qMin(v2->p.y, v3->p.y)));
+    int toY = qMin(height, qCeil(qMax(v2->p.y, v3->p.y)));
+
+    if (toY <= fromY)
+        return;
+
+    float leftDx = (v3->p.x - v1->p.x) / (v3->p.y - v1->p.y);
+    float leftDd = (v3->d - v1->d) / (v3->p.y - v1->p.y);
+    float leftX = v1->p.x + (fromY - v1->p.y) * leftDx;
+    float leftD = v1->d + (fromY - v1->p.y) * leftDd;
+
+    float rightDx = (v2->p.x - v1->p.x) / (v2->p.y - v1->p.y);
+    float rightDd = (v2->d - v1->d) / (v2->p.y - v1->p.y);
+    float rightX = v1->p.x + (fromY - v1->p.y) * rightDx;
+    float rightD = v1->d + (fromY - v1->p.y) * rightDd;
+
+    float dd = ((v2->d - v1->d) * (v3->p.y - v1->p.y) - (v2->p.y - v1->p.y) * (v3->d - v1->d))
+             / ((v2->p.x - v1->p.x) * (v3->p.y - v1->p.y) - (v2->p.y - v1->p.y) * (v3->p.x - v1->p.x));
+
+    bits += width * fromY;
+    int y = fromY;
+    for (; y < midY; ++y, leftX += leftDx, leftD += leftDd, rightX += rightDx, rightD += rightDd, bits += width) {
+        int fromX = qMax(0, qCeil(leftX));
+        int toX = qMin(width, qCeil(rightX));
+        if (toX <= fromX)
+            continue;
+        float d = leftD + (fromX - leftX) * dd;
+        for (int x = fromX; x < toX; ++x, d += dd) {
+            if (abs(d) < abs(bits[x]))
+                bits[x] = d;
+        }
+    }
+
+    if (midY == toY)
+        return;
+
+    if (v2->p.y > v3->p.y) {
+        // Long right edge.
+        leftDx = (v2->p.x - v3->p.x) / (v2->p.y - v3->p.y);
+        leftDd = (v2->d - v3->d) / (v2->p.y - v3->p.y);
+        leftX = v3->p.x + (midY - v3->p.y) * leftDx;
+        leftD = v3->d + (midY - v3->p.y) * leftDd;
+    } else {
+        // Long left edge.
+        rightDx = (v3->p.x - v2->p.x) / (v3->p.y - v2->p.y);
+        rightDd = (v3->d - v2->d) / (v3->p.y - v2->p.y);
+        rightX = v2->p.x + (midY - v2->p.y) * rightDx;
+        rightD = v2->d + (midY - v2->p.y) * rightDd;
+    }
+
+    for (; y < toY; ++y, leftX += leftDx, leftD += leftDd, rightX += rightDx, rightD += rightDd, bits += width) {
+        int fromX = qMax(0, qCeil(leftX));
+        int toX = qMin(width, qCeil(rightX));
+        if (toX <= fromX)
+            continue;
+        float d = leftD + (fromX - leftX) * dd;
+        for (int x = fromX; x < toX; ++x, d += dd) {
+            if (abs(d) < abs(bits[x]))
+                bits[x] = d;
+        }
+    }
+}
+
+static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfScale, float offs)
+{
+    QImage image(imgSize, imgSize, QImage::Format_ARGB32_Premultiplied);
+
+    if (path.isEmpty()) {
+        image.fill(0);
+        return image;
+    }
+
+    QPolylineSet polys = qPolyline(path);
+
+    union Pacific {
+        float value;
+        QRgb color;
+    };
+    Pacific interior;
+    Pacific exterior;
+    interior.value = 127;
+    exterior.value = -127;
+
+    image.fill(exterior.color);
+
+    QPainter p(&image);
+    p.setCompositionMode(QPainter::CompositionMode_Source);
+    p.translate(offs, offs);
+    p.scale(1 / qreal(dfScale), 1 / qreal(dfScale));
+    p.fillPath(path, QColor::fromRgba(interior.color));
+    p.end();
+
+    float *bits = (float *)image.bits();
+    const float angleStep = 15 * 3.141592653589793238f / 180;
+    const DFPoint rotation = { cos(angleStep), sin(angleStep) };
+
+    bool isShortData = polys.indices.type() == QVertexIndexVector::UnsignedShort;
+    const void *indices = polys.indices.data();
+    int index = 0;
+    QVector<DFPoint> normals;
+    QVector<DFVertex> vertices;
+    normals.reserve(polys.vertices.count());
+    vertices.reserve(polys.vertices.count());
+
+    while (index < polys.indices.size()) {
+        normals.clear();
+        vertices.clear();
+
+        // Find end of polygon.
+        int end = index;
+        if (isShortData) {
+            while (((quint16 *)indices)[end] != quint16(-1))
+                ++end;
+        } else {
+            while (((quint32 *)indices)[end] != quint32(-1))
+                ++end;
+        }
+
+        // Calculate vertex normals.
+        for (int next = index, prev = end - 1; next < end; prev = next++) {
+            quint32 fromVertexIndex = isShortData ? (quint32)((quint16 *)indices)[prev] : ((quint32 *)indices)[prev];
+            quint32 toVertexIndex = isShortData ? (quint32)((quint16 *)indices)[next] : ((quint32 *)indices)[next];
+            const qreal *from = &polys.vertices.at(fromVertexIndex * 2);
+            const qreal *to = &polys.vertices.at(toVertexIndex * 2);
+            DFPoint n;
+            n.x = float(to[1] - from[1]);
+            n.y = float(from[0] - to[0]);
+            if (n.x == 0 && n.y == 0)
+                continue;
+            float scale = offs / sqrt(n.x * n.x + n.y * n.y);
+            n.x *= scale;
+            n.y *= scale;
+            normals.append(n);
+
+            DFVertex v;
+            v.p.x = float(to[0] / dfScale) + offs - 0.5f;
+            v.p.y = float(to[1] / dfScale) + offs - 0.5f;
+            v.d = 0.0f;
+            vertices.append(v);
+        }
+
+        QVector<bool> isConvex(normals.count());
+        for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++)
+            isConvex[prev] = (normals.at(prev).x * normals.at(next).y - normals.at(prev).y * normals.at(next).x > 0);
+
+        // Draw quads.
+        for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++) {
+            DFPoint n = normals.at(next);
+            DFVertex intPrev = vertices.at(prev);
+            DFVertex extPrev = vertices.at(prev);
+            DFVertex intNext = vertices.at(next);
+            DFVertex extNext = vertices.at(next);
+
+            extPrev.p.x += n.x;
+            extPrev.p.y += n.y;
+            intPrev.p.x -= n.x;
+            intPrev.p.y -= n.y;
+            extNext.p.x += n.x;
+            extNext.p.y += n.y;
+            intNext.p.x -= n.x;
+            intNext.p.y -= n.y;
+            extPrev.d = 127;
+            extNext.d = 127;
+            intPrev.d = -127;
+            intNext.d = -127;
+
+            drawRectangle(bits, image.width(), image.height(),
+                          &vertices.at(prev), &extPrev, &extNext, &vertices.at(next));
+
+            drawRectangle(bits, image.width(), image.height(),
+                          &intPrev, &vertices.at(prev), &vertices.at(next), &intNext);
+
+            if (isConvex.at(prev)) {
+                DFVertex v = extPrev;
+                for (;;) {
+                    DFPoint rn = { n.x * rotation.x + n.y * rotation.y,
+                                 n.y * rotation.x - n.x * rotation.y };
+                    n = rn;
+                    if (n.x * normals.at(prev).y - n.y * normals.at(prev).x >= -0.001) {
+                        v.p.x = vertices.at(prev).p.x + normals.at(prev).x;
+                        v.p.y = vertices.at(prev).p.y + normals.at(prev).y;
+                        drawTriangle(bits, image.width(), image.height(), &vertices.at(prev), &v, &extPrev);
+                        break;
+                    }
+
+                    v.p.x = vertices.at(prev).p.x + n.x;
+                    v.p.y = vertices.at(prev).p.y + n.y;
+                    drawTriangle(bits, image.width(), image.height(), &vertices.at(prev), &v, &extPrev);
+                    extPrev = v;
+                }
+            } else {
+                DFVertex v = intPrev;
+                for (;;) {
+                    DFPoint rn = { n.x * rotation.x - n.y * rotation.y,
+                                 n.y * rotation.x + n.x * rotation.y };
+                    n = rn;
+                    if (n.x * normals.at(prev).y - n.y * normals.at(prev).x <= 0.001) {
+                        v.p.x = vertices.at(prev).p.x - normals.at(prev).x;
+                        v.p.y = vertices.at(prev).p.y - normals.at(prev).y;
+                        drawTriangle(bits, image.width(), image.height(), &vertices.at(prev), &intPrev, &v);
+                        break;
+                    }
+
+                    v.p.x = vertices.at(prev).p.x - n.x;
+                    v.p.y = vertices.at(prev).p.y - n.y;
+                    drawTriangle(bits, image.width(), image.height(), &vertices.at(prev), &intPrev, &v);
+                    intPrev = v;
+                }
+            }
+        }
+        index = end + 1;
+    }
+
+    for (int y = 0; y < image.height(); ++y) {
+        QRgb *iLine = (QRgb *)image.scanLine(y);
+        float *fLine = (float *)iLine;
+        for (int x = 0; x < image.width(); ++x)
+            iLine[x] = QRgb(fLine[x] + 127.5) << 24;
+    }
+
+    return image;
+}
+
+static void convert_to_Format_Alpha(QImage *image)
+{
+    const int width = image->width();
+    const int height = image->height();
+    uchar *data = image->bits();
+
+    for (int i = 0; i < height; ++i) {
+        uchar *o = data + i * width;
+        for (int x = 0; x < width; ++x)
+            o[x] = (uchar)qAlpha(image->pixel(x, i));
+    }
+}
+
+static bool fontHasNarrowOutlines(const QRawFont &f)
+{
+    return true;
+    QRawFont font = f;
+    font.setPixelSize(QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE);
+    Q_ASSERT(font.isValid());
+
+    QVector<quint32> glyphIndices = font.glyphIndexesForString(QLatin1String("O"));
+    if (glyphIndices.size() < 1)
+        return false;
+
+    QImage im = font.alphaMapForGlyph(glyphIndices.at(0), QRawFont::PixelAntialiasing);
+    if (im.isNull())
+        return false;
+
+    int minHThick = 999;
+    int minVThick = 999;
+
+    int thick = 0;
+    bool in = false;
+    int y = (im.height() + 1) / 2;
+    for (int x = 0; x < im.width(); ++x) {
+        int a = qAlpha(im.pixel(x, y));
+        if (a > 127) {
+            in = true;
+            ++thick;
+        } else if (in) {
+            in = false;
+            minHThick = qMin(minHThick, thick);
+            thick = 0;
+        }
+    }
+
+    thick = 0;
+    in = false;
+    int x = (im.width() + 1) / 2;
+    for (int y = 0; y < im.height(); ++y) {
+        int a = qAlpha(im.pixel(x, y));
+        if (a > 127) {
+            in = true;
+            ++thick;
+        } else if (in) {
+            in = false;
+            minVThick = qMin(minVThick, thick);
+            thick = 0;
+        }
+    }
+
+    return minHThick == 1 || minVThick == 1;
+}
+
+DEFINE_BOOL_CONFIG_OPTION(disableDistanceField, QML_DISABLE_DISTANCEFIELD)
+
+QHash<QString, QSGDistanceFieldGlyphCache *> QSGDistanceFieldGlyphCache::m_caches;
+QHash<QString, QGLContextGroupResource<QSGDistanceFieldGlyphCache::DistanceFieldTextureData> > QSGDistanceFieldGlyphCache::m_textures_data;
+
+static QString fontKey(const QRawFont &font)
+{
+    QString key;
+
+    key = font.familyName();
+    key.remove(QLatin1String(" "));
+    QString italic = font.style() == QFont::StyleItalic ? QLatin1String("i") : QLatin1String("");
+    QString bold = font.weight() > QFont::Normal ? QLatin1String("b") : QLatin1String("");
+    key += bold + italic + QString::number(qreal(font.pixelSize()));
+
+    return key;
+}
+
+QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCache::get(const QGLContext *ctx, const QRawFont &font)
+{
+    QString key = QString::number(long(ctx), 16) + fontKey(font);
+    QHash<QString, QSGDistanceFieldGlyphCache *>::iterator atlas = m_caches.find(key);
+    if (atlas == m_caches.end())
+        atlas = m_caches.insert(key, new QSGDistanceFieldGlyphCache(ctx, font));
+
+    return atlas.value();
+}
+
+QSGDistanceFieldGlyphCache::DistanceFieldTextureData *QSGDistanceFieldGlyphCache::textureData()
+{
+    return m_textures_data[m_distanceFieldKey].value(ctx);
+}
+
+QSGDistanceFieldGlyphCache::QSGDistanceFieldGlyphCache(const QGLContext *c, const QRawFont &font)
+    : QObject()
+    , m_maxTextureSize(0)
+    , ctx(c)
+    , m_blitProgram(0)
+{
+    Q_ASSERT(font.isValid());
+    m_font = font;
+
+    QString basename = m_font.familyName();
+    basename.remove(QLatin1String(" "));
+    QString italic = m_font.style() == QFont::StyleItalic ? QLatin1String("i") : QLatin1String("");
+    QString bold = m_font.weight() > QFont::Normal ? QLatin1String("b") : QLatin1String("");
+    m_distanceFieldKey = basename + bold + italic;
+    m_textureData = textureData();
+
+    QRawFontPrivate *fontD = QRawFontPrivate::get(m_font);
+    m_glyphCount = fontD->fontEngine->glyphCount();
+
+    m_textureData->doubleGlyphResolution = fontHasNarrowOutlines(font) && m_glyphCount < QT_DISTANCEFIELD_HIGHGLYPHCOUNT;
+
+    m_referenceFont = m_font;
+    m_referenceFont.setPixelSize(QT_DISTANCEFIELD_BASEFONTSIZE);
+    Q_ASSERT(m_referenceFont.isValid());
+
+    m_vertexCoordinateArray[0] = -1.0f;
+    m_vertexCoordinateArray[1] = -1.0f;
+    m_vertexCoordinateArray[2] =  1.0f;
+    m_vertexCoordinateArray[3] = -1.0f;
+    m_vertexCoordinateArray[4] =  1.0f;
+    m_vertexCoordinateArray[5] =  1.0f;
+    m_vertexCoordinateArray[6] = -1.0f;
+    m_vertexCoordinateArray[7] =  1.0f;
+
+    m_textureCoordinateArray[0] = 0.0f;
+    m_textureCoordinateArray[1] = 0.0f;
+    m_textureCoordinateArray[2] = 1.0f;
+    m_textureCoordinateArray[3] = 0.0f;
+    m_textureCoordinateArray[4] = 1.0f;
+    m_textureCoordinateArray[5] = 1.0f;
+    m_textureCoordinateArray[6] = 0.0f;
+    m_textureCoordinateArray[7] = 1.0f;
+
+    connect(QGLSignalProxy::instance(), SIGNAL(aboutToDestroyContext(const QGLContext*)),
+            this, SLOT(onContextDestroyed(const QGLContext*)));
+}
+
+QSGDistanceFieldGlyphCache::~QSGDistanceFieldGlyphCache()
+{
+    delete m_blitProgram;
+}
+
+void QSGDistanceFieldGlyphCache::onContextDestroyed(const QGLContext *context)
+{
+    if (context != ctx)
+        return;
+
+    QString key = QString::number(long(context), 16) + fontKey(m_font);
+    m_caches.remove(key);
+    deleteLater();
+}
+
+GLuint QSGDistanceFieldGlyphCache::texture()
+{
+    return m_textureData->texture;
+}
+
+QSize QSGDistanceFieldGlyphCache::textureSize() const
+{
+    return m_textureData->size;
+}
+
+int QSGDistanceFieldGlyphCache::maxTextureSize() const
+{
+    if (!m_maxTextureSize)
+        glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize);
+    return m_maxTextureSize;
+}
+
+QSGDistanceFieldGlyphCache::Metrics QSGDistanceFieldGlyphCache::glyphMetrics(glyph_t glyph)
+{
+    QHash<glyph_t, Metrics>::iterator metric = m_metrics.find(glyph);
+    if (metric == m_metrics.end()) {
+        QPainterPath path = m_font.pathForGlyph(glyph);
+
+        Metrics m;
+        m.width = path.boundingRect().width();
+        m.height = path.boundingRect().height();
+        m.baselineX = path.boundingRect().x();
+        m.baselineY = -path.boundingRect().y();
+
+        metric = m_metrics.insert(glyph, m);
+    }
+
+    return metric.value();
+}
+
+QSGDistanceFieldGlyphCache::TexCoord QSGDistanceFieldGlyphCache::glyphTexCoord(glyph_t glyph)
+{
+    return m_textureData->texCoords.value(glyph);
+}
+
+QImage QSGDistanceFieldGlyphCache::renderDistanceFieldGlyph(glyph_t glyph) const
+{
+    QRawFont renderFont = m_font;
+    renderFont.setPixelSize(QT_DISTANCEFIELD_BASEFONTSIZE * QT_DISTANCEFIELD_SCALE);
+
+    QPainterPath path = renderFont.pathForGlyph(glyph);
+    path.translate(-path.boundingRect().topLeft());
+    path.setFillRule(Qt::WindingFill);
+
+    QImage im = makeDistanceField(QT_DISTANCEFIELD_TILESIZE,
+                                  path,
+                                  QT_DISTANCEFIELD_SCALE,
+                                  QT_DISTANCEFIELD_RADIUS / qreal(QT_DISTANCEFIELD_SCALE));
+    return im;
+}
+
+qreal QSGDistanceFieldGlyphCache::fontScale() const
+{
+    return qreal(m_font.pixelSize()) / QT_DISTANCEFIELD_BASEFONTSIZE;
+}
+
+int QSGDistanceFieldGlyphCache::distanceFieldRadius() const
+{
+    return QT_DISTANCEFIELD_DEFAULT_RADIUS / QT_DISTANCEFIELD_SCALE;
+}
+
+void QSGDistanceFieldGlyphCache::populate(int count, const glyph_t *glyphs)
+{
+    for (int i = 0; i < count; ++i) {
+        glyph_t glyphIndex = glyphs[i];
+        if (glyphIndex >= glyphCount()) {
+            qWarning("Warning: distance-field glyph is not available with index %d", glyphIndex);
+            continue;
+        }
+
+        if (++m_textureData->glyphRefCount[glyphIndex] == 1)
+            m_textureData->unusedGlyphs.remove(glyphIndex);
+
+        if (m_textureData->texCoords.contains(glyphIndex)
+                || (cacheIsFull() && m_textureData->unusedGlyphs.isEmpty()))
+            continue;
+
+        QPainterPath path = m_referenceFont.pathForGlyph(glyphIndex);
+        if (path.isEmpty()) {
+            m_textureData->texCoords.insert(glyphIndex, TexCoord());
+            continue;
+        }
+
+        TexCoord c;
+        c.xMargin = QT_DISTANCEFIELD_RADIUS / qreal(QT_DISTANCEFIELD_SCALE);
+        c.yMargin = QT_DISTANCEFIELD_RADIUS / qreal(QT_DISTANCEFIELD_SCALE);
+        c.x = m_textureData->currX;
+        c.y = m_textureData->currY;
+        c.width = path.boundingRect().width();
+        c.height = path.boundingRect().height();
+
+        if (!cacheIsFull()) {
+            m_textureData->currX += QT_DISTANCEFIELD_TILESIZE;
+            if (m_textureData->currX >= maxTextureSize()) {
+                m_textureData->currX = 0;
+                m_textureData->currY += QT_DISTANCEFIELD_TILESIZE;
+            }
+        } else {
+            // Recycle glyphs
+            if (!m_textureData->unusedGlyphs.isEmpty()) {
+                glyph_t unusedGlyph = *m_textureData->unusedGlyphs.constBegin();
+                TexCoord unusedCoord = glyphTexCoord(unusedGlyph);
+                c.x = unusedCoord.x;
+                c.y = unusedCoord.y;
+                m_textureData->unusedGlyphs.remove(unusedGlyph);
+                m_textureData->texCoords.remove(unusedGlyph);
+            }
+        }
+
+        if (c.y < maxTextureSize()) {
+            m_textureData->texCoords.insert(glyphIndex, c);
+            m_textureData->pendingGlyphs.insert(glyphIndex);
+        }
+    }
+}
+
+void QSGDistanceFieldGlyphCache::derefGlyphs(int count, const glyph_t *glyphs)
+{
+    for (int i = 0; i < count; ++i)
+        if (--m_textureData->glyphRefCount[glyphs[i]] == 0 && !glyphTexCoord(glyphs[i]).isNull())
+            m_textureData->unusedGlyphs.insert(glyphs[i]);
+}
+
+void QSGDistanceFieldGlyphCache::createTexture(int width, int height)
+{
+    if (ctx->d_ptr->workaround_brokenFBOReadBack && m_textureData->image.isNull())
+        m_textureData->image = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
+
+    while (glGetError() != GL_NO_ERROR) { }
+
+    glGenTextures(1, &m_textureData->texture);
+    glBindTexture(GL_TEXTURE_2D, m_textureData->texture);
+
+    QVarLengthArray<uchar> data(width * height);
+    for (int i = 0; i < data.size(); ++i)
+        data[i] = 0;
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+    m_textureData->size = QSize(width, height);
+
+    GLuint error = glGetError();
+    if (error != GL_NO_ERROR) {
+        glBindTexture(GL_TEXTURE_2D, 0);
+        glDeleteTextures(1, &m_textureData->texture);
+        m_textureData->texture = 0;
+    }
+
+}
+
+void QSGDistanceFieldGlyphCache::resizeTexture(int width, int height)
+{
+    int oldWidth = m_textureData->size.width();
+    int oldHeight = m_textureData->size.height();
+    if (width == oldWidth && height == oldHeight)
+        return;
+
+    GLuint oldTexture = m_textureData->texture;
+    createTexture(width, height);
+
+    if (!oldTexture)
+        return;
+
+    if (ctx->d_ptr->workaround_brokenFBOReadBack) {
+        m_textureData->image = m_textureData->image.copy(0, 0, width, height);
+        QImage copy = m_textureData->image.copy(0, 0, oldWidth, oldHeight);
+        convert_to_Format_Alpha(&copy);
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, oldWidth, oldHeight, GL_ALPHA, GL_UNSIGNED_BYTE, copy.constBits());
+        glDeleteTextures(1, &oldTexture);
+        return;
+    }
+
+    if (!m_textureData->fbo)
+        ctx->functions()->glGenFramebuffers(1, &m_textureData->fbo);
+    ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_textureData->fbo);
+
+    GLuint tmp_texture;
+    glGenTextures(1, &tmp_texture);
+    glBindTexture(GL_TEXTURE_2D, tmp_texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0,
+                 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    ctx->functions()->glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                                             GL_TEXTURE_2D, tmp_texture, 0);
+
+    ctx->functions()->glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, oldTexture);
+
+    // save current render states
+    GLboolean stencilTestEnabled;
+    GLboolean depthTestEnabled;
+    GLboolean scissorTestEnabled;
+    GLboolean blendEnabled;
+    GLint viewport[4];
+    glGetBooleanv(GL_STENCIL_TEST, &stencilTestEnabled);
+    glGetBooleanv(GL_DEPTH_TEST, &depthTestEnabled);
+    glGetBooleanv(GL_SCISSOR_TEST, &scissorTestEnabled);
+    glGetBooleanv(GL_BLEND, &blendEnabled);
+    glGetIntegerv(GL_VIEWPORT, &viewport[0]);
+
+    glDisable(GL_STENCIL_TEST);
+    glDisable(GL_DEPTH_TEST);
+    glDisable(GL_SCISSOR_TEST);
+    glDisable(GL_BLEND);
+
+    glViewport(0, 0, oldWidth, oldHeight);
+
+    if (m_blitProgram == 0) {
+        m_blitProgram = new QGLShaderProgram;
+
+        {
+            QString source;
+            source.append(QLatin1String(qglslMainWithTexCoordsVertexShader));
+            source.append(QLatin1String(qglslUntransformedPositionVertexShader));
+
+            QGLShader *vertexShader = new QGLShader(QGLShader::Vertex, m_blitProgram);
+            vertexShader->compileSourceCode(source);
+
+            m_blitProgram->addShader(vertexShader);
+        }
+
+        {
+            QString source;
+            source.append(QLatin1String(qglslMainFragmentShader));
+            source.append(QLatin1String(qglslImageSrcFragmentShader));
+
+            QGLShader *fragmentShader = new QGLShader(QGLShader::Fragment, m_blitProgram);
+            fragmentShader->compileSourceCode(source);
+
+            m_blitProgram->addShader(fragmentShader);
+        }
+
+        m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+        m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+
+        m_blitProgram->link();
+    }
+
+    ctx->functions()->glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_vertexCoordinateArray);
+    ctx->functions()->glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_textureCoordinateArray);
+
+    m_blitProgram->bind();
+    m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+    m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+    m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
+    m_blitProgram->setUniformValue("imageTexture", GLuint(0));
+
+    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+    glBindTexture(GL_TEXTURE_2D, m_textureData->texture);
+
+    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);
+
+    ctx->functions()->glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                                                GL_RENDERBUFFER_EXT, 0);
+    glDeleteTextures(1, &tmp_texture);
+    glDeleteTextures(1, &oldTexture);
+
+    ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
+
+    // restore render states
+    if (stencilTestEnabled)
+        glEnable(GL_STENCIL_TEST);
+    if (depthTestEnabled)
+        glEnable(GL_DEPTH_TEST);
+    if (scissorTestEnabled)
+        glEnable(GL_SCISSOR_TEST);
+    if (blendEnabled)
+        glEnable(GL_BLEND);
+    glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+}
+
+void QSGDistanceFieldGlyphCache::updateCache()
+{
+    if (m_textureData->pendingGlyphs.isEmpty())
+        return;
+
+    int requiredWidth = m_textureData->currY == 0 ? m_textureData->currX : maxTextureSize();
+    int requiredHeight = qMin(maxTextureSize(), m_textureData->currY + QT_DISTANCEFIELD_TILESIZE);
+
+    resizeTexture((requiredWidth), (requiredHeight));
+    glBindTexture(GL_TEXTURE_2D, m_textureData->texture);
+
+    QSet<glyph_t>::const_iterator i = m_textureData->pendingGlyphs.constBegin();
+    for (; i != m_textureData->pendingGlyphs.constEnd(); ++i) {
+        QImage glyph = renderDistanceFieldGlyph(*i);
+        TexCoord c = m_textureData->texCoords.value(*i);
+
+        if (ctx->d_ptr->workaround_brokenFBOReadBack) {
+            QPainter p(&m_textureData->image);
+            p.setCompositionMode(QPainter::CompositionMode_Source);
+            p.drawImage(c.x, c.y, glyph);
+            p.end();
+        }
+
+        convert_to_Format_Alpha(&glyph);
+        glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, glyph.width(), glyph.height(), GL_ALPHA, GL_UNSIGNED_BYTE, glyph.constBits());
+    }
+    m_textureData->pendingGlyphs.clear();
+}
+
+bool QSGDistanceFieldGlyphCache::useWorkaroundBrokenFBOReadback() const
+{
+    return ctx->d_ptr->workaround_brokenFBOReadBack;
+}
+
+bool QSGDistanceFieldGlyphCache::distanceFieldEnabled()
+{
+    return !disableDistanceField();
+}
+
+int QSGDistanceFieldGlyphCache::glyphCount() const
+{
+    return m_glyphCount;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h b/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h
new file mode 100644
index 0000000000..60e5b5921a
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DISTANCEFIELDGLYPHCACHE_H
+#define DISTANCEFIELDGLYPHCACHE_H
+
+#include <qgl.h>
+#include <qrawfont.h>
+#include <private/qgl_p.h>
+#include <private/qfont_p.h>
+#include <private/qfontengine_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGLShaderProgram;
+
+class Q_DECLARATIVE_EXPORT QSGDistanceFieldGlyphCache : public QObject
+{
+    Q_OBJECT
+public:
+    ~QSGDistanceFieldGlyphCache();
+
+    static QSGDistanceFieldGlyphCache *get(const QGLContext *ctx, const QRawFont &font);
+
+    struct Metrics {
+        qreal width;
+        qreal height;
+        qreal baselineX;
+        qreal baselineY;
+
+        bool isNull() const { return width == 0 || height == 0; }
+    };
+    Metrics glyphMetrics(glyph_t glyph);
+
+    struct TexCoord {
+        qreal x;
+        qreal y;
+        qreal width;
+        qreal height;
+        qreal xMargin;
+        qreal yMargin;
+
+        TexCoord() : x(0), y(0), width(0), height(0), xMargin(0), yMargin(0) { }
+
+        bool isNull() const { return width == 0 || height == 0; }
+    };
+    TexCoord glyphTexCoord(glyph_t glyph);
+
+    GLuint texture();
+    QSize textureSize() const;
+    int maxTextureSize() const;
+    qreal fontScale() const;
+    int distanceFieldRadius() const;
+    QImage renderDistanceFieldGlyph(glyph_t glyph) const;
+
+    int glyphCount() const;
+
+    void populate(int count, const glyph_t *glyphs);
+    void derefGlyphs(int count, const glyph_t *glyphs);
+    void updateCache();
+
+    bool cacheIsFull() const { return m_textureData->currY >= maxTextureSize(); }
+
+    bool useWorkaroundBrokenFBOReadback() const;
+
+    static bool distanceFieldEnabled();
+
+private Q_SLOTS:
+    void onContextDestroyed(const QGLContext *context);
+
+private:
+    QSGDistanceFieldGlyphCache(const QGLContext *c, const QRawFont &font);
+
+    void createTexture(int width, int height);
+    void resizeTexture(int width, int height);
+
+    static QHash<QString, QSGDistanceFieldGlyphCache *> m_caches;
+
+    QRawFont m_font;
+    QRawFont m_referenceFont;
+
+    QString m_distanceFieldKey;
+    int m_glyphCount;
+    QHash<glyph_t, Metrics> m_metrics;
+    mutable int m_maxTextureSize;
+
+    struct DistanceFieldTextureData {
+        GLuint texture;
+        GLuint fbo;
+        QSize size;
+        QHash<glyph_t, TexCoord> texCoords;
+        QSet<glyph_t> pendingGlyphs;
+        QHash<glyph_t, quint32> glyphRefCount;
+        QSet<glyph_t> unusedGlyphs;
+        int currX;
+        int currY;
+        QImage image;
+        bool doubleGlyphResolution;
+
+        DistanceFieldTextureData(const QGLContext *)
+            : texture(0)
+            , fbo(0)
+            , currX(0)
+            , currY(0)
+            , doubleGlyphResolution(false)
+        { }
+    };
+    DistanceFieldTextureData *textureData();
+    DistanceFieldTextureData *m_textureData;
+    static QHash<QString, QGLContextGroupResource<DistanceFieldTextureData> > m_textures_data;
+
+    const QGLContext *ctx;
+    QGLShaderProgram *m_blitProgram;
+    GLfloat m_vertexCoordinateArray[8];
+    GLfloat m_textureCoordinateArray[8];
+
+};
+
+QT_END_NAMESPACE
+
+#endif // DISTANCEFIELDGLYPHCACHE_H
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphnode.cpp b/src/declarative/scenegraph/qsgdistancefieldglyphnode.cpp
new file mode 100644
index 0000000000..ed2dba1ea3
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphnode.cpp
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdistancefieldglyphnode_p.h"
+#include "qsgdistancefieldglyphnode_p_p.h"
+#include "qsgdistancefieldglyphcache_p.h"
+#include <private/qsgcontext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGDistanceFieldGlyphNode::QSGDistanceFieldGlyphNode()
+    : m_material(0)
+    , m_glyph_cache(0)
+    , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
+    , m_style(QSGText::Normal)
+    , m_antialiasingMode(GrayAntialiasing)
+{
+    m_geometry.setDrawingMode(GL_TRIANGLES);
+    setGeometry(&m_geometry);
+
+#ifndef QT_OPENGL_ES
+    setPreferredAntialiasingMode(QSGGlyphNode::SubPixelAntialiasing);
+#endif
+}
+
+QSGDistanceFieldGlyphNode::~QSGDistanceFieldGlyphNode()
+{
+    delete m_material;
+    if (m_glyph_cache) {
+        const QVector<quint32> &glyphIndexes = m_glyphs.glyphIndexes();
+        m_glyph_cache->derefGlyphs(glyphIndexes.count(), glyphIndexes.constData());
+    }
+}
+
+void QSGDistanceFieldGlyphNode::setColor(const QColor &color)
+{
+    m_color = color;
+    if (m_material != 0) {
+        m_material->setColor(color);
+        setMaterial(m_material); // Indicate the material state has changed
+    }
+}
+
+void QSGDistanceFieldGlyphNode::setPreferredAntialiasingMode(AntialiasingMode mode)
+{
+    if (mode == m_antialiasingMode)
+        return;
+    m_antialiasingMode = mode;
+    updateMaterial();
+}
+
+void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphs &glyphs)
+{
+    QRawFont font = glyphs.font();
+    m_position = QPointF(position.x(), position.y() - font.ascent());
+    m_glyphs = glyphs;
+
+    updateFont();
+    updateGeometry();
+    updateMaterial();
+
+#ifdef QML_RUNTIME_TESTING
+    description = QLatin1String("glyphs");
+#endif
+}
+
+void QSGDistanceFieldGlyphNode::setStyle(QSGText::TextStyle style)
+{
+    m_style = style;
+}
+
+void QSGDistanceFieldGlyphNode::setStyleColor(const QColor &color)
+{
+    m_styleColor = color;
+}
+
+void QSGDistanceFieldGlyphNode::updateGeometry()
+{
+    Q_ASSERT(m_glyph_cache);
+
+    QSGGeometry *g = geometry();
+    QRectF boundingRect;
+
+    const QVector<quint32> &glyphIndexes = m_glyphs.glyphIndexes();
+
+    m_glyph_cache->populate(glyphIndexes.count(), glyphIndexes.constData());
+
+    Q_ASSERT(g->indexType() == GL_UNSIGNED_SHORT);
+    g->allocate(glyphIndexes.size() * 4, glyphIndexes.size() * 6);
+    QVector4D *vp = (QVector4D *)g->vertexData();
+    ushort *ip = g->indexDataAsUShort();
+
+    QPointF margins(2, 2);
+    QPointF texMargins = margins / m_glyph_cache->fontScale();
+
+    for (int i = 0; i < glyphIndexes.size(); ++i) {
+        quint32 glyphIndex = glyphIndexes.at(i);
+        QSGDistanceFieldGlyphCache::Metrics metrics = m_glyph_cache->glyphMetrics(glyphIndex);
+        QSGDistanceFieldGlyphCache::TexCoord c = m_glyph_cache->glyphTexCoord(glyphIndex);
+
+        if (!metrics.isNull() && !c.isNull()) {
+                metrics.width += margins.x() * 2;
+                metrics.height += margins.y() * 2;
+                metrics.baselineX -= margins.x();
+                metrics.baselineY += margins.y();
+                c.xMargin -= texMargins.x();
+                c.yMargin -= texMargins.y();
+                c.width += texMargins.x() * 2;
+                c.height += texMargins.y() * 2;
+        }
+
+        QPointF glyphPosition = m_glyphs.positions().at(i) + m_position;
+        qreal x = glyphPosition.x() + metrics.baselineX;
+        qreal y = glyphPosition.y() - metrics.baselineY;
+
+        boundingRect |= QRectF(x, y, metrics.width, metrics.height);
+
+        float cx1 = x;
+        float cx2 = x + metrics.width;
+        float cy1 = y;
+        float cy2 = y + metrics.height;
+
+        float tx1 = c.x + c.xMargin;
+        float tx2 = tx1 + c.width;
+        float ty1 = c.y + c.yMargin;
+        float ty2 = ty1 + c.height;
+
+        if (m_baseLine.isNull())
+            m_baseLine = glyphPosition;
+
+        int vi = i & 1 ? (glyphIndexes.size() + 1) / 2 + i / 2 : i / 2;
+        vp[4 * vi + 0] = QVector4D(cx1, cy1, tx1, ty1);
+        vp[4 * vi + 1] = QVector4D(cx2, cy1, tx2, ty1);
+        vp[4 * vi + 2] = QVector4D(cx1, cy2, tx1, ty2);
+        vp[4 * vi + 3] = QVector4D(cx2, cy2, tx2, ty2);
+
+        int o = i * 4;
+        ip[6 * i + 0] = o + 0;
+        ip[6 * i + 1] = o + 2;
+        ip[6 * i + 2] = o + 3;
+        ip[6 * i + 3] = o + 3;
+        ip[6 * i + 4] = o + 1;
+        ip[6 * i + 5] = o + 0;
+    }
+
+    setBoundingRect(boundingRect);
+    markDirty(DirtyGeometry);
+}
+
+void QSGDistanceFieldGlyphNode::updateFont()
+{
+    m_glyph_cache = QSGDistanceFieldGlyphCache::get(QGLContext::currentContext(), m_glyphs.font());
+}
+
+void QSGDistanceFieldGlyphNode::updateMaterial()
+{
+    delete m_material;
+
+    if (m_style == QSGText::Normal) {
+        if (m_antialiasingMode == SubPixelAntialiasing)
+            m_material = new QSGSubPixelDistanceFieldTextMaterial;
+        else
+            m_material = new QSGDistanceFieldTextMaterial;
+    } else {
+        QSGDistanceFieldStyledTextMaterial *material;
+        if (m_style == QSGText::Outline) {
+            material = new QSGDistanceFieldOutlineTextMaterial;
+        } else {
+            QSGDistanceFieldShiftedStyleTextMaterial *sMaterial = new QSGDistanceFieldShiftedStyleTextMaterial;
+            if (m_style == QSGText::Raised)
+                sMaterial->setShift(QPointF(0.0, 1.0));
+            else
+                sMaterial->setShift(QPointF(0.0, -1.0));
+            material = sMaterial;
+        }
+        material->setStyleColor(m_styleColor);
+        m_material = material;
+    }
+
+    m_material->setGlyphCache(m_glyph_cache);
+    m_material->setColor(m_color);
+    setMaterial(m_material);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.cpp b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.cpp
new file mode 100644
index 0000000000..e332434138
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.cpp
@@ -0,0 +1,656 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgdistancefieldglyphnode_p_p.h"
+#include "qsgdistancefieldglyphcache_p.h"
+#include <private/qsgtexture_p.h>
+#include <QtOpenGL/qglfunctions.h>
+#include <qmath.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGDistanceFieldTextMaterialShader : public QSGMaterialShader
+{
+public:
+    QSGDistanceFieldTextMaterialShader();
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+
+protected:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    void updateAlphaRange();
+
+    qreal m_fontScale;
+    qreal m_matrixScale;
+
+    int m_matrix_id;
+    int m_textureScale_id;
+    int m_alphaMin_id;
+    int m_alphaMax_id;
+    int m_color_id;
+};
+
+const char *QSGDistanceFieldTextMaterialShader::vertexShader() const {
+    return
+        "uniform highp mat4 matrix;                     \n"
+        "uniform highp vec2 textureScale;               \n"
+        "attribute highp vec4 vCoord;                   \n"
+        "attribute highp vec2 tCoord;                   \n"
+        "varying highp vec2 sampleCoord;                \n"
+        "void main() {                                  \n"
+        "     sampleCoord = tCoord * textureScale;      \n"
+        "     gl_Position = matrix * vCoord;            \n"
+        "}";
+}
+
+const char *QSGDistanceFieldTextMaterialShader::fragmentShader() const {
+    return
+        "varying highp vec2 sampleCoord;                                             \n"
+        "uniform sampler2D texture;                                                  \n"
+        "uniform lowp vec4 color;                                                    \n"
+        "uniform highp float alphaMin;                                               \n"
+        "uniform highp float alphaMax;                                               \n"
+        "void main() {                                                               \n"
+        "    gl_FragColor = color * smoothstep(alphaMin,                             \n"
+        "                                      alphaMax,                             \n"
+        "                                      texture2D(texture, sampleCoord).a);   \n"
+        "}";
+}
+
+char const *const *QSGDistanceFieldTextMaterialShader::attributeNames() const {
+    static char const *const attr[] = { "vCoord", "tCoord", 0 };
+    return attr;
+}
+
+QSGDistanceFieldTextMaterialShader::QSGDistanceFieldTextMaterialShader()
+    : m_fontScale(1.0)
+    , m_matrixScale(1.0)
+{
+}
+
+void QSGDistanceFieldTextMaterialShader::updateAlphaRange()
+{
+    qreal combinedScale = m_fontScale * m_matrixScale;
+    qreal alphaMin = qMax(0.0, 0.5 - 0.07 / combinedScale);
+    qreal alphaMax = qMin(0.5 + 0.07 / combinedScale, 1.0);
+    m_program.setUniformValue(m_alphaMin_id, GLfloat(alphaMin));
+    m_program.setUniformValue(m_alphaMax_id, GLfloat(alphaMax));
+}
+
+void QSGDistanceFieldTextMaterialShader::initialize()
+{
+    QSGMaterialShader::initialize();
+    m_matrix_id = m_program.uniformLocation("matrix");
+    m_textureScale_id = m_program.uniformLocation("textureScale");
+    m_color_id = m_program.uniformLocation("color");
+    m_alphaMin_id = m_program.uniformLocation("alphaMin");
+    m_alphaMax_id = m_program.uniformLocation("alphaMax");
+}
+
+void QSGDistanceFieldTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+    QSGDistanceFieldTextMaterial *material = static_cast<QSGDistanceFieldTextMaterial *>(newEffect);
+    QSGDistanceFieldTextMaterial *oldMaterial = static_cast<QSGDistanceFieldTextMaterial *>(oldEffect);
+
+    bool updated = material->updateTexture();
+    if (updated && !material->glyphCache()->useWorkaroundBrokenFBOReadback())
+        activate();
+
+    if (oldMaterial == 0
+           || material->color() != oldMaterial->color()
+           || state.isOpacityDirty()) {
+        QVector4D color(material->color().redF(), material->color().greenF(),
+                        material->color().blueF(), material->color().alphaF());
+        color *= state.opacity();
+        m_program.setUniformValue(m_color_id, color);
+    }
+
+    bool updateRange = false;
+    if (oldMaterial == 0
+            || material->glyphCache()->fontScale() != oldMaterial->glyphCache()->fontScale()) {
+        m_fontScale = material->glyphCache()->fontScale();
+        updateRange = true;
+    }
+    if (state.isMatrixDirty()) {
+        m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+        m_matrixScale = qSqrt(state.modelViewMatrix().determinant());
+        updateRange = true;
+    }
+    if (updateRange)
+        updateAlphaRange();
+
+    Q_ASSERT(material->glyphCache());
+
+    if (updated
+            || oldMaterial == 0
+            || oldMaterial->glyphCache()->texture() != material->glyphCache()->texture()) {
+        m_program.setUniformValue(m_textureScale_id, QVector2D(1.0 / material->glyphCache()->textureSize().width(),
+                                                               1.0 / material->glyphCache()->textureSize().height()));
+        glBindTexture(GL_TEXTURE_2D, material->glyphCache()->texture());
+
+        if (updated) {
+            // Set the mag/min filters to be linear. We only need to do this when the texture
+            // has been recreated.
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        }
+    }
+}
+
+QSGDistanceFieldTextMaterial::QSGDistanceFieldTextMaterial()
+    : m_glyph_cache(0)
+{
+   setFlag(Blending, true);
+}
+
+QSGDistanceFieldTextMaterial::~QSGDistanceFieldTextMaterial()
+{
+}
+
+QSGMaterialType *QSGDistanceFieldTextMaterial::type() const
+{
+    static QSGMaterialType type;
+    return &type;
+}
+
+QSGMaterialShader *QSGDistanceFieldTextMaterial::createShader() const
+{
+    return new QSGDistanceFieldTextMaterialShader;
+}
+
+bool QSGDistanceFieldTextMaterial::updateTexture()
+{
+    m_glyph_cache->updateCache();
+    QSize glyphCacheSize = m_glyph_cache->textureSize();
+    if (glyphCacheSize != m_size) {
+        m_size = glyphCacheSize;
+
+        return true;
+    } else {
+        return false;
+    }
+}
+
+int QSGDistanceFieldTextMaterial::compare(const QSGMaterial *o) const
+{
+    Q_ASSERT(o && type() == o->type());
+    const QSGDistanceFieldTextMaterial *other = static_cast<const QSGDistanceFieldTextMaterial *>(o);
+    if (m_glyph_cache->fontScale() != other->m_glyph_cache->fontScale()) {
+        qreal s1 = m_glyph_cache->fontScale();
+        qreal s2 = other->m_glyph_cache->fontScale();
+        return int(s2 < s1) - int(s1 < s2);
+    }
+    QRgb c1 = m_color.rgba();
+    QRgb c2 = other->m_color.rgba();
+    return int(c2 < c1) - int(c1 < c2);
+}
+
+
+class DistanceFieldStyledTextMaterialShader : public QSGDistanceFieldTextMaterialShader
+{
+public:
+    DistanceFieldStyledTextMaterialShader();
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+
+protected:
+    virtual void initialize();
+    virtual const char *fragmentShader() const = 0;
+
+    int m_styleColor_id;
+};
+
+DistanceFieldStyledTextMaterialShader::DistanceFieldStyledTextMaterialShader()
+    : QSGDistanceFieldTextMaterialShader()
+{
+}
+
+void DistanceFieldStyledTextMaterialShader::initialize()
+{
+    QSGDistanceFieldTextMaterialShader::initialize();
+    m_styleColor_id = m_program.uniformLocation("styleColor");
+}
+
+void DistanceFieldStyledTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    QSGDistanceFieldTextMaterialShader::updateState(state, newEffect, oldEffect);
+
+    QSGDistanceFieldStyledTextMaterial *material = static_cast<QSGDistanceFieldStyledTextMaterial *>(newEffect);
+    QSGDistanceFieldStyledTextMaterial *oldMaterial = static_cast<QSGDistanceFieldStyledTextMaterial *>(oldEffect);
+
+    if (oldMaterial == 0
+           || material->styleColor() != oldMaterial->styleColor()
+           || (state.isOpacityDirty())) {
+        QVector4D color(material->styleColor().redF(), material->styleColor().greenF(),
+                        material->styleColor().blueF(), material->styleColor().alphaF());
+        color *= state.opacity();
+        m_program.setUniformValue(m_styleColor_id, color);
+    }
+}
+
+QSGDistanceFieldStyledTextMaterial::QSGDistanceFieldStyledTextMaterial()
+    : QSGDistanceFieldTextMaterial()
+{
+}
+
+QSGDistanceFieldStyledTextMaterial::~QSGDistanceFieldStyledTextMaterial()
+{
+}
+
+int QSGDistanceFieldStyledTextMaterial::compare(const QSGMaterial *o) const
+{
+    Q_ASSERT(o && type() == o->type());
+    const QSGDistanceFieldStyledTextMaterial *other = static_cast<const QSGDistanceFieldStyledTextMaterial *>(o);
+    if (m_styleColor != other->m_styleColor) {
+        QRgb c1 = m_styleColor.rgba();
+        QRgb c2 = other->m_styleColor.rgba();
+        return int(c2 < c1) - int(c1 < c2);
+    }
+    return QSGDistanceFieldTextMaterial::compare(o);
+}
+
+
+class DistanceFieldOutlineTextMaterialShader : public DistanceFieldStyledTextMaterialShader
+{
+public:
+    DistanceFieldOutlineTextMaterialShader();
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+
+protected:
+    virtual void initialize();
+    virtual const char *fragmentShader() const;
+
+    void updateOutlineAlphaRange(int dfRadius);
+
+    int m_outlineAlphaMax0_id;
+    int m_outlineAlphaMax1_id;
+};
+
+const char *DistanceFieldOutlineTextMaterialShader::fragmentShader() const {
+    return
+            "varying highp vec2 sampleCoord;                                                      \n"
+            "uniform sampler2D texture;                                                           \n"
+            "uniform lowp vec4 color;                                                             \n"
+            "uniform lowp vec4 styleColor;                                                        \n"
+            "uniform highp float alphaMin;                                                        \n"
+            "uniform highp float alphaMax;                                                        \n"
+            "uniform highp float outlineAlphaMax0;                                                \n"
+            "uniform highp float outlineAlphaMax1;                                                \n"
+            "void main() {                                                                        \n"
+            "    mediump float d = texture2D(texture, sampleCoord).a;                             \n"
+            "    gl_FragColor = mix(styleColor, color, smoothstep(alphaMin, alphaMax, d))         \n"
+            "                       * smoothstep(outlineAlphaMax0, outlineAlphaMax1, d);          \n"
+            "}";
+}
+
+DistanceFieldOutlineTextMaterialShader::DistanceFieldOutlineTextMaterialShader()
+    : DistanceFieldStyledTextMaterialShader()
+{
+}
+
+void DistanceFieldOutlineTextMaterialShader::initialize()
+{
+    DistanceFieldStyledTextMaterialShader::initialize();
+    m_outlineAlphaMax0_id = m_program.uniformLocation("outlineAlphaMax0");
+    m_outlineAlphaMax1_id = m_program.uniformLocation("outlineAlphaMax1");
+}
+
+void DistanceFieldOutlineTextMaterialShader::updateOutlineAlphaRange(int dfRadius)
+{
+    qreal outlineLimit = qMax(qreal(0.2), qreal(0.5 - 0.5 / dfRadius / m_fontScale));
+
+    qreal combinedScale = m_fontScale * m_matrixScale;
+    qreal alphaMin = qMax(0.0, 0.5 - 0.07 / combinedScale);
+    qreal styleAlphaMin0 = qMax(0.0, outlineLimit - 0.07 / combinedScale);
+    qreal styleAlphaMin1 = qMin(qreal(outlineLimit + 0.07 / combinedScale), alphaMin);
+    m_program.setUniformValue(m_outlineAlphaMax0_id, GLfloat(styleAlphaMin0));
+    m_program.setUniformValue(m_outlineAlphaMax1_id, GLfloat(styleAlphaMin1));
+}
+
+void DistanceFieldOutlineTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    DistanceFieldStyledTextMaterialShader::updateState(state, newEffect, oldEffect);
+
+    QSGDistanceFieldOutlineTextMaterial *material = static_cast<QSGDistanceFieldOutlineTextMaterial *>(newEffect);
+    QSGDistanceFieldOutlineTextMaterial *oldMaterial = static_cast<QSGDistanceFieldOutlineTextMaterial *>(oldEffect);
+
+    if (oldMaterial == 0
+            || material->glyphCache()->fontScale() != oldMaterial->glyphCache()->fontScale()
+            || state.isMatrixDirty())
+        updateOutlineAlphaRange(material->glyphCache()->distanceFieldRadius());
+}
+
+
+QSGDistanceFieldOutlineTextMaterial::QSGDistanceFieldOutlineTextMaterial()
+    : QSGDistanceFieldStyledTextMaterial()
+{
+}
+
+QSGDistanceFieldOutlineTextMaterial::~QSGDistanceFieldOutlineTextMaterial()
+{
+}
+
+QSGMaterialType *QSGDistanceFieldOutlineTextMaterial::type() const
+{
+    static QSGMaterialType type;
+    return &type;
+}
+
+QSGMaterialShader *QSGDistanceFieldOutlineTextMaterial::createShader() const
+{
+    return new DistanceFieldOutlineTextMaterialShader;
+}
+
+
+class DistanceFieldShiftedStyleTextMaterialShader : public DistanceFieldStyledTextMaterialShader
+{
+public:
+    DistanceFieldShiftedStyleTextMaterialShader();
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+
+protected:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    void updateShift(const QSGDistanceFieldGlyphCache *cache, const QPointF& shift);
+
+    int m_shift_id;
+};
+
+DistanceFieldShiftedStyleTextMaterialShader::DistanceFieldShiftedStyleTextMaterialShader()
+    : DistanceFieldStyledTextMaterialShader()
+{
+}
+
+void DistanceFieldShiftedStyleTextMaterialShader::initialize()
+{
+    DistanceFieldStyledTextMaterialShader::initialize();
+    m_shift_id = m_program.uniformLocation("shift");
+}
+
+void DistanceFieldShiftedStyleTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    DistanceFieldStyledTextMaterialShader::updateState(state, newEffect, oldEffect);
+
+    QSGDistanceFieldShiftedStyleTextMaterial *material = static_cast<QSGDistanceFieldShiftedStyleTextMaterial *>(newEffect);
+    QSGDistanceFieldShiftedStyleTextMaterial *oldMaterial = static_cast<QSGDistanceFieldShiftedStyleTextMaterial *>(oldEffect);
+
+    if (oldMaterial == 0
+            || oldMaterial->glyphCache()->fontScale() != material->glyphCache()->fontScale()
+            || oldMaterial->shift() != material->shift()
+            || oldMaterial->glyphCache()->textureSize() != material->glyphCache()->textureSize()) {
+        updateShift(material->glyphCache(), material->shift());
+    }
+}
+
+void DistanceFieldShiftedStyleTextMaterialShader::updateShift(const QSGDistanceFieldGlyphCache *cache, const QPointF &shift)
+{
+    QPointF texel(1.0 / cache->fontScale() * shift.x(),
+                  1.0 / cache->fontScale() * shift.y());
+    m_program.setUniformValue(m_shift_id, texel);
+}
+
+const char *DistanceFieldShiftedStyleTextMaterialShader::vertexShader() const
+{
+    return
+            "uniform highp mat4 matrix;                                 \n"
+            "uniform highp vec2 textureScale;                           \n"
+            "attribute highp vec4 vCoord;                               \n"
+            "attribute highp vec2 tCoord;                               \n"
+            "uniform highp vec2 shift;                                  \n"
+            "varying highp vec2 sampleCoord;                            \n"
+            "varying highp vec2 shiftedSampleCoord;                     \n"
+            "void main() {                                              \n"
+            "     sampleCoord = tCoord * textureScale;                  \n"
+            "     shiftedSampleCoord = (tCoord - shift) * textureScale; \n"
+            "     gl_Position = matrix * vCoord;                        \n"
+            "}";
+}
+
+const char *DistanceFieldShiftedStyleTextMaterialShader::fragmentShader() const {
+    return
+            "varying highp vec2 sampleCoord;                                                       \n"
+            "varying highp vec2 shiftedSampleCoord;                                                \n"
+            "uniform sampler2D texture;                                                            \n"
+            "uniform lowp vec4 color;                                                              \n"
+            "uniform lowp vec4 styleColor;                                                         \n"
+            "uniform highp float alphaMin;                                                         \n"
+            "uniform highp float alphaMax;                                                         \n"
+            "void main() {                                                                         \n"
+            "    highp float a = smoothstep(alphaMin, alphaMax, texture2D(texture, sampleCoord).a);\n"
+            "    highp vec4 shifted = styleColor * smoothstep(alphaMin,                            \n"
+            "                                                 alphaMax,                            \n"
+            "                                                 texture2D(texture, shiftedSampleCoord).a); \n"
+            "    gl_FragColor = mix(shifted, color, a);                                            \n"
+            "}";
+}
+
+QSGDistanceFieldShiftedStyleTextMaterial::QSGDistanceFieldShiftedStyleTextMaterial()
+    : QSGDistanceFieldStyledTextMaterial()
+{
+}
+
+QSGDistanceFieldShiftedStyleTextMaterial::~QSGDistanceFieldShiftedStyleTextMaterial()
+{
+}
+
+QSGMaterialType *QSGDistanceFieldShiftedStyleTextMaterial::type() const
+{
+    static QSGMaterialType type;
+    return &type;
+}
+
+QSGMaterialShader *QSGDistanceFieldShiftedStyleTextMaterial::createShader() const
+{
+    return new DistanceFieldShiftedStyleTextMaterialShader;
+}
+
+
+class QSGSubPixelDistanceFieldTextMaterialShader : public QSGDistanceFieldTextMaterialShader
+{
+public:
+    virtual void initialize();
+    virtual void activate();
+    virtual void deactivate();
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+
+protected:
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+private:
+    int m_fontScale_id;
+    int m_vecDelta_id;
+};
+
+const char *QSGSubPixelDistanceFieldTextMaterialShader::vertexShader() const {
+    return
+        "uniform highp mat4 matrix;                                             \n"
+        "uniform highp vec2 textureScale;                                       \n"
+        "uniform highp float fontScale;                                         \n"
+        "uniform highp vec4 vecDelta;                                           \n"
+        "attribute highp vec4 vCoord;                                           \n"
+        "attribute highp vec2 tCoord;                                           \n"
+        "varying highp vec2 sampleCoord;                                        \n"
+        "varying highp vec3 sampleFarLeft;                                      \n"
+        "varying highp vec3 sampleNearLeft;                                     \n"
+        "varying highp vec3 sampleNearRight;                                    \n"
+        "varying highp vec3 sampleFarRight;                                     \n"
+        "void main() {                                                          \n"
+        "     sampleCoord = tCoord * textureScale;                              \n"
+        "     gl_Position = matrix * vCoord;                                    \n"
+        // Calculate neighbour pixel position in item space.
+        "     highp vec3 wDelta = gl_Position.w * vecDelta.xyw;                 \n"
+        "     highp vec3 farLeft = vCoord.xyw - 0.667 * wDelta;                 \n"
+        "     highp vec3 nearLeft = vCoord.xyw - 0.333 * wDelta;                \n"
+        "     highp vec3 nearRight = vCoord.xyw + 0.333 * wDelta;               \n"
+        "     highp vec3 farRight = vCoord.xyw + 0.667 * wDelta;                \n"
+        // Calculate neighbour texture coordinate.
+        "     highp vec2 scale = textureScale / fontScale;                      \n"
+        "     highp vec2 base = sampleCoord - scale * vCoord.xy;                \n"
+        "     sampleFarLeft = vec3(base * farLeft.z + scale * farLeft.xy, farLeft.z); \n"
+        "     sampleNearLeft = vec3(base * nearLeft.z + scale * nearLeft.xy, nearLeft.z); \n"
+        "     sampleNearRight = vec3(base * nearRight.z + scale * nearRight.xy, nearRight.z); \n"
+        "     sampleFarRight = vec3(base * farRight.z + scale * farRight.xy, farRight.z); \n"
+        "}";
+}
+
+const char *QSGSubPixelDistanceFieldTextMaterialShader::fragmentShader() const {
+    return
+        "varying highp vec2 sampleCoord;                                        \n"
+        "varying highp vec3 sampleFarLeft;                                      \n"
+        "varying highp vec3 sampleNearLeft;                                     \n"
+        "varying highp vec3 sampleNearRight;                                    \n"
+        "varying highp vec3 sampleFarRight;                                     \n"
+        "uniform sampler2D texture;                                             \n"
+        "uniform lowp vec4 color;                                               \n"
+        "uniform highp float alphaMin;                                          \n"
+        "uniform highp float alphaMax;                                          \n"
+        "void main() {                                                          \n"
+        "    highp vec4 n;                                                      \n"
+        "    n.x = texture2DProj(texture, sampleFarLeft).a;                     \n"
+        "    n.y = texture2DProj(texture, sampleNearLeft).a;                    \n"
+        "    highp float c = texture2D(texture, sampleCoord).a;                 \n"
+        "    n.z = texture2DProj(texture, sampleNearRight).a;                   \n"
+        "    n.w = texture2DProj(texture, sampleFarRight).a;                    \n"
+#if 0
+        // Blurrier, faster.
+        "    n = smoothstep(alphaMin, alphaMax, n);                             \n"
+        "    c = smoothstep(alphaMin, alphaMax, c);                             \n"
+#else
+        // Sharper, slower.
+        "    highp vec2 d = min(abs(n.yw - n.xz) * 2., 0.67);                   \n"
+        "    highp vec2 lo = mix(vec2(alphaMin), vec2(0.5), d);                 \n"
+        "    highp vec2 hi = mix(vec2(alphaMax), vec2(0.5), d);                 \n"
+        "    n = smoothstep(lo.xxyy, hi.xxyy, n);                               \n"
+        "    c = smoothstep(lo.x + lo.y, hi.x + hi.y, 2. * c);                  \n"
+#endif
+        "    gl_FragColor = vec4(0.333 * (n.xyz + n.yzw + c), c) * color.w;     \n"
+        "}";
+}
+
+//const char *QSGSubPixelDistanceFieldTextMaterialShader::fragmentShader() const {
+//    return
+//        "#extension GL_OES_standard_derivatives: enable                         \n"
+//        "varying highp vec2 sampleCoord;                                        \n"
+//        "uniform sampler2D texture;                                             \n"
+//        "uniform lowp vec4 color;                                               \n"
+//        "uniform highp float alphaMin;                                          \n"
+//        "uniform highp float alphaMax;                                          \n"
+//        "void main() {                                                          \n"
+//        "    highp vec2 delta = dFdx(sampleCoord);                              \n"
+//        "    highp vec4 n;                                                      \n"
+//        "    n.x = texture2D(texture, sampleCoord - 0.667 * delta).a;           \n"
+//        "    n.y = texture2D(texture, sampleCoord - 0.333 * delta).a;           \n"
+//        "    highp float c = texture2D(texture, sampleCoord).a;                 \n"
+//        "    n.z = texture2D(texture, sampleCoord + 0.333 * delta).a;           \n"
+//        "    n.w = texture2D(texture, sampleCoord + 0.667 * delta).a;           \n"
+//        "    n = smoothstep(alphaMin, alphaMax, n);                             \n"
+//        "    c = smoothstep(alphaMin, alphaMax, c);                             \n"
+//        "    gl_FragColor = vec4(0.333 * (n.xyz + n.yzw + c), c) * color.w;     \n"
+//        "}";
+//}
+
+void QSGSubPixelDistanceFieldTextMaterialShader::initialize()
+{
+    QSGDistanceFieldTextMaterialShader::initialize();
+    m_fontScale_id = m_program.uniformLocation("fontScale");
+    m_vecDelta_id = m_program.uniformLocation("vecDelta");
+}
+
+void QSGSubPixelDistanceFieldTextMaterialShader::activate()
+{
+    QSGDistanceFieldTextMaterialShader::activate();
+    glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_SRC_COLOR);
+}
+
+void QSGSubPixelDistanceFieldTextMaterialShader::deactivate()
+{
+    QSGDistanceFieldTextMaterialShader::deactivate();
+    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+void QSGSubPixelDistanceFieldTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+    QSGDistanceFieldTextMaterial *material = static_cast<QSGDistanceFieldTextMaterial *>(newEffect);
+    QSGDistanceFieldTextMaterial *oldMaterial = static_cast<QSGDistanceFieldTextMaterial *>(oldEffect);
+
+    if (oldMaterial == 0 || material->color() != oldMaterial->color()) {
+        QColor c = material->color();
+        state.context()->functions()->glBlendColor(c.redF(), c.greenF(), c.blueF(), 1.0f);
+    }
+
+    if (oldMaterial == 0 || material->glyphCache()->fontScale() != oldMaterial->glyphCache()->fontScale())
+        m_program.setUniformValue(m_fontScale_id, GLfloat(material->glyphCache()->fontScale()));
+
+    if (oldMaterial == 0 || state.isMatrixDirty()) {
+        int viewportWidth = state.viewportRect().width();
+        QMatrix4x4 mat = state.combinedMatrix().inverted();
+        m_program.setUniformValue(m_vecDelta_id, mat.column(0) * (qreal(2) / viewportWidth));
+    }
+
+    QSGDistanceFieldTextMaterialShader::updateState(state, newEffect, oldEffect);
+}
+
+QSGMaterialType *QSGSubPixelDistanceFieldTextMaterial::type() const
+{
+    static QSGMaterialType type;
+    return &type;
+}
+
+QSGMaterialShader *QSGSubPixelDistanceFieldTextMaterial::createShader() const
+{
+    return new QSGSubPixelDistanceFieldTextMaterialShader;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.h b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.h
new file mode 100644
index 0000000000..d42f187af3
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DISTANCEFIELD_GLYPHNODE_H
+#define DISTANCEFIELD_GLYPHNODE_H
+
+#include <private/qsgadaptationlayer_p.h>
+#include "qsgtexture.h"
+#include <qsgtext_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGDistanceFieldGlyphCache;
+class QSGDistanceFieldTextMaterial;
+class QSGDistanceFieldGlyphNode: public QSGGlyphNode
+{
+public:
+    QSGDistanceFieldGlyphNode();
+    ~QSGDistanceFieldGlyphNode();
+
+    virtual QPointF baseLine() const { return m_baseLine; }
+    virtual void setGlyphs(const QPointF &position, const QGlyphs &glyphs);
+    virtual void setColor(const QColor &color);
+
+    virtual void setPreferredAntialiasingMode(AntialiasingMode mode);
+
+    void setStyle(QSGText::TextStyle style);
+    void setStyleColor(const QColor &color);
+
+private:
+    void updateGeometry();
+    void updateFont();
+    void updateMaterial();
+
+    QColor m_color;
+    QPointF m_baseLine;
+    QSGDistanceFieldTextMaterial *m_material;
+    QPointF m_position;
+    QGlyphs m_glyphs;
+    QSGDistanceFieldGlyphCache *m_glyph_cache;
+    QSGGeometry m_geometry;
+    QSGText::TextStyle m_style;
+    QColor m_styleColor;
+    AntialiasingMode m_antialiasingMode;
+};
+
+QT_END_HEADER
+
+QT_END_NAMESPACE
+
+#endif // DISTANCEFIELD_GLYPHNODE_H
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphnode_p_p.h b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p_p.h
new file mode 100644
index 0000000000..37415e5dae
--- /dev/null
+++ b/src/declarative/scenegraph/qsgdistancefieldglyphnode_p_p.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DISTANCEFIELDTEXTMATERIAL_H
+#define DISTANCEFIELDTEXTMATERIAL_H
+
+#include <qsgmaterial.h>
+#include "qsgdistancefieldglyphnode_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSGDistanceFieldGlyphCache;
+
+class QSGDistanceFieldTextMaterial: public QSGMaterial
+{
+public:
+    QSGDistanceFieldTextMaterial();
+    ~QSGDistanceFieldTextMaterial();
+
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const;
+
+    void setColor(const QColor &color) { m_color = color; }
+    const QColor &color() const { return m_color; }
+
+    void setGlyphCache(QSGDistanceFieldGlyphCache *a) { m_glyph_cache = a; }
+    QSGDistanceFieldGlyphCache *glyphCache() const { return m_glyph_cache; }
+
+    bool updateTexture();
+
+protected:
+    QSize m_size;
+    QColor m_color;
+    QSGDistanceFieldGlyphCache *m_glyph_cache;
+};
+
+class QSGDistanceFieldStyledTextMaterial : public QSGDistanceFieldTextMaterial
+{
+public:
+    QSGDistanceFieldStyledTextMaterial();
+    ~QSGDistanceFieldStyledTextMaterial();
+
+    virtual QSGMaterialType *type() const = 0;
+    virtual QSGMaterialShader *createShader() const = 0;
+    virtual int compare(const QSGMaterial *other) const;
+
+    void setStyleColor(const QColor &color) { m_styleColor = color; }
+    const QColor &styleColor() const { return m_styleColor; }
+
+protected:
+    QColor m_styleColor;
+};
+
+class QSGDistanceFieldOutlineTextMaterial : public QSGDistanceFieldStyledTextMaterial
+{
+public:
+    QSGDistanceFieldOutlineTextMaterial();
+    ~QSGDistanceFieldOutlineTextMaterial();
+
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+};
+
+class QSGDistanceFieldShiftedStyleTextMaterial : public QSGDistanceFieldStyledTextMaterial
+{
+public:
+    QSGDistanceFieldShiftedStyleTextMaterial();
+    ~QSGDistanceFieldShiftedStyleTextMaterial();
+
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+
+    void setShift(const QPointF &shift) { m_shift = shift; }
+    const QPointF &shift() const { return m_shift; }
+
+protected:
+    QPointF m_shift;
+};
+
+class QSGSubPixelDistanceFieldTextMaterial : public QSGDistanceFieldTextMaterial
+{
+public:
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+};
+
+QT_END_NAMESPACE
+
+#endif // DISTANCEFIELDTEXTMATERIAL_H
diff --git a/src/declarative/scenegraph/qsgflashnode.cpp b/src/declarative/scenegraph/qsgflashnode.cpp
new file mode 100644
index 0000000000..c2c1919f82
--- /dev/null
+++ b/src/declarative/scenegraph/qsgflashnode.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**Ëš
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgflashnode_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QSGFlashNode::QSGFlashNode()
+    : m_counter(1)
+{
+    setFlag(UsePreprocess);
+    setColor(QColor(rand()%56 + 200, rand()%56 + 200, rand()%156 + 100)); // A random, mostly yellow, color
+}
+
+void QSGFlashNode::preprocess()
+{
+    if (m_counter) {
+        --m_counter;
+    } else {
+        delete this;
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/qsgflashnode_p.h b/src/declarative/scenegraph/qsgflashnode_p.h
new file mode 100644
index 0000000000..776ae48f13
--- /dev/null
+++ b/src/declarative/scenegraph/qsgflashnode_p.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**Ëš
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGFLASHNODE_H
+#define QSGFLASHNODE_H
+
+#include <QSGSimpleRectNode>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGFlashNode : public QSGSimpleRectNode
+{
+public:
+    QSGFlashNode();
+
+    void preprocess();
+
+private:
+    int m_counter;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGFLASHNODE_H
+
diff --git a/src/declarative/scenegraph/scenegraph.pri b/src/declarative/scenegraph/scenegraph.pri
new file mode 100644
index 0000000000..77a93e4811
--- /dev/null
+++ b/src/declarative/scenegraph/scenegraph.pri
@@ -0,0 +1,80 @@
+INCLUDEPATH += $$PWD/coreapi $$PWD/convenience $$PWD/3d
+!contains(QT_CONFIG, egl):DEFINES += QT_NO_EGL
+
+QT += opengl
+
+
+# Core API
+HEADERS += \
+    $$PWD/coreapi/qsgdefaultrenderer_p.h \
+    $$PWD/coreapi/qsggeometry.h \
+    $$PWD/coreapi/qsgmaterial.h \
+    $$PWD/coreapi/qsgmatrix4x4stack.h \
+    $$PWD/coreapi/qsgmatrix4x4stack_p.h \
+    $$PWD/coreapi/qsgnode.h \
+    $$PWD/coreapi/qsgnodeupdater_p.h \
+    $$PWD/coreapi/qsgrenderer_p.h
+SOURCES += \
+    $$PWD/coreapi/qsgdefaultrenderer.cpp \
+    $$PWD/coreapi/qsggeometry.cpp \
+    $$PWD/coreapi/qsgmaterial.cpp \
+    $$PWD/coreapi/qsgmatrix4x4stack.cpp \
+    $$PWD/coreapi/qsgnode.cpp \
+    $$PWD/coreapi/qsgnodeupdater.cpp \
+    $$PWD/coreapi/qsgrenderer.cpp
+
+
+# Util API
+HEADERS += \
+    $$PWD/util/qsgareaallocator_p.h \
+    $$PWD/util/qsgengine.h \
+    $$PWD/util/qsgflatcolormaterial.h \
+    $$PWD/util/qsgsimplerectnode.h \
+    $$PWD/util/qsgsimpletexturenode.h \
+    $$PWD/util/qsgtexturematerial.h \
+    $$PWD/util/qsgtexturematerial_p.h \
+    $$PWD/util/qsgvertexcolormaterial_p.h \
+    $$PWD/util/qsgtexture.h \
+    $$PWD/util/qsgtexture_p.h \
+    $$PWD/util/qsgtextureprovider_p.h \
+    $$PWD/util/qsgpainternode_p.h
+
+SOURCES += \
+    $$PWD/util/qsgareaallocator.cpp \
+    $$PWD/util/qsgengine.cpp \
+    $$PWD/util/qsgflatcolormaterial.cpp \
+    $$PWD/util/qsgsimplerectnode.cpp \
+    $$PWD/util/qsgsimpletexturenode.cpp \
+    $$PWD/util/qsgtexturematerial.cpp \
+    $$PWD/util/qsgvertexcolormaterial.cpp \
+    $$PWD/util/qsgtexture.cpp \
+    $$PWD/util/qsgtextureprovider.cpp \
+    $$PWD/util/qsgpainternode.cpp
+
+
+# QML / Adaptations API
+HEADERS += \
+    $$PWD/qsgadaptationlayer_p.h \
+    $$PWD/qsgcontext_p.h \
+    $$PWD/qsgcontextplugin_p.h \
+    $$PWD/qsgdefaultglyphnode_p.h \
+    $$PWD/qsgdistancefieldglyphcache_p.h \
+    $$PWD/qsgdistancefieldglyphnode_p.h \
+    $$PWD/qsgdistancefieldglyphnode_p_p.h \
+    $$PWD/qsgdefaultglyphnode_p_p.h \
+    $$PWD/qsgdefaultimagenode_p.h \
+    $$PWD/qsgdefaultrectanglenode_p.h \
+    $$PWD/qsgflashnode_p.h
+
+SOURCES += \
+    $$PWD/qsgadaptationlayer.cpp \
+    $$PWD/qsgcontext.cpp \
+    $$PWD/qsgcontextplugin.cpp \
+    $$PWD/qsgdefaultglyphnode.cpp \
+    $$PWD/qsgdefaultglyphnode_p.cpp \
+    $$PWD/qsgdistancefieldglyphcache.cpp \
+    $$PWD/qsgdistancefieldglyphnode.cpp \
+    $$PWD/qsgdistancefieldglyphnode_p.cpp \
+    $$PWD/qsgdefaultimagenode.cpp \
+    $$PWD/qsgdefaultrectanglenode.cpp \
+    $$PWD/qsgflashnode.cpp
diff --git a/src/declarative/scenegraph/util/qsgareaallocator.cpp b/src/declarative/scenegraph/util/qsgareaallocator.cpp
new file mode 100644
index 0000000000..a28575c982
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgareaallocator.cpp
@@ -0,0 +1,290 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgareaallocator_p.h"
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qrect.h>
+#include <QtCore/qpoint.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace
+{
+    enum SplitType
+    {
+        VerticalSplit,
+        HorizontalSplit
+    };
+
+    static const int maxMargin = 2;
+}
+
+struct QSGAreaAllocatorNode
+{
+    QSGAreaAllocatorNode(QSGAreaAllocatorNode *parent);
+    ~QSGAreaAllocatorNode();
+    inline bool isLeaf();
+
+    QSGAreaAllocatorNode *parent;
+    QSGAreaAllocatorNode *left;
+    QSGAreaAllocatorNode *right;
+    int split; // only valid for inner nodes.
+    SplitType splitType;
+    bool isOccupied; // only valid for leaf nodes.
+};
+
+QSGAreaAllocatorNode::QSGAreaAllocatorNode(QSGAreaAllocatorNode *parent)
+    : parent(parent)
+    , left(0)
+    , right(0)
+    , isOccupied(false)
+{
+}
+
+QSGAreaAllocatorNode::~QSGAreaAllocatorNode()
+{
+    delete left;
+    delete right;
+}
+
+bool QSGAreaAllocatorNode::isLeaf()
+{
+    Q_ASSERT((left != 0) == (right != 0));
+    return !left;
+}
+
+
+QSGAreaAllocator::QSGAreaAllocator(const QSize &size) : m_size(size)
+{
+    m_root = new QSGAreaAllocatorNode(0);
+}
+
+QSGAreaAllocator::~QSGAreaAllocator()
+{
+    delete m_root;
+}
+
+QRect QSGAreaAllocator::allocate(const QSize &size)
+{
+    QPoint point;
+    bool result = allocateInNode(size, point, QRect(QPoint(0, 0), m_size), m_root);
+    return result ? QRect(point, size) : QRect();
+}
+
+bool QSGAreaAllocator::deallocate(const QRect &rect)
+{
+    return deallocateInNode(rect.topLeft(), m_root);
+}
+
+bool QSGAreaAllocator::allocateInNode(const QSize &size, QPoint &result, const QRect &currentRect, QSGAreaAllocatorNode *node)
+{
+    if (size.width() > currentRect.width() || size.height() > currentRect.height())
+        return false;
+
+    if (node->isLeaf()) {
+        if (node->isOccupied)
+            return false;
+        if (size.width() + maxMargin >= currentRect.width() && size.height() + maxMargin >= currentRect.height()) {
+            //Snug fit, occupy entire rectangle.
+            node->isOccupied = true;
+            result = currentRect.topLeft();
+            return true;
+        }
+        // TODO: Reuse nodes.
+        // Split node.
+        node->left = new QSGAreaAllocatorNode(node);
+        node->right = new QSGAreaAllocatorNode(node);
+        QRect splitRect = currentRect;
+        if ((currentRect.width() - size.width()) * currentRect.height() < (currentRect.height() - size.height()) * currentRect.width()) {
+            node->splitType = HorizontalSplit;
+            node->split = currentRect.top() + size.height();
+            splitRect.setHeight(size.height());
+        } else {
+            node->splitType = VerticalSplit;
+            node->split = currentRect.left() + size.width();
+            splitRect.setWidth(size.width());
+        }
+        return allocateInNode(size, result, splitRect, node->left);
+    } else {
+        // TODO: avoid unnecessary recursion.
+        //  has been split.
+        QRect leftRect = currentRect;
+        QRect rightRect = currentRect;
+        if (node->splitType == HorizontalSplit) {
+            leftRect.setHeight(node->split - leftRect.top());
+            rightRect.setTop(node->split);
+        } else {
+            leftRect.setWidth(node->split - leftRect.left());
+            rightRect.setLeft(node->split);
+        }
+        if (allocateInNode(size, result, leftRect, node->left))
+            return true;
+        if (allocateInNode(size, result, rightRect, node->right))
+            return true;
+        return false;
+    }
+}
+
+bool QSGAreaAllocator::deallocateInNode(const QPoint &pos, QSGAreaAllocatorNode *node)
+{
+    while (!node->isLeaf()) {
+        //  has been split.
+        int cmp = node->splitType == HorizontalSplit ? pos.y() : pos.x();
+        node = cmp < node->split ? node->left : node->right;
+    }
+    if (!node->isOccupied)
+        return false;
+    node->isOccupied = false;
+    mergeNodeWithNeighbors(node);
+    return true;
+}
+
+void QSGAreaAllocator::mergeNodeWithNeighbors(QSGAreaAllocatorNode *node)
+{
+    bool done = false;
+    QSGAreaAllocatorNode *parent = 0;
+    QSGAreaAllocatorNode *current = 0;
+    QSGAreaAllocatorNode *sibling;
+    while (!done) {
+        Q_ASSERT(node->isLeaf());
+        Q_ASSERT(!node->isOccupied);
+        if (node->parent == 0)
+            return; // No neighbours.
+
+        SplitType splitType = SplitType(node->parent->splitType);
+        done = true;
+
+        /* Special case. Might be faster than going through the general code path.
+        // Merge with sibling.
+        parent = node->parent;
+        sibling = (node == parent->left ? parent->right : parent->left);
+        if (sibling->isLeaf() && !sibling->isOccupied) {
+            Q_ASSERT(!sibling->right);
+            node = parent;
+            parent->isOccupied = false;
+            delete parent->left;
+            delete parent->right;
+            parent->left = parent->right = 0;
+            done = false;
+            continue;
+        }
+        */
+
+        // Merge with left neighbour.
+        current = node;
+        parent = current->parent;
+        while (parent && current == parent->left && parent->splitType == splitType) {
+            current = parent;
+            parent = parent->parent;
+        }
+
+        if (parent && parent->splitType == splitType) {
+            Q_ASSERT(current == parent->right);
+            Q_ASSERT(parent->left);
+
+            QSGAreaAllocatorNode *neighbor = parent->left;
+            while (neighbor->right && neighbor->splitType == splitType)
+                neighbor = neighbor->right;
+
+            if (neighbor->isLeaf() && neighbor->parent->splitType == splitType && !neighbor->isOccupied) {
+                // Left neighbour can be merged.
+                parent->split = neighbor->parent->split;
+
+                parent = neighbor->parent;
+                sibling = neighbor == parent->left ? parent->right : parent->left;
+                QSGAreaAllocatorNode **nodeRef = &m_root;
+                if (parent->parent) {
+                    if (parent == parent->parent->left)
+                        nodeRef = &parent->parent->left;
+                    else
+                        nodeRef = &parent->parent->right;
+                }
+                sibling->parent = parent->parent;
+                *nodeRef = sibling;
+                parent->left = parent->right = 0;
+                delete parent;
+                delete neighbor;
+                done = false;
+            }
+        }
+
+        // Merge with right neighbour.
+        current = node;
+        parent = current->parent;
+        while (parent && current == parent->right && parent->splitType == splitType) {
+            current = parent;
+            parent = parent->parent;
+        }
+
+        if (parent && parent->splitType == splitType) {
+            Q_ASSERT(current == parent->left);
+            Q_ASSERT(parent->right);
+
+            QSGAreaAllocatorNode *neighbor = parent->right;
+            while (neighbor->left && neighbor->splitType == splitType)
+                neighbor = neighbor->left;
+
+            if (neighbor->isLeaf() && neighbor->parent->splitType == splitType && !neighbor->isOccupied) {
+                // Right neighbour can be merged.
+                parent->split = neighbor->parent->split;
+
+                parent = neighbor->parent;
+                sibling = neighbor == parent->left ? parent->right : parent->left;
+                QSGAreaAllocatorNode **nodeRef = &m_root;
+                if (parent->parent) {
+                    if (parent == parent->parent->left)
+                        nodeRef = &parent->parent->left;
+                    else
+                        nodeRef = &parent->parent->right;
+                }
+                sibling->parent = parent->parent;
+                *nodeRef = sibling;
+                parent->left = parent->right = 0;
+                delete parent;
+                delete neighbor;
+                done = false;
+            }
+        }
+    } // end while(!done)
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgareaallocator_p.h b/src/declarative/scenegraph/util/qsgareaallocator_p.h
new file mode 100644
index 0000000000..f84732fbdb
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgareaallocator_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef AREAALLOCATOR_H
+#define AREAALLOCATOR_H
+
+#include <QtCore/qsize.h>
+
+QT_BEGIN_NAMESPACE
+
+class QRect;
+class QPoint;
+struct QSGAreaAllocatorNode;
+class Q_DECLARATIVE_EXPORT QSGAreaAllocator
+{
+public:
+    QSGAreaAllocator(const QSize &size);
+    ~QSGAreaAllocator();
+
+    QRect allocate(const QSize &size);
+    bool deallocate(const QRect &rect);
+    bool isEmpty() const { return m_root == 0; }
+    QSize size() const { return m_size; }
+private:
+    bool allocateInNode(const QSize &size, QPoint &result, const QRect &currentRect, QSGAreaAllocatorNode *node);
+    bool deallocateInNode(const QPoint &pos, QSGAreaAllocatorNode *node);
+    void mergeNodeWithNeighbors(QSGAreaAllocatorNode *node);
+
+    QSGAreaAllocatorNode *m_root;
+    QSize m_size;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/declarative/scenegraph/util/qsgengine.cpp b/src/declarative/scenegraph/util/qsgengine.cpp
new file mode 100644
index 0000000000..1b7f05809b
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgengine.cpp
@@ -0,0 +1,244 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgengine.h"
+
+#include <private/qsgtexture_p.h>
+#include <private/qsgrenderer_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGEnginePrivate : public QObjectPrivate
+{
+public:
+    QSGEnginePrivate()
+        : context(0)
+        , clearBeforeRender(true)
+    {
+    }
+
+    QSGContext *context;
+
+    bool clearBeforeRender;
+};
+
+
+/*!
+    \class QSGEngine
+    \brief The QSGEngine class serves as a generic entry point into scene graph specific APIs.
+
+    The QSGEngine class provides factory functions for creating textures. Though the user
+    can implement any type of texture using the abstract QSGTexture class, the QSGEngine
+    class provides some convenience for the default usecases. This also allows the scene
+    graph to apply hardware specific optimzations.
+
+ */
+
+
+
+/*!
+    Constructs a new QSGengine
+ */
+QSGEngine::QSGEngine(QObject *parent) :
+    QObject(*(new QSGEnginePrivate), parent)
+{
+}
+
+
+QSGEngine::~QSGEngine()
+{
+}
+
+/*!
+    \enum TextureOption
+
+    The TextureOption enums are used to customize a texture is wrapped.
+
+    \value TextureHasAlphaChannel The texture has an alpha channel and should
+    be drawn using blending.
+
+    \value TextureHasMipmaps The texture has mipmaps and can be drawn with
+    mipmapping enabled.
+
+    \value TextureOwnsGLTexture The texture object owns the texture id and
+    will delete the GL texture when the texture object is deleted.
+
+ */
+
+/*!
+    \fn void QSGEngine::beforeRendering()
+
+    This signal is emitted before the scene starts rendering.
+
+    Combined with the modes for clearing the background, this option
+    can be used to paint using raw GL under QML content.
+
+    The GL context used for rendering the scene graph will be bound
+    at this point.
+*/
+
+/*!
+    \fn void QSGEngine::afterRendering()
+
+    This signal is emitted after the scene has completed rendering, before swapbuffers is called.
+
+    This signal can be used to paint using raw GL on top of QML content,
+    or to do screen scraping of the current frame buffer.
+
+    The GL context used for rendering the scene graph will be bound at this point.
+ */
+
+
+
+/*!
+    Sets weither the scene graph rendering of QML should clear the color buffer
+    before it starts rendering to \a enbled.
+
+    By disabling clearing of the color buffer, it is possible to do GL painting
+    under the scene graph.
+
+    The color buffer is cleared by default.
+ */
+
+void QSGEngine::setClearBeforeRendering(bool enabled)
+{
+    Q_D(QSGEngine);
+    d->clearBeforeRender = enabled;
+    if (d->clearBeforeRender) {
+        d->context->renderer()->setClearMode(QSGRenderer::ClearDepthBuffer
+                                             | QSGRenderer::ClearColorBuffer);
+    } else {
+        d->context->renderer()->setClearMode(QSGRenderer::ClearDepthBuffer);
+    }
+}
+
+
+
+/*!
+    Returns weither clearing of the color buffer is done before rendering or not.
+ */
+
+bool QSGEngine::clearBeforeRendering() const
+{
+    Q_D(const QSGEngine);
+    return d->clearBeforeRender;
+}
+
+
+
+/*!
+    Creates a new QSGTexture from the supplied \a image. If the image has an
+    alpha channel, the corresponding texture will have an alpha channel.
+
+    The caller of the function is responsible for deleting the returned texture.
+
+    The actual GL texture will be deleted when the texture object is deleted.
+ */
+
+QSGTexture *QSGEngine::createTextureFromImage(const QImage &image) const
+{
+    Q_D(const QSGEngine);
+    return d->context->createTexture(image);
+}
+
+
+
+/*!
+    Creates a new QSGTexture object from an existing GL texture \a id.
+
+    The caller of the function is responsible for deleting the returned texture.
+
+    Use \a options to customize the texture attributes.
+ */
+QSGTexture *QSGEngine::createTextureFromId(uint id, const QSize &size, TextureOptions options) const
+{
+    QSGPlainTexture *texture = new QSGPlainTexture();
+    texture->setTextureId(id);
+    texture->setHasAlphaChannel(options & TextureHasAlphaChannel);
+    texture->setHasMipmaps(options & TextureHasMipmaps);
+    texture->setOwnsTexture(options & TextureOwnsGLTexture);
+    texture->setTextureSize(size);
+    return texture;
+}
+
+
+
+/*!
+    \internal
+
+    Sets the scene graph context of this engine to context.
+
+    The context will be set by the QSGcontext::initialize() function,
+    as part of constructing the engine object.
+ */
+
+void QSGEngine::setContext(QSGContext *context)
+{
+    Q_D(QSGEngine);
+    d->context = context;
+}
+
+
+
+/*!
+    Sets the background color of the scene graph to \a color.
+
+    Changing the clear color has no effect when clearing before rendering is
+    disabled.
+ */
+
+void QSGEngine::setClearColor(const QColor &color)
+{
+    d_func()->context->renderer()->setClearColor(color);
+}
+
+
+
+/*!
+    Returns the background color of the scene graph
+ */
+
+QColor QSGEngine::clearColor() const
+{
+    return d_func()->context->renderer()->clearColor();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgengine.h b/src/declarative/scenegraph/util/qsgengine.h
new file mode 100644
index 0000000000..9e07f3530d
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgengine.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGENGINE_H
+#define QSGENGINE_H
+
+#include <QObject>
+
+#include <qsgtexture.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGEnginePrivate;
+
+class QSGContext;
+class Q_DECLARATIVE_EXPORT QSGEngine : public QObject
+{
+    Q_OBJECT
+
+    Q_DECLARE_PRIVATE(QSGEngine)
+
+public:
+
+    enum TextureOption {
+        TextureHasAlphaChannel  = 0x0001,
+        TextureHasMipmaps       = 0x0002,
+        TextureOwnsGLTexture    = 0x0004
+    };
+    Q_DECLARE_FLAGS(TextureOptions, TextureOption)
+
+    QSGTexture *createTextureFromImage(const QImage &image) const;
+    QSGTexture *createTextureFromId(uint id, const QSize &size, TextureOptions options = TextureOption(0)) const;
+
+    void setClearBeforeRendering(bool enabled);
+    bool clearBeforeRendering() const;
+
+    void setClearColor(const QColor &color);
+    QColor clearColor() const;
+
+signals:
+    void beforeRendering();
+    void afterRendering();
+
+private:
+    QSGEngine(QObject *parent = 0);
+    ~QSGEngine();
+
+    friend class QSGContext;
+    friend class QSGContextPrivate;
+    void setContext(QSGContext *context);
+
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGENGINE_H
diff --git a/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp b/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp
new file mode 100644
index 0000000000..e348655e6b
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgflatcolormaterial.h"
+
+#include <qglshaderprogram.h>
+
+QT_BEGIN_NAMESPACE
+
+class FlatColorMaterialShader : public QSGMaterialShader
+{
+public:
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+
+    static QSGMaterialType type;
+
+private:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    int m_matrix_id;
+    int m_color_id;
+};
+
+QSGMaterialType FlatColorMaterialShader::type;
+
+void FlatColorMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+
+    QSGFlatColorMaterial *oldMaterial = static_cast<QSGFlatColorMaterial *>(oldEffect);
+    QSGFlatColorMaterial *newMaterial = static_cast<QSGFlatColorMaterial *>(newEffect);
+
+    const QColor &c = newMaterial->color();
+
+    if (oldMaterial == 0 || c != oldMaterial->color() || state.isOpacityDirty()) {
+        float opacity = state.opacity();
+        QVector4D v(c.redF() * c.alphaF() * opacity,
+                    c.greenF() * c.alphaF() * opacity,
+                    c.blueF() * c.alphaF() * opacity,
+                    c.alphaF() * opacity);
+        m_program.setUniformValue(m_color_id, v);
+    }
+
+    if (state.isMatrixDirty())
+        m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+}
+
+char const *const *FlatColorMaterialShader::attributeNames() const
+{
+    static char const *const attr[] = { "vCoord", 0 };
+    return attr;
+}
+
+void FlatColorMaterialShader::initialize()
+{
+    m_matrix_id = m_program.uniformLocation("matrix");
+    m_color_id = m_program.uniformLocation("color");
+}
+
+const char *FlatColorMaterialShader::vertexShader() const {
+    return
+        "attribute highp vec4 vCoord;                   \n"
+        "uniform highp mat4 matrix;                     \n"
+        "void main() {                                  \n"
+        "    gl_Position = matrix * vCoord;             \n"
+        "}";
+}
+
+const char *FlatColorMaterialShader::fragmentShader() const {
+    return
+        "uniform lowp vec4 color;                       \n"
+        "void main() {                                  \n"
+        "    gl_FragColor = color;                      \n"
+        "}";
+}
+
+
+QSGFlatColorMaterial::QSGFlatColorMaterial() : m_color(QColor(255, 255, 255))
+{
+}
+
+void QSGFlatColorMaterial::setColor(const QColor &color)
+{
+    m_color = color;
+    setFlag(Blending, m_color.alpha() != 0xff);
+}
+
+
+QSGMaterialType *QSGFlatColorMaterial::type() const
+{
+    return &FlatColorMaterialShader::type;
+}
+
+QSGMaterialShader *QSGFlatColorMaterial::createShader() const
+{
+    return new FlatColorMaterialShader;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgflatcolormaterial.h b/src/declarative/scenegraph/util/qsgflatcolormaterial.h
new file mode 100644
index 0000000000..d9a8d5973c
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgflatcolormaterial.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FLATCOLORMATERIAL_H
+#define FLATCOLORMATERIAL_H
+
+#include <qsgmaterial.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QSGFlatColorMaterial : public QSGMaterial
+{
+public:
+    QSGFlatColorMaterial();
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+
+    void setColor(const QColor &color);
+    const QColor &color() const { return m_color; }
+
+private:
+    QColor m_color;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // FLATCOLORMATERIAL_H
diff --git a/src/declarative/scenegraph/util/qsgpainternode.cpp b/src/declarative/scenegraph/util/qsgpainternode.cpp
new file mode 100644
index 0000000000..c7386d2fb9
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgpainternode.cpp
@@ -0,0 +1,379 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgpainternode_p.h"
+
+#include "qsgpainteditem.h"
+#include <private/qsgcontext_p.h>
+#include <qglframebufferobject.h>
+#include <qglfunctions.h>
+
+QT_BEGIN_NAMESPACE
+
+#define QT_MINIMUM_FBO_SIZE 64
+
+static inline int qt_next_power_of_two(int v)
+{
+    v--;
+    v |= v >> 1;
+    v |= v >> 2;
+    v |= v >> 4;
+    v |= v >> 8;
+    v |= v >> 16;
+    ++v;
+    return v;
+}
+
+QSGPainterTexture::QSGPainterTexture()
+    : QSGPlainTexture()
+{
+
+}
+
+void QSGPainterTexture::bind()
+{
+    if (m_dirty_rect.isNull() || m_texture_id == 0) {
+        QSGPlainTexture::bind();
+    } else {
+        glBindTexture(GL_TEXTURE_2D, m_texture_id);
+
+        QImage subImage = m_image.copy(m_dirty_rect);
+
+        int w = m_dirty_rect.width();
+        int h = m_dirty_rect.height();
+        int y = m_image.height() - m_dirty_rect.y() - h;
+
+#ifdef QT_OPENGL_ES
+        for (int i = 0; i < h; ++i) {
+            glTexSubImage2D(GL_TEXTURE_2D, 0, m_dirty_rect.x(), y + i, w, 1,
+                            GL_RGBA, GL_UNSIGNED_BYTE, subImage.constScanLine(h - 1 - i));
+        }
+#else
+        for (int i = 0; i < h; ++i) {
+            glTexSubImage2D(GL_TEXTURE_2D, 0, m_dirty_rect.x(), y + i, w, 1,
+                            GL_BGRA, GL_UNSIGNED_BYTE, subImage.constScanLine(h - 1 - i));
+        }
+
+#endif
+
+        m_dirty_texture = false;
+        m_dirty_bind_options = false;
+    }
+    m_dirty_rect = QRect();
+}
+
+QSGPainterNode::QSGPainterNode(QSGPaintedItem *item)
+    : QSGGeometryNode()
+    , m_preferredRenderTarget(QSGPaintedItem::Image)
+    , m_actualRenderTarget(QSGPaintedItem::Image)
+    , m_item(item)
+    , m_fbo(0)
+    , m_multisampledFbo(0)
+    , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
+    , m_texture(0)
+    , m_size(1, 1)
+    , m_dirtyContents(false)
+    , m_opaquePainting(false)
+    , m_linear_filtering(false)
+    , m_smoothPainting(false)
+    , m_extensionsChecked(false)
+    , m_multisamplingSupported(false)
+    , m_fillColor(Qt::transparent)
+    , m_dirtyGeometry(false)
+    , m_dirtyRenderTarget(false)
+    , m_dirtyTexture(false)
+{
+    setMaterial(&m_materialO);
+    setOpaqueMaterial(&m_material);
+    setGeometry(&m_geometry);
+    setFlag(UsePreprocess);
+}
+
+QSGPainterNode::~QSGPainterNode()
+{
+    delete m_texture;
+    delete m_fbo;
+    delete m_multisampledFbo;
+}
+
+void QSGPainterNode::preprocess()
+{
+    if (!m_dirtyContents)
+        return;
+
+    QRect dirtyRect = m_dirtyRect.isNull() ? QRect(0, 0, m_size.width(), m_size.height()) : m_dirtyRect;
+
+    QPainter painter;
+    if (m_actualRenderTarget == QSGPaintedItem::Image)
+        painter.begin(&m_image);
+    else if (m_multisampledFbo)
+        painter.begin(m_multisampledFbo);
+    else
+        painter.begin(m_fbo);
+
+    if (m_smoothPainting) {
+        painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing
+                               | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
+    }
+
+    painter.setCompositionMode(QPainter::CompositionMode_Source);
+    painter.fillRect(dirtyRect, m_fillColor);
+    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+
+    if (!m_dirtyRect.isNull())
+        painter.setClipRect(dirtyRect);
+    m_item->paint(&painter);
+    painter.end();
+
+    if (m_actualRenderTarget == QSGPaintedItem::Image) {
+        m_texture->setImage(m_image);
+        m_texture->setDirtyRect(dirtyRect);
+    } else if (m_multisampledFbo) {
+        QGLFramebufferObject::blitFramebuffer(m_fbo, dirtyRect, m_multisampledFbo, dirtyRect);
+    }
+
+    m_dirtyContents = false;
+    m_dirtyRect = QRect();
+}
+
+void QSGPainterNode::update()
+{
+    if (m_dirtyRenderTarget)
+        updateRenderTarget();
+    if (m_dirtyGeometry)
+        updateGeometry();
+    if (m_dirtyTexture)
+        updateTexture();
+
+    m_dirtyGeometry = false;
+    m_dirtyRenderTarget = false;
+    m_dirtyTexture = false;
+}
+
+void QSGPainterNode::updateTexture()
+{
+    m_texture->setHasAlphaChannel(!m_opaquePainting);
+    m_material.setTexture(m_texture);
+    m_materialO.setTexture(m_texture);
+
+    markDirty(DirtyMaterial);
+}
+
+void QSGPainterNode::updateGeometry()
+{
+    QRectF source;
+    if (m_actualRenderTarget == QSGPaintedItem::Image)
+        source = QRectF(0, 1, 1, -1);
+    else
+        source = QRectF(0, 1, qreal(m_size.width()) / m_fboSize.width(), qreal(-m_size.height()) / m_fboSize.height());
+    QSGGeometry::updateTexturedRectGeometry(&m_geometry,
+                                            QRectF(0, 0, m_size.width(), m_size.height()),
+                                            source);
+    markDirty(DirtyGeometry);
+}
+
+void QSGPainterNode::updateRenderTarget()
+{
+    if (!m_extensionsChecked) {
+        QList<QByteArray> extensions = QByteArray((const char *)glGetString(GL_EXTENSIONS)).split(' ');
+        m_multisamplingSupported = extensions.contains("GL_EXT_framebuffer_multisample")
+                && extensions.contains("GL_EXT_framebuffer_blit");
+        m_extensionsChecked = true;
+    }
+
+    m_dirtyContents = true;
+
+    QSGPaintedItem::RenderTarget oldTarget = m_actualRenderTarget;
+    if (m_preferredRenderTarget == QSGPaintedItem::Image) {
+        m_actualRenderTarget = QSGPaintedItem::Image;
+    } else {
+        if (!m_multisamplingSupported && m_smoothPainting)
+            m_actualRenderTarget = QSGPaintedItem::Image;
+        else
+            m_actualRenderTarget = QSGPaintedItem::FramebufferObject;
+    }
+    if (oldTarget != m_actualRenderTarget) {
+        m_image = QImage();
+        delete m_fbo;
+        delete m_multisampledFbo;
+        m_fbo = m_multisampledFbo = 0;
+    }
+
+    if (m_actualRenderTarget == QSGPaintedItem::FramebufferObject) {
+        const QGLContext *ctx = QGLContext::currentContext();
+        if (m_fbo && !m_dirtyGeometry && (!ctx->format().sampleBuffers() || !m_multisamplingSupported))
+            return;
+
+        if (m_fboSize.isEmpty())
+            updateFBOSize();
+
+        delete m_fbo;
+        delete m_multisampledFbo;
+        m_fbo = m_multisampledFbo = 0;
+
+        if (m_smoothPainting && ctx->format().sampleBuffers() && m_multisamplingSupported) {
+            {
+                QGLFramebufferObjectFormat format;
+                format.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
+                format.setSamples(ctx->format().samples());
+                m_multisampledFbo = new QGLFramebufferObject(m_fboSize, format);
+            }
+            {
+                QGLFramebufferObjectFormat format;
+                format.setAttachment(QGLFramebufferObject::NoAttachment);
+                m_fbo = new QGLFramebufferObject(m_fboSize, format);
+            }
+        } else {
+            QGLFramebufferObjectFormat format;
+            format.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
+            m_fbo = new QGLFramebufferObject(m_fboSize, format);
+        }
+    } else {
+        if (!m_image.isNull() && !m_dirtyGeometry)
+            return;
+
+        m_image = QImage(m_size, QImage::Format_ARGB32_Premultiplied);
+        m_image.fill(Qt::transparent);
+    }
+
+    QSGPainterTexture *texture = new QSGPainterTexture;
+    if (m_actualRenderTarget == QSGPaintedItem::Image) {
+        texture->setOwnsTexture(true);
+        texture->setTextureSize(m_size);
+    } else {
+        texture->setTextureId(m_fbo->texture());
+        texture->setOwnsTexture(false);
+        texture->setTextureSize(m_fboSize);
+    }
+
+    if (m_texture)
+        delete m_texture;
+
+    texture->setTextureSize(m_size);
+    m_texture = texture;
+    m_material.setFiltering(m_linear_filtering ? QSGTexture::Linear : QSGTexture::Nearest);
+    m_materialO.setFiltering(m_linear_filtering ? QSGTexture::Linear : QSGTexture::Nearest);
+}
+
+void QSGPainterNode::updateFBOSize()
+{
+    int fboWidth = qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(m_size.width()));
+    int fboHeight = qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(m_size.height()));
+    m_fboSize = QSize(fboWidth, fboHeight);
+}
+
+void QSGPainterNode::setPreferredRenderTarget(QSGPaintedItem::RenderTarget target)
+{
+    if (m_preferredRenderTarget == target)
+        return;
+
+    m_preferredRenderTarget = target;
+
+    m_dirtyRenderTarget = true;
+    m_dirtyGeometry = true;
+    m_dirtyTexture = true;
+}
+
+void QSGPainterNode::setSize(const QSize &size)
+{
+    if (size == m_size)
+        return;
+
+    m_size = size;
+    updateFBOSize();
+
+    if (m_fbo)
+        m_dirtyRenderTarget = m_fbo->size() != m_fboSize || m_dirtyRenderTarget;
+    else
+        m_dirtyRenderTarget = true;
+    m_dirtyGeometry = true;
+    m_dirtyTexture = true;
+}
+
+void QSGPainterNode::setDirty(bool d, const QRect &dirtyRect)
+{
+    m_dirtyContents = d;
+    m_dirtyRect = dirtyRect;
+
+    markDirty(DirtyMaterial);
+}
+
+void QSGPainterNode::setOpaquePainting(bool opaque)
+{
+    if (opaque == m_opaquePainting)
+        return;
+
+    m_opaquePainting = opaque;
+    m_dirtyTexture = true;
+}
+
+void QSGPainterNode::setLinearFiltering(bool linearFiltering)
+{
+    if (linearFiltering == m_linear_filtering)
+        return;
+
+    m_linear_filtering = linearFiltering;
+
+    m_material.setFiltering(linearFiltering ? QSGTexture::Linear : QSGTexture::Nearest);
+    m_materialO.setFiltering(linearFiltering ? QSGTexture::Linear : QSGTexture::Nearest);
+    markDirty(DirtyMaterial);
+}
+
+void QSGPainterNode::setSmoothPainting(bool s)
+{
+    if (s == m_smoothPainting)
+        return;
+
+    m_smoothPainting = s;
+    m_dirtyRenderTarget = true;
+}
+
+void QSGPainterNode::setFillColor(const QColor &c)
+{
+    if (c == m_fillColor)
+        return;
+
+    m_fillColor = c;
+    markDirty(DirtyMaterial);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgpainternode_p.h b/src/declarative/scenegraph/util/qsgpainternode_p.h
new file mode 100644
index 0000000000..ef1f3f1dde
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgpainternode_p.h
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGPAINTERNODE_P_H
+#define QSGPAINTERNODE_P_H
+
+#include "qsgnode.h"
+#include "qsgtexturematerial.h"
+#include "qsgtexture_p.h"
+#include "qsgpainteditem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QGLFramebufferObject;
+
+class Q_DECLARATIVE_EXPORT QSGPainterTexture : public QSGPlainTexture
+{
+public:
+    QSGPainterTexture();
+
+    void setDirtyRect(const QRect &rect) { m_dirty_rect = rect; }
+
+    void bind();
+
+private:
+    QRect m_dirty_rect;
+};
+
+class Q_DECLARATIVE_EXPORT QSGPainterNode : public QSGGeometryNode
+{
+public:
+    QSGPainterNode(QSGPaintedItem *item);
+    virtual ~QSGPainterNode();
+
+    void setPreferredRenderTarget(QSGPaintedItem::RenderTarget target);
+
+    void setSize(const QSize &size);
+    QSize size() const { return m_size; }
+
+    void setDirty(bool d, const QRect &dirtyRect = QRect());
+
+    void setOpaquePainting(bool opaque);
+    bool opaquePainting() const { return m_opaquePainting; }
+
+    void setLinearFiltering(bool linearFiltering);
+    bool linearFiltering() const { return m_linear_filtering; }
+
+    void setSmoothPainting(bool s);
+    bool smoothPainting() const { return m_smoothPainting; }
+
+    void setFillColor(const QColor &c);
+    QColor fillColor() const { return m_fillColor; }
+
+    void update();
+
+    void preprocess();
+
+private:
+    void updateTexture();
+    void updateGeometry();
+    void updateRenderTarget();
+    void updateFBOSize();
+
+    QSGPaintedItem::RenderTarget m_preferredRenderTarget;
+    QSGPaintedItem::RenderTarget m_actualRenderTarget;
+
+    QSGPaintedItem *m_item;
+
+    QGLFramebufferObject *m_fbo;
+    QGLFramebufferObject *m_multisampledFbo;
+    QImage m_image;
+
+    QSGTextureMaterial m_material;
+    QSGTextureMaterialWithOpacity m_materialO;
+    QSGGeometry m_geometry;
+    QSGPainterTexture *m_texture;
+
+    QSize m_size;
+    QSize m_fboSize;
+    bool m_dirtyContents;
+    QRect m_dirtyRect;
+    bool m_opaquePainting;
+    bool m_linear_filtering;
+    bool m_smoothPainting;
+    bool m_extensionsChecked;
+    bool m_multisamplingSupported;
+    QColor m_fillColor;
+
+    bool m_dirtyGeometry;
+    bool m_dirtyRenderTarget;
+    bool m_dirtyTexture;
+};
+
+QT_END_HEADER
+
+QT_END_NAMESPACE
+
+#endif // QSGPAINTERNODE_P_H
diff --git a/src/declarative/scenegraph/util/qsgsimplerectnode.cpp b/src/declarative/scenegraph/util/qsgsimplerectnode.cpp
new file mode 100644
index 0000000000..604222dad5
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgsimplerectnode.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgsimplerectnode.h"
+#include "qsgflatcolormaterial.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+  \class QSGSimpleRectNode
+
+  \brief The QSGSimpleRectNode class is a convenience class for drawing
+  solid filled rectangles using scenegraph.
+
+ */
+
+
+
+/*!
+    Constructs a QSGSimpleRectNode instance which is spanning \a rect with
+    the color \a color.
+ */
+QSGSimpleRectNode::QSGSimpleRectNode(const QRectF &rect, const QColor &color)
+    : m_geometry(QSGGeometry::defaultAttributes_Point2D(), 4)
+{
+    QSGGeometry::updateRectGeometry(&m_geometry, rect);
+    m_material.setColor(color);
+    setMaterial(&m_material);
+    setGeometry(&m_geometry);
+}
+
+
+
+/*!
+    Constructs a QSGSimpleRectNode instance with an empty rectangle and
+    white color.
+ */
+QSGSimpleRectNode::QSGSimpleRectNode()
+    : m_geometry(QSGGeometry::defaultAttributes_Point2D(), 4)
+{
+    QSGGeometry::updateRectGeometry(&m_geometry, QRectF());
+    setMaterial(&m_material);
+    setGeometry(&m_geometry);
+}
+
+
+
+/*!
+    Sets the rectangle of this rect node to \a rect.
+ */
+void QSGSimpleRectNode::setRect(const QRectF &rect)
+{
+    QSGGeometry::updateRectGeometry(&m_geometry, rect);
+    markDirty(QSGNode::DirtyGeometry);
+}
+
+
+
+/*!
+    Returns the rectangle that this rect node covers.
+ */
+QRectF QSGSimpleRectNode::rect() const
+{
+    const QSGGeometry::Point2D *pts = m_geometry.vertexDataAsPoint2D();
+    return QRectF(pts[0].x,
+                  pts[0].y,
+                  pts[3].x - pts[0].x,
+                  pts[3].y - pts[0].y);
+}
+
+
+/*!
+    Sets the color of this rectangle to \a color. The default
+    color will be white.
+ */
+void QSGSimpleRectNode::setColor(const QColor &color)
+{
+    if (color != m_material.color()) {
+        m_material.setColor(color);
+        markDirty(QSGNode::DirtyMaterial);
+    }
+}
+
+
+
+/*!
+    Returns the color of this rectangle.
+ */
+QColor QSGSimpleRectNode::color() const
+{
+    return m_material.color();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgsimplerectnode.h b/src/declarative/scenegraph/util/qsgsimplerectnode.h
new file mode 100644
index 0000000000..ac001ab4eb
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgsimplerectnode.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SOLIDRECTNODE_H
+#define SOLIDRECTNODE_H
+
+#include "qsgnode.h"
+#include "qsgflatcolormaterial.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_DECLARATIVE_EXPORT QSGSimpleRectNode : public QSGGeometryNode
+{
+public:
+    QSGSimpleRectNode(const QRectF &rect, const QColor &color);
+    QSGSimpleRectNode();
+
+    void setRect(const QRectF &rect);
+    inline void setRect(qreal x, qreal y, qreal w, qreal h) { setRect(QRectF(x, y, w, h)); }
+    QRectF rect() const;
+
+    void setColor(const QColor &color);
+    QColor color() const;
+
+private:
+    QSGFlatColorMaterial m_material;
+    QSGGeometry m_geometry;
+    void *reserved;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SOLIDRECTNODE_H
diff --git a/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp b/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp
new file mode 100644
index 0000000000..4e4567444a
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qsgsimpletexturenode.h"
+
+QT_BEGIN_NAMESPACE
+
+static void qsgsimpletexturenode_update(QSGGeometry *g,
+                                        QSGTexture *texture,
+                                        const QRectF &rect)
+{
+    if (!texture)
+        return;
+
+    QSize ts = texture->textureSize();
+    QRectF sourceRect(0, ts.height(), ts.width(), -ts.height());
+    QSGGeometry::updateTexturedRectGeometry(g, rect, texture->convertToNormalizedSourceRect(sourceRect));
+}
+
+/*!
+  \class QSGSimpleTextureNode
+  \brief The QSGSimpleTextureNode provided for convenience to easily draw
+  textured content using the QML scene graph.
+
+  \warning The simple texture node class must have texture before being
+  added to the scene graph to be rendered.
+*/
+
+/*!
+    Constructs a new simple texture node
+ */
+QSGSimpleTextureNode::QSGSimpleTextureNode()
+    : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
+{
+    setGeometry(&m_geometry);
+    setMaterial(&m_opaque_material);
+    setOpaqueMaterial(&m_material);
+}
+
+/*!
+    Sets the filtering to be used for this texture node to \a filtering.
+
+    For smooth scaling, use QSGTexture::Linear; for normal scaling, use
+    QSGTexture::Nearest.
+ */
+void QSGSimpleTextureNode::setFiltering(QSGTexture::Filtering filtering)
+{
+    if (m_material.filtering() == filtering)
+        return;
+
+    m_material.setFiltering(filtering);
+    m_opaque_material.setFiltering(filtering);
+    markDirty(DirtyMaterial);
+}
+
+
+/*!
+    Returns the filtering currently set on this texture node
+ */
+QSGTexture::Filtering QSGSimpleTextureNode::filtering() const
+{
+    return m_material.filtering();
+}
+
+
+/*!
+    Sets the target rect of this texture node to \a r
+ */
+void QSGSimpleTextureNode::setRect(const QRectF &r)
+{
+    if (m_rect == r)
+        return;
+    m_rect = r;
+    qsgsimpletexturenode_update(&m_geometry, texture(), m_rect);
+    markDirty(DirtyGeometry);
+}
+
+
+/*!
+    Returns the target rect of this texture node.
+ */
+QRectF QSGSimpleTextureNode::rect() const
+{
+    return m_rect;
+}
+
+/*!
+    Sets the texture of this texture node to \a texture.
+
+    \warning A texture node must have a texture before being added
+    to the scenegraph to be rendered.
+ */
+void QSGSimpleTextureNode::setTexture(QSGTexture *texture)
+{
+    if (m_material.texture() == texture)
+        return;
+    m_material.setTexture(texture);
+    m_opaque_material.setTexture(texture);
+    qsgsimpletexturenode_update(&m_geometry, texture, m_rect);
+    markDirty(DirtyMaterial);
+}
+
+
+
+/*!
+    Returns the texture for this texture node
+ */
+QSGTexture *QSGSimpleTextureNode::texture() const
+{
+    return m_material.texture();
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgsimpletexturenode.h b/src/declarative/scenegraph/util/qsgsimpletexturenode.h
new file mode 100644
index 0000000000..b4d8b71962
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgsimpletexturenode.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGSIMPLETEXTURENODE_H
+#define QSGSIMPLETEXTURENODE_H
+
+#include "qsgnode.h"
+#include "qsggeometry.h"
+#include "qsgtexturematerial.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_DECLARATIVE_EXPORT QSGSimpleTextureNode : public QSGGeometryNode
+{
+public:
+    QSGSimpleTextureNode();
+
+    void setRect(const QRectF &rect);
+    inline void setRect(qreal x, qreal y, qreal w, qreal h) { setRect(QRectF(x, y, w, h)); }
+    QRectF rect() const;
+
+    void setTexture(QSGTexture *texture);
+    QSGTexture *texture() const;
+
+    void setFiltering(QSGTexture::Filtering filtering);
+    QSGTexture::Filtering filtering() const;
+
+private:
+    QSGGeometry m_geometry;
+    QSGTextureMaterial m_opaque_material;
+    QSGTextureMaterialWithOpacity m_material;
+
+    QRectF m_rect;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGSIMPLETEXTURENODE_H
diff --git a/src/declarative/scenegraph/util/qsgtexture.cpp b/src/declarative/scenegraph/util/qsgtexture.cpp
new file mode 100644
index 0000000000..6112e777e4
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexture.cpp
@@ -0,0 +1,403 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define GL_GLEXT_PROTOTYPES
+
+#include <private/qsgtexture_p.h>
+#include <qglfunctions.h>
+#include <private/qsgcontext_p.h>
+#include <qthread.h>
+
+QT_BEGIN_NAMESPACE
+
+QSGTexturePrivate::QSGTexturePrivate()
+    : wrapChanged(false)
+    , filteringChanged(false)
+    , horizontalWrap(QSGTexture::ClampToEdge)
+    , verticalWrap(QSGTexture::ClampToEdge)
+    , mipmapMode(QSGTexture::None)
+    , filterMode(QSGTexture::Nearest)
+{
+}
+
+#ifndef QT_NO_DEBUG
+static int qt_texture_count = 0;
+
+static void qt_print_texture_count()
+{
+    qDebug("Number of leaked textures: %i", qt_texture_count);
+    qt_texture_count = -1;
+}
+#endif
+
+
+
+QSGTexture::QSGTexture()
+    : QObject(*(new QSGTexturePrivate))
+{
+#ifndef QT_NO_DEBUG
+    ++qt_texture_count;
+    static bool atexit_registered = false;
+    if (!atexit_registered) {
+        atexit(qt_print_texture_count);
+        atexit_registered = true;
+    }
+#endif
+}
+
+QSGTexture::~QSGTexture()
+{
+#ifndef QT_NO_DEBUG
+    --qt_texture_count;
+    if (qt_texture_count < 0)
+        qDebug("Material destroyed after qt_print_texture_count() was called.");
+#endif
+}
+
+
+/*!
+    \fn void QSGTexture::setImage(const QImage &image)
+
+    This function may be calld from arbitrary an arbitrary thread and may not
+    use GL calls.
+ */
+
+
+/*!
+    \fn void QSGTexture::bind()
+
+    Call this function to bind this texture to the current texture
+    target.
+
+    Binding a texture may also include uploading the texture data from
+    a previously set QImage.
+ */
+
+void QSGTexture::removeFromAtlas()
+{
+    // default textures are not in atlasses, so do nothing...
+}
+
+/*!
+    Returns weither this texture is part of an atlas or not.
+
+    The default implementation returns false.
+ */
+bool QSGTexture::isAtlasTexture() const
+{
+    return false;
+}
+
+
+/*!
+    Returns the rectangle inside textureSize() that this texture
+    represents in normalized coordinates.
+
+    The default implementation returns a rect at position (0, 0) with
+    width and height of 1.
+ */
+QRectF QSGTexture::textureSubRect() const
+{
+    return QRectF(0, 0, 1, 1);
+}
+
+/*!
+    \fn bool QSGTexture::hasMipmaps() const
+
+    Returns true if the texture data contains mipmap levels.
+ */
+
+
+/*!
+    Sets the mipmap sampling mode to be used for the upcoming bind() call to \a filter.
+
+    Setting the mipmap filtering has no effect it the texture does not have mipmaps.
+
+    \sa hasMipmaps()
+ */
+void QSGTexture::setMipmapFiltering(Filtering filter)
+{
+    Q_D(QSGTexture);
+    if (d->mipmapMode != (uint) filter) {
+        d->mipmapMode = filter;
+        d->filteringChanged = true;
+    }
+}
+
+/*!
+    Returns whether mipmapping should be used when sampling from this texture.
+ */
+QSGTexture::Filtering QSGTexture::mipmapFiltering() const
+{
+    return (QSGTexture::Filtering) d_func()->mipmapMode;
+}
+
+
+/*!
+    Sets the sampling mode to be used for the upcoming bind() call to \a filter.
+ */
+void QSGTexture::setFiltering(QSGTexture::Filtering filter)
+{
+    Q_D(QSGTexture);
+    if (d->filterMode != (uint) filter) {
+        d->filterMode = filter;
+        d->filteringChanged = true;
+    }
+}
+
+QSGTexture::Filtering QSGTexture::filtering() const
+{
+    return (QSGTexture::Filtering) d_func()->filterMode;
+}
+
+
+
+/*!
+    Sets the horizontal wrap mode to be used for the upcoming bind() call to \a hwrap
+ */
+
+void QSGTexture::setHorizontalWrapMode(WrapMode hwrap)
+{
+    Q_D(QSGTexture);
+    if ((uint) hwrap != d->horizontalWrap) {
+        d->horizontalWrap = hwrap;
+        d->wrapChanged = true;
+    }
+}
+
+QSGTexture::WrapMode QSGTexture::horizontalWrapMode() const
+{
+    return (QSGTexture::WrapMode) d_func()->horizontalWrap;
+}
+
+
+
+void QSGTexture::setVerticalWrapMode(WrapMode vwrap)
+{
+    Q_D(QSGTexture);
+    if ((uint) vwrap != d->verticalWrap) {
+        d->verticalWrap = vwrap;
+        d->wrapChanged = true;
+    }
+}
+
+QSGTexture::WrapMode QSGTexture::verticalWrapMode() const
+{
+    return (QSGTexture::WrapMode) d_func()->verticalWrap;
+}
+
+
+/*!
+    Update the texture state to match the filtering, mipmap and wrap options
+    currently set.
+
+    If \a force is true, all properties will be updated regardless of weither
+    they have changed or not.
+ */
+void QSGTexture::updateBindOptions(bool force)
+{
+    Q_D(QSGTexture);
+    if (force || d->filteringChanged) {
+        bool linear = d->filterMode == Linear;
+        GLint minFilter = linear ? GL_LINEAR : GL_NEAREST;
+        GLint magFilter = linear ? GL_LINEAR : GL_NEAREST;
+
+        if (hasMipmaps()) {
+            if (d->mipmapMode == Nearest)
+                minFilter = linear ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST;
+            else if (d->mipmapMode == Linear)
+                minFilter = linear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_LINEAR;
+        }
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
+        d->filteringChanged = false;
+    }
+
+    if (force || d->wrapChanged) {
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, d->horizontalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, d->verticalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE);
+        d->wrapChanged = false;
+    }
+}
+
+QSGPlainTexture::QSGPlainTexture()
+    : QSGTexture()
+    , m_texture_id(0)
+    , m_has_alpha(false)
+    , m_has_mipmaps(false)
+    , m_dirty_bind_options(false)
+    , m_owns_texture(true)
+    , m_mipmaps_generated(false)
+{
+}
+
+
+QSGPlainTexture::~QSGPlainTexture()
+{
+    if (m_texture_id && m_owns_texture)
+        glDeleteTextures(1, &m_texture_id);
+}
+
+#ifdef QT_OPENGL_ES
+static void swizzleBGRAToRGBA(QImage *image)
+{
+    const int width = image->width();
+    const int height = image->height();
+    for (int i = 0; i < height; ++i) {
+        uint *p = (uint *) image->scanLine(i);
+        for (int x = 0; x < width; ++x)
+            p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+    }
+}
+#endif
+
+void QSGPlainTexture::setImage(const QImage &image)
+{
+    m_image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
+#ifdef QT_OPENGL_ES
+    swizzleBGRAToRGBA(&m_image);
+#endif
+
+    m_texture_size = image.size();
+    m_has_alpha = image.hasAlphaChannel();
+    m_dirty_texture = true;
+    m_dirty_bind_options = true;
+ }
+
+void QSGPlainTexture::setTextureId(int id)
+{
+    if (m_texture_id && m_owns_texture)
+        glDeleteTextures(1, &m_texture_id);
+
+    m_texture_id = id;
+    m_dirty_texture = false;
+    m_dirty_bind_options = true;
+    m_image = QImage();
+    m_mipmaps_generated = false;
+}
+
+void QSGPlainTexture::setHasMipmaps(bool mm)
+{
+    m_has_mipmaps = mm;
+    m_mipmaps_generated = false;
+}
+
+
+void QSGPlainTexture::bind()
+{
+    if (!m_dirty_texture) {
+        glBindTexture(GL_TEXTURE_2D, m_texture_id);
+        if (m_has_mipmaps && !m_mipmaps_generated) {
+            const QGLContext *ctx = QGLContext::currentContext();
+            ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D);
+            m_mipmaps_generated = true;
+        }
+        updateBindOptions(m_dirty_bind_options);
+        m_dirty_bind_options = false;
+        return;
+    }
+
+    m_dirty_texture = false;
+
+    if (m_texture_id && m_owns_texture)
+        glDeleteTextures(1, &m_texture_id);
+
+    if (m_image.isNull()) {
+        m_texture_id = 0;
+        m_texture_size = QSize();
+        m_has_mipmaps = false;
+        m_has_alpha = false;
+        return;
+    }
+
+    glGenTextures(1, &m_texture_id);
+    glBindTexture(GL_TEXTURE_2D, m_texture_id);
+
+    // ### TODO: check for out-of-memory situations...
+    int w = m_image.width();
+    int h = m_image.height();
+
+#ifdef QT_OPENGL_ES
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+    for (int i = 0; i < m_image.height(); ++i)
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, m_image.constScanLine(h - 1 - i));
+#else
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
+    for (int i = 0; i < m_image.height(); ++i)
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i, w, 1, GL_BGRA, GL_UNSIGNED_BYTE, m_image.constScanLine(h - 1 - i));
+#endif
+
+    if (m_has_mipmaps) {
+        const QGLContext *ctx = QGLContext::currentContext();
+        ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D);
+        m_mipmaps_generated = true;
+    }
+
+    m_texture_size = QSize(w, h);
+
+    updateBindOptions(m_dirty_bind_options);
+    m_dirty_bind_options = false;
+}
+
+
+/*!
+    \class QSGDynamicTexture
+    \brief The QSGDynamicTexture class serves as a baseclass for dynamically changing textures,
+    such as content that is rendered to FBO's.
+
+    To update the content of the texture, call updateTexture() explicitly. Simply calling bind()
+    will not update the texture.
+ */
+
+
+/*!
+    \fn bool QSGDynamicTexture::updateTexture()
+
+    Call this function to explicitely update the dynamic texture. Calling bind() will bind
+    the content that was previously updated.
+
+    The function returns true if the texture was changed as a resul of the update; otherwise
+    returns false.
+ */
+
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgtexture.h b/src/declarative/scenegraph/util/qsgtexture.h
new file mode 100644
index 0000000000..807dbecae5
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexture.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTURE_H
+#define QSGTEXTURE_H
+
+#include <QObject>
+#include <QImage>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGTexturePrivate;
+class Q_DECLARATIVE_EXPORT QSGTexture : public QObject
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSGTexture)
+
+public:
+    QSGTexture();
+    ~QSGTexture();
+
+    enum WrapMode {
+        Repeat,
+        ClampToEdge
+    };
+
+    enum Filtering {
+        None,
+        Nearest,
+        Linear
+    };
+
+    virtual int textureId() const = 0;
+    virtual QSize textureSize() const = 0;
+    virtual bool hasAlphaChannel() const = 0;
+    virtual bool hasMipmaps() const = 0;
+
+    virtual QRectF textureSubRect() const;
+
+    virtual bool isAtlasTexture() const;
+    virtual void removeFromAtlas();
+
+    virtual void bind() = 0;
+    void updateBindOptions(bool force = false);
+
+    void setMipmapFiltering(Filtering filter);
+    QSGTexture::Filtering mipmapFiltering() const;
+
+    void setFiltering(Filtering filter);
+    QSGTexture::Filtering filtering() const;
+
+    void setHorizontalWrapMode(WrapMode hwrap);
+    QSGTexture::WrapMode horizontalWrapMode() const;
+
+    void setVerticalWrapMode(WrapMode vwrap);
+    QSGTexture::WrapMode verticalWrapMode() const;
+
+    inline QRectF convertToNormalizedSourceRect(const QRectF &rect) const;
+
+protected:
+    QSGTexture(QSGTexturePrivate &dd);
+};
+
+QRectF QSGTexture::convertToNormalizedSourceRect(const QRectF &rect) const
+{
+    QSize s = textureSize();
+    QRectF r = textureSubRect();
+
+    qreal sx = r.width() / s.width();
+    qreal sy = r.height() / s.height();
+
+    return QRectF(r.x() + rect.x() * sx,
+                  r.y() + rect.y() * sy,
+                  rect.width() * sx,
+                  rect.height() * sy);
+}
+
+
+class QSGDynamicTexture : public QSGTexture
+{
+    Q_OBJECT
+public:
+    virtual bool updateTexture() = 0;
+
+Q_SIGNALS:
+    void textureChanged();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/util/qsgtexture_p.h b/src/declarative/scenegraph/util/qsgtexture_p.h
new file mode 100644
index 0000000000..8ea0930235
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexture_p.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTURE_P_H
+#define QSGTEXTURE_P_H
+
+#include <private/qobject_p.h>
+
+#include <QtOpenGL/qgl.h>
+
+#include "qsgtexture.h"
+#include <private/qsgcontext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGTexturePrivate : public QObjectPrivate
+{
+    Q_DECLARE_PUBLIC(QSGTexture);
+public:
+    QSGTexturePrivate();
+
+    uint wrapChanged : 1;
+    uint filteringChanged : 1;
+
+    uint horizontalWrap : 1;
+    uint verticalWrap : 1;
+    uint mipmapMode : 2;
+    uint filterMode : 2;
+};
+
+class Q_DECLARATIVE_EXPORT QSGPlainTexture : public QSGTexture
+{
+    Q_OBJECT
+public:
+    QSGPlainTexture();
+    virtual ~QSGPlainTexture();
+
+    void setOwnsTexture(bool owns) { m_owns_texture = owns; }
+    bool ownsTexture() const { return m_owns_texture; }
+
+    void setTextureId(int id);
+    int textureId() const { return m_texture_id; }
+
+    void setTextureSize(const QSize &size) { m_texture_size = size; }
+    QSize textureSize() const { return m_texture_size; }
+
+    void setHasAlphaChannel(bool alpha) { m_has_alpha = alpha; }
+    bool hasAlphaChannel() const { return m_has_alpha; }
+
+    void setHasMipmaps(bool mm);
+    bool hasMipmaps() const { return m_has_mipmaps; }
+
+    void setImage(const QImage &image);
+
+    virtual void bind();
+
+protected:
+    QImage m_image;
+
+    GLuint m_texture_id;
+    QSize m_texture_size;
+
+    uint m_has_alpha : 1;
+    uint m_has_mipmaps : 1;
+    uint m_dirty_texture : 1;
+    uint m_dirty_bind_options : 1;
+    uint m_owns_texture : 1;
+    uint m_mipmaps_generated : 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSGTEXTURE_P_H
diff --git a/src/declarative/scenegraph/util/qsgtexturematerial.cpp b/src/declarative/scenegraph/util/qsgtexturematerial.cpp
new file mode 100644
index 0000000000..717bf82090
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexturematerial.cpp
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtexturematerial_p.h"
+
+#include <qglshaderprogram.h>
+
+QT_BEGIN_NAMESPACE
+
+const char qt_scenegraph_texture_material_vertex_code[] =
+    "uniform highp mat4 qt_Matrix;                      \n"
+    "attribute highp vec4 qt_VertexPosition;            \n"
+    "attribute highp vec2 qt_VertexTexCoord;            \n"
+    "varying highp vec2 qt_TexCoord;                    \n"
+    "void main() {                                      \n"
+    "    qt_TexCoord = qt_VertexTexCoord;               \n"
+    "    gl_Position = qt_Matrix * qt_VertexPosition;   \n"
+    "}";
+
+const char qt_scenegraph_texture_material_fragment[] =
+    "varying highp vec2 qt_TexCoord;                    \n"
+    "uniform sampler2D qt_Texture;                      \n"
+    "void main() {                                      \n"
+    "    gl_FragColor = texture2D(qt_Texture, qt_TexCoord);\n"
+    "}";
+
+
+const char *QSGTextureMaterialShader::vertexShader() const
+{
+    return qt_scenegraph_texture_material_vertex_code;
+}
+
+const char *QSGTextureMaterialShader::fragmentShader() const
+{
+    return qt_scenegraph_texture_material_fragment;
+}
+
+QSGMaterialType QSGTextureMaterialShader::type;
+
+char const *const *QSGTextureMaterialShader::attributeNames() const
+{
+    static char const *const attr[] = { "qt_VertexPosition", "qt_VertexTexCoord", 0 };
+    return attr;
+}
+
+void QSGTextureMaterialShader::initialize()
+{
+    m_matrix_id = m_program.uniformLocation("qt_Matrix");
+}
+
+void QSGTextureMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+    QSGTextureMaterial *tx = static_cast<QSGTextureMaterial *>(newEffect);
+    QSGTextureMaterial *oldTx = static_cast<QSGTextureMaterial *>(oldEffect);
+
+    QSGTexture *t = tx->texture();
+
+    t->setFiltering(tx->filtering());
+    t->setHorizontalWrapMode(tx->horizontalWrapMode());
+    t->setVerticalWrapMode(tx->verticalWrapMode());
+    t->setMipmapFiltering(tx->mipmapFiltering());
+
+    if (oldTx == 0 || oldTx->texture()->textureId() != t->textureId())
+        t->bind();
+    else
+        t->updateBindOptions();
+
+    if (state.isMatrixDirty())
+        m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+}
+
+
+QSGTextureMaterial::QSGTextureMaterial()
+    : m_texture(0)
+    , m_filtering(QSGTexture::Nearest)
+    , m_mipmap_filtering(QSGTexture::Nearest)
+    , m_horizontal_wrap(QSGTexture::ClampToEdge)
+    , m_vertical_wrap(QSGTexture::ClampToEdge)
+{
+}
+
+
+
+QSGMaterialType *QSGTextureMaterial::type() const
+{
+    return &QSGTextureMaterialShader::type;
+}
+
+QSGMaterialShader *QSGTextureMaterial::createShader() const
+{
+    return new QSGTextureMaterialShader;
+}
+
+
+void QSGTextureMaterial::setTexture(QSGTexture *texture)
+{
+    m_texture = texture;
+    setFlag(Blending, m_texture ? m_texture->hasAlphaChannel() : false);
+}
+
+
+int QSGTextureMaterial::compare(const QSGMaterial *o) const
+{
+    Q_ASSERT(o && type() == o->type());
+    const QSGTextureMaterial *other = static_cast<const QSGTextureMaterial *>(o);
+    if (int diff = m_texture->textureId() - other->texture()->textureId())
+        return diff;
+    return int(m_filtering) - int(other->m_filtering);
+}
+
+// QSGTextureMaterialWithOpacity
+
+static const char qt_scenegraph_texture_material_opacity_fragment[] =
+    "varying highp vec2 qt_TexCoord;                       \n"
+    "uniform sampler2D qt_Texture;                         \n"
+    "uniform lowp float opacity;                        \n"
+    "void main() {                                      \n"
+    "    gl_FragColor = texture2D(qt_Texture, qt_TexCoord) * opacity; \n"
+    "}";
+
+class TextureMaterialWithOpacityShader : public QSGTextureMaterialShader
+{
+public:
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual void initialize();
+
+    static QSGMaterialType type;
+
+protected:
+    virtual const char *fragmentShader() const { return qt_scenegraph_texture_material_opacity_fragment; }
+
+    int m_opacity_id;
+};
+QSGMaterialType TextureMaterialWithOpacityShader::type;
+
+QSGMaterialType *QSGTextureMaterialWithOpacity::type() const
+{
+    return &TextureMaterialWithOpacityShader::type;
+}
+
+QSGMaterialShader *QSGTextureMaterialWithOpacity::createShader() const
+{
+    return new TextureMaterialWithOpacityShader;
+}
+
+void TextureMaterialWithOpacityShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+    Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());
+    if (state.isOpacityDirty())
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+
+    QSGTextureMaterialShader::updateState(state, newEffect, oldEffect);
+}
+
+void TextureMaterialWithOpacityShader::initialize()
+{
+    QSGTextureMaterialShader::initialize();
+    m_opacity_id = m_program.uniformLocation("opacity");
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgtexturematerial.h b/src/declarative/scenegraph/util/qsgtexturematerial.h
new file mode 100644
index 0000000000..db8e5aa43e
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexturematerial.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTUREMATERIAL_H
+#define TEXTUREMATERIAL_H
+
+#include "qsgmaterial.h"
+#include <qsgtexture.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class Q_DECLARATIVE_EXPORT QSGTextureMaterial : public QSGMaterial
+{
+public:
+    QSGTextureMaterial();
+
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const;
+
+    void setTexture(QSGTexture *texture);
+    QSGTexture *texture() const { return m_texture; }
+
+    void setMipmapFiltering(QSGTexture::Filtering filtering) { m_mipmap_filtering = filtering; }
+    QSGTexture::Filtering mipmapFiltering() const { return (QSGTexture::Filtering) m_mipmap_filtering; }
+
+    void setFiltering(QSGTexture::Filtering filtering) { m_filtering = filtering; }
+    QSGTexture::Filtering filtering() const { return (QSGTexture::Filtering)  m_filtering; }
+
+    void setHorizontalWrapMode(QSGTexture::WrapMode mode) { m_horizontal_wrap = mode; }
+    QSGTexture::WrapMode horizontalWrapMode() const { return (QSGTexture::WrapMode) m_horizontal_wrap; }
+
+    void setVerticalWrapMode(QSGTexture::WrapMode mode) { m_vertical_wrap = mode; }
+    QSGTexture::WrapMode verticalWrapMode() const { return (QSGTexture::WrapMode) m_vertical_wrap; }
+
+protected:
+    QSGTexture *m_texture;
+
+    uint m_filtering: 2;
+    uint m_mipmap_filtering: 2;
+    uint m_vertical_wrap: 1;
+    uint m_horizontal_wrap : 1;
+};
+
+
+class Q_DECLARATIVE_EXPORT QSGTextureMaterialWithOpacity : public QSGTextureMaterial
+{
+public:
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // TEXTUREMATERIAL_H
diff --git a/src/declarative/scenegraph/util/qsgtexturematerial_p.h b/src/declarative/scenegraph/util/qsgtexturematerial_p.h
new file mode 100644
index 0000000000..6b811c6b2e
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtexturematerial_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTUREMATERIAL_P_H
+#define TEXTUREMATERIAL_P_H
+
+#include "qsgtexturematerial.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_DECLARATIVE_EXPORT QSGTextureMaterialShader : public QSGMaterialShader
+{
+public:
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+
+    static QSGMaterialType type;
+
+protected:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    int m_matrix_id;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSGTEXTUREMATERIAL_P_H
diff --git a/src/declarative/scenegraph/util/qsgtextureprovider.cpp b/src/declarative/scenegraph/util/qsgtextureprovider.cpp
new file mode 100644
index 0000000000..b41188772e
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtextureprovider.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgtextureprovider_p.h"
+
+#ifndef GL_CLAMP_TO_EDGE
+#define GL_CLAMP_TO_EDGE 0x812F
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \class QSGTextureProvider
+    \brief The QSGTextureProvider class encapsulates texture based entities in QML.
+ */
+
+
+/*!
+    Convenience function for casting a QObject to a QSGTextureProvider
+ */
+QSGTextureProvider *QSGTextureProvider::from(QObject *object)
+{
+    return static_cast<QSGTextureProvider *>(object->qt_metacast("QSGTextureProvider"));
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgtextureprovider_p.h b/src/declarative/scenegraph/util/qsgtextureprovider_p.h
new file mode 100644
index 0000000000..1e0e9f6c68
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgtextureprovider_p.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSGTEXTUREPROVIDER_H
+#define QSGTEXTUREPROVIDER_H
+
+#include <qgl.h>
+
+#include "qsgtexture.h"
+#include "qobject.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGTextureProvider
+{
+public:
+    virtual QSGTexture *texture() const = 0;
+    virtual const char *textureChangedSignal() { return 0; }
+
+    static QSGTextureProvider *from(QObject *object);
+};
+Q_DECLARE_INTERFACE(QSGTextureProvider, "QSGTextureProvider")
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp b/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp
new file mode 100644
index 0000000000..bbd57ea1c2
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsgvertexcolormaterial_p.h"
+
+#include <qglshaderprogram.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSGVertexColorMaterialShader : public QSGMaterialShader
+{
+public:
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect);
+    virtual char const *const *attributeNames() const;
+
+    static QSGMaterialType type;
+
+private:
+    virtual void initialize();
+    virtual const char *vertexShader() const;
+    virtual const char *fragmentShader() const;
+
+    int m_matrix_id;
+    int m_opacity_id;
+};
+
+QSGMaterialType QSGVertexColorMaterialShader::type;
+
+void QSGVertexColorMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *)
+{
+    if (!(newEffect->flags() & QSGMaterial::Blending) || state.isOpacityDirty())
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+
+    if (state.isMatrixDirty())
+        m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+}
+
+char const *const *QSGVertexColorMaterialShader::attributeNames() const
+{
+    static const char *const attr[] = { "vertexCoord", "vertexColor", 0 };
+    return attr;
+}
+
+void QSGVertexColorMaterialShader::initialize()
+{
+    m_matrix_id = m_program.uniformLocation("matrix");
+    m_opacity_id = m_program.uniformLocation("opacity");
+}
+
+const char *QSGVertexColorMaterialShader::vertexShader() const {
+    return
+        "attribute highp vec4 vertexCoord;              \n"
+        "attribute highp vec4 vertexColor;              \n"
+        "uniform highp mat4 matrix;                     \n"
+        "uniform highp float opacity;                   \n"
+        "varying lowp vec4 color;                       \n"
+        "void main() {                                  \n"
+        "    gl_Position = matrix * vertexCoord;        \n"
+        "    color = vertexColor * opacity;             \n"
+        "}";
+}
+
+const char *QSGVertexColorMaterialShader::fragmentShader() const {
+    return
+        "varying lowp vec4 color;                       \n"
+        "void main() {                                  \n"
+        "    gl_FragColor = color;                      \n"
+        "}";
+}
+
+
+QSGVertexColorMaterial::QSGVertexColorMaterial(bool opaque) : m_opaque(opaque)
+{
+    setFlag(Blending, !opaque);
+}
+
+void QSGVertexColorMaterial::setOpaque(bool opaque)
+{
+    setFlag(Blending, !opaque);
+    m_opaque = opaque;
+}
+
+QSGMaterialType *QSGVertexColorMaterial::type() const
+{
+    return &QSGVertexColorMaterialShader::type;
+}
+
+QSGMaterialShader *QSGVertexColorMaterial::createShader() const
+{
+    return new QSGVertexColorMaterialShader;
+}
+
+bool QSGVertexColorMaterial::is(const QSGMaterial *effect)
+{
+    return effect->type() == &QSGVertexColorMaterialShader::type;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgvertexcolormaterial_p.h b/src/declarative/scenegraph/util/qsgvertexcolormaterial_p.h
new file mode 100644
index 0000000000..9f5e0ed1db
--- /dev/null
+++ b/src/declarative/scenegraph/util/qsgvertexcolormaterial_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VERTEXCOLORMATERIAL_H
+#define VERTEXCOLORMATERIAL_H
+
+#include <qsgmaterial.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGVertexColorMaterial : public QSGMaterial
+{
+public:
+    QSGVertexColorMaterial(bool opaque = false);
+    virtual QSGMaterialType *type() const;
+    virtual QSGMaterialShader *createShader() const;
+
+    void setOpaque(bool opaque);
+    bool opaque() const { return m_opaque; }
+
+    static bool is(const QSGMaterial *effect);
+
+private:
+    bool m_opaque;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // VERTEXCOLORMATERIAL_H
diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp
index a29854fa84..dcce7db813 100644
--- a/src/declarative/util/qdeclarativepixmapcache.cpp
+++ b/src/declarative/util/qdeclarativepixmapcache.cpp
@@ -47,6 +47,10 @@
 #include <private/qdeclarativeglobal_p.h>
 #include <private/qdeclarativeengine_p.h>
 
+#include <qsgtexture.h>
+#include <private/qsgtexture_p.h>
+#include <private/qsgcontext_p.h>
+
 #include <QCoreApplication>
 #include <QImageReader>
 #include <QHash>
@@ -75,7 +79,7 @@ QT_BEGIN_NAMESPACE
 #if defined(Q_WS_QWS) || defined(Q_WS_WINCE)
 static int cache_limit = 2048 * 1024; // 2048 KB cache limit for embedded
 #else
-static int cache_limit = 10240 * 1024; // 10 MB cache limit for desktop
+static int cache_limit = 128 * 1024; // 10 MB cache limit for desktop
 #endif
 
 class QDeclarativePixmapReader;
@@ -98,14 +102,18 @@ public:
 
     class Event : public QEvent {
     public:
-        Event(ReadError, const QString &, const QSize &, const QImage &);
+        Event(ReadError, const QString &, const QSize &, const QImage &image);
+        Event(ReadError, const QString &, const QSize &, QSGTexture *t, QSGContext *context);
 
         ReadError error;
         QString errorString;
         QSize implicitSize;
         QImage image;
+        QSGTexture *texture;
+        QSGContext *context;
     };
     void postReply(ReadError, const QString &, const QSize &, const QImage &);
+    void postReply(ReadError, const QString &, const QSize &, QSGTexture *t, QSGContext *context);
 
 
 Q_SIGNALS:
@@ -184,32 +192,46 @@ class QDeclarativePixmapData
 public:
     QDeclarativePixmapData(const QUrl &u, const QSize &s, const QString &e)
     : refCount(1), inCache(false), pixmapStatus(QDeclarativePixmap::Error), 
-      url(u), errorString(e), requestSize(s), reply(0), prevUnreferenced(0),
+      url(u), errorString(e), requestSize(s), texture(0), context(0), reply(0), prevUnreferenced(0),
       prevUnreferencedPtr(0), nextUnreferenced(0)
     {
     }
 
     QDeclarativePixmapData(const QUrl &u, const QSize &r)
     : refCount(1), inCache(false), pixmapStatus(QDeclarativePixmap::Loading), 
-      url(u), requestSize(r), reply(0), prevUnreferenced(0), prevUnreferencedPtr(0), 
+      url(u), requestSize(r), texture(0), context(0), reply(0), prevUnreferenced(0), prevUnreferencedPtr(0),
       nextUnreferenced(0)
     {
     }
 
     QDeclarativePixmapData(const QUrl &u, const QPixmap &p, const QSize &s, const QSize &r)
-    : refCount(1), inCache(false), privatePixmap(false), pixmapStatus(QDeclarativePixmap::Ready), 
-      url(u), pixmap(p), implicitSize(s), requestSize(r), reply(0), prevUnreferenced(0),
+    : refCount(1), inCache(false), privatePixmap(false), pixmapStatus(QDeclarativePixmap::Ready),
+      url(u), pixmap(p), implicitSize(s), requestSize(r), texture(0), context(0), reply(0), prevUnreferenced(0),
+      prevUnreferencedPtr(0), nextUnreferenced(0)
+    {
+    }
+
+    QDeclarativePixmapData(const QUrl &u, QSGTexture *t, QSGContext *c, const QSize &s, const QSize &r)
+    : refCount(1), inCache(false), privatePixmap(false), pixmapStatus(QDeclarativePixmap::Ready),
+      url(u), implicitSize(s), requestSize(r), texture(t), context(c), reply(0), prevUnreferenced(0),
       prevUnreferencedPtr(0), nextUnreferenced(0)
     {
     }
 
     QDeclarativePixmapData(const QPixmap &p)
     : refCount(1), inCache(false), privatePixmap(true), pixmapStatus(QDeclarativePixmap::Ready),
-      pixmap(p), implicitSize(p.size()), requestSize(p.size()), reply(0), prevUnreferenced(0),
+      pixmap(p), implicitSize(p.size()), requestSize(p.size()), texture(0), context(0), reply(0), prevUnreferenced(0),
       prevUnreferencedPtr(0), nextUnreferenced(0)
     {
     }
 
+    ~QDeclarativePixmapData()
+    {
+        if (texture && context) {
+            context->schdelueTextureForCleanup(texture);
+        }
+    }
+
     int cost() const;
     void addref();
     void release();
@@ -228,6 +250,9 @@ public:
     QSize implicitSize;
     QSize requestSize;
 
+    QSGTexture *texture;
+    QSGContext *context;
+
     QDeclarativePixmapReply *reply;
 
     QDeclarativePixmapData *prevUnreferenced;
@@ -248,15 +273,28 @@ int QDeclarativePixmapReader::downloadProgress = -1;
 int QDeclarativePixmapReader::threadNetworkRequestDone = -1;
 
 
-void QDeclarativePixmapReply::postReply(ReadError error, const QString &errorString, 
+void QDeclarativePixmapReply::postReply(ReadError error, const QString &errorString,
                                         const QSize &implicitSize, const QImage &image)
 {
     loading = false;
     QCoreApplication::postEvent(this, new Event(error, errorString, implicitSize, image));
 }
 
+void QDeclarativePixmapReply::postReply(ReadError error, const QString &errorString,
+                                        const QSize &implicitSize, QSGTexture *texture,
+                                        QSGContext *context)
+{
+    loading = false;
+    QCoreApplication::postEvent(this, new Event(error, errorString, implicitSize, texture, context));
+}
+
 QDeclarativePixmapReply::Event::Event(ReadError e, const QString &s, const QSize &iSize, const QImage &i)
-: QEvent(QEvent::User), error(e), errorString(s), implicitSize(iSize), image(i)
+    : QEvent(QEvent::User), error(e), errorString(s), implicitSize(iSize), image(i)
+{
+}
+
+QDeclarativePixmapReply::Event::Event(ReadError e, const QString &s, const QSize &iSize, QSGTexture *t, QSGContext *c)
+    : QEvent(QEvent::User), error(e), errorString(s), implicitSize(iSize), texture(t), context(c)
 {
 }
 
@@ -355,6 +393,8 @@ void QDeclarativePixmapReader::networkRequestDone(QNetworkReply *reply)
         }
 
         QImage image;
+        QSGTexture *texture = 0;
+        QSGContext *ctx = QDeclarativeEnginePrivate::get(engine)->sgContext;
         QDeclarativePixmapReply::ReadError error = QDeclarativePixmapReply::NoError;
         QString errorString;
         QSize readSize;
@@ -365,13 +405,26 @@ void QDeclarativePixmapReader::networkRequestDone(QNetworkReply *reply)
             QByteArray all = reply->readAll();
             QBuffer buff(&all);
             buff.open(QIODevice::ReadOnly);
-            if (!readImage(reply->url(), &buff, &image, &errorString, &readSize, job->requestSize)) {
-                error = QDeclarativePixmapReply::Decoding;
+            if (ctx && ctx->canDecodeImageToTexture())
+                texture = ctx->decodeImageToTexture(&buff, &readSize, job->requestSize);
+            if (!texture) {
+                if (!readImage(reply->url(), &buff, &image, &errorString, &readSize, job->requestSize)) {
+                    error = QDeclarativePixmapReply::Decoding;
+                } else if (ctx) {
+                    texture = ctx->createTexture(image);
+                }
             }
         }
         // send completion event to the QDeclarativePixmapReply
         mutex.lock();
-        if (!cancelled.contains(job)) job->postReply(error, errorString, readSize, image);
+        if (!cancelled.contains(job)) {
+            if (texture)
+                job->postReply(error, errorString, readSize, texture, ctx);
+            else
+                job->postReply(error, errorString, readSize, image);
+        } else {
+            delete texture;
+        }
         mutex.unlock();
     }
     reply->deleteLater();
@@ -446,23 +499,46 @@ void QDeclarativePixmapReader::processJobs()
 void QDeclarativePixmapReader::processJob(QDeclarativePixmapReply *runningJob, const QUrl &url, 
                                           const QSize &requestSize)
 {
+    QSGContext *sgContext = QDeclarativeEnginePrivate::get(engine)->sgContext;
+
     // fetch
     if (url.scheme() == QLatin1String("image")) {
         // Use QmlImageProvider
         QSize readSize;
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
-        QImage image = ep->getImageFromProvider(url, &readSize, requestSize);
+        QDeclarativeImageProvider::ImageType imageType = ep->getImageProviderType(url);
+
+        if (imageType == QDeclarativeImageProvider::Image) {
+            QImage image = ep->getImageFromProvider(url, &readSize, requestSize);
+            QDeclarativePixmapReply::ReadError errorCode = QDeclarativePixmapReply::NoError;
+            QString errorStr;
+            if (image.isNull()) {
+                errorCode = QDeclarativePixmapReply::Loading;
+                errorStr = QDeclarativePixmap::tr("Failed to get image from provider: %1").arg(url.toString());
+            }
+            mutex.lock();
+            if (!cancelled.contains(runningJob)) {
+                if (sgContext)
+                    runningJob->postReply(errorCode, errorStr, readSize, sgContext->createTexture(image), sgContext);
+                else
+                    runningJob->postReply(errorCode, errorStr, readSize, image);
+            }
+            mutex.unlock();
+        } else {
+            QSGTexture *t = ep->getTextureFromProvider(url, &readSize, requestSize);
+            QDeclarativePixmapReply::ReadError errorCode = QDeclarativePixmapReply::NoError;
+            QString errorStr;
+            if (!t) {
+                errorCode = QDeclarativePixmapReply::Loading;
+                errorStr = QDeclarativePixmap::tr("Failed to get texture from provider: %1").arg(url.toString());
+            }
+            mutex.lock();
+            if (!cancelled.contains(runningJob))
+                runningJob->postReply(errorCode, errorStr, readSize, t, sgContext);
+            mutex.unlock();
 
-        QDeclarativePixmapReply::ReadError errorCode = QDeclarativePixmapReply::NoError;
-        QString errorStr;
-        if (image.isNull()) {
-            errorCode = QDeclarativePixmapReply::Loading;
-            errorStr = QDeclarativePixmap::tr("Failed to get image from provider: %1").arg(url.toString());
         }
 
-        mutex.lock();
-        if (!cancelled.contains(runningJob)) runningJob->postReply(errorCode, errorStr, readSize, image);
-        mutex.unlock();
     } else {
         QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url);
         if (!lf.isEmpty()) {
@@ -472,15 +548,30 @@ void QDeclarativePixmapReader::processJob(QDeclarativePixmapReply *runningJob, c
             QString errorStr;
             QFile f(lf);
             QSize readSize;
+            QSGTexture *texture = 0;
             if (f.open(QIODevice::ReadOnly)) {
-                if (!readImage(url, &f, &image, &errorStr, &readSize, requestSize))
-                    errorCode = QDeclarativePixmapReply::Loading;
+                if (sgContext && sgContext ->canDecodeImageToTexture())
+                    texture = sgContext->decodeImageToTexture(&f, &readSize, requestSize);
+                if (!texture) {
+                    if (!readImage(url, &f, &image, &errorStr, &readSize, requestSize)) {
+                        errorCode = QDeclarativePixmapReply::Loading;
+                    } else if (sgContext) {
+                        texture = sgContext->createTexture(image);
+                    }
+                }
             } else {
                 errorStr = QDeclarativePixmap::tr("Cannot open: %1").arg(url.toString());
                 errorCode = QDeclarativePixmapReply::Loading;
             }
             mutex.lock();
-            if (!cancelled.contains(runningJob)) runningJob->postReply(errorCode, errorStr, readSize, image);
+            if (!cancelled.contains(runningJob)) {
+                if (texture)
+                    runningJob->postReply(errorCode, errorStr, readSize, texture, sgContext);
+                else
+                    runningJob->postReply(errorCode, errorStr, readSize, image);
+            } else {
+                delete texture;
+            }
             mutex.unlock();
         } else {
             // Network resource
@@ -704,7 +795,11 @@ bool QDeclarativePixmapReply::event(QEvent *event)
             data->pixmapStatus = (de->error == NoError) ? QDeclarativePixmap::Ready : QDeclarativePixmap::Error;
             
             if (data->pixmapStatus == QDeclarativePixmap::Ready) {
-                data->pixmap = QPixmap::fromImage(de->image);
+                if (de->texture) {
+                    data->texture = de->texture;
+                    data->context = de->context;
+                } else
+                    data->pixmap = QPixmap::fromImage(de->image);
                 data->implicitSize = de->implicitSize;
             } else {
                 data->errorString = de->errorString;
@@ -774,17 +869,32 @@ void QDeclarativePixmapData::removeFromCache()
 
 static QDeclarativePixmapData* createPixmapDataSync(QDeclarativeEngine *engine, const QUrl &url, const QSize &requestSize, bool *ok)
 {
+    QSGContext *sgContext = QDeclarativeEnginePrivate::get(engine)->sgContext;
+
     if (url.scheme() == QLatin1String("image")) {
         QSize readSize;
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
         QDeclarativeImageProvider::ImageType imageType = ep->getImageProviderType(url);
 
         switch (imageType) {
+            case QDeclarativeImageProvider::Texture:
+            {
+                QSGTexture *texture = ep->getTextureFromProvider(url, &readSize, requestSize);
+                if (texture) {
+                    *ok = true;
+                    return new QDeclarativePixmapData(url, texture, sgContext, readSize, requestSize);
+                }
+            }
+
             case QDeclarativeImageProvider::Image:
             {
                 QImage image = ep->getImageFromProvider(url, &readSize, requestSize);
                 if (!image.isNull()) {
                     *ok = true;
+                    if (sgContext) {
+                        QSGTexture *t = sgContext->createTexture(image);
+                        return new QDeclarativePixmapData(url, t, sgContext,readSize, requestSize);
+                    }
                     return new QDeclarativePixmapData(url, QPixmap::fromImage(image), readSize, requestSize);
                 }
             }
@@ -793,6 +903,10 @@ static QDeclarativePixmapData* createPixmapDataSync(QDeclarativeEngine *engine,
                 QPixmap pixmap = ep->getPixmapFromProvider(url, &readSize, requestSize);
                 if (!pixmap.isNull()) {
                     *ok = true;
+                    if (sgContext) {
+                        QSGTexture *t = sgContext->createTexture(pixmap.toImage());
+                        return new QDeclarativePixmapData(url, t, sgContext,readSize, requestSize);
+                    }
                     return new QDeclarativePixmapData(url, pixmap, readSize, requestSize);
                 }
             }
@@ -812,11 +926,29 @@ static QDeclarativePixmapData* createPixmapDataSync(QDeclarativeEngine *engine,
     QString errorString;
 
     if (f.open(QIODevice::ReadOnly)) {
+        QSGContext *ctx = QDeclarativeEnginePrivate::get(engine)->sgContext;
+        QSGTexture *texture = 0;
         QImage image;
-        if (readImage(url, &f, &image, &errorString, &readSize, requestSize)) {
+
+        if (ctx && ctx->canDecodeImageToTexture()) {
+            texture = ctx->decodeImageToTexture(&f, &readSize, requestSize);
             *ok = true;
-            return new QDeclarativePixmapData(url, QPixmap::fromImage(image), readSize, requestSize);
         }
+
+        if (!texture) {
+            if (readImage(url, &f, &image, &errorString, &readSize, requestSize))
+                *ok = true;
+
+            if (ok && ctx) {
+                texture = ctx->createTexture(image);
+            }
+        }
+
+        if (texture)
+            return new QDeclarativePixmapData(url, texture, ctx, readSize, requestSize);
+        else
+            return new QDeclarativePixmapData(url, QPixmap::fromImage(image), readSize, requestSize);
+
     } else {
         errorString = QDeclarativePixmap::tr("Cannot open: %1").arg(url.toString());
     }
@@ -916,6 +1048,11 @@ const QSize &QDeclarativePixmap::requestSize() const
         return nullPixmap()->size;
 }
 
+QSGTexture *QDeclarativePixmap::texture() const
+{
+    return d ? d->texture : 0;
+}
+
 const QPixmap &QDeclarativePixmap::pixmap() const
 {
     if (d) 
@@ -935,7 +1072,7 @@ void QDeclarativePixmap::setPixmap(const QPixmap &p)
 int QDeclarativePixmap::width() const
 {
     if (d) 
-        return d->pixmap.width();
+        return d->texture ? d->texture->textureSize().width() : d->pixmap.width();
     else
         return 0;
 }
@@ -943,7 +1080,7 @@ int QDeclarativePixmap::width() const
 int QDeclarativePixmap::height() const
 {
     if (d) 
-        return d->pixmap.height();
+        return d->texture? d->texture->textureSize().height() : d->pixmap.height();
     else
         return 0;
 }
@@ -951,7 +1088,7 @@ int QDeclarativePixmap::height() const
 QRect QDeclarativePixmap::rect() const
 {
     if (d)
-        return d->pixmap.rect();
+        return d->texture ? QRect(QPoint(), d->texture->textureSize()) : d->pixmap.rect();
     else
         return QRect();
 }
diff --git a/src/declarative/util/qdeclarativepixmapcache_p.h b/src/declarative/util/qdeclarativepixmapcache_p.h
index 1cf76dda71..b917693e3e 100644
--- a/src/declarative/util/qdeclarativepixmapcache_p.h
+++ b/src/declarative/util/qdeclarativepixmapcache_p.h
@@ -55,6 +55,8 @@ QT_MODULE(Declarative)
 
 class QDeclarativeEngine;
 class QDeclarativePixmapData;
+class QSGTexture;
+
 class Q_DECLARATIVE_EXPORT QDeclarativePixmap
 {
     Q_DECLARE_TR_FUNCTIONS(QDeclarativePixmap)
@@ -85,6 +87,8 @@ public:
     const QPixmap &pixmap() const;
     void setPixmap(const QPixmap &);
 
+    QSGTexture *texture() const;
+
     QRect rect() const;
     int width() const;
     int height() const;
diff --git a/src/imports/etcprovider/etcprovider.pro b/src/imports/etcprovider/etcprovider.pro
new file mode 100644
index 0000000000..b48235eed8
--- /dev/null
+++ b/src/imports/etcprovider/etcprovider.pro
@@ -0,0 +1,19 @@
+TARGET  = qmletcproviderplugin
+TARGETPATH = Qt/labs/etcprovider
+include(../qimportbase.pri)
+!contains(QT_CONFIG, egl):DEFINES += QT_NO_EGL
+
+QT += declarative opengl
+
+SOURCES += qetcprovider.cpp plugin.cpp
+HEADERS += qetcprovider.h plugin.h
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/imports/$$TARGETPATH
+target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
+
+qmldir.files += $$PWD/qmldir
+qmldir.path +=  $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
+
+INSTALLS += target qmldir
+
+OTHER_FILES +=
diff --git a/src/imports/etcprovider/plugin.cpp b/src/imports/etcprovider/plugin.cpp
new file mode 100644
index 0000000000..ac2d803842
--- /dev/null
+++ b/src/imports/etcprovider/plugin.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "plugin.h"
+#include "qetcprovider.h"
+
+#include <QDeclarativeEngine>
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+class QEtcDummyObject : public QObject
+{
+public:
+    QEtcDummyObject() {}
+};
+
+void EtcProviderPlugin::registerTypes(const char *uri)
+{
+    //### this is required or "import Qt.labs.etcprovider 1.0" will give errors
+    //### this plugin should eventually be replaced by a non-import type plugin
+    //    (once it is available)
+    qmlRegisterType<QEtcDummyObject>(uri,1,0,"EtcObject");
+}
+
+void EtcProviderPlugin::initializeEngine(QDeclarativeEngine *engine, const char *uri)
+{
+    qDebug () << uri;
+    engine->addImageProvider(QLatin1String("etc"), new QEtcProvider());
+}
+
+QT_END_NAMESPACE
+
+Q_EXPORT_PLUGIN2(qmletcproviderplugin, QT_PREPEND_NAMESPACE(EtcProviderPlugin))
diff --git a/src/imports/particles/particles.cpp b/src/imports/etcprovider/plugin.h
similarity index 61%
rename from src/imports/particles/particles.cpp
rename to src/imports/etcprovider/plugin.h
index ca2b0609cb..b697f72679 100644
--- a/src/imports/particles/particles.cpp
+++ b/src/imports/etcprovider/plugin.h
@@ -1,10 +1,10 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the demonstration applications of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
 ** No Commercial Usage
@@ -39,31 +39,30 @@
 **
 ****************************************************************************/
 
-#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#ifndef ETCPROVIDERPLUGIN_H
+#define ETCPROVIDERPLUGIN_H
+
 #include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/QDeclarativeExtensionPlugin>
 
-#include "qdeclarativeparticles_p.h"
+QT_BEGIN_HEADER
 
 QT_BEGIN_NAMESPACE
 
-class QParticlesQmlModule : public QDeclarativeExtensionPlugin
+QT_MODULE(Declarative)
+
+class EtcProviderPlugin : public QDeclarativeExtensionPlugin
 {
     Q_OBJECT
+
 public:
-    virtual void registerTypes(const char *uri)
-    {
-        Q_ASSERT(QLatin1String(uri) == QLatin1String("Qt.labs.particles"));
-        qmlRegisterType<QDeclarativeParticleMotion>(uri,1,0,"ParticleMotion");
-        qmlRegisterType<QDeclarativeParticleMotionGravity>(uri,1,0,"ParticleMotionGravity");
-        qmlRegisterType<QDeclarativeParticleMotionLinear>(uri,1,0,"ParticleMotionLinear");
-        qmlRegisterType<QDeclarativeParticleMotionWander>(uri,1,0,"ParticleMotionWander");
-        qmlRegisterType<QDeclarativeParticles>(uri,1,0,"Particles");
-    }
+    void registerTypes(const char *uri);
+    void initializeEngine(QDeclarativeEngine *engine, const char *uri);
 };
 
 QT_END_NAMESPACE
 
-#include "particles.moc"
+QT_END_HEADER
 
-Q_EXPORT_PLUGIN2(qmlparticlesplugin, QT_PREPEND_NAMESPACE(QParticlesQmlModule));
+#endif // ETCPROVIDERPLUGIN_H
 
diff --git a/src/imports/etcprovider/qetcprovider.cpp b/src/imports/etcprovider/qetcprovider.cpp
new file mode 100644
index 0000000000..24513edc43
--- /dev/null
+++ b/src/imports/etcprovider/qetcprovider.cpp
@@ -0,0 +1,185 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qetcprovider.h"
+
+#include <QtDebug>
+#include <QFile>
+
+#include <qglfunctions.h>
+
+QT_BEGIN_NAMESPACE
+
+typedef struct {
+    char aName[6];
+    unsigned short iBlank;
+    /* NB: Beware endianess issues here. */
+    unsigned char iPaddedWidthMSB;
+    unsigned char iPaddedWidthLSB;
+    unsigned char iPaddedHeightMSB;
+    unsigned char iPaddedHeightLSB;
+    unsigned char iWidthMSB;
+    unsigned char iWidthLSB;
+    unsigned char iHeightMSB;
+    unsigned char iHeightLSB;
+} ETCHeader;
+
+
+unsigned short getWidth(ETCHeader *pHeader)
+{
+    return (pHeader->iWidthMSB << 8) | pHeader->iWidthLSB;
+}
+
+unsigned short getHeight(ETCHeader *pHeader)
+{
+    return (pHeader->iHeightMSB << 8) | pHeader->iHeightLSB;
+}
+
+unsigned short getPaddedWidth(ETCHeader *pHeader)
+{
+    return (pHeader->iPaddedWidthMSB << 8) | pHeader->iPaddedWidthLSB;
+}
+
+unsigned short getPaddedHeight(ETCHeader *pHeader)
+{
+    return (pHeader->iPaddedHeightMSB << 8) | pHeader->iPaddedHeightLSB;
+}
+
+enum {GL_ETC1_RGB8_OES=0x8d64};
+
+EtcTexture::EtcTexture()
+    : m_texture_id(0)
+{
+
+}
+
+EtcTexture::~EtcTexture()
+{
+    if (m_texture_id)
+        glDeleteTextures(1, &m_texture_id);
+}
+
+
+void EtcTexture::bind()
+{
+    if (m_texture_id) {
+        glBindTexture(GL_TEXTURE_2D, m_texture_id);
+        return;
+    }
+
+#ifdef ETC_DEBUG
+    printf("EtcTextureProvider: about to update that texture...\n");
+#endif
+
+    glGenTextures(1, &m_texture_id);
+
+    glBindTexture(GL_TEXTURE_2D, m_texture_id);
+
+#ifdef ETC_DEBUG
+    qDebug() << "glCompressedTexImage2D, width: " << m_size.width() << "height" << m_size.height() <<
+                "paddedWidth: " << m_paddedSize.width() << "paddedHeight: " << m_paddedSize.height();
+#endif
+
+    const QGLContext *ctx = QGLContext::currentContext();
+    Q_ASSERT(ctx != 0);
+    ctx->functions()->glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES,
+                                             m_size.width(), m_size.height(), 0,
+                                             (m_paddedSize.width() * m_paddedSize.height()) >> 1,
+                                             m_data.data() + 16);
+
+    // Gracefully fail in case of an error...
+    GLuint error = glGetError();
+    if (error != GL_NO_ERROR) {
+        qDebug () << "glCompressedTexImage2D for compressed texture failed, error: " << error;
+        glBindTexture(GL_TEXTURE_2D, 0);
+        glDeleteTextures(1, &m_texture_id);
+        m_texture_id = 0;
+        return;
+    }
+    updateBindOptions(true);
+}
+
+QSize EtcTexture::textureSize() const
+{
+    return m_size;
+}
+
+QSGTexture *QEtcProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)
+{
+    Q_UNUSED(requestedSize);
+    EtcTexture *ret = 0;
+
+    size->setHeight(0);
+    size->setWidth(0);
+
+    QFile file(id);
+#ifdef ETC_DEBUG
+    qDebug() << "requestTexture opening file: " << id;
+#endif
+    if (file.open(QIODevice::ReadOnly)) {
+        ret = new EtcTexture();
+        ret->m_data = file.readAll();
+        if (!ret->m_data.isEmpty()) {
+            ETCHeader *pETCHeader = NULL;
+            pETCHeader = (ETCHeader *)ret->m_data.data();
+            size->setHeight(getHeight(pETCHeader));
+            size->setWidth(getWidth(pETCHeader));
+            ret->m_size = *size;
+            ret->m_paddedSize.setHeight(getPaddedHeight(pETCHeader));
+            ret->m_paddedSize.setWidth(getPaddedWidth(pETCHeader));
+        }
+        else {
+            free (ret);
+            ret = 0;
+        }
+    }
+
+#ifdef ETC_DEBUG
+    if (ret)
+        qDebug() << "requestTexture returning: " << ret->m_data.length() << ", bytes; width: " << size->width() << ", height: " << size->height();
+    else
+        qDebug () << "File not found.";
+#endif
+
+    return ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/etcprovider/qetcprovider.h b/src/imports/etcprovider/qetcprovider.h
new file mode 100644
index 0000000000..ab79bd480d
--- /dev/null
+++ b/src/imports/etcprovider/qetcprovider.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QETCPROVIDER_H
+#define QETCPROVIDER_H
+
+#include <qgl.h>
+#include <QDeclarativeImageProvider>
+#include <QSGTexture>
+#include <QDeclarativeEngine>
+#include <QDeclarativeContext>
+#include <QFileInfo>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+// #define ETC_DEBUG
+
+class EtcTexture : public QSGTexture
+{
+    Q_OBJECT
+public:
+    EtcTexture();
+    ~EtcTexture();
+
+    void bind();
+    QSize textureSize() const;
+
+    int textureId() const { return m_texture_id; }
+
+    void setImage(const QImage &image) { Q_UNUSED(image); }
+
+    bool hasAlphaChannel() const { return false; }
+    bool hasMipmaps() const { return false; }
+
+    QByteArray m_data;
+    QSize m_size;
+    QSize m_paddedSize;
+    GLuint m_texture_id;
+};
+
+class QEtcProvider : public QDeclarativeImageProvider
+{
+public:
+    QEtcProvider()
+        : QDeclarativeImageProvider(QDeclarativeImageProvider::Texture)
+    {
+#ifdef ETC_DEBUG
+        qDebug () << "Creating QEtcProvider.";
+#endif
+    }
+    QSGTexture *requestTexture(const QString &id, QSize *size, const QSize &requestedSize);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QETCPROVIDER_H
diff --git a/src/imports/etcprovider/qmldir b/src/imports/etcprovider/qmldir
new file mode 100644
index 0000000000..f731f581a3
--- /dev/null
+++ b/src/imports/etcprovider/qmldir
@@ -0,0 +1 @@
+plugin qmletcproviderplugin
diff --git a/src/imports/imports.pro b/src/imports/imports.pro
index 5e50b08da8..6704b3ae3c 100644
--- a/src/imports/imports.pro
+++ b/src/imports/imports.pro
@@ -1,4 +1,4 @@
 TEMPLATE = subdirs
 
-SUBDIRS += folderlistmodel particles gestures
+SUBDIRS += folderlistmodel particles gestures inputcontext etcprovider
 
diff --git a/src/imports/inputcontext/declarativeinputcontext.cpp b/src/imports/inputcontext/declarativeinputcontext.cpp
new file mode 100644
index 0000000000..b52f6ecbba
--- /dev/null
+++ b/src/imports/inputcontext/declarativeinputcontext.cpp
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "declarativeinputcontext.h"
+
+#include "inputcontextmodule.h"
+#include "inputcontextfilter.h"
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+DeclarativeInputContext::DeclarativeInputContext(QObject *parent)
+    : QInputContext(parent)
+    , m_module(0)
+{
+}
+
+DeclarativeInputContext::~DeclarativeInputContext()
+{
+}
+
+bool DeclarativeInputContext::isComposing() const
+{
+    return m_module && !m_module->preeditText().isEmpty();
+}
+
+QString DeclarativeInputContext::identifierName()
+{
+    return QLatin1String("Qt.labs.inputcontext/1.0");
+}
+
+QString DeclarativeInputContext::language()
+{
+    return QString();
+}
+
+void DeclarativeInputContext::setFocusWidget(QWidget *widget)
+{
+    QInputContext::setFocusWidget(widget);
+
+    if (m_module)
+        m_module->setFocusWidget(widget);
+}
+
+void DeclarativeInputContext::mouseHandler(int x, QMouseEvent *event)
+{
+    if (!m_mouseHandlers.isEmpty()) {
+        InputContextMouseEvent me(*event);
+        foreach (InputContextMouseHandler *handler, m_mouseHandlers) {
+            handler->processEvent(event->type(), x, &me);
+            if (me.isAccepted()) {
+                event->setAccepted(true);
+                return;
+            }
+        }
+    }
+}
+
+bool DeclarativeInputContext::filterMouseEvent(const QMouseEvent *event)
+{
+    if (!m_mouseFilters.isEmpty()) {
+        InputContextMouseEvent me(*event);
+        foreach (InputContextMouseFilter *filter, m_mouseFilters) {
+            filter->processEvent(event->type(), &me);
+            if (me.isAccepted())
+                return true;
+        }
+    }
+
+    return false;
+}
+
+bool DeclarativeInputContext::filterKeyEvent(const QKeyEvent *event)
+{
+    if (!m_keyFilters.isEmpty()) {
+        InputContextKeyEvent ke(*event);
+        foreach (InputContextKeyFilter *filter, m_keyFilters) {
+            filter->processEvent(event->type(), &ke);
+            if (ke.isAccepted())
+                return true;
+        }
+    }
+    return false;
+}
+
+bool DeclarativeInputContext::filterEvent(const QEvent *event)
+{
+    switch (event->type()) {
+    case QEvent::RequestSoftwareInputPanel:
+        if (m_module)
+            m_module->setVisible(true);
+        return true;
+    case QEvent::CloseSoftwareInputPanel:
+        if (m_module)
+            m_module->setVisible(false);
+        return true;
+    case QEvent::MouseButtonPress:
+    case QEvent::MouseButtonRelease:
+    case QEvent::MouseButtonDblClick:
+    case QEvent::MouseMove:
+        return filterMouseEvent(static_cast<const QMouseEvent *>(event));
+    case QEvent::KeyPress:
+    case QEvent::KeyRelease:
+        return filterKeyEvent(static_cast<const QKeyEvent *>(event));
+    default:
+        return false;
+    }
+}
+
+void DeclarativeInputContext::reset()
+{
+    if (m_module)
+        m_module->commit();
+}
+
+void DeclarativeInputContext::update()
+{
+    if (m_module)
+        m_module->update();
+}
+
+void DeclarativeInputContext::setModule(InputContextModule *module)
+{
+    m_module = module;
+}
+
+void DeclarativeInputContext::registerMouseHandler(InputContextMouseHandler *handler)
+{
+    connect(handler, SIGNAL(destroyed(QObject*)), this, SLOT(mouseHandlerDestroyed(QObject*)));
+    m_mouseHandlers.append(handler);
+}
+
+void DeclarativeInputContext::registerMouseFilter(InputContextMouseFilter *filter)
+{
+    connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(mouseFilterDestroyed(QObject*)));
+    m_mouseFilters.append(filter);
+}
+
+void DeclarativeInputContext::registerKeyFilter(InputContextKeyFilter *filter)
+{
+    connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(keyFilterDestroyed(QObject*)));
+    m_keyFilters.append(filter);
+}
+
+void DeclarativeInputContext::mouseHandlerDestroyed(QObject *handler)
+{
+    m_mouseHandlers.removeAll(static_cast<InputContextMouseHandler *>(handler));
+}
+
+void DeclarativeInputContext::mouseFilterDestroyed(QObject *filter)
+{
+    m_mouseFilters.removeAll(static_cast<InputContextMouseFilter *>(filter));
+}
+
+void DeclarativeInputContext::keyFilterDestroyed(QObject *filter)
+{
+    m_keyFilters.removeAll(static_cast<InputContextKeyFilter *>(filter));
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/inputcontext/declarativeinputcontext.h b/src/imports/inputcontext/declarativeinputcontext.h
new file mode 100644
index 0000000000..fff2931f2d
--- /dev/null
+++ b/src/imports/inputcontext/declarativeinputcontext.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DECLARATIVEINPUTCONTEXT_H
+#define DECLARATIVEINPUTCONTEXT_H
+
+#include <QtGui/qinputcontext.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class InputContextKeyFilter;
+class InputContextModule;
+class InputContextMouseFilter;
+class InputContextMouseHandler;
+
+class DeclarativeInputContext : public QInputContext
+{
+    Q_OBJECT
+public:
+    explicit DeclarativeInputContext(QObject *parent = 0);
+    ~DeclarativeInputContext();
+
+    bool isComposing() const;
+
+    QString identifierName();
+    QString language();
+
+    void setFocusWidget(QWidget *widget);
+
+    void mouseHandler(int x, QMouseEvent *event);
+
+    bool filterMouseEvent(const QMouseEvent *event);
+    bool filterKeyEvent(const QKeyEvent *event);
+
+    bool filterEvent(const QEvent *event);
+
+    void reset();
+    void update();
+
+    void setModule(InputContextModule *module);
+
+    void registerMouseHandler(InputContextMouseHandler *handler);
+    void registerMouseFilter(InputContextMouseFilter *filter);
+    void registerKeyFilter(InputContextKeyFilter *filter);
+
+private slots:
+    void mouseHandlerDestroyed(QObject *handler);
+    void mouseFilterDestroyed(QObject *filter);
+    void keyFilterDestroyed(QObject *filter);
+
+private:
+    InputContextModule *m_module;
+    QList<InputContextMouseHandler *> m_mouseHandlers;
+    QList<InputContextMouseFilter *> m_mouseFilters;
+    QList<InputContextKeyFilter *> m_keyFilters;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/imports/inputcontext/inputcontext.pro b/src/imports/inputcontext/inputcontext.pro
new file mode 100755
index 0000000000..9c7ddf4e8b
--- /dev/null
+++ b/src/imports/inputcontext/inputcontext.pro
@@ -0,0 +1,38 @@
+TARGET  = qmlinputcontextplugin
+TARGETPATH = Qt/labs/inputcontext
+include(../qimportbase.pri)
+
+QT += declarative script
+
+SOURCES += \
+        declarativeinputcontext.cpp \
+        inputcontextfilter.cpp \
+        inputcontextmodule.cpp \
+        plugin.cpp
+
+HEADERS  += \
+        declarativeinputcontext.h \
+        inputcontextfilter.h \
+        inputcontextmodule.h
+
+OTHER_FILES = \
+        qmldir
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/imports/$$TARGETPATH
+target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
+
+qmldir.files += $$PWD/qmldir
+qmldir.path +=  $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
+
+symbian:{
+    TARGET.UID3 = 0x20031E91
+
+    isEmpty(DESTDIR):importFiles.files = qmlinputcontextplugin{QT_LIBINFIX}.dll qmldir
+    else:importFiles.files = $$DESTDIR/qmlinputcontextplugin$${QT_LIBINFIX}.dll qmldir
+    importFiles.path = $$QT_IMPORTS_BASE_DIR/$$TARGETPATH
+
+    DEPLOYMENT = importFiles
+}
+
+INSTALLS += target qmldir
+
diff --git a/src/imports/inputcontext/inputcontextfilter.cpp b/src/imports/inputcontext/inputcontextfilter.cpp
new file mode 100644
index 0000000000..c0c6c09ed9
--- /dev/null
+++ b/src/imports/inputcontext/inputcontextfilter.cpp
@@ -0,0 +1,352 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "inputcontextfilter.h"
+
+#include "declarativeinputcontext.h"
+
+#include <QtGui/qapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \qmlclass KeyEvent InputContextKeyEvent
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    \brief The KeyEvent object provides information about a key event.
+*/
+
+/*!
+    \qmlproperty int KeyEvent::key
+
+    This property holds the key code of the key that was pressed or released.
+*/
+
+/*!
+    \qmlproperty string KeyEvent::text
+
+    This property holds the text that this key generated.
+*/
+
+/*!
+    \qmlproperty int KeyEvent::modifiers
+
+    This property holds the keyboard modifier flags that existed immediately
+    after this event was generated.
+*/
+
+/*!
+    \qmlproperty bool KeyEvent::autoRepeat
+
+    This property returns true if this event comes from an auto repeating key
+    press, on the initial key press this returns false.
+*/
+
+/*!
+    \qmlproperty int KeyEvent::count
+
+    This property holds the number of keys involved in this event.  If the
+    \l text is non-empty this is the length of the string.
+*/
+
+/*!
+    \qmlproperty bool KeyEvent::accepted
+
+    This property holds whether the event was accepted.
+
+    This is false by default.
+*/
+
+/*!
+    \qmlclass MouseEvent InputContextMouseEvent
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    \brief The MouseEvent object provides information about a mouse event.
+
+*/
+
+/*!
+    \qmlproperty int MouseEvent::x
+
+    This property holds the x position in scene coordinates of the mouse cursor
+    at the time of the event.
+*/
+
+/*!
+    \qmlproperty int MouseEvent::y
+
+    This property holds the y position in scene coordinates of the mouse cursor
+    at the time of the event.
+*/
+
+/*!
+    \qmlproperty enum MouseEvent::button
+
+    This property holds the button that caused the event.
+*/
+
+/*!
+    \qmlproperty int MouseEvent::buttons
+
+    This property holds the button state when the event was generated.
+*/
+
+/*!
+    \qmlproperty int MouseEvent::modifiers
+
+    This property holds the keyboard modifier flags that existed when the event
+    was generated.
+*/
+
+/*!
+    \qmlproperty bool MouseEvent::accepted
+
+    This property holds whether the event was accepted.
+
+    This is false by default.
+*/
+
+/*!
+    \qmlclass MouseHandler InputContextMouseHandler
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    \brief The MouseHandler item provides mouse event handling for input methods.
+
+    The MouseHandler item can be used to handle mouse press, release, move and
+    double click events within or surrounding the pre-edit text.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onPressed(int cursor, MouseEvent mouse)
+
+    This handler is called when there is a press.  The \a cursor parameter is
+    the text cursor position of the press within the pre-edit text, and the
+    \a mouse parameter holds information about the press.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onReleased(int cursor, MouseEvent mouse)
+
+    This handler is called when there is a release.  The \a cursor parameter is
+    the text cursor position of the press within the pre-edit text, and the
+    \a mouse parameter holds information about the release.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onPositionChanged(int cursor, MouseEvent mouse)
+
+    This handler is called when the mouse position changes.
+
+    The \a cursor parameter is the text cursor position of the press within
+    the pre-edit text, and the \a mouse parameter holds information about the
+    position change.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onDoubleClicked(int cursor, MouseEvent mouse)
+
+    This handler is called when there is a double-click.  The \a cursor
+    parameter is the text cursor position of the press within the pre-edit
+    text, and the \a mouse parameter holds information about the double-click.
+*/
+
+InputContextMouseHandler::InputContextMouseHandler(QObject *parent)
+    : QObject(parent)
+{
+    if (DeclarativeInputContext *context = qobject_cast<DeclarativeInputContext *>(
+            qApp->inputContext())) {
+        context->registerMouseHandler(this);
+    }
+}
+
+void InputContextMouseHandler::processEvent(QEvent::Type type, int cursor, InputContextMouseEvent *event)
+{
+    switch (type) {
+    case QEvent::MouseButtonPress:
+        emit pressed(cursor, event);
+        break;
+    case QEvent::MouseButtonRelease:
+        emit released(cursor, event);
+        break;
+    case QEvent::MouseButtonDblClick:
+        emit doubleClicked(cursor, event);
+        break;
+    case QEvent::MouseMove:
+        emit positionChanged(cursor, event);
+        break;
+    default:
+        break;
+    }
+}
+
+/*!
+    \qmlclass MouseFilter InputContextMouseFilter
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    \brief The MouseFilter item provides mouse event filtering for input methods.
+
+    The MouseFilter item can be used to filter mouse press, release, move and
+    double click events received by the item with active focus.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onPressed(MouseEvent mouse)
+
+    This handler is called when there is a press.  The \a mouse parameter holds
+    information about the press.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onReleased(MouseEvent mouse)
+
+    This handler is called when there is a release.  The \a mouse parameter
+    holds information about the release.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onPositionChanged(MouseEvent mouse)
+
+    This handler is called when the mouse position changes.
+
+    The \a mouse parameter holds information about the position change.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+/*!
+    \qmlsignal MouseHandler::onDoubleClicked(MouseEvent mouse)
+
+    This handler is called when there is a double-click.  The \a mouse
+    parameter holds information about the double-click.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+InputContextMouseFilter::InputContextMouseFilter(QObject *parent)
+    : QObject(parent)
+{
+    if (DeclarativeInputContext *context = qobject_cast<DeclarativeInputContext *>(
+            qApp->inputContext())) {
+        context->registerMouseFilter(this);
+    }
+}
+
+void InputContextMouseFilter::processEvent(QEvent::Type type, InputContextMouseEvent *event)
+{
+    switch (type) {
+    case QEvent::MouseButtonPress:
+        emit pressed(event);
+        break;
+    case QEvent::MouseButtonRelease:
+        emit released(event);
+        break;
+    case QEvent::MouseButtonDblClick:
+        emit doubleClicked(event);
+        break;
+    case QEvent::MouseMove:
+        emit positionChanged(event);
+        break;
+    default:
+        break;
+    }
+}
+
+/*!
+    \qmlclass KeyFilter InputContextKeyFilter
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    \brief The KeyFilter item provides key event filtering for input methods.
+
+    The KeyFilter item can be used to filter key press and releae events
+    received by the item with active focus.
+*/
+
+/*!
+    \qmlsignal KeyFilter::onPressed(KeyEvent event)
+
+    This handler is called when there is a key press.  The \a event parameter
+    holds information about the press.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+/*!
+    \qmlsignal KeyFilter::onReleased(KeyEvent event)
+
+    This handler is called when there is a key release.  The \a event parameter
+    holds information about the release.
+
+    If the event is accepted it will not be delivered to the item.
+*/
+
+InputContextKeyFilter::InputContextKeyFilter(QObject *parent)
+    : QObject(parent)
+{
+    if (DeclarativeInputContext *context = qobject_cast<DeclarativeInputContext *>(
+            qApp->inputContext())) {
+        context->registerKeyFilter(this);
+    }
+}
+
+void InputContextKeyFilter::processEvent(QEvent::Type type, InputContextKeyEvent *event)
+{
+    switch (type) {
+    case QEvent::KeyPress:
+        emit pressed(event);
+        break;
+    case QEvent::KeyRelease:
+        emit released(event);
+        break;
+    default:
+        break;
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/inputcontext/inputcontextfilter.h b/src/imports/inputcontext/inputcontextfilter.h
new file mode 100644
index 0000000000..2dd7d5bd67
--- /dev/null
+++ b/src/imports/inputcontext/inputcontextfilter.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INPUTCONTEXTFILTER_H
+#define INPUTCONTEXTFILTER_H
+
+#include <QtDeclarative/qdeclarative.h>
+#include <QtGui/qevent.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class InputContextKeyEvent : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int key READ key)
+    Q_PROPERTY(QString text READ text)
+    Q_PROPERTY(int modifiers READ modifiers)
+    Q_PROPERTY(bool isAutoRepeat READ isAutoRepeat)
+    Q_PROPERTY(int count READ count)
+    Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
+
+public:
+    InputContextKeyEvent(const QKeyEvent &ke)
+        : event(ke) { event.setAccepted(false); }
+
+    int key() const { return event.key(); }
+    QString text() const { return event.text(); }
+    int modifiers() const { return event.modifiers(); }
+    bool isAutoRepeat() const { return event.isAutoRepeat(); }
+    int count() const { return event.count(); }
+
+    bool isAccepted() { return event.isAccepted(); }
+    void setAccepted(bool accepted) { event.setAccepted(accepted); }
+
+private:
+    QKeyEvent event;
+};
+
+class InputContextMouseEvent : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int x READ x)
+    Q_PROPERTY(int y READ y)
+    Q_PROPERTY(int button READ button)
+    Q_PROPERTY(int buttons READ buttons)
+    Q_PROPERTY(int modifiers READ modifiers)
+    Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
+
+public:
+    InputContextMouseEvent(const QMouseEvent &me)
+        : event(me) { event.setAccepted(false);}
+
+    int x() const { return event.x(); }
+    int y() const { return event.y(); }
+    int button() const { return event.button(); }
+    int buttons() const { return event.buttons(); }
+    int modifiers() const { return event.modifiers(); }
+
+    bool isAccepted() { return event.isAccepted(); }
+    void setAccepted(bool accepted) { event.setAccepted(accepted); }
+
+private:
+    QMouseEvent event;
+};
+
+class InputContextMouseHandler : public QObject
+{
+    Q_OBJECT
+public:
+    InputContextMouseHandler(QObject *parent = 0);
+
+    void processEvent(QEvent::Type type, int cursor, InputContextMouseEvent *event);
+
+signals:
+    void pressed(int cursor, InputContextMouseEvent *mouse);
+    void released(int cursor, InputContextMouseEvent *mouse);
+    void doubleClicked(int cursor, InputContextMouseEvent *mouse);
+    void positionChanged(int cursor, InputContextMouseEvent *mouse);
+};
+
+class InputContextMouseFilter : public QObject
+{
+    Q_OBJECT
+public:
+    InputContextMouseFilter(QObject *parent = 0);
+
+    void processEvent(QEvent::Type type, InputContextMouseEvent *event);
+
+signals:
+    void pressed(InputContextMouseEvent *mouse);
+    void released(InputContextMouseEvent *mouse);
+    void doubleClicked(InputContextMouseEvent *mouse);
+    void positionChanged(InputContextMouseEvent *mouse);
+};
+
+class InputContextKeyFilter : public QObject
+{
+    Q_OBJECT
+public:
+    InputContextKeyFilter(QObject *parent = 0);
+
+    void processEvent(QEvent::Type type, InputContextKeyEvent *event);
+
+signals:
+    void pressed(InputContextKeyEvent *event);
+    void released(InputContextKeyEvent *event);
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(InputContextKeyEvent)
+QML_DECLARE_TYPE(InputContextMouseEvent)
+QML_DECLARE_TYPE(InputContextMouseHandler)
+QML_DECLARE_TYPE(InputContextMouseFilter)
+QML_DECLARE_TYPE(InputContextKeyFilter)
+
+QT_END_HEADER
+
+#endif
diff --git a/src/imports/inputcontext/inputcontextmodule.cpp b/src/imports/inputcontext/inputcontextmodule.cpp
new file mode 100644
index 0000000000..7dc124d083
--- /dev/null
+++ b/src/imports/inputcontext/inputcontextmodule.cpp
@@ -0,0 +1,413 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "inputcontextmodule.h"
+
+#include "declarativeinputcontext.h"
+
+#include <QtCore/qdebug.h>
+#include <QtGui/qapplication.h>
+#include <QtGui/qevent.h>
+#include <QtGui/qtextformat.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \qmlmodule Qt.labs.inputcontext InputContextModule
+
+    \brief The Qt.labs.inputcontext module provides an API for implementing input methods is QML.
+*/
+
+InputContextModule::InputContextModule(QObject *parent)
+    : QObject(parent)
+    , m_inputContext(qobject_cast<DeclarativeInputContext *>(qApp->inputContext()))
+    , m_focusWidget(m_inputContext ? m_inputContext->focusWidget() : 0)
+    , m_visible(false)
+{
+    if (m_inputContext)
+        m_inputContext->setModule(this);
+}
+
+InputContextModule::~InputContextModule()
+{
+    if (m_inputContext)
+        m_inputContext->setModule(0);
+}
+
+/*!
+    \qmlproperty bool focus
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property identifies whether an item that takes text input has active focus.
+*/
+
+bool InputContextModule::hasFocus() const
+{
+    return m_focusWidget != 0;
+}
+
+void InputContextModule::setFocusWidget(QWidget *widget)
+{
+    m_focusWidget = widget;
+
+    if (!m_focusWidget)
+        setVisible(false);
+
+    emit focusChanged();
+}
+
+/*!
+    \qmlproperty bool softwareInputPanelVisible
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property identifies whether the item with focus has requested a
+    software input panel.
+*/
+
+bool InputContextModule::isVisible() const
+{
+    return m_visible;
+}
+
+void InputContextModule::setVisible(bool visible)
+{
+    if (m_visible != visible) {
+        m_visible = visible;
+
+        emit visibleChanged();
+    }
+}
+
+/*!
+    \qmlproperty string preeditText
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the uncommited text that is displayed in the item that
+    has focus.
+*/
+
+QString InputContextModule::preeditText() const
+{
+    return m_preeditText;
+}
+
+void InputContextModule::setPreeditText(const QString &text)
+{
+    if (text != m_preeditText)
+        sendPreedit(text);
+}
+
+/*!
+    \qmlproperty rectangle microFocus
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds a rectangle in scene coordinates around the position
+    of the cursor.
+*/
+
+QRect InputContextModule::microFocus() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImMicroFocus).toRect()
+            : QRect();
+}
+
+/*!
+    \qmlproperty font font
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the font of the text that currently has focus.
+*/
+
+QFont InputContextModule::font() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImFont).value<QFont>()
+            : QFont();
+}
+
+/*!
+    \qmlproperty int cursorPosition
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the position of the text cursor in the
+    \l surroundingText.
+*/
+
+int InputContextModule::cursorPosition() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImCursorPosition).toInt()
+            : 0;
+}
+
+/*!
+    \qmlproperty int anchorPosition
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the position of the selection anchor in the
+    \l surroundingText.  If no text is selected this is the same as the
+    \l cursorPosition.
+*/
+
+int InputContextModule::anchorPosition() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImAnchorPosition).toInt()
+            : 0;
+}
+
+/*!
+    \qmlproperty int maximumTextLength
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the maximum number of characters that the item with
+    focus can hold.  If there is no limit -1 is returned.
+*/
+
+int InputContextModule::maximumTextLength() const
+{
+    QVariant length;
+    if (m_focusWidget)
+        length = m_focusWidget->inputMethodQuery(Qt::ImMaximumTextLength);
+    return length.isValid() ? length.toInt() : -1;
+}
+
+/*!
+    \qmlproperty string surroundingText
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the plain text around the input area.  For example the
+    current paragraph.
+*/
+
+QString InputContextModule::surroundingText() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImSurroundingText).toString()
+            : QString();
+}
+
+/*!
+    \qmlproperty string selectedText
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This property holds the currently selected text.
+*/
+
+QString InputContextModule::selectedText() const
+{
+    return m_focusWidget
+            ? m_focusWidget->inputMethodQuery(Qt::ImCurrentSelection).toString()
+            : QString();
+}
+
+/*!
+    \qmlmethod sendKeyPress(int key, string text, int modifiers, bool autoRepeat)
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This method sends a key press event to the item that currently has focus.
+
+    Int key is the code for the Qt::Key that the event loop should listen for.
+    If key is 0, the event is not a result of a known key; for example, it may
+    be the result of a compose sequence or keyboard macro. The modifiers holds
+    the keyboard modifiers, and the given text is the Unicode text that the key
+    generated. If autorep is true, isAutoRepeat() will be true. count is the
+    number of keys involved in the event.
+*/
+void InputContextModule::sendKeyPress(
+        int key, const QString &text, int modifiers, bool autoRepeat, int count)
+{
+    if (m_focusWidget) {
+        QKeyEvent event(
+                QEvent::KeyPress, key, Qt::KeyboardModifiers(modifiers), text, autoRepeat, count);
+        if (!m_inputContext || !m_inputContext->filterKeyEvent(&event))
+            QApplication::sendEvent(m_focusWidget, &event);
+    }
+}
+
+/*!
+    \qmlmethod sendKeyRelease(int key, string text, int modifiers)
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    This method sends a key release event to the item that currently has focus.
+
+    Int key is the code for the Qt::Key that the event loop should listen for.
+    If key is 0, the event is not a result of a known key; for example, it may
+    be the result of a compose sequence or keyboard macro. The modifiers holds
+    the keyboard modifiers, and the given text is the Unicode text that the key
+    generated. count is the number of keys involved in the event.
+*/
+void InputContextModule::sendKeyRelease(int key, const QString &text, int modifiers, int count)
+{
+    if (m_focusWidget) {
+        QKeyEvent event(
+                QEvent::KeyRelease, key, Qt::KeyboardModifiers(modifiers), text, false, count);
+        if (!m_inputContext || !m_inputContext->filterKeyEvent(&event))
+            QApplication::sendEvent(m_focusWidget, &event);
+    }
+}
+
+/*!
+    \qmlmethod sendPreedit(string text, int cursor = -1)
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    Sends a pre-edit event to the item with active focus.
+
+    This will set \l preeditText to \a text, and position the text \a cursor
+    within the pre-edit text.  If the value of cursor is -1 the cursor will be
+    positioned at the end of the pre-edit text.
+*/
+void InputContextModule::sendPreedit(const QString &text, int cursor)
+{
+    const QString preedit = m_preeditText;
+    m_preeditText = text;
+
+    if (m_inputContext) {
+        QList<QInputMethodEvent::Attribute> attributes;
+
+        if (cursor >= 0 && cursor <= text.length()) {
+            attributes.append(QInputMethodEvent::Attribute(
+                    QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+        } else {
+            cursor = text.length();
+        }
+
+        if (cursor > 0) {
+            attributes.append(QInputMethodEvent::Attribute(
+                    QInputMethodEvent::TextFormat,
+                    0,
+                    cursor,
+                    m_inputContext->standardFormat(QInputContext::PreeditFormat)));
+        }
+        if (cursor < text.length()) {
+            attributes.append(QInputMethodEvent::Attribute(
+                    QInputMethodEvent::TextFormat,
+                    cursor,
+                    text.length(),
+                    m_inputContext->standardFormat(QInputContext::SelectionFormat)));
+        }
+
+        m_inputContext->sendEvent(QInputMethodEvent(text, attributes));
+    }
+
+    if (m_preeditText != preedit)
+        emit preeditTextChanged();
+}
+
+
+/*!
+    \qmlmethod commit()
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    Commits \l preeditText to the item with active focus.
+*/
+void InputContextModule::commit()
+{
+    // Create an explicit copy of m_preeditText as the reference value is cleared before sending
+    // the event.
+    commit(QString(m_preeditText));
+}
+
+/*!
+    \qmlmethod commit(string)
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    Commits \a text to the item with active focus and clears the current
+    \l preeditText.  The text will be inserted into the \l surroundingText at a
+    position \a replacementStart relative to the \l cursorPosition and will
+    replace \a replacementLength characters.
+*/
+void InputContextModule::commit(const QString &text, int replacementStart, int replacementLength)
+{
+    const QString preedit = m_preeditText;
+    m_preeditText.clear();
+
+    if (m_inputContext) {
+        QInputMethodEvent inputEvent;
+        inputEvent.setCommitString(text, replacementStart, replacementLength);
+        m_inputContext->sendEvent(inputEvent);
+    }
+
+    if (m_preeditText != preedit)
+        emit preeditTextChanged();
+}
+
+/*!
+    \qmlmethod clear()
+
+    \inqmlmodule Qt.labs.inputcontext
+
+    Clears the current \l preeditText.
+*/
+void InputContextModule::clear()
+{
+    const QString preedit = m_preeditText;
+    m_preeditText.clear();
+
+    if (m_inputContext)
+        m_inputContext->sendEvent(QInputMethodEvent());
+
+    if (m_preeditText != preedit)
+        emit preeditTextChanged();
+}
+
+void InputContextModule::update()
+{
+    emit contextUpdated();
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/inputcontext/inputcontextmodule.h b/src/imports/inputcontext/inputcontextmodule.h
new file mode 100644
index 0000000000..470701e34e
--- /dev/null
+++ b/src/imports/inputcontext/inputcontextmodule.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INPUTCONTEXTMODULE_H
+#define INPUTCONTEXTMODULE_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qrect.h>
+#include <QtGui/qfont.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class DeclarativeInputContext;
+
+class InputContextModule : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(bool softwareInputPanelVisible READ isVisible WRITE setVisible NOTIFY visibleChanged)
+    Q_PROPERTY(bool focus READ hasFocus NOTIFY focusChanged)
+    Q_PROPERTY(QString preeditText READ preeditText WRITE setPreeditText NOTIFY preeditTextChanged)
+    Q_PROPERTY(QRect microFocus READ microFocus NOTIFY contextUpdated)
+    Q_PROPERTY(QFont font READ font NOTIFY contextUpdated)
+    Q_PROPERTY(int cursorPosition READ cursorPosition NOTIFY contextUpdated)
+    Q_PROPERTY(int anchorPosition READ anchorPosition NOTIFY contextUpdated)
+    Q_PROPERTY(int maximumTextLength READ maximumTextLength NOTIFY contextUpdated)
+    Q_PROPERTY(QString surroundingText READ surroundingText NOTIFY contextUpdated)
+    Q_PROPERTY(QString selectedText READ selectedText NOTIFY contextUpdated)
+public:
+    explicit InputContextModule(QObject *parent = 0);
+    ~InputContextModule();
+
+    bool hasFocus() const;
+    void setFocusWidget(QWidget *widget);
+
+    bool isVisible() const;
+    void setVisible(bool visible);
+
+    QString preeditText() const;
+    void setPreeditText(const QString &text);
+
+    QRect microFocus() const;
+    QFont font() const;
+    int cursorPosition() const;
+    int anchorPosition() const;
+    int maximumTextLength() const;
+    QString surroundingText() const;
+    QString selectedText() const;
+
+    Q_INVOKABLE void sendKeyPress(
+            int key, const QString &text, int modifiers = 0, bool autoRepeat = false, int count = 1);
+    Q_INVOKABLE void sendKeyRelease(int key, const QString &text, int modifiers = 0, int count = 1);
+
+    Q_INVOKABLE void sendPreedit(const QString &text, int cursor = -1);
+
+    Q_INVOKABLE void commit();
+    Q_INVOKABLE void commit(const QString &text, int replacementStart = 0, int replacementEnd = 0);
+
+    Q_INVOKABLE void clear();
+
+    void update();
+
+signals:
+    void preeditTextChanged();
+    void visibleChanged();
+    void contextUpdated();
+    void focusChanged();
+
+private:
+    QString m_preeditText;
+    DeclarativeInputContext *m_inputContext;
+    QWidget *m_focusWidget;
+    bool m_visible;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/imports/inputcontext/plugin.cpp b/src/imports/inputcontext/plugin.cpp
new file mode 100644
index 0000000000..1f4bcde673
--- /dev/null
+++ b/src/imports/inputcontext/plugin.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "declarativeinputcontext.h"
+#include "inputcontextfilter.h"
+#include "inputcontextmodule.h"
+
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtGui/qapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+static QObject *createContext(QDeclarativeEngine *, QScriptEngine *)
+{
+    return new InputContextModule;
+}
+
+class InputContextQmlPlugin : public QDeclarativeExtensionPlugin
+{
+    Q_OBJECT
+public:
+    virtual void registerTypes(const char *uri)
+    {
+        Q_ASSERT(QLatin1String(uri) == QLatin1String("Qt.labs.inputcontext"));
+
+        qApp->setInputContext(new DeclarativeInputContext);
+
+        qmlRegisterModuleApi(uri, 1, 0, createContext);
+        qmlRegisterType<InputContextMouseHandler>(uri, 1, 0, "MouseHandler");
+        qmlRegisterType<InputContextMouseFilter>(uri, 1, 0, "MouseFilter");
+        qmlRegisterType<InputContextKeyFilter>(uri, 1, 0, "KeyFilter");
+        qmlRegisterType<InputContextMouseEvent>();
+        qmlRegisterType<InputContextKeyEvent>();
+    }
+};
+
+QT_END_NAMESPACE
+
+Q_EXPORT_PLUGIN2(InputContext, QT_PREPEND_NAMESPACE(InputContextQmlPlugin));
+
+#include "plugin.moc"
diff --git a/src/imports/inputcontext/qmldir b/src/imports/inputcontext/qmldir
new file mode 100644
index 0000000000..3fb65a6e0e
--- /dev/null
+++ b/src/imports/inputcontext/qmldir
@@ -0,0 +1 @@
+plugin qmlinputcontextplugin
diff --git a/src/imports/particles/qdeclarativeparticles.cpp b/src/imports/particles/V1/qdeclarativeparticles.cpp
similarity index 100%
rename from src/imports/particles/qdeclarativeparticles.cpp
rename to src/imports/particles/V1/qdeclarativeparticles.cpp
diff --git a/src/imports/particles/qdeclarativeparticles_p.h b/src/imports/particles/V1/qdeclarativeparticles_p.h
similarity index 100%
rename from src/imports/particles/qdeclarativeparticles_p.h
rename to src/imports/particles/V1/qdeclarativeparticles_p.h
diff --git a/src/imports/particles/angledvector.cpp b/src/imports/particles/angledvector.cpp
new file mode 100644
index 0000000000..85b5ed7472
--- /dev/null
+++ b/src/imports/particles/angledvector.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "angledvector.h"
+#include <cmath>
+QT_BEGIN_NAMESPACE
+const qreal CONV = 0.017453292519943295;
+AngledVector::AngledVector(QObject *parent) :
+    VaryingVector(parent)
+  , m_angle(0)
+  , m_magnitude(0)
+  , m_angleVariation(0)
+  , m_magnitudeVariation(0)
+{
+
+}
+
+const QPointF &AngledVector::sample(const QPointF &from)
+{
+    //TODO: Faster
+    qreal theta = m_angle*CONV - m_angleVariation*CONV + rand()/float(RAND_MAX) * m_angleVariation*CONV * 2;
+    qreal mag = m_magnitude- m_magnitudeVariation + rand()/float(RAND_MAX) * m_magnitudeVariation * 2;
+    m_ret.setX(mag * cos(theta));
+    m_ret.setY(mag * sin(theta));
+    return m_ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/angledvector.h b/src/imports/particles/angledvector.h
new file mode 100644
index 0000000000..ac78059e43
--- /dev/null
+++ b/src/imports/particles/angledvector.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANGLEDVECTOR_H
+#define ANGLEDVECTOR_H
+#include "varyingvector.h"
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class AngledVector : public VaryingVector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal angle READ angle WRITE setAngle NOTIFY angleChanged)
+    Q_PROPERTY(qreal magnitude READ magnitude WRITE setMagnitude NOTIFY magnitudeChanged)
+    Q_PROPERTY(qreal angleVariation READ angleVariation WRITE setAngleVariation NOTIFY angleVariationChanged)
+    Q_PROPERTY(qreal magnitudeVariation READ magnitudeVariation WRITE setMagnitudeVariation NOTIFY magnitudeVariationChanged)
+public:
+    explicit AngledVector(QObject *parent = 0);
+    const QPointF &sample(const QPointF &from);
+    qreal angle() const
+    {
+        return m_angle;
+    }
+
+    qreal magnitude() const
+    {
+        return m_magnitude;
+    }
+
+    qreal angleVariation() const
+    {
+        return m_angleVariation;
+    }
+
+    qreal magnitudeVariation() const
+    {
+        return m_magnitudeVariation;
+    }
+
+signals:
+
+    void angleChanged(qreal arg);
+
+    void magnitudeChanged(qreal arg);
+
+    void angleVariationChanged(qreal arg);
+
+    void magnitudeVariationChanged(qreal arg);
+
+public slots:
+void setAngle(qreal arg)
+{
+    if (m_angle != arg) {
+        m_angle = arg;
+        emit angleChanged(arg);
+    }
+}
+
+void setMagnitude(qreal arg)
+{
+    if (m_magnitude != arg) {
+        m_magnitude = arg;
+        emit magnitudeChanged(arg);
+    }
+}
+
+void setAngleVariation(qreal arg)
+{
+    if (m_angleVariation != arg) {
+        m_angleVariation = arg;
+        emit angleVariationChanged(arg);
+    }
+}
+
+void setMagnitudeVariation(qreal arg)
+{
+    if (m_magnitudeVariation != arg) {
+        m_magnitudeVariation = arg;
+        emit magnitudeVariationChanged(arg);
+    }
+}
+
+private:
+qreal m_angle;
+qreal m_magnitude;
+qreal m_angleVariation;
+qreal m_magnitudeVariation;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // ANGLEDVECTOR_H
diff --git a/src/imports/particles/attractoraffector.cpp b/src/imports/particles/attractoraffector.cpp
new file mode 100644
index 0000000000..847cb2c471
--- /dev/null
+++ b/src/imports/particles/attractoraffector.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "attractoraffector.h"
+#include <cmath>
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+AttractorAffector::AttractorAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_strength(0.0), m_x(0), m_y(0)
+{
+}
+
+bool AttractorAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    if(m_strength == 0.0)
+        return false;
+    qreal dx = m_x - d->curX();
+    qreal dy = m_y - d->curY();
+    qreal r = sqrt((dx*dx) + (dy*dy));
+    qreal theta = atan2(dy,dx);
+    qreal ds = (m_strength / r) * dt;
+    dx = ds * cos(theta);
+    dy = ds * sin(theta);
+    d->setInstantaneousSX(d->pv.sx + dx);
+    d->setInstantaneousSY(d->pv.sy + dy);
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/attractoraffector.h b/src/imports/particles/attractoraffector.h
new file mode 100644
index 0000000000..f41e9ad5e4
--- /dev/null
+++ b/src/imports/particles/attractoraffector.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ATTRACTORAFFECTOR_H
+#define ATTRACTORAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class AttractorAffector : public ParticleAffector
+{
+    Q_OBJECT
+    //Like Gravitational singularity, but linear to distance instead of quadratic
+    //And affects ds/dt, not da/dt
+    Q_PROPERTY(qreal strength READ strength WRITE setStrength NOTIFY strengthChanged)
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
+public:
+    explicit AttractorAffector(QSGItem *parent = 0);
+
+    qreal strength() const
+    {
+        return m_strength;
+    }
+
+    qreal x() const
+    {
+        return m_x;
+    }
+
+    qreal y() const
+    {
+        return m_y;
+    }
+
+signals:
+
+    void strengthChanged(qreal arg);
+
+    void xChanged(qreal arg);
+
+    void yChanged(qreal arg);
+
+public slots:
+void setStrength(qreal arg)
+{
+    if (m_strength != arg) {
+        m_strength = arg;
+        emit strengthChanged(arg);
+    }
+}
+
+void setX(qreal arg)
+{
+    if (m_x != arg) {
+        m_x = arg;
+        emit xChanged(arg);
+    }
+}
+
+void setY(qreal arg)
+{
+    if (m_y != arg) {
+        m_y = arg;
+        emit yChanged(arg);
+    }
+}
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+private:
+qreal m_strength;
+qreal m_x;
+qreal m_y;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // ATTRACTORAFFECTOR_H
diff --git a/src/imports/particles/coloredparticle.cpp b/src/imports/particles/coloredparticle.cpp
new file mode 100644
index 0000000000..7d0ec4cb0a
--- /dev/null
+++ b/src/imports/particles/coloredparticle.cpp
@@ -0,0 +1,540 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include <qsgnode.h>
+#include <qsgtexturematerial.h>
+#include <qsgtexture.h>
+#include <QFile>
+#include "coloredparticle.h"
+#include "particleemitter.h"
+#include <QGLFunctions>
+#include <qsgengine.h>
+
+QT_BEGIN_NAMESPACE
+
+class ParticleTrailsMaterial : public QSGMaterial
+{
+public:
+    ParticleTrailsMaterial()
+        : timestamp(0)
+    {
+        setFlag(Blending, true);
+    }
+
+    ~ParticleTrailsMaterial()
+    {
+        delete texture;
+    }
+
+    virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const
+    {
+        return this - static_cast<const ParticleTrailsMaterial *>(other);
+    }
+
+    QSGTexture *texture;
+
+    qreal timestamp;
+};
+
+
+class ParticleTrailsMaterialData : public QSGMaterialShader
+{
+public:
+    ParticleTrailsMaterialData(const char *vertexFile = 0, const char *fragmentFile = 0)
+    {
+        QFile vf(vertexFile ? vertexFile : ":resources/trailsvertex.shader");
+        vf.open(QFile::ReadOnly);
+        m_vertex_code = vf.readAll();
+
+        QFile ff(fragmentFile ? fragmentFile : ":resources/trailsfragment.shader");
+        ff.open(QFile::ReadOnly);
+        m_fragment_code = ff.readAll();
+
+        Q_ASSERT(!m_vertex_code.isNull());
+        Q_ASSERT(!m_fragment_code.isNull());
+    }
+
+    void deactivate() {
+        QSGMaterialShader::deactivate();
+
+        for (int i=0; i<8; ++i) {
+            m_program.setAttributeArray(i, GL_FLOAT, chunkOfBytes, 1, 0);
+        }
+    }
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *)
+    {
+        ParticleTrailsMaterial *m = static_cast<ParticleTrailsMaterial *>(newEffect);
+        state.context()->functions()->glActiveTexture(GL_TEXTURE0);
+        m->texture->bind();
+
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+        m_program.setUniformValue(m_timestamp_id, (float) m->timestamp);
+
+        if (state.isMatrixDirty())
+            m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+    }
+
+    virtual void initialize() {
+        m_matrix_id = m_program.uniformLocation("matrix");
+        m_opacity_id = m_program.uniformLocation("opacity");
+        m_timestamp_id = m_program.uniformLocation("timestamp");
+    }
+
+    virtual const char *vertexShader() const { return m_vertex_code.constData(); }
+    virtual const char *fragmentShader() const { return m_fragment_code.constData(); }
+
+    virtual char const *const *attributeNames() const {
+        static const char *attr[] = {
+            "vPos",
+            "vTex",
+            "vData",
+            "vVec",
+            "vColor",
+            0
+        };
+        return attr;
+    }
+
+    virtual bool isColorTable() const { return false; }
+
+    int m_matrix_id;
+    int m_opacity_id;
+    int m_timestamp_id;
+
+    QByteArray m_vertex_code;
+    QByteArray m_fragment_code;
+
+    static float chunkOfBytes[1024];
+};
+float ParticleTrailsMaterialData::chunkOfBytes[1024];
+
+
+QSGMaterialShader *ParticleTrailsMaterial::createShader() const
+{
+    return new ParticleTrailsMaterialData;
+}
+
+
+class ParticleTrailsMaterialCT : public ParticleTrailsMaterial
+{
+public:
+    ParticleTrailsMaterialCT()
+    {
+    }
+
+    ~ParticleTrailsMaterialCT()
+    {
+        delete colortable;
+        delete sizetable;
+        delete opacitytable;
+    }
+
+    virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
+    virtual QSGMaterialShader *createShader() const;
+
+    QSGTexture *colortable;
+    QSGTexture *sizetable;
+    QSGTexture *opacitytable;
+};
+
+
+class ParticleTrailsMaterialDataCT : public ParticleTrailsMaterialData
+{
+public:
+    ParticleTrailsMaterialDataCT()
+        : ParticleTrailsMaterialData(":resources/ctvertex.shader", ":resources/ctfragment.shader")
+    {
+    }
+
+    bool isColorTable() const { return true; }
+
+    virtual void initialize() {
+        ParticleTrailsMaterialData::initialize();
+        m_colortable_id = m_program.uniformLocation("colortable");
+        m_sizetable_id = m_program.uniformLocation("sizetable");
+        m_opacitytable_id = m_program.uniformLocation("opacitytable");
+    }
+
+    virtual void updateState(const RenderState &state, QSGMaterial *current, QSGMaterial *old)
+    {
+        // Bind the texture to unit 1 before calling the base class, so that the
+        // base class can set active texture back to 0.
+        ParticleTrailsMaterialCT *m = static_cast<ParticleTrailsMaterialCT *>(current);
+        state.context()->functions()->glActiveTexture(GL_TEXTURE1);
+        m->colortable->bind();
+        m_program.setUniformValue(m_colortable_id, 1);
+
+        state.context()->functions()->glActiveTexture(GL_TEXTURE2);
+        m->sizetable->bind();
+        m_program.setUniformValue(m_sizetable_id, 2);
+
+        state.context()->functions()->glActiveTexture(GL_TEXTURE3);
+        m->opacitytable->bind();
+        m_program.setUniformValue(m_opacitytable_id, 3);
+
+        ParticleTrailsMaterialData::updateState(state, current, old);
+    }
+
+    int m_colortable_id;
+    int m_sizetable_id;
+    int m_opacitytable_id;
+};
+
+
+QSGMaterialShader *ParticleTrailsMaterialCT::createShader() const
+{
+    return new ParticleTrailsMaterialDataCT;
+}
+
+ColoredParticle::ColoredParticle(QSGItem* parent)
+    : ParticleType(parent)
+    , m_do_reset(false)
+    , m_color(Qt::white)
+    , m_color_variation(0.5)
+    , m_node(0)
+    , m_material(0)
+    , m_alphaVariation(0.0)
+    , m_alpha(1.0)
+    , m_redVariation(0.0)
+    , m_greenVariation(0.0)
+    , m_blueVariation(0.0)
+{
+    setFlag(ItemHasContents);
+}
+
+void ColoredParticle::setImage(const QUrl &image)
+{
+    if (image == m_image_name)
+        return;
+    m_image_name = image;
+    emit imageChanged();
+    reset();
+}
+
+
+void ColoredParticle::setColortable(const QUrl &table)
+{
+    if (table == m_colortable_name)
+        return;
+    m_colortable_name = table;
+    emit colortableChanged();
+    reset();
+}
+
+void ColoredParticle::setSizetable(const QUrl &table)
+{
+    if (table == m_sizetable_name)
+        return;
+    m_sizetable_name = table;
+    emit sizetableChanged();
+    reset();
+}
+
+void ColoredParticle::setOpacitytable(const QUrl &table)
+{
+    if (table == m_opacitytable_name)
+        return;
+    m_opacitytable_name = table;
+    emit opacitytableChanged();
+    reset();
+}
+
+void ColoredParticle::setColor(const QColor &color)
+{
+    if (color == m_color)
+        return;
+    m_color = color;
+    emit colorChanged();
+    //m_system->pleaseReset();//XXX
+}
+
+void ColoredParticle::setColorVariation(qreal var)
+{
+    if (var == m_color_variation)
+        return;
+    m_color_variation = var;
+    emit colorVariationChanged();
+    //m_system->pleaseReset();//XXX
+}
+
+void ColoredParticle::setCount(int c)
+{
+    ParticleType::setCount(c);
+    m_pleaseReset = true;
+}
+
+void ColoredParticle::reset()
+{
+    ParticleType::reset();
+     m_pleaseReset = true;
+}
+
+static QSGGeometry::Attribute ColoredParticle_Attributes[] = {
+    { 0, 2, GL_FLOAT },             // Position
+    { 1, 2, GL_FLOAT },             // TexCoord
+    { 2, 4, GL_FLOAT },             // Data
+    { 3, 4, GL_FLOAT },             // Vectors
+    { 4, 4, GL_UNSIGNED_BYTE }   // Colors
+};
+
+static QSGGeometry::AttributeSet ColoredParticle_AttributeSet =
+{
+    5, // Attribute Count
+    (2 + 2 + 4 + 4) * sizeof(float) + 4 * sizeof(uchar),
+    ColoredParticle_Attributes
+};
+
+QSGGeometryNode* ColoredParticle::buildParticleNode()
+{
+    if (m_count * 4 > 0xffff) {
+        printf("ColoredParticle: Too many particles... \n");
+        return 0;
+    }
+
+    if(m_count <= 0) {
+        printf("ColoredParticle: Too few particles... \n");
+        return 0;
+    }
+
+    QImage image(m_image_name.toLocalFile());
+    if (image.isNull()) {
+        printf("ParticleTrails: loading image failed... '%s'\n", qPrintable(m_image_name.toLocalFile()));
+        return 0;
+    }
+
+    int vCount = m_count * 4;
+    int iCount = m_count * 6;
+
+    QSGGeometry *g = new QSGGeometry(ColoredParticle_AttributeSet, vCount, iCount);
+    g->setDrawingMode(GL_TRIANGLES);
+
+    ColoredParticleVertex *vertices = (ColoredParticleVertex *) g->vertexData();
+    for (int p=0; p<m_count; ++p) {
+
+        for (int i=0; i<4; ++i) {
+            vertices[i].x = 0;
+            vertices[i].y = 0;
+            vertices[i].t = -1;
+            vertices[i].lifeSpan = 0;
+            vertices[i].size = 0;
+            vertices[i].endSize = 0;
+            vertices[i].sx = 0;
+            vertices[i].sy = 0;
+            vertices[i].ax = 0;
+            vertices[i].ay = 0;
+        }
+
+        vertices[0].tx = 0;
+        vertices[0].ty = 0;
+
+        vertices[1].tx = 1;
+        vertices[1].ty = 0;
+
+        vertices[2].tx = 0;
+        vertices[2].ty = 1;
+
+        vertices[3].tx = 1;
+        vertices[3].ty = 1;
+
+        vertices += 4;
+    }
+
+    quint16 *indices = g->indexDataAsUShort();
+    for (int i=0; i<m_count; ++i) {
+        int o = i * 4;
+        indices[0] = o;
+        indices[1] = o + 1;
+        indices[2] = o + 2;
+        indices[3] = o + 1;
+        indices[4] = o + 3;
+        indices[5] = o + 2;
+        indices += 6;
+    }
+
+    if (m_material) {
+        delete m_material;
+        m_material = 0;
+    }
+
+    QImage colortable(m_colortable_name.toLocalFile());
+    QImage sizetable(m_sizetable_name.toLocalFile());
+    QImage opacitytable(m_opacitytable_name.toLocalFile());
+    if(!colortable.isNull() || !sizetable.isNull() || !opacitytable.isNull()){
+        //using tabled shaders
+        m_material = new ParticleTrailsMaterialCT();
+        if(colortable.isNull())
+            colortable = QImage(":resources/identitytable.png");
+        if(sizetable.isNull())
+            sizetable = QImage(":resources/identitytable.png");
+        if(opacitytable.isNull())
+            opacitytable = QImage(":resources/defaultFadeInOut.png");
+        Q_ASSERT(!colortable.isNull());
+        Q_ASSERT(!sizetable.isNull());
+        Q_ASSERT(!opacitytable.isNull());
+        ParticleTrailsMaterialCT* ct_material = static_cast<ParticleTrailsMaterialCT *>(m_material);
+        ct_material->colortable = sceneGraphEngine()->createTextureFromImage(colortable);
+        ct_material->sizetable = sceneGraphEngine()->createTextureFromImage(sizetable);
+        ct_material->opacitytable = sceneGraphEngine()->createTextureFromImage(opacitytable);
+    }
+
+    if (!m_material)
+        m_material = new ParticleTrailsMaterial();
+
+
+    m_material->texture = sceneGraphEngine()->createTextureFromImage(image);
+    m_material->texture->setFiltering(QSGTexture::Linear);
+
+    m_node = new QSGGeometryNode();
+    m_node->setGeometry(g);
+    m_node->setMaterial(m_material);
+
+    m_last_particle = 0;
+
+    return m_node;
+}
+
+QSGNode *ColoredParticle::updatePaintNode(QSGNode *, UpdatePaintNodeData *)
+{
+    if(m_pleaseReset){
+        if(m_node)
+            delete m_node;
+        if(m_material)
+            delete m_material;
+
+        m_node = 0;
+        m_material = 0;
+        m_pleaseReset = false;
+    }
+
+    if(m_system && m_system->isRunning())
+        prepareNextFrame();
+    if (m_node){
+        update();
+        m_node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    return m_node;
+}
+
+void ColoredParticle::prepareNextFrame()
+{
+    if (m_node == 0){    //TODO: Staggered loading (as emitted)
+        m_node = buildParticleNode();
+        if(m_node == 0)
+            return;
+    }
+    uint timeStamp = m_system->systemSync(this);
+
+    qreal time = timeStamp / 1000.;
+    m_material->timestamp = time;
+}
+
+void ColoredParticle::reloadColor(const Color4ub &c, ParticleData* d)
+{
+    ColoredParticleVertices *particles = (ColoredParticleVertices *) m_node->geometry()->vertexData();
+    int pos = particleTypeIndex(d);
+    ColoredParticleVertices &p = particles[pos];
+    p.v1.color = p.v2.color = p.v3.color = p.v4.color = c;
+}
+
+void ColoredParticle::vertexCopy(ColoredParticleVertex &b,const ParticleVertex& a)
+{
+    b.x = a.x - m_systemOffset.x();
+    b.y = a.y - m_systemOffset.y();
+    b.t = a.t;
+    b.lifeSpan = a.lifeSpan;
+    b.size = a.size;
+    b.endSize = a.endSize;
+    b.sx = a.sx;
+    b.sy = a.sy;
+    b.ax = a.ax;
+    b.ay = a.ay;
+}
+
+void ColoredParticle::reload(ParticleData *d)
+{
+    if (m_node == 0)
+        return;
+
+    ColoredParticleVertices *particles = (ColoredParticleVertices *) m_node->geometry()->vertexData();
+
+    int pos = particleTypeIndex(d);
+
+    ColoredParticleVertices &p = particles[pos];
+
+    //Perhaps we could be more efficient?
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+}
+
+void ColoredParticle::load(ParticleData *d)
+{
+    if (m_node == 0)
+        return;
+
+    //Color initialization
+    // Particle color
+    Color4ub color;
+    qreal redVariation = m_color_variation + m_redVariation;
+    qreal greenVariation = m_color_variation + m_greenVariation;
+    qreal blueVariation = m_color_variation + m_blueVariation;
+    color.r = m_color.red() * (1 - redVariation) + rand() % 256 * redVariation;
+    color.g = m_color.green() * (1 - greenVariation) + rand() % 256 * greenVariation;
+    color.b = m_color.blue() * (1 - blueVariation) + rand() % 256 * blueVariation;
+    color.a = m_alpha * m_color.alpha() * (1 - m_alphaVariation) + rand() % 256 * m_alphaVariation;
+    ColoredParticleVertices *particles = (ColoredParticleVertices *) m_node->geometry()->vertexData();
+    ColoredParticleVertices &p = particles[particleTypeIndex(d)];
+    p.v1.color = p.v2.color = p.v3.color = p.v4.color = color;
+
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/coloredparticle.h b/src/imports/particles/coloredparticle.h
new file mode 100644
index 0000000000..446b764941
--- /dev/null
+++ b/src/imports/particles/coloredparticle.h
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef COLOREDPARTICLE_H
+#define COLOREDPARTICLE_H
+#include "particle.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ParticleTrailsMaterial;
+class QSGGeometryNode;
+
+struct Color4ub {
+    uchar r;
+    uchar g;
+    uchar b;
+    uchar a;
+};
+
+struct ColoredParticleVertex {
+    float x;
+    float y;
+    float tx;
+    float ty;
+    float t;
+    float lifeSpan;
+    float size;
+    float endSize;
+    float sx;
+    float sy;
+    float ax;
+    float ay;
+    Color4ub color;
+};
+
+struct ColoredParticleVertices {
+    ColoredParticleVertex v1;
+    ColoredParticleVertex v2;
+    ColoredParticleVertex v3;
+    ColoredParticleVertex v4;
+};
+
+class ColoredParticle : public ParticleType
+{
+    Q_OBJECT
+    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)
+    Q_PROPERTY(QUrl colorTable READ colortable WRITE setColortable NOTIFY colortableChanged)
+    Q_PROPERTY(QUrl sizeTable READ sizetable WRITE setSizetable NOTIFY sizetableChanged)
+    Q_PROPERTY(QUrl opacityTable READ opacitytable WRITE setOpacitytable NOTIFY opacitytableChanged)
+
+    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+    //Stacks (added) with individual colorVariations
+    Q_PROPERTY(qreal colorVariation READ colorVariation WRITE setColorVariation NOTIFY colorVariationChanged)
+    Q_PROPERTY(qreal redVariation READ redVariation WRITE setRedVariation NOTIFY redVariationChanged)
+    Q_PROPERTY(qreal greenVariation READ greenVariation WRITE setGreenVariation NOTIFY greenVariationChanged)
+    Q_PROPERTY(qreal blueVariation READ blueVariation WRITE setBlueVariation NOTIFY blueVariationChanged)
+    //Stacks (multiplies) with the Alpha in the color, mostly here so you can use svg color names (which have full alpha)
+    Q_PROPERTY(qreal alpha READ alpha WRITE setAlpha NOTIFY alphaChanged)
+    Q_PROPERTY(qreal alphaVariation READ alphaVariation WRITE setAlphaVariation NOTIFY alphaVariationChanged)
+
+public:
+    explicit ColoredParticle(QSGItem *parent = 0);
+    virtual ~ColoredParticle(){}
+
+    virtual void load(ParticleData*);
+    virtual void reload(ParticleData*);
+    virtual void setCount(int c);
+
+    QUrl image() const { return m_image_name; }
+    void setImage(const QUrl &image);
+
+    QUrl colortable() const { return m_colortable_name; }
+    void setColortable(const QUrl &table);
+
+    QUrl sizetable() const { return m_sizetable_name; }
+    void setSizetable (const QUrl &table);
+
+    QUrl opacitytable() const { return m_opacitytable_name; }
+    void setOpacitytable(const QUrl &table);
+
+    QColor color() const { return m_color; }
+    void setColor(const QColor &color);
+
+    qreal colorVariation() const { return m_color_variation; }
+    void setColorVariation(qreal var);
+
+    qreal renderOpacity() const { return m_render_opacity; }
+
+    qreal alphaVariation() const
+    {
+        return m_alphaVariation;
+    }
+
+    qreal alpha() const
+    {
+        return m_alpha;
+    }
+
+    qreal redVariation() const
+    {
+        return m_redVariation;
+    }
+
+    qreal greenVariation() const
+    {
+        return m_greenVariation;
+    }
+
+    qreal blueVariation() const
+    {
+        return m_blueVariation;
+    }
+
+signals:
+
+    void imageChanged();
+    void colortableChanged();
+    void sizetableChanged();
+    void opacitytableChanged();
+
+    void colorChanged();
+    void colorVariationChanged();
+
+    void particleDurationChanged();
+    void alphaVariationChanged(qreal arg);
+
+    void alphaChanged(qreal arg);
+
+    void redVariationChanged(qreal arg);
+
+    void greenVariationChanged(qreal arg);
+
+    void blueVariationChanged(qreal arg);
+
+public slots:
+    void setAlphaVariation(qreal arg)
+    {
+        if (m_alphaVariation != arg) {
+            m_alphaVariation = arg;
+            emit alphaVariationChanged(arg);
+        }
+    }
+
+    void setAlpha(qreal arg)
+    {
+        if (m_alpha != arg) {
+            m_alpha = arg;
+            emit alphaChanged(arg);
+        }
+    }
+
+    void setRedVariation(qreal arg)
+    {
+        if (m_redVariation != arg) {
+            m_redVariation = arg;
+            emit redVariationChanged(arg);
+        }
+    }
+
+    void setGreenVariation(qreal arg)
+    {
+        if (m_greenVariation != arg) {
+            m_greenVariation = arg;
+            emit greenVariationChanged(arg);
+        }
+    }
+
+    void setBlueVariation(qreal arg)
+    {
+        if (m_blueVariation != arg) {
+            m_blueVariation = arg;
+            emit blueVariationChanged(arg);
+        }
+    }
+
+    void reloadColor(const Color4ub &c, ParticleData* d);
+protected:
+    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    void reset();
+    void prepareNextFrame();
+    QSGGeometryNode* buildParticleNode();
+private:
+    void vertexCopy(ColoredParticleVertex &b,const ParticleVertex& a);
+    bool m_do_reset;
+
+    QUrl m_image_name;
+    QUrl m_colortable_name;
+    QUrl m_sizetable_name;
+    QUrl m_opacitytable_name;
+
+
+    QColor m_color;
+    qreal m_color_variation;
+    qreal m_particleDuration;
+
+    QSGGeometryNode *m_node;
+    ParticleTrailsMaterial *m_material;
+
+    // derived values...
+    int m_last_particle;
+
+    qreal m_render_opacity;
+    qreal m_alphaVariation;
+    qreal m_alpha;
+    qreal m_redVariation;
+    qreal m_greenVariation;
+    qreal m_blueVariation;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // COLOREDPARTICLE_H
diff --git a/src/imports/particles/deformableparticle.cpp b/src/imports/particles/deformableparticle.cpp
new file mode 100644
index 0000000000..2043e12be9
--- /dev/null
+++ b/src/imports/particles/deformableparticle.cpp
@@ -0,0 +1,432 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include <qsgnode.h>
+#include <qsgtexturematerial.h>
+#include <qsgtexture.h>
+#include <QFile>
+#include "deformableparticle.h"
+#include <QGLFunctions>
+#include <qsgengine.h>
+
+QT_BEGIN_NAMESPACE
+
+const float CONV = 0.017453292519943295;
+class DeformableParticleMaterial : public QSGMaterial
+{
+public:
+    DeformableParticleMaterial()
+        : timestamp(0)
+    {
+        setFlag(Blending, true);
+    }
+
+    ~DeformableParticleMaterial()
+    {
+        delete texture;
+    }
+
+    virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const
+    {
+        return this - static_cast<const DeformableParticleMaterial *>(other);
+    }
+
+    QSGTexture *texture;
+
+    qreal timestamp;
+};
+
+
+class DeformableParticleMaterialData : public QSGMaterialShader
+{
+public:
+    DeformableParticleMaterialData(const char *vertexFile = 0, const char *fragmentFile = 0)
+    {
+        QFile vf(vertexFile ? vertexFile : ":resources/deformablevertex.shader");
+        vf.open(QFile::ReadOnly);
+        m_vertex_code = vf.readAll();
+
+        QFile ff(fragmentFile ? fragmentFile : ":resources/deformablefragment.shader");
+        ff.open(QFile::ReadOnly);
+        m_fragment_code = ff.readAll();
+
+        Q_ASSERT(!m_vertex_code.isNull());
+        Q_ASSERT(!m_fragment_code.isNull());
+    }
+
+    void deactivate() {
+        QSGMaterialShader::deactivate();
+
+        for (int i=0; i<8; ++i) {
+            m_program.setAttributeArray(i, GL_FLOAT, chunkOfBytes, 1, 0);
+        }
+    }
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *)
+    {
+        DeformableParticleMaterial *m = static_cast<DeformableParticleMaterial *>(newEffect);
+        state.context()->functions()->glActiveTexture(GL_TEXTURE0);
+        m->texture->bind();
+
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+        m_program.setUniformValue(m_timestamp_id, (float) m->timestamp);
+
+        if (state.isMatrixDirty())
+            m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+    }
+
+    virtual void initialize() {
+        m_matrix_id = m_program.uniformLocation("matrix");
+        m_opacity_id = m_program.uniformLocation("opacity");
+        m_timestamp_id = m_program.uniformLocation("timestamp");
+    }
+
+    virtual const char *vertexShader() const { return m_vertex_code.constData(); }
+    virtual const char *fragmentShader() const { return m_fragment_code.constData(); }
+
+    virtual char const *const *attributeNames() const {
+        static const char *attr[] = {
+            "vPos",
+            "vTex",
+            "vData",
+            "vVec",
+            "vDeformVec",
+            "vRotation",
+            0
+        };
+        return attr;
+    }
+
+    virtual bool isColorTable() const { return false; }
+
+    int m_matrix_id;
+    int m_opacity_id;
+    int m_timestamp_id;
+
+    QByteArray m_vertex_code;
+    QByteArray m_fragment_code;
+
+    static float chunkOfBytes[1024];
+};
+float DeformableParticleMaterialData::chunkOfBytes[1024];
+
+
+QSGMaterialShader *DeformableParticleMaterial::createShader() const
+{
+    return new DeformableParticleMaterialData;
+}
+
+struct DeformableParticleVertex {
+    float x;
+    float y;
+    float tx;
+    float ty;
+    float t;
+    float lifeSpan;
+    float size;
+    float endSize;
+    float sx;
+    float sy;
+    float ax;
+    float ay;
+    float xx;
+    float xy;
+    float yx;
+    float yy;
+    float rotation;
+    float autoRotate;//Assume that GPUs prefer floats to bools
+};
+
+struct DeformableParticleVertices {
+    DeformableParticleVertex v1;
+    DeformableParticleVertex v2;
+    DeformableParticleVertex v3;
+    DeformableParticleVertex v4;
+};
+
+
+DeformableParticle::DeformableParticle(QSGItem* parent)
+    : ParticleType(parent)
+    , m_do_reset(false)
+    , m_rotation(0)
+    , m_autoRotation(false)
+    , m_xVector(0)
+    , m_yVector(0)
+    , m_rotationVariation(0)
+{
+    setFlag(ItemHasContents);
+}
+
+void DeformableParticle::setImage(const QUrl &image)
+{
+    if (image == m_image)
+        return;
+    m_image = image;
+    emit imageChanged();
+    reset();
+}
+
+void DeformableParticle::setCount(int c)
+{
+    ParticleType::setCount(c);
+    m_pleaseReset = true;
+}
+
+void DeformableParticle::reset()
+{
+    ParticleType::reset();
+     m_pleaseReset = true;
+}
+
+static QSGGeometry::Attribute DeformableParticle_Attributes[] = {
+    { 0, 2, GL_FLOAT },             // Position
+    { 1, 2, GL_FLOAT },             // TexCoord
+    { 2, 4, GL_FLOAT },             // Data
+    { 3, 4, GL_FLOAT },             // Vectors
+    { 4, 4, GL_FLOAT },             // DeformationVectors
+    { 5, 2, GL_FLOAT }              // Rotation
+};
+
+static QSGGeometry::AttributeSet DeformableParticle_AttributeSet =
+{
+    6, // Attribute Count
+    (2 + 2 + 4 + 4 + 4 + 2) * sizeof(float),
+    DeformableParticle_Attributes
+};
+
+QSGGeometryNode* DeformableParticle::buildParticleNode()
+{
+    if (m_count * 4 > 0xffff) {
+        printf("DeformableParticle: Too many particles... \n");
+        return 0;
+    }
+
+    if(m_count <= 0) {
+        printf("DeformableParticle: Too few particles... \n");
+        return 0;
+    }
+
+    QImage image(m_image.toLocalFile());
+    if (image.isNull()) {
+        printf("DeformableParticle: loading image failed... '%s'\n", qPrintable(m_image.toLocalFile()));
+        return 0;
+    }
+
+    int vCount = m_count * 4;
+    int iCount = m_count * 6;
+
+    QSGGeometry *g = new QSGGeometry(DeformableParticle_AttributeSet, vCount, iCount);
+    g->setDrawingMode(GL_TRIANGLES);
+
+    DeformableParticleVertex *vertices = (DeformableParticleVertex *) g->vertexData();
+    for (int p=0; p<m_count; ++p) {
+
+        for (int i=0; i<4; ++i) {
+            vertices[i].x = 0;
+            vertices[i].y = 0;
+            vertices[i].t = -1;
+            vertices[i].lifeSpan = 0;
+            vertices[i].size = 0;
+            vertices[i].endSize = 0;
+            vertices[i].sx = 0;
+            vertices[i].sy = 0;
+            vertices[i].ax = 0;
+            vertices[i].ay = 0;
+            vertices[i].xx = 1;
+            vertices[i].xy = 0;
+            vertices[i].yx = 0;
+            vertices[i].yy = 1;
+            vertices[i].rotation = 0;
+            vertices[i].autoRotate = 0;
+        }
+
+        vertices[0].tx = 0;
+        vertices[0].ty = 0;
+
+        vertices[1].tx = 1;
+        vertices[1].ty = 0;
+
+        vertices[2].tx = 0;
+        vertices[2].ty = 1;
+
+        vertices[3].tx = 1;
+        vertices[3].ty = 1;
+
+        vertices += 4;
+    }
+
+    quint16 *indices = g->indexDataAsUShort();
+    for (int i=0; i<m_count; ++i) {
+        int o = i * 4;
+        indices[0] = o;
+        indices[1] = o + 1;
+        indices[2] = o + 2;
+        indices[3] = o + 1;
+        indices[4] = o + 3;
+        indices[5] = o + 2;
+        indices += 6;
+    }
+
+    if (m_material) {
+        delete m_material;
+        m_material = 0;
+    }
+
+    if (!m_material)
+        m_material = new DeformableParticleMaterial();
+
+
+    m_material->texture = sceneGraphEngine()->createTextureFromImage(image);
+    m_material->texture->setFiltering(QSGTexture::Linear);
+
+    m_node = new QSGGeometryNode();
+    m_node->setGeometry(g);
+    m_node->setMaterial(m_material);
+
+    m_last_particle = 0;
+
+    return m_node;
+}
+
+QSGNode *DeformableParticle::updatePaintNode(QSGNode *, UpdatePaintNodeData *)
+{
+    if(m_pleaseReset){
+        if(m_node)
+            delete m_node;
+        if(m_material)
+            delete m_material;
+
+        m_node = 0;
+        m_material = 0;
+        m_pleaseReset = false;
+    }
+
+    if(m_system && m_system->isRunning())
+        prepareNextFrame();
+    if (m_node){
+        update();
+        m_node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    return m_node;
+}
+
+void DeformableParticle::prepareNextFrame()
+{
+    if (m_node == 0){    //TODO: Staggered loading (as emitted)
+        m_node = buildParticleNode();
+        if(m_node == 0)
+            return;
+    }
+    uint timeStamp = m_system->systemSync(this);
+
+    qreal time = timeStamp / 1000.;
+    m_material->timestamp = time;
+
+}
+
+
+void DeformableParticle::vertexCopy(DeformableParticleVertex &b,const ParticleVertex& a)
+{
+    b.x = a.x - m_systemOffset.x();
+    b.y = a.y - m_systemOffset.y();
+    b.t = a.t;
+    b.lifeSpan = a.lifeSpan;
+    b.size = a.size;
+    b.endSize = a.endSize;
+    b.sx = a.sx;
+    b.sy = a.sy;
+    b.ax = a.ax;
+    b.ay = a.ay;
+}
+
+void DeformableParticle::reload(ParticleData *d)
+{
+    if (m_node == 0)
+        return;
+
+    DeformableParticleVertices *particles = (DeformableParticleVertices *) m_node->geometry()->vertexData();
+
+    int pos = particleTypeIndex(d);
+
+    DeformableParticleVertices &p = particles[pos];
+
+    //Perhaps we could be more efficient?
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+    //TODO: Allow for change of deformation data?
+}
+
+void DeformableParticle::load(ParticleData *d)
+{
+    if (m_node == 0)
+        return;
+
+    //Deformation Initialization
+    DeformableParticleVertices *particles = (DeformableParticleVertices *) m_node->geometry()->vertexData();
+    DeformableParticleVertices &p = particles[particleTypeIndex(d)];
+    if(m_xVector){
+        const QPointF &ret = m_xVector->sample(QPointF(d->pv.x, d->pv.y));
+        p.v1.xx = p.v2.xx = p.v3.xx = p.v4.xx = ret.x();
+        p.v1.xy = p.v2.xy = p.v3.xy = p.v4.xy = ret.y();
+    }
+    if(m_yVector){
+        const QPointF &ret = m_yVector->sample(QPointF(d->pv.x, d->pv.y));
+        p.v1.yx = p.v2.yx = p.v3.yx = p.v4.yx = ret.x();
+        p.v1.yy = p.v2.yy = p.v3.yy = p.v4.yy = ret.y();
+    }
+    p.v1.rotation = p.v2.rotation = p.v3.rotation = p.v4.rotation =
+            (m_rotation + (m_rotationVariation - 2*((qreal)rand()/RAND_MAX)*m_rotationVariation) ) * CONV;
+    p.v1.autoRotate = p.v2.autoRotate = p.v3.autoRotate = p.v4.autoRotate = m_autoRotation?1.0:0.0;
+
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/deformableparticle.h b/src/imports/particles/deformableparticle.h
new file mode 100644
index 0000000000..21982d14da
--- /dev/null
+++ b/src/imports/particles/deformableparticle.h
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEFORMABLEPARTICLE_H
+#define DEFORMABLEPARTICLE_H
+#include "particle.h"
+#include "varyingvector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class DeformableParticleMaterial;
+class QSGGeometryNode;
+struct DeformableParticleVertex;
+
+class DeformableParticle : public ParticleType
+{
+    Q_OBJECT
+    //Note that the particle centering can be less accurate with this one
+    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)
+
+    Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
+    Q_PROPERTY(qreal rotationVariation READ rotationVariation WRITE setRotationVariation NOTIFY rotationVariationChanged)
+    //If true, then will face the direction of motion. Stacks with rotation, e.g. setting rotation
+    //to 180 will lead to facing away from the direction of motion
+    Q_PROPERTY(bool autoRotation READ autoRotation WRITE autoRotation NOTIFY autoRotationChanged)
+
+    //###Ought to be vectors, not points. Varying Vectors even?
+    //###Call i/j? Makes more sense to those with vector calculus experience, and I could even add the cirumflex in QML?
+    //xVector is the vector from the top-left point to the top-right point, and is multiplied by current size
+    Q_PROPERTY(VaryingVector* xVector READ xVector WRITE setXVector NOTIFY xVectorChanged)
+    //yVector is the same, but top-left to bottom-left. The particle is always a parallelogram.
+    Q_PROPERTY(VaryingVector* yVector READ yVector WRITE setYVector NOTIFY yVectorChanged)
+
+    //Do we want to add the tables?
+    //Q_PROPERTY(QUrl colorTable READ colortable WRITE setColortable NOTIFY colortableChanged)
+    //Q_PROPERTY(QUrl sizeTable READ sizetable WRITE setSizetable NOTIFY sizetableChanged)
+    //Q_PROPERTY(QUrl opacityTable READ opacitytable WRITE setOpacitytable NOTIFY opacitytableChanged)
+
+    //Does it need alpha? For convenience only, as images probably don't have it
+    //Q_PROPERTY(qreal alpha READ alpha WRITE setAlpha NOTIFY alphaChanged)
+    //Q_PROPERTY(qreal alphaVariation READ alphaVariation WRITE setAlphaVariation NOTIFY alphaVariationChanged)
+
+public:
+    explicit DeformableParticle(QSGItem *parent = 0);
+    virtual ~DeformableParticle(){}
+
+    virtual void load(ParticleData*);
+    virtual void reload(ParticleData*);
+    virtual void setCount(int c);
+
+    QUrl image() const { return m_image; }
+    void setImage(const QUrl &image);
+
+    qreal rotation() const
+    {
+        return m_rotation;
+    }
+
+    bool autoRotation() const
+    {
+        return m_autoRotation;
+    }
+
+    VaryingVector* xVector() const
+    {
+        return m_xVector;
+    }
+
+    VaryingVector* yVector() const
+    {
+        return m_yVector;
+    }
+
+    qreal rotationVariation() const
+    {
+        return m_rotationVariation;
+    }
+
+signals:
+
+    void imageChanged();
+    void rotationChanged(qreal arg);
+
+    void autoRotationChanged(bool arg);
+
+    void xVectorChanged(VaryingVector* arg);
+
+    void yVectorChanged(VaryingVector* arg);
+
+    void rotationVariationChanged(qreal arg);
+
+public slots:
+void setRotation(qreal arg)
+{
+    if (m_rotation != arg) {
+        m_rotation = arg;
+        emit rotationChanged(arg);
+    }
+}
+
+void autoRotation(bool arg)
+{
+    if (m_autoRotation != arg) {
+        m_autoRotation = arg;
+        emit autoRotationChanged(arg);
+    }
+}
+
+void setXVector(VaryingVector* arg)
+{
+    if (m_xVector != arg) {
+        m_xVector = arg;
+        emit xVectorChanged(arg);
+    }
+}
+
+void setYVector(VaryingVector* arg)
+{
+    if (m_yVector != arg) {
+        m_yVector = arg;
+        emit yVectorChanged(arg);
+    }
+}
+
+void setRotationVariation(qreal arg)
+{
+    if (m_rotationVariation != arg) {
+        m_rotationVariation = arg;
+        emit rotationVariationChanged(arg);
+    }
+}
+
+protected:
+    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    void reset();
+    void prepareNextFrame();
+    QSGGeometryNode* buildParticleNode();
+private:
+    void vertexCopy(DeformableParticleVertex &b,const ParticleVertex& a);
+    bool m_do_reset;
+
+    QUrl m_image;
+    QSGGeometryNode *m_node;
+    DeformableParticleMaterial *m_material;
+
+    // derived values...
+    int m_last_particle;
+
+    qreal m_render_opacity;
+    // generated vars
+    qreal m_rotation;
+    bool m_autoRotation;
+    VaryingVector* m_xVector;
+    VaryingVector* m_yVector;
+    qreal m_rotationVariation;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // DEFORMABLEPARTICLE_H
diff --git a/src/imports/particles/directedvector.cpp b/src/imports/particles/directedvector.cpp
new file mode 100644
index 0000000000..c1aeba3ad2
--- /dev/null
+++ b/src/imports/particles/directedvector.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "directedvector.h"
+#include "particleemitter.h"
+#include <cmath>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+DirectedVector::DirectedVector(QObject *parent) :
+    VaryingVector(parent)
+  , m_targetX(0)
+  , m_targetY(0)
+  , m_targetVariation(0)
+  , m_proportionalMagnitude(false)
+  , m_magnitude(0)
+  , m_magnitudeVariation(0)
+  , m_targetItem(0)
+{
+}
+
+const QPointF &DirectedVector::sample(const QPointF &from)
+{
+    //###This approach loses interpolating the last position of the target (like we could with the emitter) is it worthwhile?
+    qreal targetX;
+    qreal targetY;
+    if(m_targetItem){
+        ParticleEmitter* parentEmitter = qobject_cast<ParticleEmitter*>(parent());
+        targetX = m_targetItem->width()/2;
+        targetY = m_targetItem->height()/2;
+        if(!parentEmitter){
+            qWarning() << "Directed vector is not a child of the emitter. Mapping of target item coordinates may fail.";
+            targetX += m_targetItem->x();
+            targetY += m_targetItem->y();
+        }else{
+            m_ret = parentEmitter->mapFromItem(m_targetItem, QPointF(targetX, targetY));
+            targetX = m_ret.x();
+            targetY = m_ret.y();
+        }
+    }else{
+        targetX = m_targetX;
+        targetY = m_targetY;
+    }
+    targetX += 0 - from.x() - m_targetVariation + rand()/(float)RAND_MAX * m_targetVariation*2;
+    targetY += 0 - from.y() - m_targetVariation + rand()/(float)RAND_MAX * m_targetVariation*2;
+    qreal theta = atan2(targetY, targetX);
+    qreal mag = m_magnitude + rand()/(float)RAND_MAX * m_magnitudeVariation * 2 - m_magnitudeVariation;
+    if(m_proportionalMagnitude)
+        mag *= sqrt(targetX * targetX + targetY * targetY);
+    m_ret.setX(mag * cos(theta));
+    m_ret.setY(mag * sin(theta));
+    return m_ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/directedvector.h b/src/imports/particles/directedvector.h
new file mode 100644
index 0000000000..f1d0919bc3
--- /dev/null
+++ b/src/imports/particles/directedvector.h
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DIRECTEDVECTOR_H
+#define DIRECTEDVECTOR_H
+#include "varyingvector.h"
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGItem;
+class DirectedVector : public VaryingVector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal targetX READ targetX WRITE setTargetX NOTIFY targetXChanged)
+    Q_PROPERTY(qreal targetY READ targetY WRITE setTargetY NOTIFY targetYChanged)
+    //If targetItem is set, X/Y are ignored. Aims at middle of item, use variation for variation
+    Q_PROPERTY(QSGItem* targetItem READ targetItem WRITE setTargetItem NOTIFY targetItemChanged)
+
+    Q_PROPERTY(qreal targetVariation READ targetVariation WRITE setTargetVariation NOTIFY targetVariationChanged)
+
+    Q_PROPERTY(bool proportionalMagnitude READ proportionalMagnitude WRITE setProportionalMagnitude NOTIFY proprotionalMagnitudeChanged)
+    Q_PROPERTY(qreal magnitude READ magnitude WRITE setMagnitude NOTIFY magnitudeChanged)
+    Q_PROPERTY(qreal magnitudeVariation READ magnitudeVariation WRITE setMagnitudeVariation NOTIFY magnitudeVariationChanged)
+
+public:
+    explicit DirectedVector(QObject *parent = 0);
+    virtual const QPointF &sample(const QPointF &from);
+
+    qreal targetX() const
+    {
+        return m_targetX;
+    }
+
+    qreal targetY() const
+    {
+        return m_targetY;
+    }
+
+    qreal targetVariation() const
+    {
+        return m_targetVariation;
+    }
+
+    qreal magnitude() const
+    {
+        return m_magnitude;
+    }
+
+    bool proportionalMagnitude() const
+    {
+        return m_proportionalMagnitude;
+    }
+
+    qreal magnitudeVariation() const
+    {
+        return m_magnitudeVariation;
+    }
+
+    QSGItem* targetItem() const
+    {
+        return m_targetItem;
+    }
+
+signals:
+
+    void targetXChanged(qreal arg);
+
+    void targetYChanged(qreal arg);
+
+    void targetVariationChanged(qreal arg);
+
+    void magnitudeChanged(qreal arg);
+
+    void proprotionalMagnitudeChanged(bool arg);
+
+    void magnitudeVariationChanged(qreal arg);
+
+    void targetItemChanged(QSGItem* arg);
+
+public slots:
+    void setTargetX(qreal arg)
+    {
+        if (m_targetX != arg) {
+            m_targetX = arg;
+            emit targetXChanged(arg);
+        }
+    }
+
+    void setTargetY(qreal arg)
+    {
+        if (m_targetY != arg) {
+            m_targetY = arg;
+            emit targetYChanged(arg);
+        }
+    }
+
+    void setTargetVariation(qreal arg)
+    {
+        if (m_targetVariation != arg) {
+            m_targetVariation = arg;
+            emit targetVariationChanged(arg);
+        }
+    }
+
+    void setMagnitude(qreal arg)
+    {
+        if (m_magnitude != arg) {
+            m_magnitude = arg;
+            emit magnitudeChanged(arg);
+        }
+    }
+
+    void setProportionalMagnitude(bool arg)
+    {
+        if (m_proportionalMagnitude != arg) {
+            m_proportionalMagnitude = arg;
+            emit proprotionalMagnitudeChanged(arg);
+        }
+    }
+
+    void setMagnitudeVariation(qreal arg)
+    {
+        if (m_magnitudeVariation != arg) {
+            m_magnitudeVariation = arg;
+            emit magnitudeVariationChanged(arg);
+        }
+    }
+
+    void setTargetItem(QSGItem* arg)
+    {
+        if (m_targetItem != arg) {
+            m_targetItem = arg;
+            emit targetItemChanged(arg);
+        }
+    }
+
+private:
+    qreal m_targetX;
+    qreal m_targetY;
+    qreal m_targetVariation;
+    bool m_proportionalMagnitude;
+    qreal m_magnitude;
+    qreal m_magnitudeVariation;
+    QSGItem *m_targetItem;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // DIRECTEDVECTOR_H
diff --git a/src/imports/particles/driftaffector.cpp b/src/imports/particles/driftaffector.cpp
new file mode 100644
index 0000000000..f88e29936a
--- /dev/null
+++ b/src/imports/particles/driftaffector.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "driftaffector.h"
+#include "particlesystem.h"
+QT_BEGIN_NAMESPACE
+DriftAffector::DriftAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+}
+
+DriftAffector::~DriftAffector()
+{
+}
+
+bool DriftAffector::affectParticle(ParticleData *data, qreal dt)
+{
+    if(!m_xDrift && !m_yDrift)
+        return false;
+    qreal dx = (((qreal)qrand() / (qreal)RAND_MAX) - 0.5) * 2 * m_xDrift * dt;
+    qreal dy = (((qreal)qrand() / (qreal)RAND_MAX) - 0.5) * 2 * m_yDrift * dt;
+    if(dx)
+        data->setInstantaneousSX(data->curSX() + dx);
+    if(dy)
+        data->setInstantaneousSY(data->curSY() + dy);
+
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/driftaffector.h b/src/imports/particles/driftaffector.h
new file mode 100644
index 0000000000..91ef0fbd34
--- /dev/null
+++ b/src/imports/particles/driftaffector.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DRIFTAFFECTOR_H
+#define DRIFTAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class DriftAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal xDrift READ xDrift WRITE setXDrift NOTIFY xDriftChanged)
+    Q_PROPERTY(qreal yDrift READ yDrift WRITE setYDrift NOTIFY yDriftChanged)
+public:
+    explicit DriftAffector(QSGItem *parent = 0);
+    ~DriftAffector();
+    qreal yDrift() const
+    {
+        return m_yDrift;
+    }
+
+    qreal xDrift() const
+    {
+        return m_xDrift;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+
+signals:
+
+    void yDriftChanged(qreal arg);
+
+    void xDriftChanged(qreal arg);
+
+public slots:
+
+void setYDrift(qreal arg)
+{
+    if (m_yDrift != arg) {
+        m_yDrift = arg;
+        emit yDriftChanged(arg);
+    }
+}
+
+void setXDrift(qreal arg)
+{
+    if (m_xDrift != arg) {
+        m_xDrift = arg;
+        emit xDriftChanged(arg);
+    }
+}
+
+private:
+    qreal m_yDrift;
+    qreal m_xDrift;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // DRIFTAFFECTOR_H
diff --git a/src/imports/particles/ellipseextruder.cpp b/src/imports/particles/ellipseextruder.cpp
new file mode 100644
index 0000000000..1a0d70594b
--- /dev/null
+++ b/src/imports/particles/ellipseextruder.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "ellipseextruder.h"
+#include <cmath>
+QT_BEGIN_NAMESPACE
+EllipseExtruder::EllipseExtruder(QObject *parent) :
+    ParticleExtruder(parent)
+  , m_fill(true)
+{
+}
+
+QPointF EllipseExtruder::extrude(const QRectF & r)
+{
+    qreal theta = ((qreal)rand()/RAND_MAX) * 6.2831853071795862;
+    qreal mag = m_fill ? ((qreal)rand()/RAND_MAX) : 1;
+    return QPointF(r.x() + r.width()/2 + mag * (r.width()/2) * cos(theta),
+                   r.y() + r.height()/2 + mag * (r.height()/2) * sin(theta));
+}
+
+bool EllipseExtruder::contains(const QRectF &bounds, const QPointF &point)
+{
+    return bounds.contains(point);//TODO: Ellipse
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/ellipseextruder.h b/src/imports/particles/ellipseextruder.h
new file mode 100644
index 0000000000..25cc9bc16a
--- /dev/null
+++ b/src/imports/particles/ellipseextruder.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ELLIPSEEXTRUDER_H
+#define ELLIPSEEXTRUDER_H
+#include "particleextruder.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class EllipseExtruder : public ParticleExtruder
+{
+    Q_OBJECT
+    Q_PROPERTY(bool fill READ fill WRITE setFill NOTIFY fillChanged)//###Use base class? If it's still box
+public:
+    explicit EllipseExtruder(QObject *parent = 0);
+    virtual QPointF extrude(const QRectF &);
+    virtual bool contains(const QRectF &bounds, const QPointF &point);
+
+    bool fill() const
+    {
+        return m_fill;
+    }
+
+signals:
+
+    void fillChanged(bool arg);
+
+public slots:
+
+    void setFill(bool arg)
+    {
+        if (m_fill != arg) {
+            m_fill = arg;
+            emit fillChanged(arg);
+        }
+    }
+private:
+    bool m_fill;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // ELLIPSEEXTRUDER_H
diff --git a/src/imports/particles/eternalaffector.cpp b/src/imports/particles/eternalaffector.cpp
new file mode 100644
index 0000000000..c946709170
--- /dev/null
+++ b/src/imports/particles/eternalaffector.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "eternalaffector.h"
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+EternalAffector::EternalAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+}
+
+bool EternalAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    qreal target = (m_system->m_timeInt - m_targetLife)/1000.0;
+    if(d->pv.t < target)
+        d->pv.t = target;
+    return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/eternalaffector.h b/src/imports/particles/eternalaffector.h
new file mode 100644
index 0000000000..834106b53d
--- /dev/null
+++ b/src/imports/particles/eternalaffector.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ETERNALAFFECTOR_H
+#define ETERNALAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class EternalAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(int targetLife READ targetLife WRITE setTargetLife NOTIFY targetLifeChanged)
+
+public:
+    explicit EternalAffector(QSGItem *parent = 0);
+    int targetLife() const
+    {
+        return m_targetLife;
+    }
+
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+
+signals:
+
+    void targetLifeChanged(int arg);
+
+public slots:
+
+    void setTargetLife(int arg)
+    {
+        if (m_targetLife != arg) {
+            m_targetLife = arg;
+            emit targetLifeChanged(arg);
+        }
+    }
+private:
+    int m_targetLife;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // ETERNALAFFECTOR_H
diff --git a/src/imports/particles/followemitter.cpp b/src/imports/particles/followemitter.cpp
new file mode 100644
index 0000000000..825b9ea69f
--- /dev/null
+++ b/src/imports/particles/followemitter.cpp
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "followemitter.h"
+#include "particle.h"
+#include <cmath>
+QT_BEGIN_NAMESPACE
+
+FollowEmitter::FollowEmitter(QSGItem *parent) :
+    ParticleEmitter(parent)
+  , m_lastTimeStamp(0)
+  , m_emitterXVariation(0)
+  , m_emitterYVariation(0)
+  , m_followCount(0)
+  , m_emissionExtruder(0)
+  , m_defaultEmissionExtruder(new ParticleExtruder(this))
+{
+    connect(this, SIGNAL(followChanged(QString)),
+            this, SLOT(recalcParticlesPerSecond()));
+    connect(this, SIGNAL(particleDurationChanged(int)),
+            this, SLOT(recalcParticlesPerSecond()));
+    connect(this, SIGNAL(particlesPerParticlePerSecondChanged(int)),
+            this, SLOT(recalcParticlesPerSecond()));
+}
+
+void FollowEmitter::recalcParticlesPerSecond(){
+    if(!m_system)
+        return;
+    m_followCount = m_system->m_groupData[m_system->m_groupIds[m_follow]]->size;
+    if(!m_followCount){
+        setParticlesPerSecond(1000);//XXX: Fix this horrendous hack, needed so they aren't turned off from start
+    }else{
+        setParticlesPerSecond(m_particlesPerParticlePerSecond * m_followCount);
+        m_lastEmission.resize(m_followCount);
+        m_lastEmission.fill(0);
+    }
+}
+
+void FollowEmitter::reset()
+{
+    m_followCount = 0;
+}
+
+void FollowEmitter::emitWindow(int timeStamp)
+{
+    if (m_system == 0)
+        return;
+    if(!m_emitting && !m_burstLeft && !m_emitLeft)
+        return;
+    if(m_followCount != m_system->m_groupData[m_system->m_groupIds[m_follow]]->size){
+        qreal oldPPS = m_particlesPerSecond;
+        recalcParticlesPerSecond();
+        if(m_particlesPerSecond != oldPPS)
+            return;//system may need to update
+    }
+
+    if(m_burstLeft){
+        m_burstLeft -= timeStamp - m_lastTimeStamp * 1000.;
+        if(m_burstLeft < 0){
+            timeStamp += m_burstLeft;
+            m_burstLeft = 0;
+        }
+    }
+
+    qreal time = timeStamp / 1000.;
+    qreal particleRatio = 1. / m_particlesPerParticlePerSecond;
+    qreal pt;
+
+    //Have to map it into this system, because particlesystem automaps it back
+    QPointF offset = m_system->mapFromItem(this, QPointF(0, 0));
+    qreal sizeAtEnd = m_particleEndSize >= 0 ? m_particleEndSize : m_particleSize;
+
+    int gId = m_system->m_groupIds[m_follow];
+    int gId2 = m_system->m_groupIds[m_particle];
+    for(int i=0; i<m_system->m_groupData[gId]->size; i++){
+        pt = m_lastEmission[i];
+        ParticleData* d = m_system->m_data[i + m_system->m_groupData[gId]->start];
+        if(!d || !d->stillAlive())
+            continue;
+        if(pt < d->pv.t)
+            pt = d->pv.t;
+
+        if(!effectiveExtruder()->contains(QRectF(offset.x(), offset.y(), width(), height()),QPointF(d->curX(), d->curY()))){
+            m_lastEmission[i] = time;//jump over this time period without emitting, because it's outside
+            continue;
+        }
+        while(pt < time || m_emitLeft){
+            ParticleData* datum = m_system->newDatum(gId2);
+            if(!datum){//skip this emission
+                if(m_emitLeft)
+                    --m_emitLeft;
+                else
+                    pt += particleRatio;
+                continue;
+            }
+            datum->e = this;//###useful?
+            ParticleVertex &p = datum->pv;
+
+            // Particle timestamp
+            p.t = pt;
+            p.lifeSpan =
+                    (m_particleDuration
+                     + ((rand() % ((m_particleDurationVariation*2) + 1)) - m_particleDurationVariation))
+                    / 1000.0;
+
+            // Particle position
+            qreal followT =  pt - d->pv.t;
+            qreal followT2 = followT * followT * 0.5;
+            qreal sizeOffset = d->pv.size/2;//TODO: Current size? As an option
+            //TODO: Set variations
+            //Subtract offset, because PS expects this in emitter coordinates
+            QRectF boundsRect(d->pv.x - offset.x() + d->pv.sx * followT + d->pv.ax * followT2 - m_emitterXVariation/2,
+                              d->pv.y - offset.y() + d->pv.sy * followT + d->pv.ay * followT2 - m_emitterYVariation/2,
+                              m_emitterXVariation,
+                              m_emitterYVariation);
+//            QRectF boundsRect(d->pv.x + d->pv.sx * followT + d->pv.ax * followT2 + offset.x() - sizeOffset,
+//                              d->pv.y + d->pv.sy * followT + d->pv.ay * followT2 + offset.y() - sizeOffset,
+//                              sizeOffset*2,
+//                              sizeOffset*2);
+
+            ParticleExtruder* effectiveEmissionExtruder = m_emissionExtruder ? m_emissionExtruder : m_defaultEmissionExtruder;
+            const QPointF &newPos = effectiveEmissionExtruder->extrude(boundsRect);
+            p.x = newPos.x();
+            p.y = newPos.y();
+
+            // Particle speed
+            const QPointF &speed = m_speed->sample(newPos);
+            p.sx = speed.x();
+            p.sy = speed.y();
+
+            // Particle acceleration
+            const QPointF &accel = m_acceleration->sample(newPos);
+            p.ax = accel.x();
+            p.ay = accel.y();
+
+            // Particle size
+            float sizeVariation = -m_particleSizeVariation
+                    + rand() / float(RAND_MAX) * m_particleSizeVariation * 2;
+
+            float size = qMax((qreal)0.0, m_particleSize + sizeVariation);
+            float endSize = qMax((qreal)0.0, sizeAtEnd + sizeVariation);
+
+            p.size = size * float(m_emitting);
+            p.endSize = endSize * float(m_emitting);
+
+            if(m_emitLeft)
+                --m_emitLeft;
+            else
+                pt += particleRatio;
+            m_system->emitParticle(datum);
+        }
+        m_lastEmission[i] = pt;
+    }
+
+    m_lastTimeStamp = time;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/followemitter.h b/src/imports/particles/followemitter.h
new file mode 100644
index 0000000000..6df293e2e1
--- /dev/null
+++ b/src/imports/particles/followemitter.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FOLLOWEMITTER_H
+#define FOLLOWEMITTER_H
+#include "particleemitter.h"
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class FollowEmitter : public ParticleEmitter
+{
+    Q_OBJECT
+    Q_PROPERTY(QString follow READ follow WRITE setFollow NOTIFY followChanged)
+    //### Remove, and just document that particles per second is per particle? But has count issues
+    Q_PROPERTY(int particlesPerParticlePerSecond READ particlesPerParticlePerSecond WRITE setParticlesPerParticlePerSecond NOTIFY particlesPerParticlePerSecondChanged)
+
+    //TODO: Document that FollowEmitter's box is where it follows. It emits in a rect centered on the followed particle
+    //TODO: A set of properties that can involve the particle size of the followed
+    Q_PROPERTY(ParticleExtruder* emissionShape READ emissonShape WRITE setEmissionShape NOTIFY emissionShapeChanged)
+    Q_PROPERTY(qreal emissionHeight READ emitterYVariation WRITE setEmitterYVariation NOTIFY emitterYVariationChanged)
+    Q_PROPERTY(qreal emissionWidth READ emitterXVariation WRITE setEmitterXVariation NOTIFY emitterXVariationChanged)
+
+public:
+    explicit FollowEmitter(QSGItem *parent = 0);
+    virtual void emitWindow(int timeStamp);
+    virtual void reset();
+
+    int particlesPerParticlePerSecond() const
+    {
+        return m_particlesPerParticlePerSecond;
+    }
+
+    qreal emitterXVariation() const
+    {
+        return m_emitterXVariation;
+    }
+
+    qreal emitterYVariation() const
+    {
+        return m_emitterYVariation;
+    }
+
+    QString follow() const
+    {
+        return m_follow;
+    }
+
+    ParticleExtruder* emissonShape() const
+    {
+        return m_emissionExtruder;
+    }
+
+signals:
+
+    void particlesPerParticlePerSecondChanged(int arg);
+
+    void emitterXVariationChanged(qreal arg);
+
+    void emitterYVariationChanged(qreal arg);
+
+    void followChanged(QString arg);
+
+    void emissionShapeChanged(ParticleExtruder* arg);
+
+public slots:
+
+    void setParticlesPerParticlePerSecond(int arg)
+    {
+        if (m_particlesPerParticlePerSecond != arg) {
+            m_particlesPerParticlePerSecond = arg;
+            emit particlesPerParticlePerSecondChanged(arg);
+        }
+    }
+    void setEmitterXVariation(qreal arg)
+    {
+        if (m_emitterXVariation != arg) {
+            m_emitterXVariation = arg;
+            emit emitterXVariationChanged(arg);
+        }
+    }
+
+    void setEmitterYVariation(qreal arg)
+    {
+        if (m_emitterYVariation != arg) {
+            m_emitterYVariation = arg;
+            emit emitterYVariationChanged(arg);
+        }
+    }
+
+    void setFollow(QString arg)
+    {
+        if (m_follow != arg) {
+            m_follow = arg;
+            emit followChanged(arg);
+        }
+    }
+
+    void setEmissionShape(ParticleExtruder* arg)
+    {
+        if (m_emissionExtruder != arg) {
+            m_emissionExtruder = arg;
+            emit emissionShapeChanged(arg);
+        }
+    }
+
+private slots:
+    void recalcParticlesPerSecond();
+
+private:
+    QSet<ParticleData*> m_pending;
+    QVector<qreal> m_lastEmission;
+    int m_particlesPerParticlePerSecond;
+    qreal m_lastTimeStamp;
+    qreal m_emitterXVariation;
+    qreal m_emitterYVariation;
+    QString m_follow;
+    int m_followCount;
+    ParticleExtruder* m_emissionExtruder;
+    ParticleExtruder* m_defaultEmissionExtruder;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // FOLLOWEMITTER_H
diff --git a/src/imports/particles/frictionaffector.cpp b/src/imports/particles/frictionaffector.cpp
new file mode 100644
index 0000000000..057bb20958
--- /dev/null
+++ b/src/imports/particles/frictionaffector.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "frictionaffector.h"
+QT_BEGIN_NAMESPACE
+FrictionAffector::FrictionAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_factor(0.0)
+{
+}
+
+bool FrictionAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    if(!m_factor)
+        return false;
+    qreal curSX = d->curSX();
+    qreal curSY = d->curSY();
+    d->setInstantaneousSX(curSX + (curSX * m_factor * -1 * dt));
+    d->setInstantaneousSY(curSY + (curSY * m_factor * -1 * dt));
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/frictionaffector.h b/src/imports/particles/frictionaffector.h
new file mode 100644
index 0000000000..67b5f1029c
--- /dev/null
+++ b/src/imports/particles/frictionaffector.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FRICTIONAFFECTOR_H
+#define FRICTIONAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class FrictionAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal factor READ factor WRITE setFactor NOTIFY factorChanged)
+public:
+    explicit FrictionAffector(QSGItem *parent = 0);
+
+    qreal factor() const
+    {
+        return m_factor;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void factorChanged(qreal arg);
+
+public slots:
+
+void setFactor(qreal arg)
+{
+    if (m_factor != arg) {
+        m_factor = arg;
+        emit factorChanged(arg);
+    }
+}
+
+private:
+qreal m_factor;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // FRICTIONAFFECTOR_H
diff --git a/src/imports/particles/gravitationalsingularityaffector.cpp b/src/imports/particles/gravitationalsingularityaffector.cpp
new file mode 100644
index 0000000000..4dd7d94b7b
--- /dev/null
+++ b/src/imports/particles/gravitationalsingularityaffector.cpp
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "gravitationalsingularityaffector.h"
+#include <cmath>
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+GravitationalSingularityAffector::GravitationalSingularityAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_strength(0.0), m_x(0), m_y(0)
+{
+}
+
+const qreal LIMIT = 200;
+qreal limit(qreal val){
+    if(qAbs(val) > LIMIT){
+        return val < 0 ? LIMIT * -1 : LIMIT;
+    }else{
+        return val;
+    }
+}
+
+bool GravitationalSingularityAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    if(!m_strength)
+        return false;
+    qreal dx = m_x - d->curX();
+    qreal dy = m_y - d->curY();
+    qreal r = sqrt((dx*dx) + (dy*dy));
+    if(r < 0.1 ){//Simulated event horizion - It's right on top of it, and will never escape again. just stick it here.
+        d->pv.ax = 0;
+        d->pv.ay = 0;
+        d->pv.sx = 0;
+        d->pv.sy = 0;
+        d->pv.x = m_x;
+        d->pv.y = m_y;
+        return true;
+    }else if(r < 50.0){//Too close, typical dt values are far too coarse for simulation. This may kill perf though
+        int parts = floor(100.0/r);
+        ParticleData* f = new ParticleData;//Fake, where it's all in real time for convenience
+        f->pv.x = d->curX();
+        f->pv.y = d->curY();
+        f->pv.sx = limit(d->curSX());
+        f->pv.sy = limit(d->curSY());
+        f->pv.ax = d->pv.ax;
+        f->pv.ay = d->pv.ay;
+        subaffect(f, dt/parts, true);
+        for(int i=1; i<parts; i++)
+            subaffect(f, dt/parts, false);
+
+        //Copy values from f, and turn into 'from start' values
+        qreal t = (m_system->m_timeInt/1000.) - d->pv.t;
+        qreal sy = limit(f->pv.sy) - t*f->pv.ay;
+        qreal y = f->pv.y - t*sy - 0.5 * t*t*f->pv.ay;
+        qreal sx = limit(f->pv.sx) - t*f->pv.ax;
+        qreal x = f->pv.x - t*sx - 0.5 * t*t*f->pv.ax;
+
+        d->pv.ay = f->pv.ay;
+        d->pv.sy = sy;
+        d->pv.y = y;
+        d->pv.ax = f->pv.ax;
+        d->pv.sx = sx;
+        d->pv.x = x;
+        return true;
+    }
+    qreal theta = atan2(dy,dx);
+    qreal ds = (m_strength / (r*r)) * dt;
+    dx = ds * cos(theta);
+    dy = ds * sin(theta);
+    d->setInstantaneousSX(limit(d->pv.sx + dx));
+    d->setInstantaneousSY(limit(d->pv.sy + dy));
+    return true;
+}
+
+const qreal EPSILON = 0.1;
+bool fuzzyCompare(qreal a, qreal b)
+{
+    //Not using qFuzzyCompare because I want control of epsilon
+    return (a >= b - EPSILON && a <= b + EPSILON);
+}
+
+bool fuzzyLess(qreal a, qreal b)
+{
+    //Not using qFuzzyCompare because I want control of epsilon
+    return a <= b + EPSILON;
+}
+
+bool fuzzyMore(qreal a, qreal b)
+{
+    //Not using qFuzzyCompare because I want control of epsilon
+    return a >= b - EPSILON;
+}
+
+bool lineIntersect(qreal x1, qreal y1, qreal x2, qreal y2, qreal x3, qreal y3)
+{
+    if(x3 < qMin(x1,x2) || x3 > qMax(x1,x2) || y3 < qMin(y1,y2) || y3 > qMax(y1,y2))
+        return false;
+    qreal m,c;
+    m = (y2-y1) / (x2-x1);
+    c = y1 - m*x1;
+    return (fuzzyCompare(y3, m*x3 + c));
+}
+
+void GravitationalSingularityAffector::subaffect(ParticleData *d, qreal dt, bool first)
+{
+    if(!first){
+        qreal nextX = d->pv.x + d->pv.sx * dt + d->pv.ax * dt * dt * 0.5;
+        qreal nextY = d->pv.y + d->pv.sy * dt + d->pv.ay * dt * dt * 0.5;
+        if(lineIntersect(d->pv.x, d->pv.y, nextX, nextY, m_x, m_y)){
+            d->pv.ax = 0;
+            d->pv.ay = 0;
+            d->pv.sx = 0;
+            d->pv.sy = 0;
+            d->pv.x = m_x;
+            d->pv.y = m_y;
+            return;
+            //Passed center - the near infinite forces cancel out
+//            d->pv.x = m_x + m_x - d->pv.x;
+//            d->pv.y = m_y + m_y - d->pv.y;
+//            d->pv.sx *= -1;
+//            d->pv.sy *= -1;
+//            return;
+        }
+        //Simulate advancing a dt
+        d->pv.x = nextX;
+        d->pv.y = nextY;
+        d->pv.sx += d->pv.ax * dt;
+        d->pv.sy += d->pv.ay * dt;
+    }
+    qreal dx = m_x - d->pv.x;
+    qreal dy = m_y - d->pv.y;
+    qreal r = sqrt((dx*dx) + (dy*dy));
+    if(!r)
+        return;
+    qreal theta = atan2(dy,dx);
+    qreal ds = (m_strength / (r*r)) * dt;
+    dx = ds * cos(theta);
+    dy = ds * sin(theta);
+    d->pv.sx = d->pv.sx + dx;
+    d->pv.sy = d->pv.sy + dy;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/gravitationalsingularityaffector.h b/src/imports/particles/gravitationalsingularityaffector.h
new file mode 100644
index 0000000000..7ac5e93e0e
--- /dev/null
+++ b/src/imports/particles/gravitationalsingularityaffector.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GRAVITATIONALSINGULARITYAFFECTOR_H
+#define GRAVITATIONALSINGULARITYAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class GravitationalSingularityAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal strength READ strength WRITE setStrength NOTIFY strengthChanged)
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
+public:
+    explicit GravitationalSingularityAffector(QSGItem *parent = 0);
+
+    qreal strength() const
+    {
+        return m_strength;
+    }
+
+    qreal x() const
+    {
+        return m_x;
+    }
+
+    qreal y() const
+    {
+        return m_y;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+    void subaffect(ParticleData *d, qreal dt, bool first);
+signals:
+
+    void strengthChanged(qreal arg);
+
+    void xChanged(qreal arg);
+
+    void yChanged(qreal arg);
+
+public slots:
+
+void setStrength(qreal arg)
+{
+    if (m_strength != arg) {
+        m_strength = arg;
+        emit strengthChanged(arg);
+    }
+}
+
+void setX(qreal arg)
+{
+    if (m_x != arg) {
+        m_x = arg;
+        emit xChanged(arg);
+    }
+}
+
+void setY(qreal arg)
+{
+    if (m_y != arg) {
+        m_y = arg;
+        emit yChanged(arg);
+    }
+}
+
+private:
+qreal m_strength;
+qreal m_x;
+qreal m_y;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // GRAVITATIONALSINGULARITYAFFECTOR_H
diff --git a/src/imports/particles/gravityaffector.cpp b/src/imports/particles/gravityaffector.cpp
new file mode 100644
index 0000000000..02edbacd68
--- /dev/null
+++ b/src/imports/particles/gravityaffector.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "gravityaffector.h"
+#include <cmath>
+QT_BEGIN_NAMESPACE
+const qreal CONV = 0.017453292520444443;
+GravityAffector::GravityAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_acceleration(-10), m_angle(90), m_xAcc(0), m_yAcc(0)
+{
+    connect(this, SIGNAL(accelerationChanged(qreal)),
+            this, SLOT(recalc()));
+    connect(this, SIGNAL(angleChanged(qreal)),
+            this, SLOT(recalc()));
+    recalc();
+}
+
+void GravityAffector::recalc()
+{
+    qreal theta = m_angle * CONV;
+    m_xAcc = m_acceleration * cos(theta);
+    m_yAcc = m_acceleration * sin(theta);
+}
+
+bool GravityAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    Q_UNUSED(dt);
+    bool changed = false;
+    if(d->pv.ax != m_xAcc){
+        d->setInstantaneousAX(m_xAcc);
+        changed = true;
+    }
+    if(d->pv.ay != m_yAcc){
+        d->setInstantaneousAY(m_yAcc);
+        changed = true;
+    }
+    return changed;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/gravityaffector.h b/src/imports/particles/gravityaffector.h
new file mode 100644
index 0000000000..004b59e182
--- /dev/null
+++ b/src/imports/particles/gravityaffector.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GRAVITYAFFECTOR_H
+#define GRAVITYAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class GravityAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged)
+    Q_PROPERTY(qreal angle READ angle WRITE setAngle NOTIFY angleChanged)
+public:
+    explicit GravityAffector(QSGItem *parent = 0);
+    qreal acceleration() const
+    {
+        return m_acceleration;
+    }
+
+    qreal angle() const
+    {
+        return m_angle;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void accelerationChanged(qreal arg);
+
+    void angleChanged(qreal arg);
+
+public slots:
+void setAcceleration(qreal arg)
+{
+    if (m_acceleration != arg) {
+        m_acceleration = arg;
+        emit accelerationChanged(arg);
+    }
+}
+
+void setAngle(qreal arg)
+{
+    if (m_angle != arg) {
+        m_angle = arg;
+        emit angleChanged(arg);
+    }
+}
+
+private slots:
+    void recalc();
+private:
+    qreal m_acceleration;
+    qreal m_angle;
+
+    qreal m_xAcc;
+    qreal m_yAcc;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // GRAVITYAFFECTOR_H
diff --git a/src/imports/particles/killaffector.cpp b/src/imports/particles/killaffector.cpp
new file mode 100644
index 0000000000..1af77918c5
--- /dev/null
+++ b/src/imports/particles/killaffector.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "killaffector.h"
+#include "particleemitter.h"
+QT_BEGIN_NAMESPACE
+KillAffector::KillAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+}
+
+
+bool KillAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    Q_UNUSED(dt);
+    d->pv.t -= d->pv.lifeSpan;
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/killaffector.h b/src/imports/particles/killaffector.h
new file mode 100644
index 0000000000..937ef321a3
--- /dev/null
+++ b/src/imports/particles/killaffector.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef KILLAFFECTOR_H
+#define KILLAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class KillAffector : public ParticleAffector
+{
+    Q_OBJECT
+public:
+    explicit KillAffector(QSGItem *parent = 0);
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+public slots:
+
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // KILLAFFECTOR_H
diff --git a/src/imports/particles/lineextruder.cpp b/src/imports/particles/lineextruder.cpp
new file mode 100644
index 0000000000..399bdae046
--- /dev/null
+++ b/src/imports/particles/lineextruder.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "lineextruder.h"
+#include <cmath>
+
+LineExtruder::LineExtruder(QObject *parent) :
+    ParticleExtruder(parent), m_mirrored(false)
+{
+}
+
+QPointF LineExtruder::extrude(const QRectF &r)
+{
+    qreal x,y;
+    if(!r.height()){
+        x = r.width() * ((qreal)rand())/RAND_MAX;
+        y = 0;
+    }else{
+        y = r.height() * ((qreal)rand())/RAND_MAX;
+        if(!r.width()){
+            x = 0;
+        }else{
+            x = r.width()/r.height() * y;
+            if(m_mirrored)
+                x = r.width() - x;
+        }
+    }
+    return QPointF(x,y);
+}
diff --git a/src/imports/particles/lineextruder.h b/src/imports/particles/lineextruder.h
new file mode 100644
index 0000000000..925f1b3361
--- /dev/null
+++ b/src/imports/particles/lineextruder.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LINEEXTRUDER_H
+#define LINEEXTRUDER_H
+#include "particleextruder.h"
+
+class LineExtruder : public ParticleExtruder
+{
+    Q_OBJECT
+    //Default is topleft to bottom right. Flipped makes it topright to bottom left
+    Q_PROPERTY(bool mirrored READ mirrored WRITE setmirrored NOTIFY mirroredChanged)
+
+public:
+    explicit LineExtruder(QObject *parent = 0);
+    virtual QPointF extrude(const QRectF &);
+    bool mirrored() const
+    {
+        return m_mirrored;
+    }
+
+signals:
+
+    void mirroredChanged(bool arg);
+
+public slots:
+
+    void setmirrored(bool arg)
+    {
+        if (m_mirrored != arg) {
+            m_mirrored = arg;
+            emit mirroredChanged(arg);
+        }
+    }
+private:
+    bool m_mirrored;
+};
+
+#endif // LINEEXTRUDER_H
diff --git a/src/imports/particles/main.cpp b/src/imports/particles/main.cpp
new file mode 100644
index 0000000000..b2d5c27306
--- /dev/null
+++ b/src/imports/particles/main.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "V1/qdeclarativeparticles_p.h"
+#include "pluginmain.h"
+#include "spritestate.h"
+#include "spriteengine.h"
+#include "particleaffector.h"
+#include "wanderaffector.h"
+//#include "rockingaffector.h"
+//#include "scalingaffector.h"
+#include "resetaffector.h"
+#include "gravityaffector.h"
+#include "driftaffector.h"
+#include "gravitationalsingularityaffector.h"
+#include "frictionaffector.h"
+#include "meanderaffector.h"
+#include "attractoraffector.h"
+#include "speedlimitaffector.h"
+#include "killaffector.h"
+//#include "zoneaffector.h"
+//#include "toggleaffector.h"
+#include "spritegoalaffector.h"
+#include "swarmaffector.h"
+#include "turbulenceaffector.h"
+#include "eternalaffector.h"
+#include "particlesystem.h"
+#include "particleemitter.h"
+//#include "spriteemitter.h"
+#include "trailsemitter.h"
+#include "particle.h"
+#include "coloredparticle.h"
+#include "spriteparticle.h"
+#include "modelparticle.h"
+//#include "pairedparticle.h"
+#include "spriteimage.h"
+#include "followemitter.h"
+#include "particleextruder.h"
+#include "ellipseextruder.h"
+#include "lineextruder.h"
+#include "maskextruder.h"
+#include "varyingvector.h"
+#include "pointvector.h"
+#include "angledvector.h"
+#include "directedvector.h"
+//#include "followaffector.h"
+#include "deformableparticle.h"
+#include "pictureaffector.h"
+
+QT_BEGIN_NAMESPACE
+
+void ParticlesPlugin::registerTypes(const char *uri)
+{
+    Q_ASSERT(QLatin1String(uri) == QLatin1String("Qt.labs.particles"));
+
+    qmlRegisterType<QDeclarativeParticles>(uri, 1, 0, "Particles");
+    qmlRegisterType<QDeclarativeParticleMotion>(uri,1,0,"ParticleMotion");
+    qmlRegisterType<QDeclarativeParticleMotionGravity>(uri,1,0,"ParticleMotionGravity");
+    qmlRegisterType<QDeclarativeParticleMotionLinear>(uri,1,0,"ParticleMotionLinear");
+    qmlRegisterType<QDeclarativeParticleMotionWander>(uri,1,0,"ParticleMotionWander");
+    qmlRegisterType<SpriteState>(uri, 2, 0, "Sprite");
+    qmlRegisterType<SpriteEngine>(uri, 2, 0, "SpriteEngine");
+    qmlRegisterType<SpriteImage>(uri, 2, 0, "SpriteImage");
+
+    qmlRegisterType<ParticleSystem>(uri, 2, 0, "ParticleSystem");
+
+    qmlRegisterType<ParticleType>(uri, 2, 0, "Particle");
+    qmlRegisterType<ColoredParticle>(uri, 2, 0, "ColoredParticle");
+    qmlRegisterType<SpriteParticle>(uri, 2, 0, "SpriteParticle");
+    qmlRegisterType<ModelParticle>(uri, 2, 0, "ModelParticle");
+    //qmlRegisterType<PairedParticle>(uri, 2, 0, "PairedParticle");
+    qmlRegisterType<DeformableParticle>(uri, 2, 0, "DeformableParticle");
+
+    qmlRegisterType<ParticleEmitter>(uri, 2, 0, "ParticleEmitter");
+    qmlRegisterType<TrailsEmitter>(uri, 2, 0, "TrailEmitter");
+
+    qmlRegisterType<FollowEmitter>(uri, 2, 0, "FollowEmitter");
+    qmlRegisterType<ParticleExtruder>(uri, 2, 0, "Box");
+    qmlRegisterType<EllipseExtruder>(uri, 2, 0, "Ellipse");
+    qmlRegisterType<LineExtruder>(uri, 2, 0, "Line");
+    qmlRegisterType<MaskExtruder>(uri, 2, 0, "Mask");
+
+    qmlRegisterType<VaryingVector>(uri, 2, 0, "NullVector");
+    qmlRegisterType<PointVector>(uri, 2, 0, "PointVector");
+    qmlRegisterType<AngledVector>(uri, 2, 0, "AngleVector");
+    qmlRegisterType<DirectedVector>(uri, 2, 0, "DirectedVector");
+
+    qmlRegisterType<ParticleAffector>(uri, 2, 0, "ParticleAffector");
+    qmlRegisterType<WanderAffector>(uri, 2, 0, "Wander");
+    //qmlRegisterType<ScalingAffector>(uri, 2, 0, "Scale");
+    //qmlRegisterType<RockingAffector>(uri, 2, 0, "Rocking");
+    qmlRegisterType<DriftAffector>(uri, 2, 0, "Drift");
+    qmlRegisterType<FrictionAffector>(uri, 2, 0, "Friction");
+    qmlRegisterType<GravitationalSingularityAffector>(uri, 2, 0, "GravitationalSingularity");
+    qmlRegisterType<AttractorAffector>(uri, 2, 0, "Attractor");
+    qmlRegisterType<MeanderAffector>(uri, 2, 0, "Meander");
+    qmlRegisterType<SpeedLimitAffector>(uri, 2, 0, "SpeedLimit");
+    qmlRegisterType<GravityAffector>(uri, 2, 0, "Gravity");
+    qmlRegisterType<EternalAffector>(uri, 2, 0, "Stasis");
+    qmlRegisterType<ResetAffector>(uri, 2, 0, "Reset");
+    //qmlRegisterType<ZoneAffector>(uri, 2, 0, "Zone");
+    //qmlRegisterType<ToggleAffector>(uri, 2, 0, "Toggle");
+    qmlRegisterType<KillAffector>(uri, 2, 0, "Kill");
+    qmlRegisterType<SpriteGoalAffector>(uri, 2, 0, "SpriteGoal");
+    qmlRegisterType<SwarmAffector>(uri, 2, 0 , "Swarm");
+    qmlRegisterType<TurbulenceAffector>(uri, 2, 0 , "Turbulence");
+    qmlRegisterType<PictureAffector>(uri, 2, 0, "Picture");
+}
+
+QT_END_NAMESPACE
+
+Q_EXPORT_PLUGIN2(Particles, QT_PREPEND_NAMESPACE(ParticlesPlugin))
diff --git a/src/imports/particles/maskextruder.cpp b/src/imports/particles/maskextruder.cpp
new file mode 100644
index 0000000000..16c64e0a70
--- /dev/null
+++ b/src/imports/particles/maskextruder.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "maskextruder.h"
+#include <QImage>
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+MaskExtruder::MaskExtruder(QObject *parent) :
+    ParticleExtruder(parent)
+  , m_lastWidth(-1)
+  , m_lastHeight(-1)
+{
+}
+
+QPointF MaskExtruder::extrude(const QRectF &r)
+{
+    ensureInitialized(r);
+    if(!m_mask.count())
+        return r.topLeft();
+    const QPointF p = m_mask[rand() % m_mask.count()];
+    //### Should random sub-pixel positioning be added?
+    return p + r.topLeft();
+}
+
+bool MaskExtruder::contains(const QRectF &bounds, const QPointF &point)
+{
+    ensureInitialized(bounds);//###Current usage patterns WILL lead to different bounds/r calls. Separate list?
+    return m_mask.contains(QPointF(point.toPoint() - bounds.topLeft().toPoint()));
+}
+
+void MaskExtruder::ensureInitialized(const QRectF &r)
+{
+    if(m_lastWidth == r.width() && m_lastHeight == r.height())
+        return;
+    m_lastWidth = r.width();
+    m_lastHeight = r.height();
+
+    m_mask.clear();
+    if(m_source.isEmpty())
+        return;
+
+    QImage img(m_source.toLocalFile());
+    img = img.createAlphaMask();
+    img = img.convertToFormat(QImage::Format_Mono);//Else LSB, but I think that's easier
+    img = img.scaled(r.size().toSize());//TODO: Do they need aspect ratio stuff? Or tiling?
+    for(int i=0; i<r.width(); i++){
+        for(int j=0; j<r.height(); j++){
+            if(img.pixelIndex(i,j))//Direct bit manipulation is presumably more efficient
+                m_mask << QPointF(i,j);
+        }
+    }
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/maskextruder.h b/src/imports/particles/maskextruder.h
new file mode 100644
index 0000000000..ba63db75d4
--- /dev/null
+++ b/src/imports/particles/maskextruder.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MASKEXTRUDER_H
+#define MASKEXTRUDER_H
+#include "particleextruder.h"
+#include <QUrl>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class MaskExtruder : public ParticleExtruder
+{
+    Q_OBJECT
+    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+public:
+    explicit MaskExtruder(QObject *parent = 0);
+    virtual QPointF extrude(const QRectF &);
+    virtual bool contains(const QRectF &bounds, const QPointF &point);
+
+    QUrl source() const
+    {
+        return m_source;
+    }
+
+signals:
+
+    void sourceChanged(QUrl arg);
+
+public slots:
+
+    void setSource(QUrl arg)
+    {
+        if (m_source != arg) {
+            m_source = arg;
+            m_lastHeight = -1;//Trigger reset
+            m_lastWidth = -1;
+            emit sourceChanged(arg);
+        }
+    }
+private:
+    QUrl m_source;
+
+    void ensureInitialized(const QRectF &r);
+    int m_lastWidth;
+    int m_lastHeight;
+    QList<QPointF> m_mask;//TODO: More memory efficient datastructures
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // MASKEXTRUDER_H
diff --git a/src/imports/particles/meanderaffector.cpp b/src/imports/particles/meanderaffector.cpp
new file mode 100644
index 0000000000..8e03cd07fb
--- /dev/null
+++ b/src/imports/particles/meanderaffector.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "meanderaffector.h"
+
+QT_BEGIN_NAMESPACE
+
+MeanderAffector::MeanderAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+}
+
+bool MeanderAffector::affectParticle(ParticleData *data, qreal dt)
+{
+    if(!m_xDrift && !m_yDrift)
+        return false;
+    qreal dx = (((qreal)qrand() / (qreal)RAND_MAX) - 0.5) * 2 * m_xDrift * dt;
+    qreal dy = (((qreal)qrand() / (qreal)RAND_MAX) - 0.5) * 2 * m_yDrift * dt;
+    if(dx)
+        data->setInstantaneousAX(data->pv.ax + dx);
+    if(dy)
+        data->setInstantaneousAY(data->pv.ay + dy);
+
+    return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/meanderaffector.h b/src/imports/particles/meanderaffector.h
new file mode 100644
index 0000000000..203d20430d
--- /dev/null
+++ b/src/imports/particles/meanderaffector.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MEANDERAFFECTOR_H
+#define MEANDERAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class MeanderAffector : public ParticleAffector
+{
+    Q_OBJECT
+    //Like drift, but affects da/dt instead of ds/dt
+    Q_PROPERTY(qreal xDrift READ xDrift WRITE setXDrift NOTIFY xDriftChanged)
+    Q_PROPERTY(qreal yDrift READ yDrift WRITE setYDrift NOTIFY yDriftChanged)
+public:
+    explicit MeanderAffector(QSGItem *parent = 0);
+
+    qreal xDrift() const
+    {
+        return m_xDrift;
+    }
+
+    qreal yDrift() const
+    {
+        return m_yDrift;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void xDriftChanged(qreal arg);
+
+    void yDriftChanged(qreal arg);
+
+public slots:
+
+    void setXDrift(qreal arg)
+    {
+        if (m_xDrift != arg) {
+            m_xDrift = arg;
+            emit xDriftChanged(arg);
+        }
+    }
+    void setYDrift(qreal arg)
+    {
+        if (m_yDrift != arg) {
+            m_yDrift = arg;
+            emit yDriftChanged(arg);
+        }
+    }
+
+private:
+    qreal m_xDrift;
+    qreal m_yDrift;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // MEANDERAFFECTOR_H
diff --git a/src/imports/particles/modelparticle.cpp b/src/imports/particles/modelparticle.cpp
new file mode 100644
index 0000000000..d1034a4c81
--- /dev/null
+++ b/src/imports/particles/modelparticle.cpp
@@ -0,0 +1,287 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "modelparticle.h"
+#include <QtDeclarative/private/qsgvisualitemmodel_p.h>
+#include <qsgnode.h>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+ModelParticle::ModelParticle(QSGItem *parent) :
+    ParticleType(parent), m_ownModel(false), m_comp(0), m_model(0), m_fade(true)
+{
+    setFlag(QSGItem::ItemHasContents);
+}
+
+QVariant ModelParticle::model() const
+{
+    return m_dataSource;
+}
+
+void ModelParticle::setModel(const QVariant &arg)
+{
+    if(arg == m_dataSource)
+        return;
+    m_dataSource = arg;
+    if(qobject_cast<QSGVisualDataModel*>(arg.value<QObject*>())) {
+        if(m_ownModel && m_model)
+            delete m_model;
+        m_model = qobject_cast<QSGVisualDataModel*>(arg.value<QObject*>());
+        m_ownModel = false;
+    }else{
+        if(!m_model || !m_ownModel)
+            m_model = new QSGVisualDataModel(qmlContext(this));
+        m_model->setModel(m_dataSource);
+        m_ownModel = true;
+    }
+    if(m_comp)
+        m_model->setDelegate(m_comp);
+    emit modelChanged();
+    emit modelCountChanged();
+    connect(m_model, SIGNAL(countChanged()),
+            this, SIGNAL(modelCountChanged()));
+    m_available.clear();
+    for(int i=0; i<m_model->count(); i++)
+        m_available << i;//TODO: Track changes
+}
+
+QDeclarativeComponent *ModelParticle::delegate() const
+{
+    if(m_model)
+        return m_model->delegate();
+    return 0;
+}
+
+void ModelParticle::setDelegate(QDeclarativeComponent *comp)
+{
+    if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(m_model))
+        if (comp == dataModel->delegate())
+            return;
+    m_comp = comp;
+    if(m_model)
+        m_model->setDelegate(comp);
+    emit delegateChanged();
+}
+
+int ModelParticle::modelCount() const
+{
+    if(m_model)
+        return m_model->count();
+    return 0;
+}
+
+
+void ModelParticle::freeze(QSGItem* item)
+{
+    m_stasis << item;
+}
+
+
+void ModelParticle::unfreeze(QSGItem* item)
+{
+    m_stasis.remove(item);
+}
+
+void ModelParticle::take(QSGItem *item, bool prioritize)
+{
+    if(prioritize)
+        m_pendingItems.push_front(item);
+    else
+        m_pendingItems.push_back(item);
+}
+
+void ModelParticle::give(QSGItem *item)
+{
+    //TODO: This
+}
+
+void ModelParticle::load(ParticleData* d)
+{
+    //if(!m_model || !m_model->count())//Not really a 'model' particle anymore
+    //    return;
+    int pos = particleTypeIndex(d);
+    if(m_items[pos]){
+        if(m_stasis.contains(m_items[pos]))
+            qWarning() << "Current model particles prefers overwrite:false";
+        //remove old item from the particle that is dying to make room for this one
+        m_items[pos]->setOpacity(0.);
+        if(m_idx[pos] >= 0){
+            m_available << m_idx[pos];
+            m_model->release(m_items[pos]);
+        }else{
+            ModelParticleAttached* mpa;
+            if((mpa = qobject_cast<ModelParticleAttached*>(qmlAttachedPropertiesObject<ModelParticle>(m_items[pos]))))
+                mpa->detach();//reparent as well?
+        }
+        m_idx[pos] = -1;
+        m_items[pos] = 0;
+        m_data[pos] = 0;
+        m_activeCount--;
+    }
+    if(m_available.isEmpty() && m_pendingItems.isEmpty())
+        return;
+    if(m_pendingItems.isEmpty()){
+        m_items[pos] = m_model->item(m_available.first());
+        m_idx[pos] = m_available.first();
+        m_available.pop_front();
+    }else{
+        m_items[pos] = m_pendingItems.front();
+        m_pendingItems.pop_front();
+        m_items[pos]->setX(d->curX() - m_items[pos]->width()/2);
+        m_items[pos]->setY(d->curY() - m_items[pos]->height()/2);
+        ModelParticleAttached* mpa;
+        if((mpa = qobject_cast<ModelParticleAttached*>(qmlAttachedPropertiesObject<ModelParticle>(m_items[pos]))))
+            mpa->attach();
+        m_idx[pos] = -2;
+    }
+    m_items[pos]->setParentItem(this);
+    m_data[pos] = d;
+    m_activeCount++;
+}
+
+void ModelParticle::reload(ParticleData* d)
+{
+    //No-op unless we start copying the data.
+}
+
+void ModelParticle::setCount(int c)
+{
+    ParticleType::setCount(c);//###Do we need our own?
+    m_particleCount = c;
+    reset();
+}
+
+int ModelParticle::count()
+{
+    return m_particleCount;
+}
+
+void ModelParticle::reset()
+{
+    ParticleType::reset();
+    //TODO: Cleanup items?
+    m_items.resize(m_particleCount);
+    m_data.resize(m_particleCount);
+    m_idx.resize(m_particleCount);
+    m_items.fill(0);
+    m_data.fill(0);
+    m_idx.fill(-1);
+    m_available.clear();
+    //m_pendingItems.clear();//TODO: Should this be done? If so, Emit signal?
+    if(m_model)
+        for(int i=0; i<m_model->count(); i++)
+            m_available << i;//TODO: Track changes, then have this in the right place
+}
+
+
+QSGNode* ModelParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d)
+{
+    //Dummy update just to get painting tick
+    if(m_pleaseReset){
+        m_pleaseReset = false;
+        reset();
+    }
+    prepareNextFrame();
+
+    update();//Get called again
+    if(n)
+        n->markDirty(QSGNode::DirtyMaterial);
+    return QSGItem::updatePaintNode(n,d);
+}
+
+void ModelParticle::prepareNextFrame()
+{
+    uint timeStamp = m_system->systemSync(this);
+    qreal curT = timeStamp/1000.0;
+    qreal dt = curT - m_lastT;
+    m_lastT = curT;
+    if(!m_activeCount)
+        return;
+
+    //TODO: Size, better fade?
+    for(int i=0; i<m_particleCount; i++){
+        QSGItem* item = m_items[i];
+        ParticleData* data = m_data[i];
+        if(!item || !data)
+            continue;
+        qreal t = ((timeStamp/1000.0) - data->pv.t) / data->pv.lifeSpan;
+        if(m_stasis.contains(item)) {
+            m_data[i]->pv.t += dt;//Stasis effect
+            continue;
+        }
+        if(t >= 1.0){//Usually happens from load
+            item->setOpacity(0.);
+            if(m_idx[i] >= 0){
+                m_available << m_idx[i];
+                m_model->release(m_items[i]);
+            }else{
+                ModelParticleAttached* mpa;
+                if((mpa = qobject_cast<ModelParticleAttached*>(qmlAttachedPropertiesObject<ModelParticle>(m_items[i]))))
+                    mpa->detach();//reparent as well?
+            }
+            m_idx[i] = -1;
+            m_items[i] = 0;
+            m_data[i] = 0;
+            m_activeCount--;
+        }else{//Fade
+            if(m_fade){
+                qreal o = 1.;
+                if(t<0.2)
+                    o = t*5;
+                if(t>0.8)
+                    o = (1-t)*5;
+                item->setOpacity(o);
+            }else{
+                item->setOpacity(1.);//###Without fade, it's just a binary toggle - if we turn it off we have to turn it back on
+            }
+        }
+        item->setX(data->curX() - item->width()/2);
+        item->setY(data->curY() - item->height()/2);
+    }
+}
+
+ModelParticleAttached *ModelParticle::qmlAttachedProperties(QObject *object)
+{
+    return new ModelParticleAttached(object);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/modelparticle.h b/src/imports/particles/modelparticle.h
new file mode 100644
index 0000000000..4aabd08435
--- /dev/null
+++ b/src/imports/particles/modelparticle.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MODELPARTICLE_H
+#define MODELPARTICLE_H
+#include "particle.h"
+#include <QPointer>
+#include <QSet>
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+class QSGVisualDataModel;
+class ModelParticleAttached;
+
+class ModelParticle : public ParticleType
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
+    Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
+    Q_PROPERTY(int modelCount READ modelCount NOTIFY modelCountChanged)
+    Q_PROPERTY(bool fade READ fade WRITE setFade NOTIFY fadeChanged)
+    Q_CLASSINFO("DefaultProperty", "delegate")
+public:
+    explicit ModelParticle(QSGItem *parent = 0);
+    QVariant model() const;
+    void setModel(const QVariant &);
+
+    QDeclarativeComponent *delegate() const;
+    void setDelegate(QDeclarativeComponent *);
+
+    int modelCount() const;
+
+    bool fade() const { return m_fade; }
+
+    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    virtual void load(ParticleData*);
+    virtual void reload(ParticleData*);
+    virtual void setCount(int c);
+    virtual int count();
+
+    static ModelParticleAttached *qmlAttachedProperties(QObject *object);
+signals:
+    void modelChanged();
+    void delegateChanged();
+    void modelCountChanged();
+    void fadeChanged();
+
+public slots:
+    void freeze(QSGItem* item);
+    void unfreeze(QSGItem* item);
+    void take(QSGItem* item,bool prioritize=false);//take by modelparticle
+    void give(QSGItem* item);//give from modelparticle
+
+    void setFade(bool arg){if(arg == m_fade) return; m_fade = arg; emit fadeChanged();}
+protected:
+    virtual void reset();
+    void prepareNextFrame();
+private:
+    bool m_ownModel;
+    QDeclarativeComponent* m_comp;
+    QSGVisualDataModel *m_model;
+    QVariant m_dataSource;
+    QList<QPointer<QSGItem> > m_deletables;
+    int m_particleCount;
+    bool m_fade;
+
+    QList<QSGItem*> m_pendingItems;
+    QVector<QSGItem*> m_items;
+    QVector<ParticleData*> m_data;
+    QVector<int> m_idx;
+    QList<int> m_available;
+    QSet<QSGItem*> m_stasis;
+    qreal m_lastT;
+    int m_activeCount;
+};
+
+class ModelParticleAttached : public QObject
+{
+    Q_OBJECT
+public:
+    ModelParticleAttached(QObject* parent){;}
+    void detach(){emit detached();}
+    void attach(){emit attached();}
+private:
+Q_SIGNALS:
+    void detached();
+    void attached();
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPEINFO(ModelParticle, QML_HAS_ATTACHED_PROPERTIES)
+
+QT_END_HEADER
+#endif // MODELPARTICLE_H
diff --git a/src/imports/particles/particle.cpp b/src/imports/particles/particle.cpp
new file mode 100644
index 0000000000..8f4ecbf733
--- /dev/null
+++ b/src/imports/particles/particle.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "particle.h"
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+ParticleType::ParticleType(QSGItem *parent) :
+    QSGItem(parent),
+    m_system(0)
+{
+    connect(this, SIGNAL(xChanged()),
+            this, SLOT(calcSystemOffset()));
+    connect(this, SIGNAL(yChanged()),
+            this, SLOT(calcSystemOffset()));
+}
+
+void ParticleType::componentComplete()
+{
+    if(!m_system)
+        qWarning() << "Particle created without a particle system specified";//TODO: useful QML warnings, like line number?
+    QSGItem::componentComplete();
+}
+
+
+void ParticleType::setSystem(ParticleSystem *arg)
+{
+    if (m_system != arg) {
+        m_system = arg;
+        if(m_system){
+            m_system->registerParticleType(this);
+            connect(m_system, SIGNAL(xChanged()),
+                    this, SLOT(calcSystemOffset()));
+            connect(m_system, SIGNAL(yChanged()),
+                    this, SLOT(calcSystemOffset()));
+            calcSystemOffset();
+        }
+        emit systemChanged(arg);
+    }
+}
+
+void ParticleType::load(ParticleData*)
+{
+}
+
+void ParticleType::reload(ParticleData*)
+{
+}
+
+void ParticleType::reset()
+{
+    //Have to every time because what it's emitting may have changed and that affects particleTypeIndex
+    m_particleStarts.clear();
+    m_lastStart = 0;
+}
+
+void ParticleType::setCount(int c)
+{
+    if(c == m_count)
+        return;
+    m_count = c;
+    emit countChanged();
+}
+
+int ParticleType::count()
+{
+    return m_count;
+}
+
+
+int ParticleType::particleTypeIndex(ParticleData* d)
+{
+    if(!m_particleStarts.contains(d->group)){
+        m_particleStarts.insert(d->group, m_lastStart);
+        m_lastStart += m_system->m_groupData[d->group]->size;
+    }
+    int ret = m_particleStarts[d->group] + d->particleIndex;
+    Q_ASSERT(ret >=0 && ret < m_count);//XXX: Possibly shouldn't assert, but bugs here were hard to find in the past
+    return ret;
+}
+
+
+void ParticleType::calcSystemOffset()
+{
+    if(!m_system)
+        return;
+    QPointF lastOffset = m_systemOffset;
+    m_systemOffset = this->mapFromItem(m_system, QPointF());
+    if(lastOffset != m_systemOffset){
+        //Reload all particles
+        foreach(const QString &g, m_particles){
+            int gId = m_system->m_groupIds[g];
+            for(int i=0; i<m_system->m_groupData[gId]->size; i++)
+                reload(m_system->m_data[m_system->m_groupData[gId]->start + i]);
+        }
+    }
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/particle.h b/src/imports/particles/particle.h
new file mode 100644
index 0000000000..324a7e5d7c
--- /dev/null
+++ b/src/imports/particles/particle.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PARTICLE_H
+#define PARTICLE_H
+
+#include <QObject>
+#include <QDebug>
+#include "particlesystem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleType : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(ParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged)
+    Q_PROPERTY(QStringList particles READ particles WRITE setParticles NOTIFY particlesChanged)
+
+public:
+    explicit ParticleType(QSGItem *parent = 0);
+    virtual void load(ParticleData*);
+    virtual void reload(ParticleData*);
+    virtual void setCount(int c);
+    virtual int count();
+    ParticleSystem* system() const
+    {
+        return m_system;
+    }
+
+
+    QStringList particles() const
+    {
+        return m_particles;
+    }
+
+    int particleTypeIndex(ParticleData*);
+    virtual void componentComplete();
+signals:
+    void countChanged();
+    void systemChanged(ParticleSystem* arg);
+
+    void particlesChanged(QStringList arg);
+
+public slots:
+void setSystem(ParticleSystem* arg);
+
+void setParticles(QStringList arg)
+{
+    if (m_particles != arg) {
+        m_particles = arg;
+        emit particlesChanged(arg);
+    }
+}
+private slots:
+    void calcSystemOffset();
+protected:
+    virtual void reset();
+
+//    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *){
+//        qDebug() << "Shouldn't be here..." << this;
+//        return 0;
+//    }
+
+    ParticleSystem* m_system;
+    friend class ParticleSystem;
+    int m_count;
+    bool m_pleaseReset;
+    QStringList m_particles;
+    QHash<int,int> m_particleStarts;
+    int m_lastStart;
+    QPointF m_systemOffset;
+private:
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // PARTICLE_H
diff --git a/src/imports/particles/particleaffector.cpp b/src/imports/particles/particleaffector.cpp
new file mode 100644
index 0000000000..0d7bab577d
--- /dev/null
+++ b/src/imports/particles/particleaffector.cpp
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "particleaffector.h"
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+ParticleAffector::ParticleAffector(QSGItem *parent) :
+    QSGItem(parent), m_needsReset(false), m_system(0), m_active(true), m_updateIntSet(false)
+{
+    connect(this, SIGNAL(systemChanged(ParticleSystem*)),
+            this, SLOT(updateOffsets()));
+    connect(this, SIGNAL(xChanged()),
+            this, SLOT(updateOffsets()));
+    connect(this, SIGNAL(yChanged()),
+            this, SLOT(updateOffsets()));//TODO: in componentComplete and all relevant signals
+}
+
+void ParticleAffector::componentComplete()
+{
+    if(!m_system)
+        qWarning() << "Affector created without a particle system specified";//TODO: useful QML warnings, like line number?
+    QSGItem::componentComplete();
+}
+
+void ParticleAffector::affectSystem(qreal dt)
+{
+    if(!m_active)
+        return;
+    if(!m_system){
+        qDebug() << "No system" << this;
+        return;
+    }
+    //If not reimplemented, calls affect particle per particle
+    //But only on particles in targeted system/area
+    if(m_updateIntSet){
+        m_groups.clear();
+        foreach(const QString &p, m_particles)
+            m_groups << m_system->m_groupIds[p];//###Can this occur before group ids are properly assigned?
+        m_updateIntSet = false;
+    }
+    //foreach(ParticleData* d, m_system->m_data){
+    for(int i=0; i<m_system->m_particle_count; i++){
+        ParticleData* d = m_system->m_data[i];
+        if(!d || (m_onceOff && m_onceOffed.contains(d->systemIndex)))
+            continue;
+        if(m_groups.isEmpty() || m_groups.contains(d->group)){
+            if(width() == 0 || height() == 0 || QRectF(m_offset.x(), m_offset.y(), width(), height()).contains(d->curX(), d->curY())){
+                if(affectParticle(d, dt)){
+                    m_system->m_needsReset << d;
+                    if(m_onceOff)
+                        m_onceOffed << d->systemIndex;
+                }
+            }
+        }
+    }
+}
+
+bool ParticleAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    Q_UNUSED(d);
+    Q_UNUSED(dt);
+    return false;
+}
+
+void ParticleAffector::reset(int idx)
+{//TODO: This, among other ones, should be restructured so they don't all need to remember to call the superclass
+    if(m_onceOff)
+        m_onceOffed.remove(idx);
+}
+
+void ParticleAffector::updateOffsets()
+{
+    if(m_system)
+        m_offset = m_system->mapFromItem(this, QPointF(0, 0));
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/particleaffector.h b/src/imports/particles/particleaffector.h
new file mode 100644
index 0000000000..1acb405f3e
--- /dev/null
+++ b/src/imports/particles/particleaffector.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PARTICLEAFFECTOR_H
+#define PARTICLEAFFECTOR_H
+
+#include <QObject>
+#include "particlesystem.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleAffector : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(ParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged)
+    Q_PROPERTY(QStringList particles READ particles WRITE setParticles NOTIFY particlesChanged)
+    Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
+    Q_PROPERTY(bool onceOff READ onceOff WRITE setOnceOff NOTIFY onceOffChanged)
+
+public:
+    explicit ParticleAffector(QSGItem *parent = 0);
+    virtual void affectSystem(qreal dt);
+    virtual void reset(int systemIdx);//As some store their own data per idx?
+    ParticleSystem* system() const
+    {
+        return m_system;
+    }
+
+    QStringList particles() const
+    {
+        return m_particles;
+    }
+
+    bool active() const
+    {
+        return m_active;
+    }
+
+    bool onceOff() const
+    {
+        return m_onceOff;
+    }
+
+signals:
+
+    void systemChanged(ParticleSystem* arg);
+
+    void particlesChanged(QStringList arg);
+
+    void activeChanged(bool arg);
+
+    void onceOffChanged(bool arg);
+
+public slots:
+void setSystem(ParticleSystem* arg)
+{
+    if (m_system != arg) {
+        m_system = arg;
+        m_system->registerParticleAffector(this);
+        emit systemChanged(arg);
+    }
+}
+
+void setParticles(QStringList arg)
+{
+    if (m_particles != arg) {
+        m_particles = arg;
+        m_updateIntSet = true;
+        emit particlesChanged(arg);
+    }
+}
+
+void setActive(bool arg)
+{
+    if (m_active != arg) {
+        m_active = arg;
+        emit activeChanged(arg);
+    }
+}
+
+void setOnceOff(bool arg)
+{
+    if (m_onceOff != arg) {
+        m_onceOff = arg;
+        emit onceOffChanged(arg);
+    }
+}
+
+protected:
+    friend class ParticleSystem;
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+    bool m_needsReset;//### What is this really saving?
+    ParticleSystem* m_system;
+    QStringList m_particles;
+    bool activeGroup(int g) {return m_groups.isEmpty() || m_groups.contains(g);}
+    bool m_active;
+    virtual void componentComplete();
+    QPointF m_offset;
+private:
+    QSet<int> m_groups;
+    QSet<int> m_onceOffed;
+    bool m_updateIntSet;
+
+    bool m_onceOff;
+
+private slots:
+    void updateOffsets();
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // PARTICLEAFFECTOR_H
diff --git a/src/imports/particles/particleemitter.cpp b/src/imports/particles/particleemitter.cpp
new file mode 100644
index 0000000000..f490ed643e
--- /dev/null
+++ b/src/imports/particles/particleemitter.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "particleemitter.h"
+QT_BEGIN_NAMESPACE
+ParticleEmitter::ParticleEmitter(QSGItem *parent) :
+    QSGItem(parent)
+  , m_particlesPerSecond(10)
+  , m_particleDuration(1000)
+  , m_particleDurationVariation(0)
+  , m_emitting(true)
+  , m_system(0)
+  , m_extruder(0)
+  , m_defaultExtruder(0)
+  , m_speed(&m_nullVector)
+  , m_acceleration(&m_nullVector)
+  , m_particleSize(16)
+  , m_particleEndSize(-1)
+  , m_particleSizeVariation(0)
+  , m_maxParticleCount(-1)
+  , m_burstLeft(0)
+  , m_emitLeft(0)
+
+{
+    //TODO: Reset speed/acc back to null vector? Or allow null pointer?
+    connect(this, SIGNAL(maxParticleCountChanged(int)),
+            this, SIGNAL(particleCountChanged()));
+    connect(this, SIGNAL(particlesPerSecondChanged(qreal)),
+            this, SIGNAL(particleCountChanged()));
+    connect(this, SIGNAL(particleDurationChanged(int)),
+            this, SIGNAL(particleCountChanged()));
+}
+
+ParticleEmitter::~ParticleEmitter()
+{
+    if(m_defaultExtruder)
+        delete m_defaultExtruder;
+}
+
+void ParticleEmitter::componentComplete()
+{
+    if(!m_system)
+        qWarning() << "Emitter created without a particle system specified";//TODO: useful QML warnings, like line number?
+    QSGItem::componentComplete();
+}
+void ParticleEmitter::emitWindow(int timeStamp)
+{
+    Q_UNUSED(timeStamp);
+}
+
+
+void ParticleEmitter::setEmitting(bool arg)
+{
+    if (m_emitting != arg) {
+        m_emitting = arg;
+        emit emittingChanged(arg);
+    }
+}
+
+
+ParticleExtruder* ParticleEmitter::effectiveExtruder()
+{
+    if(m_extruder)
+        return m_extruder;
+    if(!m_defaultExtruder)
+        m_defaultExtruder = new ParticleExtruder;
+    return m_defaultExtruder;
+}
+
+void ParticleEmitter::pulse(qreal seconds)
+{
+    if(!particleCount())
+        qWarning() << "pulse called on an emitter with a particle count of zero";
+    if(!m_emitting)
+        m_burstLeft = seconds*1000.0;//TODO: Change name to match
+}
+
+void ParticleEmitter::burst(int num)
+{
+    if(!particleCount())
+        qWarning() << "burst called on an emitter with a particle count of zero";
+    m_emitLeft += num;
+}
+
+void ParticleEmitter::setMaxParticleCount(int arg)
+{
+    if (m_maxParticleCount != arg) {
+        if(arg < 0 && m_maxParticleCount >= 0){
+            connect(this, SIGNAL(particlesPerSecondChanged(qreal)),
+                    this, SIGNAL(particleCountChanged()));
+            connect(this, SIGNAL(particleDurationChanged(int)),
+                    this, SIGNAL(particleCountChanged()));
+        }else if(arg >= 0 && m_maxParticleCount < 0){
+            disconnect(this, SIGNAL(particlesPerSecondChanged(qreal)),
+                    this, SIGNAL(particleCountChanged()));
+            disconnect(this, SIGNAL(particleDurationChanged(int)),
+                    this, SIGNAL(particleCountChanged()));
+        }
+        m_maxParticleCount = arg;
+        emit maxParticleCountChanged(arg);
+    }
+}
+
+int ParticleEmitter::particleCount() const
+{
+    if(m_maxParticleCount >= 0)
+        return m_maxParticleCount;
+    return m_particlesPerSecond*((m_particleDuration+m_particleDurationVariation)/1000.0);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/particleemitter.h b/src/imports/particles/particleemitter.h
new file mode 100644
index 0000000000..61994e52fa
--- /dev/null
+++ b/src/imports/particles/particleemitter.h
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PARTICLEEMITTER_H
+#define PARTICLEEMITTER_H
+
+#include <QSGItem>
+#include <QDebug>
+#include "particlesystem.h"
+#include "particleextruder.h"
+#include "varyingvector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ParticleEmitter : public QSGItem
+{
+    Q_OBJECT
+    //###currently goes in emitters OR sets system. Pick one?
+    Q_PROPERTY(ParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged)
+    Q_PROPERTY(QString particle READ particle WRITE setParticle NOTIFY particleChanged)
+    Q_PROPERTY(ParticleExtruder* shape READ extruder WRITE setExtruder NOTIFY extruderChanged)
+    Q_PROPERTY(bool emitting READ emitting WRITE setEmitting NOTIFY emittingChanged)
+
+    Q_PROPERTY(qreal particlesPerSecond READ particlesPerSecond WRITE setParticlesPerSecond NOTIFY particlesPerSecondChanged)
+    Q_PROPERTY(int particleDuration READ particleDuration WRITE setParticleDuration NOTIFY particleDurationChanged)
+    Q_PROPERTY(int particleDurationVariation READ particleDurationVariation WRITE setParticleDurationVariation NOTIFY particleDurationVariationChanged)
+    Q_PROPERTY(int maxParticles READ maxParticleCount WRITE setMaxParticleCount NOTIFY maxParticleCountChanged)
+
+    Q_PROPERTY(qreal particleSize READ particleSize WRITE setParticleSize NOTIFY particleSizeChanged)
+    Q_PROPERTY(qreal particleEndSize READ particleEndSize WRITE setParticleEndSize NOTIFY particleEndSizeChanged)
+    Q_PROPERTY(qreal particleSizeVariation READ particleSizeVariation WRITE setParticleSizeVariation NOTIFY particleSizeVariationChanged)
+
+    Q_PROPERTY(VaryingVector *speed READ speed WRITE setSpeed NOTIFY speedChanged)
+    Q_PROPERTY(VaryingVector *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged)
+public:
+    explicit ParticleEmitter(QSGItem *parent = 0);
+    virtual ~ParticleEmitter();
+    virtual void emitWindow(int timeStamp);
+
+    bool emitting() const
+    {
+        return m_emitting;
+    }
+
+    qreal particlesPerSecond() const
+    {
+        return m_particlesPerSecond;
+    }
+
+    int particleDuration() const
+    {
+        return m_particleDuration;
+    }
+
+    ParticleSystem* system() const
+    {
+        return m_system;
+    }
+
+    QString particle() const
+    {
+        return m_particle;
+    }
+
+    int particleDurationVariation() const
+    {
+        return m_particleDurationVariation;
+    }
+
+    virtual void componentComplete();
+signals:
+    void particlesPerSecondChanged(qreal);
+    void particleDurationChanged(int);
+    void emittingChanged(bool);
+
+    void systemChanged(ParticleSystem* arg);
+
+    void particleChanged(QString arg);
+
+    void particleDurationVariationChanged(int arg);
+
+    void extruderChanged(ParticleExtruder* arg);
+
+    void particleSizeChanged(qreal arg);
+
+    void particleEndSizeChanged(qreal arg);
+
+    void particleSizeVariationChanged(qreal arg);
+
+    void speedChanged(VaryingVector * arg);
+
+    void accelerationChanged(VaryingVector * arg);
+
+    void maxParticleCountChanged(int arg);
+    void particleCountChanged();
+
+public slots:
+    void pulse(qreal seconds);
+    void burst(int num);
+
+    void setEmitting(bool arg);
+
+    void setParticlesPerSecond(qreal arg)
+    {
+        if (m_particlesPerSecond != arg) {
+            m_particlesPerSecond = arg;
+            emit particlesPerSecondChanged(arg);
+        }
+    }
+
+    void setParticleDuration(int arg)
+    {
+        if (m_particleDuration != arg) {
+            m_particleDuration = arg;
+            emit particleDurationChanged(arg);
+        }
+    }
+
+       void setSystem(ParticleSystem* arg)
+    {
+        if (m_system != arg) {
+            m_system = arg;
+            m_system->registerParticleEmitter(this);
+            emit systemChanged(arg);
+        }
+       }
+
+       void setParticle(QString arg)
+       {
+           if (m_particle != arg) {
+               m_particle = arg;
+               emit particleChanged(arg);
+           }
+       }
+
+       void setParticleDurationVariation(int arg)
+       {
+           if (m_particleDurationVariation != arg) {
+               m_particleDurationVariation = arg;
+               emit particleDurationVariationChanged(arg);
+           }
+       }
+       void setExtruder(ParticleExtruder* arg)
+       {
+           if (m_extruder != arg) {
+               m_extruder = arg;
+               emit extruderChanged(arg);
+           }
+       }
+
+       void setParticleSize(qreal arg)
+       {
+           if (m_particleSize != arg) {
+               m_particleSize = arg;
+               emit particleSizeChanged(arg);
+           }
+       }
+
+       void setParticleEndSize(qreal arg)
+       {
+           if (m_particleEndSize != arg) {
+               m_particleEndSize = arg;
+               emit particleEndSizeChanged(arg);
+           }
+       }
+
+       void setParticleSizeVariation(qreal arg)
+       {
+           if (m_particleSizeVariation != arg) {
+               m_particleSizeVariation = arg;
+               emit particleSizeVariationChanged(arg);
+           }
+       }
+
+       void setSpeed(VaryingVector * arg)
+       {
+           if (m_speed != arg) {
+               m_speed = arg;
+               emit speedChanged(arg);
+           }
+       }
+
+       void setAcceleration(VaryingVector * arg)
+       {
+           if (m_acceleration != arg) {
+               m_acceleration = arg;
+               emit accelerationChanged(arg);
+           }
+       }
+
+       void setMaxParticleCount(int arg);
+
+public:
+       int particleCount() const;
+
+       virtual void reset(){;}
+       ParticleExtruder* extruder() const
+       {
+           return m_extruder;
+       }
+
+       qreal particleSize() const
+       {
+           return m_particleSize;
+       }
+
+       qreal particleEndSize() const
+       {
+           return m_particleEndSize;
+       }
+
+       qreal particleSizeVariation() const
+       {
+           return m_particleSizeVariation;
+       }
+
+       VaryingVector * speed() const
+       {
+           return m_speed;
+       }
+
+       VaryingVector * acceleration() const
+       {
+           return m_acceleration;
+       }
+
+       int maxParticleCount() const
+       {
+           return m_maxParticleCount;
+       }
+
+protected:
+       qreal m_particlesPerSecond;
+       int m_particleDuration;
+       int m_particleDurationVariation;
+       bool m_emitting;
+       ParticleSystem* m_system;
+       QString m_particle;
+       ParticleExtruder* m_extruder;
+       ParticleExtruder* m_defaultExtruder;
+       ParticleExtruder* effectiveExtruder();
+       VaryingVector * m_speed;
+       VaryingVector * m_acceleration;
+       qreal m_particleSize;
+       qreal m_particleEndSize;
+       qreal m_particleSizeVariation;
+
+       int m_burstLeft;
+       int m_emitLeft;
+       int m_maxParticleCount;
+private:
+       VaryingVector m_nullVector;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // PARTICLEEMITTER_H
diff --git a/src/imports/particles/particleextruder.cpp b/src/imports/particles/particleextruder.cpp
new file mode 100644
index 0000000000..3ff5abf996
--- /dev/null
+++ b/src/imports/particles/particleextruder.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "particleextruder.h"
+
+QT_BEGIN_NAMESPACE
+
+ParticleExtruder::ParticleExtruder(QObject *parent) :
+    QObject(parent), m_fill(true)
+{
+}
+
+QPointF ParticleExtruder::extrude(const QRectF &rect)
+{
+    if(m_fill)
+        return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(),
+                       ((qreal)rand() / RAND_MAX) * rect.height() + rect.y());
+    int side = rand() % 4;
+    switch(side){//TODO: Doesn't this overlap the corners?
+    case 0:
+        return QPointF(rect.x(),
+                       ((qreal)rand() / RAND_MAX) * rect.height() + rect.y());
+    case 1:
+        return QPointF(rect.width() + rect.x(),
+                       ((qreal)rand() / RAND_MAX) * rect.height() + rect.y());
+    case 2:
+        return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(),
+                       rect.y());
+    default:
+        return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(),
+                       rect.height() + rect.y());
+    }
+}
+
+bool ParticleExtruder::contains(const QRectF &bounds, const QPointF &point)
+{
+    return bounds.contains(point);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/particleextruder.h b/src/imports/particles/particleextruder.h
new file mode 100644
index 0000000000..2c417d3f92
--- /dev/null
+++ b/src/imports/particles/particleextruder.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PARTICLEEXTRUDER_H
+#define PARTICLEEXTRUDER_H
+
+#include <QObject>
+#include <QRectF>
+#include <QPointF>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ParticleExtruder : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(bool fill READ fill WRITE setFill NOTIFY fillChanged)//###Should this be base class, or a BoxExtruder?
+
+public:
+    explicit ParticleExtruder(QObject *parent = 0);
+    virtual QPointF extrude(const QRectF &);
+    virtual bool contains(const QRectF &bounds, const QPointF &point);//###Needed for follow emitter, but does it belong? Only marginally conceptually valid, and that's from user's perspective
+    bool fill() const
+    {
+        return m_fill;
+    }
+
+signals:
+
+    void fillChanged(bool arg);
+
+public slots:
+
+    void setFill(bool arg)
+    {
+        if (m_fill != arg) {
+            m_fill = arg;
+            emit fillChanged(arg);
+        }
+    }
+protected:
+    bool m_fill;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // PARTICLEEXTRUDER_H
diff --git a/src/imports/particles/particles.pro b/src/imports/particles/particles.pro
index 90b50e4659..4627956d8c 100644
--- a/src/imports/particles/particles.pro
+++ b/src/imports/particles/particles.pro
@@ -2,14 +2,106 @@ TARGET  = qmlparticlesplugin
 TARGETPATH = Qt/labs/particles
 include(../qimportbase.pri)
 
-QT += declarative
+HEADERS += \
+    V1/qdeclarativeparticles_p.h \
+    spritestate.h \
+    pluginmain.h \
+    particleaffector.h \
+    wanderaffector.h \
+    #rockingaffector.h \
+    #scalingaffector.h \
+    driftaffector.h \
+    particleemitter.h \
+    particlesystem.h \
+    trailsemitter.h \
+    #spriteemitter.h \
+    particle.h \
+    coloredparticle.h \
+    spriteparticle.h \
+    spritegoalaffector.h \
+    #zoneaffector.h \
+    frictionaffector.h \
+    gravitationalsingularityaffector.h \
+    killaffector.h \
+    speedlimitaffector.h \
+    spriteengine.h \
+    gravityaffector.h \
+    attractoraffector.h \
+    meanderaffector.h \
+    #toggleaffector.h \
+    spriteimage.h \
+    #pairedparticle.h \
+    followemitter.h \
+    swarmaffector.h \
+    turbulenceaffector.h \
+    particleextruder.h \
+    ellipseextruder.h \
+    maskextruder.h \
+    varyingvector.h \
+    pointvector.h \
+    angledvector.h \
+    directedvector.h \
+    modelparticle.h \
+    eternalaffector.h \
+    lineextruder.h \
+    resetaffector.h \
+    deformableparticle.h \
+    pictureaffector.h
 
 SOURCES += \
-    qdeclarativeparticles.cpp \
-    particles.cpp
+    V1/qdeclarativeparticles.cpp \
+    spritestate.cpp \
+    main.cpp \
+    particleaffector.cpp \
+    wanderaffector.cpp \
+    #rockingaffector.cpp \
+    #scalingaffector.cpp \
+    driftaffector.cpp \
+    particleemitter.cpp \
+    particlesystem.cpp \
+    trailsemitter.cpp \
+    #spriteemitter.cpp \
+    particle.cpp \
+    coloredparticle.cpp \
+    spriteparticle.cpp \
+    spritegoalaffector.cpp \
+    #zoneaffector.cpp \
+    frictionaffector.cpp \
+    gravitationalsingularityaffector.cpp \
+    killaffector.cpp \
+    speedlimitaffector.cpp \
+    spriteengine.cpp \
+    gravityaffector.cpp \
+    attractoraffector.cpp \
+    meanderaffector.cpp \
+    #toggleaffector.cpp \
+    spriteimage.cpp \
+    #pairedparticle.cpp \
+    followemitter.cpp \
+    swarmaffector.cpp \
+    turbulenceaffector.cpp \
+    particleextruder.cpp \
+    ellipseextruder.cpp \
+    maskextruder.cpp \
+    varyingvector.cpp \
+    pointvector.cpp \
+    angledvector.cpp \
+    directedvector.cpp \
+    modelparticle.cpp \
+    eternalaffector.cpp \
+    lineextruder.cpp \
+    resetaffector.cpp \
+    deformableparticle.cpp \
+    pictureaffector.cpp
 
-HEADERS += \
-    qdeclarativeparticles_p.h
+QT += declarative opengl
+
+
+OTHER_FILES += \
+    qmldir
+
+RESOURCES += \
+    spriteparticles.qrc
 
 QTDIR_build:DESTDIR = $$QT_BUILD_TREE/imports/$$TARGETPATH
 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
diff --git a/src/imports/particles/particlesystem.cpp b/src/imports/particles/particlesystem.cpp
new file mode 100644
index 0000000000..1cb7d110ee
--- /dev/null
+++ b/src/imports/particles/particlesystem.cpp
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "particlesystem.h"
+#include <qsgnode.h>
+#include "particleemitter.h"
+#include "particleaffector.h"
+#include "particle.h"
+#include <cmath>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+ParticleData::ParticleData()
+    : group(0)
+    , e(0)
+    , particleIndex(0)
+    , systemIndex(0)
+{
+    pv.x = 0;
+    pv.y = 0;
+    pv.t = -1;
+    pv.size = 0;
+    pv.endSize = 0;
+    pv.sx = 0;
+    pv.sy = 0;
+    pv.ax = 0;
+    pv.ay = 0;
+}
+
+ParticleSystem::ParticleSystem(QSGItem *parent) :
+    QSGItem(parent), m_particle_count(0), m_running(true) , m_startTime(0), m_overwrite(true)
+{
+    m_groupIds = QHash<QString, int>();
+}
+
+void ParticleSystem::registerParticleType(ParticleType* p)
+{
+    m_particles << QPointer<ParticleType>(p);//###Set or uniqueness checking?
+    reset();
+}
+
+void ParticleSystem::registerParticleEmitter(ParticleEmitter* e)
+{
+    m_emitters << QPointer<ParticleEmitter>(e);//###How to get them out?
+    connect(e, SIGNAL(particleCountChanged()),
+            this, SLOT(countChanged()));
+    connect(e, SIGNAL(particleChanged(QString)),
+            this, SLOT(countChanged()));
+    reset();
+}
+
+void ParticleSystem::registerParticleAffector(ParticleAffector* a)
+{
+    m_affectors << QPointer<ParticleAffector>(a);
+    //reset();//TODO: Slim down the huge batch of resets at the start
+}
+
+void ParticleSystem::countChanged()
+{
+    reset();//Need to give Particles new Count
+}
+
+void ParticleSystem::setRunning(bool arg)
+{
+    if (m_running != arg) {
+        m_running = arg;
+        emit runningChanged(arg);
+        reset();
+    }
+}
+
+void ParticleSystem::componentComplete()
+{
+    QSGItem::componentComplete();
+    reset();
+}
+
+void ParticleSystem::initializeSystem()
+{
+    int oldCount = m_particle_count;
+    m_particle_count = 0;//TODO: Only when changed?
+
+    //### Reset the data too?
+    for(int i=0; i<oldCount; i++){
+        if(m_data[i]){
+            delete m_data[i];
+            m_data[i] = 0;
+        }
+    }
+
+    for(QHash<int, GroupData*>::iterator iter = m_groupData.begin(); iter != m_groupData.end(); iter++)
+        delete (*iter);
+    m_groupData.clear();
+    m_groupIds.clear();
+
+    GroupData* gd = new GroupData;//Default group
+    gd->size = 0;
+    gd->start = -1;
+    gd->nextIdx = 0;
+    m_groupData.insert(0,gd);
+    m_groupIds.insert("",0);
+    m_nextGroupId = 1;
+
+    if(!m_emitters.count() || !m_particles.count())
+        return;
+
+    foreach(ParticleEmitter* e, m_emitters){
+        if(!m_groupIds.contains(e->particle())
+                || (!e->particle().isEmpty() && !m_groupIds[e->particle()])){//or it was accidentally inserted by a failed lookup earlier
+            GroupData* gd = new GroupData;
+            gd->size = 0;
+            gd->start = -1;
+            gd->nextIdx = 0;
+            int id = m_nextGroupId++;
+            m_groupIds.insert(e->particle(), id);
+            m_groupData.insert(id, gd);
+        }
+        m_groupData[m_groupIds[e->particle()]]->size += e->particleCount();
+    }
+
+    for(QHash<int, GroupData*>::iterator iter = m_groupData.begin(); iter != m_groupData.end(); iter++){
+        (*iter)->start = m_particle_count;
+        m_particle_count += (*iter)->size;
+    }
+    m_data.resize(m_particle_count);
+    for(int i=oldCount; i<m_particle_count; i++)
+        m_data[i] = 0;//setup new ones
+
+    if(m_particle_count > 16000)
+        qWarning() << "Particle system contains a vast number of particles (>16000). Expect poor performance";
+
+    foreach(ParticleType* particle, m_particles){
+        int particleCount = 0;
+        if(particle->particles().isEmpty()){//Uses default particle
+            particleCount += m_groupData[0]->size;
+            m_groupData[0]->types << particle;
+        }else{
+            foreach(const QString &group, particle->particles()){
+                particleCount += m_groupData[m_groupIds[group]]->size;
+                m_groupData[m_groupIds[group]]->types << particle;
+            }
+        }
+        particle->setCount(particleCount);
+        particle->m_pleaseReset = true;
+    }
+
+    m_timestamp.start();
+    m_initialized = true;
+    emit systemInitialized();
+}
+
+void ParticleSystem::reset()
+{
+    //Clear guarded pointers which have been deleted
+    int cleared = 0;
+    cleared += m_emitters.removeAll(0);
+    cleared += m_particles.removeAll(0);
+    cleared += m_affectors.removeAll(0);
+    //qDebug() << "Reset" << m_emitters.count() << m_particles.count() << "Cleared" << cleared;
+    foreach(ParticleType* p, m_particles)
+        p->reset();
+    foreach(ParticleEmitter* e, m_emitters)
+        e->reset();
+    if(!m_running)
+        return;
+    initializeSystem();
+    foreach(ParticleType* p, m_particles)
+        p->update();
+}
+
+ParticleData* ParticleSystem::newDatum(int groupId)
+{
+    Q_ASSERT(groupId < m_groupData.count());//XXX shouldn't really be an assert
+    int nextIdx = m_groupData[groupId]->start + m_groupData[groupId]->nextIdx++;
+    if( m_groupData[groupId]->nextIdx >= m_groupData[groupId]->size)
+        m_groupData[groupId]->nextIdx = 0;
+
+    Q_ASSERT(nextIdx < m_data.size());
+    ParticleData* ret;
+    if(m_data[nextIdx]){//Recycle, it's faster.
+        ret = m_data[nextIdx];
+        if(!m_overwrite && ret->stillAlive()){
+            return 0;//Artificial longevity (or too fast emission) means this guy hasn't died. To maintain count, don't emit a new one
+        }//###Reset?
+    }else{
+        ret = new ParticleData;
+        m_data[nextIdx] = ret;
+    }
+
+    ret->system = this;
+    ret->systemIndex = nextIdx;
+    ret->particleIndex = nextIdx - m_groupData[groupId]->start;
+    ret->group = groupId;
+    return ret;
+}
+
+void ParticleSystem::emitParticle(ParticleData* pd)
+{// called from prepareNextFrame()->emitWindow - enforce?
+    //Account for relative emitter position
+    QPointF offset = this->mapFromItem(pd->e, QPointF(0, 0));
+    if(!offset.isNull()){
+        pd->pv.x += offset.x();
+        pd->pv.y += offset.y();
+    }
+
+    foreach(ParticleAffector *a, m_affectors)
+        if(a && a->m_needsReset)
+            a->reset(pd->systemIndex);
+    foreach(ParticleType* p, m_groupData[pd->group]->types)
+        if(p)
+            p->load(pd);
+}
+
+
+
+uint ParticleSystem::systemSync(ParticleType* p)
+{
+    if (!m_running)
+        return 0;
+    if (!m_initialized)
+        return 0;//error in initialization
+
+    if(m_syncList.isEmpty() || m_syncList.contains(p)){//Need to advance the simulation
+        m_syncList.clear();
+
+        //### Elapsed time never shrinks - may cause problems if left emitting for weeks at a time.
+        qreal dt = m_timeInt / 1000.;
+        m_timeInt = m_timestamp.elapsed() + m_startTime;
+        qreal time =  m_timeInt / 1000.;
+        dt = time - dt;
+        m_needsReset.clear();
+        foreach(ParticleEmitter* emitter, m_emitters)
+            if(emitter)
+                emitter->emitWindow(m_timeInt);
+        foreach(ParticleAffector* a, m_affectors)
+            if(a)
+                a->affectSystem(dt);
+        foreach(ParticleData* d, m_needsReset)
+            foreach(ParticleType* p, m_groupData[d->group]->types)
+                if(p && d)
+                    p->reload(d);
+    }
+    m_syncList << p;
+    return m_timeInt;
+}
+
+//sets the x accleration without affecting the instantaneous x velocity or position
+void ParticleData::setInstantaneousAX(qreal ax)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    qreal sx = (pv.sx + t*pv.ax) - t*ax;
+    qreal ex = pv.x + pv.sx * t + 0.5 * pv.ax * t * t;
+    qreal x = ex - t*sx - 0.5 * t*t*ax;
+
+    pv.ax = ax;
+    pv.sx = sx;
+    pv.x = x;
+}
+
+//sets the x velocity without affecting the instantaneous x postion
+void ParticleData::setInstantaneousSX(qreal vx)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    qreal sx = vx - t*pv.ax;
+    qreal ex = pv.x + pv.sx * t + 0.5 * pv.ax * t * t;
+    qreal x = ex - t*sx - 0.5 * t*t*pv.ax;
+
+    pv.sx = sx;
+    pv.x = x;
+}
+
+//sets the instantaneous x postion
+void ParticleData::setInstantaneousX(qreal x)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    pv.x = x - t*pv.sx - 0.5 * t*t*pv.ax;
+}
+
+//sets the y accleration without affecting the instantaneous y velocity or position
+void ParticleData::setInstantaneousAY(qreal ay)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    qreal sy = (pv.sy + t*pv.ay) - t*ay;
+    qreal ey = pv.y + pv.sy * t + 0.5 * pv.ay * t * t;
+    qreal y = ey - t*sy - 0.5 * t*t*ay;
+
+    pv.ay = ay;
+    pv.sy = sy;
+    pv.y = y;
+}
+
+//sets the y velocity without affecting the instantaneous y position
+void ParticleData::setInstantaneousSY(qreal vy)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    //qDebug() << t << (system->m_timeInt/1000.0) << pv.x << pv.sx << pv.ax << pv.x + pv.sx * t + 0.5 * pv.ax * t * t;
+    qreal sy = vy - t*pv.ay;
+    qreal ey = pv.y + pv.sy * t + 0.5 * pv.ay * t * t;
+    qreal y = ey - t*sy - 0.5 * t*t*pv.ay;
+
+    pv.sy = sy;
+    pv.y = y;
+}
+
+//sets the instantaneous Y position
+void ParticleData::setInstantaneousY(qreal y)
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    pv.y = y - t*pv.sy - 0.5 * t*t*pv.ay;
+}
+
+qreal ParticleData::curX() const
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    return pv.x + pv.sx * t + 0.5 * pv.ax * t * t;
+}
+
+qreal ParticleData::curSX() const
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    return pv.sx + t*pv.ax;
+}
+
+qreal ParticleData::curY() const
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    return pv.y + pv.sy * t + 0.5 * pv.ay * t * t;
+}
+
+qreal ParticleData::curSY() const
+{
+    qreal t = (system->m_timeInt / 1000.0) - pv.t;
+    return pv.sy + t*pv.ay;
+}
+
+void ParticleData::debugDump()
+{
+    qDebug() << "Particle" << group
+             << "Pos: " << pv.x << "," << pv.y
+             << "Vel: " << pv.sx << "," << pv.sy
+             << "Acc: " << pv.ax << "," << pv.ay
+             << "Size: " << pv.size << "," << pv.endSize
+             << "Time: " << pv.t << "," <<pv.lifeSpan;
+}
+
+bool ParticleData::stillAlive()
+{
+    if(!system)
+        return false;
+    return (pv.t + pv.lifeSpan) > (system->m_timeInt/1000.0);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/particlesystem.h b/src/imports/particles/particlesystem.h
new file mode 100644
index 0000000000..36ac8ed81d
--- /dev/null
+++ b/src/imports/particles/particlesystem.h
@@ -0,0 +1,219 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PARTICLESYSTEM_H
+#define PARTICLESYSTEM_H
+
+#include <QSGItem>
+#include <QTime>
+#include <QVector>
+#include <QHash>
+#include <QPointer>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleAffector;
+class ParticleEmitter;
+class ParticleType;
+class ParticleData;
+
+
+struct GroupData{
+    int size;
+    int start;
+    int nextIdx;
+    QList<ParticleType*> types;
+};
+
+class ParticleSystem : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
+    Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged)
+    Q_PROPERTY(bool overwrite READ overwrite WRITE setOverwrite NOTIFY overwriteChanged)//XXX: Should just be an implementation detail, but I can't decide which way
+
+public:
+    explicit ParticleSystem(QSGItem *parent = 0);
+
+bool isRunning() const
+{
+    return m_running;
+}
+
+int startTime() const
+{
+    return m_startTime;
+}
+
+int count(){ return m_particle_count; }
+
+signals:
+
+void systemInitialized();
+void runningChanged(bool arg);
+
+void startTimeChanged(int arg);
+
+
+void overwriteChanged(bool arg);
+
+public slots:
+void reset();
+void setRunning(bool arg);
+
+
+void setStartTime(int arg)
+{
+    m_startTime = arg;
+}
+
+void setOverwrite(bool arg)
+{
+    if (m_overwrite != arg) {
+    m_overwrite = arg;
+emit overwriteChanged(arg);
+}
+}
+
+protected:
+    void componentComplete();
+
+private slots:
+    void countChanged();
+public://but only really for related class usage. Perhaps we should all be friends?
+    void emitParticle(ParticleData* p);
+    ParticleData* newDatum(int groupId);
+    uint systemSync(ParticleType* p);
+    QTime m_timestamp;
+    QVector<ParticleData*> m_data;
+    QSet<ParticleData*> m_needsReset;
+    QHash<QString, int> m_groupIds;
+    QHash<int, GroupData*> m_groupData;//id, size, start
+    uint m_timeInt;
+    bool m_initialized;
+
+    void registerParticleType(ParticleType* p);
+    void registerParticleEmitter(ParticleEmitter* e);
+    void registerParticleAffector(ParticleAffector* a);
+    bool overwrite() const
+    {
+        return m_overwrite;
+    }
+
+    int m_particle_count;
+private:
+    void initializeSystem();
+    bool m_running;
+    QList<QPointer<ParticleEmitter> > m_emitters;
+    QList<QPointer<ParticleAffector> > m_affectors;
+    QList<QPointer<ParticleType> > m_particles;
+    QList<QPointer<ParticleType> > m_syncList;
+    int m_startTime;
+    int m_nextGroupId;
+    bool m_overwrite;
+};
+
+//TODO: Clean up all this into ParticleData
+
+struct ParticleVertex {
+    float x;
+    float y;
+    float t;
+    float lifeSpan;
+    float size;
+    float endSize;
+    float sx;
+    float sy;
+    float ax;
+    float ay;
+    //TODO: Need opacity over life control. More variable size over life?
+};
+
+class ParticleData{
+public:
+    ParticleData();
+
+    ParticleVertex pv;
+
+    //Convenience functions for working backwards, because parameters are from the start of particle life
+    //If setting multiple parameters at once, doing the conversion yourself will be faster.
+
+    //sets the x accleration without affecting the instantaneous x velocity or position
+    void setInstantaneousAX(qreal ax);
+    //sets the x velocity without affecting the instantaneous x postion
+    void setInstantaneousSX(qreal vx);
+    //sets the instantaneous x postion
+    void setInstantaneousX(qreal x);
+    //sets the y accleration without affecting the instantaneous y velocity or position
+    void setInstantaneousAY(qreal ay);
+    //sets the y velocity without affecting the instantaneous y postion
+    void setInstantaneousSY(qreal vy);
+    //sets the instantaneous Y postion
+    void setInstantaneousY(qreal y);
+
+    //TODO: Slight caching?
+    qreal curX() const;
+    qreal curSX() const;
+    qreal curY() const;
+    qreal curSY() const;
+
+    int group;
+    ParticleEmitter* e;
+    ParticleSystem* system;
+    int particleIndex;
+    int systemIndex;
+
+    void debugDump();
+    bool stillAlive();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // PARTICLESYSTEM_H
+
+
diff --git a/src/imports/particles/pictureaffector.cpp b/src/imports/particles/pictureaffector.cpp
new file mode 100644
index 0000000000..c05a553f39
--- /dev/null
+++ b/src/imports/particles/pictureaffector.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pictureaffector.h"
+#include "coloredparticle.h"
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+PictureAffector::PictureAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+    m_needsReset = true;
+}
+
+void PictureAffector::reset(int systemIdx)
+{
+    ParticleAffector::reset(systemIdx);
+}
+
+bool PictureAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    Q_UNUSED(dt);
+    if(!width() || !height()){
+        qWarning() << "PictureAffector needs a size";
+        return false;
+    }
+
+    if(m_loadedImage.isNull())
+        return false;
+
+    if(m_loadedImage.size()!=QSize(width(), height()))
+        m_loadedImage = m_loadedImage.scaled(width(), height());//TODO: Aspect Ratio Control?
+
+    bool affected = false;
+    QPoint pos = QPoint(d->curX() - m_offset.x(), d->curY() - m_offset.y());
+    if(!QRect(0,0,width(),height()).contains(pos)){
+        //XXX: Just a debugging helper, as I don't think it can get here.
+        qWarning() << "An unexpected situation has occurred. But don't worry, everything will be fine.";
+        return false;
+    }
+    Color4ub c;
+    QRgb col = m_loadedImage.pixel(pos);
+    c.a = qAlpha(col);
+    c.b = qBlue(col);
+    c.g = qGreen(col);
+    c.r = qRed(col);
+    foreach(ParticleType *p, m_system->m_groupData[d->group]->types){
+       if(qobject_cast<ColoredParticle*>(p)){
+           ColoredParticle* cp = qobject_cast<ColoredParticle*>(p);
+           cp->reloadColor(c, d);
+           affected = true;
+       }
+    }
+
+    return affected;//Doesn't affect particle data, but necessary for onceOff
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/pictureaffector.h b/src/imports/particles/pictureaffector.h
new file mode 100644
index 0000000000..ca7d13f477
--- /dev/null
+++ b/src/imports/particles/pictureaffector.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PICTUREAFFECTOR_H
+#define PICTUREAFFECTOR_H
+#include "particleaffector.h"
+#include <QDebug>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class PictureAffector : public ParticleAffector
+{
+    Q_OBJECT
+    //Usually want to use "particles" to target just colored stuff, and save performance
+    //Use onceOff (inherited) to determine if this is an emitter modification or a more constant enforcer
+    //TODO: Onceoff isn't actually working right now...
+    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)
+    //TODO: Bool smooth, where it interpolates
+public:
+    explicit PictureAffector(QSGItem *parent = 0);
+
+    QUrl image() const
+    {
+        return m_image;
+    }
+
+protected:
+    virtual void reset(int systemIdx);
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void imageChanged(QUrl arg);
+
+public slots:
+    void setImage(QUrl arg)
+    {
+        if (m_image != arg) {
+            m_image = arg;
+            m_loadedImage = QImage(m_image.toLocalFile());
+            if(m_loadedImage.isNull())
+                qWarning() << "PictureAffector could not load picture " << m_image.toLocalFile();
+            emit imageChanged(arg);
+        }
+    }
+
+private:
+    QUrl m_image;
+    QImage m_loadedImage;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // PICTUREAFFECTOR_H
diff --git a/src/imports/particles/pluginmain.h b/src/imports/particles/pluginmain.h
new file mode 100644
index 0000000000..cd8760d1a0
--- /dev/null
+++ b/src/imports/particles/pluginmain.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PLUGINMAIN_H
+#define PLUGINMAIN_H
+
+#include <QtDeclarative>
+#include <QtDeclarative/QDeclarativeExtensionPlugin>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ParticlesPlugin : public QDeclarativeExtensionPlugin
+{
+    Q_OBJECT
+public:
+    virtual void registerTypes(const char *uri);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // PLUGINMAIN_H
diff --git a/src/imports/particles/pointvector.cpp b/src/imports/particles/pointvector.cpp
new file mode 100644
index 0000000000..e222965943
--- /dev/null
+++ b/src/imports/particles/pointvector.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pointvector.h"
+
+QT_BEGIN_NAMESPACE
+
+PointVector::PointVector(QObject *parent) :
+    VaryingVector(parent)
+  , m_x(0)
+  , m_y(0)
+  , m_xVariation(0)
+  , m_yVariation(0)
+{
+}
+
+const QPointF &PointVector::sample(const QPointF &)
+{
+    m_ret.setX(m_x - m_xVariation + rand() / float(RAND_MAX) * m_xVariation * 2);
+    m_ret.setY(m_y - m_yVariation + rand() / float(RAND_MAX) * m_yVariation * 2);
+    return m_ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/pointvector.h b/src/imports/particles/pointvector.h
new file mode 100644
index 0000000000..5ffa896680
--- /dev/null
+++ b/src/imports/particles/pointvector.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef POINTVECTOR_H
+#define POINTVECTOR_H
+#include "varyingvector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class PointVector : public VaryingVector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
+    Q_PROPERTY(qreal xVariation READ xVariation WRITE setXVariation NOTIFY xVariationChanged)
+    Q_PROPERTY(qreal yVariation READ yVariation WRITE setYVariation NOTIFY yVariationChanged)
+public:
+    explicit PointVector(QObject *parent = 0);
+    virtual const QPointF &sample(const QPointF &from);
+    qreal x() const
+    {
+        return m_x;
+    }
+
+    qreal y() const
+    {
+        return m_y;
+    }
+
+    qreal xVariation() const
+    {
+        return m_xVariation;
+    }
+
+    qreal yVariation() const
+    {
+        return m_yVariation;
+    }
+
+signals:
+
+    void xChanged(qreal arg);
+
+    void yChanged(qreal arg);
+
+    void xVariationChanged(qreal arg);
+
+    void yVariationChanged(qreal arg);
+
+public slots:
+    void setX(qreal arg)
+    {
+        if (m_x != arg) {
+            m_x = arg;
+            emit xChanged(arg);
+        }
+    }
+
+    void setY(qreal arg)
+    {
+        if (m_y != arg) {
+            m_y = arg;
+            emit yChanged(arg);
+        }
+    }
+
+    void setXVariation(qreal arg)
+    {
+        if (m_xVariation != arg) {
+            m_xVariation = arg;
+            emit xVariationChanged(arg);
+        }
+    }
+
+    void setYVariation(qreal arg)
+    {
+        if (m_yVariation != arg) {
+            m_yVariation = arg;
+            emit yVariationChanged(arg);
+        }
+    }
+
+private:
+
+    qreal m_x;
+    qreal m_y;
+    qreal m_xVariation;
+    qreal m_yVariation;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // POINTVECTOR_H
diff --git a/src/imports/particles/resetaffector.cpp b/src/imports/particles/resetaffector.cpp
new file mode 100644
index 0000000000..0598298f27
--- /dev/null
+++ b/src/imports/particles/resetaffector.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "resetaffector.h"
+#include <cmath>
+QT_BEGIN_NAMESPACE
+ResetAffector::ResetAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+}
+
+void ResetAffector::reset(int idx)
+{
+    ParticleAffector::reset(idx);
+    if(m_data[idx])
+        delete m_data[idx];
+    m_data.insert(idx, 0);//TODO: Either load with data now, or get data next tick whether active or not
+}
+
+bool ResetAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    TrajectoryData* trajectory;
+    if(m_data[d->systemIndex]){
+        trajectory = m_data[d->systemIndex];
+        //TODO: Faster to calculate once (not 4 times)
+        d->setInstantaneousSX(trajectory->sx);
+        d->setInstantaneousSY(trajectory->sy);
+        d->setInstantaneousAX(trajectory->ax);
+        d->setInstantaneousAY(trajectory->ay);
+    }else{
+        trajectory = new TrajectoryData;
+    }
+    trajectory->sx = d->pv.sx;
+    trajectory->sy = d->pv.sy;
+    trajectory->ax = d->pv.ax;
+    trajectory->ay = d->pv.ay;
+    m_data.insert(d->systemIndex, trajectory);//overwrites
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/resetaffector.h b/src/imports/particles/resetaffector.h
new file mode 100644
index 0000000000..6a4e2b7983
--- /dev/null
+++ b/src/imports/particles/resetaffector.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef RESETAFFECTOR_H
+#define RESETAFFECTOR_H
+#include "particleaffector.h"
+#include <QHash>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+struct TrajectoryData{
+    qreal sx,sy,ax,ay;
+};
+
+class ResetAffector : public ParticleAffector
+{
+    Q_OBJECT
+public:
+    explicit ResetAffector(QSGItem *parent = 0);
+    virtual void reset(int systemIdx);
+
+signals:
+
+public slots:
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+private:
+    QHash<int, TrajectoryData*> m_data;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // RESETAFFECTOR_H
diff --git a/src/imports/particles/resources/ctfragment.shader b/src/imports/particles/resources/ctfragment.shader
new file mode 100644
index 0000000000..a17f5841ca
--- /dev/null
+++ b/src/imports/particles/resources/ctfragment.shader
@@ -0,0 +1,11 @@
+uniform sampler2D texture;
+uniform sampler2D colortable;
+uniform sampler2D opacitytable;
+
+varying highp vec2 fTex;
+varying lowp vec4 fColor;
+varying lowp float tt;
+
+void main() {
+    gl_FragColor = (texture2D(texture, fTex).w) * fColor * texture2D(colortable, vec2(tt, 0.5)) *( texture2D(opacitytable, vec2(tt, 0.5)).w);
+}
diff --git a/src/imports/particles/resources/ctvertex.shader b/src/imports/particles/resources/ctvertex.shader
new file mode 100644
index 0000000000..b20676cc49
--- /dev/null
+++ b/src/imports/particles/resources/ctvertex.shader
@@ -0,0 +1,38 @@
+attribute highp vec2 vPos;
+attribute highp vec2 vTex;
+attribute highp vec4 vData; //  x = time,  y = lifeSpan, z = size,  w = endSize
+attribute highp vec4 vVec; // x,y = constant speed,  z,w = acceleration
+attribute lowp vec4 vColor;
+
+uniform highp mat4 matrix;                              
+uniform highp float timestamp;
+uniform sampler2D sizetable;
+uniform sampler2D opacitytable;
+
+varying highp vec2 fTex;                                
+varying lowp vec4 fColor;
+varying lowp float tt;
+
+void main() {                                           
+    fTex = vTex;                                        
+    highp float size = vData.z;
+    highp float endSize = vData.w;
+
+    highp float t = (timestamp - vData.x) / vData.y;
+
+    highp float currentSize = mix(size, endSize, t * t) * texture2D(sizetable, vec2(t,0.5)).w;
+
+    if (t < 0. || t > 1.)
+        currentSize = 0.;
+
+    highp vec2 pos = vPos
+                   - currentSize / 2. + currentSize * vTex          // adjust size
+                   + vVec.xy * t * vData.y         // apply speed vector..
+                   + 0.5 * vVec.zw * pow(t * vData.y, 2.);
+
+    gl_Position = matrix * vec4(pos.x, pos.y, 0, 1);
+
+    fColor = vColor;
+    tt = t;
+
+}
diff --git a/src/imports/particles/resources/defaultFadeInOut.png b/src/imports/particles/resources/defaultFadeInOut.png
new file mode 100644
index 0000000000000000000000000000000000000000..89c04eaefe7eef88a5ab6cbeb43209bcdb6c531e
GIT binary patch
literal 286
zcmeAS@N?(olHy`uVBq!ia0y~yU<5K57&+L0q+w)1Ifzpn<nF|<?wrg^Acrl<+ueoX
zKL{?^yL>WGgtNdSvY3H^TNs2H8D`Cq01C2~c>21s-)0fw5HycFwZa}KBw6AbQR1AR
zo12<f!r)w#npl#WqEMb$lA+-4=^GH<$R`d|RO#vB7-DhyY=0zQg949ByRYAqzvq`K
z{BWM^*~~WGW%iyDtA*Tb2Y3z$i#aeDOcX!S{lxWCbwPZ<<{I|v->eVGCHPH9uoe26
zc3(U&enw(l*?-~puj0=(T>EX&tryaLZ-w64X*yQh=ggWe>Y17L_61ME%RN_(jo#m3
YjGAucCVaF4=mrJ`Pgg&ebxsLQ06z0z;s5{u

literal 0
HcmV?d00001

diff --git a/src/imports/particles/resources/deformablefragment.shader b/src/imports/particles/resources/deformablefragment.shader
new file mode 100644
index 0000000000..494053e319
--- /dev/null
+++ b/src/imports/particles/resources/deformablefragment.shader
@@ -0,0 +1,8 @@
+uniform sampler2D texture;
+
+varying highp vec2 fTex;
+varying lowp float fFade;
+
+void main() {
+    gl_FragColor = (texture2D(texture, fTex)) * fFade;
+}
diff --git a/src/imports/particles/resources/deformablevertex.shader b/src/imports/particles/resources/deformablevertex.shader
new file mode 100644
index 0000000000..1ea7f22046
--- /dev/null
+++ b/src/imports/particles/resources/deformablevertex.shader
@@ -0,0 +1,57 @@
+attribute highp vec2 vPos;
+attribute highp vec2 vTex;
+attribute highp vec4 vData; //  x = time,  y = lifeSpan, z = size,  w = endSize
+attribute highp vec4 vVec; // x,y = constant speed,  z,w = acceleration
+attribute highp vec4 vDeformVec; //x,y x unit vector; z,w = y unit vector
+attribute highp vec2 vRotation; //x = radians of rotation, y= bool autoRotate
+
+uniform highp mat4 matrix;
+uniform highp float timestamp;
+uniform lowp float opacity;
+
+varying highp vec2 fTex;
+varying lowp float fFade;
+
+void main() {                                           
+    fTex = vTex;
+    highp float size = vData.z;
+    highp float endSize = vData.w;
+
+    highp float t = (timestamp - vData.x) / vData.y;
+
+    highp float currentSize = mix(size, endSize, t * t);
+
+    highp vec2 pos;
+    if (t < 0. || t > 1.){
+        currentSize = 0.;
+        pos = vPos;
+    }else{
+        highp float rotation = vRotation.x;
+        if(vRotation.y == 1.0){
+            highp vec2 curVel = vVec.zw * t * vData.y + vVec.xy;
+            rotation += atan(curVel.y, curVel.x);
+        }
+        highp vec2 trigCalcs = vec2(cos(rotation), sin(rotation));
+        highp vec2 xDeform = vDeformVec.xy * currentSize * (vTex.x-0.5);
+        highp vec2 yDeform = vDeformVec.zw * currentSize * (vTex.y-0.5);
+        highp vec2 xRotatedDeform;
+        xRotatedDeform.x = trigCalcs.x*xDeform.x - trigCalcs.y*xDeform.y;
+        xRotatedDeform.y = trigCalcs.y*xDeform.x + trigCalcs.x*xDeform.y;
+        highp vec2 yRotatedDeform;
+        yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y;
+        yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y;
+        pos = vPos
+              + xRotatedDeform
+              + yRotatedDeform
+              //- vec2(1,1) * currentSize * 0.5 // 'center'
+              + vVec.xy * t * vData.y         // apply speed
+              + 0.5 * vVec.zw * pow(t * vData.y, 2.); // apply acceleration
+    }
+
+    gl_Position = matrix * vec4(pos.x, pos.y, 0, 1);
+
+    highp float fadeIn = min(t * 10., 1.);
+    highp float fadeOut = 1. - max(0., min((t - 0.75) * 4., 1.));
+
+    fFade = fadeIn * fadeOut * opacity;
+}
diff --git a/src/imports/particles/resources/identitytable.png b/src/imports/particles/resources/identitytable.png
new file mode 100644
index 0000000000000000000000000000000000000000..2cada1bfad899dc225f6df1c6b4d9b0f4c80462b
GIT binary patch
literal 90
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryoCO|{#X$M%K%B_<Vf!REpdgQ@
ji(?4K%;X>c|JyUL{$u(V@hO`RD9+&N>gTe~DWM4fI6M}h

literal 0
HcmV?d00001

diff --git a/src/imports/particles/resources/spritefragment.shader b/src/imports/particles/resources/spritefragment.shader
new file mode 100644
index 0000000000..4d89d69c6a
--- /dev/null
+++ b/src/imports/particles/resources/spritefragment.shader
@@ -0,0 +1,10 @@
+uniform sampler2D texture;
+
+varying highp vec2 fTexA;
+varying highp vec2 fTexB;
+varying lowp float progress;
+varying lowp vec4 fColor;
+
+void main() {
+    gl_FragColor = mix(texture2D(texture, fTexA), texture2D(texture, fTexB), progress) * fColor.w;
+}
diff --git a/src/imports/particles/resources/spriteimagefragment.shader b/src/imports/particles/resources/spriteimagefragment.shader
new file mode 100644
index 0000000000..ecd62cf390
--- /dev/null
+++ b/src/imports/particles/resources/spriteimagefragment.shader
@@ -0,0 +1,9 @@
+uniform sampler2D texture;
+
+varying highp vec2 fTexA;
+varying highp vec2 fTexB;
+varying lowp float progress;
+
+void main() {
+    gl_FragColor = mix(texture2D(texture, fTexA), texture2D(texture, fTexB), progress);
+}
diff --git a/src/imports/particles/resources/spriteimagevertex.shader b/src/imports/particles/resources/spriteimagevertex.shader
new file mode 100644
index 0000000000..27de2ada6a
--- /dev/null
+++ b/src/imports/particles/resources/spriteimagevertex.shader
@@ -0,0 +1,52 @@
+attribute highp vec2 vTex;
+attribute highp vec4 vAnimData;// idx, duration, frameCount (this anim), timestamp (this anim)
+
+uniform highp mat4 matrix;
+uniform highp float timestamp;                          
+uniform lowp float opacity;
+uniform highp float framecount; //maximum of all anims
+uniform highp float animcount;
+uniform highp float width;
+uniform highp float height;
+
+varying highp vec2 fTexA;
+varying highp vec2 fTexB;
+varying lowp float progress;
+
+
+void main() {                                           
+    //Calculate frame location in texture
+    highp float frameIndex = mod((((timestamp - vAnimData.w)*1000.)/vAnimData.y),vAnimData.z);
+    progress = mod((timestamp - vAnimData.w)*1000., vAnimData.y) / vAnimData.y;
+
+    frameIndex = floor(frameIndex);
+    highp vec2 frameTex;
+    if(vTex.x == 0.)
+        frameTex.x = (frameIndex/framecount);
+    else
+        frameTex.x = 1. * ((frameIndex + 1.)/framecount);
+
+    if(vTex.y == 0.)
+        frameTex.y = (vAnimData.x/animcount);
+    else
+        frameTex.y = 1. * ((vAnimData.x + 1.)/animcount);
+
+    fTexA = frameTex;
+    //Next frame is also passed, for interpolation
+    if(frameIndex != vAnimData.z - 1.)//Can't do it for the last frame though, this anim may not loop
+        frameIndex = mod(frameIndex+1., vAnimData.z);
+
+    if(vTex.x == 0.)
+        frameTex.x = (frameIndex/framecount);
+    else
+        frameTex.x = 1. * ((frameIndex + 1.)/framecount);
+
+    if(vTex.y == 0.)
+        frameTex.y = (vAnimData.x/animcount);
+    else
+        frameTex.y = 1. * ((vAnimData.x + 1.)/animcount);
+    fTexB = frameTex;
+
+
+    gl_Position = matrix * vec4(width * vTex.x, height * vTex.y, 0, 1);
+}
diff --git a/src/imports/particles/resources/spritevertex.shader b/src/imports/particles/resources/spritevertex.shader
new file mode 100644
index 0000000000..78b8e36b3b
--- /dev/null
+++ b/src/imports/particles/resources/spritevertex.shader
@@ -0,0 +1,77 @@
+attribute highp vec2 vPos;
+attribute highp vec2 vTex;                              
+attribute highp vec4 vData; //  x = time,  y = lifeSpan, z = size,  w = endSize
+attribute highp vec4 vVec; // x,y = constant speed,  z,w = acceleration
+attribute highp vec4 vAnimData;// idx, duration, frameCount (this anim), timestamp (this anim)
+
+uniform highp mat4 matrix;                              
+uniform highp float timestamp;                          
+uniform lowp float opacity;
+uniform highp float framecount; //maximum of all anims
+uniform highp float animcount;
+
+varying highp vec2 fTexA;
+varying highp vec2 fTexB;
+varying lowp float progress;
+varying lowp vec4 fColor;
+
+void main() {                                           
+    highp float size = vData.z;
+    highp float endSize = vData.w;
+
+    highp float t = (timestamp - vData.x) / vData.y;
+
+    //Calculate frame location in texture
+    highp float frameIndex = mod((((timestamp - vAnimData.w)*1000.)/vAnimData.y),vAnimData.z);
+    progress = mod((timestamp - vAnimData.w)*1000., vAnimData.y) / vAnimData.y;
+
+    frameIndex = floor(frameIndex);
+    highp vec2 frameTex = vTex;
+    if(vTex.x == 0.)
+        frameTex.x = (frameIndex/framecount);
+    else
+        frameTex.x = 1. * ((frameIndex + 1.)/framecount);
+
+    if(vTex.y == 0.)
+        frameTex.y = (vAnimData.x/animcount);
+    else
+        frameTex.y = 1. * ((vAnimData.x + 1.)/animcount);
+
+    fTexA = frameTex;
+    //Next frame is also passed, for interpolation
+    //### Should the next anim be precalculated to allow for interpolation there?
+    if(frameIndex != vAnimData.z - 1.)//Can't do it for the last frame though, this anim may not loop
+        frameIndex = mod(frameIndex+1., vAnimData.z);
+
+    if(vTex.x == 0.)
+        frameTex.x = (frameIndex/framecount);
+    else
+        frameTex.x = 1. * ((frameIndex + 1.)/framecount);
+
+    if(vTex.y == 0.)
+        frameTex.y = (vAnimData.x/animcount);
+    else
+        frameTex.y = 1. * ((vAnimData.x + 1.)/animcount);
+    fTexB = frameTex;
+
+    //Applying Size here seems to screw with RockingAffector?
+    highp float currentSize = mix(size, endSize, t * t);
+
+    if (t < 0. || t > 1.)
+        currentSize = 0.;
+
+    //If affector is mananging pos, they don't set speed?
+    highp vec2 pos = vPos
+                   - currentSize / 2. + currentSize * vTex          // adjust size
+                   + vVec.xy * t * vData.y         // apply speed vector..
+                   + 0.5 * vVec.zw * pow(t * vData.y, 2.);
+
+    gl_Position = matrix * vec4(pos.x, pos.y, 0, 1);
+
+    // calculate opacity
+    highp float fadeIn = min(t * 10., 1.);
+    highp float fadeOut = 1. - max(0., min((t - 0.75) * 4., 1.));
+
+    lowp vec4 white = vec4(1.);
+    fColor = white * fadeIn * fadeOut * opacity;
+}
diff --git a/src/imports/particles/resources/trailsfragment.shader b/src/imports/particles/resources/trailsfragment.shader
new file mode 100644
index 0000000000..d3db87fa30
--- /dev/null
+++ b/src/imports/particles/resources/trailsfragment.shader
@@ -0,0 +1,8 @@
+uniform sampler2D texture;
+
+varying highp vec2 fTex;
+varying lowp vec4 fColor;
+
+void main() {
+    gl_FragColor = (texture2D(texture, fTex).w) * fColor;
+}
diff --git a/src/imports/particles/resources/trailsvertex.shader b/src/imports/particles/resources/trailsvertex.shader
new file mode 100644
index 0000000000..7bc1d66b71
--- /dev/null
+++ b/src/imports/particles/resources/trailsvertex.shader
@@ -0,0 +1,37 @@
+attribute highp vec2 vPos;
+attribute highp vec2 vTex;
+attribute highp vec4 vData; //  x = time,  y = lifeSpan, z = size,  w = endSize
+attribute highp vec4 vVec; // x,y = constant speed,  z,w = acceleration
+attribute lowp vec4 vColor;
+
+uniform highp mat4 matrix;                              
+uniform highp float timestamp;
+uniform lowp float opacity;
+
+varying highp vec2 fTex;                                
+varying lowp vec4 fColor;
+
+void main() {                                           
+    fTex = vTex;                                        
+    highp float size = vData.z;
+    highp float endSize = vData.w;
+
+    highp float t = (timestamp - vData.x) / vData.y;
+
+    highp float currentSize = mix(size, endSize, t * t);
+
+    if (t < 0. || t > 1.)
+        currentSize = 0.;
+
+    highp vec2 pos = vPos
+                   - currentSize / 2. + currentSize * vTex          // adjust size
+                   + vVec.xy * t * vData.y         // apply speed vector..
+                   + 0.5 * vVec.zw * pow(t * vData.y, 2.);
+
+    gl_Position = matrix * vec4(pos.x, pos.y, 0, 1);
+
+    highp float fadeIn = min(t * 10., 1.);
+    highp float fadeOut = 1. - max(0., min((t - 0.75) * 4., 1.));
+
+    fColor = vColor * fadeIn * fadeOut * opacity;
+}
diff --git a/src/imports/particles/speedlimitaffector.cpp b/src/imports/particles/speedlimitaffector.cpp
new file mode 100644
index 0000000000..c226404b01
--- /dev/null
+++ b/src/imports/particles/speedlimitaffector.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "speedlimitaffector.h"
+#include <cmath>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+SpeedLimitAffector::SpeedLimitAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_speedLimit(-1)
+{
+}
+
+bool SpeedLimitAffector::affectParticle(ParticleData *d, qreal dt){
+    Q_UNUSED(dt);
+    if(m_speedLimit <= 0)
+        return false;
+
+    qreal x = d->curSX();
+    qreal y = d->curSY();
+    qreal s = sqrt(x*x + y*y);
+    if(s <= m_speedLimit)
+        return false;
+
+
+    if(s >= m_speedLimit*1.01){
+        qreal theta = atan2(y,x);
+        d->setInstantaneousSX(m_speedLimit * cos(theta));
+        d->setInstantaneousSY(m_speedLimit * sin(theta));
+    }
+
+    d->setInstantaneousAY(0);
+    d->setInstantaneousAX(0);
+
+    return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/speedlimitaffector.h b/src/imports/particles/speedlimitaffector.h
new file mode 100644
index 0000000000..b3858a2a9d
--- /dev/null
+++ b/src/imports/particles/speedlimitaffector.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPEEDLIMITAFFECTOR_H
+#define SPEEDLIMITAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class SpeedLimitAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal speedLimit READ speedLimit WRITE setSpeedLimit NOTIFY speedLimitChanged)
+
+
+public:
+    explicit SpeedLimitAffector(QSGItem *parent = 0);
+
+    qreal speedLimit() const
+    {
+        return m_speedLimit;
+    }
+
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void speedLimitChanged(qreal arg);
+
+public slots:
+void setSpeedLimit(qreal arg)
+{
+    if (m_speedLimit != arg) {
+        m_speedLimit = arg;
+        emit speedLimitChanged(arg);
+    }
+}
+
+private:
+qreal m_speedLimit;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SPEEDLIMITAFFECTOR_H
diff --git a/src/imports/particles/spriteengine.cpp b/src/imports/particles/spriteengine.cpp
new file mode 100644
index 0000000000..b324f7af22
--- /dev/null
+++ b/src/imports/particles/spriteengine.cpp
@@ -0,0 +1,333 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spriteengine.h"
+#include "spritestate.h"
+#include <QDebug>
+#include <QPainter>
+#include <QSet>
+#include <QtOpenGL>
+
+QT_BEGIN_NAMESPACE
+
+SpriteEngine::SpriteEngine(QObject *parent) :
+    QObject(parent), m_timeOffset(0)
+{
+    //Default size 1
+    setCount(1);
+    m_advanceTime.start();
+}
+
+SpriteEngine::SpriteEngine(QList<SpriteState*> states, QObject *parent) :
+    QObject(parent), m_states(states), m_timeOffset(0)
+{
+    //Default size 1
+    setCount(1);
+    m_advanceTime.start();
+}
+
+SpriteEngine::~SpriteEngine()
+{
+}
+
+int SpriteEngine::maxFrames()
+{
+   int max = 0;
+   foreach(SpriteState* s, m_states)
+       if(s->frames() > max)
+           max = s->frames();
+   return max;
+}
+
+void SpriteEngine::setGoal(int state, int sprite, bool jump)
+{
+    if(sprite >= m_sprites.count() || state >= m_states.count())
+        return;
+    if(!jump){
+        m_goals[sprite] = state;
+        return;
+    }
+
+    if(m_sprites[sprite] == state)
+        return;//Already there
+    m_sprites[sprite] = state;
+    m_goals[sprite] = -1;
+    restartSprite(sprite);
+    return;
+}
+
+QImage SpriteEngine::assembledImage()
+{
+    int frameHeight = 0;
+    int frameWidth = 0;
+    m_maxFrames = 0;
+
+    int maxSize;
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
+
+    foreach(SpriteState* state, m_states){
+        if(state->frames() > m_maxFrames)
+            m_maxFrames = state->frames();
+
+        QImage img(state->source().toLocalFile());
+        if (img.isNull()) {
+            qWarning() << "SpriteEngine: loading image failed..." << state->source().toLocalFile();
+            return QImage();
+        }
+
+        if(frameWidth){
+            if(img.width() / state->frames() != frameWidth){
+                qWarning() << "SpriteEngine: Irregular frame width..." << state->source().toLocalFile();
+                return QImage();
+            }
+        }else{
+            frameWidth = img.width() / state->frames();
+        }
+        if(img.width() > maxSize){
+            qWarning() << "SpriteEngine: Animation too wide..." << state->source().toLocalFile();
+            return QImage();
+        }
+
+        if(frameHeight){
+            if(img.height()!=frameHeight){
+                qWarning() << "SpriteEngine: Irregular frame height..." << state->source().toLocalFile();
+                return QImage();
+            }
+        }else{
+            frameHeight = img.height();
+        }
+
+        if(img.height() > maxSize){
+            qWarning() << "SpriteEngine: Animation too tall..." << state->source().toLocalFile();
+            return QImage();
+        }
+    }
+
+    QImage image(frameWidth * m_maxFrames, frameHeight * m_states.count(), QImage::Format_ARGB32);
+    image.fill(0);
+    QPainter p(&image);
+    int y = 0;
+    foreach(SpriteState* state, m_states){
+        QImage img(state->source().toLocalFile());
+        p.drawImage(0,y,img);
+        y += frameHeight;
+    }
+
+    if(image.height() > maxSize){
+        qWarning() << "SpriteEngine: Too many animations to fit in one texture...";
+        return QImage();
+    }
+    return image;
+}
+
+void SpriteEngine::setCount(int c)
+{
+    m_sprites.resize(c);
+    m_goals.resize(c);
+    m_startTimes.resize(c);
+}
+
+void SpriteEngine::startSprite(int index)
+{
+    if(index >= m_sprites.count())
+        return;
+    m_sprites[index] = 0;
+    m_goals[index] = -1;
+    restartSprite(index);
+}
+
+void SpriteEngine::restartSprite(int index)
+{
+    m_startTimes[index] = m_timeOffset + m_advanceTime.elapsed();
+    int time = m_states[m_sprites[index]]->duration() * m_states[m_sprites[index]]->frames() + m_startTimes[index];
+    for(int i=0; i<m_stateUpdates.count(); i++)
+        m_stateUpdates[i].second.removeAll(index);
+    addToUpdateList(time, index);
+}
+
+uint SpriteEngine::updateSprites(uint time)
+{
+    //Sprite State Update;
+    while(!m_stateUpdates.isEmpty() && time >= m_stateUpdates.first().first){
+        foreach(int idx, m_stateUpdates.first().second){
+            if(idx >= m_sprites.count())
+                continue;//TODO: Proper fix(because this does happen and I'm just ignoring it)
+            int stateIdx = m_sprites[idx];
+            int nextIdx = -1;
+            int goalPath = goalSeek(stateIdx, idx);
+            if(goalPath == -1){//Random
+                qreal r =(qreal) qrand() / (qreal) RAND_MAX;
+                qreal total = 0.0;
+                for(QVariantMap::const_iterator iter=m_states[stateIdx]->m_to.constBegin();
+                    iter!=m_states[stateIdx]->m_to.constEnd(); iter++)
+                    total += (*iter).toReal();
+                r*=total;
+                for(QVariantMap::const_iterator iter= m_states[stateIdx]->m_to.constBegin();
+                        iter!=m_states[stateIdx]->m_to.constEnd(); iter++){
+                    if(r < (*iter).toReal()){
+                        bool superBreak = false;
+                        for(int i=0; i<m_states.count(); i++){
+                            if(m_states[i]->name() == iter.key()){
+                                nextIdx = i;
+                                superBreak = true;
+                                break;
+                            }
+                        }
+                        if(superBreak)
+                            break;
+                    }
+                    r -= (*iter).toReal();
+                }
+            }else{//Random out of shortest paths to goal
+                nextIdx = goalPath;
+            }
+            if(nextIdx == -1)//No to states means stay here
+                nextIdx = stateIdx;
+
+            m_sprites[idx] = nextIdx;
+            m_startTimes[idx] = time;
+            //TODO: emit something?
+            addToUpdateList((m_states[nextIdx]->duration() * m_states[nextIdx]->frames()) + time, idx);
+        }
+        m_stateUpdates.pop_front();
+    }
+
+    m_timeOffset = time;
+    m_advanceTime.start();
+    if(m_stateUpdates.isEmpty())
+        return -1;
+    return m_stateUpdates.first().first;
+}
+
+int SpriteEngine::goalSeek(int curIdx, int spriteIdx, int dist)
+{
+    QString goalName;
+    if(m_goals[spriteIdx] != -1)
+        goalName = m_states[m_goals[spriteIdx]]->name();
+    else
+        goalName = m_globalGoal;
+    if(goalName.isEmpty())
+        return -1;
+    //TODO: caching instead of excessively redoing iterative deepening (which was chosen arbitarily anyways)
+    // Paraphrased - implement in an *efficient* manner
+    for(int i=0; i<m_states.count(); i++)
+        if(m_states[curIdx]->name() == goalName)
+            return curIdx;
+    if(dist < 0)
+        dist = m_states.count();
+    SpriteState* curState = m_states[curIdx];
+    for(QVariantMap::const_iterator iter = curState->m_to.constBegin();
+        iter!=curState->m_to.constEnd(); iter++){
+        if(iter.key() == goalName)
+            for(int i=0; i<m_states.count(); i++)
+                if(m_states[i]->name() == goalName)
+                    return i;
+    }
+    QSet<int> options;
+    for(int i=1; i<dist; i++){
+        for(QVariantMap::const_iterator iter = curState->m_to.constBegin();
+            iter!=curState->m_to.constEnd(); iter++){
+            int option = -1;
+            for(int j=0; j<m_states.count(); j++)//One place that could be a lot more efficient...
+                if(m_states[j]->name() == iter.key())
+                    if(goalSeek(j, spriteIdx, i) != -1)
+                        option = j;
+            if(option != -1)
+                options << option;
+        }
+        if(!options.isEmpty()){
+            if(options.count()==1)
+                return *(options.begin());
+            int option = -1;
+            qreal r =(qreal) qrand() / (qreal) RAND_MAX;
+            qreal total;
+            for(QSet<int>::const_iterator iter=options.constBegin();
+                iter!=options.constEnd(); iter++)
+                total += curState->m_to.value(m_states[(*iter)]->name()).toReal();
+            r *= total;
+            for(QVariantMap::const_iterator iter = curState->m_to.constBegin();
+                iter!=curState->m_to.constEnd(); iter++){
+                bool superContinue = true;
+                for(int j=0; j<m_states.count(); j++)
+                    if(m_states[j]->name() == iter.key())
+                        if(options.contains(j))
+                            superContinue = false;
+                if(superContinue)
+                    continue;
+                if(r < (*iter).toReal()){
+                    bool superBreak = false;
+                    for(int j=0; j<m_states.count(); j++){
+                        if(m_states[j]->name() == iter.key()){
+                            option = j;
+                            superBreak = true;
+                            break;
+                        }
+                    }
+                    if(superBreak)
+                        break;
+                }
+                r-=(*iter).toReal();
+            }
+            return option;
+        }
+    }
+    return -1;
+}
+
+void SpriteEngine::addToUpdateList(uint t, int idx)
+{
+    for(int i=0; i<m_stateUpdates.count(); i++){
+        if(m_stateUpdates[i].first==t){
+            m_stateUpdates[i].second << idx;
+            return;
+        }else if(m_stateUpdates[i].first > t){
+            QList<int> tmpList;
+            tmpList << idx;
+            m_stateUpdates.insert(i, qMakePair(t, tmpList));
+            return;
+        }
+    }
+    QList<int> tmpList;
+    tmpList << idx;
+    m_stateUpdates << qMakePair(t, tmpList);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/spriteengine.h b/src/imports/particles/spriteengine.h
new file mode 100644
index 0000000000..76a2e29745
--- /dev/null
+++ b/src/imports/particles/spriteengine.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPRITEENGINE_H
+#define SPRITEENGINE_H
+
+#include <QObject>
+#include <QVector>
+#include <QTimer>
+#include <QTime>
+#include <QList>
+#include <QDeclarativeListProperty>
+#include <QImage>
+#include <QPair>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class SpriteState;
+
+class SpriteEngine : public QObject
+{
+    Q_OBJECT
+    //TODO: Optimize single sprite case
+    Q_PROPERTY(QDeclarativeListProperty<SpriteState> sprites READ sprites)
+    Q_PROPERTY(QString globalGoal READ globalGoal WRITE setGlobalGoal NOTIFY globalGoalChanged)
+public:
+    explicit SpriteEngine(QObject *parent = 0);
+    SpriteEngine(QList<SpriteState*> sprites, QObject *parent=0);
+    ~SpriteEngine();
+
+    QDeclarativeListProperty<SpriteState> sprites()
+    {
+        return QDeclarativeListProperty<SpriteState>(this, m_states);
+    }
+    QString globalGoal() const
+    {
+        return m_globalGoal;
+    }
+
+    int count() const {return m_sprites.count();}
+    void setCount(int c);
+
+    int spriteState(int sprite=0) {return m_sprites[sprite];}
+    int spriteStart(int sprite=0) {return m_startTimes[sprite];}
+    int stateIndex(SpriteState* s){return m_states.indexOf(s);}
+    SpriteState* state(int idx){return m_states[idx];}
+    int stateCount() {return m_states.count();}
+    int maxFrames();
+
+    void setGoal(int state, int sprite=0, bool jump=false);
+    QImage assembledImage();
+
+    void startSprite(int index=0);
+
+signals:
+
+    void globalGoalChanged(QString arg);
+
+public slots:
+    void setGlobalGoal(QString arg)
+    {
+        if (m_globalGoal != arg) {
+            m_globalGoal = arg;
+            emit globalGoalChanged(arg);
+        }
+    }
+
+    uint updateSprites(uint time);
+
+private:
+    void restartSprite(int sprite);
+    void addToUpdateList(uint t, int idx);
+    int goalSeek(int curState, int spriteIdx, int dist=-1);
+    QList<SpriteState*> m_states;
+    QVector<int> m_sprites;//int is the index in m_states of the current state
+    QVector<int> m_goals;
+    QVector<int> m_startTimes;
+    QList<QPair<uint, QList<int> > > m_stateUpdates;//### This could be done faster
+
+    QTime m_advanceTime;
+    uint m_timeOffset;
+    QString m_globalGoal;
+    int m_maxFrames;
+};
+
+//Common use is to have your own list property which is transparently an engine
+inline void spriteAppend(QDeclarativeListProperty<SpriteState> *p, SpriteState* s)
+{
+    reinterpret_cast<QList<SpriteState *> *>(p->data)->append(s);
+    p->object->metaObject()->invokeMethod(p->object, "createEngine");
+}
+
+inline SpriteState* spriteAt(QDeclarativeListProperty<SpriteState> *p, int idx)
+{
+    return reinterpret_cast<QList<SpriteState *> *>(p->data)->at(idx);
+}
+
+inline void spriteClear(QDeclarativeListProperty<SpriteState> *p)
+{
+    reinterpret_cast<QList<SpriteState *> *>(p->data)->clear();
+    p->object->metaObject()->invokeMethod(p->object, "createEngine");
+}
+
+inline int spriteCount(QDeclarativeListProperty<SpriteState> *p)
+{
+    return reinterpret_cast<QList<SpriteState *> *>(p->data)->count();
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SPRITEENGINE_H
diff --git a/src/imports/particles/spritegoalaffector.cpp b/src/imports/particles/spritegoalaffector.cpp
new file mode 100644
index 0000000000..2bd56c4a07
--- /dev/null
+++ b/src/imports/particles/spritegoalaffector.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spritegoalaffector.h"
+#include "spriteparticle.h"
+#include "spriteengine.h"
+#include "spritestate.h"
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+SpriteGoalAffector::SpriteGoalAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_goalIdx(-1), m_jump(false)
+{
+}
+
+void SpriteGoalAffector::updateStateIndex(SpriteEngine* e)
+{
+    m_lastEngine = e;
+    for(int i=0; i<e->stateCount(); i++){
+        if(e->state(i)->name() == m_goalState){
+            m_goalIdx = i;
+            return;
+        }
+    }
+    m_goalIdx = -1;//Can't find it
+}
+
+void SpriteGoalAffector::setGoalState(QString arg)
+{
+    if (m_goalState != arg) {
+        m_goalState = arg;
+        emit goalStateChanged(arg);
+        if(m_goalState.isEmpty())
+            m_goalIdx = -1;
+        else
+            m_goalIdx = -2;
+    }
+}
+
+bool SpriteGoalAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    Q_UNUSED(dt);
+    //TODO: Affect all engines
+    SpriteEngine *engine = 0;
+    foreach(ParticleType *p, m_system->m_groupData[d->group]->types)
+        if(qobject_cast<SpriteParticle*>(p))
+            engine = qobject_cast<SpriteParticle*>(p)->spriteEngine();
+    if(!engine)
+        return false;
+
+    if(m_goalIdx == -2 || engine != m_lastEngine)
+        updateStateIndex(engine);
+    if(engine->spriteState(d->particleIndex) != m_goalIdx){
+        engine->setGoal(m_goalIdx, d->particleIndex, m_jump);
+        emit affected(QPointF(d->curX(), d->curY()));//###Expensive if unconnected? Move to Affector?
+        return true; //Doesn't affect particle data, but necessary for onceOff
+    }
+    return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/spritegoalaffector.h b/src/imports/particles/spritegoalaffector.h
new file mode 100644
index 0000000000..3a51562be2
--- /dev/null
+++ b/src/imports/particles/spritegoalaffector.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPRITEGOALAFFECTOR_H
+#define SPRITEGOALAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class SpriteEngine;
+
+class SpriteGoalAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(QString goalState READ goalState WRITE setGoalState NOTIFY goalStateChanged)
+    Q_PROPERTY(bool jump READ jump WRITE setJump NOTIFY jumpChanged)
+public:
+    explicit SpriteGoalAffector(QSGItem *parent = 0);
+
+    QString goalState() const
+    {
+        return m_goalState;
+    }
+
+    bool jump() const
+    {
+        return m_jump;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void goalStateChanged(QString arg);
+
+    void jumpChanged(bool arg);
+
+    void affected(const QPointF &pos);
+public slots:
+
+void setGoalState(QString arg);
+
+void setJump(bool arg)
+{
+    if (m_jump != arg) {
+        m_jump = arg;
+        emit jumpChanged(arg);
+    }
+}
+
+private:
+    void updateStateIndex(SpriteEngine* e);
+    QString m_goalState;
+    int m_goalIdx;
+    SpriteEngine* m_lastEngine;
+    bool m_jump;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SPRITEGOALAFFECTOR_H
diff --git a/src/imports/particles/spriteimage.cpp b/src/imports/particles/spriteimage.cpp
new file mode 100644
index 0000000000..b0f8564f7b
--- /dev/null
+++ b/src/imports/particles/spriteimage.cpp
@@ -0,0 +1,354 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spriteimage.h"
+#include "spritestate.h"
+#include "spriteengine.h"
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include <qsgnode.h>
+#include <qsgengine.h>
+#include <qsgtexturematerial.h>
+#include <qsgtexture.h>
+#include <QFile>
+#include <cmath>
+#include <qmath.h>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+class SpriteMaterial : public QSGMaterial
+{
+public:
+    SpriteMaterial();
+    virtual ~SpriteMaterial();
+    virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const
+    {
+        return this - static_cast<const SpriteMaterial *>(other);
+    }
+
+    QSGTexture *texture;
+
+    qreal timestamp;
+    qreal timelength;
+    int framecount;
+    int animcount;
+    int width;
+    int height;
+};
+
+SpriteMaterial::SpriteMaterial()
+    : timestamp(0)
+    , timelength(1)
+    , framecount(1)
+    , animcount(1)
+    , width(0)
+    , height(0)
+{
+    setFlag(Blending, true);
+}
+
+SpriteMaterial::~SpriteMaterial()
+{
+    delete texture;
+}
+
+class SpriteMaterialData : public QSGMaterialShader
+{
+public:
+    SpriteMaterialData(const char *vertexFile = 0, const char *fragmentFile = 0)
+    {
+        QFile vf(vertexFile ? vertexFile : ":resources/spriteimagevertex.shader");
+        vf.open(QFile::ReadOnly);
+        m_vertex_code = vf.readAll();
+
+        QFile ff(fragmentFile ? fragmentFile : ":resources/spriteimagefragment.shader");
+        ff.open(QFile::ReadOnly);
+        m_fragment_code = ff.readAll();
+
+        Q_ASSERT(!m_vertex_code.isNull());
+        Q_ASSERT(!m_fragment_code.isNull());
+    }
+
+    void deactivate() {
+        QSGMaterialShader::deactivate();
+
+        for (int i=0; i<8; ++i) {
+            m_program.setAttributeArray(i, GL_FLOAT, chunkOfBytes, 1, 0);
+        }
+    }
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *)
+    {
+        SpriteMaterial *m = static_cast<SpriteMaterial *>(newEffect);
+        m->texture->bind();
+
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+        m_program.setUniformValue(m_timestamp_id, (float) m->timestamp);
+        m_program.setUniformValue(m_framecount_id, (float) m->framecount);
+        m_program.setUniformValue(m_animcount_id, (float) m->animcount);
+        m_program.setUniformValue(m_width_id, (float) m->width);
+        m_program.setUniformValue(m_height_id, (float) m->height);
+
+        if (state.isMatrixDirty())
+            m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+    }
+
+    virtual void initialize() {
+        m_matrix_id = m_program.uniformLocation("matrix");
+        m_opacity_id = m_program.uniformLocation("opacity");
+        m_timestamp_id = m_program.uniformLocation("timestamp");
+        m_framecount_id = m_program.uniformLocation("framecount");
+        m_animcount_id = m_program.uniformLocation("animcount");
+        m_width_id = m_program.uniformLocation("width");
+        m_height_id = m_program.uniformLocation("height");
+    }
+
+    virtual const char *vertexShader() const { return m_vertex_code.constData(); }
+    virtual const char *fragmentShader() const { return m_fragment_code.constData(); }
+
+    virtual char const *const *attributeNames() const {
+        static const char *attr[] = {
+           "vTex",
+           "vAnimData",
+            0
+        };
+        return attr;
+    }
+
+    virtual bool isColorTable() const { return false; }
+
+    int m_matrix_id;
+    int m_opacity_id;
+    int m_timestamp_id;
+    int m_framecount_id;
+    int m_animcount_id;
+    int m_width_id;
+    int m_height_id;
+
+    QByteArray m_vertex_code;
+    QByteArray m_fragment_code;
+
+    static float chunkOfBytes[1024];
+};
+float SpriteMaterialData::chunkOfBytes[1024];
+
+QSGMaterialShader *SpriteMaterial::createShader() const
+{
+    return new SpriteMaterialData;
+}
+
+struct SpriteVertex {
+    float tx;
+    float ty;
+    float animIdx;
+    float frameDuration;
+    float frameCount;
+    float animT;
+};
+
+struct SpriteVertices {
+    SpriteVertex v1;
+    SpriteVertex v2;
+    SpriteVertex v3;
+    SpriteVertex v4;
+};
+
+SpriteImage::SpriteImage(QSGItem *parent) :
+    QSGItem(parent)
+    , m_node(0)
+    , m_material(0)
+    , m_spriteEngine(0)
+    , m_pleaseReset(false)
+    , m_running(true)
+{
+    setFlag(ItemHasContents);
+    connect(this, SIGNAL(runningChanged(bool)),
+            this, SLOT(update()));
+}
+
+QDeclarativeListProperty<SpriteState> SpriteImage::sprites()
+{
+    return QDeclarativeListProperty<SpriteState>(this, &m_sprites, spriteAppend, spriteCount, spriteAt, spriteClear);
+}
+
+void SpriteImage::createEngine()
+{
+    //TODO: delay until component complete
+    if(m_spriteEngine)
+        delete m_spriteEngine;
+    if(m_sprites.count())
+        m_spriteEngine = new SpriteEngine(m_sprites, this);
+    else
+        m_spriteEngine = 0;
+    reset();
+}
+
+static QSGGeometry::Attribute SpriteImage_Attributes[] = {
+    { 0, 2, GL_FLOAT },            // tex
+    { 1, 4, GL_FLOAT }             // animData
+};
+
+static QSGGeometry::AttributeSet SpriteImage_AttributeSet =
+{
+    2, // Attribute Count
+    (4 + 2) * sizeof(float),
+    SpriteImage_Attributes
+};
+
+QSGGeometryNode* SpriteImage::buildNode()
+{
+    if (!m_spriteEngine) {
+        qWarning() << "SpriteImage: No sprite engine...";
+        return 0;
+    }
+
+    if (m_material) {
+        delete m_material;
+        m_material = 0;
+    }
+
+    m_material = new SpriteMaterial();
+
+    QImage image = m_spriteEngine->assembledImage();
+    if(image.isNull())
+        return 0;
+    m_material->texture = sceneGraphEngine()->createTextureFromImage(image);
+    m_material->texture->setFiltering(QSGTexture::Linear);
+    m_material->framecount = m_spriteEngine->maxFrames();
+
+    int vCount = 4;
+    int iCount = 6;
+    QSGGeometry *g = new QSGGeometry(SpriteImage_AttributeSet, vCount, iCount);
+    g->setDrawingMode(GL_TRIANGLES);
+
+    SpriteVertices *p = (SpriteVertices *) g->vertexData();
+    p->v1.animT = p->v2.animT = p->v3.animT = p->v4.animT = 0;
+    p->v1.animIdx = p->v2.animIdx = p->v3.animIdx = p->v4.animIdx = 0;
+    SpriteState* state = m_spriteEngine->state(0);
+    p->v1.frameCount = p->v2.frameCount = p->v3.frameCount = p->v4.frameCount = state->frames();
+    p->v1.frameDuration = p->v2.frameDuration = p->v3.frameDuration = p->v4.frameDuration = state->duration();
+    m_spriteEngine->startSprite(0);
+
+    p->v1.tx = 0;
+    p->v1.ty = 0;
+
+    p->v2.tx = 1.0;
+    p->v2.ty = 0;
+
+    p->v3.tx = 0;
+    p->v3.ty = 1.0;
+
+    p->v4.tx = 1.0;
+    p->v4.ty = 1.0;
+
+    quint16 *indices = g->indexDataAsUShort();
+    indices[0] = 0;
+    indices[1] = 1;
+    indices[2] = 2;
+    indices[3] = 1;
+    indices[4] = 3;
+    indices[5] = 2;
+
+
+    m_timestamp.start();
+    m_node = new QSGGeometryNode();
+    m_node->setGeometry(g);
+    m_node->setMaterial(m_material);
+    return m_node;
+}
+
+void SpriteImage::reset()
+{
+    m_pleaseReset = true;
+}
+
+QSGNode *SpriteImage::updatePaintNode(QSGNode *, UpdatePaintNodeData *)
+{
+    if(m_pleaseReset){
+        delete m_node;
+        delete m_material;
+
+        m_node = 0;
+        m_material = 0;
+        m_pleaseReset = false;
+    }
+
+    prepareNextFrame();
+
+    if(m_running){
+        update();
+        if (m_node)
+            m_node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    return m_node;
+}
+
+void SpriteImage::prepareNextFrame()
+{
+    if (m_node == 0)
+        m_node = buildNode();
+    if (m_node == 0) //error creating node
+        return;
+
+    uint timeInt = m_timestamp.elapsed();
+    qreal time =  timeInt / 1000.;
+    m_material->timestamp = time;
+    m_material->animcount = m_spriteEngine->stateCount();
+    m_material->height = height();
+    m_material->width = width();
+
+    //Advance State
+    SpriteVertices *p = (SpriteVertices *) m_node->geometry()->vertexData();
+    m_spriteEngine->updateSprites(timeInt);
+    int curIdx = m_spriteEngine->spriteState();
+    if(curIdx != p->v1.animIdx){
+        p->v1.animIdx = p->v2.animIdx = p->v3.animIdx = p->v4.animIdx = curIdx;
+        p->v1.animT = p->v2.animT = p->v3.animT = p->v4.animT = m_spriteEngine->spriteStart()/1000.0;
+        p->v1.frameCount = p->v2.frameCount = p->v3.frameCount = p->v4.frameCount = m_spriteEngine->state(curIdx)->frames();
+        p->v1.frameDuration = p->v2.frameDuration = p->v3.frameDuration = p->v4.frameDuration = m_spriteEngine->state(curIdx)->duration();
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/spriteimage.h b/src/imports/particles/spriteimage.h
new file mode 100644
index 0000000000..cd73c97333
--- /dev/null
+++ b/src/imports/particles/spriteimage.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPRITEIMAGE_H
+#define SPRITEIMAGE_H
+
+#include <QSGItem>
+#include <QTime>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QSGContext;
+class SpriteState;
+class SpriteEngine;
+class QSGGeometryNode;
+class SpriteMaterial;
+class SpriteImage : public QSGItem
+{
+    Q_OBJECT
+    Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged)
+    //###try to share similar spriteEngines for less overhead?
+    Q_PROPERTY(QDeclarativeListProperty<SpriteState> sprites READ sprites)
+    Q_CLASSINFO("DefaultProperty", "sprites")
+
+public:
+    explicit SpriteImage(QSGItem *parent = 0);
+
+    QDeclarativeListProperty<SpriteState> sprites();
+
+    bool running() const
+    {
+        return m_running;
+    }
+
+signals:
+
+
+    void runningChanged(bool arg);
+
+public slots:
+
+void setRunning(bool arg)
+{
+    if (m_running != arg) {
+        m_running = arg;
+        emit runningChanged(arg);
+    }
+}
+
+private slots:
+    void createEngine();
+protected:
+    void reset();
+    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+private:
+    void prepareNextFrame();
+    QSGGeometryNode* buildNode();
+    QSGGeometryNode *m_node;
+    SpriteMaterial *m_material;
+    QList<SpriteState*> m_sprites;
+    SpriteEngine* m_spriteEngine;
+    QTime m_timestamp;
+    int m_maxFrames;
+    bool m_pleaseReset;
+    bool m_running;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SPRITEIMAGE_H
diff --git a/src/imports/particles/spriteparticle.cpp b/src/imports/particles/spriteparticle.cpp
new file mode 100644
index 0000000000..dcd8f4a89b
--- /dev/null
+++ b/src/imports/particles/spriteparticle.cpp
@@ -0,0 +1,450 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spriteparticle.h"
+#include "spritestate.h"
+#include "spriteengine.h"
+#include "particleemitter.h"
+#include <private/qsgcontext_p.h>
+#include <private/qsgadaptationlayer_p.h>
+#include <qsgnode.h>
+#include <qsgtexturematerial.h>
+#include <qsgengine.h>
+#include <qsgtexture.h>
+#include <QFile>
+#include <cmath>
+#include <qmath.h>
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+class SpriteParticlesMaterial : public QSGMaterial
+{
+public:
+    SpriteParticlesMaterial();
+    virtual ~SpriteParticlesMaterial();
+    virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
+    virtual QSGMaterialShader *createShader() const;
+    virtual int compare(const QSGMaterial *other) const
+    {
+        return this - static_cast<const SpriteParticlesMaterial *>(other);
+    }
+
+    QSGTexture *texture;
+
+    qreal timestamp;
+    int framecount;
+    int animcount;
+};
+
+SpriteParticlesMaterial::SpriteParticlesMaterial()
+    : timestamp(0)
+    , framecount(1)
+    , animcount(1)
+{
+    setFlag(Blending, true);
+}
+
+SpriteParticlesMaterial::~SpriteParticlesMaterial()
+{
+    delete texture;
+}
+
+class SpriteParticlesMaterialData : public QSGMaterialShader
+{
+public:
+    SpriteParticlesMaterialData(const char *vertexFile = 0, const char *fragmentFile = 0)
+    {
+        QFile vf(vertexFile ? vertexFile : ":resources/spritevertex.shader");
+        vf.open(QFile::ReadOnly);
+        m_vertex_code = vf.readAll();
+
+        QFile ff(fragmentFile ? fragmentFile : ":resources/spritefragment.shader");
+        ff.open(QFile::ReadOnly);
+        m_fragment_code = ff.readAll();
+
+        Q_ASSERT(!m_vertex_code.isNull());
+        Q_ASSERT(!m_fragment_code.isNull());
+    }
+
+    void deactivate() {
+        QSGMaterialShader::deactivate();
+
+        for (int i=0; i<8; ++i) {
+            m_program.setAttributeArray(i, GL_FLOAT, chunkOfBytes, 1, 0);
+        }
+    }
+
+    virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *)
+    {
+        SpriteParticlesMaterial *m = static_cast<SpriteParticlesMaterial *>(newEffect);
+        m->texture->bind();
+
+        m_program.setUniformValue(m_opacity_id, state.opacity());
+        m_program.setUniformValue(m_timestamp_id, (float) m->timestamp);
+        m_program.setUniformValue(m_framecount_id, (float) m->framecount);
+        m_program.setUniformValue(m_animcount_id, (float) m->animcount);
+
+        if (state.isMatrixDirty())
+            m_program.setUniformValue(m_matrix_id, state.combinedMatrix());
+    }
+
+    virtual void initialize() {
+        m_matrix_id = m_program.uniformLocation("matrix");
+        m_opacity_id = m_program.uniformLocation("opacity");
+        m_timestamp_id = m_program.uniformLocation("timestamp");
+        m_framecount_id = m_program.uniformLocation("framecount");
+        m_animcount_id = m_program.uniformLocation("animcount");
+    }
+
+    virtual const char *vertexShader() const { return m_vertex_code.constData(); }
+    virtual const char *fragmentShader() const { return m_fragment_code.constData(); }
+
+    virtual char const *const *attributeNames() const {
+        static const char *attr[] = {
+            "vPos",
+            "vTex",
+            "vData",
+            "vVec",
+            "vAnimData",
+            0
+        };
+        return attr;
+    }
+
+    virtual bool isColorTable() const { return false; }
+
+    int m_matrix_id;
+    int m_opacity_id;
+    int m_timestamp_id;
+    int m_framecount_id;
+    int m_animcount_id;
+
+    QByteArray m_vertex_code;
+    QByteArray m_fragment_code;
+
+    static float chunkOfBytes[1024];
+};
+float SpriteParticlesMaterialData::chunkOfBytes[1024];
+
+QSGMaterialShader *SpriteParticlesMaterial::createShader() const
+{
+    return new SpriteParticlesMaterialData;
+}
+
+struct SpriteParticleVertex {
+    float x;
+    float y;
+    float tx;
+    float ty;
+    float t;
+    float lifeSpan;
+    float size;
+    float endSize;
+    float sx;
+    float sy;
+    float ax;
+    float ay;
+    float animIdx;
+    float frameDuration;
+    float frameCount;
+    float animT;
+};
+
+struct SpriteParticleVertices {
+    SpriteParticleVertex v1;
+    SpriteParticleVertex v2;
+    SpriteParticleVertex v3;
+    SpriteParticleVertex v4;
+};
+
+SpriteParticle::SpriteParticle(QSGItem *parent) :
+    ParticleType(parent)
+    , m_node(0)
+    , m_material(0)
+    , m_spriteEngine(0)
+{
+    setFlag(ItemHasContents);
+ }
+QDeclarativeListProperty<SpriteState> SpriteParticle::sprites()
+{
+    return QDeclarativeListProperty<SpriteState>(this, &m_sprites, spriteAppend, spriteCount, spriteAt, spriteClear);
+}
+
+void SpriteParticle::createEngine()
+{
+    if(m_spriteEngine)
+        delete m_spriteEngine;
+    if(m_sprites.count())
+        m_spriteEngine = new SpriteEngine(m_sprites, this);
+    else
+        m_spriteEngine = 0;
+    reset();//###this is probably out of updatePaintNode and shouldn't be
+}
+
+void SpriteParticle::setCount(int c)
+{
+    ParticleType::setCount(c);
+    m_pleaseReset = true;
+}
+
+static QSGGeometry::Attribute SpriteParticle_Attributes[] = {
+    { 0, 2, GL_FLOAT },             // Position
+    { 1, 2, GL_FLOAT },             // TexCoord
+    { 2, 4, GL_FLOAT },             // Data
+    { 3, 4, GL_FLOAT },             // Vectors
+    { 4, 4, GL_FLOAT }              // Colors
+};
+
+static QSGGeometry::AttributeSet SpriteParticle_AttributeSet =
+{
+    5, // Attribute Count
+    (2 + 2 + 4 + 4 + 4) * sizeof(float),
+    SpriteParticle_Attributes
+};
+
+
+
+QSGGeometryNode* SpriteParticle::buildParticleNode()
+{
+    if (m_count * 4 > 0xffff) {
+        qWarning() << "SpriteParticle: too many particles...";
+        return 0;
+    }
+
+    if (m_count * 4 == 0) {
+        qWarning() << "SpriteParticle: No particles...";
+        return 0;
+    }
+
+    if (!m_spriteEngine) {
+        qWarning() << "SpriteParticle: No sprite engine...";
+        return 0;
+    }
+
+    if (m_material) {
+        delete m_material;
+        m_material = 0;
+    }
+
+    m_material = new SpriteParticlesMaterial();
+
+    QImage image = m_spriteEngine->assembledImage();
+    if(image.isNull())
+        return 0;
+    m_material->texture = sceneGraphEngine()->createTextureFromImage(image);
+    m_material->texture->setFiltering(QSGTexture::Linear);
+    m_material->framecount = m_spriteEngine->maxFrames();
+    m_spriteEngine->setCount(m_count);
+
+    int vCount = m_count * 4;
+    int iCount = m_count * 6;
+    QSGGeometry *g = new QSGGeometry(SpriteParticle_AttributeSet, vCount, iCount);
+    g->setDrawingMode(GL_TRIANGLES);
+
+    SpriteParticleVertex *vertices = (SpriteParticleVertex *) g->vertexData();
+    for (int p=0; p<m_count; ++p) {
+
+        for (int i=0; i<4; ++i) {
+            vertices[i].x = 0;
+            vertices[i].y = 0;
+            vertices[i].t = -1;
+            vertices[i].lifeSpan = -1;
+            vertices[i].size = 0;
+            vertices[i].endSize = 0;
+            vertices[i].sx = 0;
+            vertices[i].sy = 0;
+            vertices[i].ax = 0;
+            vertices[i].ay = 0;
+            vertices[i].animIdx = 0;
+            vertices[i].frameDuration = 1;
+            vertices[i].frameCount = 1;
+            vertices[i].animT = -1;
+
+        }
+
+        vertices[0].tx = 0;
+        vertices[0].ty = 0;
+
+        vertices[1].tx = 1.0;
+        vertices[1].ty = 0;
+
+        vertices[2].tx = 0;
+        vertices[2].ty = 1.0;
+
+        vertices[3].tx = 1.0;
+        vertices[3].ty = 1.0;
+
+        vertices += 4;
+    }
+
+    quint16 *indices = g->indexDataAsUShort();
+    for (int i=0; i<m_count; ++i) {
+        int o = i * 4;
+        indices[0] = o;
+        indices[1] = o + 1;
+        indices[2] = o + 2;
+        indices[3] = o + 1;
+        indices[4] = o + 3;
+        indices[5] = o + 2;
+        indices += 6;
+    }
+
+
+    m_node = new QSGGeometryNode();
+    m_node->setGeometry(g);
+    m_node->setMaterial(m_material);
+    m_last_particle = 0;
+    return m_node;
+}
+
+void SpriteParticle::vertexCopy(SpriteParticleVertex &b,const ParticleVertex& a)
+{
+    b.x = a.x + m_systemOffset.x();
+    b.y = a.y + m_systemOffset.y();
+    b.t = a.t;
+    b.lifeSpan = a.lifeSpan;
+    b.size = a.size;
+    b.endSize = a.endSize;
+    b.sx = a.sx;
+    b.sy = a.sy;
+    b.ax = a.ax;
+    b.ay = a.ay;
+}
+
+void SpriteParticle::load(ParticleData *d)
+{
+    if (m_node == 0) //error creating node
+        return;
+
+    SpriteParticleVertices *particles = (SpriteParticleVertices *) m_node->geometry()->vertexData();
+    int pos = particleTypeIndex(d);
+    SpriteParticleVertices &p = particles[pos];
+
+    // Initial Sprite State
+    p.v1.animT = p.v2.animT = p.v3.animT = p.v4.animT = p.v1.t;
+    p.v1.animIdx = p.v2.animIdx = p.v3.animIdx = p.v4.animIdx = 0;
+    SpriteState* state = m_spriteEngine->state(0);
+    p.v1.frameCount = p.v2.frameCount = p.v3.frameCount = p.v4.frameCount = state->frames();
+    p.v1.frameDuration = p.v2.frameDuration = p.v3.frameDuration = p.v4.frameDuration = state->duration();
+    m_spriteEngine->startSprite(pos);
+
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+
+}
+
+void SpriteParticle::reload(ParticleData *d)
+{
+    if (m_node == 0) //error creating node
+        return;
+
+    SpriteParticleVertices *particles = (SpriteParticleVertices *) m_node->geometry()->vertexData();
+    int pos = particleTypeIndex(d);
+    SpriteParticleVertices &p = particles[pos];
+
+    vertexCopy(p.v1, d->pv);
+    vertexCopy(p.v2, d->pv);
+    vertexCopy(p.v3, d->pv);
+    vertexCopy(p.v4, d->pv);
+}
+
+
+QSGNode *SpriteParticle::updatePaintNode(QSGNode *, UpdatePaintNodeData *)
+{
+    if(m_pleaseReset){
+        if(m_node)
+            delete m_node;
+        if(m_material)
+            delete m_material;
+
+        m_node = 0;
+        m_material = 0;
+        m_pleaseReset = false;
+    }
+    if(m_system&& m_system->isRunning())
+        prepareNextFrame();
+    if (m_node){
+        update();
+        m_node->markDirty(QSGNode::DirtyMaterial);
+    }
+
+    return m_node;
+}
+
+void SpriteParticle::prepareNextFrame()
+{
+    if (m_node == 0){    //TODO: Staggered loading (as emitted) (is it just moving this check to load()?)
+        m_node = buildParticleNode();
+        if(m_node == 0)
+            return;
+    }
+    uint timeStamp = m_system->systemSync(this);
+
+
+    qreal time =  timeStamp / 1000.;
+    m_material->timestamp = time;
+    m_material->animcount = m_spriteEngine->stateCount();
+
+    //Advance State
+    SpriteParticleVertices *particles = (SpriteParticleVertices *) m_node->geometry()->vertexData();
+    m_spriteEngine->updateSprites(timeStamp);
+    for(int i=0; i<m_count; i++){
+        SpriteParticleVertices &p = particles[i];
+        int curIdx = m_spriteEngine->spriteState(i);
+        if(curIdx != p.v1.animIdx){
+            p.v1.animIdx = p.v2.animIdx = p.v3.animIdx = p.v4.animIdx = curIdx;
+            p.v1.animT = p.v2.animT = p.v3.animT = p.v4.animT = m_spriteEngine->spriteStart(i)/1000.0;
+            p.v1.frameCount = p.v2.frameCount = p.v3.frameCount = p.v4.frameCount = m_spriteEngine->state(curIdx)->frames();
+            p.v1.frameDuration = p.v2.frameDuration = p.v3.frameDuration = p.v4.frameDuration = m_spriteEngine->state(curIdx)->duration();
+        }
+    }
+}
+
+void SpriteParticle::reset()
+{
+    ParticleType::reset();
+    m_pleaseReset = true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/spriteparticle.h b/src/imports/particles/spriteparticle.h
new file mode 100644
index 0000000000..ed861f5c5e
--- /dev/null
+++ b/src/imports/particles/spriteparticle.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPRITEPARTICLE_H
+#define SPRITEPARTICLE_H
+#include "particle.h"
+#include <QDeclarativeListProperty>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class SpriteState;
+class SpriteEngine;
+class QSGGeometryNode;
+class SpriteParticlesMaterial;
+class SpriteParticleVertex;
+
+class SpriteParticle : public ParticleType
+{
+    Q_OBJECT
+    Q_PROPERTY(QDeclarativeListProperty<SpriteState> sprites READ sprites)
+    Q_CLASSINFO("DefaultProperty", "sprites")
+public:
+    explicit SpriteParticle(QSGItem *parent = 0);
+    virtual void load(ParticleData*);
+    virtual void reload(ParticleData*);
+    virtual void setCount(int c);
+
+    QDeclarativeListProperty<SpriteState> sprites();
+    SpriteEngine* spriteEngine() {return m_spriteEngine;}
+signals:
+
+public slots:
+protected:
+    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    void reset();
+    void prepareNextFrame();
+    QSGGeometryNode* buildParticleNode();
+private slots:
+    void createEngine();
+private:
+    QSGGeometryNode *m_node;
+    SpriteParticlesMaterial *m_material;
+
+    int m_particle_duration;
+    int m_last_particle;
+    QTime m_timestamp;
+
+    QList<SpriteState*> m_sprites;
+    SpriteEngine* m_spriteEngine;
+
+    void vertexCopy(SpriteParticleVertex &b,const ParticleVertex& a);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SPRITEPARTICLE_H
diff --git a/src/imports/particles/spriteparticles.qrc b/src/imports/particles/spriteparticles.qrc
new file mode 100644
index 0000000000..c0c7a52036
--- /dev/null
+++ b/src/imports/particles/spriteparticles.qrc
@@ -0,0 +1,16 @@
+<RCC>
+    <qresource prefix="/">
+        <file>resources/spritefragment.shader</file>
+        <file>resources/spritevertex.shader</file>
+        <file>resources/ctfragment.shader</file>
+        <file>resources/ctvertex.shader</file>
+        <file>resources/trailsfragment.shader</file>
+        <file>resources/trailsvertex.shader</file>
+        <file>resources/spriteimagefragment.shader</file>
+        <file>resources/spriteimagevertex.shader</file>
+        <file>resources/identitytable.png</file>
+        <file>resources/defaultFadeInOut.png</file>
+        <file>resources/deformablefragment.shader</file>
+        <file>resources/deformablevertex.shader</file>
+    </qresource>
+</RCC>
diff --git a/src/imports/particles/spritestate.cpp b/src/imports/particles/spritestate.cpp
new file mode 100644
index 0000000000..c3cc249fde
--- /dev/null
+++ b/src/imports/particles/spritestate.cpp
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spritestate.h"
+
+QT_BEGIN_NAMESPACE
+
+SpriteState::SpriteState(QObject *parent) :
+    QObject(parent)
+    , m_frames(1)
+    , m_duration(1000)
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/spritestate.h b/src/imports/particles/spritestate.h
new file mode 100644
index 0000000000..1dbc747ae8
--- /dev/null
+++ b/src/imports/particles/spritestate.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SPRITESTATE_H
+#define SPRITESTATE_H
+
+#include <QObject>
+#include <QUrl>
+#include <QVariantMap>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class SpriteState : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+    Q_PROPERTY(int frames READ frames WRITE setFrames NOTIFY framesChanged)
+    Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged)
+    Q_PROPERTY(int durationVariance READ durationVariance WRITE setDurationVariance NOTIFY durationVarianceChanged)
+    Q_PROPERTY(qreal speedModifiesDuration READ speedModifer WRITE setSpeedModifier NOTIFY speedModifierChanged)
+    Q_PROPERTY(QVariantMap to READ to WRITE setTo NOTIFY toChanged)
+
+public:
+    explicit SpriteState(QObject *parent = 0);
+
+    QUrl source() const
+    {
+        return m_source;
+    }
+
+    int frames() const
+    {
+        return m_frames;
+    }
+
+    int duration() const
+    {
+        return m_duration;
+    }
+
+    QString name() const
+    {
+        return m_name;
+    }
+
+    QVariantMap to() const
+    {
+        return m_to;
+    }
+
+    qreal speedModifer() const
+    {
+        return m_speedModifier;
+    }
+
+    int durationVariance() const
+    {
+        return m_durationVariance;
+    }
+
+signals:
+
+    void sourceChanged(QUrl arg);
+
+    void framesChanged(int arg);
+
+    void durationChanged(int arg);
+
+    void nameChanged(QString arg);
+
+    void toChanged(QVariantMap arg);
+
+    void speedModifierChanged(qreal arg);
+
+    void durationVarianceChanged(int arg);
+
+public slots:
+
+    void setSource(QUrl arg)
+    {
+        if (m_source != arg) {
+            m_source = arg;
+            emit sourceChanged(arg);
+        }
+    }
+
+    void setFrames(int arg)
+    {
+        if (m_frames != arg) {
+            m_frames = arg;
+            emit framesChanged(arg);
+        }
+    }
+
+    void setDuration(int arg)
+    {
+        if (m_duration != arg) {
+            m_duration = arg;
+            emit durationChanged(arg);
+        }
+    }
+
+    void setName(QString arg)
+    {
+        if (m_name != arg) {
+            m_name = arg;
+            emit nameChanged(arg);
+        }
+    }
+
+    void setTo(QVariantMap arg)
+    {
+        if (m_to != arg) {
+            m_to = arg;
+            emit toChanged(arg);
+        }
+    }
+
+    void setSpeedModifier(qreal arg)
+    {
+        if (m_speedModifier != arg) {
+            m_speedModifier = arg;
+            emit speedModifierChanged(arg);
+        }
+    }
+
+    void setDurationVariance(int arg)
+    {
+        if (m_durationVariance != arg) {
+            m_durationVariance = arg;
+            emit durationVarianceChanged(arg);
+        }
+    }
+
+private:
+    friend class SpriteParticle;
+    friend class SpriteEngine;
+    QUrl m_source;
+    int m_frames;
+    int m_duration;
+    QString m_name;
+    QVariantMap m_to;
+    qreal m_speedModifier;
+    int m_durationVariance;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // SPRITESTATE_H
diff --git a/src/imports/particles/swarmaffector.cpp b/src/imports/particles/swarmaffector.cpp
new file mode 100644
index 0000000000..513e8a17a7
--- /dev/null
+++ b/src/imports/particles/swarmaffector.cpp
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "swarmaffector.h"
+#include "particle.h"
+#include <cmath>
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+
+SwarmAffector::SwarmAffector(QSGItem *parent) :
+    ParticleAffector(parent), m_strength(1), m_inited(false)
+{
+    connect(this, SIGNAL(leadersChanged(QStringList)),
+            this, SLOT(updateGroupList()));
+}
+
+void SwarmAffector::ensureInit()
+{
+    if(m_inited)
+        return;
+    m_inited = true;
+    updateGroupList();
+    m_lastPos.resize(m_system->count());
+}
+
+const qreal epsilon = 0.0000001;
+bool SwarmAffector::affectParticle(ParticleData *d, qreal dt)
+{
+    ensureInit();
+    QPointF curPos(d->curX(), d->curY());
+    if(m_leaders.isEmpty() || m_leadGroups.contains(d->group)){
+        m_lastPos[d->systemIndex] = curPos;
+        if(m_leadGroups.contains(d->group))
+            return false;
+    }
+
+    qreal fx = 0.0;
+    qreal fy = 0.0;
+    for(int i=0; i < m_lastPos.count(); i++){
+        if(m_lastPos[i].isNull())
+            continue;
+        QPointF diff = m_lastPos[i] - curPos;
+        qreal r = sqrt(diff.x() * diff.x() + diff.y() * diff.y());
+        if(r == 0.0)
+            continue;
+        qreal f = m_strength * (1/r);
+        if(f < epsilon)
+            continue;
+        qreal theta = atan2(diff.y(), diff.x());
+        fx += cos(theta) * f;
+        fy += sin(theta) * f;
+    }
+    if(!fx && !fy)
+        return false;
+    d->setInstantaneousSX(d->curSX()+fx * dt);
+    d->setInstantaneousSY(d->curSY()+fy * dt);
+    return true;
+}
+
+void SwarmAffector::reset(int systemIdx)
+{
+    if(!m_system)
+        return;
+    if(!m_lastPos[systemIdx].isNull())
+        m_lastPos[systemIdx] = QPointF();
+}
+
+void SwarmAffector::updateGroupList()
+{
+    if(!m_system || !m_system->m_initialized)
+        return;
+    m_leadGroups.clear();
+    foreach(const QString &s, m_leaders)
+        m_leadGroups << m_system->m_groupIds[s];
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/swarmaffector.h b/src/imports/particles/swarmaffector.h
new file mode 100644
index 0000000000..63f77c9294
--- /dev/null
+++ b/src/imports/particles/swarmaffector.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SWARMAFFECTOR_H
+#define SWARMAFFECTOR_H
+#include "particleaffector.h"
+#include <QDeclarativeListProperty>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleType;
+
+class SwarmAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal strength READ strength WRITE setStrength NOTIFY strengthChanged)
+    Q_PROPERTY(QStringList leaders READ leaders WRITE setLeaders NOTIFY leadersChanged)
+public:
+    explicit SwarmAffector(QSGItem *parent = 0);
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+    virtual void reset(int systemIdx);
+
+    qreal strength() const
+    {
+        return m_strength;
+    }
+
+    QStringList leaders() const
+    {
+        return m_leaders;
+    }
+
+signals:
+
+    void strengthChanged(qreal arg);
+
+    void leadersChanged(QStringList arg);
+
+public slots:
+
+void setStrength(qreal arg)
+{
+    if (m_strength != arg) {
+        m_strength = arg;
+        emit strengthChanged(arg);
+    }
+}
+
+void setLeaders(QStringList arg)
+{
+    if (m_leaders != arg) {
+        m_leaders = arg;
+        emit leadersChanged(arg);
+    }
+}
+
+private:
+    void ensureInit();
+    void mapUpdate(int idx, qreal strength);
+    QVector<QPointF> m_lastPos;
+    qreal m_strength;
+    bool m_inited;
+    QStringList m_leaders;
+    QSet<int> m_leadGroups;
+private slots:
+    void updateGroupList();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // SWARMAFFECTOR_H
diff --git a/src/imports/particles/toggleaffector.cpp b/src/imports/particles/toggleaffector.cpp
new file mode 100644
index 0000000000..5e03b17684
--- /dev/null
+++ b/src/imports/particles/toggleaffector.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "toggleaffector.h"
+
+QT_BEGIN_NAMESPACE
+
+ToggleAffector::ToggleAffector(QObject *parent) :
+    ParticleAffector(parent)
+{
+}
+
+bool ToggleAffector::affect(ParticleData *d, qreal dt)
+{
+    if(m_affecting)
+        return m_affector->affect(d, dt);
+    else
+        return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/toggleaffector.h b/src/imports/particles/toggleaffector.h
new file mode 100644
index 0000000000..08e7c0e2eb
--- /dev/null
+++ b/src/imports/particles/toggleaffector.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TOGGLEAFFECTOR_H
+#define TOGGLEAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ToggleAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(bool affecting READ affecting WRITE setAffecting NOTIFY affectingChanged)
+    Q_PROPERTY(ParticleAffector* affector READ affector WRITE affector NOTIFY affectorChanged)
+    Q_CLASSINFO("DefaultProperty", "affector")
+
+public:
+    explicit ToggleAffector(QObject *parent = 0);
+    virtual bool affect(ParticleData *d, qreal dt);
+    bool affecting() const
+    {
+        return m_affecting;
+    }
+
+    ParticleAffector* affector() const
+    {
+        return m_affector;
+    }
+
+signals:
+
+    void affectingChanged(bool arg);
+
+    void affectorChanged(ParticleAffector* arg);
+
+public slots:
+void setAffecting(bool arg)
+{
+    if (m_affecting != arg) {
+        m_affecting = arg;
+        emit affectingChanged(arg);
+    }
+}
+
+void affector(ParticleAffector* arg)
+{
+    if (m_affector != arg) {
+        m_affector = arg;
+        emit affectorChanged(arg);
+    }
+}
+
+private:
+bool m_affecting;
+ParticleAffector* m_affector;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // TOGGLEAFFECTOR_H
diff --git a/src/imports/particles/trailsemitter.cpp b/src/imports/particles/trailsemitter.cpp
new file mode 100644
index 0000000000..2355670801
--- /dev/null
+++ b/src/imports/particles/trailsemitter.cpp
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "trailsemitter.h"
+#include "particlesystem.h"
+#include "particle.h"
+QT_BEGIN_NAMESPACE
+
+TrailsEmitter::TrailsEmitter(QSGItem* parent)
+    : ParticleEmitter(parent)
+    , m_speed_from_movement(0)
+    , m_particle_count(0)
+    , m_reset_last(true)
+    , m_last_timestamp(0)
+    , m_last_emission(0)
+{
+//    setFlag(ItemHasContents);
+}
+
+void TrailsEmitter::setSpeedFromMovement(qreal t)
+{
+    if (t == m_speed_from_movement)
+        return;
+    m_speed_from_movement = t;
+    emit speedFromMovementChanged();
+}
+
+void TrailsEmitter::reset()
+{
+    m_reset_last = true;
+}
+
+void TrailsEmitter::emitWindow(int timeStamp)
+{
+    if (m_system == 0)
+        return;
+    if((!m_emitting || !m_particlesPerSecond)&& !m_burstLeft && !m_emitLeft){
+        m_reset_last = true;
+        return;
+    }
+
+    if (m_reset_last) {
+        m_last_emitter = m_last_last_emitter = QPointF(x(), y());
+        m_last_timestamp = timeStamp/1000.;
+        m_last_emission = m_last_timestamp;
+        m_reset_last = false;
+    }
+
+    if(m_burstLeft){
+        m_burstLeft -= timeStamp - m_last_timestamp * 1000.;
+        if(m_burstLeft < 0){
+            if(!m_emitting)
+                timeStamp += m_burstLeft;
+            m_burstLeft = 0;
+        }
+    }
+    qreal time = timeStamp / 1000.;
+
+    qreal particleRatio = 1. / m_particlesPerSecond;
+    qreal pt = m_last_emission;
+
+    qreal opt = pt; // original particle time
+    qreal dt = time - m_last_timestamp; // timestamp delta...
+    if(!dt)
+        dt = 0.000001;
+
+    // emitter difference since last...
+    qreal dex = (x() - m_last_emitter.x());
+    qreal dey = (y() - m_last_emitter.y());
+
+    qreal ax = (m_last_last_emitter.x() + m_last_emitter.x()) / 2;
+    qreal bx = m_last_emitter.x();
+    qreal cx = (x() + m_last_emitter.x()) / 2;
+    qreal ay = (m_last_last_emitter.y() + m_last_emitter.y()) / 2;
+    qreal by = m_last_emitter.y();
+    qreal cy = (y() + m_last_emitter.y()) / 2;
+
+    qreal sizeAtEnd = m_particleEndSize >= 0 ? m_particleEndSize : m_particleSize;
+    qreal emitter_x_offset = m_last_emitter.x() - x();
+    qreal emitter_y_offset = m_last_emitter.y() - y();
+    while (pt < time || m_emitLeft) {
+        //int pos = m_last_particle % m_particle_count;
+        ParticleData* datum = m_system->newDatum(m_system->m_groupIds[m_particle]);
+        if(!datum){//skip this emission
+            if(!m_emitLeft)
+                pt += particleRatio;
+            else
+                --m_emitLeft;
+            continue;
+        }
+        datum->e = this;//###useful?
+        ParticleVertex &p = datum->pv;
+        qreal t = 1 - (pt - opt) / dt;
+        qreal vx =
+          - 2 * ax * (1 - t)
+          + 2 * bx * (1 - 2 * t)
+          + 2 * cx * t;
+        qreal vy =
+          - 2 * ay * (1 - t)
+          + 2 * by * (1 - 2 * t)
+          + 2 * cy * t;
+
+
+        // Particle timestamp
+        p.t = pt;
+        p.lifeSpan = //TODO:Promote to base class?
+                (m_particleDuration
+                 + ((rand() % ((m_particleDurationVariation*2) + 1)) - m_particleDurationVariation))
+                / 1000.0;
+
+        // Particle position
+        QRectF boundsRect(emitter_x_offset + dex * (pt - opt) / dt, emitter_y_offset + dey * (pt - opt) / dt
+                          , width(), height());
+        QPointF newPos = effectiveExtruder()->extrude(boundsRect);
+        p.x = newPos.x();
+        p.y = newPos.y();
+
+        // Particle speed
+        const QPointF &speed = m_speed->sample(newPos);
+        p.sx = speed.x()
+                + m_speed_from_movement * vx;
+        p.sy = speed.y()
+                + m_speed_from_movement * vy;
+
+        // Particle acceleration
+        const QPointF &accel = m_acceleration->sample(newPos);
+        p.ax = accel.x();
+        p.ay = accel.y();
+
+        // Particle size
+        float sizeVariation = -m_particleSizeVariation
+                + rand() / float(RAND_MAX) * m_particleSizeVariation * 2;
+
+        float size = qMax((qreal)0.0 , m_particleSize + sizeVariation);
+        float endSize = qMax((qreal)0.0 , sizeAtEnd + sizeVariation);
+
+        p.size = size;// * float(m_emitting);
+        p.endSize = endSize;// * float(m_emitting);
+
+        if(!m_emitLeft)
+            pt += particleRatio;
+        else
+            --m_emitLeft;
+
+        m_system->emitParticle(datum);
+    }
+    m_last_emission = pt;
+
+    m_last_last_last_emitter = m_last_last_emitter;
+    m_last_last_emitter = m_last_emitter;
+    m_last_emitter = QPointF(x(), y());
+    m_last_timestamp = time;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/trailsemitter.h b/src/imports/particles/trailsemitter.h
new file mode 100644
index 0000000000..1ae150c0d2
--- /dev/null
+++ b/src/imports/particles/trailsemitter.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TRAILSEMITTER_H
+#define TRAILSEMITTER_H
+
+#include <QtCore>
+#include <QtGui>
+
+#include "particleemitter.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleTrailsMaterial;
+class QSGGeometryNode;
+
+class TrailsEmitter : public ParticleEmitter
+{
+    Q_OBJECT
+
+    Q_PROPERTY(qreal speedFromMovement READ speedFromMovement WRITE setSpeedFromMovement NOTIFY speedFromMovementChanged)
+
+public:
+    explicit TrailsEmitter(QSGItem* parent=0);
+    virtual ~TrailsEmitter(){}
+    virtual void emitWindow(int timeStamp);
+
+
+    qreal speedFromMovement() const { return m_speed_from_movement; }
+    void setSpeedFromMovement(qreal s);
+
+    qreal renderOpacity() const { return m_render_opacity; }
+
+signals:
+
+    void speedFromMovementChanged();
+
+public slots:
+public:
+    virtual void reset();
+protected:
+
+private:
+
+    qreal m_speed_from_movement;
+
+    // derived values...
+    int m_particle_count;
+    bool m_reset_last;
+    qreal m_last_timestamp;
+    qreal m_last_emission;
+
+    QPointF m_last_emitter;
+    QPointF m_last_last_emitter;
+    QPointF m_last_last_last_emitter;
+
+    qreal m_render_opacity;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // TRAILSEMITTER_H
diff --git a/src/imports/particles/turbulenceaffector.cpp b/src/imports/particles/turbulenceaffector.cpp
new file mode 100644
index 0000000000..d29f09d974
--- /dev/null
+++ b/src/imports/particles/turbulenceaffector.cpp
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "turbulenceaffector.h"
+#include "particle.h"
+#include <cmath>
+#include <cstdlib>
+#include <QDebug>
+QT_BEGIN_NAMESPACE
+
+TurbulenceAffector::TurbulenceAffector(QSGItem *parent) :
+    ParticleAffector(parent),
+    m_strength(10), m_lastT(0), m_frequency(64), m_gridSize(10), m_field(0), m_inited(false)
+{
+    //TODO: Update grid on size change
+}
+
+TurbulenceAffector::~TurbulenceAffector()
+{
+    if (m_field) {
+        for(int i=0; i<m_gridSize; i++)
+            free(m_field[i]);
+        free(m_field);
+    }
+}
+
+static qreal magnitude(qreal x, qreal y)
+{
+    return sqrt(x*x + y*y);
+}
+
+void TurbulenceAffector::setSize(int arg)
+{
+    if (m_gridSize != arg) {
+        if(m_field){ //deallocate and then reallocate grid
+            for(int i=0; i<m_gridSize; i++)
+                free(m_field[i]);
+            free(m_field);
+            m_system = 0;
+        }
+        m_gridSize = arg;
+        emit sizeChanged(arg);
+    }
+}
+
+void TurbulenceAffector::ensureInit()
+{
+    if(m_inited)
+        return;
+    m_inited = true;
+    m_field = (QPointF**)malloc(m_gridSize * sizeof(QPointF*));
+    for(int i=0; i<m_gridSize; i++)
+        m_field[i]  = (QPointF*)malloc(m_gridSize * sizeof(QPointF));
+    for(int i=0; i<m_gridSize; i++)
+        for(int j=0; j<m_gridSize; j++)
+            m_field[i][j] = QPointF();
+    m_spacing = QPointF(width()/m_gridSize, height()/m_gridSize);
+    m_magSum = magnitude(m_spacing.x(), m_spacing.y())*2;
+}
+
+void TurbulenceAffector::mapUpdate()
+{
+    QPoint pos(rand() % m_gridSize, rand() % m_gridSize);
+    QPointF vector(m_strength  - (((qreal)rand() / RAND_MAX) * m_strength*2),
+                   m_strength  - (((qreal)rand() / RAND_MAX) * m_strength*2));
+    for(int i = 0; i < m_gridSize; i++){
+        for(int j = 0; j < m_gridSize; j++){
+            qreal dist = magnitude(i-pos.x(), j-pos.y());
+            m_field[i][j] += vector/(dist + 1);
+            if(magnitude(m_field[i][j].x(), m_field[i][j].y()) > m_strength){
+                //Speed limit
+                qreal theta = atan2(m_field[i][j].y(), m_field[i][j].x());
+                m_field[i][j].setX(m_strength * cos(theta));
+                m_field[i][j].setY(m_strength * sin(theta));
+            }
+        }
+    }
+}
+
+
+void TurbulenceAffector::affectSystem(qreal dt)
+{
+    if(!m_system || !m_active)
+        return;
+    ensureInit();
+    qreal period = 1.0/m_frequency;
+    qreal time = m_system->m_timeInt / 1000.0;
+    while( m_lastT < time ){
+        mapUpdate();
+        m_lastT += period;
+    }
+
+    foreach(ParticleData *d, m_system->m_data){
+        if(!d || !activeGroup(d->group))
+            return;
+        qreal fx = 0.0;
+        qreal fy = 0.0;
+        QPointF pos = QPointF(d->curX() - x(), d->curY() - y());//TODO: Offset
+        QPointF nodePos = QPointF(pos.x() / m_spacing.x(), pos.y() / m_spacing.y());
+        QSet<QPair<int, int> > nodes;
+        nodes << qMakePair((int)ceil(nodePos.x()), (int)ceil(nodePos.y()));
+        nodes << qMakePair((int)ceil(nodePos.x()), (int)floor(nodePos.y()));
+        nodes << qMakePair((int)floor(nodePos.x()), (int)ceil(nodePos.y()));
+        nodes << qMakePair((int)floor(nodePos.x()), (int)floor(nodePos.y()));
+        typedef QPair<int, int> intPair;
+        foreach(const intPair &p, nodes){
+            if(!QRect(0,0,m_gridSize-1,m_gridSize-1).contains(QPoint(p.first, p.second)))
+                continue;
+            qreal dist = magnitude(pos.x() - p.first*m_spacing.x(), pos.y() - p.second*m_spacing.y());//TODO: Mathematically valid
+            fx += m_field[p.first][p.second].x() * ((m_magSum - dist)/m_magSum);//Proportionally weight nodes
+            fy += m_field[p.first][p.second].y() * ((m_magSum - dist)/m_magSum);
+        }
+        if(fx || fy){
+            d->setInstantaneousSX(d->curSX()+ fx * dt);
+            d->setInstantaneousSY(d->curSY()+ fy * dt);
+            m_system->m_needsReset << d;
+        }
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/turbulenceaffector.h b/src/imports/particles/turbulenceaffector.h
new file mode 100644
index 0000000000..2dc2ddcdfd
--- /dev/null
+++ b/src/imports/particles/turbulenceaffector.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TURBULENCEAFFECTOR_H
+#define TURBULENCEAFFECTOR_H
+#include "particleaffector.h"
+#include <QDeclarativeListProperty>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class ParticleType;
+
+class TurbulenceAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(int strength READ strength WRITE setStrength NOTIFY strengthChanged)
+    Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged)
+    Q_PROPERTY(int gridSize READ size WRITE setSize NOTIFY sizeChanged)
+public:
+    explicit TurbulenceAffector(QSGItem *parent = 0);
+    ~TurbulenceAffector();
+    virtual void affectSystem(qreal dt);
+
+    int strength() const
+    {
+        return m_strength;
+    }
+
+    int frequency() const
+    {
+        return m_frequency;
+    }
+
+    int size() const
+    {
+        return m_gridSize;
+    }
+
+signals:
+
+    void strengthChanged(int arg);
+
+    void frequencyChanged(int arg);
+
+    void sizeChanged(int arg);
+
+public slots:
+
+void setStrength(int arg)
+{
+    if (m_strength != arg) {
+        m_strength = arg;
+        emit strengthChanged(arg);
+    }
+}
+
+void setFrequency(int arg)
+{
+    if (m_frequency != arg) {
+        m_frequency = arg;
+        emit frequencyChanged(arg);
+    }
+}
+
+void setSize(int arg);
+
+private:
+    void ensureInit();
+    void mapUpdate();
+    int m_strength;
+    qreal m_lastT;
+    int m_frequency;
+    int m_gridSize;
+    QPointF** m_field;
+    QPointF m_spacing;
+    qreal m_magSum;
+    bool m_inited;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // TURBULENCEAFFECTOR_H
diff --git a/src/imports/particles/varyingvector.cpp b/src/imports/particles/varyingvector.cpp
new file mode 100644
index 0000000000..ab09f47f79
--- /dev/null
+++ b/src/imports/particles/varyingvector.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "varyingvector.h"
+
+QT_BEGIN_NAMESPACE
+
+VaryingVector::VaryingVector(QObject *parent) :
+    QObject(parent)
+{
+}
+
+const QPointF &VaryingVector::sample(const QPointF &from)
+{
+    return m_ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/particles/varyingvector.h b/src/imports/particles/varyingvector.h
new file mode 100644
index 0000000000..9f80366d2e
--- /dev/null
+++ b/src/imports/particles/varyingvector.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VARYINGVECTOR_H
+#define VARYINGVECTOR_H
+
+#include <QObject>
+#include <QPointF>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class VaryingVector : public QObject
+{
+    Q_OBJECT
+public:
+    explicit VaryingVector(QObject *parent = 0);
+
+    virtual const QPointF &sample(const QPointF &from);
+signals:
+
+public slots:
+
+protected:
+    QPointF m_ret;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // VARYINGVECTOR_H
diff --git a/src/imports/particles/wanderaffector.cpp b/src/imports/particles/wanderaffector.cpp
new file mode 100644
index 0000000000..4d3ba5f7ce
--- /dev/null
+++ b/src/imports/particles/wanderaffector.cpp
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "wanderaffector.h"
+#include "particlesystem.h"//for ParticlesVertices
+QT_BEGIN_NAMESPACE
+
+WanderAffector::WanderAffector(QSGItem *parent) :
+    ParticleAffector(parent)
+{
+    m_needsReset = true;
+}
+
+WanderAffector::~WanderAffector()
+{
+    for(QHash<int, WanderData*>::const_iterator iter=m_wanderData.constBegin();
+        iter != m_wanderData.constEnd(); iter++)
+        delete (*iter);
+}
+
+WanderData* WanderAffector::getData(int idx)
+{
+    if(m_wanderData.contains(idx))
+        return m_wanderData[idx];
+    WanderData* d = new WanderData;
+    d->x_vel = 0;
+    d->y_vel = 0;
+    d->x_peak = m_xVariance;
+    d->y_peak = m_yVariance;
+    d->x_var = m_pace * qreal(qrand()) / RAND_MAX;
+    d->y_var = m_pace * qreal(qrand()) / RAND_MAX;
+
+    m_wanderData.insert(idx, d);
+    return d;
+}
+
+void WanderAffector::reset(int systemIdx)
+{
+    if(m_wanderData.contains(systemIdx))
+        delete m_wanderData[systemIdx];
+    m_wanderData.remove(systemIdx);
+}
+
+bool WanderAffector::affectParticle(ParticleData* data, qreal dt)
+{
+    WanderData* d = getData(data->systemIndex);
+    if (m_xVariance != 0.) {
+        if ((d->x_vel > d->x_peak && d->x_var > 0.0) || (d->x_vel < -d->x_peak && d->x_var < 0.0)) {
+            d->x_var = -d->x_var;
+            d->x_peak = m_xVariance + m_xVariance * qreal(qrand()) / RAND_MAX;
+        }
+        d->x_vel += d->x_var * dt;
+    }
+    qreal dx = dt * d->x_vel;
+
+    if (m_yVariance != 0.) {
+        if ((d->y_vel > d->y_peak && d->y_var > 0.0) || (d->y_vel < -d->y_peak && d->y_var < 0.0)) {
+            d->y_var = -d->y_var;
+            d->y_peak = m_yVariance + m_yVariance * qreal(qrand()) / RAND_MAX;
+        }
+        d->y_vel += d->y_var * dt;
+    }
+    qreal dy = dt * d->x_vel;
+
+    //### Should we be amending vel instead?
+    ParticleVertex* p = &(data->pv);
+    p->x += dx;
+
+    p->y += dy;
+    return true;
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/wanderaffector.h b/src/imports/particles/wanderaffector.h
new file mode 100644
index 0000000000..612872830b
--- /dev/null
+++ b/src/imports/particles/wanderaffector.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WANDERAFFECTOR_H
+#define WANDERAFFECTOR_H
+#include <QHash>
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+
+class SpriteEmitter;
+
+struct WanderData{
+    qreal x_vel;
+    qreal y_vel;
+    qreal x_peak;
+    qreal x_var;
+    qreal y_peak;
+    qreal y_var;
+};
+
+class WanderAffector : public ParticleAffector
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal xVariance READ xVariance WRITE setXVariance NOTIFY xVarianceChanged)
+    Q_PROPERTY(qreal yVariance READ yVariance WRITE setYVariance NOTIFY yVarianceChanged)
+    Q_PROPERTY(qreal pace READ pace WRITE setPace NOTIFY paceChanged)
+
+public:
+    explicit WanderAffector(QSGItem *parent = 0);
+    ~WanderAffector();
+    virtual void reset(int systemIdx);
+
+    qreal xVariance() const
+    {
+        return m_xVariance;
+    }
+
+    qreal yVariance() const
+    {
+        return m_yVariance;
+    }
+
+    qreal pace() const
+    {
+        return m_pace;
+    }
+protected:
+    virtual bool affectParticle(ParticleData *d, qreal dt);
+signals:
+
+    void xVarianceChanged(qreal arg);
+
+    void yVarianceChanged(qreal arg);
+
+    void paceChanged(qreal arg);
+
+public slots:
+void setXVariance(qreal arg)
+{
+    if (m_xVariance != arg) {
+        m_xVariance = arg;
+        emit xVarianceChanged(arg);
+    }
+}
+
+void setYVariance(qreal arg)
+{
+    if (m_yVariance != arg) {
+        m_yVariance = arg;
+        emit yVarianceChanged(arg);
+    }
+}
+
+void setPace(qreal arg)
+{
+    if (m_pace != arg) {
+        m_pace = arg;
+        emit paceChanged(arg);
+    }
+}
+
+private:
+    WanderData* getData(int idx);
+    QHash<int, WanderData*> m_wanderData;
+    qreal m_xVariance;
+    qreal m_yVariance;
+    qreal m_pace;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // WANDERAFFECTOR_H
diff --git a/src/imports/particles/zoneaffector.cpp b/src/imports/particles/zoneaffector.cpp
new file mode 100644
index 0000000000..cb7adca795
--- /dev/null
+++ b/src/imports/particles/zoneaffector.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "zoneaffector.h"
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+ZoneAffector::ZoneAffector(QObject *parent) :
+    ParticleAffector(parent), m_x(0), m_y(0), m_width(0), m_height(0), m_affector(0)
+{
+}
+
+bool ZoneAffector::affect(ParticleData *d, qreal dt)
+{
+    if(!m_affector)
+        return false;
+    qreal x = d->curX();
+    qreal y = d->curY();
+    if(x >= m_x && x <= m_x+m_width && y >= m_y && y <= m_y+m_height)
+        return m_affector->affect(d, dt);
+    return false;
+}
+
+void ZoneAffector::reset(int systemIdx)
+{
+    if(m_affector)
+        m_affector->reset(systemIdx);
+}
+QT_END_NAMESPACE
diff --git a/src/imports/particles/zoneaffector.h b/src/imports/particles/zoneaffector.h
new file mode 100644
index 0000000000..8c17cedba2
--- /dev/null
+++ b/src/imports/particles/zoneaffector.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ZONEAFFECTOR_H
+#define ZONEAFFECTOR_H
+#include "particleaffector.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class ZoneAffector : public ParticleAffector
+{
+    Q_OBJECT
+    //TODO: Can we get anchors in here? consider becoming an un-parented QSGItem?
+    Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged);
+    Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged);
+    Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged);
+    Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY heightChanged);
+    Q_PROPERTY(ParticleAffector* affector READ affector WRITE affector NOTIFY affectorChanged)
+    Q_CLASSINFO("DefaultProperty", "affector")
+public:
+    explicit ZoneAffector(QObject *parent = 0);
+
+    virtual bool affect(ParticleData *d, qreal dt);
+    virtual void reset(int systemIdx);
+
+    ParticleAffector* affector() const
+    {
+        return m_affector;
+    }
+
+    qreal x() const
+    {
+        return m_x;
+    }
+
+    qreal y() const
+    {
+        return m_y;
+    }
+
+    qreal width() const
+    {
+        return m_width;
+    }
+
+    qreal height() const
+    {
+        return m_height;
+    }
+
+signals:
+
+
+    void affectorChanged(ParticleAffector* arg);
+
+    void xChanged(qreal arg);
+
+    void yChanged(qreal arg);
+
+    void widthChanged(qreal arg);
+
+    void heightChanged(qreal arg);
+
+public slots:
+
+
+void affector(ParticleAffector* arg)
+{
+    if (m_affector != arg) {
+        m_affector = arg;
+        emit affectorChanged(arg);
+    }
+}
+
+void setX(qreal arg)
+{
+    if (m_x != arg) {
+        m_x = arg;
+        emit xChanged(arg);
+    }
+}
+
+void setY(qreal arg)
+{
+    if (m_y != arg) {
+        m_y = arg;
+        emit yChanged(arg);
+    }
+}
+
+void setWidth(qreal arg)
+{
+    if (m_width != arg) {
+        m_width = arg;
+        emit widthChanged(arg);
+    }
+}
+
+void setHeight(qreal arg)
+{
+    if (m_height != arg) {
+        m_height = arg;
+        emit heightChanged(arg);
+    }
+}
+
+private:
+qreal m_x;
+qreal m_y;
+qreal m_width;
+qreal m_height;
+ParticleAffector* m_affector;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+#endif // ZONEAFFECTOR_H
diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
index 85c43e3760..437c4061b1 100644
--- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
+++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
@@ -54,6 +54,7 @@ public:
     QTcpServerConnectionPrivate();
 
     int port;
+    bool block;
     QTcpSocket *socket;
     QPacketProtocol *protocol;
     QTcpServer *tcpServer;
@@ -63,6 +64,7 @@ public:
 
 QTcpServerConnectionPrivate::QTcpServerConnectionPrivate() :
     port(0),
+    block(false),
     socket(0),
     protocol(0),
     tcpServer(0),
@@ -119,10 +121,17 @@ void QTcpServerConnection::disconnect()
     d->socket = 0;
 }
 
+bool QTcpServerConnection::waitForMessage()
+{
+    Q_D(QTcpServerConnection);
+    return d->protocol->waitForReadyRead(-1);
+}
+
 void QTcpServerConnection::setPort(int port, bool block)
 {
     Q_D(QTcpServerConnection);
     d->port = port;
+    d->block = block;
 
     listen();
     if (block)
@@ -169,8 +178,11 @@ void QTcpServerConnection::newConnection()
     d->socket->setParent(this);
     d->protocol = new QPacketProtocol(d->socket, this);
     QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
-}
 
+    if (d->block) {
+        d->protocol->waitForReadyRead(-1);
+    }
+}
 
 Q_EXPORT_PLUGIN2(tcpserver, QTcpServerConnection)
 
diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
index 66a10e18db..1c972b5dd7 100644
--- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
+++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
@@ -67,6 +67,7 @@ public:
     bool isConnected() const;
     void send(const QByteArray &message);
     void disconnect();
+    bool waitForMessage();
 
     void listen();
     void waitForConnection();
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index 98e15e8b0e..8db6eb172c 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -26,6 +26,9 @@ SUBDIRS += \
            qmlvisual \
            moduleqt47
 
+SUBDIRS += \
+           qsgitem \
+
 contains(QT_CONFIG, private_tests) {
     SUBDIRS += \
            qdeclarativeanchors \
@@ -39,7 +42,6 @@ contains(QT_CONFIG, private_tests) {
            qdeclarativedebug \
            qdeclarativedebugclient \
            qdeclarativedebugservice \
-           qdeclarativedom \
            qdeclarativeecmascript \
            qdeclarativeflickable \
            qdeclarativeflipable \
@@ -75,7 +77,25 @@ contains(QT_CONFIG, private_tests) {
            qdeclarativevisualdatamodel \
            qdeclarativeworkerscript \
            qdeclarativexmllistmodel \
-           qpacketprotocol
+           qpacketprotocol \
+           qdeclarativev4 \
+           qsgcanvas \
+           qsgflickable \
+           qsgflipable \
+           qsgfocusscope \
+           qsggridview \
+           qsglistview \
+           qsgloader \
+           qsgmousearea \
+           qsgpathview \
+           qsgpincharea \
+           qsgpositioners \
+           qsgrepeater \
+           qsgtext \
+           qsgtextedit \
+           qsgtextinput \
+           qsgvisualdatamodel
+
 }
 
 # Tests which should run in Pulse
diff --git a/tests/auto/declarative/examples/tst_examples.cpp b/tests/auto/declarative/examples/tst_examples.cpp
index 1a5ff107a4..72d1ff639a 100644
--- a/tests/auto/declarative/examples/tst_examples.cpp
+++ b/tests/auto/declarative/examples/tst_examples.cpp
@@ -45,6 +45,7 @@
 #include <QDebug>
 #include "qmlruntime.h"
 #include <QDeclarativeView>
+#include <QSGView>
 #include <QDeclarativeError>
 
 #ifdef Q_OS_SYMBIAN
@@ -61,10 +62,11 @@ public:
 private slots:
     void examples_data();
     void examples();
+    void sgexamples_data();
+    void sgexamples();
 
     void namingConvention();
 private:
-    QString qmlruntime;
     QStringList excludedDirs;
 
     void namingConvention(const QDir &);
@@ -73,24 +75,15 @@ private:
 
 tst_examples::tst_examples()
 {
-    QString binaries = QLibraryInfo::location(QLibraryInfo::BinariesPath);
-
-#if defined(Q_WS_MAC)
-    qmlruntime = QDir(binaries).absoluteFilePath("qml.app/Contents/MacOS/qml");
-#elif defined(Q_WS_WIN)
-    qmlruntime = QDir(binaries).absoluteFilePath("qml.exe");
-#else
-    qmlruntime = QDir(binaries).absoluteFilePath("qml");
-#endif
-
-
     // Add directories you want excluded here
     excludedDirs << "doc/src/snippets/declarative/visualdatamodel_rootindex";
     excludedDirs << "doc/src/snippets/declarative/qtbinding";
+    excludedDirs << "doc/src/snippets/declarative/imports";
 
 #ifdef QT_NO_WEBKIT
     excludedDirs << "examples/declarative/modelviews/webview";
     excludedDirs << "demos/declarative/webbrowser";
+    excludedDirs << "doc/src/snippets/declarative/webview";
 #endif
 
 #ifdef QT_NO_XMLPATTERNS
@@ -225,6 +218,31 @@ void tst_examples::examples()
     QTest::qWaitForWindowShown(&viewer);
 }
 
+void tst_examples::sgexamples_data()
+{
+    examples_data();
+}
+
+void tst_examples::sgexamples()
+{
+    qputenv("QMLSCENE_IMPORT_NAME", "quick1");
+    QFETCH(QString, file);
+
+    QSGView view;
+
+    QtMsgHandler old = qInstallMsgHandler(silentErrorsMsgHandler);
+    view.setSource(file);
+    qInstallMsgHandler(old);
+
+    if (view.status() == QSGView::Error)
+        qWarning() << view.errors();
+
+    QCOMPARE(view.status(), QSGView::Ready);
+    view.show();
+
+    QTest::qWaitForWindowShown(&view);
+}
+
 QTEST_MAIN(tst_examples)
 
 #include "tst_examples.moc"
diff --git a/tests/auto/declarative/geometry/geometry.pro b/tests/auto/declarative/geometry/geometry.pro
new file mode 100644
index 0000000000..93b9bdb8ae
--- /dev/null
+++ b/tests/auto/declarative/geometry/geometry.pro
@@ -0,0 +1,10 @@
+load(qttest_p4)
+QT       += opengl declarative
+
+TARGET = tst_geometry
+macx:CONFIG   -= app_bundle
+
+SOURCES += tst_geometry.cpp
+
+CONFIG+=parallel_test
+
diff --git a/tests/auto/declarative/geometry/tst_geometry.cpp b/tests/auto/declarative/geometry/tst_geometry.cpp
new file mode 100644
index 0000000000..4df7800cb9
--- /dev/null
+++ b/tests/auto/declarative/geometry/tst_geometry.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt scene graph research project.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QString>
+#include <QtTest/QtTest>
+
+#include <qsggeometry.h>
+
+class GeometryTest : public QObject
+{
+    Q_OBJECT
+
+public:
+
+private Q_SLOTS:
+    void testPoint2D();
+    void testTexturedPoint2D();
+    void testCustomGeometry();
+
+private:
+};
+
+void GeometryTest::testPoint2D()
+{
+    QSGGeometry geometry(QSGGeometry::defaultAttributes_Point2D(), 4, 0);
+
+    QCOMPARE(geometry.attributeCount(), 1);
+    QCOMPARE(geometry.stride(), (int) sizeof(float) * 2);
+    QCOMPARE(geometry.vertexCount(), 4);
+    QCOMPARE(geometry.indexCount(), 0);
+    QVERIFY(geometry.indexData() == 0);
+
+    QSGGeometry::updateRectGeometry(&geometry, QRectF(1, 2, 3, 4));
+
+    QSGGeometry::Point2D *pts = geometry.vertexDataAsPoint2D();
+    QVERIFY(pts != 0);
+
+    QCOMPARE(pts[0].x, (float) 1);
+    QCOMPARE(pts[0].y, (float) 2);
+    QCOMPARE(pts[3].x, (float) 4);
+    QCOMPARE(pts[3].y, (float) 6);
+
+    // Verify that resize gives me enough allocated data without crashing...
+    geometry.allocate(100, 100);
+    pts = geometry.vertexDataAsPoint2D();
+    quint16 *is = geometry.indexDataAsUShort();
+    for (int i=0; i<100; ++i) {
+        pts[i].x = i;
+        pts[i].y = i + 100;
+        is[i] = i;
+    }
+    QVERIFY(true);
+}
+
+
+void GeometryTest::testTexturedPoint2D()
+{
+    QSGGeometry geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4, 0);
+
+    QCOMPARE(geometry.attributeCount(), 2);
+    QCOMPARE(geometry.stride(), (int) sizeof(float) * 4);
+    QCOMPARE(geometry.vertexCount(), 4);
+    QCOMPARE(geometry.indexCount(), 0);
+    QVERIFY(geometry.indexData() == 0);
+
+    QSGGeometry::updateTexturedRectGeometry(&geometry, QRectF(1, 2, 3, 4), QRectF(5, 6, 7, 8));
+
+    QSGGeometry::TexturedPoint2D *pts = geometry.vertexDataAsTexturedPoint2D();
+    QVERIFY(pts != 0);
+
+    QCOMPARE(pts[0].x, (float) 1);
+    QCOMPARE(pts[0].y, (float) 2);
+    QCOMPARE(pts[0].tx, (float) 5);
+    QCOMPARE(pts[0].ty, (float) 6);
+
+    QCOMPARE(pts[3].x, (float) 4);
+    QCOMPARE(pts[3].y, (float) 6);
+    QCOMPARE(pts[3].tx, (float) 12);
+    QCOMPARE(pts[3].ty, (float) 14);
+
+    // Verify that resize gives me enough allocated data without crashing...
+    geometry.allocate(100, 100);
+    pts = geometry.vertexDataAsTexturedPoint2D();
+    quint16 *is = geometry.indexDataAsUShort();
+    for (int i=0; i<100; ++i) {
+        pts[i].x = i;
+        pts[i].y = i + 100;
+        pts[i].tx = i + 200;
+        pts[i].ty = i + 300;
+        is[i] = i;
+    }
+    QVERIFY(true);
+}
+
+void GeometryTest::testCustomGeometry()
+{
+    struct V {
+        float x, y;
+        unsigned char r, g, b, a;
+        float v1, v2, v3, v4;
+    };
+
+    static QSGGeometry::Attribute attributes[] = {
+        { 0, 2, GL_FLOAT },
+        { 1, 4, GL_UNSIGNED_BYTE },
+        { 2, 4, GL_FLOAT },
+    };
+    static QSGGeometry::AttributeSet set = { 4, 6 * sizeof(float) + 4 * sizeof(unsigned char), attributes };
+
+    QSGGeometry geometry(set, 1000, 4000);
+
+    // Verify that space has been allocated.
+    quint16 *ii = geometry.indexDataAsUShort();
+    for (int i=0; i<geometry.indexCount(); ++i) {
+        ii[i] = i;
+    }
+
+    V *v = (V *) geometry.vertexData();
+    for (int i=0; i<geometry.vertexCount(); ++i) {
+        v[i].x = 0;
+        v[i].y = 1;
+        v[i].r = 2;
+        v[i].g = 3;
+        v[i].b = 4;
+        v[i].a = 5;
+        v[i].v1 = 6;
+        v[i].v2 = 7;
+        v[i].v3 = 8;
+        v[i].v4 = 9;
+    }
+
+    // Verify the data's integrity
+    for (int i=0; i<4000; ++i)
+        QCOMPARE(ii[i], (quint16) i);
+    for (int i=0; i<1000; ++i)
+        QVERIFY(v[i].v1 == 6);
+
+}
+
+
+QTEST_MAIN(GeometryTest);
+
+#include "tst_geometry.moc"
diff --git a/tests/auto/declarative/node/nodes.pro b/tests/auto/declarative/node/nodes.pro
new file mode 100644
index 0000000000..4d2c06f495
--- /dev/null
+++ b/tests/auto/declarative/node/nodes.pro
@@ -0,0 +1,10 @@
+load(qttest_p4)
+QT       += opengl declarative
+
+TARGET = tst_nodestest
+macx:CONFIG   -= app_bundle
+
+SOURCES += tst_nodestest.cpp
+
+CONFIG+=parallel_test
+
diff --git a/tests/auto/declarative/node/tst_nodestest.cpp b/tests/auto/declarative/node/tst_nodestest.cpp
new file mode 100644
index 0000000000..a1b0a6ac91
--- /dev/null
+++ b/tests/auto/declarative/node/tst_nodestest.cpp
@@ -0,0 +1,354 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt scene graph research project.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QString>
+#include <QtTest/QtTest>
+
+#include <qsgnode.h>
+#include <private/qsgrenderer_p.h>
+#include <private/qsgnodeupdater_p.h>
+
+#include <qsgsimplerectnode.h>
+
+class NodesTest : public QObject
+{
+    Q_OBJECT
+
+public:
+    NodesTest();
+
+private Q_SLOTS:
+    void initTestCase();
+    void cleanupTestCase() {
+        delete widget;
+    }
+
+    // Root nodes
+    void propegate();
+    void propegateWithMultipleRoots();
+    void simulatedEffect_data();
+    void simulatedEffect();
+
+    // Opacity nodes
+    void basicOpacityNode();
+    void opacityPropegation();
+
+    // QSGNodeUpdater
+    void isBlockedCheck();
+
+private:
+    QGLWidget *widget;
+
+    QSGNodeUpdater updater;
+};
+
+void NodesTest::initTestCase()
+{
+    widget = new QGLWidget();
+    widget->resize(100, 30);
+    widget->show();
+}
+
+class DummyRenderer : public QSGRenderer
+{
+public:
+    DummyRenderer(QSGRootNode *root)
+        : QSGRenderer(QSGContext::createDefaultContext())
+        , changedNode(0)
+        , changedFlags(0)
+        , renderCount(0)
+    {
+        setRootNode(root);
+    }
+
+    void render() {
+        ++renderCount;
+        renderingOrder = ++globalRendereringOrder;
+    }
+
+    void nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags) {
+        changedNode = node;
+        changedFlags = flags;
+        QSGRenderer::nodeChanged(node, flags);
+    }
+
+    QSGNode *changedNode;
+    QSGNode::DirtyFlags changedFlags;
+
+    int renderCount;
+    int renderingOrder;
+    static int globalRendereringOrder;
+};
+
+int DummyRenderer::globalRendereringOrder;
+
+NodesTest::NodesTest()
+{
+}
+
+
+void NodesTest::propegate()
+{
+    QSGRootNode root;
+    QSGNode child; child.setFlag(QSGNode::OwnedByParent, false);
+    root.appendChildNode(&child);
+
+    DummyRenderer renderer(&root);
+
+    child.markDirty(QSGNode::DirtyGeometry);
+
+    QCOMPARE(&child, renderer.changedNode);
+    QCOMPARE((int) renderer.changedFlags, (int) QSGNode::DirtyGeometry);
+}
+
+
+void NodesTest::propegateWithMultipleRoots()
+{
+    QSGRootNode root1;
+    QSGNode child2; child2.setFlag(QSGNode::OwnedByParent, false);
+    QSGRootNode root3; root3.setFlag(QSGNode::OwnedByParent, false);
+    QSGNode child4; child4.setFlag(QSGNode::OwnedByParent, false);
+
+    root1.appendChildNode(&child2);
+    child2.appendChildNode(&root3);
+    root3.appendChildNode(&child4);
+
+    DummyRenderer ren1(&root1);
+    DummyRenderer ren2(&root3);
+
+    child4.markDirty(QSGNode::DirtyGeometry);
+
+    QCOMPARE(ren1.changedNode, &child4);
+    QCOMPARE(ren2.changedNode, &child4);
+
+    QCOMPARE((int) ren1.changedFlags, (int) QSGNode::DirtyGeometry);
+    QCOMPARE((int) ren2.changedFlags, (int) QSGNode::DirtyGeometry);
+}
+
+
+
+class SimulatedEffectRenderer : public DummyRenderer
+{
+public:
+    SimulatedEffectRenderer(QSGRootNode *root, QSGBasicGeometryNode *c)
+        : DummyRenderer(root)
+    {
+        child = c;
+    }
+
+    void render() {
+        matrix = child->matrix() ? *child->matrix() : QMatrix4x4();
+        DummyRenderer::render();
+    }
+
+    QSGBasicGeometryNode *child;
+    QMatrix4x4 matrix;
+};
+
+
+class PseudoEffectNode : public QSGNode {
+public:
+    PseudoEffectNode(QSGRenderer *r)
+        : renderer(r)
+    {
+        setFlag(UsePreprocess);
+    }
+
+    void preprocess() {
+
+        if (renderer->rootNode()->parent()) {
+            // Mark the root dirty to build a clean state from the root and down
+            renderer->rootNode()->markDirty(QSGNode::DirtyAll);
+        }
+
+        renderer->renderScene();
+
+        if (renderer->rootNode()->parent()) {
+            // Mark the parent of the root dirty to force the root and down to be updated.
+            renderer->rootNode()->parent()->markDirty(QSGNode::DirtyAll);
+        }
+    }
+
+    QSGRenderer *renderer;
+};
+
+void NodesTest::simulatedEffect_data()
+{
+    QTest::addColumn<bool>("connected");
+
+    QTest::newRow("connected") << true;
+    QTest::newRow("disconnected") << false;
+}
+
+void NodesTest::simulatedEffect()
+{
+    QFETCH(bool, connected);
+
+    QSGRootNode root;
+    QSGRootNode source;
+    QSGTransformNode xform;
+    QSGSimpleRectNode geometry;
+    geometry.setRect(QRectF(0, 0, 1, 1));
+    geometry.setColor(Qt::red);
+
+    root.setFlag(QSGNode::OwnedByParent, false);
+    source.setFlag(QSGNode::OwnedByParent, false);
+    xform.setFlag(QSGNode::OwnedByParent, false);
+    geometry.setFlag(QSGNode::OwnedByParent, false);
+
+    SimulatedEffectRenderer rootRenderer(&root, &geometry);
+    SimulatedEffectRenderer sourceRenderer(&source, &geometry);
+
+    PseudoEffectNode effect(&sourceRenderer);
+
+    /*
+      root              Source is redirected into effect using  the SimulatedEffectRenderer
+     /    \
+  xform  effect
+    |
+  source
+    |
+ geometry
+    */
+
+    root.appendChildNode(&xform);
+    root.appendChildNode(&effect);
+    if (connected)
+        xform.appendChildNode(&source);
+    source.appendChildNode(&geometry);
+    QMatrix4x4 m; m.translate(1, 2, 3);
+    xform.setMatrix(m);
+
+    // Clear all dirty states...
+    updater.updateStates(&root);
+
+    rootRenderer.renderScene();
+
+    // compare that we got one render call to each
+    QCOMPARE(rootRenderer.renderCount, 1);
+    QCOMPARE(sourceRenderer.renderCount, 1);
+    QVERIFY(sourceRenderer.renderingOrder < rootRenderer.renderingOrder);
+    if (connected) // geometry is not rendered in this case, so skip it...
+        QCOMPARE(rootRenderer.matrix, xform.matrix());
+    QCOMPARE(sourceRenderer.matrix, QMatrix4x4());
+}
+
+void NodesTest::basicOpacityNode()
+{
+    QSGOpacityNode n;
+    QCOMPARE(n.opacity(), 1.);
+
+    n.setOpacity(0.5);
+    QCOMPARE(n.opacity(), 0.5);
+
+    n.setOpacity(-1);
+    QCOMPARE(n.opacity(), 0.);
+
+    n.setOpacity(2);
+    QCOMPARE(n.opacity(), 1.);
+}
+
+void NodesTest::opacityPropegation()
+{
+    QSGRootNode root;
+    QSGOpacityNode *a = new QSGOpacityNode;
+    QSGOpacityNode *b = new QSGOpacityNode;
+    QSGOpacityNode *c = new QSGOpacityNode;
+
+    QSGSimpleRectNode *geometry = new QSGSimpleRectNode;
+    geometry->setRect(0, 0, 100, 100);
+
+    root.appendChildNode(a);
+    a->appendChildNode(b);
+    b->appendChildNode(c);
+    c->appendChildNode(geometry);
+
+    a->setOpacity(0.9);
+    b->setOpacity(0.8);
+    c->setOpacity(0.7);
+
+    updater.updateStates(&root);
+
+    QCOMPARE(a->combinedOpacity(), 0.9);
+    QCOMPARE(b->combinedOpacity(), 0.9 * 0.8);
+    QCOMPARE(c->combinedOpacity(), 0.9 * 0.8 * 0.7);
+    QCOMPARE(geometry->inheritedOpacity(), 0.9 * 0.8 * 0.7);
+
+    b->setOpacity(0.1);
+    updater.updateStates(&root);
+
+    QCOMPARE(a->combinedOpacity(), 0.9);
+    QCOMPARE(b->combinedOpacity(), 0.9 * 0.1);
+    QCOMPARE(c->combinedOpacity(), 0.9 * 0.1 * 0.7);
+    QCOMPARE(geometry->inheritedOpacity(), 0.9 * 0.1 * 0.7);
+
+    b->setOpacity(0);
+    updater.updateStates(&root);
+
+    QVERIFY(b->isSubtreeBlocked());
+
+    // Verify that geometry did not get updated as it is in a blocked
+    // subtree
+    QCOMPARE(c->combinedOpacity(), 0.9 * 0.1 * 0.7);
+    QCOMPARE(geometry->inheritedOpacity(), 0.9 * 0.1 * 0.7);
+}
+
+void NodesTest::isBlockedCheck()
+{
+    QSGRootNode root;
+    QSGOpacityNode *opacity = new QSGOpacityNode();
+    QSGNode *node = new QSGNode();
+
+    root.appendChildNode(opacity);
+    opacity->appendChildNode(node);
+
+    QSGNodeUpdater updater;
+
+    opacity->setOpacity(0);
+    QVERIFY(updater.isNodeBlocked(node, &root));
+
+    opacity->setOpacity(1);
+    QVERIFY(!updater.isNodeBlocked(node, &root));
+}
+
+QTEST_MAIN(NodesTest);
+
+#include "tst_nodestest.moc"
diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
index de4ddcc360..e63b14ef61 100644
--- a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
+++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
@@ -664,7 +664,13 @@ void tst_QDeclarativeDebug::queryAvailableEngines()
         QCOMPARE(e.name(), m_engine->objectName());
     }
 
+    // Make query invalid by deleting client
+    q_engines = m_dbg->queryAvailableEngines(this);
+    QCOMPARE(q_engines->state(), QDeclarativeDebugQuery::Waiting);
+    delete m_dbg;
+    QCOMPARE(q_engines->state(), QDeclarativeDebugQuery::Error);
     delete q_engines;
+    m_dbg = new QDeclarativeEngineDebug(m_conn, this);
 }
 
 void tst_QDeclarativeDebug::queryRootContexts()
@@ -672,6 +678,7 @@ void tst_QDeclarativeDebug::queryRootContexts()
     QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this);
     waitForQuery(q_engines);
     int engineId = q_engines->engines()[0].debugId();
+    delete q_engines;
 
     QDeclarativeDebugRootContextQuery *q_context;
     
@@ -703,8 +710,13 @@ void tst_QDeclarativeDebug::queryRootContexts()
     QVERIFY(context.contexts()[0].debugId() >= 0);
     QCOMPARE(context.contexts()[0].name(), QString("tst_QDeclarativeDebug_childContext"));
 
-    delete q_engines;
+    // Make query invalid by deleting client
+    q_context = m_dbg->queryRootContexts(engineId, this);
+    QCOMPARE(q_context->state(), QDeclarativeDebugQuery::Waiting);
+    delete m_dbg;
+    QCOMPARE(q_context->state(), QDeclarativeDebugQuery::Error);
     delete q_context;
+    m_dbg = new QDeclarativeEngineDebug(m_conn, this);
 }
 
 void tst_QDeclarativeDebug::queryObject()
@@ -736,7 +748,14 @@ void tst_QDeclarativeDebug::queryObject()
 
     delete q_engines;
     delete q_context;
+
+    // Make query invalid by deleting client
+    q_obj = recursive ? m_dbg->queryObjectRecursive(rootObject, this) : m_dbg->queryObject(rootObject, this);
+    QCOMPARE(q_obj->state(), QDeclarativeDebugQuery::Waiting);
+    delete m_dbg;
+    QCOMPARE(q_obj->state(), QDeclarativeDebugQuery::Error);
     delete q_obj;
+    m_dbg = new QDeclarativeEngineDebug(m_conn, this);
 
     // check source as defined in main()
     QDeclarativeDebugFileReference source = obj.source();
@@ -811,7 +830,14 @@ void tst_QDeclarativeDebug::queryExpressionResult()
 
     delete q_engines;
     delete q_context;
+
+    // Make query invalid by deleting client
+    q_expr = m_dbg->queryExpressionResult(objectId, expr, this);
+    QCOMPARE(q_expr->state(), QDeclarativeDebugQuery::Waiting);
+    delete m_dbg;
+    QCOMPARE(q_expr->state(), QDeclarativeDebugQuery::Error);
     delete q_expr;
+    m_dbg = new QDeclarativeEngineDebug(m_conn, this);
 }
 
 void tst_QDeclarativeDebug::queryExpressionResult_data()
@@ -1001,7 +1027,7 @@ void tst_QDeclarativeDebug::setBindingForObject()
     // set handler
     //
     rootObject = findRootObject();
-    QCOMPARE(rootObject.children().size(), 3);
+    QCOMPARE(rootObject.children().size(), 4); // Rectangle, Text, MouseArea, QDeclarativeComponentAttached
     QDeclarativeDebugObjectReference mouseAreaObject = rootObject.children().at(2);
     QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObjectRecursive(mouseAreaObject, this);
     waitForQuery(q_obj);
diff --git a/tests/auto/declarative/qdeclarativedom/data/MyItem.qml b/tests/auto/declarative/qdeclarativedom/data/MyItem.qml
deleted file mode 100644
index f6760b6a9f..0000000000
--- a/tests/auto/declarative/qdeclarativedom/data/MyItem.qml
+++ /dev/null
@@ -1,4 +0,0 @@
-import QtQuick 1.0
-
-Item {
-}
diff --git a/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml b/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml
deleted file mode 100644
index 86a7176896..0000000000
--- a/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml
+++ /dev/null
@@ -1,2 +0,0 @@
-import QtQuick 1.0
-
diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml
deleted file mode 100644
index 86a7176896..0000000000
--- a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml
+++ /dev/null
@@ -1,2 +0,0 @@
-import QtQuick 1.0
-
diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
deleted file mode 100644
index 98d6b7431d..0000000000
--- a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
+++ /dev/null
@@ -1,2 +0,0 @@
-Foo 1.1 Foo.qml
-Foo 1.0 Foo.qml
diff --git a/tests/auto/declarative/qdeclarativedom/data/top.qml b/tests/auto/declarative/qdeclarativedom/data/top.qml
deleted file mode 100644
index 56ea9dfaad..0000000000
--- a/tests/auto/declarative/qdeclarativedom/data/top.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import QtQuick 1.0
-
-MyComponent {
-    width: 100
-    height: 100
-}
diff --git a/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp b/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp
deleted file mode 100644
index e62a114b78..0000000000
--- a/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp
+++ /dev/null
@@ -1,1326 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <qtest.h>
-#include <QtDeclarative/qdeclarativeengine.h>
-#include <QtDeclarative/qdeclarativecomponent.h>
-#include <QtDeclarative/private/qdeclarativedom_p.h>
-
-#include <QtCore/QDebug>
-#include <QtCore/QFile>
-
-#ifdef Q_OS_SYMBIAN
-// In Symbian OS test data is located in applications private dir
-#define SRCDIR "."
-#endif
-
-class tst_qdeclarativedom : public QObject
-{
-    Q_OBJECT
-public:
-    tst_qdeclarativedom() {}
-
-private slots:
-    void loadSimple();
-    void loadProperties();
-    void loadGroupedProperties();
-    void loadChildObject();
-    void loadComposite();
-    void loadImports();
-    void loadErrors();
-    void loadSyntaxErrors();
-    void loadRemoteErrors();
-    void loadDynamicProperty();
-    void loadComponent();
-
-    void testValueSource();
-    void testValueInterceptor();
-
-    void object_dynamicProperty();
-    void object_property();
-    void object_url();
-
-    void copy();
-    void position();
-private:
-    QDeclarativeEngine engine;
-};
-
-
-void tst_qdeclarativedom::loadSimple()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                      "Item {}";
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml));
-    QVERIFY(document.errors().isEmpty());
-
-    QDeclarativeDomObject rootObject = document.rootObject();
-    QVERIFY(rootObject.isValid());
-    QVERIFY(!rootObject.isComponent());
-    QVERIFY(!rootObject.isCustomType());
-    QVERIFY(rootObject.objectType() == "QtQuick/Item");
-    QVERIFY(rootObject.objectTypeMajorVersion() == 1);
-    QVERIFY(rootObject.objectTypeMinorVersion() == 0);
-}
-
-// Test regular properties
-void tst_qdeclarativedom::loadProperties()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Item { id : item; x : 300; visible : true }";
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml));
-
-    QDeclarativeDomObject rootObject = document.rootObject();
-    QVERIFY(rootObject.isValid());
-    QVERIFY(rootObject.objectId() == "item");
-    QCOMPARE(rootObject.properties().size(), 3);
-
-    QDeclarativeDomProperty xProperty = rootObject.property("x");
-    QVERIFY(xProperty.propertyName() == "x");
-    QCOMPARE(xProperty.propertyNameParts().count(), 1);
-    QVERIFY(xProperty.propertyNameParts().at(0) == "x");
-    QCOMPARE(xProperty.position(), 37);
-    QCOMPARE(xProperty.length(), 1);
-    QVERIFY(xProperty.value().isLiteral());
-    QVERIFY(xProperty.value().toLiteral().literal() == "300");
-
-    QDeclarativeDomProperty visibleProperty = rootObject.property("visible");
-    QVERIFY(visibleProperty.propertyName() == "visible");
-    QCOMPARE(visibleProperty.propertyNameParts().count(), 1);
-    QVERIFY(visibleProperty.propertyNameParts().at(0) == "visible");
-    QCOMPARE(visibleProperty.position(), 46);
-    QCOMPARE(visibleProperty.length(), 7);
-    QVERIFY(visibleProperty.value().isLiteral());
-    QVERIFY(visibleProperty.value().toLiteral().literal() == "true");
-}
-
-// Test grouped properties
-void tst_qdeclarativedom::loadGroupedProperties()
-{
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item { anchors.left: parent.left; anchors.right: parent.right }";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootItem = document.rootObject();
-        QVERIFY(rootItem.isValid());
-        QVERIFY(rootItem.properties().size() == 2);
-
-        // Order is not deterministic
-        QDeclarativeDomProperty p0 = rootItem.properties().at(0);
-        QDeclarativeDomProperty p1 = rootItem.properties().at(1);
-        QDeclarativeDomProperty leftProperty;
-        QDeclarativeDomProperty rightProperty;
-        if (p0.propertyName() == "anchors.left") {
-            leftProperty = p0;
-            rightProperty = p1;
-        } else {
-            leftProperty = p1;
-            rightProperty = p0;
-        }
-
-        QVERIFY(leftProperty.propertyName() == "anchors.left");
-        QCOMPARE(leftProperty.propertyNameParts().count(), 2);
-        QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors");
-        QVERIFY(leftProperty.propertyNameParts().at(1) == "left");
-        QCOMPARE(leftProperty.position(), 26);
-        QCOMPARE(leftProperty.length(), 12);
-        QVERIFY(leftProperty.value().isBinding());
-        QVERIFY(leftProperty.value().toBinding().binding() == "parent.left");
-
-        QVERIFY(rightProperty.propertyName() == "anchors.right");
-        QCOMPARE(rightProperty.propertyNameParts().count(), 2);
-        QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors");
-        QVERIFY(rightProperty.propertyNameParts().at(1) == "right");
-        QCOMPARE(rightProperty.position(), 53);
-        QCOMPARE(rightProperty.length(), 13);
-        QVERIFY(rightProperty.value().isBinding());
-        QVERIFY(rightProperty.value().toBinding().binding() == "parent.right");
-    }
-
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item { \n"
-                         "    anchors {\n"
-                         "        left: parent.left\n"
-                         "        right: parent.right\n"
-                         "    }\n"
-                         "}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootItem = document.rootObject();
-        QVERIFY(rootItem.isValid());
-        QVERIFY(rootItem.properties().size() == 2);
-
-        // Order is not deterministic
-        QDeclarativeDomProperty p0 = rootItem.properties().at(0);
-        QDeclarativeDomProperty p1 = rootItem.properties().at(1);
-        QDeclarativeDomProperty leftProperty;
-        QDeclarativeDomProperty rightProperty;
-        if (p0.propertyName() == "anchors.left") {
-            leftProperty = p0;
-            rightProperty = p1;
-        } else {
-            leftProperty = p1;
-            rightProperty = p0;
-        }
-
-        QVERIFY(leftProperty.propertyName() == "anchors.left");
-        QCOMPARE(leftProperty.propertyNameParts().count(), 2);
-        QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors");
-        QVERIFY(leftProperty.propertyNameParts().at(1) == "left");
-        QCOMPARE(leftProperty.position(), 49);
-        QCOMPARE(leftProperty.length(), 4);
-        QVERIFY(leftProperty.value().isBinding());
-        QVERIFY(leftProperty.value().toBinding().binding() == "parent.left");
-
-        QVERIFY(rightProperty.propertyName() == "anchors.right");
-        QCOMPARE(rightProperty.propertyNameParts().count(), 2);
-        QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors");
-        QVERIFY(rightProperty.propertyNameParts().at(1) == "right");
-        QCOMPARE(rightProperty.position(), 75);
-        QCOMPARE(rightProperty.length(), 5);
-        QVERIFY(rightProperty.value().isBinding());
-        QVERIFY(rightProperty.value().toBinding().binding() == "parent.right");
-    }
-
-}
-
-void tst_qdeclarativedom::loadChildObject()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Item { Item {} }";
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml));
-
-    QDeclarativeDomObject rootItem = document.rootObject();
-    QVERIFY(rootItem.isValid());
-    QVERIFY(rootItem.properties().size() == 1);
-
-    QDeclarativeDomProperty listProperty = rootItem.properties().at(0);
-    QVERIFY(listProperty.isDefaultProperty());
-    QVERIFY(listProperty.value().isList());
-
-    QDeclarativeDomList list = listProperty.value().toList();
-    QVERIFY(list.values().size() == 1);
-
-    QDeclarativeDomObject childItem = list.values().first().toObject();
-    QVERIFY(childItem.isValid());
-    QVERIFY(childItem.objectType() == "QtQuick/Item");
-}
-
-void tst_qdeclarativedom::loadComposite()
-{
-    QFile file(SRCDIR  "/data/top.qml");
-    QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, file.readAll(), QUrl::fromLocalFile(file.fileName())));
-    QVERIFY(document.errors().isEmpty());
-
-    QDeclarativeDomObject rootItem = document.rootObject();
-    QVERIFY(rootItem.isValid());
-    QCOMPARE(rootItem.objectType(), QByteArray("MyComponent"));
-    QCOMPARE(rootItem.properties().size(), 2);
-
-    QDeclarativeDomProperty widthProperty = rootItem.property("width");
-    QVERIFY(widthProperty.value().isLiteral());
-
-    QDeclarativeDomProperty heightProperty = rootItem.property("height");
-    QVERIFY(heightProperty.value().isLiteral());
-}
-
-void tst_qdeclarativedom::testValueSource()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Rectangle { SpringAnimation on height { spring: 1.4; damping: .15; to: Math.min(Math.max(-130, value*2.2 - 130), 133); }}";
-
-    QDeclarativeEngine freshEngine;
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&freshEngine, qml));
-
-    QDeclarativeDomObject rootItem = document.rootObject();
-    QVERIFY(rootItem.isValid());
-    QDeclarativeDomProperty heightProperty = rootItem.properties().at(0);
-    QVERIFY(heightProperty.propertyName() == "height");
-    QVERIFY(heightProperty.value().isValueSource());
-
-    const QDeclarativeDomValueValueSource valueSource = heightProperty.value().toValueSource();
-    QDeclarativeDomObject valueSourceObject = valueSource.object();
-    QVERIFY(valueSourceObject.isValid());
-
-    QVERIFY(valueSourceObject.objectType() == "QtQuick/SpringAnimation");
-
-    const QDeclarativeDomValue springValue = valueSourceObject.property("spring").value();
-    QVERIFY(!springValue.isInvalid());
-    QVERIFY(springValue.isLiteral());
-    QVERIFY(springValue.toLiteral().literal() == "1.4");
-
-    const QDeclarativeDomValue sourceValue = valueSourceObject.property("to").value();
-    QVERIFY(!sourceValue.isInvalid());
-    QVERIFY(sourceValue.isBinding());
-    QVERIFY(sourceValue.toBinding().binding() == "Math.min(Math.max(-130, value*2.2 - 130), 133)");
-}
-
-void tst_qdeclarativedom::testValueInterceptor()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Rectangle { Behavior on height { NumberAnimation { duration: 100 } } }";
-
-    QDeclarativeEngine freshEngine;
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&freshEngine, qml));
-
-    QDeclarativeDomObject rootItem = document.rootObject();
-    QVERIFY(rootItem.isValid());
-    QDeclarativeDomProperty heightProperty = rootItem.properties().at(0);
-    QVERIFY(heightProperty.propertyName() == "height");
-    QVERIFY(heightProperty.value().isValueInterceptor());
-
-    const QDeclarativeDomValueValueInterceptor valueInterceptor = heightProperty.value().toValueInterceptor();
-    QDeclarativeDomObject valueInterceptorObject = valueInterceptor.object();
-    QVERIFY(valueInterceptorObject.isValid());
-
-    QVERIFY(valueInterceptorObject.objectType() == "QtQuick/Behavior");
-
-    const QDeclarativeDomValue animationValue = valueInterceptorObject.property("animation").value();
-    QVERIFY(!animationValue.isInvalid());
-    QVERIFY(animationValue.isObject());
-}
-
-// Test QDeclarativeDomDocument::imports()
-void tst_qdeclarativedom::loadImports()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "import importlib.sublib 1.1\n"
-                     "import importlib.sublib 1.0 as NewFoo\n"
-                     "import 'import'\n"
-                     "import 'import' as X\n"
-                     "Item {}";
-
-    QDeclarativeEngine engine;
-    engine.addImportPath(SRCDIR "/data");
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml, QUrl::fromLocalFile(SRCDIR "/data/dummy.qml")));
-
-    QCOMPARE(document.imports().size(), 5);
-
-    QDeclarativeDomImport import = document.imports().at(0);
-    QCOMPARE(import.type(), QDeclarativeDomImport::Library);
-    QCOMPARE(import.uri(), QLatin1String("QtQuick"));
-    QCOMPARE(import.qualifier(), QString());
-    QCOMPARE(import.version(), QLatin1String("1.0"));
-
-    import = document.imports().at(1);
-    QCOMPARE(import.type(), QDeclarativeDomImport::Library);
-    QCOMPARE(import.uri(), QLatin1String("importlib.sublib"));
-    QCOMPARE(import.qualifier(), QString());
-    QCOMPARE(import.version(), QLatin1String("1.1"));
-
-    import = document.imports().at(2);
-    QCOMPARE(import.type(), QDeclarativeDomImport::Library);
-    QCOMPARE(import.uri(), QLatin1String("importlib.sublib"));
-    QCOMPARE(import.qualifier(), QLatin1String("NewFoo"));
-    QCOMPARE(import.version(), QLatin1String("1.0"));
-
-    import = document.imports().at(3);
-    QCOMPARE(import.type(), QDeclarativeDomImport::File);
-    QCOMPARE(import.uri(), QLatin1String("import"));
-    QCOMPARE(import.qualifier(), QLatin1String(""));
-    QCOMPARE(import.version(), QLatin1String(""));
-
-    import = document.imports().at(4);
-    QCOMPARE(import.type(), QDeclarativeDomImport::File);
-    QCOMPARE(import.uri(), QLatin1String("import"));
-    QCOMPARE(import.qualifier(), QLatin1String("X"));
-    QCOMPARE(import.version(), QLatin1String(""));
-}
-
-// Test loading a file with errors
-void tst_qdeclarativedom::loadErrors()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Item {\n"
-                     "  foo: 12\n"
-                     "}";
-
-    QDeclarativeDomDocument document;
-    QVERIFY(false == document.load(&engine, qml));
-
-    QCOMPARE(document.errors().count(), 1);
-    QDeclarativeError error = document.errors().first();
-
-    QCOMPARE(error.url(), QUrl());
-    QCOMPARE(error.line(), 3);
-    QCOMPARE(error.column(), 3);
-    QCOMPARE(error.description(), QString("Cannot assign to non-existent property \"foo\""));
-}
-
-// Test loading a file with syntax errors
-void tst_qdeclarativedom::loadSyntaxErrors()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "asdf";
-
-    QDeclarativeDomDocument document;
-    QVERIFY(false == document.load(&engine, qml));
-
-    QCOMPARE(document.errors().count(), 1);
-    QDeclarativeError error = document.errors().first();
-
-    QCOMPARE(error.url(), QUrl());
-    QCOMPARE(error.line(), 2);
-    QCOMPARE(error.column(), 1);
-    QCOMPARE(error.description(), QString("Syntax error"));
-}
-
-// Test attempting to load a file with remote references
-void tst_qdeclarativedom::loadRemoteErrors()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "import \"http://localhost/exampleQmlScript.js\" as Script\n"
-                     "Item {\n"
-                     "}";
-    QDeclarativeDomDocument document;
-    QVERIFY(false == document.load(&engine, qml));
-
-    QCOMPARE(document.errors().count(), 1);
-    QDeclarativeError error = document.errors().first();
-
-    QCOMPARE(error.url(), QUrl());
-    QCOMPARE(error.line(), -1);
-    QCOMPARE(error.column(), -1);
-    QCOMPARE(error.description(), QString("QDeclarativeDomDocument supports local types only"));
-}
-
-// Test dynamic property declarations
-void tst_qdeclarativedom::loadDynamicProperty()
-{
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    property int a\n"
-                         "    property bool b\n"
-                         "    property double c\n"
-                         "    property real d\n"
-                         "    property string e\n"
-                         "    property url f\n"
-                         "    property color g\n"
-                         "    property date h\n"
-                         "    property variant i\n"
-                         "    property QtObject j\n"
-                         "}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QCOMPARE(rootObject.dynamicProperties().count(), 10);
-
-#define DP_TEST(index, name, type, test_position, test_length, propTypeName) \
-    { \
-        QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(index); \
-        QVERIFY(d.isValid()); \
-        QVERIFY(d.propertyName() == # name ); \
-        QVERIFY(d.propertyType() == type); \
-        QVERIFY(d.propertyTypeName() == propTypeName); \
-        QVERIFY(d.isDefaultProperty() == false); \
-        QVERIFY(d.defaultValue().isValid() == false); \
-        QCOMPARE(d.position(), test_position); \
-        QCOMPARE(d.length(), test_length); \
-    } \
-
-        DP_TEST(0, a, QVariant::Int, 30, 14, "int");
-        DP_TEST(1, b, QVariant::Bool, 49, 15, "bool");
-        DP_TEST(2, c, QMetaType::QReal, 69, 17, "double");
-        DP_TEST(3, d, QMetaType::QReal, 91, 15, "real");
-        DP_TEST(4, e, QVariant::String, 111, 17, "string");
-        DP_TEST(5, f, QVariant::Url, 133, 14, "url");
-        DP_TEST(6, g, QVariant::Color, 152, 16, "color");
-        DP_TEST(7, h, QVariant::DateTime, 173, 15, "date");
-        DP_TEST(8, i, qMetaTypeId<QVariant>(), 193, 18, "variant");
-        DP_TEST(9, j, -1, 216, 19, "QtObject");
-    }
-
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    id: item\n"
-                         "    property int a: 12\n"
-                         "    property int b: a + 6\n"
-                         "    default property QtObject c\n"
-                         "    property alias d: item.a\n"
-                         "}\n";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QCOMPARE(rootObject.dynamicProperties().count(), 4);
-
-        {
-            QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(0);
-            QVERIFY(d.isDefaultProperty() == false);
-            QVERIFY(d.isAlias() == false);
-            QVERIFY(d.defaultValue().isValid());
-            QVERIFY(d.defaultValue().propertyName() == "a");
-            QVERIFY(d.defaultValue().value().isLiteral());
-        }
-
-        {
-            QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(1);
-            QVERIFY(d.isDefaultProperty() == false);
-            QVERIFY(d.isAlias() == false);
-            QVERIFY(d.defaultValue().isValid());
-            QVERIFY(d.defaultValue().propertyName() == "b");
-            QVERIFY(d.defaultValue().value().isBinding());
-        }
-
-        {
-            QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(2);
-            QVERIFY(d.isDefaultProperty() == true);
-            QVERIFY(d.isAlias() == false);
-            QVERIFY(d.defaultValue().isValid() == false);
-        }
-
-        {
-            QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(3);
-            QVERIFY(d.isDefaultProperty() == false);
-            QVERIFY(d.isAlias() == true);
-        }
-    }
-}
-
-// Test inline components
-void tst_qdeclarativedom::loadComponent()
-{
-    // Explicit component
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    Component {\n"
-                         "        id: myComponent\n"
-                         "        Item {}\n"
-                         "    }\n"
-                         "}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootItem = document.rootObject();
-        QVERIFY(rootItem.isValid());
-        QVERIFY(rootItem.properties().size() == 1);
-
-        QDeclarativeDomProperty listProperty = rootItem.properties().at(0);
-        QVERIFY(listProperty.isDefaultProperty());
-        QVERIFY(listProperty.value().isList());
-
-        QDeclarativeDomList list = listProperty.value().toList();
-        QVERIFY(list.values().size() == 1);
-
-        QDeclarativeDomObject componentObject = list.values().first().toObject();
-        QVERIFY(componentObject.isValid());
-        QVERIFY(componentObject.objectClassName() == "Component");
-        QVERIFY(componentObject.isComponent());
-
-        QDeclarativeDomComponent component = componentObject.toComponent();
-        QVERIFY(component.isValid());
-        QVERIFY(component.objectType() == "QtQuick/Component");
-        QVERIFY(component.objectTypeMajorVersion() == 1);
-        QVERIFY(component.objectTypeMinorVersion() == 0);
-        QVERIFY(component.objectClassName() == "Component");
-        QVERIFY(component.objectId() == "myComponent");
-        QVERIFY(component.properties().isEmpty());
-        QVERIFY(component.dynamicProperties().isEmpty());
-        QVERIFY(component.isCustomType() == false);
-        QVERIFY(component.customTypeData() == "");
-        QVERIFY(component.isComponent());
-        QCOMPARE(component.position(), 30);
-        QCOMPARE(component.length(), 57);
-
-        QVERIFY(component.componentRoot().isValid());
-        QVERIFY(component.componentRoot().objectClassName() == "Item");
-    }
-
-    // Implicit component
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "ListView {\n"
-                         "    delegate: Item {}\n"
-                         "}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootItem = document.rootObject();
-        QVERIFY(rootItem.isValid());
-        QVERIFY(rootItem.properties().size() == 1);
-
-        QDeclarativeDomProperty delegate = rootItem.property("delegate");
-
-        QDeclarativeDomObject componentObject = delegate.value().toObject();
-        QVERIFY(componentObject.isValid());
-        QVERIFY(componentObject.objectClassName() == "Component");
-        QVERIFY(componentObject.isComponent());
-
-        QDeclarativeDomComponent component = componentObject.toComponent();
-        QVERIFY(component.isValid());
-        QVERIFY(component.objectType() == "QtQuick/Component");
-        QVERIFY(component.objectClassName() == "Component");
-        QVERIFY(component.objectId() == "");
-        QVERIFY(component.properties().isEmpty());
-        QVERIFY(component.dynamicProperties().isEmpty());
-        QVERIFY(component.isCustomType() == false);
-        QVERIFY(component.customTypeData() == "");
-        QVERIFY(component.isComponent());
-        QCOMPARE(component.position(), 44);
-        QCOMPARE(component.length(), 7);
-
-        QVERIFY(component.componentRoot().isValid());
-        QVERIFY(component.componentRoot().objectClassName() == "Item");
-    }
-}
-
-// Test QDeclarativeDomObject::dynamicProperty() method
-void tst_qdeclarativedom::object_dynamicProperty()
-{
-    // Invalid object
-    {
-        QDeclarativeDomObject object;
-        QVERIFY(object.dynamicProperty("").isValid() == false);
-        QVERIFY(object.dynamicProperty("foo").isValid() == false);
-    }
-
-
-    // Valid object, no dynamic properties
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QVERIFY(rootObject.dynamicProperty("").isValid() == false);
-        QVERIFY(rootObject.dynamicProperty("foo").isValid() == false);
-    }
-
-    // Valid object, dynamic properties
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    property int a\n"
-                         "}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QVERIFY(rootObject.dynamicProperty("").isValid() == false);
-        QVERIFY(rootObject.dynamicProperty("foo").isValid() == false);
-
-        QDeclarativeDomDynamicProperty p = rootObject.dynamicProperty("a");
-        QVERIFY(p.isValid());
-        QVERIFY(p.propertyName() == "a");
-        QVERIFY(p.propertyType() == QVariant::Int);
-        QVERIFY(p.propertyTypeName() == "int");
-        QVERIFY(p.isDefaultProperty() == false);
-        QCOMPARE(p.position(), 30);
-        QCOMPARE(p.length(), 14);
-    }
-
-}
-
-// Test QDeclarativeObject::property() method
-void tst_qdeclarativedom::object_property()
-{
-    // Invalid object
-    {
-        QDeclarativeDomObject object;
-        QVERIFY(object.property("").isValid() == false);
-        QVERIFY(object.property("foo").isValid() == false);
-    }
-
-    // Valid object - no default
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    x: 10\n"
-                         "    y: 12\n"
-                         "}\n";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QVERIFY(rootObject.property("").isValid() == false);
-        QVERIFY(rootObject.property("foo").isValid() == false);
-
-        QDeclarativeDomProperty x = rootObject.property("x");
-        QVERIFY(x.isValid());
-        QVERIFY(x.propertyName() == "x");
-        QVERIFY(x.propertyNameParts().count() == 1);
-        QVERIFY(x.propertyNameParts().at(0) == "x");
-        QVERIFY(x.isDefaultProperty() == false);
-        QVERIFY(x.value().isLiteral());
-        QVERIFY(x.value().toLiteral().literal() == "10");
-        QCOMPARE(x.position(), 30);
-        QCOMPARE(x.length(), 1);
-
-        QDeclarativeDomProperty y = rootObject.property("y");
-        QVERIFY(y.isValid());
-        QVERIFY(y.propertyName() == "y");
-        QVERIFY(y.propertyNameParts().count() == 1);
-        QVERIFY(y.propertyNameParts().at(0) == "y");
-        QVERIFY(y.isDefaultProperty() == false);
-        QVERIFY(y.value().isLiteral());
-        QVERIFY(y.value().toLiteral().literal() == "12");
-        QCOMPARE(y.position(), 40);
-        QCOMPARE(y.length(), 1);
-    }
-
-    // Valid object - with default
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {\n"
-                         "    x: 10\n"
-                         "    y: 12\n"
-                         "    Item {}\n"
-                         "}\n";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-
-        QVERIFY(rootObject.property("").isValid() == false);
-        QVERIFY(rootObject.property("foo").isValid() == false);
-
-        QDeclarativeDomProperty x = rootObject.property("x");
-        QVERIFY(x.isValid());
-        QVERIFY(x.propertyName() == "x");
-        QVERIFY(x.propertyNameParts().count() == 1);
-        QVERIFY(x.propertyNameParts().at(0) == "x");
-        QVERIFY(x.isDefaultProperty() == false);
-        QVERIFY(x.value().isLiteral());
-        QVERIFY(x.value().toLiteral().literal() == "10");
-        QCOMPARE(x.position(), 30);
-        QCOMPARE(x.length(), 1);
-
-        QDeclarativeDomProperty y = rootObject.property("y");
-        QVERIFY(y.isValid());
-        QVERIFY(y.propertyName() == "y");
-        QVERIFY(y.propertyNameParts().count() == 1);
-        QVERIFY(y.propertyNameParts().at(0) == "y");
-        QVERIFY(y.isDefaultProperty() == false);
-        QVERIFY(y.value().isLiteral());
-        QVERIFY(y.value().toLiteral().literal() == "12");
-        QCOMPARE(y.position(), 40);
-        QCOMPARE(y.length(), 1);
-
-        QDeclarativeDomProperty data = rootObject.property("data");
-        QVERIFY(data.isValid());
-        QVERIFY(data.propertyName() == "data");
-        QVERIFY(data.propertyNameParts().count() == 1);
-        QVERIFY(data.propertyNameParts().at(0) == "data");
-        QVERIFY(data.isDefaultProperty() == true);
-        QVERIFY(data.value().isList());
-        QCOMPARE(data.position(), 50);
-        QCOMPARE(data.length(), 0);
-    }
-}
-
-// Tests the QDeclarativeDomObject::url() method
-void tst_qdeclarativedom::object_url()
-{
-    // Invalid object
-    {
-        QDeclarativeDomObject object;
-        QCOMPARE(object.url(), QUrl());
-    }
-
-    // Valid builtin object
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "Item {}";
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-        QCOMPARE(rootObject.url(), QUrl());
-    }
-
-    // Valid composite object
-    {
-        QByteArray qml = "import QtQuick 1.0\n"
-                         "MyItem {}";
-
-        QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml");
-        QUrl subUrl = QUrl::fromLocalFile(SRCDIR "/data/MyItem.qml");
-
-        QDeclarativeDomDocument document;
-        QVERIFY(document.load(&engine, qml, myUrl));
-
-        QDeclarativeDomObject rootObject = document.rootObject();
-        QVERIFY(rootObject.isValid());
-        QCOMPARE(rootObject.url(), subUrl);
-    }
-}
-
-// Test copy constructors and operators
-void tst_qdeclarativedom::copy()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "MyItem {\n"
-                     "    id: myItem\n"
-                     "    property int a: 10\n"
-                     "    x: 10\n"
-                     "    y: x + 10\n"
-                     "    NumberAnimation on z {}\n"
-                     "    Behavior on opacity {}\n"
-                     "    Component {\n"
-                     "        Item{}\n"
-                     "    }\n"
-                     "    children: [ Item{}, Item{} ]\n"
-                     "}\n";
-
-    QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml");
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml, myUrl));
-
-    // QDeclarativeDomDocument
-    {
-        QDeclarativeDomDocument document2(document);
-        QDeclarativeDomDocument document3;
-        document3 = document;
-
-        QCOMPARE(document.imports().count(), document2.imports().count());
-        QCOMPARE(document.errors().count(), document2.errors().count());
-        QCOMPARE(document.rootObject().objectClassName(), document2.rootObject().objectClassName());
-
-        QCOMPARE(document.imports().count(), document3.imports().count());
-        QCOMPARE(document.errors().count(), document3.errors().count());
-        QCOMPARE(document.rootObject().objectClassName(), document3.rootObject().objectClassName());
-    }
-
-    // QDeclarativeDomImport
-    {
-        QCOMPARE(document.imports().count(), 1);
-        QDeclarativeDomImport import = document.imports().at(0);
-
-        QDeclarativeDomImport import2(import);
-        QDeclarativeDomImport import3;
-        import3 = import2;
-
-        QCOMPARE(import.type(), import2.type());
-        QCOMPARE(import.uri(), import2.uri());
-        QCOMPARE(import.version(), import2.version());
-        QCOMPARE(import.qualifier(), import2.qualifier());
-
-        QCOMPARE(import.type(), import3.type());
-        QCOMPARE(import.uri(), import3.uri());
-        QCOMPARE(import.version(), import3.version());
-        QCOMPARE(import.qualifier(), import3.qualifier());
-    }
-
-    // QDeclarativeDomObject
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QVERIFY(object.isValid());
-
-        QDeclarativeDomObject object2(object);
-        QDeclarativeDomObject object3;
-        object3 = object;
-
-        QCOMPARE(object.isValid(), object2.isValid());
-        QCOMPARE(object.objectType(), object2.objectType());
-        QCOMPARE(object.objectClassName(), object2.objectClassName());
-        QCOMPARE(object.objectTypeMajorVersion(), object2.objectTypeMajorVersion());
-        QCOMPARE(object.objectTypeMinorVersion(), object2.objectTypeMinorVersion());
-        QCOMPARE(object.objectId(), object2.objectId());
-        QCOMPARE(object.properties().count(), object2.properties().count());
-        QCOMPARE(object.dynamicProperties().count(), object2.dynamicProperties().count());
-        QCOMPARE(object.isCustomType(), object2.isCustomType());
-        QCOMPARE(object.customTypeData(), object2.customTypeData());
-        QCOMPARE(object.isComponent(), object2.isComponent());
-        QCOMPARE(object.position(), object2.position());
-        QCOMPARE(object.length(), object2.length());
-        QCOMPARE(object.url(), object2.url());
-
-        QCOMPARE(object.isValid(), object3.isValid());
-        QCOMPARE(object.objectType(), object3.objectType());
-        QCOMPARE(object.objectClassName(), object3.objectClassName());
-        QCOMPARE(object.objectTypeMajorVersion(), object3.objectTypeMajorVersion());
-        QCOMPARE(object.objectTypeMinorVersion(), object3.objectTypeMinorVersion());
-        QCOMPARE(object.objectId(), object3.objectId());
-        QCOMPARE(object.properties().count(), object3.properties().count());
-        QCOMPARE(object.dynamicProperties().count(), object3.dynamicProperties().count());
-        QCOMPARE(object.isCustomType(), object3.isCustomType());
-        QCOMPARE(object.customTypeData(), object3.customTypeData());
-        QCOMPARE(object.isComponent(), object3.isComponent());
-        QCOMPARE(object.position(), object3.position());
-        QCOMPARE(object.length(), object3.length());
-        QCOMPARE(object.url(), object3.url());
-    }
-
-    // QDeclarativeDomDynamicProperty
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomDynamicProperty property = object.dynamicProperty("a");
-
-        QDeclarativeDomDynamicProperty property2(property);
-        QDeclarativeDomDynamicProperty property3;
-        property3 = property;
-
-        QCOMPARE(property.isValid(), property2.isValid());
-        QCOMPARE(property.propertyName(), property2.propertyName());
-        QCOMPARE(property.propertyType(), property2.propertyType());
-        QCOMPARE(property.propertyTypeName(), property2.propertyTypeName());
-        QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty());
-        QCOMPARE(property.defaultValue().propertyName(), property2.defaultValue().propertyName());
-        QCOMPARE(property.position(), property2.position());
-        QCOMPARE(property.length(), property2.length());
-
-        QCOMPARE(property.isValid(), property3.isValid());
-        QCOMPARE(property.propertyName(), property3.propertyName());
-        QCOMPARE(property.propertyType(), property3.propertyType());
-        QCOMPARE(property.propertyTypeName(), property3.propertyTypeName());
-        QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty());
-        QCOMPARE(property.defaultValue().propertyName(), property3.defaultValue().propertyName());
-        QCOMPARE(property.position(), property3.position());
-        QCOMPARE(property.length(), property3.length());
-    }
-
-    // QDeclarativeDomProperty
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("opacity");
-
-        QDeclarativeDomProperty property2(property);
-        QDeclarativeDomProperty property3;
-        property3 = property;
-
-        QCOMPARE(property.isValid(), property2.isValid());
-        QCOMPARE(property.propertyName(), property2.propertyName());
-        QCOMPARE(property.propertyNameParts(), property2.propertyNameParts());
-        QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty());
-        QCOMPARE(property.value().type(), property2.value().type());
-        QCOMPARE(property.position(), property2.position());
-        QCOMPARE(property.length(), property2.length());
-
-        QCOMPARE(property.isValid(), property3.isValid());
-        QCOMPARE(property.propertyName(), property3.propertyName());
-        QCOMPARE(property.propertyNameParts(), property3.propertyNameParts());
-        QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty());
-        QCOMPARE(property.value().type(), property3.value().type());
-        QCOMPARE(property.position(), property3.position());
-        QCOMPARE(property.length(), property3.length());
-    }
-
-    // QDeclarativeDomValueLiteral
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("x");
-        QDeclarativeDomValueLiteral literal = property.value().toLiteral();
-        QCOMPARE(literal.literal(), QString("10"));
-
-        QDeclarativeDomValueLiteral literal2(literal);
-        QDeclarativeDomValueLiteral literal3;
-        literal3 = literal2;
-
-        QCOMPARE(literal2.literal(), QString("10"));
-        QCOMPARE(literal3.literal(), QString("10"));
-    }
-
-
-    // QDeclarativeDomValueBinding
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("y");
-        QDeclarativeDomValueBinding binding = property.value().toBinding();
-        QCOMPARE(binding.binding(), QString("x + 10"));
-
-        QDeclarativeDomValueBinding binding2(binding);
-        QDeclarativeDomValueBinding binding3;
-        binding3 = binding2;
-
-        QCOMPARE(binding2.binding(), QString("x + 10"));
-        QCOMPARE(binding3.binding(), QString("x + 10"));
-    }
-
-    // QDeclarativeDomValueValueSource
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("z");
-        QDeclarativeDomValueValueSource source = property.value().toValueSource();
-        QCOMPARE(source.object().objectClassName(), QByteArray("NumberAnimation"));
-
-        QDeclarativeDomValueValueSource source2(source);
-        QDeclarativeDomValueValueSource source3;
-        source3 = source;
-
-        QCOMPARE(source2.object().objectClassName(), QByteArray("NumberAnimation"));
-        QCOMPARE(source3.object().objectClassName(), QByteArray("NumberAnimation"));
-    }
-
-    // QDeclarativeDomValueValueInterceptor
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("opacity");
-        QDeclarativeDomValueValueInterceptor interceptor = property.value().toValueInterceptor();
-        QCOMPARE(interceptor.object().objectClassName(), QByteArray("Behavior"));
-
-        QDeclarativeDomValueValueInterceptor interceptor2(interceptor);
-        QDeclarativeDomValueValueInterceptor interceptor3;
-        interceptor3 = interceptor;
-
-        QCOMPARE(interceptor2.object().objectClassName(), QByteArray("Behavior"));
-        QCOMPARE(interceptor3.object().objectClassName(), QByteArray("Behavior"));
-    }
-
-    // QDeclarativeDomComponent
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("data");
-        QCOMPARE(property.value().toList().values().count(), 1);
-        QDeclarativeDomComponent component =
-            property.value().toList().values().at(0).toObject().toComponent();
-        QCOMPARE(component.componentRoot().objectClassName(), QByteArray("Item"));
-
-        QDeclarativeDomComponent component2(component);
-        QDeclarativeDomComponent component3;
-        component3 = component;
-
-        QCOMPARE(component.componentRoot().objectClassName(), component2.componentRoot().objectClassName());
-        QCOMPARE(component.isValid(), component2.isValid());
-        QCOMPARE(component.objectType(), component2.objectType());
-        QCOMPARE(component.objectClassName(), component2.objectClassName());
-        QCOMPARE(component.objectTypeMajorVersion(), component2.objectTypeMajorVersion());
-        QCOMPARE(component.objectTypeMinorVersion(), component2.objectTypeMinorVersion());
-        QCOMPARE(component.objectId(), component2.objectId());
-        QCOMPARE(component.properties().count(), component2.properties().count());
-        QCOMPARE(component.dynamicProperties().count(), component2.dynamicProperties().count());
-        QCOMPARE(component.isCustomType(), component2.isCustomType());
-        QCOMPARE(component.customTypeData(), component2.customTypeData());
-        QCOMPARE(component.isComponent(), component2.isComponent());
-        QCOMPARE(component.position(), component2.position());
-        QCOMPARE(component.length(), component2.length());
-        QCOMPARE(component.url(), component2.url());
-
-        QCOMPARE(component.componentRoot().objectClassName(), component3.componentRoot().objectClassName());
-        QCOMPARE(component.isValid(), component3.isValid());
-        QCOMPARE(component.objectType(), component3.objectType());
-        QCOMPARE(component.objectClassName(), component3.objectClassName());
-        QCOMPARE(component.objectTypeMajorVersion(), component3.objectTypeMajorVersion());
-        QCOMPARE(component.objectTypeMinorVersion(), component3.objectTypeMinorVersion());
-        QCOMPARE(component.objectId(), component3.objectId());
-        QCOMPARE(component.properties().count(), component3.properties().count());
-        QCOMPARE(component.dynamicProperties().count(), component3.dynamicProperties().count());
-        QCOMPARE(component.isCustomType(), component3.isCustomType());
-        QCOMPARE(component.customTypeData(), component3.customTypeData());
-        QCOMPARE(component.isComponent(), component3.isComponent());
-        QCOMPARE(component.position(), component3.position());
-        QCOMPARE(component.length(), component3.length());
-        QCOMPARE(component.url(), component3.url());
-    }
-
-    // QDeclarativeDomValue
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("data");
-        QDeclarativeDomValue value = property.value();
-
-        QDeclarativeDomValue value2(value);
-        QDeclarativeDomValue value3;
-        value3 = value;
-
-        QCOMPARE(value.type(), value2.type());
-        QCOMPARE(value.isInvalid(), value2.isInvalid());
-        QCOMPARE(value.isLiteral(), value2.isLiteral());
-        QCOMPARE(value.isBinding(), value2.isBinding());
-        QCOMPARE(value.isValueSource(), value2.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor());
-        QCOMPARE(value.isObject(), value2.isObject());
-        QCOMPARE(value.isList(), value2.isList());
-        QCOMPARE(value.position(), value2.position());
-        QCOMPARE(value.length(), value2.length());
-
-        QCOMPARE(value.type(), value3.type());
-        QCOMPARE(value.isInvalid(), value3.isInvalid());
-        QCOMPARE(value.isLiteral(), value3.isLiteral());
-        QCOMPARE(value.isBinding(), value3.isBinding());
-        QCOMPARE(value.isValueSource(), value3.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor());
-        QCOMPARE(value.isObject(), value3.isObject());
-        QCOMPARE(value.isList(), value3.isList());
-        QCOMPARE(value.position(), value3.position());
-        QCOMPARE(value.length(), value3.length());
-    }
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("x");
-        QDeclarativeDomValue value = property.value();
-
-        QDeclarativeDomValue value2(value);
-        QDeclarativeDomValue value3;
-        value3 = value;
-
-        QCOMPARE(value.type(), value2.type());
-        QCOMPARE(value.isInvalid(), value2.isInvalid());
-        QCOMPARE(value.isLiteral(), value2.isLiteral());
-        QCOMPARE(value.isBinding(), value2.isBinding());
-        QCOMPARE(value.isValueSource(), value2.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor());
-        QCOMPARE(value.isObject(), value2.isObject());
-        QCOMPARE(value.isList(), value2.isList());
-        QCOMPARE(value.position(), value2.position());
-        QCOMPARE(value.length(), value2.length());
-
-        QCOMPARE(value.type(), value3.type());
-        QCOMPARE(value.isInvalid(), value3.isInvalid());
-        QCOMPARE(value.isLiteral(), value3.isLiteral());
-        QCOMPARE(value.isBinding(), value3.isBinding());
-        QCOMPARE(value.isValueSource(), value3.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor());
-        QCOMPARE(value.isObject(), value3.isObject());
-        QCOMPARE(value.isList(), value3.isList());
-        QCOMPARE(value.position(), value3.position());
-        QCOMPARE(value.length(), value3.length());
-    }
-    {
-        QDeclarativeDomValue value;
-
-        QDeclarativeDomValue value2(value);
-        QDeclarativeDomValue value3;
-        value3 = value;
-
-        QCOMPARE(value.type(), value2.type());
-        QCOMPARE(value.isInvalid(), value2.isInvalid());
-        QCOMPARE(value.isLiteral(), value2.isLiteral());
-        QCOMPARE(value.isBinding(), value2.isBinding());
-        QCOMPARE(value.isValueSource(), value2.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor());
-        QCOMPARE(value.isObject(), value2.isObject());
-        QCOMPARE(value.isList(), value2.isList());
-        QCOMPARE(value.position(), value2.position());
-        QCOMPARE(value.length(), value2.length());
-
-        QCOMPARE(value.type(), value3.type());
-        QCOMPARE(value.isInvalid(), value3.isInvalid());
-        QCOMPARE(value.isLiteral(), value3.isLiteral());
-        QCOMPARE(value.isBinding(), value3.isBinding());
-        QCOMPARE(value.isValueSource(), value3.isValueSource());
-        QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor());
-        QCOMPARE(value.isObject(), value3.isObject());
-        QCOMPARE(value.isList(), value3.isList());
-        QCOMPARE(value.position(), value3.position());
-        QCOMPARE(value.length(), value3.length());
-    }
-
-    // QDeclarativeDomList
-    {
-        QDeclarativeDomObject object = document.rootObject();
-        QDeclarativeDomProperty property = object.property("children");
-        QDeclarativeDomList list = property.value().toList();
-        QCOMPARE(list.values().count(), 2);
-
-        QDeclarativeDomList list2(list);
-        QDeclarativeDomList list3;
-        list3 = list2;
-
-        QCOMPARE(list.values().count(), list2.values().count());
-        QCOMPARE(list.position(), list2.position());
-        QCOMPARE(list.length(), list2.length());
-        QCOMPARE(list.commaPositions(), list2.commaPositions());
-
-        QCOMPARE(list.values().count(), list3.values().count());
-        QCOMPARE(list.position(), list3.position());
-        QCOMPARE(list.length(), list3.length());
-        QCOMPARE(list.commaPositions(), list3.commaPositions());
-
-    }
-}
-
-// Tests the position/length of various elements
-void tst_qdeclarativedom::position()
-{
-    QByteArray qml = "import QtQuick 1.0\n"
-                     "Item {\n"
-                     "    id: myItem\n"
-                     "    property int a: 10\n"
-                     "    x: 10\n"
-                     "    y: x + 10\n"
-                     "    NumberAnimation on z {}\n"
-                     "    Behavior on opacity {}\n"
-                     "    Component {\n"
-                     "        Item{}\n"
-                     "    }\n"
-                     "    children: [ Item{}, Item{} ]\n"
-                     "}\n";
-
-
-    QDeclarativeDomDocument document;
-    QVERIFY(document.load(&engine, qml));
-
-    QDeclarativeDomObject root = document.rootObject();
-
-    // All QDeclarativeDomDynamicProperty
-    QDeclarativeDomDynamicProperty dynProp = root.dynamicProperty("a");
-    QCOMPARE(dynProp.position(), 45);
-    QCOMPARE(dynProp.length(), 18);
-
-    // All QDeclarativeDomProperty
-    QDeclarativeDomProperty x = root.property("x");
-    QCOMPARE(x.position(), 68);
-    QCOMPARE(x.length(), 1);
-
-    QDeclarativeDomProperty y = root.property("y");
-    QCOMPARE(y.position(), 78);
-    QCOMPARE(y.length(), 1);
-
-    QDeclarativeDomProperty z = root.property("z");
-    QCOMPARE(z.position(), 111);
-    QCOMPARE(z.length(), 1);
-
-    QDeclarativeDomProperty opacity = root.property("opacity");
-    QCOMPARE(opacity.position(), 132);
-    QCOMPARE(opacity.length(), 7);
-
-    QDeclarativeDomProperty data = root.property("data");
-    QCOMPARE(data.position(), 147);
-    QCOMPARE(data.length(), 0);
-
-    QDeclarativeDomProperty children = root.property("children");
-    QCOMPARE(children.position(), 184);
-    QCOMPARE(children.length(), 8);
-
-    QDeclarativeDomList dataList = data.value().toList();
-    QCOMPARE(dataList.values().count(), 1);
-    QDeclarativeDomList childrenList = children.value().toList();
-    QCOMPARE(childrenList.values().count(), 2);
-
-    // All QDeclarativeDomObject
-    QCOMPARE(root.position(), 19);
-    QCOMPARE(root.length(), 195);
-
-    QDeclarativeDomObject numberAnimation = z.value().toValueSource().object();
-    QCOMPARE(numberAnimation.position(), 92);
-    QCOMPARE(numberAnimation.length(), 23);
-
-    QDeclarativeDomObject behavior = opacity.value().toValueInterceptor().object();
-    QCOMPARE(behavior.position(), 120);
-    QCOMPARE(behavior.length(), 22);
-
-    QDeclarativeDomObject component = dataList.values().at(0).toObject();
-    QCOMPARE(component.position(), 147);
-    QCOMPARE(component.length(), 32);
-
-    QDeclarativeDomObject componentRoot = component.toComponent().componentRoot();
-    QCOMPARE(componentRoot.position(), 167);
-    QCOMPARE(componentRoot.length(), 6);
-
-    QDeclarativeDomObject child1 = childrenList.values().at(0).toObject();
-    QCOMPARE(child1.position(), 196);
-    QCOMPARE(child1.length(), 6);
-
-    QDeclarativeDomObject child2 = childrenList.values().at(1).toObject();
-    QCOMPARE(child2.position(), 204);
-    QCOMPARE(child2.length(), 6);
-
-    // All QDeclarativeDomValue
-    QDeclarativeDomValue xValue = x.value();
-    QCOMPARE(xValue.position(), 71);
-    QCOMPARE(xValue.length(), 2);
-
-    QDeclarativeDomValue yValue = y.value();
-    QCOMPARE(yValue.position(), 81);
-    QCOMPARE(yValue.length(), 6);
-
-    QDeclarativeDomValue zValue = z.value();
-    QCOMPARE(zValue.position(), 92);
-    QCOMPARE(zValue.length(), 23);
-
-    QDeclarativeDomValue opacityValue = opacity.value();
-    QCOMPARE(opacityValue.position(), 120);
-    QCOMPARE(opacityValue.length(), 22);
-
-    QDeclarativeDomValue dataValue = data.value();
-    QCOMPARE(dataValue.position(), 147);
-    QCOMPARE(dataValue.length(), 32);
-
-    QDeclarativeDomValue child1Value = childrenList.values().at(0);
-    QCOMPARE(child1Value.position(), 196);
-    QCOMPARE(child1Value.length(), 6);
-
-    QDeclarativeDomValue child2Value = childrenList.values().at(1);
-    QCOMPARE(child2Value.position(), 204);
-    QCOMPARE(child2Value.length(), 6);
-
-    // All QDeclarativeDomList
-    QCOMPARE(childrenList.position(), 194);
-    QCOMPARE(childrenList.length(), 18);
-}
-
-QTEST_MAIN(tst_qdeclarativedom)
-
-#include "tst_qdeclarativedom.moc"
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/Scope6Nested.qml b/tests/auto/declarative/qdeclarativeecmascript/data/Scope6Nested.qml
new file mode 100644
index 0000000000..a3794df22b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/Scope6Nested.qml
@@ -0,0 +1,7 @@
+import Qt.test 1.0
+
+MyQmlObject {
+    function runtest(obj) {
+        return obj.MyQmlObject.value == 19;
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleOne.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleOne.qml
new file mode 100644
index 0000000000..698b672259
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleOne.qml
@@ -0,0 +1,9 @@
+import QtQuick 1.0
+
+import "importPragmaLibrary.js" as TestPragmaLibraryImport
+
+Rectangle {
+    width: TestPragmaLibraryImport.importIncrementedValue()
+    height: width + 15
+    color: "red"
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleTwo.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleTwo.qml
new file mode 100644
index 0000000000..581ae671e3
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/SpecialRectangleTwo.qml
@@ -0,0 +1,9 @@
+import QtQuick 1.0
+
+import "importPragmaLibrary.js" as TestPragmaLibraryImport
+
+Rectangle {
+    width: TestPragmaLibraryImport.importIncrementedValue()
+    height: width + 5
+    color: "blue"
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFive.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFive.js
new file mode 100644
index 0000000000..e458094552
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFive.js
@@ -0,0 +1,3 @@
+function importFiveFunction() {
+    return '5';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFour.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFour.js
new file mode 100644
index 0000000000..faddc15c9d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importFour.js
@@ -0,0 +1,9 @@
+.pragma library
+
+function importFourFunction() {
+    return '4';
+}
+
+function greetingString() {
+    return 'Hello, World!';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importOne.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importOne.js
new file mode 100644
index 0000000000..338c4e042f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importOne.js
@@ -0,0 +1,13 @@
+.import "importTwo.js" as ImportTwoJs
+.import "importThree.js" as ImportThreeJs
+
+function greetingString() {
+    if (ImportTwoJs.greetingString().length > 0) {
+        return ImportTwoJs.greetingString();
+    }
+    return ImportThreeJs.greetingString();
+}
+
+function importOneFunction() {
+    return '1';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importPragmaLibrary.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importPragmaLibrary.js
new file mode 100644
index 0000000000..c746fef14b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importPragmaLibrary.js
@@ -0,0 +1,9 @@
+.pragma library
+
+var i = 4;
+
+// .pragma library, so should be callable from multiple .qml with shared i.
+function importIncrementedValue() {
+    i = i + 1;
+    return i;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importThree.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importThree.js
new file mode 100644
index 0000000000..3917134ee2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importThree.js
@@ -0,0 +1,9 @@
+.import "importFour.js" as ImportFourJs
+
+function greetingString() {
+    return ImportFourJs.greetingString();
+}
+
+function importThreeFunction() {
+    return '3';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importTwo.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importTwo.js
new file mode 100644
index 0000000000..45b3c9a74d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importTwo.js
@@ -0,0 +1,10 @@
+.import "importFour.js" as ImportFourJs
+.import "importFive.js" as ImportFiveJs
+
+function greetingString() {
+    return ImportFourJs.greetingString();
+}
+
+function importTwoFunction() {
+    return '2';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importWithNoImports.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importWithNoImports.js
new file mode 100644
index 0000000000..83426c425c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/importWithNoImports.js
@@ -0,0 +1,11 @@
+// This js file has no imports, and so should inherit
+// scope from the QML file which includes it.
+
+function componentError() {
+    var i = 5;
+    var errorIsOne = Component.error == 1;
+    if (errorIsOne == true) {
+        i = i + 7;
+    }
+    return i;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImport.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImport.qml
new file mode 100644
index 0000000000..4a284ad886
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImport.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+
+import "testScriptImport.js" as TestScriptImport
+import "testModuleImport.js" as TestModuleImport
+
+QtObject {
+    id: testQtObject
+
+    property string importedScriptStringValue: TestScriptImport.greetingText
+    property int importedScriptFunctionValue: TestScriptImport.randomInteger(1, 20)
+
+    property int importedModuleAttachedPropertyValue: TestModuleImport.importedAttachedPropertyValue(testQtObject)
+    property int importedModuleEnumValue: TestModuleImport.importedEnumValue
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportPragmaLibrary.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportPragmaLibrary.qml
new file mode 100644
index 0000000000..7add311326
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportPragmaLibrary.qml
@@ -0,0 +1,20 @@
+import QtQuick 1.0
+
+// We use the components specified in SpecialRectangleOne.qml and SpecialRectangleTwo.qml
+
+QtObject {
+    id: testQtObject
+
+    property SpecialRectangleOne a;
+    property SpecialRectangleTwo b;
+
+    a: SpecialRectangleOne {
+        id: rectangleOne
+    }
+    b: SpecialRectangleTwo {
+        id: rectangleTwo
+    }
+
+    // this should be: (5 + 15) + (6 + 5) == 31
+    property int testValue: rectangleOne.height + rectangleTwo.height
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportScoping.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportScoping.qml
new file mode 100644
index 0000000000..0df841c78c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testImportScoping.qml
@@ -0,0 +1,11 @@
+import QtQuick 1.0
+
+// For backward compatibility, importing a script which has no imports,
+// should run the script in the parent context.  See QTBUG-17518.
+
+import "importWithNoImports.js" as TestNoImportScoping
+
+QtObject {
+    id: testQtObject
+    property int componentError: TestNoImportScoping.componentError()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testModuleImport.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testModuleImport.js
new file mode 100644
index 0000000000..69bc1c9887
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testModuleImport.js
@@ -0,0 +1,8 @@
+.import Qt.test 1.0 as JsQtTest         // test that we can import elements from .js files
+
+function importedAttachedPropertyValue(obj) {
+    return obj.JsQtTest.MyQmlObject.value; // attached property, value = 19.
+}
+
+var importedEnumValue = JsQtTest.MyQmlObject.EnumValue3 // the actual value of this enum value is "2"
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testScriptImport.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testScriptImport.js
new file mode 100644
index 0000000000..2ecccd8816
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimport/testScriptImport.js
@@ -0,0 +1,11 @@
+.import "importOne.js" as ImportOneJs // test that we can import scripts from .js files
+
+var greetingText = ImportOneJs.greetingString()
+
+function randomInteger(min, max) {
+    if (max > min) {
+        if (min > 10) return min;
+        return max;
+    }
+    return min;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFive.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFive.qml
new file mode 100644
index 0000000000..9bf969cc61
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFive.qml
@@ -0,0 +1,11 @@
+import QtQuick 1.0
+
+// This should fail, since if the script does have imports
+// of its own, it should run in its own context.
+
+import "importWithImports.js" as TestImportScoping
+
+QtObject {
+    id: testQtObject
+    property int componentError: TestImportScoping.componentError()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFour.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFour.qml
new file mode 100644
index 0000000000..fe7e88a829
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failFour.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+import "testModuleImport.js" as TestModuleImport
+
+QtObject {
+    property int importedModuleEnumValue: JsQtTest.MyQmlObject.EnumValue3 // should fail - the typenames available in TestModuleImport should not be available in this scope
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failOne.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failOne.qml
new file mode 100644
index 0000000000..e7fb7656f0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failOne.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+import "testScriptImport.js" as TestScriptImport
+
+QtObject {
+    property string importScriptFunctionValue: TestScriptImport.ImportOneJs.greetingString() // should fail - the context of TestScriptImport is private to TestScriptImport.
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failThree.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failThree.qml
new file mode 100644
index 0000000000..fa720a64eb
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failThree.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+import "testModuleImport.js" as TestModuleImport
+
+QtObject {
+    id: testQtObject
+    property int importedModuleAttachedPropertyValue: testQtObject.TestModuleImport.JsQtTest.MyQmlObject.value // should fail - the context of TestScriptImport is private to TestScriptImport.
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failTwo.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failTwo.qml
new file mode 100644
index 0000000000..c2cbce9f80
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/failTwo.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+import "testScriptImport.js" as TestScriptImport
+
+QtObject {
+    property string importScriptFunctionValue: ImportOneJs.greetingString() // should fail - the typenames in TestScriptImport should not be visible from this scope
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importOne.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importOne.js
new file mode 100644
index 0000000000..45fd9c75dd
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importOne.js
@@ -0,0 +1,7 @@
+function greetingString() {
+    return 'Hello, World!';
+}
+
+function importOneFunction() {
+    return '1';
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importPragmaLibrary.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importPragmaLibrary.js
new file mode 100644
index 0000000000..ad0e6946a2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importPragmaLibrary.js
@@ -0,0 +1,11 @@
+.pragma library
+
+// .pragma library, so shouldn't inherit imports from any .qml file.
+function importValue() {
+    var i = 3;
+    var errorIsOne = Component.error == 1; // this line should fail.
+    if (errorIsOne == true) {
+        i = i + 4;
+    }
+    return i;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importWithImports.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importWithImports.js
new file mode 100644
index 0000000000..6d77ceccb1
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/importWithImports.js
@@ -0,0 +1,13 @@
+.import "importOne.js" as ImportOne
+
+// This js file has imports, so should not inherit
+// scope from the QML file which includes it.
+
+function componentError() {
+    var i = 3;
+    var errorIsOne = Component.error == 1; // this line should fail.
+    if (errorIsOne == true) {
+        i = i + 4;
+    }
+    return i;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testImportPragmaLibrary.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testImportPragmaLibrary.qml
new file mode 100644
index 0000000000..7e4a73ae42
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testImportPragmaLibrary.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+import "importPragmaLibrary.js" as ImportPragmaLibrary
+
+QtObject {
+    id: testQtObject
+    property int testValue: ImportPragmaLibrary.importValue()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testModuleImport.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testModuleImport.js
new file mode 100644
index 0000000000..69bc1c9887
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testModuleImport.js
@@ -0,0 +1,8 @@
+.import Qt.test 1.0 as JsQtTest         // test that we can import elements from .js files
+
+function importedAttachedPropertyValue(obj) {
+    return obj.JsQtTest.MyQmlObject.value; // attached property, value = 19.
+}
+
+var importedEnumValue = JsQtTest.MyQmlObject.EnumValue3 // the actual value of this enum value is "2"
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testScriptImport.js b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testScriptImport.js
new file mode 100644
index 0000000000..2ecccd8816
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsimportfail/testScriptImport.js
@@ -0,0 +1,11 @@
+.import "importOne.js" as ImportOneJs // test that we can import scripts from .js files
+
+var greetingText = ImportOneJs.greetingString()
+
+function randomInteger(min, max) {
+    if (max > min) {
+        if (min > 10) return min;
+        return max;
+    }
+    return min;
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleApi.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApi.qml
new file mode 100644
index 0000000000..62abcb7d83
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApi.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.0
+
+import Qt.test 1.0 as QtTest                                    // module API installed into existing uri
+import Qt.test.scriptApi 1.0 as QtTestScriptApi                 // script module API installed into new uri
+import Qt.test.qobjectApi 1.0 as QtTestQObjectApi               // qobject module API installed into new uri
+import Qt.test.qobjectApi 1.3 as QtTestMinorVersionQObjectApi   // qobject module API installed into existing uri with new minor version
+import Qt.test.qobjectApi 2.0 as QtTestMajorVersionQObjectApi   // qobject module API installed into existing uri with new major version
+import Qt.test.qobjectApiParented 1.0 as QtTestParentedQObjectApi // qobject (with parent) module API installed into a new uri
+
+QtObject {
+    property int existingUriTest: QtTest.qobjectTestProperty
+    property int scriptTest: QtTestScriptApi.scriptTestProperty
+    property int qobjectTest: QtTestQObjectApi.qobjectTestProperty
+    property int qobjectMinorVersionTest: QtTestMinorVersionQObjectApi.qobjectTestProperty
+    property int qobjectMajorVersionTest: QtTestMajorVersionQObjectApi.qobjectTestProperty
+    property int qobjectParentedTest: QtTestParentedQObjectApi.qobjectTestProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiCaching.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiCaching.qml
new file mode 100644
index 0000000000..9cee8c3065
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiCaching.qml
@@ -0,0 +1,12 @@
+import QtQuick 1.0
+
+import Qt.test 1.0 as QtTest                                      // module API installed into existing uri
+import Qt.test.scriptApi 1.0 as QtTestScriptApi                   // script module API installed into new uri
+import Qt.test.qobjectApiParented 1.0 as QtTestParentedQObjectApi // qobject (with parent) module API installed into a new uri
+
+QtObject {
+    property int existingUriTest: QtTest.qobjectTestProperty
+    property int scriptTest: QtTestScriptApi.scriptTestProperty
+    property int qobjectParentedTest: QtTestParentedQObjectApi.qobjectTestProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMajorVersionFail.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMajorVersionFail.qml
new file mode 100644
index 0000000000..eca29ab2cf
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMajorVersionFail.qml
@@ -0,0 +1,10 @@
+import QtQuick 1.0
+
+// this qml file attempts to import an invalid version of a qobject module API.
+
+import Qt.test.qobjectApi 4.0 as QtTestMajorVersionQObjectApi // qobject module API installed into existing uri with nonexistent major version
+
+QtObject {
+    property int qobjectMajorVersionTest: QtTestMajorVersionQObjectApi.qobjectTestProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMinorVersionFail.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMinorVersionFail.qml
new file mode 100644
index 0000000000..e360bd1668
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiMinorVersionFail.qml
@@ -0,0 +1,10 @@
+import QtQuick 1.0
+
+// this qml file attempts to import an invalid version of a qobject module API.
+
+import Qt.test.qobjectApi 1.2 as QtTestMinorVersionQObjectApi // qobject module API installed into existing uri with nonexistent minor version
+
+QtObject {
+    property int qobjectMinorVersionTest: QtTestMinorVersionedQObjectApi.qobjectTestProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiWriting.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiWriting.qml
new file mode 100644
index 0000000000..90a674681c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/moduleApiWriting.qml
@@ -0,0 +1,27 @@
+import QtQuick 1.0
+
+import Qt.test 1.0 as QtTest     // module API installed into existing uri
+
+QtObject {
+    property int firstProperty: 1
+    property int secondProperty: 2
+    property int readOnlyProperty: QtTest.qobjectTestProperty
+    property int writableProperty: QtTest.qobjectTestWritableProperty
+
+    onFirstPropertyChanged: {
+        // In this case, we want to attempt to set the module API property.
+        // This should fail, as the module API property is read only.
+        if (firstProperty != QtTest.qobjectTestProperty) {
+            QtTest.qobjectTestProperty = firstProperty; // should silently fail.
+        }
+    }
+
+    onSecondPropertyChanged: {
+        // In this case, we want to attempt to set the module API property.
+        // This should succeed, as the module API property is writable.
+        if (secondProperty != QtTest.qobjectTestWritableProperty) {
+            QtTest.qobjectTestWritableProperty = secondProperty; // should succeed.
+        }
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml b/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml
new file mode 100644
index 0000000000..cbbbbf921a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml
@@ -0,0 +1,11 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+MyQmlObject {
+    function test1() {
+        value = 4.2
+    }
+    function test2() {
+        value = 7.9
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/ScarceResourceSignalComponent.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/ScarceResourceSignalComponent.qml
new file mode 100644
index 0000000000..fb40bdc2de
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/ScarceResourceSignalComponent.qml
@@ -0,0 +1,9 @@
+import QtQuick 1.0
+
+QtObject {
+    property variant scarceResourceCopy
+    property int width: 5
+    signal testSignal
+    signal testSignal2
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopy.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopy.qml
new file mode 100644
index 0000000000..82184354d8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopy.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+// Here we import a scarce resource directly.
+// The instance has a property which is a copy
+// of the scarce resource, so it should not be
+// detached (but we should automatically release
+// the resource from our engine internal list).
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property variant scarceResourceCopy: scarceResourceProvider.scarceResource
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyFromJs.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyFromJs.qml
new file mode 100644
index 0000000000..60c26ac4f2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyFromJs.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceTest.js" as ScarceResourceProviderJs
+
+// Here we import a scarce resource directly, from JS module.
+// It is not preserved or released manually, so it should be
+// automatically released once evaluation of the binding
+// is complete.
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property variant scarceResourceCopy: ScarceResourceProviderJs.importScarceResource(scarceResourceProvider)
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.js b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.js
new file mode 100644
index 0000000000..bacc50dcc9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.js
@@ -0,0 +1,24 @@
+.import Qt.test 1.0 as JsQtTest
+
+// In this case, the "retn" variable will be evaluated during import.
+// Since the "importScarceResource()" function depends on this variable,
+// we must explicitly preserve the "retn" variable or the scarce
+// resource would automatically be released after import completes
+// but before the binding is evaluated.
+
+var component = Qt.createComponent("scarceResourceCopy.qml");
+var scarceResourceElement = component.createObject(null);
+var scarceResourceProvider = scarceResourceElement.a;
+var retn = scarceResourceProvider.scarceResource;
+retn.preserve(); // must preserve manually or it will be released!
+
+function importScarceResource() {
+    // if called prior to calling destroyScarceResource(),
+    // this function should return the preserved scarce resource.
+    // otherwise, it should return an invalid variant.
+    return retn;
+}
+
+function destroyScarceResource() {
+    retn.destroy();
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.qml
new file mode 100644
index 0000000000..0513b0840e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImport.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceCopyImport.js" as ScarceResourceCopyImportJs
+
+QtObject {
+    // this binding is evaluated once, prior to the resource being released
+    property variant scarceResourceCopy: ScarceResourceCopyImportJs.importScarceResource()
+
+    // this code is evaluated on completion, and so copy one should be valid, copy two invalid.
+    property variant scarceResourceAssignedCopyOne;
+    property variant scarceResourceAssignedCopyTwo;
+    Component.onCompleted: {
+        scarceResourceAssignedCopyOne = ScarceResourceCopyImportJs.importScarceResource();
+        ScarceResourceCopyImportJs.destroyScarceResource();
+        scarceResourceAssignedCopyTwo = ScarceResourceCopyImportJs.importScarceResource();
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.js b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.js
new file mode 100644
index 0000000000..6c495863b5
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.js
@@ -0,0 +1,18 @@
+.import Qt.test 1.0 as JsQtTest
+
+// In this case, the "retn" variable will be evaluated during import.
+// Since the importScarceResource() function depends on this variable,
+// because we DO NOT call "retn.preserve()", the scarce resource will
+// be released after the import completes but prior to evaluation of
+// any binding which calls "importScarceResource()".
+// Thus, "importScarceResource()" will return a released (invalid)
+// scarce resource.
+
+var component = Qt.createComponent("scarceResourceCopy.qml");
+var scarceResourceElement = component.createObject(null);
+var scarceResourceProvider = scarceResourceElement.a;
+var retn = scarceResourceProvider.scarceResource;
+
+function importScarceResource() {
+    return retn; // should return a released (invalid) scarce resource
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.qml
new file mode 100644
index 0000000000..d3c4d4ed65
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportFail.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceCopyImportFail.js" as ScarceResourceCopyImportFailJs
+
+QtObject {
+    property variant scarceResourceCopy: ScarceResourceCopyImportFailJs.importScarceResource()
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.js b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.js
new file mode 100644
index 0000000000..4a5b6b4427
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.js
@@ -0,0 +1,14 @@
+.import Qt.test 1.0 as JsQtTest
+
+// In this case, the "retn" variable will be evaluated during import.
+// Since the importScarceResource() function depends on this variable,
+// because we DO NOT call "retn.preserve()", the scarce resource will
+// be released after the import completes but prior to evaluation of
+// any binding which calls "importScarceResource()".
+// Thus, "importScarceResource()" will return a released (invalid)
+// scarce resource.
+
+var component = Qt.createComponent("scarceResourceCopyNoBinding.qml");
+var scarceResourceElement = component.createObject(null);
+var scarceResourceProvider = scarceResourceElement.a;
+var retn = scarceResourceProvider.scarceResource;
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.qml
new file mode 100644
index 0000000000..72cd4dac8a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyImportNoBinding.qml
@@ -0,0 +1,12 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+// the following js import doesn't manually preserve or destroy any resources
+import "scarceResourceCopyImportNoBinding.js" as ScarceResourceCopyImportNoBindingJs
+
+QtObject {
+    // in this case, there is an import but no binding evaluated.
+    // nonetheless, any resources which are not preserved, should
+    // be automatically released by the engine.
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyNoBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyNoBinding.qml
new file mode 100644
index 0000000000..681a382427
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceCopyNoBinding.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+QtObject {
+    // this component doesn't bind any property to a scarce
+    // resource from the scarce resource provider,
+    // so the binding evaluation resource cleanup
+    // codepath shouldn't be activated; so if the resources
+    // are released, it will be due to the import evaluation
+    // resource cleanup codepath being activated correctly.
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceDestroyedCopy.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceDestroyedCopy.qml
new file mode 100644
index 0000000000..87ceda9d7a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceDestroyedCopy.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceTest.js" as ScarceResourceProviderJs
+
+// In this case, following the evaluation of the binding,
+// the scarceResourceTest value should be an invalid variant,
+// since the scarce resource will have been released.
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property variant scarceResourceCopy: ScarceResourceProviderJs.importReleasedScarceResource(scarceResourceProvider);
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunction.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunction.qml
new file mode 100644
index 0000000000..e3e7aed9ee
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunction.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+// Here we import a scarce resource directly.
+// The copy is only assigned when retrieveScarceResource()
+// is called, and so should be detached prior to that.
+// The copy should be released when releaseScarceResource()
+// is called, and so should be detached after that.
+
+QtObject {
+    id: root
+    property MyScarceResourceObject a: MyScarceResourceObject { id: scarceResourceProvider }
+    property variant scarceResourceCopy;
+
+    function retrieveScarceResource() {
+        root.scarceResourceCopy = scarceResourceProvider.scarceResource;
+    }
+
+    function releaseScarceResource() {
+        root.scarceResourceCopy = null;
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunctionFail.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunctionFail.qml
new file mode 100644
index 0000000000..b1342fea90
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceFunctionFail.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+// In this example, a common syntax error will only be "caught"
+// when the function is called via:
+// QDeclarativeVMEMetaObject::metaCall->invokeMetaMethod()
+// We would like to ensure that a useful error message is printed,
+// rather than having QScriptValue::call() function fail silently.
+
+QtObject {
+    id: root
+    property MyScarceResourceObject a: MyScarceResourceObject { id: scarceResourceProvider }
+    property variant scarceResourceCopy;
+
+    function retrieveScarceResource() {
+        root.scarceResourceCopy = scarceResourceProvider.scarceResource(); // common syntax error, should throw exception
+    }
+
+    function releaseScarceResource() {
+        root.scarceResourceCopy = null;
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceSignal.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceSignal.qml
new file mode 100644
index 0000000000..9c920b1aa0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceSignal.qml
@@ -0,0 +1,29 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+QtObject {
+    id: root
+
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+
+    property ScarceResourceSignalComponent b;
+    b: ScarceResourceSignalComponent {
+        objectName: "srsc"
+
+        onTestSignal: {
+            // this signal will be invoked manually in the test.
+            // the scarce resource should be released automatically after evaluation
+            // and since we don't keep a copy of it, the pixmap will be detached.
+            width = (scarceResourceProvider.scarceResource,10)
+        }
+
+        onTestSignal2: {
+            // this signal will be invoked manually in the test.
+            // the scarce resource should be released automatically after evaluation
+            // but since we assign it to a property, the pixmap won't be detached.
+            scarceResourceCopy = scarceResourceProvider.scarceResource
+        }
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.js b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.js
new file mode 100644
index 0000000000..c904eb3564
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.js
@@ -0,0 +1,48 @@
+.import Qt.test 1.0 as JsQtTest
+
+function importScarceResource(scarceResourceProvider) {
+    // the scarce resource should be automatically released
+    // after the binding is evaluated if preserve is not
+    // called.
+    return scarceResourceProvider.scarceResource;
+}
+
+function importPreservedScarceResource(scarceResourceProvider) {
+    // the scarce resource is manually preserved
+    // during the evaluation of the binding.
+    // it should not be released.
+    var scarceResource = scarceResourceProvider.scarceResource;
+    scarceResource.preserve();
+    return scarceResource;
+}
+
+function importReleasedScarceResource(scarceResourceProvider) {
+    // release the scarce resource during the
+    // evaluation of the binding.  The returned
+    // variant will therefore be invalid.
+    var scarceResource = scarceResourceProvider.scarceResource;
+    scarceResource.destroy();
+    return scarceResource;
+}
+
+function importPreservedScarceResourceFromMultiple(scarceResourceProvider) {
+    // some scarce resources are manually preserved,
+    // some of them are manually destroyed,
+    // and some are automatically managed.
+    // We return a preserved resource
+    var sr1 = scarceResourceProvider.scarceResource; // preserved/destroyed.
+    sr1.preserve();
+    var sr2 = scarceResourceProvider.scarceResource; // preserved/destroyed
+    sr2.preserve();
+    var sr3 = scarceResourceProvider.scarceResource; // automatic.
+    var sr4 = scarceResourceProvider.scarceResource; // automatic and returned.
+    var sr5 = scarceResourceProvider.scarceResource; // destroyed
+    sr5.destroy();
+    sr2.destroy();
+    var sr6 = scarceResourceProvider.scarceResource; // destroyed
+    var sr7 = scarceResourceProvider.scarceResource; // automatic
+    sr1.destroy();
+    sr6.destroy();
+    return sr4;
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.qml
new file mode 100644
index 0000000000..3775172c04
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTest.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+// Here we import a scarce resource directly, and use it in a binding.
+// It is not preserved or released manually, so it should be
+// automatically released once evaluation of the binding
+// is complete.
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property int scarceResourceTest: scarceResourceProvider.scarceResource,100 // return 100, but include the scarceResource in the binding to be evaluated.
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestMultiple.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestMultiple.qml
new file mode 100644
index 0000000000..3139382b05
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestMultiple.qml
@@ -0,0 +1,16 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceTest.js" as ScarceResourceProviderJs
+
+// In this case, multiple scarce resource are explicity preserved
+// and then explicitly destroyed, while others are automatically
+// managed.  Since none are manually preserved without subsequently
+// being destroyed, after the evaluation of the binding the
+// scarce resource should be detached.
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property int scarceResourceTest: ScarceResourceProviderJs.importPreservedScarceResourceFromMultiple(scarceResourceProvider), 100
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestPreserve.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestPreserve.qml
new file mode 100644
index 0000000000..d810377a51
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scarceresources/scarceResourceTestPreserve.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.0
+import Qt.test 1.0
+import "scarceResourceTest.js" as ScarceResourceProviderJs
+
+// In this case, the scarce resource is explicity preserved.
+// It should not be automatically released after the evaluation
+// of the binding is complete, but instead will be kept in
+// memory until the JS garbage collector runs.
+
+QtObject {
+    property MyScarceResourceObject a;
+    a: MyScarceResourceObject { id: scarceResourceProvider }
+    property int scarceResourceTest: ScarceResourceProviderJs.importPreservedScarceResource(scarceResourceProvider),100 // return 100, but the resource should be preserved.
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.5.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.5.qml
new file mode 100644
index 0000000000..405746c459
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.5.qml
@@ -0,0 +1,27 @@
+import QtQuick 1.0
+
+Item {
+    property bool test1: false;
+    property bool test2: false;
+
+    property int a: 10
+
+    Item {
+        id: nested
+        property int a: 11
+
+        function mynestedfunction() {
+            return a;
+        }
+    }
+
+    function myouterfunction() {
+        return a;
+    }
+
+    Component.onCompleted: {
+        test1 = (myouterfunction() == 10);
+        test2 = (nested.mynestedfunction() == 11);
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.6.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.6.qml
new file mode 100644
index 0000000000..1c81e4e945
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.6.qml
@@ -0,0 +1,10 @@
+import QtQuick 1.0
+
+Item {
+    id: me
+    property bool test: nested.runtest(me);
+
+    Scope6Nested {
+        id: nested
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
index 1d65b15476..7256d442e3 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
@@ -41,6 +41,8 @@
 #include "testtypes.h"
 #include <QWidget>
 #include <QPlainTextEdit>
+#include <QDeclarativeEngine>
+#include <QScriptEngine>
 
 class BaseExtensionObject : public QObject
 {
@@ -99,6 +101,37 @@ public:
     void setWidth(int) { }
 };
 
+static QScriptValue script_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+    static int testProperty = 13;
+    QScriptValue v = scriptEngine->newObject();
+    v.setProperty("scriptTestProperty", testProperty++);
+    return v;
+}
+
+static QObject *qobject_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+    testQObjectApi *o = new testQObjectApi();
+    o->setQObjectTestProperty(20);
+    o->setQObjectTestWritableProperty(50);
+    return o;
+}
+
+static QObject *qobject_api_engine_parent(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(scriptEngine)
+
+    static int testProperty = 26;
+    testQObjectApi *o = new testQObjectApi(engine);
+    o->setQObjectTestProperty(testProperty++);
+    return o;
+}
 
 void registerTypes()
 {
@@ -116,6 +149,9 @@ void registerTypes()
     qmlRegisterType<MyRevisionedClass>("Qt.test",1,0,"MyRevisionedClass");
     qmlRegisterType<MyRevisionedClass,1>("Qt.test",1,1,"MyRevisionedClass");
 
+    // test scarce resource property binding post-evaluation optimisation
+    qmlRegisterType<ScarceResourceObject>("Qt.test", 1,0, "MyScarceResourceObject");
+
     // Register the uncreatable base class
     qmlRegisterRevision<MyRevisionedBaseClassRegistered,1>("Qt.test",1,1);
     // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0
@@ -127,6 +163,15 @@ void registerTypes()
     qmlRegisterType<QPlainTextEdit>("Qt.test",1,0,"QPlainTextEdit");
 
     qRegisterMetaType<MyQmlObject::MyType>("MyQmlObject::MyType");
+
+    qmlRegisterModuleApi("Qt.test",1,0,script_api);             // register (script) module API for an existing uri which contains elements
+    qmlRegisterModuleApi("Qt.test",1,0,qobject_api);            // register (qobject) for an existing uri for which another module API was previously regd.  Should replace!
+    qmlRegisterModuleApi("Qt.test.scriptApi",1,0,script_api);   // register (script) module API for a uri which doesn't contain elements
+    qmlRegisterModuleApi("Qt.test.qobjectApi",1,0,qobject_api); // register (qobject) module API for a uri which doesn't contain elements
+    qmlRegisterModuleApi("Qt.test.qobjectApi",1,3,qobject_api); // register (qobject) module API for a uri which doesn't contain elements, minor version set
+    qmlRegisterModuleApi("Qt.test.qobjectApi",2,0,qobject_api); // register (qobject) module API for a uri which doesn't contain elements, major version set
+    qmlRegisterModuleApi("Qt.test.qobjectApiParented",1,0,qobject_api_engine_parent); // register (parented qobject) module API for a uri which doesn't contain elements
+
     qRegisterMetaType<MyQmlObject::MyType>("MyEnum2");
     qRegisterMetaType<Qt::MouseButtons>("Qt::MouseButtons");
 }
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
index ad38d279bb..320e60c82a 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
@@ -51,6 +51,7 @@
 #include <QtGui/qmatrix.h>
 #include <QtGui/qcolor.h>
 #include <QtGui/qvector3d.h>
+#include <QtGui/QPixmap>
 #include <QtCore/qdatetime.h>
 #include <QtScript/qscriptvalue.h>
 #include <QtDeclarative/qdeclarativescriptstring.h>
@@ -909,6 +910,56 @@ QML_DECLARE_TYPE(MyRevisionedClass)
 QML_DECLARE_TYPE(MyRevisionedSubclass)
 Q_DECLARE_METATYPE(MyQmlObject::MyType)
 
+
+class ScarceResourceObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QPixmap scarceResource READ scarceResource WRITE setScarceResource NOTIFY scarceResourceChanged)
+public:
+    ScarceResourceObject(QObject *parent = 0) : QObject(parent), m_value(100, 100) { m_value.fill(Qt::blue); }
+    ~ScarceResourceObject() {}
+
+    QPixmap scarceResource() const { return m_value; }
+    void setScarceResource(QPixmap v) { m_value = v; emit scarceResourceChanged(); }
+
+    bool scarceResourceIsDetached() const { return m_value.isDetached(); }
+
+signals:
+    void scarceResourceChanged();
+
+private:
+    QPixmap m_value;
+};
+
+class testQObjectApi : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY (int qobjectTestProperty READ qobjectTestProperty NOTIFY qobjectTestPropertyChanged)
+    Q_PROPERTY (int qobjectTestWritableProperty READ qobjectTestWritableProperty WRITE setQObjectTestWritableProperty NOTIFY qobjectTestWritablePropertyChanged)
+
+public:
+    testQObjectApi(QObject* parent = 0)
+        : QObject(parent), m_testProperty(0)
+    {
+    }
+
+    ~testQObjectApi() {}
+
+    int qobjectTestProperty() const { return m_testProperty; }
+    void setQObjectTestProperty(int tp) { m_testProperty = tp; emit qobjectTestPropertyChanged(tp); }
+
+    int qobjectTestWritableProperty() const { return m_testWritableProperty; }
+    void setQObjectTestWritableProperty(int tp) { m_testWritableProperty = tp; emit qobjectTestWritablePropertyChanged(tp); }
+
+signals:
+    void qobjectTestPropertyChanged(int testProperty);
+    void qobjectTestWritablePropertyChanged(int testWritableProperty);
+
+private:
+    int m_testProperty;
+    int m_testWritableProperty;
+};
+
 void registerTypes();
 
 #endif // TESTTYPES_H
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 1ec12fec01..efa95d36b6 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -144,6 +144,9 @@ private slots:
     void numberAssignment();
     void propertySplicing();
     void signalWithUnknownTypes();
+    void moduleApi();
+    void importScripts();
+    void scarceResources();
 
     void bug1();
     void bug2();
@@ -176,6 +179,7 @@ private slots:
     void aliasBindingsOverrideTarget();
     void aliasWritesOverrideBindings();
     void pushCleanContext();
+    void realToInt();
 
     void include();
 
@@ -260,6 +264,7 @@ void tst_qdeclarativeecmascript::idShortcutInvalidates()
         QVERIFY(object->objectProperty() != 0);
         delete object->objectProperty();
         QVERIFY(object->objectProperty() == 0);
+        delete object;
     }
 
     {
@@ -269,6 +274,7 @@ void tst_qdeclarativeecmascript::idShortcutInvalidates()
         QVERIFY(object->objectProperty() != 0);
         delete object->objectProperty();
         QVERIFY(object->objectProperty() == 0);
+        delete object;
     }
 }
 
@@ -279,12 +285,14 @@ void tst_qdeclarativeecmascript::boolPropertiesEvaluateAsBool()
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->stringProperty(), QLatin1String("pass"));
+        delete object;
     }
     {
         QDeclarativeComponent component(&engine, TEST_FILE("boolPropertiesEvaluateAsBool.2.qml"));
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->stringProperty(), QLatin1String("pass"));
+        delete object;
     }
 }
 
@@ -297,6 +305,7 @@ void tst_qdeclarativeecmascript::signalAssignment()
         QCOMPARE(object->string(), QString());
         emit object->basicSignal();
         QCOMPARE(object->string(), QString("pass"));
+        delete object;
     }
 
     {
@@ -306,6 +315,7 @@ void tst_qdeclarativeecmascript::signalAssignment()
         QCOMPARE(object->string(), QString());
         emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2"));
+        delete object;
     }
 }
 
@@ -320,6 +330,7 @@ void tst_qdeclarativeecmascript::methods()
         emit object->basicSignal();
         QCOMPARE(object->methodCalled(), true);
         QCOMPARE(object->methodIntCalled(), false);
+        delete object;
     }
 
     {
@@ -331,6 +342,7 @@ void tst_qdeclarativeecmascript::methods()
         emit object->basicSignal();
         QCOMPARE(object->methodCalled(), false);
         QCOMPARE(object->methodIntCalled(), true);
+        delete object;
     }
 
     {
@@ -338,6 +350,7 @@ void tst_qdeclarativeecmascript::methods()
         QObject *object = component.create();
         QVERIFY(object != 0);
         QCOMPARE(object->property("test").toInt(), 19);
+        delete object;
     }
 
     {
@@ -347,6 +360,7 @@ void tst_qdeclarativeecmascript::methods()
         QCOMPARE(object->property("test").toInt(), 19);
         QCOMPARE(object->property("test2").toInt(), 17);
         QCOMPARE(object->property("test3").toInt(), 16);
+        delete object;
     }
 
     {
@@ -354,6 +368,7 @@ void tst_qdeclarativeecmascript::methods()
         QObject *object = component.create();
         QVERIFY(object != 0);
         QCOMPARE(object->property("test").toInt(), 9);
+        delete object;
     }
 }
 
@@ -364,6 +379,7 @@ void tst_qdeclarativeecmascript::bindingLoop()
     QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
     QObject *object = component.create();
     QVERIFY(object != 0);
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::basicExpressions_data()
@@ -508,6 +524,7 @@ void tst_qdeclarativeecmascript::contextPropertiesTriggerReeval()
         QCOMPARE(expr.evaluate(), QVariant::fromValue((QObject *)object3));
     }
 
+    delete object3;
 }
 
 void tst_qdeclarativeecmascript::objectPropertiesTriggerReeval()
@@ -582,6 +599,8 @@ void tst_qdeclarativeecmascript::deferredProperties()
     QCOMPARE(qmlObject->value(), 10);
     object->setValue(19);
     QCOMPARE(qmlObject->value(), 19);
+
+    delete object;
 }
 
 // Check errors on deferred properties are correctly emitted
@@ -625,6 +644,7 @@ void tst_qdeclarativeecmascript::extensionObjects()
     QCOMPARE(nested->coreProperty(), 11);
     QCOMPARE(nested->baseProperty(), 92);
 
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::overrideExtensionProperties()
@@ -635,6 +655,8 @@ void tst_qdeclarativeecmascript::overrideExtensionProperties()
     QVERIFY(object != 0);
     QVERIFY(object->secondProperty() != 0);
     QVERIFY(object->firstProperty() == 0);
+
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::attachedProperties()
@@ -647,6 +669,7 @@ void tst_qdeclarativeecmascript::attachedProperties()
         QCOMPARE(object->property("b").toInt(), 19);
         QCOMPARE(object->property("c").toInt(), 19);
         QCOMPARE(object->property("d").toInt(), 19);
+        delete object;
     }
 
     {
@@ -671,6 +694,7 @@ void tst_qdeclarativeecmascript::attachedProperties()
         QVERIFY(attached != 0);
 
         QCOMPARE(attached->value2(), 9);
+        delete object;
     }
 }
 
@@ -692,6 +716,8 @@ void tst_qdeclarativeecmascript::enums()
     QCOMPARE(object->property("h").toInt(), 3);
     QCOMPARE(object->property("i").toInt(), 19);
     QCOMPARE(object->property("j").toInt(), 19);
+
+    delete object;
     }
     // Non-existent enums
     {
@@ -706,6 +732,8 @@ void tst_qdeclarativeecmascript::enums()
     QVERIFY(object != 0);
     QCOMPARE(object->property("a").toInt(), 0);
     QCOMPARE(object->property("b").toInt(), 0);
+
+    delete object;
     }
 }
 
@@ -716,6 +744,8 @@ void tst_qdeclarativeecmascript::valueTypeFunctions()
     QVERIFY(obj != 0);
     QCOMPARE(obj->rectProperty(), QRect(0,0,100,100));
     QCOMPARE(obj->rectFProperty(), QRectF(0,0.5,100,99.5));
+
+    delete obj;
 }
 
 /* 
@@ -739,6 +769,8 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
         QCOMPARE(object->property("c2").toInt(), 13);
         object->setProperty("c1", QVariant(8));
         QCOMPARE(object->property("c2").toInt(), 13);
+
+        delete object;
     }
 
     // During construction
@@ -752,6 +784,8 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
         object->setProperty("c1", QVariant(9));
         QCOMPARE(object->property("c1").toInt(), 9);
         QCOMPARE(object->property("c2").toInt(), 10);
+
+        delete object;
     }
 
 #if 0
@@ -770,6 +804,8 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
         object->setProperty("c1", QVariant(7));
         QCOMPARE(object->property("c1").toInt(), 7);
         QCOMPARE(object->property("c2").toInt(), 13);
+
+        delete object;
     }
 #endif
 
@@ -784,6 +820,8 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
         object->setProperty("c1", QVariant(9));
         QCOMPARE(object->property("c1").toInt(), 9);
         QCOMPARE(object->property("c3").toInt(), 10);
+
+        delete object;
     }
 }
 
@@ -811,6 +849,8 @@ void tst_qdeclarativeecmascript::outerBindingOverridesInnerBinding()
     QCOMPARE(object->property("c1").toInt(), 9);
     QCOMPARE(object->property("c2").toInt(), 8);
     QCOMPARE(object->property("c3").toInt(), 8);
+
+    delete object;
 }
 
 /*
@@ -827,6 +867,8 @@ void tst_qdeclarativeecmascript::nonExistentAttachedObject()
 
     QObject *object = component.create();
     QVERIFY(object != 0);
+
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::scope()
@@ -846,6 +888,8 @@ void tst_qdeclarativeecmascript::scope()
         QCOMPARE(object->property("test8").toInt(), 2);
         QCOMPARE(object->property("test9").toInt(), 1);
         QCOMPARE(object->property("test10").toInt(), 3);
+
+        delete object;
     }
 
     {
@@ -859,6 +903,8 @@ void tst_qdeclarativeecmascript::scope()
         QCOMPARE(object->property("test4").toInt(), 14);
         QCOMPARE(object->property("test5").toInt(), 24);
         QCOMPARE(object->property("test6").toInt(), 24);
+
+        delete object;
     }
 
     {
@@ -869,6 +915,8 @@ void tst_qdeclarativeecmascript::scope()
         QCOMPARE(object->property("test1").toBool(), true);
         QCOMPARE(object->property("test2").toBool(), true);
         QCOMPARE(object->property("test3").toBool(), true);
+
+        delete object;
     }
 
     // Signal argument scope
@@ -887,6 +935,27 @@ void tst_qdeclarativeecmascript::scope()
 
         delete object;
     }
+
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("scope.5.qml"));
+        QObject *object = component.create();
+        QVERIFY(object != 0);
+
+        QCOMPARE(object->property("test1").toBool(), true);
+        QCOMPARE(object->property("test2").toBool(), true);
+
+        delete object;
+    }
+
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("scope.6.qml"));
+        QObject *object = component.create();
+        QVERIFY(object != 0);
+
+        QCOMPARE(object->property("test").toBool(), true);
+
+        delete object;
+    }
 }
 
 /*
@@ -907,6 +976,8 @@ void tst_qdeclarativeecmascript::signalParameterTypes()
     QVERIFY(object->property("variantProperty") == QVariant::fromValue(QColor(255, 0, 255, 255)));
     QVERIFY(object->property("enumProperty") == MyQmlObject::EnumValue3);
     QVERIFY(object->property("qtEnumProperty") == Qt::LeftButton);
+
+    delete object;
 }
 
 /*
@@ -923,6 +994,8 @@ void tst_qdeclarativeecmascript::objectsCompareAsEqual()
     QCOMPARE(object->property("test3").toBool(), true);
     QCOMPARE(object->property("test4").toBool(), true);
     QCOMPARE(object->property("test5").toBool(), true);
+
+    delete object;
 }
 
 /*
@@ -943,6 +1016,8 @@ void tst_qdeclarativeecmascript::aliasPropertyAndBinding()
 
     QCOMPARE(object->property("c2").toInt(), 19);
     QCOMPARE(object->property("c3").toInt(), 19);
+
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::dynamicCreation_data()
@@ -972,6 +1047,8 @@ void tst_qdeclarativeecmascript::dynamicCreation()
     QObject *created = object->objectProperty();
     QVERIFY(created);
     QCOMPARE(created->objectName(), createdName);
+
+    delete object;
 }
 
 /*
@@ -1020,6 +1097,8 @@ void tst_qdeclarativeecmascript::objectToString()
     QMetaObject::invokeMethod(object, "testToString");
     QVERIFY(object->stringProperty().startsWith("MyQmlObject_QML_"));
     QVERIFY(object->stringProperty().endsWith(", \"objName\")"));
+
+    delete object;
 }
 
 /*
@@ -1034,6 +1113,7 @@ void tst_qdeclarativeecmascript::selfDeletingBinding()
         QObject *object = component.create();
         QVERIFY(object != 0);
         object->setProperty("triggerDelete", true);
+        delete object;
     }
 
     {
@@ -1041,6 +1121,7 @@ void tst_qdeclarativeecmascript::selfDeletingBinding()
         QObject *object = component.create();
         QVERIFY(object != 0);
         object->setProperty("triggerDelete", true);
+        delete object;
     }
 }
 
@@ -1056,6 +1137,7 @@ void tst_qdeclarativeecmascript::extendedObjectPropertyLookup()
     QDeclarativeComponent component(&engine, TEST_FILE("extendedObjectPropertyLookup.qml"));
     QObject *object = component.create();
     QVERIFY(object != 0);
+    delete object;
 }
 
 /*
@@ -1091,6 +1173,8 @@ void tst_qdeclarativeecmascript::scriptErrors()
 
     QTest::ignoreMessage(QtWarningMsg, warning8.toLatin1().constData());
     emit object->thirdBasicSignal();
+
+    delete object;
 }
 
 /*
@@ -1108,6 +1192,16 @@ void tst_qdeclarativeecmascript::functionErrors()
     QObject *object = component.create();
     QVERIFY(object != 0);
     delete object;
+
+    // test that if an exception occurs while invoking js function from cpp, it is reported as expected.
+    QDeclarativeComponent componentTwo(&engine, TEST_FILE("scarceresources/scarceResourceFunctionFail.qml"));
+    url = componentTwo.url().toString();
+    object = componentTwo.create();
+    QVERIFY(object != 0);
+    warning = url + QLatin1String(":16: TypeError: Result of expression 'scarceResourceProvider.scarceResource' [[object Object]] is not a function.");
+    QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); // we expect a meaningful warning to be printed.
+    QMetaObject::invokeMethod(object, "retrieveScarceResource");
+    delete object;
 }
 
 /*
@@ -1156,6 +1250,8 @@ void tst_qdeclarativeecmascript::signalTriggeredBindings()
     QCOMPARE(object->property("base").toReal(), 400.);
     QCOMPARE(object->property("test1").toReal(), 400.);
     QCOMPARE(object->property("test2").toReal(), 400.);
+
+    delete object;
 }
 
 /*
@@ -1171,6 +1267,8 @@ void tst_qdeclarativeecmascript::listProperties()
     QCOMPARE(object->property("test2").toInt(), 2);
     QCOMPARE(object->property("test3").toBool(), true);
     QCOMPARE(object->property("test4").toBool(), true);
+
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::exceptionClearsOnReeval()
@@ -1192,6 +1290,8 @@ void tst_qdeclarativeecmascript::exceptionClearsOnReeval()
     object->setObjectProperty(&object2);
 
     QCOMPARE(object->property("test").toBool(), true);
+
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::exceptionSlotProducesWarning()
@@ -1204,6 +1304,7 @@ void tst_qdeclarativeecmascript::exceptionSlotProducesWarning()
     QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
     MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
     QVERIFY(object != 0);
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::exceptionBindingProducesWarning()
@@ -1216,6 +1317,7 @@ void tst_qdeclarativeecmascript::exceptionBindingProducesWarning()
     QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
     MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
     QVERIFY(object != 0);
+    delete object;
 }
 
 static int transientErrorsMsgCount = 0;
@@ -1239,6 +1341,8 @@ void tst_qdeclarativeecmascript::transientErrors()
     qInstallMsgHandler(old);
 
     QCOMPARE(transientErrorsMsgCount, 0);
+
+    delete object;
     }
 
     // One binding erroring multiple times, but then resolving
@@ -1254,6 +1358,8 @@ void tst_qdeclarativeecmascript::transientErrors()
     qInstallMsgHandler(old);
 
     QCOMPARE(transientErrorsMsgCount, 0);
+
+    delete object;
     }
 }
 
@@ -1369,6 +1475,8 @@ void tst_qdeclarativeecmascript::dynamicCreationCrash()
     QMetaObject::invokeMethod(object, "dontCrash");
     QObject *created = object->objectProperty();
     QVERIFY(created == 0);
+
+    delete object;
 }
 
 //QTBUG-9367
@@ -1378,6 +1486,7 @@ void tst_qdeclarativeecmascript::regExpBug()
     MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
     QVERIFY(object != 0);
     QCOMPARE(object->regExp().pattern(), QLatin1String("[a-zA-z]"));
+    delete object;
 }
 
 void tst_qdeclarativeecmascript::callQtInvokables()
@@ -2151,6 +2260,8 @@ void tst_qdeclarativeecmascript::ownership()
 
         delete object;
     }
+
+    delete context;
 }
 
 class CppOwnershipReturnValue : public QObject
@@ -2269,6 +2380,7 @@ void tst_qdeclarativeecmascript::qlistqobjectMethods()
     QCOMPARE(object->property("test2").toBool(), true);
 
     delete object;
+    delete context;
 }
 
 // QTBUG-9205
@@ -2389,6 +2501,285 @@ void tst_qdeclarativeecmascript::signalWithUnknownTypes()
     delete object;
 }
 
+void tst_qdeclarativeecmascript::moduleApi()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("moduleApi.qml"));
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("existingUriTest").toInt(), 20);
+    QCOMPARE(object->property("scriptTest").toInt(), 13);
+    QCOMPARE(object->property("qobjectTest").toInt(), 20);
+    QCOMPARE(object->property("qobjectMinorVersionTest").toInt(), 20);
+    QCOMPARE(object->property("qobjectMajorVersionTest").toInt(), 20);
+    QCOMPARE(object->property("qobjectParentedTest").toInt(), 26);
+    delete object;
+
+    // test that caching of module apis works correctly.
+    QDeclarativeComponent componentTwo(&engine, TEST_FILE("moduleApiCaching.qml"));
+    object = componentTwo.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("existingUriTest").toInt(), 20);
+    QCOMPARE(object->property("scriptTest").toInt(), 13);            // shouldn't have incremented.
+    QCOMPARE(object->property("qobjectParentedTest").toInt(), 26);   // shouldn't have incremented.
+    delete object;
+
+    // test that writing to a property of module apis works correctly.
+    QDeclarativeComponent componentThree(&engine, TEST_FILE("moduleApiWriting.qml"));
+    QString expectedWarning = QLatin1String("file://") + TEST_FILE("moduleApiWriting.qml").toLocalFile() + QLatin1String(":15: Error: Cannot assign to read-only property \"qobjectTestProperty\"");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = componentThree.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("readOnlyProperty").toInt(), 20);
+    QCOMPARE(object->property("writableProperty").toInt(), 50);
+    QVERIFY(object->setProperty("firstProperty", QVariant(30))); // shouldn't affect value of readOnlyProperty
+    QVERIFY(object->setProperty("writableProperty", QVariant(30))); // SHOULD affect value of writableProperty
+    QCOMPARE(object->property("readOnlyProperty").toInt(), 20);
+    QCOMPARE(object->property("writableProperty").toInt(), 30);
+    delete object;
+
+    QDeclarativeComponent failOne(&engine, TEST_FILE("moduleApiMajorVersionFail.qml"));
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready");
+    object = failOne.create();
+    QVERIFY(object == 0); // should have failed: invalid major version
+
+    QDeclarativeComponent failTwo(&engine, TEST_FILE("moduleApiMinorVersionFail.qml"));
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready");
+    object = failTwo.create();
+    QVERIFY(object == 0); // should have failed: invalid minor version
+}
+
+void tst_qdeclarativeecmascript::importScripts()
+{
+    QObject *object = 0;
+
+    // first, ensure that the required behaviour works.
+    QDeclarativeComponent component(&engine, TEST_FILE("jsimport/testImport.qml"));
+    object = component.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("importedScriptStringValue"), QVariant(QString(QLatin1String("Hello, World!"))));
+    QCOMPARE(object->property("importedScriptFunctionValue"), QVariant(20));
+    QCOMPARE(object->property("importedModuleAttachedPropertyValue"), QVariant(19));
+    QCOMPARE(object->property("importedModuleEnumValue"), QVariant(2));
+    delete object;
+
+    QDeclarativeComponent componentTwo(&engine, TEST_FILE("jsimport/testImportScoping.qml"));
+    object = componentTwo.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("componentError"), QVariant(5));
+    delete object;
+
+    // then, ensure that unintended behaviour does not work.
+    QDeclarativeComponent failOneComponent(&engine, TEST_FILE("jsimportfail/failOne.qml"));
+    QString expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/failOne.qml").toLocalFile() + QLatin1String(":6: TypeError: Result of expression 'TestScriptImport.ImportOneJs' [undefined] is not an object.");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = failOneComponent.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("importScriptFunctionValue").toString().isEmpty());
+    delete object;
+    QDeclarativeComponent failTwoComponent(&engine, TEST_FILE("jsimportfail/failTwo.qml"));
+    expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/failTwo.qml").toLocalFile() + QLatin1String(":6: ReferenceError: Can't find variable: ImportOneJs");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = failTwoComponent.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("importScriptFunctionValue").toString().isEmpty());
+    delete object;
+    QDeclarativeComponent failThreeComponent(&engine, TEST_FILE("jsimportfail/failThree.qml"));
+    expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/failThree.qml").toLocalFile() + QLatin1String(":7: TypeError: Result of expression 'testQtObject.TestModuleImport.JsQtTest' [undefined] is not an object.");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = failThreeComponent.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("importedModuleAttachedPropertyValue"), QVariant(false));
+    delete object;
+    QDeclarativeComponent failFourComponent(&engine, TEST_FILE("jsimportfail/failFour.qml"));
+    expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/failFour.qml").toLocalFile() + QLatin1String(":6: ReferenceError: Can't find variable: JsQtTest");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = failFourComponent.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("importedModuleEnumValue"), QVariant(0));
+    delete object;
+    QDeclarativeComponent failFiveComponent(&engine, TEST_FILE("jsimportfail/failFive.qml"));
+    expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/importWithImports.js").toLocalFile() + QLatin1String(":8: ReferenceError: Can't find variable: Component");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    expectedWarning = QLatin1String("file://") + TEST_FILE("jsimportfail/importPragmaLibrary.js").toLocalFile() + QLatin1String(":6: ReferenceError: Can't find variable: Component");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData());
+    object = failFiveComponent.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("componentError"), QVariant(0));
+    delete object;
+
+    // also, test that importing scripts with .pragma library works as required
+    QDeclarativeComponent pragmaLibraryComponent(&engine, TEST_FILE("jsimport/testImportPragmaLibrary.qml"));
+    object = pragmaLibraryComponent.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("testValue"), QVariant(31));
+    delete object;
+
+    // and that .pragma library scripts don't inherit imports from any .qml file
+    QDeclarativeComponent pragmaLibraryComponentTwo(&engine, TEST_FILE("jsimportfail/testImportPragmaLibrary.qml"));
+    object = pragmaLibraryComponentTwo.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("testValue"), QVariant(0));
+    delete object;
+}
+
+void tst_qdeclarativeecmascript::scarceResources()
+{
+    QPixmap origPixmap(100, 100);
+    origPixmap.fill(Qt::blue);
+
+    QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(&engine);
+    ScarceResourceObject *eo = 0;
+    QObject *object = 0;
+
+    // in the following three cases, the instance created from the component
+    // has a property which is a copy of the scarce resource; hence, the
+    // resource should NOT be detached prior to deletion of the object instance,
+    // unless the resource is destroyed explicitly.
+    QDeclarativeComponent component(&engine, TEST_FILE("scarceresources/scarceResourceCopy.qml"));
+    object = component.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceCopy").isValid());
+    QCOMPARE(object->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(!eo->scarceResourceIsDetached()); // there are two copies of it in existence: the property of object, and the property of eo.
+    delete object;
+
+    QDeclarativeComponent componentTwo(&engine, TEST_FILE("scarceresources/scarceResourceCopyFromJs.qml"));
+    object = componentTwo.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceCopy").isValid());
+    QCOMPARE(object->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(!eo->scarceResourceIsDetached()); // there are two copies of it in existence: the property of object, and the property of eo.
+    delete object;
+
+    QDeclarativeComponent componentThree(&engine, TEST_FILE("scarceresources/scarceResourceDestroyedCopy.qml"));
+    object = componentThree.create();
+    QVERIFY(object != 0);
+    QVERIFY(!(object->property("scarceResourceCopy").isValid())); // was manually released prior to being returned.
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should have explicitly been released during the evaluation of the binding.
+    delete object;
+
+    // in the following three cases, no other copy should exist in memory,
+    // and so it should be detached (unless explicitly preserved).
+    QDeclarativeComponent componentFour(&engine, TEST_FILE("scarceresources/scarceResourceTest.qml"));
+    object = componentFour.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceTest").isValid());
+    QCOMPARE(object->property("scarceResourceTest").toInt(), 100);
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // the resource should have been released after the binding was evaluated.
+    delete object;
+
+    QDeclarativeComponent componentFive(&engine, TEST_FILE("scarceresources/scarceResourceTestPreserve.qml"));
+    object = componentFive.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceTest").isValid());
+    QCOMPARE(object->property("scarceResourceTest").toInt(), 100);
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(!eo->scarceResourceIsDetached()); // this won't be detached since we explicitly preserved it.
+    delete object;
+
+    QDeclarativeComponent componentSix(&engine, TEST_FILE("scarceresources/scarceResourceTestMultiple.qml"));
+    object = componentSix.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceTest").isValid());
+    QCOMPARE(object->property("scarceResourceTest").toInt(), 100);
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // all resources were released manually or automatically released.
+    delete object;
+
+    // test that scarce resources are handled correctly for imports
+    QDeclarativeComponent componentSeven(&engine, TEST_FILE("scarceresources/scarceResourceCopyImportNoBinding.qml"));
+    object = componentSeven.create();
+    QVERIFY(object != 0); // the import should have caused the addition of a resource to the ScarceResources list
+    QVERIFY(ep->scarceResources == 0); // but they should have been released by this point.
+    delete object;
+
+    QDeclarativeComponent componentEight(&engine, TEST_FILE("scarceresources/scarceResourceCopyImportFail.qml"));
+    object = componentEight.create();
+    QVERIFY(object != 0);
+    QVERIFY(!object->property("scarceResourceCopy").isValid()); // wasn't preserved, so shouldn't be valid.
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    delete object;
+
+    QDeclarativeComponent componentNine(&engine, TEST_FILE("scarceresources/scarceResourceCopyImport.qml"));
+    object = componentNine.create();
+    QVERIFY(object != 0);
+    QVERIFY(object->property("scarceResourceCopy").isValid()); // preserved, so should be valid.
+    QCOMPARE(object->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
+    QVERIFY(object->property("scarceResourceAssignedCopyOne").isValid()); // assigned before destroy(), so should be valid.
+    QCOMPARE(object->property("scarceResourceAssignedCopyOne").value<QPixmap>(), origPixmap);
+    QVERIFY(!object->property("scarceResourceAssignedCopyTwo").isValid()); // assigned after destroy(), so should be invalid.
+    QVERIFY(ep->scarceResources == 0); // this will still be zero, because "preserve()" REMOVES it from this list.
+    delete object;
+
+    // test that scarce resources are handled properly in signal invocation
+    QDeclarativeComponent componentTen(&engine, TEST_FILE("scarceresources/scarceResourceSignal.qml"));
+    object = componentTen.create();
+    QVERIFY(object != 0);
+    QObject *srsc = object->findChild<QObject*>("srsc");
+    QVERIFY(srsc);
+    QVERIFY(!srsc->property("scarceResourceCopy").isValid()); // hasn't been instantiated yet.
+    QCOMPARE(srsc->property("width"), QVariant(5)); // default value is 5.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
+    QMetaObject::invokeMethod(srsc, "testSignal");
+    QVERIFY(!srsc->property("scarceResourceCopy").isValid()); // still hasn't been instantiated
+    QCOMPARE(srsc->property("width"), QVariant(10)); // but width was assigned to 10.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should still be no other copies of it at this stage.
+    QMetaObject::invokeMethod(srsc, "testSignal2"); // assigns scarceResourceCopy to the scarce pixmap.
+    QVERIFY(srsc->property("scarceResourceCopy").isValid());
+    QCOMPARE(srsc->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(!(eo->scarceResourceIsDetached())); // should be another copy of the resource now.
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    delete object;
+
+    // test that scarce resources are handled properly from js functions in qml files
+    QDeclarativeComponent componentEleven(&engine, TEST_FILE("scarceresources/scarceResourceFunction.qml"));
+    object = componentEleven.create();
+    QVERIFY(object != 0);
+    QVERIFY(!object->property("scarceResourceCopy").isValid()); // not yet assigned, so should not be valid
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
+    QMetaObject::invokeMethod(object, "retrieveScarceResource");
+    QVERIFY(object->property("scarceResourceCopy").isValid()); // assigned, so should be valid.
+    QCOMPARE(object->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(!eo->scarceResourceIsDetached()); // should be a copy of the resource at this stage.
+    QMetaObject::invokeMethod(object, "releaseScarceResource");
+    QVERIFY(!object->property("scarceResourceCopy").isValid()); // just released, so should not be valid
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    delete object;
+
+    // test that if an exception occurs while invoking js function from cpp, that the resources are released.
+    QDeclarativeComponent componentTwelve(&engine, TEST_FILE("scarceresources/scarceResourceFunctionFail.qml"));
+    object = componentTwelve.create();
+    QVERIFY(object != 0);
+    QVERIFY(!object->property("scarceResourceCopy").isValid()); // not yet assigned, so should not be valid
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
+    QString expectedWarning = QLatin1String("file://") + TEST_FILE("scarceresources/scarceResourceFunctionFail.qml").toLocalFile() + QLatin1String(":16: TypeError: Result of expression 'scarceResourceProvider.scarceResource' [[object Object]] is not a function.");
+    QTest::ignoreMessage(QtWarningMsg, expectedWarning.toAscii().constData()); // we expect a meaningful warning to be printed.
+    QMetaObject::invokeMethod(object, "retrieveScarceResource");
+    QVERIFY(!object->property("scarceResourceCopy").isValid()); // due to exception, assignment will NOT have occurred.
+    eo = qobject_cast<ScarceResourceObject*>(QDeclarativeProperty::read(object, "a").value<QObject*>());
+    QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
+    QVERIFY(ep->scarceResources == 0); // should have been released by this point.
+    delete object;
+}
+
 // Test that assigning a null object works 
 // Regressed with: df1788b4dbbb2826ae63f26bdf166342595343f4
 void tst_qdeclarativeecmascript::nullObjectBinding()
@@ -2970,6 +3361,7 @@ void tst_qdeclarativeecmascript::revisionErrors()
         QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
     {
         QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors2.qml"));
@@ -2991,6 +3383,7 @@ void tst_qdeclarativeecmascript::revisionErrors()
         QTest::ignoreMessage(QtWarningMsg, warning5.toLatin1().constData());
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
     {
         QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors3.qml"));
@@ -3006,6 +3399,7 @@ void tst_qdeclarativeecmascript::revisionErrors()
         QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
 }
 
@@ -3017,6 +3411,7 @@ void tst_qdeclarativeecmascript::revision()
 
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
     {
         QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision2.qml"));
@@ -3024,6 +3419,7 @@ void tst_qdeclarativeecmascript::revision()
 
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
     {
         QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision3.qml"));
@@ -3031,6 +3427,7 @@ void tst_qdeclarativeecmascript::revision()
 
         MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
         QVERIFY(object != 0);
+        delete object;
     }
     // Test that non-root classes can resolve revisioned methods
     {
@@ -3081,6 +3478,18 @@ void tst_qdeclarativeecmascript::pushCleanContext()
     QCOMPARE(func2.call().toInt32(), 6);
 }
 
+void tst_qdeclarativeecmascript::realToInt()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("realToInt.qml"));
+    MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+    QVERIFY(object != 0);
+
+    QMetaObject::invokeMethod(object, "test1");
+    QCOMPARE(object->value(), int(4));
+    QMetaObject::invokeMethod(object, "test2");
+    QCOMPARE(object->value(), int(8));
+}
+
 QTEST_MAIN(tst_qdeclarativeecmascript)
 
 #include "tst_qdeclarativeecmascript.moc"
diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
index c8e7817adc..dba12599f9 100644
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
@@ -863,6 +863,8 @@ void tst_QDeclarativeGridView::noCurrentIndex()
     QCOMPARE(gridview->currentIndex(), 5);
     QVERIFY(gridview->currentItem());
     QVERIFY(gridview->highlightItem());
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::changeFlow()
@@ -1621,6 +1623,8 @@ void tst_QDeclarativeGridView::resetModel()
         QTRY_VERIFY(display != 0);
         QTRY_COMPARE(display->text(), strings.at(i));
     }
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::enforceRange()
@@ -1748,6 +1752,8 @@ void tst_QDeclarativeGridView::QTBUG_8456()
     QTRY_VERIFY(gridview != 0);
 
     QTRY_COMPARE(gridview->currentIndex(), 0);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::manualHighlight()
@@ -1792,6 +1798,8 @@ void tst_QDeclarativeGridView::manualHighlight()
     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
     QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
     QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::footer()
@@ -1839,6 +1847,8 @@ void tst_QDeclarativeGridView::footer()
     QCOMPARE(footer->y(), 600.0);
     QCOMPARE(footer->height(), 20.0);
     QCOMPARE(gridview->contentY(), 0.0);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::header()
@@ -1888,6 +1898,8 @@ void tst_QDeclarativeGridView::header()
     QCOMPARE(header->y(), 10.0);
     QCOMPARE(header->height(), 20.0);
     QCOMPARE(gridview->contentY(), 10.0);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeGridView::indexAt()
diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
index 87e33474d3..26854ef9a4 100644
--- a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
+++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
@@ -224,6 +224,8 @@ void tst_qdeclarativeimage::clearSource()
     QCOMPARE(obj->width(), 0.);
     QCOMPARE(obj->height(), 0.);
     QCOMPARE(obj->progress(), 0.0);
+
+    delete obj;
 }
 
 void tst_qdeclarativeimage::resized()
@@ -531,6 +533,8 @@ void tst_qdeclarativeimage::tiling_QTBUG_6716()
             }
         }
     }
+
+    delete canvas;
 }
 
 void tst_qdeclarativeimage::noLoading()
@@ -579,6 +583,8 @@ void tst_qdeclarativeimage::noLoading()
     QTRY_COMPARE(sourceSpy.count(), 4);
     QTRY_COMPARE(progressSpy.count(), 2);
     QTRY_COMPARE(statusSpy.count(), 2);
+
+    delete obj;
 }
 
 void tst_qdeclarativeimage::paintedWidthHeight()
@@ -648,6 +654,8 @@ void tst_qdeclarativeimage::sourceSize_QTBUG_14303()
     QTRY_COMPARE(obj->sourceSize().width(), 200);
     QTRY_COMPARE(obj->sourceSize().height(), 200);
     QTRY_COMPARE(sourceSizeSpy.count(), 2);
+
+    delete obj;
 }
 
 void tst_qdeclarativeimage::sourceSize_QTBUG_16389()
diff --git a/tests/auto/declarative/qdeclarativeinfo/data/NestedComponent.qml b/tests/auto/declarative/qdeclarativeinfo/data/NestedComponent.qml
new file mode 100644
index 0000000000..d8ae8ae3ba
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeinfo/data/NestedComponent.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+QtObject {
+    property variant nested
+    property variant nested2: nested.nested
+
+    property variant component
+    component: Component {
+        id: myComponent
+        NestedObject { property string testProp: "test" }
+    }
+
+    property variant component2
+    component2: Component {
+        id: myComponent2
+        Image { property string testProp: "test" }
+    }
+
+    Component.onCompleted: {
+        nested = myComponent.createObject(0);
+        nested2 = myComponent2.createObject(0);
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp b/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp
index 42459f10a4..e02ab2d8ca 100644
--- a/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp
+++ b/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp
@@ -60,6 +60,7 @@ public:
 private slots:
     void qmlObject();
     void nestedQmlObject();
+    void nestedComponent();
     void nonQmlObject();
     void nullObject();
     void nonQmlContextedObject();
@@ -82,7 +83,7 @@ void tst_qdeclarativeinfo::qmlObject()
     QObject *object = component.create();
     QVERIFY(object != 0);
 
-    QString message = component.url().toString() + ":3:1: QML QObject_QML_0: Test Message";
+    QString message = component.url().toString() + ":3:1: QML QtObject: Test Message";
     QTest::ignoreMessage(QtWarningMsg, qPrintable(message));
     qmlInfo(object) << "Test Message";
 
@@ -115,6 +116,27 @@ void tst_qdeclarativeinfo::nestedQmlObject()
     qmlInfo(nested2) << "Inner Object";
 }
 
+void tst_qdeclarativeinfo::nestedComponent()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("NestedComponent.qml"));
+
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+
+    QObject *nested = qvariant_cast<QObject *>(object->property("nested"));
+    QVERIFY(nested != 0);
+    QObject *nested2 = qvariant_cast<QObject *>(object->property("nested2"));
+    QVERIFY(nested2 != 0);
+
+    QString message = component.url().toString() + ":10:9: QML NestedObject: Complex Object";
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(message));
+    qmlInfo(nested) << "Complex Object";
+
+    message = component.url().toString() + ":16:9: QML Image: Simple Object";
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(message));
+    qmlInfo(nested2) << "Simple Object";
+}
+
 void tst_qdeclarativeinfo::nonQmlObject()
 {
     QObject object;
diff --git a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest_implicit.qml b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest_implicit.qml
new file mode 100644
index 0000000000..52ffaea0ec
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest_implicit.qml
@@ -0,0 +1,68 @@
+import QtQuick 1.0
+
+Grid {
+    columns: 2
+    width: 100; height: 100
+    function verify() {
+        if (item1.KeyNavigation.tab != item2)
+            return false;
+        if (item1.KeyNavigation.backtab != item4)
+            return false;
+
+        if (item2.KeyNavigation.left != item1)
+            return false;
+        if (item2.KeyNavigation.down != item4)
+            return false;
+        if (item2.KeyNavigation.tab != item3)
+            return false;
+        if (item2.KeyNavigation.backtab != item1)
+            return false;
+
+        if (item3.KeyNavigation.right != item4)
+            return false;
+        if (item3.KeyNavigation.up != item1)
+            return false;
+        if (item3.KeyNavigation.tab != item4)
+            return false;
+        if (item3.KeyNavigation.backtab != item2)
+            return false;
+
+        return true;
+    }
+
+    Rectangle {
+        id: item1
+        objectName: "item1"
+        focus: true
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.tab: item2
+        KeyNavigation.backtab: item4
+    }
+    Rectangle {
+        id: item2
+        objectName: "item2"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.left: item1
+        KeyNavigation.down: item4
+        KeyNavigation.tab: item3
+        KeyNavigation.backtab: item1
+    }
+    Rectangle {
+        id: item3
+        objectName: "item3"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.right: item4
+        KeyNavigation.up: item1
+        KeyNavigation.tab: item4
+        KeyNavigation.backtab: item2
+    }
+    Rectangle {
+        id: item4
+        objectName: "item4"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index 52c9a726ff..7d0a35be23 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -67,6 +67,7 @@ private slots:
     void keyNavigation();
     void keyNavigation_RightToLeft();
     void keyNavigation_skipNotVisible();
+    void keyNavigation_implicitSetting();
     void layoutMirroring();
     void layoutMirroringIllegalParent();
     void smooth();
@@ -773,6 +774,131 @@ void tst_QDeclarativeItem::keyNavigation_skipNotVisible()
     delete canvas;
 }
 
+void tst_QDeclarativeItem::keyNavigation_implicitSetting()
+{
+    QDeclarativeView *canvas = new QDeclarativeView(0);
+    canvas->setFixedSize(240,320);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest_implicit.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    QVariant result;
+    QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+            Q_RETURN_ARG(QVariant, result)));
+    QVERIFY(result.toBool());
+
+    // right
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item1
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // down
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // move to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // left
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // up
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // tab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // backtab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    delete canvas;
+}
+
 void tst_QDeclarativeItem::smooth()
 {
     QDeclarativeComponent component(&engine);
@@ -1092,6 +1218,7 @@ void tst_QDeclarativeItem::childrenRect()
     QCOMPARE(item->height(), qreal(0));
 
     delete o;
+    delete canvas;
 }
 
 // QTBUG-11383
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.errors.txt
new file mode 100644
index 0000000000..ef34d0ea95
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.errors.txt
@@ -0,0 +1 @@
+3:19:Invalid property assignment: unknown enumeration
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.qml
new file mode 100644
index 0000000000..f678fb3136
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.17.qml
@@ -0,0 +1,5 @@
+import Test 1.0
+MyTypeObject {
+    enumProperty: 6
+}
+
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index 2ce493bd2a..42a02ed720 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -273,6 +273,7 @@ void tst_qdeclarativelanguage::errors_data()
     QTest::newRow("wrongType (int for string)") << "wrongType.14.qml" << "wrongType.14.errors.txt" << false;
     QTest::newRow("wrongType (int for url)") << "wrongType.15.qml" << "wrongType.15.errors.txt" << false;
     QTest::newRow("wrongType (invalid object)") << "wrongType.16.qml" << "wrongType.16.errors.txt" << false;
+    QTest::newRow("wrongType (int for enum)") << "wrongType.17.qml" << "wrongType.17.errors.txt" << false;
 
     QTest::newRow("readOnly.1") << "readOnly.1.qml" << "readOnly.1.errors.txt" << false;
     QTest::newRow("readOnly.2") << "readOnly.2.qml" << "readOnly.2.errors.txt" << false;
diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
index 2f7513f09e..cf053e5fb0 100644
--- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
@@ -754,6 +754,8 @@ void tst_qdeclarativelistmodel::get()
     QCOMPARE(spyResult.at(0).toInt(), index);
     QCOMPARE(spyResult.at(1).toInt(), 1);  // only 1 item is modified at a time
     QCOMPARE(spyResult.at(2).value<QList<int> >(), (QList<int>() << role));
+
+    delete model;
 }
 
 void tst_qdeclarativelistmodel::get_data()
@@ -913,6 +915,8 @@ void tst_qdeclarativelistmodel::get_nested()
         QCOMPARE(spyResult.at(1).toInt(), 1);  // only 1 item is modified at a time
         QCOMPARE(spyResult.at(2).value<QList<int> >(), (QList<int>() << role));
     }
+
+    delete model;
 }
 
 void tst_qdeclarativelistmodel::get_nested_data()
@@ -933,6 +937,8 @@ void tst_qdeclarativelistmodel::crash_model_with_multiple_roles()
 
     // used to cause a crash in QDeclarativeVisualDataModel
     model->setProperty(0, "black", true);
+
+    delete rootItem;
 }
 
 //QTBUG-15190
@@ -944,6 +950,8 @@ void tst_qdeclarativelistmodel::set_model_cache()
     QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString()));
     QVERIFY(model != 0);
     QVERIFY(model->property("ok").toBool());
+
+    delete model;
 }
 
 void tst_qdeclarativelistmodel::property_changes()
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 0c96587b30..58d999e020 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -434,6 +434,7 @@ void tst_QDeclarativeListView::items()
     QTRY_COMPARE(listview->highlightMoveSpeed(), 1000.0);
 
     delete canvas;
+    delete testObject;
 }
 
 
@@ -471,6 +472,7 @@ void tst_QDeclarativeListView::changed()
     QTRY_COMPARE(number->text(), model.number(1));
 
     delete canvas;
+    delete testObject;
 }
 
 template <class T>
@@ -555,6 +557,7 @@ void tst_QDeclarativeListView::inserted()
 //    QTRY_COMPARE(listview->contentItemHeight(), model.count() * 20.0);
 
     delete canvas;
+    delete testObject;
 }
 
 template <class T>
@@ -712,6 +715,7 @@ void tst_QDeclarativeListView::removed(bool animated)
     QCOMPARE(name->text(), QString("New"));
 
     delete canvas;
+    delete testObject;
 }
 
 template <class T>
@@ -752,6 +756,7 @@ void tst_QDeclarativeListView::clear()
     QVERIFY(listview->currentIndex() == 0);
 
     delete canvas;
+    delete testObject;
 }
 
 
@@ -841,6 +846,7 @@ void tst_QDeclarativeListView::moved()
     }
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::enforceRange()
@@ -951,6 +957,7 @@ void tst_QDeclarativeListView::spacing()
     }
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::sections()
@@ -1288,6 +1295,8 @@ void tst_QDeclarativeListView::noCurrentIndex()
     QCOMPARE(listview->currentIndex(), 2);
     QVERIFY(listview->highlightItem());
     QVERIFY(listview->currentItem());
+
+    delete canvas;
 }
 
 void tst_QDeclarativeListView::itemList()
@@ -1381,6 +1390,7 @@ void tst_QDeclarativeListView::cacheBuffer()
     }
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::positionViewAtIndex()
@@ -1540,6 +1550,7 @@ void tst_QDeclarativeListView::positionViewAtIndex()
     QTRY_COMPARE(listview->contentY(), 510.);
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::resetModel()
@@ -1844,6 +1855,7 @@ void tst_QDeclarativeListView::QTBUG_11105()
     QCOMPARE(itemCount, 5);
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::header()
@@ -2116,6 +2128,7 @@ void tst_QDeclarativeListView::resizeView()
     QCOMPARE(heightRatio.toReal(), 0.25);
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::sizeLessThan1()
@@ -2151,6 +2164,7 @@ void tst_QDeclarativeListView::sizeLessThan1()
     }
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::QTBUG_14821()
@@ -2299,6 +2313,7 @@ void tst_QDeclarativeListView::indexAt()
     QCOMPARE(listview->indexAt(240,20), -1);
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativeListView::incrementalModel()
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/qmldir
new file mode 100644
index 0000000000..7f5b3a362d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/qmldir
@@ -0,0 +1,2 @@
+plugin AType
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/temptest.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/temptest.qml
new file mode 100644
index 0000000000..a45ac2dd8c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit1/temptest.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+
+// this qml file uses a type which is meant to be defined
+// in a plugin which is specified in the qmldir file.
+// however, that plugin doesn't exist, so it cannot be
+// loaded, and hence the AItem type will be an unknown type.
+
+Item {
+    id: root
+
+    AItem {
+        id: unknown
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/Test.qml
similarity index 60%
rename from tests/auto/declarative/qdeclarativedom/data/MyComponent.qml
rename to tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/Test.qml
index f6760b6a9f..83c65538ba 100644
--- a/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/Test.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
 
 Item {
+    id: moduleRoot
 }
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/qmldir
new file mode 100644
index 0000000000..7c4def92fc
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/qmldir
@@ -0,0 +1,3 @@
+foo bar foo bar
+internal foo bar foo
+Test 1.0 Test.qml
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/temptest2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/temptest2.qml
new file mode 100644
index 0000000000..3eb29f43da
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/implicit2/temptest2.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+// the type loader will implicitly search "." for a qmldir
+// and the qmldir has various syntax errors in it.
+
+Item {
+    id: root
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
index 9d1c609616..06b65d3c6f 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
@@ -70,6 +70,7 @@ private slots:
     void remoteImportWithUnquotedUri();
     void versionNotInstalled();
     void versionNotInstalled_data();
+    void implicitQmldir();
 };
 
 #ifdef Q_OS_SYMBIAN
@@ -119,7 +120,6 @@ inline QUrl TEST_FILE(const QString &filename)
     return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename));
 }
 
-
 void tst_qdeclarativemoduleplugin::importsPlugin()
 {
     QDeclarativeEngine engine;
@@ -308,6 +308,53 @@ void tst_qdeclarativemoduleplugin::versionNotInstalled()
     VERIFY_ERRORS(errorFile.toLatin1().constData());
 }
 
+
+// test that errors are reporting correctly for plugin loading and qmldir parsing
+void tst_qdeclarativemoduleplugin::implicitQmldir()
+{
+    QDeclarativeEngine engine;
+
+    QObject *obj = 0;
+    QList<QDeclarativeError> errors;
+    QString qmldirUrl;
+    QStringList expectedErrors;
+
+    // parsing qmldir succeeds, but plugin specified in the qmldir file doesn't exist
+    QDeclarativeComponent c(&engine, TEST_FILE("data/implicit1/temptest.qml"));
+    qmldirUrl = TEST_FILE("data/implicit1/qmldir").toString();
+    errors = c.errors();
+    QString moduleName = TEST_FILE("data/implicit1").toString().remove(0,7).replace(QLatin1String("/"), QLatin1String("."));
+    expectedErrors << QString(QLatin1String(": module \"") + moduleName + QLatin1String("\" plugin \"AType\" not found"));
+    QVERIFY(errors.size() == expectedErrors.size());
+    for (int i = 0; i < errors.size(); ++i) {
+        QString msg = qmldirUrl + expectedErrors.at(i);
+        QCOMPARE(errors.at(i).toString(), msg); // ensure that the expected message matches the real message.
+    }
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready");
+    obj = c.create();
+    QVERIFY(!obj);
+    delete obj;
+
+    // parsing qmldir fails due to syntax errors etc.
+    QDeclarativeComponent c2(&engine, TEST_FILE("data/implicit2/temptest2.qml"));
+    qmldirUrl = TEST_FILE("data/implicit2/qmldir").toString();
+    errors = c2.errors();
+    expectedErrors = QStringList();
+    expectedErrors << QLatin1String(":1:12: unexpected token");
+    expectedErrors << QLatin1String(":1: expected '.'");
+    expectedErrors << QLatin1String(":2:17: unexpected token");
+    QVERIFY(errors.size() == expectedErrors.size());
+    for (int i = 0; i < errors.size(); ++i) {
+        QString msg = qmldirUrl + expectedErrors.at(i);
+        QCOMPARE(errors.at(i).toString(), msg); // ensure that the expected message matches the real message.
+    }
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready");
+    obj = c2.create();
+    QVERIFY(!obj);
+    delete obj;
+}
+
+
 QTEST_MAIN(tst_qdeclarativemoduleplugin)
 
 #include "tst_qdeclarativemoduleplugin.moc"
diff --git a/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp b/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp
index 6e90cd84ab..31d566fa15 100644
--- a/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp
+++ b/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp
@@ -105,6 +105,8 @@ void tst_QDeclarativeParticles::properties()
 
     particles->setProperty("emissionRate", 12);
     QCOMPARE(particles->property("emissionRate").toInt(), 12);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeParticles::motionGravity()
@@ -145,6 +147,8 @@ void tst_QDeclarativeParticles::motionGravity()
     QCOMPARE(xattractorSpy.count(), 1);
     QCOMPARE(yattractorSpy.count(), 1);
     QCOMPARE(accelerationSpy.count(), 1);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeParticles::motionWander()
@@ -193,6 +197,8 @@ void tst_QDeclarativeParticles::motionWander()
     QCOMPARE(xvarianceSpy.count(), 1);
     QCOMPARE(yvarianceSpy.count(), 1);
     QCOMPARE(paceSpy.count(), 1);
+
+    delete canvas;
 }
 
 void tst_QDeclarativeParticles::runs()
@@ -203,6 +209,8 @@ void tst_QDeclarativeParticles::runs()
     QObject* particles = canvas->rootObject()->findChild<QObject*>("particles");
     QVERIFY(particles);
     QTest::qWait(1000);//Run for one second. Test passes if it doesn't crash.
+
+    delete canvas;
 }
 
 QDeclarativeView *tst_QDeclarativeParticles::createView(const QString &filename)
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index 46c351985f..fa6093f311 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -469,6 +469,7 @@ void tst_QDeclarativePathView::dataModel()
     QTRY_COMPARE(pathview->offset(), 2.);
 
     delete canvas;
+    delete testObject;
 }
 
 void tst_QDeclarativePathView::pathMoved()
@@ -628,6 +629,8 @@ void tst_QDeclarativePathView::resetModel()
         QVERIFY(display != 0);
         QCOMPARE(display->text(), strings.at(i));
     }
+
+    delete canvas;
 }
 
 void tst_QDeclarativePathView::propertyChanges()
diff --git a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
index edb182cdec..725d0238bc 100644
--- a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
+++ b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
@@ -289,18 +289,19 @@ void tst_qdeclarativepixmapcache::parallel()
 
 void tst_qdeclarativepixmapcache::massive()
 {
+    QDeclarativeEngine engine;
     QUrl url = thisfile.resolved(QUrl("data/massive.png"));
 
     // Confirm that massive images remain in the cache while they are
     // in use by the application.
     {
     qint64 cachekey = 0;
-    QDeclarativePixmap p(0, url);
+    QDeclarativePixmap p(&engine, url);
     QVERIFY(p.isReady());
     QVERIFY(p.pixmap().size() == QSize(10000, 1000));
     cachekey = p.pixmap().cacheKey();
 
-    QDeclarativePixmap p2(0, url);
+    QDeclarativePixmap p2(&engine, url);
     QVERIFY(p2.isReady());
     QVERIFY(p2.pixmap().size() == QSize(10000, 1000));
 
@@ -312,13 +313,13 @@ void tst_qdeclarativepixmapcache::massive()
     {
     qint64 cachekey = 0;
     {
-        QDeclarativePixmap p(0, url);
+        QDeclarativePixmap p(&engine, url);
         QVERIFY(p.isReady());
         QVERIFY(p.pixmap().size() == QSize(10000, 1000));
         cachekey = p.pixmap().cacheKey();
     }
 
-    QDeclarativePixmap p2(0, url);
+    QDeclarativePixmap p2(&engine, url);
     QVERIFY(p2.isReady());
     QVERIFY(p2.pixmap().size() == QSize(10000, 1000));
 
diff --git a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
index 78821cb3d3..f1d17d5cb3 100644
--- a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
+++ b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
@@ -1106,80 +1106,94 @@ void tst_QDeclarativePositioners::test_conflictinganchors()
     QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
+    delete item;
 
     component.setData("import QtQuick 1.0\nRow { Item {} }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
+    delete item;
 
     component.setData("import QtQuick 1.0\nGrid { Item {} }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
+    delete item;
 
     component.setData("import QtQuick 1.0\nFlow { Item {} }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
+    delete item;
 
     component.setData("import QtQuick 1.0\nColumn { Item { anchors.top: parent.top } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nColumn { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nColumn { Item { anchors.left: parent.left } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nRow { Item { anchors.left: parent.left } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nRow { Item { anchors.fill: parent } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nRow { Item { anchors.top: parent.top } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QVERIFY(warningMessage.isEmpty());
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nGrid { Item { anchors.horizontalCenter: parent.horizontalCenter } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nGrid { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid"));
     warningMessage.clear();
+    delete item;
 
     component.setData("import QtQuick 1.0\nFlow { Item { anchors.verticalCenter: parent.verticalCenter } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow"));
+    delete item;
 
     component.setData("import QtQuick 1.0\nFlow { Item { anchors.fill: parent } }", QUrl::fromLocalFile(""));
     item = qobject_cast<QDeclarativeItem*>(component.create());
     QVERIFY(item);
     QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow"));
     qInstallMsgHandler(oldMsgHandler);
+    delete item;
 }
 
 void tst_QDeclarativePositioners::test_vertical_qgraphicswidget()
diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp b/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp
index 5b225892c5..d5f2396c6e 100644
--- a/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp
+++ b/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp
@@ -177,6 +177,8 @@ void tst_qdeclarativesmoothedanimation::valueSource()
 
     QTRY_COMPARE(theRect->x(), qreal(200));
     QTRY_COMPARE(theRect->y(), qreal(200));
+
+    delete rect;
 }
 
 void tst_qdeclarativesmoothedanimation::behavior()
@@ -205,6 +207,8 @@ void tst_qdeclarativesmoothedanimation::behavior()
 
     QTRY_COMPARE(theRect->x(), qreal(200));
     QTRY_COMPARE(theRect->y(), qreal(200));
+
+    delete rect;
 }
 
 QTEST_MAIN(tst_qdeclarativesmoothedanimation)
diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
index 557603f1f7..eca183a491 100644
--- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
+++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
@@ -216,6 +216,8 @@ void tst_qdeclarativetext::text()
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->text(), standard.at(i));
         QVERIFY(textObject->width() > 0);
+
+        delete textObject;
     }
 
     for (int i = 0; i < richText.size(); i++)
@@ -229,6 +231,8 @@ void tst_qdeclarativetext::text()
         QString expected = richText.at(i);
         QCOMPARE(textObject->text(), expected.replace("\\\"", "\""));
         QVERIFY(textObject->width() > 0);
+
+        delete textObject;
     }
 }
 
@@ -242,6 +246,8 @@ void tst_qdeclarativetext::width()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->width(), 0.);
+
+        delete textObject;
     }
 
     for (int i = 0; i < standard.size(); i++)
@@ -262,6 +268,8 @@ void tst_qdeclarativetext::width()
         QVERIFY(textObject->boundingRect().width() > 0);
         QCOMPARE(textObject->width(), qreal(metricWidth));
         QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format
+
+        delete textObject;
     }
 
     for (int i = 0; i < richText.size(); i++)
@@ -282,6 +290,8 @@ void tst_qdeclarativetext::width()
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->width(), qreal(documentWidth));
         QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format
+
+        delete textObject;
     }
 }
 
@@ -298,6 +308,8 @@ void tst_qdeclarativetext::wrap()
         QVERIFY(textObject != 0);
         QVERIFY(textObject->wrapMode() == QDeclarativeText::WordWrap);
         QCOMPARE(textObject->width(), 300.);
+
+        delete textObject;
     }
 
     for (int i = 0; i < standard.size(); i++)
@@ -314,6 +326,8 @@ void tst_qdeclarativetext::wrap()
         int oldHeight = textObject->height();
         textObject->setWidth(100);
         QVERIFY(textObject->height() < oldHeight);
+
+        delete textObject;
     }
 
     for (int i = 0; i < richText.size(); i++)
@@ -330,6 +344,8 @@ void tst_qdeclarativetext::wrap()
         qreal oldHeight = textObject->height();
         textObject->setWidth(100);
         QVERIFY(textObject->height() < oldHeight);
+
+        delete textObject;
     }
 
     // richtext again with a fixed height
@@ -347,6 +363,8 @@ void tst_qdeclarativetext::wrap()
         qreal oldHeight = textObject->implicitHeight();
         textObject->setWidth(100);
         QVERIFY(textObject->implicitHeight() < oldHeight);
+
+        delete textObject;
     }
 }
 
@@ -365,6 +383,8 @@ void tst_qdeclarativetext::elide()
 
             QCOMPARE(textObject->elideMode(), m);
             QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
         }
 
         for (int i = 0; i < standard.size(); i++)
@@ -376,6 +396,8 @@ void tst_qdeclarativetext::elide()
 
             QCOMPARE(textObject->elideMode(), m);
             QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
         }
 
         // richtext - does nothing
@@ -388,6 +410,8 @@ void tst_qdeclarativetext::elide()
 
             QCOMPARE(textObject->elideMode(), m);
             QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
         }
     }
 
@@ -408,6 +432,8 @@ void tst_qdeclarativetext::textFormat()
 
         QVERIFY(textObject != 0);
         QVERIFY(textObject->textFormat() == QDeclarativeText::RichText);
+
+        delete textObject;
     }
     {
         QDeclarativeComponent textComponent(&engine);
@@ -416,6 +442,8 @@ void tst_qdeclarativetext::textFormat()
 
         QVERIFY(textObject != 0);
         QVERIFY(textObject->textFormat() == QDeclarativeText::PlainText);
+
+        delete textObject;
     }
 }
 
@@ -497,6 +525,8 @@ void tst_qdeclarativetext::horizontalAlignment()
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
 
             QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
+
+            delete textObject;
         }
     }
 
@@ -510,6 +540,8 @@ void tst_qdeclarativetext::horizontalAlignment()
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
 
             QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
+
+            delete textObject;
         }
     }
 
@@ -648,6 +680,8 @@ void tst_qdeclarativetext::verticalAlignment()
 
             QVERIFY(textObject != 0);
             QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
+
+            delete textObject;
         }
     }
 
@@ -662,6 +696,8 @@ void tst_qdeclarativetext::verticalAlignment()
 
             QVERIFY(textObject != 0);
             QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
+
+            delete textObject;
         }
     }
 
@@ -697,6 +733,8 @@ void tst_qdeclarativetext::font()
         QCOMPARE(textObject->font().pointSize(), 40);
         QCOMPARE(textObject->font().bold(), false);
         QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
     }
 
     {
@@ -708,6 +746,8 @@ void tst_qdeclarativetext::font()
         QCOMPARE(textObject->font().pixelSize(), 40);
         QCOMPARE(textObject->font().bold(), false);
         QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
     }
 
     { 
@@ -718,6 +758,8 @@ void tst_qdeclarativetext::font()
 
         QCOMPARE(textObject->font().bold(), true);
         QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
     }
 
     { 
@@ -728,6 +770,8 @@ void tst_qdeclarativetext::font()
 
         QCOMPARE(textObject->font().italic(), true);
         QCOMPARE(textObject->font().bold(), false);
+
+        delete textObject;
     }
 
     { 
@@ -739,6 +783,8 @@ void tst_qdeclarativetext::font()
         QCOMPARE(textObject->font().family(), QString("Helvetica"));
         QCOMPARE(textObject->font().bold(), false);
         QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
     }
 
     { 
@@ -748,6 +794,8 @@ void tst_qdeclarativetext::font()
         QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
 
         QCOMPARE(textObject->font().family(), QString(""));
+
+        delete textObject;
     }
 }
 
@@ -763,6 +811,8 @@ void tst_qdeclarativetext::style()
 
         QCOMPARE((int)textObject->style(), (int)styles.at(i));
         QCOMPARE(textObject->styleColor(), QColor("white"));
+
+        delete textObject;
     }
     QString componentStr = "import QtQuick 1.0\nText { text: \"Hello World\" }";
     QDeclarativeComponent textComponent(&engine);
@@ -775,6 +825,8 @@ void tst_qdeclarativetext::style()
 
     QVERIFY(brPre.width() < brPost.width());
     QVERIFY(brPre.height() < brPost.height());
+
+    delete textObject;
 }
 
 void tst_qdeclarativetext::color()
@@ -789,6 +841,8 @@ void tst_qdeclarativetext::color()
 
         QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
         QCOMPARE(textObject->styleColor(), QColor());
+
+        delete textObject;
     }
 
     for (int i = 0; i < colorStrings.size(); i++)
@@ -801,6 +855,8 @@ void tst_qdeclarativetext::color()
         QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
         // default color to black?
         QCOMPARE(textObject->color(), QColor("black"));
+
+        delete textObject;
     }
     
     for (int i = 0; i < colorStrings.size(); i++)
@@ -814,6 +870,8 @@ void tst_qdeclarativetext::color()
 
             QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
             QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
+
+            delete textObject;
         }
     }
     {
@@ -827,6 +885,8 @@ void tst_qdeclarativetext::color()
         QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
 
         QCOMPARE(textObject->color(), testColor);
+
+        delete textObject;
     }
 }
 
@@ -840,6 +900,8 @@ void tst_qdeclarativetext::smooth()
             textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
             QCOMPARE(textObject->smooth(), true);
+
+            delete textObject;
         }
         {
             QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
@@ -847,6 +909,8 @@ void tst_qdeclarativetext::smooth()
             textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
             QCOMPARE(textObject->smooth(), false);
+
+            delete textObject;
         }
     }
     for (int i = 0; i < richText.size(); i++)
@@ -857,6 +921,8 @@ void tst_qdeclarativetext::smooth()
             textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
             QCOMPARE(textObject->smooth(), true);
+
+            delete textObject;
         }
         {
             QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
@@ -864,6 +930,8 @@ void tst_qdeclarativetext::smooth()
             textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
             QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
             QCOMPARE(textObject->smooth(), false);
+
+            delete textObject;
         }
     }
 }
@@ -878,6 +946,8 @@ void tst_qdeclarativetext::weight()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }";
@@ -887,6 +957,8 @@ void tst_qdeclarativetext::weight()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold);
+
+        delete textObject;
     }
 }
 
@@ -900,6 +972,8 @@ void tst_qdeclarativetext::underline()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().underline(), false);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { font.underline: true; text: \"Hello world!\" }";
@@ -909,6 +983,8 @@ void tst_qdeclarativetext::underline()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().underline(), true);
+
+        delete textObject;
     }
 }
 
@@ -922,6 +998,8 @@ void tst_qdeclarativetext::overline()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().overline(), false);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { font.overline: true; text: \"Hello world!\" }";
@@ -931,6 +1009,8 @@ void tst_qdeclarativetext::overline()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().overline(), true);
+
+        delete textObject;
     }
 }
 
@@ -944,6 +1024,8 @@ void tst_qdeclarativetext::strikeout()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().strikeOut(), false);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { font.strikeout: true; text: \"Hello world!\" }";
@@ -953,6 +1035,8 @@ void tst_qdeclarativetext::strikeout()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().strikeOut(), true);
+
+        delete textObject;
     }
 }
 
@@ -966,6 +1050,8 @@ void tst_qdeclarativetext::capitalization()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }";
@@ -975,6 +1061,8 @@ void tst_qdeclarativetext::capitalization()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }";
@@ -984,6 +1072,8 @@ void tst_qdeclarativetext::capitalization()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }";
@@ -993,6 +1083,8 @@ void tst_qdeclarativetext::capitalization()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }";
@@ -1002,6 +1094,8 @@ void tst_qdeclarativetext::capitalization()
 
         QVERIFY(textObject != 0);
         QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize);
+
+        delete textObject;
     }
 }
 
@@ -1015,6 +1109,8 @@ void tst_qdeclarativetext::letterSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().letterSpacing(), 0.0);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }";
@@ -1024,6 +1120,8 @@ void tst_qdeclarativetext::letterSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().letterSpacing(), -2.);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }";
@@ -1033,6 +1131,8 @@ void tst_qdeclarativetext::letterSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().letterSpacing(), 3.);
+
+        delete textObject;
     }
 }
 
@@ -1046,6 +1146,8 @@ void tst_qdeclarativetext::wordSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().wordSpacing(), 0.0);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }";
@@ -1055,6 +1157,8 @@ void tst_qdeclarativetext::wordSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().wordSpacing(), -50.);
+
+        delete textObject;
     }
     {
         QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }";
@@ -1064,6 +1168,8 @@ void tst_qdeclarativetext::wordSpacing()
 
         QVERIFY(textObject != 0);
         QCOMPARE(textObject->font().wordSpacing(), 200.);
+
+        delete textObject;
     }
 }
 
@@ -1132,6 +1238,8 @@ void tst_qdeclarativetext::clickLink()
         }
 
         QCOMPARE(test.link, QLatin1String("http://qt.nokia.com"));
+
+        delete textObject;
     }
 }
 
@@ -1269,6 +1377,8 @@ void tst_qdeclarativetext::implicitSize()
     textObject->resetWidth();
     QVERIFY(textObject->width() == textObject->implicitWidth());
     QVERIFY(textObject->height() == textObject->implicitHeight());
+
+    delete textObject;
 }
 
 void tst_qdeclarativetext::testQtQuick11Attributes()
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index a241241505..821c4ca0f7 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -713,6 +713,8 @@ void tst_qdeclarativetextinput::moveCursorSelection()
         QCOMPARE(textinputObject->selectionStart(), selectionStart);
         QCOMPARE(textinputObject->selectionEnd(), selectionEnd);
     }
+
+    delete textinputObject;
 }
 
 void tst_qdeclarativetextinput::moveCursorSelectionSequence_data()
@@ -915,6 +917,8 @@ void tst_qdeclarativetextinput::moveCursorSelectionSequence()
     QCOMPARE(textinputObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start));
     QCOMPARE(textinputObject->selectionStart(), selection2Start);
     QCOMPARE(textinputObject->selectionEnd(), selection2End);
+
+    delete textinputObject;
 }
 
 void tst_qdeclarativetextinput::mouseSelection_data()
@@ -1712,6 +1716,8 @@ void tst_qdeclarativetextinput::copyAndPaste() {
         }
         index++;
     }
+
+    delete textInput;
 #endif
 }
 
@@ -1764,6 +1770,8 @@ void tst_qdeclarativetextinput::passwordCharacter()
     textInput->setPasswordCharacter(".");
     // QTBUG-12383 content is updated and redrawn
     QVERIFY(contentsSize != textInput->contentsSize());
+
+    delete textInput;
 }
 
 void tst_qdeclarativetextinput::cursorDelegate()
diff --git a/tests/auto/declarative/qdeclarativev4/data/doubleBoolJump.qml b/tests/auto/declarative/qdeclarativev4/data/doubleBoolJump.qml
new file mode 100644
index 0000000000..e7fb82ca36
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/doubleBoolJump.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.0
+
+Rectangle { 
+    QtObject {                                                                                    
+        property real output: i1.p1 || i2.p2 == "text" ? 0.7  : 0
+    }
+
+    QtObject {
+        id: i2
+        property string p2
+    }
+
+    QtObject {
+        id: i1
+        property bool p1: false
+    }
+}  
+
diff --git a/tests/auto/declarative/qdeclarativev4/data/fetchException.qml b/tests/auto/declarative/qdeclarativev4/data/fetchException.qml
new file mode 100644
index 0000000000..ece8e73199
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/fetchException.qml
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+Item {
+    property Item data
+    property int a: data.x, 1
+}
diff --git a/tests/auto/declarative/qdeclarativev4/data/logicalOr.2.qml b/tests/auto/declarative/qdeclarativev4/data/logicalOr.2.qml
new file mode 100644
index 0000000000..54fb78b127
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/logicalOr.2.qml
@@ -0,0 +1,6 @@
+import Qt.v4 1.0
+
+Result {
+    property string s: "foo" || "bar"
+    result: s == "foo"
+}
diff --git a/tests/auto/declarative/qdeclarativev4/data/logicalOr.qml b/tests/auto/declarative/qdeclarativev4/data/logicalOr.qml
new file mode 100644
index 0000000000..406a7d83eb
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/logicalOr.qml
@@ -0,0 +1,6 @@
+import Qt.v4 1.0
+
+Result {
+    property int a: 10
+    result: a == 1 || a == 2
+}
diff --git a/tests/auto/declarative/qdeclarativev4/data/nestedObjectAccess.qml b/tests/auto/declarative/qdeclarativev4/data/nestedObjectAccess.qml
new file mode 100644
index 0000000000..56cd17e41e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/nestedObjectAccess.qml
@@ -0,0 +1,5 @@
+import Qt.v4 1.0
+
+Result {
+    result: nested.result
+}
diff --git a/tests/auto/declarative/qdeclarativev4/data/nullQObject.qml b/tests/auto/declarative/qdeclarativev4/data/nullQObject.qml
new file mode 100644
index 0000000000..283c1a199b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/nullQObject.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+Item {  
+    property QtObject obj
+    property QtObject test
+    test: obj
+}        
diff --git a/tests/auto/declarative/qdeclarativev4/data/qrealToIntRounding.qml b/tests/auto/declarative/qdeclarativev4/data/qrealToIntRounding.qml
new file mode 100644
index 0000000000..f961910f15
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/qrealToIntRounding.qml
@@ -0,0 +1,10 @@
+import QtQuick 1.0
+
+QtObject {
+    property int data: 1
+
+    property int test1: 6.6 + data
+    property int test2: 6.2 + data
+    property int test3: 6 + data
+}
+
diff --git a/tests/auto/declarative/qdeclarativev4/data/subscriptionsInConditionalExpressions.qml b/tests/auto/declarative/qdeclarativev4/data/subscriptionsInConditionalExpressions.qml
new file mode 100644
index 0000000000..25483b207d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/subscriptionsInConditionalExpressions.qml
@@ -0,0 +1,11 @@
+import QtQuick 1.0
+
+Item {
+    id: thisTest
+
+    property bool cond: true
+    property real a: 1
+    property real result: cond ? a : a
+
+    PropertyAction { running: true; target: thisTest; property: "a"; value: 2; }
+}
diff --git a/tests/auto/declarative/qdeclarativev4/data/unaryMinus.qml b/tests/auto/declarative/qdeclarativev4/data/unaryMinus.qml
new file mode 100644
index 0000000000..3cfa0492c0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/unaryMinus.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.0
+
+Item { 
+    property real test1: -i1.p2
+    property int test2: -i1.p2
+    property real test3: -i1.p1
+    property int test4: -i1.p1
+    property real test5: -i1.p3
+    property int test6: -i1.p3
+
+    QtObject {
+        id: i1
+        property real p1: -3.7 
+        property int p2: 18
+        property real p3: -3.3 
+    }
+ } 
+
diff --git a/tests/auto/declarative/qdeclarativev4/data/unnecessaryReeval.qml b/tests/auto/declarative/qdeclarativev4/data/unnecessaryReeval.qml
new file mode 100644
index 0000000000..48662d7a2d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/unnecessaryReeval.qml
@@ -0,0 +1,7 @@
+import Qt.v4 1.0
+
+Result {
+    property int a: 8
+    property int b: 19
+    result:  (a == 8)?b:7
+}
diff --git a/tests/auto/declarative/qdeclarativev4/qdeclarativev4.pro b/tests/auto/declarative/qdeclarativev4/qdeclarativev4.pro
new file mode 100644
index 0000000000..ee22a04629
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/qdeclarativev4.pro
@@ -0,0 +1,18 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative script network
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qdeclarativev4.cpp \
+           testtypes.cpp 
+HEADERS += testtypes.h 
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qdeclarativev4/testtypes.cpp b/tests/auto/declarative/qdeclarativev4/testtypes.cpp
new file mode 100644
index 0000000000..f4544b6e21
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/testtypes.cpp
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "testtypes.h"
+
+#include <QtDeclarative/qdeclarative.h>
+
+void registerTypes() 
+{
+    qmlRegisterType<ResultObject>("Qt.v4", 1,0, "Result");
+    qmlRegisterType<NestedObject>();
+}
diff --git a/tests/auto/declarative/qdeclarativev4/testtypes.h b/tests/auto/declarative/qdeclarativev4/testtypes.h
new file mode 100644
index 0000000000..0933eff8b7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/testtypes.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef TESTTYPES_H
+#define TESTTYPES_H
+
+#include <QtCore/qobject.h>
+
+class NestedObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int dummy READ dummy);
+    Q_PROPERTY(int result READ result FINAL CONSTANT);
+
+public:
+    int dummy() const { return 7; }
+    int result() const { return 37; }
+};
+
+class ResultObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int result READ result WRITE setResult FINAL)
+    Q_PROPERTY(NestedObject *nested READ nested CONSTANT)
+public:
+    ResultObject() : m_result(0), m_resultCounter(0) {}
+
+    int resultCounter() const { return m_resultCounter; }
+    void resetResultCounter() { m_resultCounter = 0; }
+
+    int result() const { return m_result; }
+    void setResult(int result) { m_result = result; m_resultCounter++; }
+
+    NestedObject *nested() { return &m_nested; }
+
+private:
+    int m_result;
+    int m_resultCounter;
+
+    NestedObject m_nested;
+};
+
+void registerTypes();
+
+#endif // TESTTYPES_H
+
diff --git a/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp b/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
new file mode 100644
index 0000000000..0f8c5bcf66
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qfileinfo.h>
+#include <QtCore/qdir.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtCore/qdebug.h>
+
+#include <private/qdeclarativev4compiler_p.h>
+
+#include "testtypes.h"
+
+inline QUrl TEST_FILE(const QString &filename)
+{
+    QFileInfo fileInfo(__FILE__);
+    return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath("data/" + filename));
+}
+
+inline QUrl TEST_FILE(const char *filename)
+{
+    return TEST_FILE(QLatin1String(filename));
+}
+
+class tst_qdeclarativev4 : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qdeclarativev4() {}
+
+private slots:
+    void initTestCase();
+
+    void unnecessaryReeval();
+    void logicalOr();
+    void qtscript();
+    void qtscript_data();
+    void nestedObjectAccess();
+    void subscriptionsInConditionalExpressions();
+
+private:
+    QDeclarativeEngine engine;
+};
+
+void tst_qdeclarativev4::initTestCase()
+{
+    registerTypes();
+}
+
+static int v4ErrorsMsgCount = 0;
+static void v4ErrorsMsgHandler(QtMsgType, const char *message)
+{
+    QByteArray m(message);
+    if (m.contains("QDeclarativeV4"))
+        v4ErrorsMsgCount++;
+}
+
+void tst_qdeclarativev4::qtscript()
+{
+    QFETCH(QString, file);
+    QDeclarativeV4Compiler::enableBindingsTest(true);
+
+    QDeclarativeComponent component(&engine, TEST_FILE(file));
+
+    v4ErrorsMsgCount = 0;
+    QtMsgHandler old = qInstallMsgHandler(v4ErrorsMsgHandler);
+
+    QObject *o = component.create();
+    delete o;
+
+    qInstallMsgHandler(old);
+
+    QCOMPARE(v4ErrorsMsgCount, 0);
+
+    QDeclarativeV4Compiler::enableBindingsTest(false);
+}
+
+void tst_qdeclarativev4::qtscript_data()
+{
+    QTest::addColumn<QString>("file");
+
+    QTest::newRow("qreal -> int rounding") << "qrealToIntRounding.qml";
+    QTest::newRow("exception on fetch") << "fetchException.qml";
+    QTest::newRow("logical or") << "logicalOr.qml";
+    QTest::newRow("double bool jump") << "doubleBoolJump.qml";
+    QTest::newRow("unary minus") << "unaryMinus.qml";
+    QTest::newRow("null qobject") << "nullQObject.qml";
+}
+
+void tst_qdeclarativev4::unnecessaryReeval()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("unnecessaryReeval.qml"));
+
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    ResultObject *ro = qobject_cast<ResultObject *>(o);
+    QVERIFY(ro != 0);
+
+    QCOMPARE(ro->resultCounter(),  1);
+    QCOMPARE(ro->result(), 19);
+    ro->resetResultCounter();
+
+    ro->setProperty("b", 6);
+
+    QCOMPARE(ro->resultCounter(),  1);
+    QCOMPARE(ro->result(), 6);
+    ro->resetResultCounter();
+
+    ro->setProperty("a", 14);
+
+    QCOMPARE(ro->resultCounter(),  1);
+    QCOMPARE(ro->result(), 7);
+    ro->resetResultCounter();
+
+    ro->setProperty("b", 14);
+    QCOMPARE(ro->resultCounter(),  0);
+    QCOMPARE(ro->result(), 7);
+
+    delete o;
+}
+
+void tst_qdeclarativev4::logicalOr()
+{
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("logicalOr.qml"));
+
+        QObject *o = component.create();
+        QVERIFY(o != 0);
+
+        ResultObject *ro = qobject_cast<ResultObject *>(o);
+        QVERIFY(ro != 0);
+
+        QCOMPARE(ro->result(), 0);
+        delete o;
+    }
+
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("logicalOr.2.qml"));
+
+        QObject *o = component.create();
+        QVERIFY(o != 0);
+
+        ResultObject *ro = qobject_cast<ResultObject *>(o);
+        QVERIFY(ro != 0);
+
+        QCOMPARE(ro->result(), 1);
+        delete o;
+    }
+}
+
+// This would previously use the metaObject of the root element to result the nested access.
+// That is, the index for accessing "result" would have been RootObject::result, instead of
+// NestedObject::result.
+void tst_qdeclarativev4::nestedObjectAccess()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("nestedObjectAccess.qml"));
+
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    ResultObject *ro = qobject_cast<ResultObject *>(o);
+    QVERIFY(ro != 0);
+
+    QCOMPARE(ro->result(), 37);
+
+    delete o;
+}
+
+void tst_qdeclarativev4::subscriptionsInConditionalExpressions()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("subscriptionsInConditionalExpressions.qml"));
+
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    QObject *ro = qobject_cast<QObject *>(o);
+    QVERIFY(ro != 0);
+
+    QCOMPARE(ro->property("result").toReal(), qreal(2));
+
+    delete o;
+}
+
+QTEST_MAIN(tst_qdeclarativev4)
+
+#include "tst_qdeclarativev4.moc"
diff --git a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
index 83856597f2..bf2e85139f 100644
--- a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
+++ b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
@@ -93,6 +93,8 @@ void tst_QDeclarativeView::scene()
     QVERIFY(declarativeItem);
     QVERIFY(scene.items().count() > 0);
     QCOMPARE(scene.items().at(0), declarativeItem);
+
+    delete view;
 }
 
 void tst_QDeclarativeView::resizemodedeclarativeitem()
diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp b/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp
index d0e8c1c143..7f158fce67 100644
--- a/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp
+++ b/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp
@@ -524,7 +524,7 @@ void tst_qdeclarativexmlhttprequest::send_ignoreData()
         QVERIFY(server.isValid());
         QVERIFY(server.wait(TEST_FILE("send_ignoreData_PUT.expect"), 
                             TEST_FILE("send_ignoreData.reply"), 
-                            TEST_FILE("testdocument.html")));
+                            QUrl()));
 
         QDeclarativeComponent component(&engine, TEST_FILE("send_ignoreData.qml"));
         QObject *object = component.beginCreate(engine.rootContext());
diff --git a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 1b9831c1ad..f12bcc32db 100644
--- a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -546,6 +546,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(!nullProp.isUser());
     QVERIFY(!nullProp.hasStdCppSet());
     QVERIFY(!nullProp.isEnumOrFlag());
+    QVERIFY(!nullProp.isConstant());
+    QVERIFY(!nullProp.isFinal());
     QCOMPARE(nullProp.index(), 0);
 
     // Add a property and check its attributes.
@@ -563,6 +565,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(!prop1.isUser());
     QVERIFY(!prop1.hasStdCppSet());
     QVERIFY(!prop1.isEnumOrFlag());
+    QVERIFY(!prop1.isConstant());
+    QVERIFY(!prop1.isFinal());
     QCOMPARE(prop1.index(), 0);
     QCOMPARE(builder.propertyCount(), 1);
 
@@ -581,6 +585,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(!prop2.isUser());
     QVERIFY(!prop2.hasStdCppSet());
     QVERIFY(!prop2.isEnumOrFlag());
+    QVERIFY(!prop2.isConstant());
+    QVERIFY(!prop2.isFinal());
     QCOMPARE(prop2.index(), 1);
     QCOMPARE(builder.propertyCount(), 2);
 
@@ -602,6 +608,8 @@ void tst_QMetaObjectBuilder::property()
     prop1.setUser(true);
     prop1.setStdCppSet(true);
     prop1.setEnumOrFlag(true);
+    prop1.setConstant(true);
+    prop1.setFinal(true);
 
     // Check that prop1 is changed, but prop2 is not.
     QCOMPARE(prop1.name(), QByteArray("foo"));
@@ -616,6 +624,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(prop1.isUser());
     QVERIFY(prop1.hasStdCppSet());
     QVERIFY(prop1.isEnumOrFlag());
+    QVERIFY(prop1.isConstant());
+    QVERIFY(prop1.isFinal());
     QVERIFY(prop2.isReadable());
     QVERIFY(prop2.isWritable());
     QCOMPARE(prop2.name(), QByteArray("bar"));
@@ -628,6 +638,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(!prop2.isUser());
     QVERIFY(!prop2.hasStdCppSet());
     QVERIFY(!prop2.isEnumOrFlag());
+    QVERIFY(!prop2.isConstant());
+    QVERIFY(!prop2.isFinal());
 
     // Remove prop1 and check that prop2 becomes index 0.
     builder.removeProperty(0);
@@ -643,6 +655,8 @@ void tst_QMetaObjectBuilder::property()
     QVERIFY(!prop2.isUser());
     QVERIFY(!prop2.hasStdCppSet());
     QVERIFY(!prop2.isEnumOrFlag());
+    QVERIFY(!prop2.isConstant());
+    QVERIFY(!prop2.isFinal());
     QCOMPARE(prop2.index(), 0);
 
     // Perform index-based lookup again.
@@ -666,6 +680,8 @@ void tst_QMetaObjectBuilder::property()
             prop2.setUser(false); \
             prop2.setStdCppSet(false); \
             prop2.setEnumOrFlag(false); \
+            prop2.setConstant(false); \
+            prop2.setFinal(false); \
         } while (0)
 #define COUNT_FLAGS() \
         ((prop2.isReadable() ? 1 : 0) + \
@@ -677,7 +693,9 @@ void tst_QMetaObjectBuilder::property()
          (prop2.isEditable() ? 1 : 0) + \
          (prop2.isUser() ? 1 : 0) + \
          (prop2.hasStdCppSet() ? 1 : 0) + \
-         (prop2.isEnumOrFlag() ? 1 : 0))
+         (prop2.isEnumOrFlag() ? 1 : 0) + \
+         (prop2.isConstant() ? 1 : 0) + \
+         (prop2.isFinal() ? 1 : 0))
 #define CHECK_FLAG(setFunc,isFunc) \
         do { \
             CLEAR_FLAGS(); \
@@ -696,6 +714,8 @@ void tst_QMetaObjectBuilder::property()
     CHECK_FLAG(setUser, isUser);
     CHECK_FLAG(setStdCppSet, hasStdCppSet);
     CHECK_FLAG(setEnumOrFlag, isEnumOrFlag);
+    CHECK_FLAG(setConstant, isConstant);
+    CHECK_FLAG(setFinal, isFinal);
 
     // Check that nothing else changed.
     QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Properties));
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png
index a02a00dd78cc3cfe4a09064ad975c291d30753f4..c4722545dc256f7425cb45d5c37a30ef84747605 100644
GIT binary patch
delta 143
zcmV;A0C4|@0@nhN7YbSk0ssI2{9*;Tks&84`bk7VRCt{2-9ZY3Fc1L2%)Z>8$3Lvt
zB39i+Y34K`ID7BK{eDk>z*mu>8xWDXvLv13!o$b^Z+_!u*F=%gA(7Aq2${9Mb$0g@
x6OoZ81;jnWh>4N0Ck8Tp;nXnEk<A<yasp}}6QS~AGV1^U002ovPDHLkV1lZFKQI6Q

delta 114
zcmcc4)Xp?PoXduTiGhJZ>HN$86BX6<S9!WPhE&XXdtoE*0R;gT$H%8$%6w<IBvheR
z|2Ok^)wkZt0-Nvl>nC5FzGpl8pVo;hr6=AKoh-n}Kk<Puf?^ky=Rd_-dMrAx2xvBg
Mr>mdKI;Vst0CCwZ3jhEB

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png
index be18b8dc2dcf85e746c1f64ad0e3e1fd94b47f31..58a293bafa1754dad4b14e842a2ba579f56fc962 100644
GIT binary patch
delta 167
zcmbQibeCy@I9C)069WUopCr~D6BX5T85ulX978JRyuItl)nXvPaByzzPWygy`2`V5
zWp_<4ozYaZ$X*-&?tA?&=6#DM?iUwsb>r$iGu8LfO+A}EbK`&ZTJQFqcwbpCC}YWm
z6Efl2Y3KGo?QO4!5T1Bjo%NEf^ODYqjfy-VO(Ie=>mH_<T%347Oa{Wg$yj3|y6{uU
SoeMw*F?hQAxvX<aXaWH6<U}?A

delta 139
zcmV;60CfM|0+<4j7YaNG0ssI2BG2jnks&5E0J}*<K~#90?b|sD#4r#5!JU1%e=etv
zWhi6ZmFu8UHfYvw-yAm<ANwb-JC}aQ|LF^SMUmVck+2C3vn~U;nf;C4ILDKE(UIF8
tk+2B`(?3I_7n2bI6p_CMk?ai?asmhs4{c>VHfI0;002ovPDHLkV1j<xHyZ!|

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png
index e4db4bca2e79afe15ebf428d2b3723247ba3fca5..65a03a12944cffdfeceb2ffa4eae4c1315d6932f 100644
GIT binary patch
delta 158
zcmeBUy2&&_oGXfhiGhLPPZH~niHhnve>`0rLn`LHy%WfF$Uua_QCZH$ygyu{cb!Mt
zzuPTOYxg=Gk9vLZyKQ}KWAMa>;=(R3IxbAyxLHNE`0>Na|4-`gyqPuex}pF`Sa6~8
zdj9?IH|RHBp9vJ>fr=e|e?v-b;zo&yuX!gv7o7N9NR&5MkYD58oja~TcQAOm`njxg
HN@xNAe;!7{

delta 113
zcmV-%0FM9J0*(TZ7YaNG0ssI2BG2jnks&8Bu}MThRCt{2+d&GzAPfM(+L!m|_74hM
zq%-$mSaNmDYu$J@hM)D9=g!g}xxZfEFOwMoDw7ZaCJ2!+PyDoZAQzJy0Vov(IqV2=
TS{wa800000NkvXXu0mjfJWDKG

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png
index d464e79d00ce25f5b53f50859a61c00b950b7235..d736eca9049dcbb4b042d1ceb6a4bb6b1abe5f0c 100644
GIT binary patch
delta 150
zcmbQibeCy@I9C)069WUopCr~D6BX5T85ulX978JRyuE#p^RR&c!@(G>^5;dIZ8sv-
zE1v1AOsn?HxE7_q?|toe#(7Q??@IHZndyD$rk~C|yZb-o^UHiE9u%4QUWC{3SCrvJ
zN4;C0)8`vP#n=y<JFiPzq&%@oZDPOR#D0F!GFE?~rFrMhJ_Xv(;OXk;vd$@?2>`Lt
BJ#GL1

delta 138
zcmV;50CoS}0+<4j7YaNG0ssI2BG2jnks&5C0J}*<K~#90?b$I710f6m!H}2pb5f?~
z#8TW$Z(*(IJl1F5m=A{M{>$sh(wBU1FYp$T+aHq<0S69@b?^W;?u^d;*>jgnKas5%
slMn$92FTHyA%A|6uNIRK0TC9FAE^BgZS;;Q(EtDd07*qoM6N<$g7fz}od5s;

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png
index b0b93863e113e042e0ef2ce36a9e2ba0f0c7d41e..d7386b323480ec9656fc0bd9929cb738354f993c 100644
GIT binary patch
literal 353
zcmeAS@N?(olHy`uVBq!ia0vp^6+j%t!2~4#B(d%QQq09po*^6@9Je3(KLBz$3p^r=
z85sC{fp`w%y>D~E85kH@JY5_^D(1Ys9mv;YAj04{|Ko!@d*(4t6n%8Ye975owOe1V
z*(x{Z{m<9Df4CPaJGr;?amWf<DV4aq=(r$=5HND*^Gvt?@cG-%Q{^@{O)nxzVW>qC
zNIQSI%d$}Ue)-yNS7B`CBB_Ph{ABC%$Juue-R<tg?i4Iq&>V}VqLNu)CGV<Kqp0)1
PKw|K8^>bP0l+XkKO<jK<

literal 280
zcmeAS@N?(olHy`uVBq!ia0vp^6+mpm!2~3g&cFN*q?n7HJVQ7*IBq}me*oli7I;J!
zGcfS^0`VNid*9}S0|j?`x;TbZ%z1m;k?XJl55vJ-Pagi<`J0{Ht>xXF-Xo7@f4nun
z_;p>u54-t$=Ihu#vEF-NzlKRr#*zyj3nw}$x4Lolib!c<6G(Y`l6{A%dDLq+e5#Pl
riCKI({zv?W5OeJ2A*qDe_=LU8gR}U@$IJRaZ!mbe`njxgN@xNAoKj}4

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png
index 4ea4b24e16df17de8dd5b1afbed48da13c584a93..3500c07ada7c740640fc6a129865718fe9fd25ef 100644
GIT binary patch
delta 163
zcmV;U09^l@0^b6V7YbSk0ssI2{9*;Tks&550Rl-xK~#90?b|^PgCG<@!P4~L-W<<h
z4Nr|Tdjfg+D+puG`C+~9)dzSBk-HfZ5jrx?T#}CM#NzG$ou7EKYod|77?F(+4UFSo
zE5?$8EOd((MiY^-BMuQdB6Q?;e90}I;2y_Bk-ip@jTMpb6&w+vBSJ@nj_d)l4XUU3
R8Z7_-002ovPDHLkV1icWLrnkx

delta 154
zcmcc5G@EIHIF}6v69WT-()pMFCn~C$G3@hnaSW-L^Y*48*I@$zhJzYU9{$_;hcP@X
zLel0kx9sUs^JmZZ73$d7z58zy-gfWF?&^l^0+Y2F<pnup1+A1yQqHK$JvjD`@!xs3
zi5o>GTQUmraLE3AEBD|M^Z6O8b0+ID$|^uqy1eMPFi|+pgR_{A<+=pW4Gf;HelF{r
G5}E*(;X7FX

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png
index a115867d2a5fc8b1eccc6e11da957c108fe869ac..7c27234f2e678d4017fa193ed96ecfb24fdfb902 100644
GIT binary patch
delta 151
zcmV;I0BHZ20^I_T7YbSk0ssI2{9*;Tks&560RTxvK~#90?b|^LgfI{Q!OgM{_vi5s
z4%;GD-3O(aQ$p6>`@{cz@BV?e5RtGO5^Hiux{kr{asA6rJlVC;5uqcIdn63j>}kas
z%s%kqZ@@;8d?gGB9r?}1-*xXdVWT6FdnS>P5s{D&6;57B4XXVtV4MH|002ovPDHLk
FV1inPLOlQg

delta 147
zcmcc1G?Qt9IF}6v69WT-()pMFCn~C$FzoSkaSW-L^Y*4ASBrrFgX88O1@-f4n+2^p
zLcdQ~IP-Q-<r?Yh&Bw3*I{*3Ph1q|~_&<nFT&Tj^(%19z81o&&GX8?uy_3}$75Q8G
zIAjH_ir&d3oc;Z7j@e{wMp*@jm{N($ixcv;9-PHr)RcOGmNR&|`njxgN@xNA_KZ9@

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
index 5f1e8be157..a7c7b339b6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
@@ -10,239 +10,239 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "0e4c352da978cc130894d1f4ce0a0eb4"
     }
     Frame {
         msec: 48
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "a2e959463144623ba36524f4d4ba1c50"
     }
     Frame {
         msec: 64
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "db8f96a79852b468bf793ac0a88f662b"
     }
     Frame {
         msec: 80
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "d2bf766a1271d31fb2771efa3b60dc92"
     }
     Frame {
         msec: 96
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "c99a42391eb5f41c8a09ae5376438998"
     }
     Frame {
         msec: 112
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "88a11ce1a21c28c8fe83cce52ac81c87"
     }
     Frame {
         msec: 128
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "ebfeb134db6e2ce0226f61c685614644"
     }
     Frame {
         msec: 144
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "39983ecac9b5a7bbf486c5549a806bf3"
     }
     Frame {
         msec: 160
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "8216e55fe99f2cabec9859793dc3b57e"
     }
     Frame {
         msec: 176
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "e0ba0455c1142fbc17e9dae54ddde345"
     }
     Frame {
         msec: 192
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "a06714fb98a25430d3c5e133af5d4c8b"
     }
     Frame {
         msec: 208
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "c87a55800b77a6880ba5859c83a4f9d0"
     }
     Frame {
         msec: 224
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "3c055c7bfca6687f139bf60823f8148f"
     }
     Frame {
         msec: 240
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "756dbaf1c06e1ab82ff5be4290795d66"
     }
     Frame {
         msec: 256
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f9ad4f26264b7b29294998085b8ed36a"
     }
     Frame {
         msec: 272
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 288
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 304
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 320
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 336
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 352
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 368
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 384
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 400
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 416
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 432
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 448
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 464
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 480
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 496
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 512
-        hash: "d203c2cb69cb0841827e14bddc206d1f"
+        hash: "f636a172aec19c2fb586021837095b11"
     }
     Frame {
         msec: 528
-        hash: "453d5fb9d38f37bb8c23e376de76db06"
+        hash: "f0260c84eae73c072d7a01226cb5bfeb"
     }
     Frame {
         msec: 544
-        hash: "c4a103de3b7207b3c6277e8ecf79f7dc"
+        hash: "f65bbbeadff6cd71e397c6183ccd6036"
     }
     Frame {
         msec: 560
-        hash: "f58b0eb42d9b6ace87379f205da57550"
+        hash: "9efe8a2c0ffed561658b6d9987d88d80"
     }
     Frame {
         msec: 576
-        hash: "3384c5b5939d8297e0834c7cd347d579"
+        hash: "4b93c2cbce50887122533b239678419e"
     }
     Frame {
         msec: 592
-        hash: "420b55371c69c6e1a17ef85a600c75d1"
+        hash: "e3f955bf3f71e905073e43507624f11c"
     }
     Frame {
         msec: 608
-        hash: "55cc6fb3424ef69d316ef29f6563a025"
+        hash: "1700198250ef7efba094ba37ec9bde23"
     }
     Frame {
         msec: 624
-        hash: "045b5ac545e69777b814423f77575990"
+        hash: "f2e150d7c2fe91ec2754e1fb9a88c6ec"
     }
     Frame {
         msec: 640
-        hash: "45b05241e8e83180a8d92a37dc859ce0"
+        hash: "ab5c2939088861810771db378cb73362"
     }
     Frame {
         msec: 656
-        hash: "97915dfbe4943e1f583ee134bc7a0117"
+        hash: "d2459ace336f1366951e0c7ae5b8ad9e"
     }
     Frame {
         msec: 672
-        hash: "9b4ce5ed20dd81698b4dd8e48f799c5c"
+        hash: "7099bf087bb89c3b8846e24126f49b83"
     }
     Frame {
         msec: 688
-        hash: "24bdcea108cdbb3898a4d9216e9f9510"
+        hash: "65df13d3e38fb739a646746cb401db8e"
     }
     Frame {
         msec: 704
-        hash: "d1427093b1a375e86a69c6f65cb1f8e5"
+        hash: "71479564df994d8db2fc01302e6261c5"
     }
     Frame {
         msec: 720
-        hash: "43dd666b15697ae18eb2410017256e4c"
+        hash: "ceb4091d33a136aecc470d5572c0bdae"
     }
     Frame {
         msec: 736
-        hash: "8043755f5a8a528353f1e7c310a46a97"
+        hash: "0078ad79eee838839aca53fedda51310"
     }
     Frame {
         msec: 752
-        hash: "d6b2ef0cb81395cd7454392aed4571f0"
+        hash: "7d5385582e19594afa40154cc61ef54d"
     }
     Frame {
         msec: 768
-        hash: "c249fd272e02cbdde972e85fc6dac695"
+        hash: "372fc45db91d4507a5c3baec9efb9224"
     }
     Frame {
         msec: 784
-        hash: "1df5f8fce7b0c102e9902912600054e7"
+        hash: "400f21d4028c09d351609a73510dcde0"
     }
     Frame {
         msec: 800
-        hash: "a9d16b180634620e3fe6caacb730885b"
+        hash: "5a3965480d6703fdfcec241deae14db7"
     }
     Frame {
         msec: 816
-        hash: "7228ce597720520bc12911fdef70ca86"
+        hash: "4ef441bb3f8ab9da1c3eb0d0f7c33c00"
     }
     Frame {
         msec: 832
-        hash: "1faa5c3e72740941234ff4a93388edc9"
+        hash: "7526f27a13471bcee2e8e8fe24384bdb"
     }
     Frame {
         msec: 848
-        hash: "997ee1c6d5838153182473a3724df4ad"
+        hash: "69afb4d4af4479ac5b2d5bd39b8a968b"
     }
     Frame {
         msec: 864
-        hash: "6ebbc0a0427825ea701f5bb4758f11a2"
+        hash: "c523ae0a884cb56fe1f72744ccfe7d1e"
     }
     Frame {
         msec: 880
-        hash: "a2ac19360d631fd6d58f8a5ee85e40b4"
+        hash: "6974ea16d8c13a032283fa9df314fb87"
     }
     Frame {
         msec: 896
-        hash: "17a5842b47a220bb8bd74a368cea6c1f"
+        hash: "1635eb85aedbad17fde10da173d612ab"
     }
     Frame {
         msec: 912
-        hash: "b37bae9c3384c068a7dd4f1135d3bfaa"
+        hash: "9be18310fd7cf548edbc976e4a470228"
     }
     Frame {
         msec: 928
-        hash: "65ffb0b6629364ebc687da7785601abd"
+        hash: "5b8574aa9fa9b93fae64c5b180075090"
     }
     Frame {
         msec: 944
-        hash: "27c7a43515fb2d8cddde42263f6ac9df"
+        hash: "285eba0de99a1e1c9c43049b469dad9e"
     }
     Frame {
         msec: 960
-        hash: "cc292df8a090c08d135dedf5e2a0af7c"
+        hash: "eb824394813a847c9e7e532b74b17c8a"
     }
     Frame {
         msec: 976
@@ -250,239 +250,239 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "59735c8372774b50052d15232d2f6d01"
+        hash: "984a2cf360a1bf2e598d329991107c66"
     }
     Frame {
         msec: 1008
-        hash: "9c239c4439009465dd91606ac84a3bf0"
+        hash: "5c70be0eeee3f88981021334668360c8"
     }
     Frame {
         msec: 1024
-        hash: "8b9715d6468c8501895545bd84bf7f57"
+        hash: "6f361a3be917e677ed41212382569fea"
     }
     Frame {
         msec: 1040
-        hash: "0f7a123bfff1dbe059b6ceb3a3f44180"
+        hash: "ab9035768e6e9f81af8158ea0c42863f"
     }
     Frame {
         msec: 1056
-        hash: "c1bc31a379d15ca67d0ffc7139800b3f"
+        hash: "58f3d5fb29352a6788bc9e13a1cb7603"
     }
     Frame {
         msec: 1072
-        hash: "ebf470cd7cff4a836da9e721acfd327d"
+        hash: "7f1a415a6fc970244b024305b10ce91e"
     }
     Frame {
         msec: 1088
-        hash: "e2b89846459f8ae48117ab4393d493bf"
+        hash: "213d79d582aa8f4f736f5bbbfc7d1926"
     }
     Frame {
         msec: 1104
-        hash: "5b980dcc070faf4ab4099cd5f711259c"
+        hash: "391c2c6005de6800064763fbf88b4dda"
     }
     Frame {
         msec: 1120
-        hash: "4640ed55c1608d76109407279a1f02db"
+        hash: "641dd4b888edc40c8d7df0ab89ad400d"
     }
     Frame {
         msec: 1136
-        hash: "d839b597a3afef61de7b14ffb7ae518e"
+        hash: "7fde8a9ee9cdc10b045431301b7e15bc"
     }
     Frame {
         msec: 1152
-        hash: "2810e01355c32d3f7a9352676e6b5eef"
+        hash: "15066ed9165a83cafbd4f15435ed5689"
     }
     Frame {
         msec: 1168
-        hash: "f1ac8b222e0068320827564e759e87ba"
+        hash: "19b685a164648283774167a31b1dff43"
     }
     Frame {
         msec: 1184
-        hash: "7da89563319dd4045e7f9c40a712d722"
+        hash: "837e73ba982c119c3a940cdcdbfdf440"
     }
     Frame {
         msec: 1200
-        hash: "09c55dba364e484eec1a1badb4319003"
+        hash: "c8af92bf004e392f1dc8d1e61746f286"
     }
     Frame {
         msec: 1216
-        hash: "defd5c9a8003c58a7bef1930efdd6f29"
+        hash: "a357285710ea7d94fbc0f181b5e226dc"
     }
     Frame {
         msec: 1232
-        hash: "0f84e515b41b5c064ece9002e5edff0d"
+        hash: "657e15bee0eed2686fcaffad86343677"
     }
     Frame {
         msec: 1248
-        hash: "d1a0405a18fe5b54e79ca0cadf46743b"
+        hash: "994c039fed74a9bae706efe7261cc42d"
     }
     Frame {
         msec: 1264
-        hash: "6046feb2fad386ae25ddd0d0e8ecb673"
+        hash: "135ea105bdefd24e49dfb58ad61fbb05"
     }
     Frame {
         msec: 1280
-        hash: "b4374b0d9d709b0d7a9f8949616a16bf"
+        hash: "7ac7945f810cf9647b0f72db78076415"
     }
     Frame {
         msec: 1296
-        hash: "4d9d7d28f32ce2acd14c8dca0bc11fa0"
+        hash: "c41434915014b4122d5d396fa74127ee"
     }
     Frame {
         msec: 1312
-        hash: "384afb63bdf34729132ac57080fa2988"
+        hash: "944f79f98cd54a89b1e833199536e894"
     }
     Frame {
         msec: 1328
-        hash: "44ac2a9783c450a8c39b09387f0439e2"
+        hash: "c11291d032471d347e5f51a5865a52c7"
     }
     Frame {
         msec: 1344
-        hash: "26e1dfc2b54370f94881c2341b6e0618"
+        hash: "92cca77635d5e1a843b8957ecb092373"
     }
     Frame {
         msec: 1360
-        hash: "be47d72ae7c57e255706a8a5afe1fd3f"
+        hash: "dcb56a485e1fe925ecef6224e55ba5b6"
     }
     Frame {
         msec: 1376
-        hash: "92cb490b081bccedf0bbdee86dbc50ed"
+        hash: "b8edb8a9b8d4596a8da50fa262929d58"
     }
     Frame {
         msec: 1392
-        hash: "1f0a09601474246e94c5ec3763cfa83e"
+        hash: "3eb2b0644f2d6a1b4ebd7516c12330ce"
     }
     Frame {
         msec: 1408
-        hash: "73f1a5c57a2c96e18ba894a7adb9a014"
+        hash: "21acefe69cf2c544102fccdccbbbccd5"
     }
     Frame {
         msec: 1424
-        hash: "8aa130cf4b2706afc8d582ee4c5f510d"
+        hash: "831593033242f154f89d68f1aa4b6bd3"
     }
     Frame {
         msec: 1440
-        hash: "1c0de0f1f4aa5f44bdf774169296487d"
+        hash: "8f23b9a029fcafe05d1369cc39ec703e"
     }
     Frame {
         msec: 1456
-        hash: "1e9b701ee63effb760e733ac623d75d7"
+        hash: "6c00a41d0250313a26527f7a39e9f7f3"
     }
     Frame {
         msec: 1472
-        hash: "c30620b6d5d41937217fa9d3e0bf367d"
+        hash: "395a67b9e40ac34d17969a10f607e8b6"
     }
     Frame {
         msec: 1488
-        hash: "1f96e1da113d4a6cdb7179771ef7967d"
+        hash: "ac1392862993cecbc0f7839b4e2c5ca2"
     }
     Frame {
         msec: 1504
-        hash: "aa31458e44ba42a633421e8688a3af7e"
+        hash: "f477222fb643462eeb16813f0b49a93f"
     }
     Frame {
         msec: 1520
-        hash: "a7a560c05566d0bbea3f2bf397a0063a"
+        hash: "3064b5af87e3738ee89cbfa408059b89"
     }
     Frame {
         msec: 1536
-        hash: "fdd290bc46b86a11afdffb95570d9a67"
+        hash: "ac33fc35a69fa9f8d875bdcd53cc0f75"
     }
     Frame {
         msec: 1552
-        hash: "46574d7bfc15bc5b9124eb0e12741724"
+        hash: "cbaaed4b19f9aecdcba8d58546d63d4d"
     }
     Frame {
         msec: 1568
-        hash: "aed2015031da6c7e5064fe5fcd1e86e3"
+        hash: "d2f75520a698dd21702b11efab5e3024"
     }
     Frame {
         msec: 1584
-        hash: "dea39f30e686771ca516ac32e3dc4cb0"
+        hash: "d7560c4cc6ed89fda71e18d6c6c16ef4"
     }
     Frame {
         msec: 1600
-        hash: "4a9839f52a7ee6732c5e18c0d67534be"
+        hash: "147faf9f698d64be191bed1abe09a592"
     }
     Frame {
         msec: 1616
-        hash: "df21723df1031542483684ff92aaf40a"
+        hash: "49026a5a6e677b0f0950ed5e5bebb108"
     }
     Frame {
         msec: 1632
-        hash: "53683b7b52d0940aac744f0ef03a4527"
+        hash: "8ef3bc4d3f1965eb6e6407eb26de532f"
     }
     Frame {
         msec: 1648
-        hash: "e6177b60c5586e79ca82e1bc7af41737"
+        hash: "86fc1e6fd5f230983d9b0b125d2827ef"
     }
     Frame {
         msec: 1664
-        hash: "592a60e226aa6967a8a41bc0e4288583"
+        hash: "dde134ab5ae1b7c1f59d58534c16dd03"
     }
     Frame {
         msec: 1680
-        hash: "534512915d800d00350803c3fdcccaf3"
+        hash: "53c13b4ff1241d1faa0a94a0730489f7"
     }
     Frame {
         msec: 1696
-        hash: "a01ffd7ab177f850f3d8320da19a03ce"
+        hash: "a46d8748063674d2739e44c7f18e941a"
     }
     Frame {
         msec: 1712
-        hash: "15bd47f2c5c8cefe7565790b429aa6a4"
+        hash: "b3ec96287e5df1fe058b7672731e6db9"
     }
     Frame {
         msec: 1728
-        hash: "b90692eafe68c2b04057af887617667c"
+        hash: "2e671d9f4266ef19f8632c5efe3897a7"
     }
     Frame {
         msec: 1744
-        hash: "edb22bd93a83de0cd3a046ed5a513ece"
+        hash: "a0d17185b04ec84d85fe6349ea9f6b5c"
     }
     Frame {
         msec: 1760
-        hash: "f08fa88d05f48c42dd1eba538dc464d4"
+        hash: "4ad02b737bc2ec05f935529914b8b694"
     }
     Frame {
         msec: 1776
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "4c0a7a445520155b5ce590d9566ddde7"
     }
     Frame {
         msec: 1792
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "e4108a09f8d944577d96d4697fa32216"
     }
     Frame {
         msec: 1808
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "8ee31240c836bfd6f18a9d2aac5cb084"
     }
     Frame {
         msec: 1824
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "e58b69388d4b30fa96bfb3ecd7ec4fe6"
     }
     Frame {
         msec: 1840
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "e0fb7420fbdde291be7955476fef7c06"
     }
     Frame {
         msec: 1856
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "d19f92d707cc95007cb77555f2bef31b"
     }
     Frame {
         msec: 1872
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "b1af9c47935dda17e533ac9a4078c66c"
     }
     Frame {
         msec: 1888
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "5fd8ee80a9388ca1ff99fe35a3973eff"
     }
     Frame {
         msec: 1904
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "fac7ddc309b6ae477e8da1d87c56a5f1"
     }
     Frame {
         msec: 1920
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "fbcd446ced1a00cfb0b177c7de5d6e60"
     }
     Frame {
         msec: 1936
@@ -490,239 +490,239 @@ VisualTest {
     }
     Frame {
         msec: 1952
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "6d2827458ac8012bb9468ed453e61331"
     }
     Frame {
         msec: 1968
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "2184f41e9b49f9a58e58dc6843a7741a"
     }
     Frame {
         msec: 1984
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "7bfe1cad3611ccb4c55da75546853b25"
     }
     Frame {
         msec: 2000
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "0c1164b69806cd0281b7aa131d8018eb"
     }
     Frame {
         msec: 2016
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "bb531046028c870de76f0a6cfaf23c31"
     }
     Frame {
         msec: 2032
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2048
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2064
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2080
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2096
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2112
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2128
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2144
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2160
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2176
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2192
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2208
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2224
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2240
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2256
-        hash: "ec46803523ee0516ed2c89923ff2ded7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2272
-        hash: "6b8b68e359f532729bf25a6851563ad7"
+        hash: "56b9c59557c852242fc02921716b4c29"
     }
     Frame {
         msec: 2288
-        hash: "1ee3cf0c3c738a909f1b40b4ef49ac50"
+        hash: "940a8ee9cc80ec237c2a0b3c0284de80"
     }
     Frame {
         msec: 2304
-        hash: "71889e0f81eeb252dd91a46af5ce24e7"
+        hash: "39860a23099f80ab2a0c979b77c1e41b"
     }
     Frame {
         msec: 2320
-        hash: "99390a696ac524d752672df6f2136fa3"
+        hash: "acc2194a277d69177063d06a5c096bc8"
     }
     Frame {
         msec: 2336
-        hash: "00919914f1623bb260e0f99b471aa182"
+        hash: "31cde88c34bcf8540ebf27a0f03d3010"
     }
     Frame {
         msec: 2352
-        hash: "64bd7ff1518a3e84c4b40511c5c0ff2d"
+        hash: "203ffd5a6efda14f8d8685a3c294f9de"
     }
     Frame {
         msec: 2368
-        hash: "b68da721bf79592e49408b098f72e884"
+        hash: "e9dfff40745663c4938b5d0baa28b5f1"
     }
     Frame {
         msec: 2384
-        hash: "6a8ca937b7c961c403ab1662d170c1a5"
+        hash: "1d906fdca4cfd51f371d2203770d2cda"
     }
     Frame {
         msec: 2400
-        hash: "3f4034da4cd71738d1130c3baa38cf9b"
+        hash: "2fb9d6175f7350b57350e6ab3707918c"
     }
     Frame {
         msec: 2416
-        hash: "97a86d3c04d07508604b46732b121edd"
+        hash: "dbe072fc17ee6bc497efb60354ed3758"
     }
     Frame {
         msec: 2432
-        hash: "42e9ab3ed744d1a9a7eb5b7a206f29b3"
+        hash: "27dd91387bbfcb381a3d73e4108f6f82"
     }
     Frame {
         msec: 2448
-        hash: "ff86192c1b9c0faabb5563260cb1bff2"
+        hash: "8a3e06d17e657aa659c1185ff761c227"
     }
     Frame {
         msec: 2464
-        hash: "e1de0e431b971deb546935b6b2fc78e7"
+        hash: "dd476416c45830b4ad8d02b650af7530"
     }
     Frame {
         msec: 2480
-        hash: "b7817a7f15d8e727e25719de8cc7d50a"
+        hash: "7fea8ab086376c3f644e24545f3e5382"
     }
     Frame {
         msec: 2496
-        hash: "66772971897fc00d01d067e5fc38f848"
+        hash: "e4e8a1838730f3389a5d6630247cc02e"
     }
     Frame {
         msec: 2512
-        hash: "175db8c0324af4c206f9673f0a8d0477"
+        hash: "11cd1b8b7b14913036429c7acc688590"
     }
     Frame {
         msec: 2528
-        hash: "f3dea687e0ca335b987b6b3c7d736469"
+        hash: "0ff657aa16a82a86f750c0d56a297fc3"
     }
     Frame {
         msec: 2544
-        hash: "44d035dd8e302b75c5a7f98a2005fe75"
+        hash: "e6cf7e1d446652270865857a801f4bc3"
     }
     Frame {
         msec: 2560
-        hash: "140cf53cb6873b14e6263537f84b0aa0"
+        hash: "db9021619dd192122857dffd2b25b18d"
     }
     Frame {
         msec: 2576
-        hash: "6c9090d4488289e69562747271459d7d"
+        hash: "77772d2e14b85df151085500e45020c2"
     }
     Frame {
         msec: 2592
-        hash: "49e92db256f5be8c4e35566eea8fca70"
+        hash: "a49744a9c4c6c1f2392184d13907f404"
     }
     Frame {
         msec: 2608
-        hash: "80f41d2eb743ee13fcc486651e310fe2"
+        hash: "2701f2dd7196402e228475ce739fbe5b"
     }
     Frame {
         msec: 2624
-        hash: "f581fdcaf30c0efd4518e538e88c2ebf"
+        hash: "71030d54a9a9cf234731d8bfd4985442"
     }
     Frame {
         msec: 2640
-        hash: "c028db6753cf60bf587e6c46080a31ea"
+        hash: "c5b6c4bc0b68aff9d589bbc4781c6f4d"
     }
     Frame {
         msec: 2656
-        hash: "231b69aa9bdadbaf47cbfbc44a322a51"
+        hash: "3ef8d76256628e782b56b3c6e7d3f7d8"
     }
     Frame {
         msec: 2672
-        hash: "f0bcc02aaab3fad2ff53fc2d7541d4aa"
+        hash: "85b0582aa0aaeb72201f2b3284f8fe02"
     }
     Frame {
         msec: 2688
-        hash: "80e34154585ba3480e37eaac6bfa396c"
+        hash: "26828739f7a1ed5b7c7823c1cac73b12"
     }
     Frame {
         msec: 2704
-        hash: "e1ebf3ba98b2df53ac9f72744034ba6d"
+        hash: "73b85e718117b919b6e3bed087330475"
     }
     Frame {
         msec: 2720
-        hash: "b8f749a58888f90ed5cabe7aa2eee1ee"
+        hash: "726deda1001db3f57939a1842c90331d"
     }
     Frame {
         msec: 2736
-        hash: "3a78458aa124a331f5b1616be5eea914"
+        hash: "980266e772178b550abb6e24e2a6d659"
     }
     Frame {
         msec: 2752
-        hash: "c442c02859bc35a8e5493200e68b1730"
+        hash: "b15bd1cef519d7112edf0f8e97c507ce"
     }
     Frame {
         msec: 2768
-        hash: "0cc4d24a1e1fa75a339a5b3dd07f18f3"
+        hash: "1df1a43aed86aedd425846a87c7b5df3"
     }
     Frame {
         msec: 2784
-        hash: "0d124bc578058db99e32d58f4b412758"
+        hash: "26cbc843753b51f37a5a84f3b9c7cf56"
     }
     Frame {
         msec: 2800
-        hash: "fc174a039606c5457532c9ac27c6faec"
+        hash: "8c3ad31d69f44dc1dbb3bec0476a0cac"
     }
     Frame {
         msec: 2816
-        hash: "db5d25d7c01605ec81cdab3e239a1f0f"
+        hash: "9c4243132637e722abee587ae76218c3"
     }
     Frame {
         msec: 2832
-        hash: "7dcffdbf9ac992aac0751bed5c38a0eb"
+        hash: "fd99e719c7a6da7c3c309c6a56aeb127"
     }
     Frame {
         msec: 2848
-        hash: "b59dc4f39b3e032d5cd34ffca098889f"
+        hash: "4855b585340b25e9cf98c55a9e661a32"
     }
     Frame {
         msec: 2864
-        hash: "925d232189a3eee4bae08a8fe86a488b"
+        hash: "d400eb6473515193409d5fe928c17b3b"
     }
     Frame {
         msec: 2880
-        hash: "4ab3a889e27de8f45670c240f6d452a6"
+        hash: "d2cabdc2e1b5219242e3768c256cf20a"
     }
     Frame {
         msec: 2896
@@ -730,239 +730,239 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "9b8629b588dcb840fcd32f73f66016ee"
+        hash: "f22d7ebcfecf8ed0aedc10eaf3975a06"
     }
     Frame {
         msec: 2928
-        hash: "dca8e45e930314a860f36343f4577738"
+        hash: "71fa22835d65dfd5ded2e3f925a2006f"
     }
     Frame {
         msec: 2944
-        hash: "b68f3b38e154b65225211c6a1ca8ddb8"
+        hash: "1fa97a0e9cd3601e830810a397678470"
     }
     Frame {
         msec: 2960
-        hash: "d8168aea7962cad60132da9baf66f95c"
+        hash: "3fdb2cf62768af6e89b5fcca4a0fbdcc"
     }
     Frame {
         msec: 2976
-        hash: "6f83cd7be71666e08172a2c59e715f2e"
+        hash: "24fa2ed5c9c42eb1013c790c394dccb2"
     }
     Frame {
         msec: 2992
-        hash: "f98c68954ed98f340e86c159fcf4f013"
+        hash: "c0b8c6b8d925fac2d5349bab8094ea3a"
     }
     Frame {
         msec: 3008
-        hash: "e4692a0e6d82864e9027bcf893e0cf90"
+        hash: "246539b2c38f54cc46ccced49a0964b1"
     }
     Frame {
         msec: 3024
-        hash: "ed02ff4d37ad03c0d0d53cf8163ed1c5"
+        hash: "dc27d0928673409db160c25c523b5543"
     }
     Frame {
         msec: 3040
-        hash: "fb116353a2ceabae2d93c9aac48727d8"
+        hash: "f6c5694157409606a21455e4ce875e74"
     }
     Frame {
         msec: 3056
-        hash: "7b8c99b86838c46db4e756cc039ba045"
+        hash: "3060d75d6ee0d6022d7692aeee90aff2"
     }
     Frame {
         msec: 3072
-        hash: "c8d8e194bc957402fe2236b1a472faa6"
+        hash: "0a9bc75adf171200f44892d265f10206"
     }
     Frame {
         msec: 3088
-        hash: "f0f3d8c8ac3604cd11b7492fe5ee023e"
+        hash: "30681d928e035188fa25983076b00a24"
     }
     Frame {
         msec: 3104
-        hash: "b41cf314e4684423b4708ccd55904d60"
+        hash: "fd007bee6889d3dc8203bf59ff564ba2"
     }
     Frame {
         msec: 3120
-        hash: "4f578969386627b6e620e83bad5a6a6c"
+        hash: "559b7f479ae2a2a70288ddde6a18b33e"
     }
     Frame {
         msec: 3136
-        hash: "bd9fcfaa4e79f969548af12d072c1ec2"
+        hash: "75d7ce28879ec23f1af3eec3afd94f60"
     }
     Frame {
         msec: 3152
-        hash: "a418dc92f8b04fddf95f38bd24825ee6"
+        hash: "f0006440cd257667547b243f69dfdc65"
     }
     Frame {
         msec: 3168
-        hash: "4684b3e318a08f0f2331a13143592d18"
+        hash: "9c332ab37fc90bf81cea9eee353352d5"
     }
     Frame {
         msec: 3184
-        hash: "1e135a4fd2e7336d8a59ca3497374a3d"
+        hash: "c1313a45a5d85d17b0d82c1b7cb8d4b9"
     }
     Frame {
         msec: 3200
-        hash: "d1be76e2c56422b469a9d09e22f62df5"
+        hash: "de50c0522865995d1931f2149494c43c"
     }
     Frame {
         msec: 3216
-        hash: "8827523a7f8fa89a56d932102dff7b52"
+        hash: "2a946bfe7a75a519064dc40b27b8b843"
     }
     Frame {
         msec: 3232
-        hash: "e12e6b907af5e6feffed0b9e68c71895"
+        hash: "3adb068d2540371cbcd7603a87515716"
     }
     Frame {
         msec: 3248
-        hash: "7bc3605f5f241170732aba19ca649896"
+        hash: "11f396595eb3940371a2f8cf497d8184"
     }
     Frame {
         msec: 3264
-        hash: "d7da9274f30cacd419f0b0b7c8c8a728"
+        hash: "0c08d7cb54e14120e9f063ed97224e3d"
     }
     Frame {
         msec: 3280
-        hash: "154775464235d2a2fb338c27f1490f27"
+        hash: "df9164673edc8c4922696f8999c8d53c"
     }
     Frame {
         msec: 3296
-        hash: "1657f65e8759eec3c026262bb271dd1c"
+        hash: "b0fa87c11b235dab2a4361d1c1162866"
     }
     Frame {
         msec: 3312
-        hash: "29b4c68846aab3c1dcf4e58861915c33"
+        hash: "746807f46bb1a14890bf7b23ae538a6e"
     }
     Frame {
         msec: 3328
-        hash: "fe22b3b991a80b34d6fe12515bfa2fd0"
+        hash: "e856cf08ebebba22e04bcaad1ba75309"
     }
     Frame {
         msec: 3344
-        hash: "961343bb9dcc1fbe81b4c20392c28cb9"
+        hash: "edf1ae03a0c60f157f2eb4312226ce3e"
     }
     Frame {
         msec: 3360
-        hash: "a2adb3179465e34b517bf906491a1b60"
+        hash: "0c9356e38d0a2b5cbf73b5dd9c76e80d"
     }
     Frame {
         msec: 3376
-        hash: "067fb8a2f5043dd4616fb1539e3e9c4a"
+        hash: "eb0fca481da55aeebb0c2ed08e7b2dd0"
     }
     Frame {
         msec: 3392
-        hash: "009329915e9027d77218fd83334960ed"
+        hash: "b0c91c68b7c69f3c1124326d8776881c"
     }
     Frame {
         msec: 3408
-        hash: "81b05d8aef8152830c6f199d6dd94fd5"
+        hash: "09c76b1c7758e086c1a99198643d29cc"
     }
     Frame {
         msec: 3424
-        hash: "b23fa537f88a97490e48fb3a8cd4b507"
+        hash: "294429db9fae8d1a08f34b774ad82124"
     }
     Frame {
         msec: 3440
-        hash: "182464f620768efe0253c97cda75d839"
+        hash: "460fbaffccf1cf78b19ab58ed374cec2"
     }
     Frame {
         msec: 3456
-        hash: "f1ddbec396cead5d4acf9b65822becb6"
+        hash: "91517b862c3a5c89d8bbc0575b506d3c"
     }
     Frame {
         msec: 3472
-        hash: "a73085722d33638517b3f60a16ce9fcd"
+        hash: "4a22f6736a64093790e49a65f3a74923"
     }
     Frame {
         msec: 3488
-        hash: "ecce53b0c525834341ee4b3c546e670c"
+        hash: "8ec21c12a499919a46d44b927837db46"
     }
     Frame {
         msec: 3504
-        hash: "86f1da737164290a90c1aef9355e2375"
+        hash: "51551a03b495bbd979d2dfbabb33f852"
     }
     Frame {
         msec: 3520
-        hash: "722ec874122ad8dcc73820a3a2fb7dca"
+        hash: "700ad73013037cbf10694e712212a799"
     }
     Frame {
         msec: 3536
-        hash: "35eb086b11482b752e2c02f1dc4d9099"
+        hash: "bd305b17ba9542ae01a2934bb5c2784f"
     }
     Frame {
         msec: 3552
-        hash: "83cf9c0b5d0afd5d3cee4c446274f5c4"
+        hash: "91cf99daf3ff442ea43274ba9ce4bceb"
     }
     Frame {
         msec: 3568
-        hash: "e1bbef11fe02adb0756113e1106fe7f1"
+        hash: "7d33d2f8684f1947e01e6144e84ba1f6"
     }
     Frame {
         msec: 3584
-        hash: "774c8bb4585954274852d6bb07e64916"
+        hash: "e23e50737d3b70132a0abc91f6900952"
     }
     Frame {
         msec: 3600
-        hash: "b0264bcddf313d4e819a608143a86ac9"
+        hash: "4a31ea946579b1a09364d0197aed9943"
     }
     Frame {
         msec: 3616
-        hash: "5e3859fd56e5022cbc7831e22447f05d"
+        hash: "d3abb24ef7dea1b32180a34acd1901a0"
     }
     Frame {
         msec: 3632
-        hash: "8c2a8b7321d2598b08d483914d4f319c"
+        hash: "19b413d918888038c26109528c8b96da"
     }
     Frame {
         msec: 3648
-        hash: "f13913dbc015836e35d5a2ebc94bbeef"
+        hash: "d1a19db5ce841914b6599dd257dc4a6d"
     }
     Frame {
         msec: 3664
-        hash: "1309af996f2d7a686f1d9177bc5c9be6"
+        hash: "24e29dd07133ac8c8d51dd6aac07e5ce"
     }
     Frame {
         msec: 3680
-        hash: "460b3500b41624486fe8dcfde087d2b5"
+        hash: "db7ae9587b8fcd766e23ffdd8e92cac2"
     }
     Frame {
         msec: 3696
-        hash: "de0837d19497021528dc782db4da084a"
+        hash: "0314577dd3497f2cc70e503058ff0c1d"
     }
     Frame {
         msec: 3712
-        hash: "18afb8f8e9aa6d4a5db376e26cd9a56d"
+        hash: "ae0dbd41a6e1b7bc87184a059a2b2e61"
     }
     Frame {
         msec: 3728
-        hash: "4fc1a8173824c2725160798b7d70aec2"
+        hash: "43c446b3cb9854e35dd21e7da7aa986f"
     }
     Frame {
         msec: 3744
-        hash: "87a593f74c946d6af6e31c5a25898766"
+        hash: "675e049ffabad0179f9e94332e457b97"
     }
     Frame {
         msec: 3760
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "ef272f944e95e2c08a856066d2d082c2"
     }
     Frame {
         msec: 3776
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "2d34ec460d21fdeb5daddf9245f8c5cf"
     }
     Frame {
         msec: 3792
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "e94a08e34a7cbd406937c1ffddcbb185"
     }
     Frame {
         msec: 3808
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "22523265a7cbbcfc2182ac1521c8dca8"
     }
     Frame {
         msec: 3824
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "e5f95a7f0d9cd2a4ca54a9e5a6783c8a"
     }
     Frame {
         msec: 3840
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "da7c216b89e1b8f261d2979be8cc61a7"
     }
     Frame {
         msec: 3856
@@ -970,239 +970,239 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "08b3de4eea6ecbe85ab7b104e0571815"
     }
     Frame {
         msec: 3888
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "66b5d695c3fdf6c5fa08241c39c1bff9"
     }
     Frame {
         msec: 3904
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "25f2403ff19575e94010980e02015d64"
     }
     Frame {
         msec: 3920
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "5d8d901818a21965cb54b477592b65a5"
     }
     Frame {
         msec: 3936
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "4cbe77985c9dea4c37f08135ac0e8882"
     }
     Frame {
         msec: 3952
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "8e4dcb566347ecf31c2c7c9262f3c71d"
     }
     Frame {
         msec: 3968
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "71b810ad39750acd84d06526e6ec0767"
     }
     Frame {
         msec: 3984
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 4000
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 4016
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 4032
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "e0aab4701e9039386c6f3f3ae7c86265"
     }
     Frame {
         msec: 4048
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "957cd332444c819fecc4c58149cc6782"
     }
     Frame {
         msec: 4064
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "c7395c37477b4c39bb22d5cb6f0649fe"
     }
     Frame {
         msec: 4080
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "992f62d1cc929e3d92008bf2581c4b4b"
     }
     Frame {
         msec: 4096
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "d8f079d91944796401b86296788a2250"
     }
     Frame {
         msec: 4112
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "7df19eeae14a578760613075e611c9a6"
     }
     Frame {
         msec: 4128
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "998f8f07b857d0c4b740be8a323c6e9a"
     }
     Frame {
         msec: 4144
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "9419aae1cfd8592031dbe26223700ed0"
     }
     Frame {
         msec: 4160
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "fc9d9216599cf59e16f4344cf43c27f5"
     }
     Frame {
         msec: 4176
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e43d779e9edbde4f6e47bf13653464f8"
     }
     Frame {
         msec: 4192
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 4208
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 4224
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 4240
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 4256
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 4272
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 4288
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "afb15151f2bd529817c4a1053dab6e9e"
     }
     Frame {
         msec: 4304
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "113af4013655488c3389abfcfdd25c8a"
     }
     Frame {
         msec: 4320
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "fe92ba0e4552bbfd26858c30ff2dbe78"
     }
     Frame {
         msec: 4336
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "374ca32f24189773ba181d375107a1bd"
     }
     Frame {
         msec: 4352
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "8de169d6ec0a3ecb13b39f93b2ccabbd"
     }
     Frame {
         msec: 4368
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "53c65f25dc0b915d500ef091a45c1b2b"
     }
     Frame {
         msec: 4384
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "846a5983865f87f5058eca31f056d021"
     }
     Frame {
         msec: 4400
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "7243fe48f5cbf172b67ea8658d489a31"
     }
     Frame {
         msec: 4416
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 4432
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 4448
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 4464
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 4480
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 4496
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 4512
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 4528
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 4544
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "bb73c7d58cfca18e8dc8c256ceaa6dba"
     }
     Frame {
         msec: 4560
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "ab2f94beae7447d2c25808e0ff2d3397"
     }
     Frame {
         msec: 4576
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "0e731803c864f753809daa22ff9f76c7"
     }
     Frame {
         msec: 4592
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "48874688b1eb19d67bdf91653f4ce74e"
     }
     Frame {
         msec: 4608
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "3aac3fc7526ad990fcd4a7a4eb162a10"
     }
     Frame {
         msec: 4624
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "72b92331f80f37480ac208b4cce4fdb2"
     }
     Frame {
         msec: 4640
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "4cc992953df7636b9b1b063f87ae36fa"
     }
     Frame {
         msec: 4656
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 4672
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 4688
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 4704
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 4720
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 4736
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 4752
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 4768
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 4784
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "f1cd43dfe4d2846c7f3a8a6af19174d0"
     }
     Frame {
         msec: 4800
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "0eedf77ea428a6ff55507c241588b0a5"
     }
     Frame {
         msec: 4816
@@ -1210,239 +1210,239 @@ VisualTest {
     }
     Frame {
         msec: 4832
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "18625884760a6ecb9b37c609afea0a29"
     }
     Frame {
         msec: 4848
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "2504012907c89b8578b804811bc27d8e"
     }
     Frame {
         msec: 4864
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "559e27ede74f57b25ce889df1c211f4f"
     }
     Frame {
         msec: 4880
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 4896
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 4912
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 4928
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 4944
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 4960
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 4976
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 4992
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 5008
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 5024
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 5040
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "a0bdd440290cc09c86d65b2f74079b97"
     }
     Frame {
         msec: 5056
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "b0f7c2289283b78016394b900fa3dfcb"
     }
     Frame {
         msec: 5072
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "e39fe4762a948bbc412e9b7160f2e439"
     }
     Frame {
         msec: 5088
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "30ae9eaa6b96a00a83faf349d450be3b"
     }
     Frame {
         msec: 5104
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "21178cc44036162ca6f03dd876b38d14"
     }
     Frame {
         msec: 5120
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "cea64ba789fda0f8bdd4ef64321e1c23"
     }
     Frame {
         msec: 5136
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 5152
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 5168
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 5184
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 5200
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 5216
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 5232
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 5248
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 5264
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 5280
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 5296
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "29f1b978ff683024c0be776cc13ad9d4"
     }
     Frame {
         msec: 5312
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "c9660cbe54cb6ada5b6598990d6fb434"
     }
     Frame {
         msec: 5328
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "592fe8fec20701536706623fda7c86d6"
     }
     Frame {
         msec: 5344
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "1ef2067c92e3621fb0e5080f379b551f"
     }
     Frame {
         msec: 5360
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "16e8dbd8061e0a2433300b6ef0396f8a"
     }
     Frame {
         msec: 5376
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "3ed37ab35b06f483b984014266bf59ea"
     }
     Frame {
         msec: 5392
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 5408
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 5424
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 5440
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 5456
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 5472
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 5488
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 5504
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 5520
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 5536
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "231774644c0b105596b37cec696ca287"
     }
     Frame {
         msec: 5552
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "4230f38c6e85a37e809840f46c060e39"
     }
     Frame {
         msec: 5568
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "385e9542036e82f8ca3c390493777c1c"
     }
     Frame {
         msec: 5584
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "814ab09f3c07c6288f774618282d76e2"
     }
     Frame {
         msec: 5600
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "b5d69dff8c1b995749e39e578ea67de4"
     }
     Frame {
         msec: 5616
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "3ed37ab35b06f483b984014266bf59ea"
     }
     Frame {
         msec: 5632
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 5648
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 5664
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 5680
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 5696
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 5712
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 5728
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 5744
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 5760
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 5776
@@ -1450,154 +1450,154 @@ VisualTest {
     }
     Frame {
         msec: 5792
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "b364b0db3d8ded941705179153a0a0d9"
     }
     Frame {
         msec: 5808
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "398a0dc7a138f36dea27dfad528324e4"
     }
     Frame {
         msec: 5824
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "f2bd86fe4532cf41fba7f70d7ee1b36f"
     }
     Frame {
         msec: 5840
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "b905dbc82ff13dee50249268b80067b2"
     }
     Frame {
         msec: 5856
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "02aa690ffbecf879f7f98fecace8e0b6"
     }
     Frame {
         msec: 5872
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "3ed37ab35b06f483b984014266bf59ea"
     }
     Frame {
         msec: 5888
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 5904
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 5920
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 5936
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 5952
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 5968
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 5984
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 6000
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 6016
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 6032
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "2268d0cb4b9a906339c310df870e0f2a"
     }
     Frame {
         msec: 6048
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "d54aa3080e0d7d68cb30efdb2fbb3ff2"
     }
     Frame {
         msec: 6064
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "a53fba1a850cf0f3d1f8d6bc22ae2141"
     }
     Frame {
         msec: 6080
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "64e241917730f914f3866d3bd3f6dc7f"
     }
     Frame {
         msec: 6096
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "02aa690ffbecf879f7f98fecace8e0b6"
     }
     Frame {
         msec: 6112
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "3ed37ab35b06f483b984014266bf59ea"
     }
     Frame {
         msec: 6128
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
     Frame {
         msec: 6144
-        hash: "b692386f34972d80aded2347e64ad2b6"
+        hash: "012078bb87950fdb960e2679a47c4bf6"
     }
     Frame {
         msec: 6160
-        hash: "dc65b0a791002efffec05884aa948842"
+        hash: "4fbcfc907361ccbe5ec5d945cb49065e"
     }
     Frame {
         msec: 6176
-        hash: "069bab78e29d322894647f81d315184a"
+        hash: "e450930da4d7838a2539a73bb3e8b9e3"
     }
     Frame {
         msec: 6192
-        hash: "39c8d804b3caf53845baba4ce98e007d"
+        hash: "d482896bddc89c4739674877be15972c"
     }
     Frame {
         msec: 6208
-        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
+        hash: "9cf23658545ac1d744c6c549a86b561d"
     }
     Frame {
         msec: 6224
-        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
+        hash: "79eee90dbf4ba9992dca0e9e4ef02350"
     }
     Frame {
         msec: 6240
-        hash: "441d34bff2755e3c30bed80e2bdde69c"
+        hash: "cfc32ce2407a6d8a84fe99393c5d5d9e"
     }
     Frame {
         msec: 6256
-        hash: "57e68ec2aa5a21b11d21f388399713e5"
+        hash: "377a5cd9be5f70975fe74d4de1bf2e70"
     }
     Frame {
         msec: 6272
-        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
+        hash: "af880ae1f0eb620a416cea66216f2509"
     }
     Frame {
         msec: 6288
-        hash: "3eebd1f4f58210f6b546715997a984c2"
+        hash: "a114b81c8856296087a26129724f9115"
     }
     Frame {
         msec: 6304
-        hash: "39eabc07bfcefb2ecd369abf94d706cd"
+        hash: "f989d9099072c32c619061b9cced2a85"
     }
     Frame {
         msec: 6320
-        hash: "a0c46402b4700cc2099bdf42c47faf9b"
+        hash: "774663163bef719b9656fbd78316c720"
     }
     Frame {
         msec: 6336
-        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
+        hash: "36461d046d6df8b1f85997bc4090d537"
     }
     Frame {
         msec: 6352
-        hash: "c92cba3c2825db4293153588c4b7b229"
+        hash: "02aa690ffbecf879f7f98fecace8e0b6"
     }
     Frame {
         msec: 6368
-        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
+        hash: "3ed37ab35b06f483b984014266bf59ea"
     }
     Frame {
         msec: 6384
-        hash: "09b76db3e4a95666ba9c37dd89996fa3"
+        hash: "7f788af35c7190d04bdc06cbf921c83d"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml
index b5685d1a9a..a1bb78f3ce 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml
@@ -1,9 +1,9 @@
 import QtQuick 1.0
 
 Item {
-    property string skip: "Expected to fail until QTBUG-14839 is resolved"
     width: 120; height: 60;
     property int step: 0
+    property int tickTime: 250;
     function tick()
     {
         step++;
@@ -30,7 +30,7 @@ Item {
 
     //Tests base positioner functionality, so don't need them all.
     Column{
-        move: Transition{NumberAnimation{properties:"y"}}
+        move: Transition{NumberAnimation{properties:"y"; duration: tickTime}}
         Row{
             id: row1
             height: childrenRect.height
@@ -41,18 +41,19 @@ Item {
         Row{
             id: row2
             height: childrenRect.height
-            move: Transition{NumberAnimation{properties:"x"}}
+            move: Transition{NumberAnimation{properties:"x"; duration: tickTime}}
+            add: Transition{NumberAnimation{properties:"x"; duration: tickTime}}
             Repeater{ 
                 id: repeater 
                 model: 0; 
-                delegate: Component{ Rectangle { color: "yellow"; width:20; height:20;}}
+                delegate: Component{ Rectangle { color: "yellow"; x:20; width:20; height:20;}}
             }
             Rectangle{id: r2a; width:20; height:20; color: "red"}
             Rectangle{id: r2b; width:20; height:20; color: "green"}
             Rectangle{id: r2c; width:20; height:20; color: "blue"}
         }
         Row{
-            move: Transition{NumberAnimation{properties:"x"}}
+            move: Transition{NumberAnimation{properties:"x"; duration: tickTime}}
             id: row3
             height: childrenRect.height
             Rectangle{id: r3a; width:20; height:20; color: "red"}
@@ -61,7 +62,7 @@ Item {
         }
     }
     Timer{
-        interval: 250;
+        interval: tickTime;
         running: true;
         repeat: true;
         onTriggered: tick();
diff --git a/tests/auto/declarative/qsganimatedimage/data/colors.gif b/tests/auto/declarative/qsganimatedimage/data/colors.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1270bfaa79710fae9342c2286be8a25f10172084
GIT binary patch
literal 505
zcmZ?wbhEHbOkqf2XkcLY%_Yphz@Ye_+s`#5*x50_)kx2PnGq!PlchlfNb3MGP-zMS
z15<HJ|H{*E`4`XGa;tmuy*<DA+a7sLd)B$^)v0aoxQ~DGx&E#9`LA=||MBy1wI5mZ
zvBO7e`k7^)IeWd9Us?6F>ulEcJL|r4^K~D8vgv1!-|Fjcw*BVqKmGj6uD^ZfUw{9z
z??1nUhJ{B&Mn%Vr6+2Gcc=3ZHGXje{8vgu~1UhN3xJLdj*TA{vpH_KBW>HRhW}1Sr
mo`H#iMzW?tN@iZZLrP*^Qc|&AN;WT-u|j5UVtQ&ZgEaswi2GCk

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsganimatedimage/data/colors.qml b/tests/auto/declarative/qsganimatedimage/data/colors.qml
new file mode 100644
index 0000000000..5ccc0148dd
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/colors.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    source: "colors.gif"
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/hearts.gif b/tests/auto/declarative/qsganimatedimage/data/hearts.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cfb55f27f5e33ebcde7601dcc628f52b436d651e
GIT binary patch
literal 6524
zcmd5<<x>>?*Zu4+v2^Uxl1rD=QX<0A>B8>P-Jyb{q%=!+3JTH)N+=<SGzf}-fRswJ
z2r8%`=vR3B{TI*7d2wIdnR93EIdjj|GtgC5aUKWbVD|z52%rD}KmjEHR1g3m0}KE#
zLLjUF1}LdHAb=bE4^TKQKL9)sAOL{~0T_&$P8<Lc2#^90avFMB0F?)Tf|fx60ssS}
zGJvWApa%ILAWTf!0O&v<1^`BeKo|jF0)Q!i5CDL)uwtRW3P7n@SsehdfdX<4c4q*k
z;NWnB051T10K^wSZ~PmKi<9~iR{#J(01^zKApqQh0XiP;XaJ$-<ze9Ejr-Rlz#mQq
zQUEj^fCL!GfPg#zp%p?E04SZ1U@-uhFhDON^Z<YoD5wNb22tTE0GPx?8v$qn5N2_)
zW&o)n1J3|JNQys!f=&Rs0HBnWdk%rHNK3v1U;uzY0EPe<1%O%}{Te`N6%>2Pp;G`%
z0kUZT#>l`d1kfugy$4_sfF%H7P*Pq2&<_Bt0vMCB>IMK?0Bi%W0|4nCk*eA*pxpy>
zpU44=+Ev!8>a-df^qQIsniwW6ZG?^vi>@x4zCOEw0jH4>myz){E6p}53%7|WkLh)!
z8Fq(*mDSvg#KpGD#lwNek$8l;tt{73C_Y=8ZBZeVz1@zOFsHMlu%pASgcP@{Gf7IC
z$IWF=8qM$Fwv9#$`FQOrDT?0kAt|c~-VWpl4iydv-qBFs#c1<}MW7<1cMNoQ42?zZ
z#*mCn_DoDA;^L(fk_3oE5}qKGmiF1ga@WREJTr6G)?v@yQ937Q$JvSG>MWO^zvt$H
zE-c*k^4jtCRxT-#Dla4X`t05C-S+d9t$46=J76~;NTI57FECiCrfMfNc=t|-YF#ZU
zER+-xt=`xm|D<W>A8AbNUTmCF+mr3Yc-5z^yGaS8<U|rNO}+E!c6x?V&x_s6Ow|`J
z)%yDPva_$g9Nfvvxz<0VF))l79MKvYH5nebJ~D_M9dZ~QaT*_Uo)~v~J>mXl(qrm%
zz}u<7>9@f%(-#*P{1-H)I(VFxCRRsIS_bw{zkvUY3?c_EfaJgWpGn65DfJv&P+ih*
zsThcdBgE~-TPlZ=8BvC1`mGN~(%9vFR>xbb#<KXdQZE^_Rlmv;#WmW!YO9$nl5w3V
zGia}Ub5A+&^XjYiy0;HR$>H48_;u_<9RiR2#81(;wb*juzwFP%@ue2+hUMXAkKQ*+
zy-eL!HEXi27JJ($w1RE6trY(B*gXyV*e*BZ!>rV)Vk|ig)mQVVm3~ZofB0VNP5;f5
zQcRkFkwf+PG%s39BYoSea3oJTo?fi<lJyLqjG+VH!o-3EjbygLWMOlCW-grr`uSry
zua0l8?%wzEC|7utC`OEyDEdoDc{|M-K`Z;TH+&1DX`v_O!=im@yV&OZ3ui~u@>Az-
zoASXeu9<uai%Ls!h{x08Klvk8#82-&Q=t25294FuPF>ex;hgnZsxSO8_n80FaU(#T
z);!nUth~nNaD>~kE8-i-;x(e+Z`Zeq4cQiO8m0~cficBS)YV%PUxOn^VwFlz{d2gD
ztZSq1sJ(r>;0qYS&FPhNW9i(nXv=jZ3v0D3G@Yp7Vc>GLTSkCGU<kb}fLC68FPN8l
z+EQ+U6~a<_x35-hmt9-VbMaPc@<!qbWqY1(RwOY5o|VMDB)Bo%;Fa=MX4Bmb2lv6^
z!TFgdckXj-uYla{xb24(0{Yj*avO3QG;T7x>@~)hHR5sStp1!OvVRkNB-9UM+UXQV
z^#w}UOLU)YH5Ssl2-=kniu<BcmJL0x9r3lNKAF%F7uGb3(vxg$cHm;gQ4MzxQHRP`
zc2zsD5sn!j&tZhbm0MhT`4XDP9&THuG}Y?wl$Bj+&AxMd>nBWe;c+~=3;Nx^bH^Fv
z^U6x#`3^5+4o9YLo_;o$G+wwdL=`af@j+N*K}-`H;vPJb^T8Y*nyjBhJ5IGBFW7qE
zLGYe9a#;?rGal$6N-Ch>rh-S}nA>=z!?J)Wz0^7USdMes^_laZFyo24#>BRF!{Pyw
z(?)bX^b3Dh%L4A>;>zXNz9h}z-{ow_1*=!a*z2F;>5BJ4dW}$5%yFuQ0q8e(F3M$b
zR2NrU8m=*PAU~uT<AOHsetU!elv#JF3&hJG>$#O4YRO-F6x27qp@n|@yCYWjBNL8K
zpTcyeyZ7-KmZ~@Uw!rN`)}Z-kadsKs(pr?~5aSHA2?tzgmQ8`z)5dSBp1i#>_x?@Z
zrQTac*1h_u-!ZS>ihj^C2>Uh6DRyRdxQuC+Jz$gUCms0x`Oo|t1Ny2eUpwVVHf8Vf
zwx6x~=BI-~7Y&2r$Iflae2fVp8b)Fp5%$)GjGrmw?%=1fEOvzAX=q<f|9%Kv4-RhW
zC00-MI6*IENnoq`a#+h@(p@NwLJa!2G4?g<xiYOlUI-id?2<byr$lGykbhWs!YkR`
z+K^TNmXRbolw#G(Fqvw_R7=Y*#~a8h+NQ6&oeje6?WhY_Wf`L8tJ3|;==L3mIqOmn
zBX?|cFZ~iN`FmS7)u;haeKxKK7n4DmoMj6B9La((=cZrRK=EbeChK@%9FOj7@qGEE
zm!eRUTRF|9punMLnky3@Yd0+RlU&=pa3;I_XEhbuI#pEpV1fJ3O))bSq&NZN_<67f
zvBYXbC6ySKE>onQV4%Crf)H>>e+|<**7a~XN>A3_GLK{|xh^%4v=Fqhn-H2WCOybA
zWuvEDPU<7wmXy2sv_N%XNn3Q{yC~~9k#-0pL?2FZ#CW2xV=ge15%e38oIUBmT{6q%
zq@2b>`GQ~a!C7`K(V3~)pA~_6j`92&P^q`%Bv|&0A@gxd`PL<BDgmt_tjcWlIILdq
zo$|B}n6@a5@jhoZH1m>6RGn|1mkM5fkrJI>q}9MUa|2EDFofaW)#JS_)^!bAlc5G#
zI#GraxzhH;iFm81a<MGx*(xx8t8zon%25f^CO{BXwi*^pr4;|!j1IJ^5&QPj`;o)y
zv0qM^w{`M&?&PFYuDii2yBZ=&wf;Cn5CM-y+>^s>5uWsNWvJdj%T3VV$P7AofUVD`
zw!QhL{YWlhKw~zaLR*)oa^hUjr?W<QV309dtDPX^(IZ~6eA0n=wX34FZTa!spy-x8
z9}YZC!#2F@^8DV6(dx`EP=xYUeAXMTm=t77DtvAfmdC7FaOLX+k!VK#7$ocybYkaw
zS>rwj9nI#8O$U?)aiSu>!I~z;L&Y@6=M_(UxwX4e`;1$QQ8ua~(PVl3?fg5D_6tZL
zMKBwRIrMw_%eLWJh{B3h{#6CFdnwHw4kl+VsK{#3XF1Ap%%+!pE1`VYH6^1Tk+<E}
zLR<=;ig~=i;;(%_*|>GaHZY&@+GLk3lkMK=xV}RwbA76*YFOMb*grCAdq%{rnHiZR
z`5#mmchvOLR^^b-o)`SO*H2&7CC0~Y61Y2e{q&*bsCR7YsbpPEbQ8yO;^M=5FAH3R
z<V$)|y(I2`dfjz<z{2SF_7@uZ*TT|9aXdERUvIp)w`!=RLnyA7%eE_9Y&AXAz4<Ux
zxP_+rm2k&Pn;pg`mmMm<%=)go^ZYgLZ}P3AT#$~!X6if#`1|xWhS(*IbW^4SCi~##
zo9c>fm6*7h{0)ElA4RyH4&RD3FNM1P6Jmfd9+k&2AD(I4b$1S5&iQBs*Dyh&D^G39
zMdHbf+3RtA!4~#z<>UFC5ba-YzD4ULl2=hBzWAfr7|;CQ>PPicFSUWsWU+bo8HyAw
z`(D6JWllA^Iy^?tufHgY_qRhlRL@oqk@)T!{Cq1i=Ttyuz=f=2sB|?+>9wor7j^>l
z9hFa~gpo&8`KNX<LE?<yMp#8;i(Q`f`|cSL78XW9Pv$IjY&kE-&5Y~Z1hXZL0KwMl
zFsi7mOVX$BbC4{KS027N_gCe8M}PDzz8ov-OSanSpz9j(;p?JL#K-lIhH}5lw_=`n
ztu$1H7VIjdB|8RfG|(4NXw)82%myJ)7vEo9sTN=7bc~SiJ!1`vZt>{rwLD|m;|e(M
zsZ-jR#3zP@D?lrCvi{y3(D`$RU4M-~^2JxrRpD_vRo`k4-VaRIBA4Q6<O(!I)bCIA
zJvQn)a}DQkQ#j`rd82gsbMRR7i4tXr&7aMuZzjV|N3NaMD8#7t?~GxiJioqdcWi8~
zF%>^`&We1Q$tXQ$^^48jXx-Nk=}{gCj~k7IkxXB)qK4KOwvUyFEmke>V}_H1_(mDD
zDHK!r9BGNMVk1a=JN>bLgwv)Ozi1pvnUI5JfbA$$%!f&KMR2+qoMP|5T=5cC@ltn?
zxDe{IL(i7H2=!u5>^gt9Q^b)#q#nuDu7hr|Me6u{{B;r&K@*-K!{Etg54n?QYY|3V
zyS=<1m?9kPv}omD3x6!ba5<P?HYCcM6k{x_GwrWt;v%)Ll>Au;iR++$+%H%*mMqW2
z;)10*Kc2Qeb+-1=BU1h_Xj_Y#H;c_65wpBJlKJRKp4@pBDTP)Z^FmZ78VM85J_@HP
z74U>+|JxIl(H6v1Ax*KB7MjT;w-d@VpK-#`+TA{;WHw@&^Ei^Lg&HBsrPh($FKUB<
zkY$N*r4!R%5fi`3aT#u=%yh{bSBh7g*>>K^SPMo{2y#q@rhX)5=nbgVw8m^%W$KS(
za|XPj<C*U)V$#-9_eHaIl#zx`v8Us{)-ze>UJ0NC(Jh+|S<0Z`NQ0JSlcgllmPo?S
zvZ>EfnGL*tS><3))7Y&MY~49nQVt(Su7FCepmnZrSgvSEu6TE@<WjD*0TTrB|2+tk
z3je*O2v*uVG~b(JDG_{p>}o~LR&a@Eudw#ItnJCT)r6VZc$jN5_XsEaXfu^Vso=8h
zM_1tqdIV*k>XfRJc8*eG;C^3k9Ssw$1KNk1Zv$R3*OT{+>PNiRVYM|1o|D%b{{6DF
zy52}JODw(8!qE96^>;AMg@+a@cCGZHdE!=2{paJ{8xcYpueLA6I?X>M(3$axe2j@Y
zXeGN#ICGmPw-5}al6srIIhBC4Q07+|u8(uP6~S1^jdLd?Y9Pr9$N8CQ1iNqq3cl7A
zp_lqz>*)&5-_czz+A17{|GkQz2k1rTjqFCM*`Z{oB|HJXwmmw5M(c9a$d_-`>ZDq#
z;8`f#824&?9F1GJO|f*?gj-DssO?fSoA^|p0Og`>4B;8yT9Lz7$WSp_Gg#x_(r4-J
zCFquzWIk%{_r$pK#O_u#^2Z9=S)tLIT#XQB<I1vyaeApnD%l30i+0zD&#qn8V{1jD
z5%_Z!Y^b$}Pl(Tc`T{nf1X;B(kA!;Ei#KsJ$H5UzZ8ofv&99&TFp(cPlzZS~CMnK{
zrw9@|Xc>_{X2v4~SCVDkuue?LxAOUvGX^@W%z^!zJ<S{xU7yWyl+~3s^4o0<v|?Hd
z(_eec$9)f3@{&g8faAf6U;fry+j@3HMYa$=lk>(Q)0g{X1!+Y`e-6`k=b#OI@bKWc
zQOO=BKO5tc3eIknEopK%D_T|@2PaOpwTQmF#D=3(SQ=|X<47jL-%r*E1J`_4$#Z2c
zlLzyb3!1E7=KRKAOOVk1+ulD~IERN9K`@yM2QA;*rv!dWDo#_wrDg{QY(mn{7q;pr
z+a8+5s&$T<F50u>oNbd*7uHGQCtOw1{<~{~;r1sVjOd(xE~Ax9yC+SkOuGkc*m*cN
ziazB2RL*3$Pm#-Dtp2<OX=loUbGD+;S4G!t{#vWx-5x%;hI0O`Ykb>(>9WB~ga7vR
z3{2G~<L36itQ+Mlj(tUM%Dr$`qdy+{C7D+)s7FKNVl9QX)r#h|q(#T9e$)Cra<nQX
z)b3vP>z?WUr$^<0+45SL^Ijx}cj}40S-Tao1&(=T57`!itx$;sVm`xUbqh17mIuJZ
zy^7xFF)vePbYMm6ABGwg1~|R0ClpjI?`4|9CS?wtr(*bhoJ23H@K0YmH;(1}!E<tj
zhx5p6M{AP2Xjbs1nk1)Qx=Uj<7L&qg5{iNqBRfeoN_bfT<AE4D-W@vW(i|5#yA3Sf
ziNi*X7Vnw98Dm~M{2#XtWnratHxM0D|2zs~CEGC5V9kiOAIc)GnjC&!EI2rN;^=Q&
zE%+x}+fYb`SjfL2DAEwGVO}kE^!<~t$QkT<l9w1AO#9`1Swn+>gYY74cV5w%%X!b3
zbDsRSE|xXRXH#gD)_H(pGVV62%qB7Y-Eft8V`X5@?<Xd0?%rLvr`NyNRt#l#<eku=
z_c@V`eE)RA{BV(y<>N%u$8;2*Gsk3Qf4|(b=Pbx~VWUqH5$Q(fnz8O><C5;vKhi1P
zs`-)ypp*Jl)+48N9L=HEi83|NLZ+qWgvx2D=j&<oZ|vM7XC&`hD5Tb)YL$zaB`p-v
zIC(QRWOP#B)<{+|6nR;2;C!_Gsh{R3ycTSq(!`+_GRl3Bsg#oPq8`WiWcHhTSbC=t
z7X=zmJt0T^*yX9pn6Zr4<{tQzPV>g)BT@26&i0t@`ESkbm8h$R8&d<4wuQmrxAZq@
zlU-sa4!&5ZMDG6#NLhGFU!$4U!*c!DP>oJ-{t3o=;AAm}FqkP#mprlq5l79KHVn4r
zO9&ZJs^%XT|Fr1qKUfoIv>v8jE1!Kj&#%LUmd{^!N{Kyxfb%0KEZllT{sjG{#3fv!
zb7{fp_M2w&Wab`qHQ1Av=*9brf99*Q^_$9F^ls+;saccj?8cPDxL3G6nlx7;ya}pZ
zDt(x!UcX_%^H=(Q)Bb$6f_r_`VN!GTBL_8=FV8i(sVi<RitWya>U-*2&1cHRP6!TJ
zg#CSzGPUgRT2==hbtgfEriMT+B0|OegB=G4JSV}aY^*%lm!8kR@8)rLj}rB%q~LPd
zw`w2QbT^EzuoeB(aYyM0@m0PA3OPP{h+FPDx)oQu$$hzoa^(y1T|!eSThZc+Z#E1<
zi#GKMa!YcFlQKsCk=_3h&^UO3)_US_{Bhz&3wFS%?VOu*>ej1~2-ill6~BB0^&P1;
zHkYO>^`q64`gCTw_KM7PX*g45h4q#Wj{#nxLj7`kiZ8V~EXB`or?#v@t`YSUbuK}v
z*l8_><=?&Wo^0<M^<Yc11v5VBeKO{8!}O;QLsSQ4dG-C1atls4xxR=`+VRWy0VvtE
znqkb!iOT%5qzPz041Q+l{jAA;aH@-$1s;>keAJW^Dmy7*b0H|cUh00~g`}Ucab6Be
zp{7XCPPzSdyxFh3v~vc*!chO@gPGx2koRx$q>WG=GbT;<Lwl5jUxC$++7P_7)K^iK
zo;nX1hPGGcEC^aVUHQ+tcqa9uC5@4d_TjF?^EG?3%+S?M6NpNOH`#tx>FWFIDb(Y<
z>o;gx+qUw~f8xa*I5g_JFe|3JlNaS*V}3<0A_d0!^bC^9aN(EJQw`yBl<=<>MD{(}
z_;*rN$LW}nk1LbU633S(q94`o*K(&)CXf;1Exaxn{i<3*WQM3p*;qWTWz?}<BEO4x
z@s+G$g4}I8y)}#3*^}}=kpU?Qcf9DO+q(iAdyh{$v=gBwsx2RdRL=4&@ADH<G<GDk
zPvq}kIeM^rVBU0-<4up&Uew&+)bPFV1D<Wj@6Yl3?|gNas`^fpZ%#n{t0JhE?xgkA
zsU0TwAj!)rj}gCl+48=fZAbjI3=8bNGJVc5a?A45@7LF;q4)h(sdDTR>Mqnzhpy!x
z*(Px!Y~*OKT>LuzBPveaZ!%xbayG-yxpQJEK2dvFeV2ZW4--fk0}+iGth=05Aw2f$
zs`FZ?YG=%W2$I47<~Co{mV6M4S1g+-XbPp;o7VgkNWoke^Y5scF+t`AG-?!8Z!uzJ
zI^uX*g)mT>uWOF+D9RK3T}3a<u?0u3KYbE~0<A^7=AA3No=&T5=m;n1L}!8$J4=cy
z9iOmbS4}kD%gxwKE9Q`{rc>(5VT8T1f}f(%dW$z_;0^IRN&F;%`WSPH%_u*3GTR;B
z-t5Fd3<W7EnHqK@ijU5fBqXn#cpgJ?GCl$UYk_}7cp}!cG>VBN7z<|$Wx34ttPM9_
z{gi@5<ZmQz)}XW<DFwTLyiyUt;3=@Dlu~PzXwpg+<3yKL%=Obe^+`QZZ$PHJKSE%~
z+pZ{04#EOoqj<>}yUw53C7ND0j^qLGCI5uN^(4db^p~T^E7>V9W(rr2jHvI@HvKf3
zom{>h=^yL8PG>2UEV)?&lXpppTCtFOPSo?U&O4`>q;aHNi=RtK)@gm(6x!|DV#-Bv
zmXRjds^gs8P9@*-5E0~4*~z3kOEIc6iPCVRRmq{~P76agJgv)dn?<s;P+sU|^KrNu
zwZdR$K_b@P6*IZAzw~ouIP$K_<tglCDW)VTm*lCI<ftv>NuK2um}g-2atEyPL1?~y
o146Sq{}U-6%TZviQh>KEum~%#Dk-q(F0flFa4=y0m#DA&ABWR-(EtDd

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsganimatedimage/data/hearts.qml b/tests/auto/declarative/qsganimatedimage/data/hearts.qml
new file mode 100644
index 0000000000..717bab430b
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/hearts.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    source: "hearts.gif"
+    playing: false
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/qmldir b/tests/auto/declarative/qsganimatedimage/data/qmldir
new file mode 100644
index 0000000000..ef7c1f44f3
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/qmldir
@@ -0,0 +1 @@
+# No local types
diff --git a/tests/auto/declarative/qsganimatedimage/data/qtbug-16520.qml b/tests/auto/declarative/qsganimatedimage/data/qtbug-16520.qml
new file mode 100644
index 0000000000..da77a4063b
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/qtbug-16520.qml
@@ -0,0 +1,17 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 500
+    height: 500
+
+    AnimatedImage {
+        objectName: "anim"
+        anchors.centerIn: parent
+        asynchronous: true
+        opacity: status == AnimatedImage.Ready ? 1 : 0
+
+        Behavior on opacity {
+            NumberAnimation { duration: 1000 }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/stickman.gif b/tests/auto/declarative/qsganimatedimage/data/stickman.gif
new file mode 100644
index 0000000000000000000000000000000000000000..7c4cd186870bdacd0eb1d9dbb1c6d56c1a63e27d
GIT binary patch
literal 164923
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsganimatedimage/data/stickman.qml b/tests/auto/declarative/qsganimatedimage/data/stickman.qml
new file mode 100644
index 0000000000..a47924de21
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/stickman.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    source: "stickman.gif"
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/stickmanerror1.qml b/tests/auto/declarative/qsganimatedimage/data/stickmanerror1.qml
new file mode 100644
index 0000000000..4f823b3d70
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/stickmanerror1.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    sourceSize: "240x180"
+    source: "stickman.gif"
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/stickmanpause.qml b/tests/auto/declarative/qsganimatedimage/data/stickmanpause.qml
new file mode 100644
index 0000000000..ef771ed56f
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/stickmanpause.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    source: "stickman.gif"
+    paused: true
+    currentFrame: 2
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/stickmanscaled.qml b/tests/auto/declarative/qsganimatedimage/data/stickmanscaled.qml
new file mode 100644
index 0000000000..1ef1f95165
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/stickmanscaled.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    width: 240
+    height: 180
+    source: "stickman.gif"
+}
diff --git a/tests/auto/declarative/qsganimatedimage/data/stickmanstopped.qml b/tests/auto/declarative/qsganimatedimage/data/stickmanstopped.qml
new file mode 100644
index 0000000000..0bf80b8972
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/data/stickmanstopped.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+AnimatedImage {
+    source: "stickman.gif"
+    playing: false
+}
diff --git a/tests/auto/declarative/qsganimatedimage/qsganimatedimage.pro b/tests/auto/declarative/qsganimatedimage/qsganimatedimage.pro
new file mode 100644
index 0000000000..f809c22074
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/qsganimatedimage.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative network
+HEADERS += ../shared/testhttpserver.h
+SOURCES += tst_qsganimatedimage.cpp ../shared/testhttpserver.cpp
+macx:CONFIG -= app_bundle
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsganimatedimage/tst_qsganimatedimage.cpp b/tests/auto/declarative/qsganimatedimage/tst_qsganimatedimage.cpp
new file mode 100644
index 0000000000..24f8cb6114
--- /dev/null
+++ b/tests/auto/declarative/qsganimatedimage/tst_qsganimatedimage.cpp
@@ -0,0 +1,387 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgrectangle_p.h>
+#include <private/qsgimage_p.h>
+#include <private/qsganimatedimage_p.h>
+#include <QSignalSpy>
+#include <QtDeclarative/qdeclarativecontext.h>
+
+#include "../shared/testhttpserver.h"
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsganimatedimage : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsganimatedimage() {}
+
+private slots:
+    void play();
+    void pause();
+    void stopped();
+    void setFrame();
+    void frameCount();
+    void mirror_running();
+    void mirror_notRunning();
+    void mirror_notRunning_data();
+    void remote();
+    void remote_data();
+    void sourceSize();
+    void sourceSizeReadOnly();
+    void invalidSource();
+    void qtbug_16520();
+    void progressAndStatusChanges();
+
+private:
+    QPixmap grabScene(QGraphicsScene *scene, int width, int height);
+};
+
+QPixmap tst_qsganimatedimage::grabScene(QGraphicsScene *scene, int width, int height)
+{
+    QPixmap screenshot(width, height);
+    screenshot.fill();
+    QPainter p_screenshot(&screenshot);
+    scene->render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+    return screenshot;
+}
+
+void tst_qsganimatedimage::play()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickman.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QVERIFY(anim->isPlaying());
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::pause()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QVERIFY(anim->isPlaying());
+    QVERIFY(anim->isPaused());
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::stopped()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanstopped.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QVERIFY(!anim->isPlaying());
+    QCOMPARE(anim->currentFrame(), 0);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::setFrame()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QVERIFY(anim->isPlaying());
+    QCOMPARE(anim->currentFrame(), 2);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::frameCount()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/colors.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QVERIFY(anim->isPlaying());
+    QCOMPARE(anim->frameCount(), 3);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::mirror_running()
+{
+    // test where mirror is set to true after animation has started
+
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/hearts.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+
+    QGraphicsScene scene;
+    int width = anim->property("width").toInt();
+    int height = anim->property("height").toInt();
+    scene.addItem(qobject_cast<QSGItem *>(anim));
+
+    QCOMPARE(anim->currentFrame(), 0);
+    QPixmap frame0 = grabScene(&scene, width, height);
+    anim->setCurrentFrame(1);
+    QPixmap frame1 = grabScene(&scene, width, height);
+
+    anim->setCurrentFrame(0);
+
+    QSignalSpy spy(anim, SIGNAL(frameChanged()));
+    anim->setPlaying(true);
+
+    QTRY_VERIFY(spy.count() == 1); spy.clear();
+    anim->setProperty("mirror", true);
+
+    QCOMPARE(anim->currentFrame(), 1);
+    QPixmap frame1_flipped = grabScene(&scene, width, height);
+
+    QTRY_VERIFY(spy.count() == 1); spy.clear();
+    QCOMPARE(anim->currentFrame(), 0);  // animation only has 2 frames, should cycle back to first
+    QPixmap frame0_flipped = grabScene(&scene, width, height);
+
+    QTransform transform;
+    transform.translate(width, 0).scale(-1, 1.0);
+    QPixmap frame0_expected = frame0.transformed(transform);
+    QPixmap frame1_expected = frame1.transformed(transform);
+
+    QCOMPARE(frame0_flipped, frame0_expected);
+    QCOMPARE(frame1_flipped, frame1_expected);
+}
+
+void tst_qsganimatedimage::mirror_notRunning()
+{
+    QFETCH(QUrl, fileUrl);
+
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, fileUrl);
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+
+    QGraphicsScene scene;
+    int width = anim->property("width").toInt();
+    int height = anim->property("height").toInt();
+    scene.addItem(qobject_cast<QSGItem *>(anim));
+    QPixmap screenshot = grabScene(&scene, width, height);
+
+    QTransform transform;
+    transform.translate(width, 0).scale(-1, 1.0);
+    QPixmap expected = screenshot.transformed(transform);
+
+    int frame = anim->currentFrame();
+    bool playing = anim->isPlaying();
+    bool paused = anim->isPlaying();
+
+    anim->setProperty("mirror", true);
+    screenshot = grabScene(&scene, width, height);
+
+    QCOMPARE(screenshot, expected);
+
+    // mirroring should not change the current frame or playing status
+    QCOMPARE(anim->currentFrame(), frame);
+    QCOMPARE(anim->isPlaying(), playing);
+    QCOMPARE(anim->isPaused(), paused);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::mirror_notRunning_data()
+{
+    QTest::addColumn<QUrl>("fileUrl");
+
+    QTest::newRow("paused") << QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml");
+    QTest::newRow("stopped") << QUrl::fromLocalFile(SRCDIR "/data/stickmanstopped.qml");
+}
+
+void tst_qsganimatedimage::remote()
+{
+    QFETCH(QString, fileName);
+    QFETCH(bool, paused);
+
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl("http://127.0.0.1:14449/" + fileName));
+    QTRY_VERIFY(component.isReady());
+
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+
+    QTRY_VERIFY(anim->isPlaying());
+    if (paused) {
+        QTRY_VERIFY(anim->isPaused());
+        QCOMPARE(anim->currentFrame(), 2);
+    }
+    QVERIFY(anim->status() != QSGAnimatedImage::Error);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::sourceSize()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanscaled.qml"));
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+    QCOMPARE(anim->width(),240.0);
+    QCOMPARE(anim->height(),180.0);
+    QCOMPARE(anim->sourceSize(),QSize(160,120));
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::sourceSizeReadOnly()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanerror1.qml"));
+    QVERIFY(component.isError());
+    QCOMPARE(component.errors().at(0).description(), QString("Invalid property assignment: \"sourceSize\" is a read-only property"));
+}
+
+void tst_qsganimatedimage::remote_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<bool>("paused");
+
+    QTest::newRow("playing") << "stickman.qml" << false;
+    QTest::newRow("paused") << "stickmanpause.qml" << true;
+}
+
+void tst_qsganimatedimage::invalidSource()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 1.0\n AnimatedImage { source: \"no-such-file.gif\" }", QUrl::fromLocalFile(""));
+    QVERIFY(component.isReady());
+
+    QTest::ignoreMessage(QtWarningMsg, "file::2:2: QML AnimatedImage: Error Reading Animated Image File file:no-such-file.gif");
+
+    QSGAnimatedImage *anim = qobject_cast<QSGAnimatedImage *>(component.create());
+    QVERIFY(anim);
+
+    QVERIFY(!anim->isPlaying());
+    QVERIFY(!anim->isPaused());
+    QCOMPARE(anim->currentFrame(), 0);
+    QCOMPARE(anim->frameCount(), 0);
+    QTRY_VERIFY(anim->status() == 3);
+}
+
+void tst_qsganimatedimage::qtbug_16520()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/qtbug-16520.qml"));
+    QTRY_VERIFY(component.isReady());
+
+    QSGRectangle *root = qobject_cast<QSGRectangle *>(component.create());
+    QVERIFY(root);
+    QSGAnimatedImage *anim = root->findChild<QSGAnimatedImage*>("anim");
+
+    anim->setProperty("source", "http://127.0.0.1:14449/stickman.gif");
+
+    QTRY_VERIFY(anim->opacity() == 0);
+    QTRY_VERIFY(anim->opacity() == 1);
+
+    delete anim;
+}
+
+void tst_qsganimatedimage::progressAndStatusChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+
+    QDeclarativeEngine engine;
+    QString componentStr = "import QtQuick 1.0\nAnimatedImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/stickman.gif"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+
+    QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &)));
+    QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
+    QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QSGImageBase::Status)));
+
+    // Loading local file
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.gif"));
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 1);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
+    // Loading remote file
+    ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/stickman.gif");
+    QTRY_VERIFY(obj->status() == QSGImage::Loading);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 2);
+    QTRY_VERIFY(progressSpy.count() > 1);
+    QTRY_COMPARE(statusSpy.count(), 2);
+
+    ctxt->setContextProperty("srcImage", "");
+    QTRY_VERIFY(obj->status() == QSGImage::Null);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_COMPARE(sourceSpy.count(), 3);
+    QTRY_VERIFY(progressSpy.count() > 2);
+    QTRY_COMPARE(statusSpy.count(), 3);
+}
+
+QTEST_MAIN(tst_qsganimatedimage)
+
+#include "tst_qsganimatedimage.moc"
diff --git a/tests/auto/declarative/qsgborderimage/data/colors-round-remote.sci b/tests/auto/declarative/qsgborderimage/data/colors-round-remote.sci
new file mode 100644
index 0000000000..c673bed598
--- /dev/null
+++ b/tests/auto/declarative/qsgborderimage/data/colors-round-remote.sci
@@ -0,0 +1,7 @@
+border.left:10
+border.top:20
+border.right:30
+border.bottom:40
+horizontalTileRule:Round
+verticalTileRule:Repeat
+source:http://127.0.0.1:14446/colors.png
diff --git a/tests/auto/declarative/qsgborderimage/data/colors-round.sci b/tests/auto/declarative/qsgborderimage/data/colors-round.sci
new file mode 100644
index 0000000000..5d2f49f0e1
--- /dev/null
+++ b/tests/auto/declarative/qsgborderimage/data/colors-round.sci
@@ -0,0 +1,7 @@
+border.left:10
+border.top:20
+border.right:30
+border.bottom:40
+horizontalTileRule:Round
+verticalTileRule:Repeat
+source:colors.png
diff --git a/tests/auto/declarative/qsgborderimage/data/colors.png b/tests/auto/declarative/qsgborderimage/data/colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfb62f3d64e95a26d2ea1e87065e7892fa7814a3
GIT binary patch
literal 1655
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgborderimage/data/heart200.png b/tests/auto/declarative/qsgborderimage/data/heart200.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a31ae8f4d722e168b5b1489d4eb61399365117b
GIT binary patch
literal 7943
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgborderimage/data/invalid.sci b/tests/auto/declarative/qsgborderimage/data/invalid.sci
new file mode 100644
index 0000000000..98c72c9bf1
--- /dev/null
+++ b/tests/auto/declarative/qsgborderimage/data/invalid.sci
@@ -0,0 +1,7 @@
+border.left:10
+border.top:20
+border.down:30
+border.up:40
+horizontalTileRule:Roun
+verticalTileRule:Repea
+source:colors.png
diff --git a/tests/auto/declarative/qsgborderimage/qsgborderimage.pro b/tests/auto/declarative/qsgborderimage/qsgborderimage.pro
new file mode 100644
index 0000000000..7bd8ca24cd
--- /dev/null
+++ b/tests/auto/declarative/qsgborderimage/qsgborderimage.pro
@@ -0,0 +1,17 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui network
+macx:CONFIG -= app_bundle
+
+HEADERS += ../shared/testhttpserver.h
+SOURCES += tst_qsgborderimage.cpp ../shared/testhttpserver.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgborderimage/tst_qsgborderimage.cpp b/tests/auto/declarative/qsgborderimage/tst_qsgborderimage.cpp
new file mode 100644
index 0000000000..17b9305ac8
--- /dev/null
+++ b/tests/auto/declarative/qsgborderimage/tst_qsgborderimage.cpp
@@ -0,0 +1,426 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QTextDocument>
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QDir>
+#include <QGraphicsScene>
+#include <QPainter>
+
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <private/qsgborderimage_p.h>
+#include <private/qsgimagebase_p.h>
+#include <private/qsgscalegrid_p_p.h>
+#include <private/qsgloader_p.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+
+#include "../shared/testhttpserver.h"
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+#define SERVER_PORT 14446
+#define SERVER_ADDR "http://127.0.0.1:14446"
+
+class tst_qsgborderimage : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_qsgborderimage();
+
+private slots:
+    void noSource();
+    void imageSource();
+    void imageSource_data();
+    void clearSource();
+    void resized();
+    void smooth();
+    void mirror();
+    void tileModes();
+    void sciSource();
+    void sciSource_data();
+    void invalidSciFile();
+    void pendingRemoteRequest();
+    void pendingRemoteRequest_data();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+private:
+    QDeclarativeEngine engine;
+};
+
+tst_qsgborderimage::tst_qsgborderimage()
+{
+}
+
+void tst_qsgborderimage::noSource()
+{
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"\" }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->source(), QUrl());
+    QCOMPARE(obj->width(), 0.);
+    QCOMPARE(obj->height(), 0.);
+    QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Stretch);
+    QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Stretch);
+
+    delete obj;
+}
+
+void tst_qsgborderimage::imageSource_data()
+{
+    QTest::addColumn<QString>("source");
+    QTest::addColumn<bool>("remote");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << false << "";
+    QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString() << false
+        << "file::2:1: QML BorderImage: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString();
+    QTest::newRow("remote") << SERVER_ADDR "/colors.png" << true << "";
+    QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.png" << true
+        << "file::2:1: QML BorderImage: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found";
+}
+
+void tst_qsgborderimage::imageSource()
+{
+    QFETCH(QString, source);
+    QFETCH(bool, remote);
+    QFETCH(QString, error);
+
+    TestHTTPServer *server = 0;
+    if (remote) {
+        server = new TestHTTPServer(SERVER_PORT);
+        QVERIFY(server->isValid());
+        server->serveDirectory(SRCDIR "/data");
+    }
+
+    if (!error.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, error.toUtf8());
+
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\" }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    if (remote)
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Loading);
+
+    QCOMPARE(obj->source(), remote ? source : QUrl(source));
+
+    if (error.isEmpty()) {
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Ready);
+        QCOMPARE(obj->width(), 120.);
+        QCOMPARE(obj->height(), 120.);
+        QCOMPARE(obj->sourceSize().width(), 120);
+        QCOMPARE(obj->sourceSize().height(), 120);
+        QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Stretch);
+        QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Stretch);
+    } else {
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Error);
+    }
+
+    delete obj;
+    delete server;
+}
+
+void tst_qsgborderimage::clearSource()
+{
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QSGBorderImage::Ready);
+    QCOMPARE(obj->width(), 120.);
+    QCOMPARE(obj->height(), 120.);
+
+    ctxt->setContextProperty("srcImage", "");
+    QVERIFY(obj->source().isEmpty());
+    QVERIFY(obj->status() == QSGBorderImage::Null);
+    QCOMPARE(obj->width(), 0.);
+    QCOMPARE(obj->height(), 0.);
+}
+
+void tst_qsgborderimage::resized()
+{
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() + "\"; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->sourceSize().width(), 120);
+    QCOMPARE(obj->sourceSize().height(), 120);
+    QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Stretch);
+    QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Stretch);
+
+    delete obj;
+}
+
+void tst_qsgborderimage::smooth()
+{
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; smooth: true; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->smooth(), true);
+    QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Stretch);
+    QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Stretch);
+
+    delete obj;
+}
+
+void tst_qsgborderimage::mirror()
+{
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/heart200.png\"; smooth: true; width: 300; height: 300; border { top: 50; right: 50; bottom: 50; left: 50 } }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    int width = obj->property("width").toInt();
+    int height = obj->property("height").toInt();
+
+    QGraphicsScene scene;
+    scene.addItem(qobject_cast<QSGItem *>(obj));
+    QPixmap screenshot(width, height);
+    screenshot.fill();
+    QPainter p_screenshot(&screenshot);
+    scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+    QTransform transform;
+    transform.translate(width, 0).scale(-1, 1.0);
+    QPixmap expected = screenshot.transformed(transform);
+
+    obj->setProperty("mirror", true);
+    p_screenshot.fillRect(QRect(0, 0, width, height), Qt::white);
+    scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+    QCOMPARE(screenshot, expected);
+
+    delete obj;
+}
+
+void tst_qsgborderimage::tileModes()
+{
+    {
+        QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; width: 100; height: 300; horizontalTileMode: BorderImage.Repeat; verticalTileMode: BorderImage.Repeat }";
+        QDeclarativeComponent component(&engine);
+        component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+        QVERIFY(obj != 0);
+        QCOMPARE(obj->width(), 100.);
+        QCOMPARE(obj->height(), 300.);
+        QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Repeat);
+        QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Repeat);
+
+        delete obj;
+    }
+    {
+        QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; width: 300; height: 150; horizontalTileMode: BorderImage.Round; verticalTileMode: BorderImage.Round }";
+        QDeclarativeComponent component(&engine);
+        component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+        QVERIFY(obj != 0);
+        QCOMPARE(obj->width(), 300.);
+        QCOMPARE(obj->height(), 150.);
+        QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Round);
+        QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Round);
+
+        delete obj;
+    }
+}
+
+void tst_qsgborderimage::sciSource()
+{
+    QFETCH(QString, source);
+    QFETCH(bool, valid);
+
+    bool remote = source.startsWith("http");
+    TestHTTPServer *server = 0;
+    if (remote) {
+        server = new TestHTTPServer(SERVER_PORT);
+        QVERIFY(server->isValid());
+        server->serveDirectory(SRCDIR "/data");
+    }
+
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\"; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    if (remote)
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Loading);
+
+    QCOMPARE(obj->source(), remote ? source : QUrl(source));
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+
+    if (valid) {
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Ready);
+        QCOMPARE(obj->border()->left(), 10);
+        QCOMPARE(obj->border()->top(), 20);
+        QCOMPARE(obj->border()->right(), 30);
+        QCOMPARE(obj->border()->bottom(), 40);
+        QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Round);
+        QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Repeat);
+    } else {
+        QTRY_VERIFY(obj->status() == QSGBorderImage::Error);
+    }
+
+    delete obj;
+    delete server;
+}
+
+void tst_qsgborderimage::sciSource_data()
+{
+    QTest::addColumn<QString>("source");
+    QTest::addColumn<bool>("valid");
+
+    QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors-round.sci").toString() << true;
+    QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.sci").toString() << false;
+    QTest::newRow("remote") << SERVER_ADDR "/colors-round.sci" << true;
+    QTest::newRow("remote image") << SERVER_ADDR "/colors-round-remote.sci" << true;
+    QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.sci" << false;
+}
+
+void tst_qsgborderimage::invalidSciFile()
+{
+    QTest::ignoreMessage(QtWarningMsg, "QSGGridScaledImage: Invalid tile rule specified. Using Stretch."); // for "Roun"
+    QTest::ignoreMessage(QtWarningMsg, "QSGGridScaledImage: Invalid tile rule specified. Using Stretch."); // for "Repea"
+
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + QUrl::fromLocalFile(SRCDIR "/data/invalid.sci").toString() +"\"; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->status(), QSGImageBase::Error);
+    QCOMPARE(obj->horizontalTileMode(), QSGBorderImage::Stretch);
+    QCOMPARE(obj->verticalTileMode(), QSGBorderImage::Stretch);
+
+    delete obj;
+}
+
+void tst_qsgborderimage::pendingRemoteRequest()
+{
+    QFETCH(QString, source);
+
+    QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\" }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGBorderImage *obj = qobject_cast<QSGBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->status(), QSGBorderImage::Loading);
+
+    // verify no crash
+    // This will cause a delayed "QThread: Destroyed while thread is still running" warning
+    delete obj;
+    QTest::qWait(50);
+}
+
+void tst_qsgborderimage::pendingRemoteRequest_data()
+{
+    QTest::addColumn<QString>("source");
+
+    QTest::newRow("png file") << "http://localhost/none.png";
+    QTest::newRow("sci file") << "http://localhost/none.sci";
+}
+
+void tst_qsgborderimage::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 1.1; BorderImage { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; BorderImage { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_qsgborderimage::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("mirror") << "mirror: true"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"BorderImage.mirror\" is not available in QtQuick 1.0.\n";
+
+    QTest::newRow("cache") << "cache: true"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"BorderImage.cache\" is not available in QtQuick 1.0.\n";
+}
+
+QTEST_MAIN(tst_qsgborderimage)
+
+#include "tst_qsgborderimage.moc"
diff --git a/tests/auto/declarative/qsgcanvas/qsgcanvas.pro b/tests/auto/declarative/qsgcanvas/qsgcanvas.pro
new file mode 100644
index 0000000000..126c10b017
--- /dev/null
+++ b/tests/auto/declarative/qsgcanvas/qsgcanvas.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qsgcanvas.cpp
+
+macx:CONFIG -= app_bundle
+
+CONFIG += parallel_test
diff --git a/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp b/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
new file mode 100644
index 0000000000..68552bf88a
--- /dev/null
+++ b/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
@@ -0,0 +1,437 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QDebug>
+#include <QTouchEvent>
+
+#include "qsgitem.h"
+#include "qsgcanvas.h"
+#include "private/qsgrectangle_p.h"
+#include "../../../shared/util.h"
+
+struct TouchEventData {
+    QEvent::Type type;
+    QWidget *widget;
+    Qt::TouchPointStates states;
+    QList<QTouchEvent::TouchPoint> touchPoints;
+};
+
+static QTouchEvent::TouchPoint makeTouchPoint(QSGItem *item, const QPointF &p, const QPointF &lastPoint = QPointF())
+{
+    QPointF last = lastPoint.isNull() ? p : lastPoint;
+
+    QTouchEvent::TouchPoint tp;
+    tp.setPos(p);
+    tp.setLastPos(last);
+    tp.setScenePos(item->mapToScene(p));
+    tp.setLastScenePos(item->mapToScene(last));
+    tp.setScreenPos(item->canvas()->mapToGlobal(tp.scenePos().toPoint()));
+    tp.setLastScreenPos(item->canvas()->mapToGlobal(tp.lastScenePos().toPoint()));
+    return tp;
+}
+
+static TouchEventData makeTouchData(QEvent::Type type, QWidget *w, Qt::TouchPointStates states, const QList<QTouchEvent::TouchPoint> &touchPoints)
+{
+    TouchEventData d = { type, w, states, touchPoints };
+    return d;
+}
+
+static TouchEventData makeTouchData(QEvent::Type type, QWidget *w, Qt::TouchPointStates states, const QTouchEvent::TouchPoint &touchPoint)
+{
+    QList<QTouchEvent::TouchPoint> points;
+    points << touchPoint;
+    return makeTouchData(type, w, states, points);
+}
+
+#define COMPARE_TOUCH_POINTS(tp1, tp2) \
+{ \
+    QCOMPARE(tp1.pos(), tp2.pos()); \
+    QCOMPARE(tp1.lastPos(), tp2.lastPos()); \
+    QCOMPARE(tp1.scenePos(), tp2.scenePos()); \
+    QCOMPARE(tp1.lastScenePos(), tp2.lastScenePos()); \
+    QCOMPARE(tp1.screenPos(), tp2.screenPos()); \
+    QCOMPARE(tp1.lastScreenPos(), tp2.lastScreenPos()); \
+}
+
+#define COMPARE_TOUCH_DATA(d1, d2) \
+{ \
+    QCOMPARE((int)d1.type, (int)d2.type); \
+    QCOMPARE(d1.widget, d2.widget); \
+    QCOMPARE((int)d1.states, (int)d2.states); \
+    QCOMPARE(d1.touchPoints.count(), d2.touchPoints.count()); \
+    for (int i=0; i<d1.touchPoints.count(); i++) { \
+        COMPARE_TOUCH_POINTS(d1.touchPoints[i], d2.touchPoints[i]); \
+    } \
+}
+
+class TestTouchItem : public QSGRectangle
+{
+    Q_OBJECT
+public:
+    TestTouchItem(QSGItem *parent = 0)
+        : QSGRectangle(parent), acceptEvents(true)
+    {
+        border()->setWidth(1);
+    }
+
+    void reset() {
+        acceptEvents = true;
+        setEnabled(true);
+        setOpacity(1.0);
+
+        lastEvent = makeTouchData(QEvent::None, 0, 0, QList<QTouchEvent::TouchPoint>());
+    }
+
+    bool acceptEvents;
+    TouchEventData lastEvent;
+
+protected:
+    virtual void touchEvent(QTouchEvent *event) {
+        if (!acceptEvents) {
+            event->ignore();
+            return;
+        }
+        lastEvent = makeTouchData(event->type(), event->widget(), event->touchPointStates(), event->touchPoints());
+        event->accept();
+    }
+};
+
+
+class ConstantUpdateItem : public QSGItem
+{
+Q_OBJECT
+public:
+    ConstantUpdateItem(QSGItem *parent = 0) : QSGItem(parent), iterations(0) {setFlag(ItemHasContents);}
+
+    int iterations;
+protected:
+    QSGNode* updatePaintNode(QSGNode *, UpdatePaintNodeData *){
+        iterations++;
+        update();
+        return 0;
+    }
+};
+
+class tst_qsgcanvas : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgcanvas();
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+
+    void constantUpdates();
+
+    void touchEvent_basic();
+    void touchEvent_propagation();
+    void touchEvent_propagation_data();
+
+    void clearCanvas();
+};
+
+tst_qsgcanvas::tst_qsgcanvas()
+{
+}
+
+void tst_qsgcanvas::initTestCase()
+{
+}
+
+void tst_qsgcanvas::cleanupTestCase()
+{
+}
+
+//If the item calls update inside updatePaintNode, it should schedule another update
+void tst_qsgcanvas::constantUpdates()
+{
+    QSGCanvas canvas;
+    ConstantUpdateItem item(canvas.rootItem());
+    canvas.show();
+    QTRY_VERIFY(item.iterations > 60);
+}
+
+void tst_qsgcanvas::touchEvent_basic()
+{
+    QSGCanvas *canvas = new QSGCanvas;
+    canvas->resize(250, 250);
+    canvas->window()->move(100, 100);
+    canvas->show();
+
+    TestTouchItem *bottomItem = new TestTouchItem(canvas->rootItem());
+    bottomItem->setObjectName("Bottom Item");
+    bottomItem->setSize(QSizeF(150, 150));
+
+    TestTouchItem *middleItem = new TestTouchItem(bottomItem);
+    middleItem->setObjectName("Middle Item");
+    middleItem->setPos(QPointF(50, 50));
+    middleItem->setSize(QSizeF(150, 150));
+
+    TestTouchItem *topItem = new TestTouchItem(middleItem);
+    topItem->setObjectName("Top Item");
+    topItem->setPos(QPointF(50, 50));
+    topItem->setSize(QSizeF(150, 150));
+
+    QPointF pos(10, 10);
+
+    // press single point
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint());
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QVERIFY(bottomItem->lastEvent.touchPoints.isEmpty());
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(topItem, pos)));
+    topItem->reset();
+
+    // press multiple points
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint())
+                             .press(1, bottomItem->mapToScene(pos).toPoint());
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(topItem, pos)));
+    COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(bottomItem, pos)));
+    topItem->reset();
+    bottomItem->reset();
+
+    // touch point on top item moves to bottom item, but top item should still receive the event
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).move(0, bottomItem->mapToScene(pos).toPoint());
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchUpdate, canvas, Qt::TouchPointMoved,
+            makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos), pos)));
+    topItem->reset();
+
+    // touch point on bottom item moves to top item, but bottom item should still receive the event
+    QTest::touchEvent(canvas).press(0, bottomItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).move(0, topItem->mapToScene(pos).toPoint());
+    QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchUpdate, canvas, Qt::TouchPointMoved,
+            makeTouchPoint(bottomItem, bottomItem->mapFromItem(topItem, pos), pos)));
+    bottomItem->reset();
+
+    // a single stationary press on an item shouldn't cause an event
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).stationary(0)
+                             .press(1, bottomItem->mapToScene(pos).toPoint());
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);    // received press only, not stationary
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(topItem, pos)));
+    COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(bottomItem, pos)));
+    topItem->reset();
+    bottomItem->reset();
+
+    // move touch point from top item to bottom, and release
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).release(0, bottomItem->mapToScene(pos).toPoint());
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchEnd, canvas, Qt::TouchPointReleased,
+            makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos), pos)));
+    topItem->reset();
+
+    // release while another point is pressed
+    QTest::touchEvent(canvas).press(0, topItem->mapToScene(pos).toPoint())
+                             .press(1, bottomItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).move(0, bottomItem->mapToScene(pos).toPoint());
+    QTest::touchEvent(canvas).release(0, bottomItem->mapToScene(pos).toPoint())
+                             .stationary(1);
+    QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
+    COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchEnd, canvas, Qt::TouchPointReleased,
+            makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos))));
+    COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed, makeTouchPoint(bottomItem, pos)));
+    topItem->reset();
+    bottomItem->reset();
+
+    delete topItem;
+    delete middleItem;
+    delete bottomItem;
+    delete canvas;
+}
+
+void tst_qsgcanvas::touchEvent_propagation()
+{
+    QFETCH(bool, acceptEvents);
+    QFETCH(bool, enableItem);
+    QFETCH(qreal, itemOpacity);
+
+    QSGCanvas *canvas = new QSGCanvas;
+    canvas->resize(250, 250);
+    canvas->window()->move(100, 100);
+    canvas->show();
+
+    TestTouchItem *bottomItem = new TestTouchItem(canvas->rootItem());
+    bottomItem->setObjectName("Bottom Item");
+    bottomItem->setSize(QSizeF(150, 150));
+
+    TestTouchItem *middleItem = new TestTouchItem(bottomItem);
+    middleItem->setObjectName("Middle Item");
+    middleItem->setPos(QPointF(50, 50));
+    middleItem->setSize(QSizeF(150, 150));
+
+    TestTouchItem *topItem = new TestTouchItem(middleItem);
+    topItem->setObjectName("Top Item");
+    topItem->setPos(QPointF(50, 50));
+    topItem->setSize(QSizeF(150, 150));
+
+    QPointF pos(10, 10);
+    QPoint pointInBottomItem = bottomItem->mapToScene(pos).toPoint();  // (10, 10)
+    QPoint pointInMiddleItem = middleItem->mapToScene(pos).toPoint();  // (60, 60) overlaps with bottomItem
+    QPoint pointInTopItem = topItem->mapToScene(pos).toPoint();  // (110, 110) overlaps with bottom & top items
+
+    // disable topItem
+    topItem->acceptEvents = acceptEvents;
+    topItem->setEnabled(enableItem);
+    topItem->setOpacity(itemOpacity);
+
+    // single touch to top item, should be received by middle item
+    QTest::touchEvent(canvas).press(0, pointInTopItem);
+    QVERIFY(topItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(middleItem->lastEvent.touchPoints.count(), 1);
+    QVERIFY(bottomItem->lastEvent.touchPoints.isEmpty());
+    COMPARE_TOUCH_DATA(middleItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed,
+            makeTouchPoint(middleItem, middleItem->mapFromItem(topItem, pos))));
+
+    // touch top and middle items, middle item should get both events
+    QTest::touchEvent(canvas).press(0, pointInTopItem)
+                             .press(1, pointInMiddleItem);
+    QVERIFY(topItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(middleItem->lastEvent.touchPoints.count(), 2);
+    QVERIFY(bottomItem->lastEvent.touchPoints.isEmpty());
+    COMPARE_TOUCH_DATA(middleItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed,
+            (QList<QTouchEvent::TouchPoint>() << makeTouchPoint(middleItem, middleItem->mapFromItem(topItem, pos))
+                                              << makeTouchPoint(middleItem, pos) )));
+    middleItem->reset();
+
+    // disable middleItem as well
+    middleItem->acceptEvents = acceptEvents;
+    middleItem->setEnabled(enableItem);
+    middleItem->setOpacity(itemOpacity);
+
+    // touch top and middle items, bottom item should get all events
+    QTest::touchEvent(canvas).press(0, pointInTopItem)
+                             .press(1, pointInMiddleItem);
+    QVERIFY(topItem->lastEvent.touchPoints.isEmpty());
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 2);
+    COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed,
+            (QList<QTouchEvent::TouchPoint>() << makeTouchPoint(bottomItem, bottomItem->mapFromItem(topItem, pos))
+                                              << makeTouchPoint(bottomItem, bottomItem->mapFromItem(middleItem, pos)) )));
+    bottomItem->reset();
+
+    // disable bottom item as well
+    bottomItem->acceptEvents = acceptEvents;
+    bottomItem->setEnabled(enableItem);
+    bottomItem->setOpacity(itemOpacity);
+
+    // no events should be received
+    QTest::touchEvent(canvas).press(0, pointInTopItem)
+                             .press(1, pointInMiddleItem)
+                             .press(2, pointInBottomItem);
+    QVERIFY(topItem->lastEvent.touchPoints.isEmpty());
+    QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+    QVERIFY(bottomItem->lastEvent.touchPoints.isEmpty());
+
+    topItem->reset();
+    middleItem->reset();
+    bottomItem->reset();
+
+    // disable middle item, touch on top item
+    middleItem->acceptEvents = acceptEvents;
+    middleItem->setEnabled(enableItem);
+    middleItem->setOpacity(itemOpacity);
+    QTest::touchEvent(canvas).press(0, pointInTopItem);
+    if (!enableItem || itemOpacity == 0) {
+        // middle item is disabled or has 0 opacity, bottom item receives the event
+        QVERIFY(topItem->lastEvent.touchPoints.isEmpty());
+        QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+        QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
+        COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed,
+                makeTouchPoint(bottomItem, bottomItem->mapFromItem(topItem, pos))));
+    } else {
+        // middle item ignores event, sends it to the top item (top-most child)
+        QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
+        QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
+        QVERIFY(bottomItem->lastEvent.touchPoints.isEmpty());
+        COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchBegin, canvas, Qt::TouchPointPressed,
+                makeTouchPoint(topItem, pos)));
+    }
+
+    delete topItem;
+    delete middleItem;
+    delete bottomItem;
+    delete canvas;
+}
+
+void tst_qsgcanvas::touchEvent_propagation_data()
+{
+    QTest::addColumn<bool>("acceptEvents");
+    QTest::addColumn<bool>("enableItem");
+    QTest::addColumn<qreal>("itemOpacity");
+
+    QTest::newRow("disable events") << false << true << 1.0;
+    QTest::newRow("disable item") << true << false << 1.0;
+    QTest::newRow("opacity of 0") << true << true << 0.0;
+}
+
+void tst_qsgcanvas::clearCanvas()
+{
+    QSGCanvas *canvas = new QSGCanvas;
+    QSGItem *item = new QSGItem;
+    item->setParentItem(canvas->rootItem());
+
+    QVERIFY(item->canvas() == canvas);
+
+    delete canvas;
+
+    QVERIFY(item->canvas() == 0);
+
+    delete item;
+}
+
+
+
+QTEST_MAIN(tst_qsgcanvas)
+
+#include "tst_qsgcanvas.moc"
diff --git a/tests/auto/declarative/qsgflickable/data/disabledcontent.qml b/tests/auto/declarative/qsgflickable/data/disabledcontent.qml
new file mode 100644
index 0000000000..f02f08e4ea
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/disabledcontent.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Flickable {
+    width: 100; height: 100
+    contentWidth: 200; contentHeight: 300
+
+    QGraphicsWidget { width: 200; height: 300; enabled: false }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/flickable01.qml b/tests/auto/declarative/qsgflickable/data/flickable01.qml
new file mode 100644
index 0000000000..cbec44bb4f
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/flickable01.qml
@@ -0,0 +1,4 @@
+import QtQuick 2.0
+
+Flickable {
+}
diff --git a/tests/auto/declarative/qsgflickable/data/flickable02.qml b/tests/auto/declarative/qsgflickable/data/flickable02.qml
new file mode 100644
index 0000000000..80caa32da5
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/flickable02.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Flickable {
+    width: 100; height: 100
+    contentWidth: row.width; contentHeight: row.height
+
+    Row {
+        id: row
+        Repeater {
+            model: 4
+            Rectangle { width: 200; height: 300; color: "blue" }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/flickable03.qml b/tests/auto/declarative/qsgflickable/data/flickable03.qml
new file mode 100644
index 0000000000..e34b63b6ac
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/flickable03.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Flickable {
+    width: 100; height: 100
+    contentWidth: column.width; contentHeight: column.height
+
+    Column {
+        id: column
+        Repeater {
+            model: 4
+            Rectangle { width: 200; height: 300; color: "blue" }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/flickable04.qml b/tests/auto/declarative/qsgflickable/data/flickable04.qml
new file mode 100644
index 0000000000..b2f30b84ec
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/flickable04.qml
@@ -0,0 +1,22 @@
+import QtQuick 2.0
+
+Flickable {
+    property bool ok: false
+    function check() {
+        if (column.parent == contentItem)
+            ok = true;
+    }
+
+    width: 100; height: 100
+    contentWidth: column.width; contentHeight: column.height
+    pressDelay: 200; boundsBehavior: Flickable.StopAtBounds; interactive: false
+    maximumFlickVelocity: 2000
+
+    Column {
+        id: column
+        Repeater {
+            model: 4
+            Rectangle { width: 200; height: 300; color: "blue" }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/flickableqgraphicswidget.qml b/tests/auto/declarative/qsgflickable/data/flickableqgraphicswidget.qml
new file mode 100644
index 0000000000..bb8f1eefc6
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/flickableqgraphicswidget.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+Flickable {
+    width: 100; height: 100
+
+    QGraphicsWidget { objectName: "widget1"; width: 200; height: 300 }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/nestedPressDelay.qml b/tests/auto/declarative/qsgflickable/data/nestedPressDelay.qml
new file mode 100644
index 0000000000..60dadcc73c
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/nestedPressDelay.qml
@@ -0,0 +1,33 @@
+import QtQuick 2.0
+
+Flickable {
+    property bool pressed: ma.pressed
+    width: 240
+    height: 320
+    contentWidth: 480
+    contentHeight: 320
+    flickableDirection: Flickable.HorizontalFlick
+    pressDelay: 50
+    Flickable {
+        objectName: "innerFlickable"
+        flickableDirection: Flickable.VerticalFlick
+        width: 480
+        height: 320
+        contentWidth: 480
+        contentHeight: 400
+        pressDelay: 10000
+        Rectangle {
+            y: 100
+            anchors.horizontalCenter: parent.horizontalCenter
+            width: 240
+            height: 100
+            color: ma.pressed ? 'blue' : 'green'
+            MouseArea {
+                id: ma
+                objectName: "mouseArea"
+                anchors.fill: parent
+            }
+        }
+    }
+}
+
diff --git a/tests/auto/declarative/qsgflickable/data/resize.qml b/tests/auto/declarative/qsgflickable/data/resize.qml
new file mode 100644
index 0000000000..1a9ef54107
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/resize.qml
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+
+Rectangle {
+    function resizeContent() {
+        flick.resizeContent(600, 600, Qt.point(100, 100))
+    }
+    function returnToBounds() {
+        flick.returnToBounds()
+    }
+    width: 400
+    height: 360
+    color: "gray"
+
+    Flickable {
+        id: flick
+        objectName: "flick"
+        anchors.fill: parent
+        contentWidth: 300
+        contentHeight: 300
+
+        Rectangle {
+            width: flick.contentWidth
+            height: flick.contentHeight
+            color: "red"
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgflickable/data/wheel.qml b/tests/auto/declarative/qsgflickable/data/wheel.qml
new file mode 100644
index 0000000000..2928bbcd72
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/data/wheel.qml
@@ -0,0 +1,25 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400
+    height: 400
+    color: "gray"
+
+    Flickable {
+        id: flick
+        objectName: "flick"
+        anchors.fill: parent
+        contentWidth: 800
+        contentHeight: 800
+
+        Rectangle {
+            width: flick.contentWidth
+            height: flick.contentHeight
+            color: "red"
+            Rectangle {
+                width: 50; height: 50; color: "blue"
+                anchors.centerIn: parent
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgflickable/qsgflickable.pro b/tests/auto/declarative/qsgflickable/qsgflickable.pro
new file mode 100644
index 0000000000..a1ecbe509a
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/qsgflickable.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgflickable.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgflickable/tst_qsgflickable.cpp b/tests/auto/declarative/qsgflickable/tst_qsgflickable.cpp
new file mode 100644
index 0000000000..1532281338
--- /dev/null
+++ b/tests/auto/declarative/qsgflickable/tst_qsgflickable.cpp
@@ -0,0 +1,450 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtTest/QSignalSpy>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgflickable_p.h>
+#include <private/qdeclarativevaluetype_p.h>
+#include <math.h>
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsgflickable : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgflickable();
+
+private slots:
+    void create();
+    void horizontalViewportSize();
+    void verticalViewportSize();
+    void properties();
+    void boundsBehavior();
+    void maximumFlickVelocity();
+    void flickDeceleration();
+    void pressDelay();
+    void disabledContent();
+    void nestedPressDelay();
+    void flickableDirection();
+    void resizeContent();
+    void returnToBounds();
+    void wheel();
+
+private:
+    QDeclarativeEngine engine;
+
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &objectName);
+};
+
+tst_qsgflickable::tst_qsgflickable()
+{
+}
+
+void tst_qsgflickable::create()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable01.qml"));
+    QSGFlickable *obj = qobject_cast<QSGFlickable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->isAtXBeginning(), true);
+    QCOMPARE(obj->isAtXEnd(), false);
+    QCOMPARE(obj->isAtYBeginning(), true);
+    QCOMPARE(obj->isAtYEnd(), false);
+    QCOMPARE(obj->contentX(), 0.);
+    QCOMPARE(obj->contentY(), 0.);
+
+    QCOMPARE(obj->horizontalVelocity(), 0.);
+    QCOMPARE(obj->verticalVelocity(), 0.);
+
+    QCOMPARE(obj->isInteractive(), true);
+    QCOMPARE(obj->boundsBehavior(), QSGFlickable::DragAndOvershootBounds);
+    QCOMPARE(obj->pressDelay(), 0);
+    QCOMPARE(obj->maximumFlickVelocity(), 2000.);
+
+    delete obj;
+}
+
+void tst_qsgflickable::horizontalViewportSize()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable02.qml"));
+    QSGFlickable *obj = qobject_cast<QSGFlickable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->contentWidth(), 800.);
+    QCOMPARE(obj->contentHeight(), 300.);
+    QCOMPARE(obj->isAtXBeginning(), true);
+    QCOMPARE(obj->isAtXEnd(), false);
+    QCOMPARE(obj->isAtYBeginning(), true);
+    QCOMPARE(obj->isAtYEnd(), false);
+
+    delete obj;
+}
+
+void tst_qsgflickable::verticalViewportSize()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable03.qml"));
+    QSGFlickable *obj = qobject_cast<QSGFlickable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->contentWidth(), 200.);
+    QCOMPARE(obj->contentHeight(), 1200.);
+    QCOMPARE(obj->isAtXBeginning(), true);
+    QCOMPARE(obj->isAtXEnd(), false);
+    QCOMPARE(obj->isAtYBeginning(), true);
+    QCOMPARE(obj->isAtYEnd(), false);
+
+    delete obj;
+}
+
+void tst_qsgflickable::properties()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable04.qml"));
+    QSGFlickable *obj = qobject_cast<QSGFlickable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->isInteractive(), false);
+    QCOMPARE(obj->boundsBehavior(), QSGFlickable::StopAtBounds);
+    QCOMPARE(obj->pressDelay(), 200);
+    QCOMPARE(obj->maximumFlickVelocity(), 2000.);
+
+    QVERIFY(obj->property("ok").toBool() == false);
+    QMetaObject::invokeMethod(obj, "check");
+    QVERIFY(obj->property("ok").toBool() == true);
+
+    delete obj;
+}
+
+void tst_qsgflickable::boundsBehavior()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Flickable { boundsBehavior: Flickable.StopAtBounds }", QUrl::fromLocalFile(""));
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(component.create());
+    QSignalSpy spy(flickable, SIGNAL(boundsBehaviorChanged()));
+
+    QVERIFY(flickable);
+    QVERIFY(flickable->boundsBehavior() == QSGFlickable::StopAtBounds);
+
+    flickable->setBoundsBehavior(QSGFlickable::DragAndOvershootBounds);
+    QVERIFY(flickable->boundsBehavior() == QSGFlickable::DragAndOvershootBounds);
+    QCOMPARE(spy.count(),1);
+    flickable->setBoundsBehavior(QSGFlickable::DragAndOvershootBounds);
+    QCOMPARE(spy.count(),1);
+
+    flickable->setBoundsBehavior(QSGFlickable::DragOverBounds);
+    QVERIFY(flickable->boundsBehavior() == QSGFlickable::DragOverBounds);
+    QCOMPARE(spy.count(),2);
+    flickable->setBoundsBehavior(QSGFlickable::DragOverBounds);
+    QCOMPARE(spy.count(),2);
+
+    flickable->setBoundsBehavior(QSGFlickable::StopAtBounds);
+    QVERIFY(flickable->boundsBehavior() == QSGFlickable::StopAtBounds);
+    QCOMPARE(spy.count(),3);
+    flickable->setBoundsBehavior(QSGFlickable::StopAtBounds);
+    QCOMPARE(spy.count(),3);
+}
+
+void tst_qsgflickable::maximumFlickVelocity()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Flickable { maximumFlickVelocity: 1.0; }", QUrl::fromLocalFile(""));
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(component.create());
+    QSignalSpy spy(flickable, SIGNAL(maximumFlickVelocityChanged()));
+
+    QVERIFY(flickable);
+    QCOMPARE(flickable->maximumFlickVelocity(), 1.0);
+
+    flickable->setMaximumFlickVelocity(2.0);
+    QCOMPARE(flickable->maximumFlickVelocity(), 2.0);
+    QCOMPARE(spy.count(),1);
+    flickable->setMaximumFlickVelocity(2.0);
+    QCOMPARE(spy.count(),1);
+}
+
+void tst_qsgflickable::flickDeceleration()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Flickable { flickDeceleration: 1.0; }", QUrl::fromLocalFile(""));
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(component.create());
+    QSignalSpy spy(flickable, SIGNAL(flickDecelerationChanged()));
+
+    QVERIFY(flickable);
+    QCOMPARE(flickable->flickDeceleration(), 1.0);
+
+    flickable->setFlickDeceleration(2.0);
+    QCOMPARE(flickable->flickDeceleration(), 2.0);
+    QCOMPARE(spy.count(),1);
+    flickable->setFlickDeceleration(2.0);
+    QCOMPARE(spy.count(),1);
+}
+
+void tst_qsgflickable::pressDelay()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Flickable { pressDelay: 100; }", QUrl::fromLocalFile(""));
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(component.create());
+    QSignalSpy spy(flickable, SIGNAL(pressDelayChanged()));
+
+    QVERIFY(flickable);
+    QCOMPARE(flickable->pressDelay(), 100);
+
+    flickable->setPressDelay(200);
+    QCOMPARE(flickable->pressDelay(), 200);
+    QCOMPARE(spy.count(),1);
+    flickable->setPressDelay(200);
+    QCOMPARE(spy.count(),1);
+}
+
+// QT-4677
+void tst_qsgflickable::disabledContent()
+{
+    QSGView *canvas = new QSGView;
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/disabledcontent.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(canvas->rootObject());
+    QVERIFY(flickable != 0);
+
+    QVERIFY(flickable->contentX() == 0);
+    QVERIFY(flickable->contentY() == 0);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50, 50));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(70,70), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(90,90), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(100,100), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+
+    QVERIFY(flickable->contentX() < 0);
+    QVERIFY(flickable->contentY() < 0);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(90, 90));
+
+    delete canvas;
+}
+
+
+// QTBUG-17361
+void tst_qsgflickable::nestedPressDelay()
+{
+    QSGView *canvas = new QSGView;
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/nestedPressDelay.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGFlickable *outer = qobject_cast<QSGFlickable*>(canvas->rootObject());
+    QVERIFY(outer != 0);
+
+    QSGFlickable *inner = canvas->rootObject()->findChild<QSGFlickable*>("innerFlickable");
+    QVERIFY(inner != 0);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(150, 150));
+    // the MouseArea is not pressed immediately
+    QVERIFY(outer->property("pressed").toBool() == false);
+
+    // The outer pressDelay will prevail (50ms, vs. 10sec)
+    // QTRY_VERIFY() has 5sec timeout, so will timeout well within 10sec.
+    QTRY_VERIFY(outer->property("pressed").toBool() == true);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(150, 150));
+
+    delete canvas;
+}
+
+void tst_qsgflickable::flickableDirection()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Flickable { flickableDirection: Flickable.VerticalFlick; }", QUrl::fromLocalFile(""));
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(component.create());
+    QSignalSpy spy(flickable, SIGNAL(flickableDirectionChanged()));
+
+    QVERIFY(flickable);
+    QCOMPARE(flickable->flickableDirection(), QSGFlickable::VerticalFlick);
+
+    flickable->setFlickableDirection(QSGFlickable::HorizontalAndVerticalFlick);
+    QCOMPARE(flickable->flickableDirection(), QSGFlickable::HorizontalAndVerticalFlick);
+    QCOMPARE(spy.count(),1);
+
+    flickable->setFlickableDirection(QSGFlickable::AutoFlickDirection);
+    QCOMPARE(flickable->flickableDirection(), QSGFlickable::AutoFlickDirection);
+    QCOMPARE(spy.count(),2);
+
+    flickable->setFlickableDirection(QSGFlickable::HorizontalFlick);
+    QCOMPARE(flickable->flickableDirection(), QSGFlickable::HorizontalFlick);
+    QCOMPARE(spy.count(),3);
+
+    flickable->setFlickableDirection(QSGFlickable::HorizontalFlick);
+    QCOMPARE(flickable->flickableDirection(), QSGFlickable::HorizontalFlick);
+    QCOMPARE(spy.count(),3);
+}
+
+// QtQuick 1.1
+void tst_qsgflickable::resizeContent()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml"));
+    QSGItem *root = qobject_cast<QSGItem*>(c.create());
+    QSGFlickable *obj = findItem<QSGFlickable>(root, "flick");
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->contentX(), 0.);
+    QCOMPARE(obj->contentY(), 0.);
+    QCOMPARE(obj->contentWidth(), 300.);
+    QCOMPARE(obj->contentHeight(), 300.);
+
+    QMetaObject::invokeMethod(root, "resizeContent");
+
+    QCOMPARE(obj->contentX(), 100.);
+    QCOMPARE(obj->contentY(), 100.);
+    QCOMPARE(obj->contentWidth(), 600.);
+    QCOMPARE(obj->contentHeight(), 600.);
+
+    delete root;
+}
+
+// QtQuick 1.1
+void tst_qsgflickable::returnToBounds()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml"));
+    QSGItem *root = qobject_cast<QSGItem*>(c.create());
+    QSGFlickable *obj = findItem<QSGFlickable>(root, "flick");
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->contentX(), 0.);
+    QCOMPARE(obj->contentY(), 0.);
+    QCOMPARE(obj->contentWidth(), 300.);
+    QCOMPARE(obj->contentHeight(), 300.);
+
+    obj->setContentX(100);
+    obj->setContentY(400);
+    QTRY_COMPARE(obj->contentX(), 100.);
+    QTRY_COMPARE(obj->contentY(), 400.);
+
+    QMetaObject::invokeMethod(root, "returnToBounds");
+
+    QTRY_COMPARE(obj->contentX(), 0.);
+    QTRY_COMPARE(obj->contentY(), 0.);
+
+    delete root;
+}
+
+void tst_qsgflickable::wheel()
+{
+    QSGView *canvas = new QSGView;
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/wheel.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGFlickable *flick = canvas->rootObject()->findChild<QSGFlickable*>("flick");
+    QVERIFY(flick != 0);
+
+    {
+        QWheelEvent event(QPoint(200, 200), -120, Qt::NoButton, Qt::NoModifier, Qt::Vertical);
+        event.setAccepted(false);
+        QApplication::sendEvent(canvas, &event);
+    }
+
+    QTRY_VERIFY(flick->contentY() > 0);
+    QVERIFY(flick->contentX() == 0);
+
+    flick->setContentY(0);
+    QVERIFY(flick->contentY() == 0);
+
+    {
+        QWheelEvent event(QPoint(200, 200), -120, Qt::NoButton, Qt::NoModifier, Qt::Horizontal);
+        event.setAccepted(false);
+        QApplication::sendEvent(canvas, &event);
+    }
+
+    QTRY_VERIFY(flick->contentX() > 0);
+    QVERIFY(flick->contentY() == 0);
+
+    delete canvas;
+}
+
+
+template<typename T>
+T *tst_qsgflickable::findItem(QSGItem *parent, const QString &objectName)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            return static_cast<T*>(item);
+        }
+        item = findItem<T>(item, objectName);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+QTEST_MAIN(tst_qsgflickable)
+
+#include "tst_qsgflickable.moc"
diff --git a/tests/auto/declarative/qsgflipable/data/crash.qml b/tests/auto/declarative/qsgflipable/data/crash.qml
new file mode 100644
index 0000000000..a0327918cb
--- /dev/null
+++ b/tests/auto/declarative/qsgflipable/data/crash.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+
+Flipable {
+   transform: Rotation {
+        axis.y: 1
+        axis.z: 0
+        angle: 180
+    }
+}
diff --git a/tests/auto/declarative/qsgflipable/data/flipable-abort.qml b/tests/auto/declarative/qsgflipable/data/flipable-abort.qml
new file mode 100644
index 0000000000..90fc03a5f9
--- /dev/null
+++ b/tests/auto/declarative/qsgflipable/data/flipable-abort.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Rectangle {
+    Flipable {
+        id: flipable
+    }
+    Rectangle {
+        visible: flipable.side == Flipable.Front
+    }
+}
diff --git a/tests/auto/declarative/qsgflipable/data/test-flipable.qml b/tests/auto/declarative/qsgflipable/data/test-flipable.qml
new file mode 100644
index 0000000000..dff6d3fe39
--- /dev/null
+++ b/tests/auto/declarative/qsgflipable/data/test-flipable.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+
+Flipable {
+    id: flipable
+    width: 640; height: 480
+
+    front: Rectangle { anchors.fill: flipable }
+    back: Rectangle { anchors.fill: flipable }
+}
diff --git a/tests/auto/declarative/qsgflipable/qsgflipable.pro b/tests/auto/declarative/qsgflipable/qsgflipable.pro
new file mode 100644
index 0000000000..c87cd4db5c
--- /dev/null
+++ b/tests/auto/declarative/qsgflipable/qsgflipable.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgflipable.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgflipable/tst_qsgflipable.cpp b/tests/auto/declarative/qsgflipable/tst_qsgflipable.cpp
new file mode 100644
index 0000000000..205c2ce607
--- /dev/null
+++ b/tests/auto/declarative/qsgflipable/tst_qsgflipable.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgflipable_p.h>
+#include <private/qdeclarativevaluetype_p.h>
+#include <QFontMetrics>
+#include <private/qsgrectangle_p.h>
+#include <math.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsgflipable : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgflipable();
+
+private slots:
+    void create();
+    void checkFrontAndBack();
+    void setFrontAndBack();
+
+    // below here task issues
+    void QTBUG_9161_crash();
+    void QTBUG_8474_qgv_abort();
+
+private:
+    QDeclarativeEngine engine;
+};
+
+tst_qsgflipable::tst_qsgflipable()
+{
+}
+
+void tst_qsgflipable::create()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml"));
+    QSGFlipable *obj = qobject_cast<QSGFlipable*>(c.create());
+
+    QVERIFY(obj != 0);
+    delete obj;
+}
+
+void tst_qsgflipable::checkFrontAndBack()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml"));
+    QSGFlipable *obj = qobject_cast<QSGFlipable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QVERIFY(obj->front() != 0);
+    QVERIFY(obj->back() != 0);
+    delete obj;
+}
+
+void tst_qsgflipable::setFrontAndBack()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml"));
+    QSGFlipable *obj = qobject_cast<QSGFlipable*>(c.create());
+
+    QVERIFY(obj != 0);
+    QVERIFY(obj->front() != 0);
+    QVERIFY(obj->back() != 0);
+
+    QString message = c.url().toString() + ":3:1: QML Flipable: front is a write-once property";
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(message));
+    obj->setFront(new QSGRectangle());
+
+    message = c.url().toString() + ":3:1: QML Flipable: back is a write-once property";
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(message));
+    obj->setBack(new QSGRectangle());
+    delete obj;
+}
+
+void tst_qsgflipable::QTBUG_9161_crash()
+{
+    QSGView *canvas = new QSGView;
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/crash.qml"));
+    QSGItem *root = canvas->rootObject();
+    QVERIFY(root != 0);
+    canvas->show();
+    delete canvas;
+}
+
+void tst_qsgflipable::QTBUG_8474_qgv_abort()
+{
+    QSGView *canvas = new QSGView;
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/flipable-abort.qml"));
+    QSGItem *root = canvas->rootObject();
+    QVERIFY(root != 0);
+    canvas->show();
+    delete canvas;
+}
+
+QTEST_MAIN(tst_qsgflipable)
+
+#include "tst_qsgflipable.moc"
diff --git a/tests/auto/declarative/qsgfocusscope/data/chain.qml b/tests/auto/declarative/qsgfocusscope/data/chain.qml
new file mode 100644
index 0000000000..4b96662318
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/chain.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    width:300; height:400
+
+    property bool focus1: root.activeFocus
+    property bool focus2: item1.activeFocus
+    property bool focus3: fs1.activeFocus
+    property bool focus4: fs2.activeFocus
+    property bool focus5: theItem.activeFocus
+
+    Item {
+        id: item1
+        FocusScope {
+            id: fs1
+            focus: true
+            FocusScope {
+                id: fs2
+                focus: true
+                Item {
+                    id: theItem
+                    focus: true
+                }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/forceActiveFocus.qml b/tests/auto/declarative/qsgfocusscope/data/forceActiveFocus.qml
new file mode 100644
index 0000000000..74d2106888
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/forceActiveFocus.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.0
+
+Rectangle {
+    objectName: "root"
+    FocusScope {
+        objectName: "scope"
+        Item {
+            objectName: "item-a1"
+            FocusScope {
+                objectName: "scope-a"
+                Item {
+                    objectName: "item-a2"
+                }
+            }
+        }
+        Item {
+            objectName: "item-b1"
+            FocusScope {
+                objectName: "scope-b"
+                Item {
+                    objectName: "item-b2"
+                }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/forcefocus.qml b/tests/auto/declarative/qsgfocusscope/data/forcefocus.qml
new file mode 100644
index 0000000000..f41582a951
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/forcefocus.qml
@@ -0,0 +1,81 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 800; height: 600
+
+    FocusScope {
+        focus: true
+
+        FocusScope {
+            id: firstScope
+            objectName: "item0"
+            focus: true
+
+            Rectangle {
+                height: 120; width: 420
+
+                color: "transparent"
+                border.width: 5; border.color: firstScope.activeFocus?"blue":"black"
+
+                Rectangle {
+                    id: item1; objectName: "item1"
+                    x: 10; y: 10; width: 100; height: 100; color: "green"
+                    border.width: 5; border.color: activeFocus?"blue":"black"
+                    focus: true
+
+                    Rectangle {
+                        width: 50; height: 50; anchors.centerIn: parent
+                        color: parent.activeFocus?"red":"transparent"
+                    }
+                }
+
+                Rectangle {
+                    id: item2; objectName: "item2"
+                    x: 310; y: 10; width: 100; height: 100; color: "green"
+                    border.width: 5; border.color: activeFocus?"blue":"black"
+
+                    Rectangle {
+                        width: 50; height: 50; anchors.centerIn: parent
+                        color: parent.activeFocus?"red":"transparent"
+                    }
+                }
+            }
+        }
+
+        FocusScope {
+            id: secondScope
+            objectName: "item3"
+
+            Rectangle {
+                y: 160; height: 120; width: 420
+
+                color: "transparent"
+                border.width: 5; border.color: secondScope.activeFocus?"blue":"black"
+
+                Rectangle {
+                    id: item4; objectName: "item4"
+                    x: 10; y: 10; width: 100; height: 100; color: "green"
+                    border.width: 5; border.color: activeFocus?"blue":"black"
+
+                    Rectangle {
+                        width: 50; height: 50; anchors.centerIn: parent
+                        color: parent.activeFocus?"red":"transparent"
+                    }
+                }
+
+                Rectangle {
+                    id: item5; objectName: "item5"
+                    x: 310; y: 10; width: 100; height: 100; color: "green"
+                    border.width: 5; border.color: activeFocus?"blue":"black"
+
+                    Rectangle {
+                        width: 50; height: 50; anchors.centerIn: parent
+                        color: parent.activeFocus?"red":"transparent"
+                    }
+                }
+            }
+        }
+    }
+    Keys.onDigit4Pressed: item4.focus = true
+    Keys.onDigit5Pressed: item5.forceActiveFocus()
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/qtBug13380.qml b/tests/auto/declarative/qsgfocusscope/data/qtBug13380.qml
new file mode 100644
index 0000000000..29de046b38
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/qtBug13380.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400; height: 400
+
+    property bool showRect: false
+    onShowRectChanged: if (showRect) rect.visible = true
+    property bool noFocus: !fs2.activeFocus
+
+    FocusScope {
+        id: fs1
+        focus: true
+    }
+    Rectangle {
+        id: rect
+        visible: false
+        FocusScope {
+            id: fs2
+            Rectangle {
+                focus: true
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/signalEmission.qml b/tests/auto/declarative/qsgfocusscope/data/signalEmission.qml
new file mode 100644
index 0000000000..999a40c5ad
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/signalEmission.qml
@@ -0,0 +1,33 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 200
+    height: 200
+
+    FocusScope {
+        focus: true
+        Rectangle {
+            objectName: "item1"
+            color: "blue"
+            onFocusChanged: focus ? color = "red" : color = "blue"
+        }
+        Rectangle {
+            objectName: "item2"
+            color: "blue"
+            onFocusChanged: focus ? color = "red" : color = "blue"
+        }
+    }
+
+    FocusScope {
+        Rectangle {
+            objectName: "item3"
+            color: "blue"
+            onFocusChanged: focus ? color = "red" : color = "blue"
+        }
+        Rectangle {
+            objectName: "item4"
+            color: "blue"
+            onFocusChanged: focus ? color = "red" : color = "blue"
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/test.qml b/tests/auto/declarative/qsgfocusscope/data/test.qml
new file mode 100644
index 0000000000..67be29c3fb
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/test.qml
@@ -0,0 +1,77 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "white"
+    width: 800
+    height: 600
+
+    Keys.onDigit9Pressed: console.log("Error - Root")
+
+    FocusScope {
+        id: myScope
+        objectName: "item0"
+        focus: true
+
+        Keys.onDigit9Pressed: console.log("Error - FocusScope")
+
+        Rectangle {
+            height: 120
+            width: 420
+
+            color: "transparent"
+            border.width: 5
+            border.color: myScope.activeFocus?"blue":"black"
+
+            Rectangle {
+                id: item1; objectName: "item1"
+                x: 10; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: activeFocus?"blue":"black"
+                Keys.onDigit9Pressed: console.debug("Top Left");
+                KeyNavigation.right: item2
+                focus: true
+
+                Rectangle {
+                    width: 50; height: 50; anchors.centerIn: parent
+                    color: parent.activeFocus?"red":"transparent"
+                }
+            }
+
+            Rectangle {
+                id: item2; objectName: "item2"
+                x: 310; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: activeFocus?"blue":"black"
+                KeyNavigation.left: item1
+                Keys.onDigit9Pressed: console.log("Top Right");
+
+                Rectangle {
+                    width: 50; height: 50; anchors.centerIn: parent
+                    color: parent.activeFocus?"red":"transparent"
+                }
+            }
+        }
+        KeyNavigation.down: item3
+    }
+
+    Text { x:100; y:170; text: "Blue border indicates scoped focus\nBlack border indicates NOT scoped focus\nRed box indicates active focus\nUse arrow keys to navigate\nPress \"9\" to print currently focused item" }
+
+    Rectangle {
+        id: item3; objectName: "item3"
+        x: 10; y: 300
+        width: 100; height: 100; color: "green"
+        border.width: 5
+        border.color: activeFocus?"blue":"black"
+
+        Keys.onDigit9Pressed: console.log("Bottom Left");
+        KeyNavigation.up: myScope
+
+        Rectangle {
+            width: 50; height: 50; anchors.centerIn: parent
+            color: parent.activeFocus?"red":"transparent"
+        }
+    }
+
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/test2.qml b/tests/auto/declarative/qsgfocusscope/data/test2.qml
new file mode 100644
index 0000000000..ad74f3e9f4
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/test2.qml
@@ -0,0 +1,39 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "white"
+    width: 800
+    height: 600
+
+    Text { text: "All five rectangles should be red" }
+
+    FocusScope {
+        y: 100
+        focus: true; objectName: "item1"
+        Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" }
+
+        FocusScope {
+            y: 100
+            focus: true; objectName: "item2"
+            Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" }
+
+            FocusScope {
+                y: 100
+                focus: true; objectName: "item3"
+                Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" }
+
+                FocusScope {
+                    y: 100
+                    focus: true; objectName: "item4"
+                    Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" }
+
+                    FocusScope {
+                        y: 100
+                        focus: true; objectName: "item5"
+                        Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/test3.qml b/tests/auto/declarative/qsgfocusscope/data/test3.qml
new file mode 100644
index 0000000000..537c30816e
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/test3.qml
@@ -0,0 +1,52 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "white"
+    width: 800
+    height: 600
+
+    ListModel {
+        id: model
+        ListElement { name: "1" }
+        ListElement { name: "2" }
+        ListElement { name: "3" }
+        ListElement { name: "4" }
+        ListElement { name: "5" }
+        ListElement { name: "6" }
+        ListElement { name: "7" }
+        ListElement { name: "8" }
+        ListElement { name: "9" }
+    }
+
+    Component {
+        id: verticalDelegate
+        FocusScope {
+            id: root
+            width: 50; height: 50;
+            Keys.onDigit9Pressed: console.log("Error - " + name)
+            Rectangle {
+                focus: true
+                Keys.onDigit9Pressed: console.log(name)
+                width: 50; height: 50;
+                color: root.ListView.isCurrentItem?"red":"green"
+                Text { text: name; anchors.centerIn: parent }
+            }
+        }
+    }
+
+    ListView {
+        width: 800; height: 50; orientation: "Horizontal"
+        focus: true
+        model: model
+        delegate: verticalDelegate
+        preferredHighlightBegin: 100
+        preferredHighlightEnd: 100
+        highlightRangeMode: "StrictlyEnforceRange"
+    }
+
+
+    Text {
+        y: 100; x: 50
+        text: "Currently selected element should be red\nPressing \"9\" should print the number of the currently selected item\nBe sure to scroll all the way to the right, pause, and then all the way to the left."
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/test4.qml b/tests/auto/declarative/qsgfocusscope/data/test4.qml
new file mode 100644
index 0000000000..0eea649f5d
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/test4.qml
@@ -0,0 +1,76 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "white"
+    width: 800
+    height: 600
+
+    Keys.onDigit9Pressed: console.log("Error - Root")
+
+    FocusScope {
+        id: myScope
+
+        Keys.onDigit9Pressed: console.log("Error - FocusScope")
+
+        Rectangle {
+            objectName: "item0"
+            height: 120
+            width: 420
+
+            color: "transparent"
+            border.width: 5
+            border.color: myScope.activeFocus?"blue":"black"
+
+            Rectangle {
+                id: item1; objectName: "item1"
+                x: 10; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: activeFocus?"blue":"black"
+                Keys.onDigit9Pressed: console.log("Error - Top Left");
+                KeyNavigation.right: item2
+                focus: true
+
+                Rectangle {
+                    width: 50; height: 50; anchors.centerIn: parent
+                    color: parent.activeFocus?"red":"transparent"
+                }
+            }
+
+            Rectangle {
+                id: item2; objectName: "item2"
+                x: 310; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: activeFocus?"blue":"black"
+                KeyNavigation.left: item1
+                Keys.onDigit9Pressed: console.log("Error - Top Right");
+
+                Rectangle {
+                    width: 50; height: 50; anchors.centerIn: parent
+                    color: parent.activeFocus?"red":"transparent"
+                }
+            }
+        }
+        KeyNavigation.down: item3
+    }
+
+    Text { x:100; y:170; text: "There should be no blue borders, or red squares.\nPressing \"9\" should do nothing.\nArrow keys should have no effect." }
+
+    Rectangle {
+        id: item3; objectName: "item3"
+        x: 10; y: 300
+        width: 100; height: 100; color: "green"
+        border.width: 5
+        border.color: activeFocus?"blue":"black"
+
+        Keys.onDigit9Pressed: console.log("Error - Bottom Left");
+        KeyNavigation.up: myScope
+
+        Rectangle {
+            width: 50; height: 50; anchors.centerIn: parent
+            color: parent.activeFocus?"red":"transparent"
+        }
+    }
+
+}
diff --git a/tests/auto/declarative/qsgfocusscope/data/test5.qml b/tests/auto/declarative/qsgfocusscope/data/test5.qml
new file mode 100644
index 0000000000..9c37cd1303
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/data/test5.qml
@@ -0,0 +1,84 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "white"
+    width: 800
+    height: 600
+
+    Keys.onReturnPressed: console.log("Error - Root")
+
+    FocusScope {
+        id: myScope
+        objectName: "item0"
+        focus: true
+
+        Keys.onReturnPressed: console.log("Error - FocusScope")
+
+        Rectangle {
+            height: 120
+            width: 420
+
+            color: "transparent"
+            border.width: 5
+            border.color: myScope.activeFocus?"blue":"black"
+
+            Rectangle {
+                x: 10; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: item1.activeFocus?"blue":"black"
+            }
+
+            TextEdit {
+                id: item1; objectName: "item1"
+                x: 20; y: 20
+                width: 90; height: 90
+                color: "white"
+                font.pixelSize: 20
+                Keys.onReturnPressed: console.log("Top Left");
+                KeyNavigation.right: item2
+                focus: true
+                wrapMode: TextEdit.WordWrap
+                text: "Box 1"
+            }
+
+            Rectangle {
+                id: item2; objectName: "item2"
+                x: 310; y: 10
+                width: 100; height: 100; color: "green"
+                border.width: 5
+                border.color: activeFocus?"blue":"black"
+                KeyNavigation.left: item1
+                Keys.onReturnPressed: console.log("Top Right");
+
+                Rectangle {
+                    width: 50; height: 50; anchors.centerIn: parent
+                    color: parent.activeFocus?"red":"transparent"
+                }
+            }
+        }
+        KeyNavigation.down: item3
+    }
+
+    Text { x:100; y:170; text: "Blue border indicates scoped focus\nBlack border indicates NOT scoped focus\nRed box or flashing cursor indicates active focus\nUse arrow keys to navigate\nPress Ctrl-Return to print currently focused item" }
+
+    Rectangle {
+        x: 10; y: 300
+        width: 100; height: 100; color: "green"
+        border.width: 5
+        border.color: item3.activeFocus?"blue":"black"
+    }
+
+    TextEdit {
+        id: item3; objectName: "item3"
+        x: 20; y: 310
+        width: 90; height: 90
+        color: "white"
+        font.pixelSize: 20
+        text: "Box 3"
+
+        Keys.onReturnPressed: console.log("Bottom Left");
+        KeyNavigation.up: myScope
+        wrapMode: TextEdit.WordWrap
+    }
+}
diff --git a/tests/auto/declarative/qsgfocusscope/qsgfocusscope.pro b/tests/auto/declarative/qsgfocusscope/qsgfocusscope.pro
new file mode 100644
index 0000000000..b34d1dbf74
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/qsgfocusscope.pro
@@ -0,0 +1,13 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qsgfocusscope.cpp
+macx:CONFIG -= app_bundle
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
diff --git a/tests/auto/declarative/qsgfocusscope/tst_qsgfocusscope.cpp b/tests/auto/declarative/qsgfocusscope/tst_qsgfocusscope.cpp
new file mode 100644
index 0000000000..c793ce91c5
--- /dev/null
+++ b/tests/auto/declarative/qsgfocusscope/tst_qsgfocusscope.cpp
@@ -0,0 +1,540 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QSignalSpy>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgrectangle_p.h>
+#include <private/qsgtextedit_p.h>
+#include <private/qsgtext_p.h>
+#include <QtDeclarative/private/qsgfocusscope_p.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsgfocusscope : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgfocusscope() {}
+
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &id);
+
+private slots:
+    void basic();
+    void nested();
+    void noFocus();
+    void textEdit();
+    void forceFocus();
+    void noParentFocus();
+    void signalEmission();
+    void qtBug13380();
+    void forceActiveFocus();
+};
+
+/*
+   Find an item with the specified id.
+*/
+template<typename T>
+T *tst_qsgfocusscope::findItem(QSGItem *parent, const QString &objectName)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    QList<QSGItem *> children = parent->childItems();
+    for (int i = 0; i < children.count(); ++i) {
+        QSGItem *item = children.at(i);
+        if (item) {
+            if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+                return static_cast<T*>(item);
+            }
+            item = findItem<T>(item, objectName);
+            if (item)
+                return static_cast<T*>(item);
+        }
+    }
+    return 0;
+}
+
+void tst_qsgfocusscope::basic()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test.qml"));
+
+    QSGFocusScope *item0 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item0"));
+    QSGRectangle *item1 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item1"));
+    QSGRectangle *item2 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item2"));
+    QSGRectangle *item3 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item3"));
+    QVERIFY(item0 != 0);
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Right);
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == true);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Down);
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == true);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::nested()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test2.qml"));
+
+    QSGFocusScope *item1 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item1"));
+    QSGFocusScope *item2 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item2"));
+    QSGFocusScope *item3 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item3"));
+    QSGFocusScope *item4 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item4"));
+    QSGFocusScope *item5 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item5"));
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+    QVERIFY(item4 != 0);
+    QVERIFY(item5 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == true);
+    QVERIFY(item3->hasActiveFocus() == true);
+    QVERIFY(item4->hasActiveFocus() == true);
+    QVERIFY(item5->hasActiveFocus() == true);
+    delete view;
+}
+
+void tst_qsgfocusscope::noFocus()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test4.qml"));
+
+    QSGRectangle *item0 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item0"));
+    QSGRectangle *item1 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item1"));
+    QSGRectangle *item2 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item2"));
+    QSGRectangle *item3 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item3"));
+    QVERIFY(item0 != 0);
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Right);
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Down);
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::textEdit()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test5.qml"));
+
+    QSGFocusScope *item0 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item0"));
+    QSGTextEdit *item1 = findItem<QSGTextEdit>(view->rootObject(), QLatin1String("item1"));
+    QSGRectangle *item2 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item2"));
+    QSGTextEdit *item3 = findItem<QSGTextEdit>(view->rootObject(), QLatin1String("item3"));
+    QVERIFY(item0 != 0);
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Right);
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Right);
+    QTest::keyClick(view, Qt::Key_Right);
+    QTest::keyClick(view, Qt::Key_Right);
+    QTest::keyClick(view, Qt::Key_Right);
+    QTest::keyClick(view, Qt::Key_Right);
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == true);
+    QVERIFY(item3->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_Down);
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == true);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::forceFocus()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/forcefocus.qml"));
+
+    QSGFocusScope *item0 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item0"));
+    QSGRectangle *item1 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item1"));
+    QSGRectangle *item2 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item2"));
+    QSGFocusScope *item3 = findItem<QSGFocusScope>(view->rootObject(), QLatin1String("item3"));
+    QSGRectangle *item4 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item4"));
+    QSGRectangle *item5 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item5"));
+    QVERIFY(item0 != 0);
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+    QVERIFY(item4 != 0);
+    QVERIFY(item5 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+    QVERIFY(item4->hasActiveFocus() == false);
+    QVERIFY(item5->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_4);
+    QVERIFY(item0->hasActiveFocus() == true);
+    QVERIFY(item1->hasActiveFocus() == true);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == false);
+    QVERIFY(item4->hasActiveFocus() == false);
+    QVERIFY(item5->hasActiveFocus() == false);
+
+    QTest::keyClick(view, Qt::Key_5);
+    QVERIFY(item0->hasActiveFocus() == false);
+    QVERIFY(item1->hasActiveFocus() == false);
+    QVERIFY(item2->hasActiveFocus() == false);
+    QVERIFY(item3->hasActiveFocus() == true);
+    QVERIFY(item4->hasActiveFocus() == false);
+    QVERIFY(item5->hasActiveFocus() == true);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::noParentFocus()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/chain.qml"));
+    QVERIFY(view->rootObject());
+
+    QVERIFY(view->rootObject()->property("focus1") == false);
+    QVERIFY(view->rootObject()->property("focus2") == false);
+    QVERIFY(view->rootObject()->property("focus3") == true);
+    QVERIFY(view->rootObject()->property("focus4") == true);
+    QVERIFY(view->rootObject()->property("focus5") == true);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::signalEmission()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/signalEmission.qml"));
+
+    QSGRectangle *item1 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item1"));
+    QSGRectangle *item2 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item2"));
+    QSGRectangle *item3 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item3"));
+    QSGRectangle *item4 = findItem<QSGRectangle>(view->rootObject(), QLatin1String("item4"));
+    QVERIFY(item1 != 0);
+    QVERIFY(item2 != 0);
+    QVERIFY(item3 != 0);
+    QVERIFY(item4 != 0);
+
+    view->show();
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVariant blue(QColor("blue"));
+    QVariant red(QColor("red"));
+
+    QVERIFY(view->hasFocus());
+    item1->setFocus(true);
+    QCOMPARE(item1->property("color"), red);
+    QCOMPARE(item2->property("color"), blue);
+    QCOMPARE(item3->property("color"), blue);
+    QCOMPARE(item4->property("color"), blue);
+
+    item2->setFocus(true);
+    QCOMPARE(item1->property("color"), blue);
+    QCOMPARE(item2->property("color"), red);
+    QCOMPARE(item3->property("color"), blue);
+    QCOMPARE(item4->property("color"), blue);
+
+    item3->setFocus(true);
+    QCOMPARE(item1->property("color"), blue);
+    QCOMPARE(item2->property("color"), red);
+    QCOMPARE(item3->property("color"), red);
+    QCOMPARE(item4->property("color"), blue);
+
+    item4->setFocus(true);
+    QCOMPARE(item1->property("color"), blue);
+    QCOMPARE(item2->property("color"), red);
+    QCOMPARE(item3->property("color"), blue);
+    QCOMPARE(item4->property("color"), red);
+
+    item4->setFocus(false);
+    QCOMPARE(item1->property("color"), blue);
+    QCOMPARE(item2->property("color"), red);
+    QCOMPARE(item3->property("color"), blue);
+    QCOMPARE(item4->property("color"), blue);
+
+    delete view;
+}
+
+void tst_qsgfocusscope::qtBug13380()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtBug13380.qml"));
+
+    view->show();
+    QVERIFY(view->rootObject());
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(view->rootObject()->property("noFocus").toBool());
+
+    view->rootObject()->setProperty("showRect", true);
+    QVERIFY(view->rootObject()->property("noFocus").toBool());
+
+    delete view;
+}
+
+void tst_qsgfocusscope::forceActiveFocus()
+{
+    QSGView *view = new QSGView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/forceActiveFocus.qml"));
+
+    QSGItem *rootObject = view->rootObject();
+    QVERIFY(rootObject);
+
+    QSGItem *scope = findItem<QSGItem>(rootObject, QLatin1String("scope"));
+    QSGItem *itemA1 = findItem<QSGItem>(rootObject, QLatin1String("item-a1"));
+    QSGItem *scopeA = findItem<QSGItem>(rootObject, QLatin1String("scope-a"));
+    QSGItem *itemA2 = findItem<QSGItem>(rootObject, QLatin1String("item-a2"));
+    QSGItem *itemB1 = findItem<QSGItem>(rootObject, QLatin1String("item-b1"));
+    QSGItem *scopeB = findItem<QSGItem>(rootObject, QLatin1String("scope-b"));
+    QSGItem *itemB2 = findItem<QSGItem>(rootObject, QLatin1String("item-b2"));
+
+    QVERIFY(scope);
+    QVERIFY(itemA1);
+    QVERIFY(scopeA);
+    QVERIFY(itemA2);
+    QVERIFY(itemB1);
+    QVERIFY(scopeB);
+    QVERIFY(itemB2);
+
+    QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool)));
+    QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool)));
+    QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool)));
+    QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool)));
+
+    // First, walk the focus from item-a1 down to item-a2 and back again
+    itemA1->forceActiveFocus();
+    QVERIFY(itemA1->hasActiveFocus());
+    QVERIFY(!rootObject->hasActiveFocus());
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    scopeA->forceActiveFocus();
+    QVERIFY(!itemA1->hasActiveFocus());
+    QVERIFY(scopeA->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 1);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    itemA2->forceActiveFocus();
+    QVERIFY(!itemA1->hasActiveFocus());
+    QVERIFY(itemA2->hasActiveFocus());
+    QVERIFY(scopeA->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 1);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    scopeA->forceActiveFocus();
+    QVERIFY(!itemA1->hasActiveFocus());
+    QVERIFY(itemA2->hasActiveFocus());
+    QVERIFY(scopeA->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 1);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    itemA1->forceActiveFocus();
+    QVERIFY(itemA1->hasActiveFocus());
+    QVERIFY(!scopeA->hasActiveFocus());
+    QVERIFY(!itemA2->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 2);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    // Then jump back and forth between branch 'a' and 'b'
+    itemB1->forceActiveFocus();
+    QVERIFY(itemB1->hasActiveFocus());
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    scopeA->forceActiveFocus();
+    QVERIFY(!itemA1->hasActiveFocus());
+    QVERIFY(!itemB1->hasActiveFocus());
+    QVERIFY(scopeA->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 3);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    scopeB->forceActiveFocus();
+    QVERIFY(!scopeA->hasActiveFocus());
+    QVERIFY(!itemB1->hasActiveFocus());
+    QVERIFY(scopeB->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 4);
+    QCOMPARE(scopeBSpy.count(), 1);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    itemA2->forceActiveFocus();
+    QVERIFY(!scopeB->hasActiveFocus());
+    QVERIFY(itemA2->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 5);
+    QCOMPARE(scopeBSpy.count(), 2);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    itemB2->forceActiveFocus();
+    QVERIFY(!itemA2->hasActiveFocus());
+    QVERIFY(itemB2->hasActiveFocus());
+    QCOMPARE(scopeASpy.count(), 6);
+    QCOMPARE(scopeBSpy.count(), 3);
+    QCOMPARE(rootSpy.count(), 0);
+    QCOMPARE(scopeSpy.count(), 1);
+
+    delete view;
+}
+
+QTEST_MAIN(tst_qsgfocusscope)
+
+#include "tst_qsgfocusscope.moc"
diff --git a/tests/auto/declarative/qsggridview/data/attachedSignals.qml b/tests/auto/declarative/qsggridview/data/attachedSignals.qml
new file mode 100644
index 0000000000..73c10d8caf
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/attachedSignals.qml
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+
+GridView {
+    id: view
+    width: 240; height: 320
+
+    property variant addedDelegates: []
+    property int removedDelegateCount
+
+    model: testModel
+
+    cellWidth: delegateWidth; cellHeight: delegateHeight
+
+    delegate: Rectangle {
+        width: delegateWidth; height: delegateHeight
+        border.width: 1
+        GridView.onAdd: {
+            var obj = GridView.view.addedDelegates
+            obj.push(model.name)
+            GridView.view.addedDelegates = obj
+        }
+        GridView.onRemove: {
+            view.removedDelegateCount += 1
+        }
+    }
+}
+
diff --git a/tests/auto/declarative/qsggridview/data/displaygrid.qml b/tests/auto/declarative/qsggridview/data/displaygrid.qml
new file mode 100644
index 0000000000..1da4fe50ac
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/displaygrid.qml
@@ -0,0 +1,39 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                width: 80
+                height: 60
+                border.color: "blue"
+                Text {
+                    text: index
+                }
+                Text {
+                    y: 20
+                    id: displayText
+                    objectName: "displayText"
+                    text: display
+                }
+                color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        }
+    ]
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        cellWidth: 80
+        cellHeight: 60
+        model: testModel
+        delegate: myDelegate
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/footer.qml b/tests/auto/declarative/qsggridview/data/footer.qml
new file mode 100644
index 0000000000..b0d1117287
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/footer.qml
@@ -0,0 +1,40 @@
+import QtQuick 2.0
+
+Rectangle {
+    function changeFooter() {
+        grid.footer = footer2
+    }
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            width: 80
+            height: 60
+            border.color: "blue"
+            Text {
+                text: index
+            }
+            color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+        }
+    }
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        cellWidth: 80
+        cellHeight: 60
+        model: testModel
+        delegate: myDelegate
+        footer: Text { objectName: "footer"; text: "Footer"; height: 30 }
+    }
+
+    Component {
+        id: footer2
+        Text { objectName: "footer2"; text: "Footer 2"; height: 20 }
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview-enforcerange.qml b/tests/auto/declarative/qsggridview/data/gridview-enforcerange.qml
new file mode 100644
index 0000000000..2bfe7da78e
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview-enforcerange.qml
@@ -0,0 +1,58 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Item {
+            id: wrapper
+            objectName: "wrapper"
+            height: 100
+            width: 100
+            Text {
+                text: index
+            }
+            Text {
+                y: 25
+                id: textName
+                objectName: "textName"
+                text: name
+            }
+            Text {
+                y: 50
+                id: textNumber
+                objectName: "textNumber"
+                text: number
+            }
+            Text {
+                y: 75
+                text: wrapper.y
+            }
+        }
+    }
+
+    Component {
+        id: myHighlight
+        Rectangle {
+            color: "lightsteelblue"
+        }
+    }
+        
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        highlight: myHighlight
+        flow: (testTopToBottom == true) ? GridView.TopToBottom : GridView.LeftToRight
+        layoutDirection: (testRightToLeft == true) ? Qt.RightToLeft : Qt.LeftToRight
+        preferredHighlightBegin: 100
+        preferredHighlightEnd: 100
+        highlightRangeMode: "StrictlyEnforceRange"
+        focus: true
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview-initCurrent.qml b/tests/auto/declarative/qsggridview/data/gridview-initCurrent.qml
new file mode 100644
index 0000000000..c012b4c481
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview-initCurrent.qml
@@ -0,0 +1,52 @@
+import QtQuick 2.0
+
+Rectangle {
+    property int current: grid.currentIndex
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                width: 80
+                height: 60
+                border.color: "blue"
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 40
+                    text: wrapper.x + ", " + wrapper.y
+                }
+                Text {
+                    y: 20
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    y: 40
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        }
+    ]
+    GridView {
+        id: grid
+        objectName: "grid"
+        focus: true
+        width: 240
+        height: 320
+        currentIndex: 35
+        cellWidth: 80
+        cellHeight: 60
+        delegate: myDelegate
+        model: testModel
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview-noCurrent.qml b/tests/auto/declarative/qsggridview/data/gridview-noCurrent.qml
new file mode 100644
index 0000000000..600716e2d4
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview-noCurrent.qml
@@ -0,0 +1,52 @@
+import QtQuick 2.0
+
+Rectangle {
+    property int current: grid.currentIndex
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                width: 80
+                height: 60
+                border.color: "blue"
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 40
+                    text: wrapper.x + ", " + wrapper.y
+                }
+                Text {
+                    y: 20
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    y: 40
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        }
+    ]
+    GridView {
+        id: grid
+        objectName: "grid"
+        focus: true
+        width: 240
+        height: 320
+        currentIndex: -1
+        cellWidth: 80
+        cellHeight: 60
+        delegate: myDelegate
+        model: testModel
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview1.qml b/tests/auto/declarative/qsggridview/data/gridview1.qml
new file mode 100644
index 0000000000..816fa5f2d1
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview1.qml
@@ -0,0 +1,65 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    property bool showHeader: false
+    property bool showFooter: false
+    property int added: -1
+    property variant removed
+
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                width: 80
+                height: 60
+                border.color: "blue"
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 40
+                    text: wrapper.x + ", " + wrapper.y
+                }
+                Text {
+                    y: 20
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    y: 40
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+                GridView.onAdd: root.added = index
+                GridView.onRemove: root.removed = name
+            }
+        },
+        Component {
+            id: headerFooter
+            Rectangle { width: 30; height: 320; color: "blue" }
+        }
+    ]
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        cellWidth: 80
+        cellHeight: 60
+        flow: (testTopToBottom == false) ? GridView.LeftToRight : GridView.TopToBottom
+        layoutDirection: (testRightToLeft == true) ? Qt.RightToLeft : Qt.LeftToRight
+        model: testModel
+        delegate: myDelegate
+        header: root.showHeader ? headerFooter : null
+        footer: root.showFooter ? headerFooter : null
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview2.qml b/tests/auto/declarative/qsggridview/data/gridview2.qml
new file mode 100644
index 0000000000..5fb45a1613
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview2.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.0
+
+GridView {
+    anchors.fill: parent
+    width: 320; height: 200
+    cellWidth: 100; cellHeight: 100; cacheBuffer: 200; focus: true
+    keyNavigationWraps: true; highlightFollowsCurrentItem: false
+
+    model: ListModel {
+        id: appModel
+        ListElement { lColor: "red" }
+        ListElement { lColor: "yellow" }
+        ListElement { lColor: "green" }
+        ListElement { lColor: "blue" }
+    }
+
+    delegate: Item {
+        width: 100; height: 100
+        Rectangle {
+            color: lColor; x: 4; y: 4
+            width: 92; height: 92
+        }
+    }
+
+    highlight: Rectangle { width: 100; height: 100; color: "black" }
+}
diff --git a/tests/auto/declarative/qsggridview/data/gridview3.qml b/tests/auto/declarative/qsggridview/data/gridview3.qml
new file mode 100644
index 0000000000..a8c1c5a0f7
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/gridview3.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+GridView {
+    anchors.fill: parent
+    width: 320; height: 200
+}
diff --git a/tests/auto/declarative/qsggridview/data/header.qml b/tests/auto/declarative/qsggridview/data/header.qml
new file mode 100644
index 0000000000..f725b683a2
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/header.qml
@@ -0,0 +1,40 @@
+import QtQuick 2.0
+
+Rectangle {
+    function changeHeader() {
+        grid.header = header2
+    }
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            width: 80
+            height: 60
+            border.color: "blue"
+            Text {
+                text: index
+            }
+            color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+        }
+    }
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        cellWidth: 80
+        cellHeight: 60
+        model: testModel
+        delegate: myDelegate
+        header: Text { objectName: "header"; text: "Header"; height: 30 }
+    }
+
+    Component {
+        id: header2
+        Text { objectName: "header2"; text: "Header 2"; height: 20 }
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/manual-highlight.qml b/tests/auto/declarative/qsggridview/data/manual-highlight.qml
new file mode 100644
index 0000000000..c2f1d20fb1
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/manual-highlight.qml
@@ -0,0 +1,48 @@
+import QtQuick 2.0
+
+Item {
+
+    ListModel {
+        id: model
+        ListElement {
+            name: "Bill Smith"
+            number: "555 3264"
+        }
+        ListElement {
+            name: "John Brown"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Sam Wise"
+            number: "555 0473"
+        }
+        ListElement {
+            name: "Bob Brown"
+            number: "555 5845"
+        }
+    }
+
+    Component {
+        id: highlight
+        Rectangle {
+            objectName: "highlight"
+            width: 80; height: 80
+            color: "lightsteelblue"; radius: 5
+            y: grid.currentItem.y+5
+            x: grid.currentItem.x+5
+        }
+    }
+
+    GridView {
+        id: grid
+        objectName: "grid"
+        anchors.fill: parent
+        model: model
+        delegate: Text { objectName: "wrapper"; text: name; width: 80; height: 80 }
+
+        highlight: highlight
+        highlightFollowsCurrentItem: false
+        focus: true
+    }
+
+}
diff --git a/tests/auto/declarative/qsggridview/data/mirroring.qml b/tests/auto/declarative/qsggridview/data/mirroring.qml
new file mode 100644
index 0000000000..b9aff501c1
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/mirroring.qml
@@ -0,0 +1,43 @@
+// This example demonstrates how item positioning
+// changes in right-to-left layout direction
+
+import QtQuick 2.0
+
+Rectangle {
+    color: "lightgray"
+    width: 340
+    height: 370
+
+    VisualItemModel {
+        id: itemModel
+        objectName: "itemModel"
+        Rectangle {
+            objectName: "item1"
+            height: 110; width: 120; color: "#FFFEF0"
+            Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item2"
+            height: 130; width: 150; color: "#F0FFF7"
+            Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item3"
+            height: 170; width: 190; color: "#F4F0FF"
+            Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+    }
+
+    GridView {
+        id: view
+        objectName: "view"
+        cellWidth: 190
+        cellHeight: 170
+        anchors.fill: parent
+        anchors.bottomMargin: 30
+        model: itemModel
+        highlightRangeMode: "StrictlyEnforceRange"
+        flow: GridView.TopToBottom
+        flickDeceleration: 2000
+    }
+}
diff --git a/tests/auto/declarative/qsggridview/data/propertychangestest.qml b/tests/auto/declarative/qsggridview/data/propertychangestest.qml
new file mode 100644
index 0000000000..97efbe78f5
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/propertychangestest.qml
@@ -0,0 +1,69 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 360; height: 120; color: "white"
+    Component {
+        id: delegate
+        Item {
+            id: wrapper
+            width: 180; height: 40; 
+            Column {
+                x: 5; y: 5
+                Text { text: '<b>Name:</b> ' + name }
+                Text { text: '<b>Number:</b> ' + number }
+            }
+        }
+    }
+    Component {
+        id: highlightRed
+        Rectangle {
+            color: "red"
+            radius: 10
+            opacity: 0.5
+        }
+    }
+    GridView {
+        cellWidth:180
+        cellHeight:40
+        objectName: "gridView"
+        anchors.fill: parent
+        model: listModel
+        delegate: delegate
+        highlight: highlightRed
+        focus: true
+        keyNavigationWraps: true
+        cacheBuffer: 10
+        flow: GridView.LeftToRight
+    }
+
+    data:[  
+        ListModel {
+            id: listModel
+            ListElement {
+                name: "Bill Smith"
+                number: "555 3264"
+            }
+            ListElement {
+                name: "John Brown"
+                number: "555 8426"
+            }
+            ListElement {
+               name: "Sam Wise"
+                number: "555 0473"
+            }
+        },
+        ListModel {
+            objectName: "alternateModel"
+            ListElement {
+                name: "Jack"
+                number: "555 8426"
+            }
+            ListElement {
+                name: "Mary"
+                number: "555 3264"
+            }
+        }
+    ]
+}
+ 
+ 
diff --git a/tests/auto/declarative/qsggridview/data/setindex.qml b/tests/auto/declarative/qsggridview/data/setindex.qml
new file mode 100644
index 0000000000..ef80f3a2fb
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/data/setindex.qml
@@ -0,0 +1,29 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 200
+    height: 200
+    Component {
+        id: appDelegate
+
+        Item {
+            id : wrapper
+             function startupFunction() {
+                 if (index == 5) view.currentIndex = index;
+             }
+            Component.onCompleted: startupFunction();
+            width: 30; height: 30
+            Text { text: index }
+        }
+    }
+
+    GridView {
+        id: view
+        objectName: "grid"
+        anchors.fill: parent
+        cellWidth: 30; cellHeight: 30
+        model: 35
+        delegate: appDelegate
+        focus: true
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro b/tests/auto/declarative/qsggridview/qsggridview.pro
similarity index 88%
rename from tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro
rename to tests/auto/declarative/qsggridview/qsggridview.pro
index 8ac69aac67..d76983c24a 100644
--- a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro
+++ b/tests/auto/declarative/qsggridview/qsggridview.pro
@@ -2,7 +2,7 @@ load(qttest_p4)
 contains(QT_CONFIG,declarative): QT += declarative
 macx:CONFIG -= app_bundle
 
-SOURCES += tst_qdeclarativedom.cpp
+SOURCES += tst_qsggridview.cpp
 
 symbian: {
     importFiles.files = data
diff --git a/tests/auto/declarative/qsggridview/tst_qsggridview.cpp b/tests/auto/declarative/qsggridview/tst_qsggridview.cpp
new file mode 100644
index 0000000000..931ae7ee49
--- /dev/null
+++ b/tests/auto/declarative/qsggridview/tst_qsggridview.cpp
@@ -0,0 +1,2171 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/qstringlistmodel.h>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/private/qsgitem_p.h>
+#include <QtDeclarative/private/qlistmodelinterface_p.h>
+#include <QtDeclarative/private/qsggridview_p.h>
+#include <QtDeclarative/private/qsgtext_p.h>
+#include <QtDeclarative/private/qdeclarativelistmodel_p.h>
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QSGGridView : public QObject
+{
+    Q_OBJECT
+public:
+    tst_QSGGridView();
+
+private slots:
+    void items();
+    void changed();
+    void inserted();
+    void removed();
+    void clear();
+    void moved();
+    void changeFlow();
+    void currentIndex();
+    void noCurrentIndex();
+    void defaultValues();
+    void properties();
+    void propertyChanges();
+    void componentChanges();
+    void modelChanges();
+    void positionViewAtIndex();
+    void positionViewAtIndex_rightToLeft();
+    void mirroring();
+    void snapping();
+    void resetModel();
+    void enforceRange();
+    void enforceRange_rightToLeft();
+    void QTBUG_8456();
+    void manualHighlight();
+    void footer();
+    void header();
+    void indexAt();
+    void onAdd();
+    void onAdd_data();
+    void onRemove();
+    void onRemove_data();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+private:
+    QSGView *createView();
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &id, int index=-1);
+    template<typename T>
+    QList<T*> findItems(QSGItem *parent, const QString &objectName);
+    void dumpTree(QSGItem *parent, int depth = 0);
+};
+
+class TestModel : public QAbstractListModel
+{
+public:
+    enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
+
+    TestModel(QObject *parent=0) : QAbstractListModel(parent) {
+        QHash<int, QByteArray> roles;
+        roles[Name] = "name";
+        roles[Number] = "number";
+        setRoleNames(roles);
+    }
+
+    int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); }
+    QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
+        QVariant rv;
+        if (role == Name)
+            rv = list.at(index.row()).first;
+        else if (role == Number)
+            rv = list.at(index.row()).second;
+
+        return rv;
+    }
+
+    int count() const { return rowCount(); }
+    QString name(int index) const { return list.at(index).first; }
+    QString number(int index) const { return list.at(index).second; }
+
+    void addItem(const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), list.count(), list.count());
+        list.append(QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void addItems(const QList<QPair<QString, QString> > &items) {
+        emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1);
+        for (int i=0; i<items.count(); i++)
+            list.append(QPair<QString,QString>(items[i].first, items[i].second));
+        emit endInsertRows();
+    }
+
+    void insertItem(int index, const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), index, index);
+        list.insert(index, QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void removeItem(int index) {
+        emit beginRemoveRows(QModelIndex(), index, index);
+        list.removeAt(index);
+        emit endRemoveRows();
+    }
+
+    void removeItems(int index, int count) {
+        emit beginRemoveRows(QModelIndex(), index, index+count-1);
+        while (count--)
+            list.removeAt(index);
+        emit endRemoveRows();
+    }
+
+    void moveItem(int from, int to) {
+        emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
+        list.move(from, to);
+        emit endMoveRows();
+    }
+
+    void modifyItem(int idx, const QString &name, const QString &number) {
+        list[idx] = QPair<QString,QString>(name, number);
+        emit dataChanged(index(idx,0), index(idx,0));
+    }
+
+    void clear() {
+        int count = list.count();
+        emit beginRemoveRows(QModelIndex(), 0, count-1);
+        list.clear();
+        emit endRemoveRows();
+    }
+
+
+private:
+    QList<QPair<QString,QString> > list;
+};
+
+tst_QSGGridView::tst_QSGGridView()
+{
+}
+
+void tst_QSGGridView::items()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Billy", "22345");
+    model.addItem("Sam", "2945");
+    model.addItem("Ben", "04321");
+    model.addItem("Jim", "0780");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(gridview->count(), model.count());
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    for (int i = 0; i < model.count(); ++i) {
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    // set an empty model and confirm that items are destroyed
+    TestModel model2;
+    ctxt->setContextProperty("testModel", &model2);
+
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    QTRY_VERIFY(itemCount == 0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::changed()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Billy", "22345");
+    model.addItem("Sam", "2945");
+    model.addItem("Ben", "04321");
+    model.addItem("Jim", "0780");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGFlickable *gridview = findItem<QSGFlickable>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.modifyItem(1, "Will", "9876");
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    delete canvas;
+}
+
+void tst_QSGGridView::inserted()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    TestModel model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.insertItem(1, "Will", "9876");
+
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    // Checks that onAdd is called
+    int added = canvas->rootObject()->property("added").toInt();
+    QTRY_COMPARE(added, 1);
+
+    // Confirm items positioned correctly
+    for (int i = 0; i < model.count(); ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_COMPARE(item->x(), (i%3)*80.0);
+        QTRY_COMPARE(item->y(), (i/3)*60.0);
+    }
+
+    model.insertItem(0, "Foo", "1111"); // zero index, and current item
+
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    QTRY_COMPARE(gridview->currentIndex(), 1);
+
+    // Confirm items positioned correctly
+    for (int i = 0; i < model.count(); ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    for (int i = model.count(); i < 30; ++i)
+        model.insertItem(i, "Hello", QString::number(i));
+
+    gridview->setContentY(120);
+
+    // Insert item outside visible area
+    model.insertItem(1, "Hello", "1324");
+
+    QTRY_VERIFY(gridview->contentY() == 120);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::removed()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.removeItem(1);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    // Checks that onRemove is called
+    QString removed = canvas->rootObject()->property("removed").toString();
+    QTRY_COMPARE(removed, QString("Item1"));
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    // Remove first item (which is the current item);
+    model.removeItem(0);
+
+    name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    // Remove items not visible
+    model.removeItem(25);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    // Remove items before visible
+    gridview->setContentY(120);
+    gridview->setCurrentIndex(10);
+
+    // Setting currentIndex above shouldn't cause view to scroll
+    QTRY_COMPARE(gridview->contentY(), 120.0);
+
+    model.removeItem(1);
+
+    // Confirm items positioned correctly
+    for (int i = 6; i < 18; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    // Remove currentIndex
+    QSGItem *oldCurrent = gridview->currentItem();
+    model.removeItem(9);
+
+    QTRY_COMPARE(gridview->currentIndex(), 9);
+    QTRY_VERIFY(gridview->currentItem() != oldCurrent);
+
+    gridview->setContentY(0);
+    // let transitions settle.
+    QTest::qWait(100);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    // remove item outside current view.
+    gridview->setCurrentIndex(32);
+    gridview->setContentY(240);
+
+    model.removeItem(30);
+    QTRY_VERIFY(gridview->currentIndex() == 31);
+
+    // remove current item beyond visible items.
+    gridview->setCurrentIndex(20);
+    gridview->setContentY(0);
+    model.removeItem(20);
+
+    QTRY_COMPARE(gridview->currentIndex(), 20);
+    QTRY_VERIFY(gridview->currentItem() != 0);
+
+    // remove item before current, but visible
+    gridview->setCurrentIndex(8);
+    gridview->setContentY(240);
+    oldCurrent = gridview->currentItem();
+    model.removeItem(6);
+
+    QTRY_COMPARE(gridview->currentIndex(), 7);
+    QTRY_VERIFY(gridview->currentItem() == oldCurrent);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::clear()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QVERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    model.clear();
+
+    QVERIFY(gridview->count() == 0);
+    QVERIFY(gridview->currentItem() == 0);
+    QVERIFY(gridview->contentY() == 0);
+    QVERIFY(gridview->currentIndex() == -1);
+
+    // confirm sanity when adding an item to cleared list
+    model.addItem("New", "1");
+    QVERIFY(gridview->count() == 1);
+    QVERIFY(gridview->currentItem() != 0);
+    QVERIFY(gridview->currentIndex() == 0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::moved()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.moveItem(1, 8);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    name = findItem<QSGText>(contentItem, "textName", 8);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(8));
+    number = findItem<QSGText>(contentItem, "textNumber", 8);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(8));
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+    }
+
+    gridview->setContentY(120);
+
+    // move outside visible area
+    model.moveItem(1, 25);
+
+    // Confirm items positioned correctly and indexes correct
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count()-1;
+    for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal((i%3)*80));
+        QTRY_COMPARE(item->y(), qreal((i/3)*60));
+        name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    // move from outside visible into visible
+    model.moveItem(28, 8);
+
+    // Confirm items positioned correctly and indexes correct
+    for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->x() == (i%3)*80);
+        QTRY_VERIFY(item->y() == (i/3)*60);
+        name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    // ensure content position is stable
+    gridview->setContentY(0);
+    model.moveItem(10, 0);
+    QTRY_VERIFY(gridview->contentY() == 0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::currentIndex()
+{
+    TestModel model;
+    for (int i = 0; i < 60; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i));
+
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    QString filename(SRCDIR "/data/gridview-initCurrent.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QVERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    // current item should be third item
+    QCOMPARE(gridview->currentIndex(), 35);
+    QCOMPARE(gridview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 35));
+    QCOMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
+    QCOMPARE(gridview->contentY(), 400.0);
+
+    gridview->moveCurrentIndexRight();
+    QCOMPARE(gridview->currentIndex(), 36);
+    gridview->moveCurrentIndexDown();
+    QCOMPARE(gridview->currentIndex(), 39);
+    gridview->moveCurrentIndexUp();
+    QCOMPARE(gridview->currentIndex(), 36);
+    gridview->moveCurrentIndexLeft();
+    QCOMPARE(gridview->currentIndex(), 35);
+
+    // no wrap
+    gridview->setCurrentIndex(0);
+    QCOMPARE(gridview->currentIndex(), 0);
+    // confirm that the velocity is updated
+    QTRY_VERIFY(gridview->verticalVelocity() != 0.0);
+
+    gridview->moveCurrentIndexUp();
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    gridview->moveCurrentIndexLeft();
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    gridview->setCurrentIndex(model.count()-1);
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
+
+    gridview->moveCurrentIndexRight();
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
+
+    gridview->moveCurrentIndexDown();
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
+
+    // with wrap
+    gridview->setWrapEnabled(true);
+
+    gridview->setCurrentIndex(0);
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    gridview->moveCurrentIndexLeft();
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
+
+    QTRY_COMPARE(gridview->contentY(), 880.0);
+
+    gridview->moveCurrentIndexRight();
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    QTRY_COMPARE(gridview->contentY(), 0.0);
+
+    // Test keys
+    canvas->show();
+    qApp->setActiveWindow(canvas);
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(canvas);
+#endif
+    QTRY_VERIFY(canvas->hasFocus());
+    qApp->processEvents();
+
+    QTest::keyClick(canvas, Qt::Key_Down);
+    QCOMPARE(gridview->currentIndex(), 3);
+
+    QTest::keyClick(canvas, Qt::Key_Up);
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    gridview->setFlow(QSGGridView::TopToBottom);
+
+    qApp->setActiveWindow(canvas);
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(canvas);
+#endif
+    QTRY_VERIFY(canvas->hasFocus());
+    qApp->processEvents();
+
+    QTest::keyClick(canvas, Qt::Key_Right);
+    QCOMPARE(gridview->currentIndex(), 5);
+
+    QTest::keyClick(canvas, Qt::Key_Left);
+    QCOMPARE(gridview->currentIndex(), 0);
+
+    QTest::keyClick(canvas, Qt::Key_Down);
+    QCOMPARE(gridview->currentIndex(), 1);
+
+    QTest::keyClick(canvas, Qt::Key_Up);
+    QCOMPARE(gridview->currentIndex(), 0);
+
+
+    // turn off auto highlight
+    gridview->setHighlightFollowsCurrentItem(false);
+    QVERIFY(gridview->highlightFollowsCurrentItem() == false);
+    QVERIFY(gridview->highlightItem());
+    qreal hlPosX = gridview->highlightItem()->x();
+    qreal hlPosY = gridview->highlightItem()->y();
+
+    gridview->setCurrentIndex(5);
+    QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
+    QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY);
+
+    // insert item before currentIndex
+    gridview->setCurrentIndex(28);
+    model.insertItem(0, "Foo", "1111");
+    QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29);
+
+    // check removing highlight by setting currentIndex to -1;
+    gridview->setCurrentIndex(-1);
+
+    QCOMPARE(gridview->currentIndex(), -1);
+    QVERIFY(!gridview->highlightItem());
+    QVERIFY(!gridview->currentItem());
+
+    gridview->setHighlightFollowsCurrentItem(true);
+
+    gridview->setFlow(QSGGridView::LeftToRight);
+    gridview->setLayoutDirection(Qt::RightToLeft);
+
+    qApp->setActiveWindow(canvas);
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(canvas);
+#endif
+    QTRY_VERIFY(canvas->hasFocus());
+    qApp->processEvents();
+
+    gridview->setCurrentIndex(35);
+
+    QTest::keyClick(canvas, Qt::Key_Right);
+    QCOMPARE(gridview->currentIndex(), 34);
+
+    QTest::keyClick(canvas, Qt::Key_Down);
+    QCOMPARE(gridview->currentIndex(), 37);
+
+    QTest::keyClick(canvas, Qt::Key_Up);
+    QCOMPARE(gridview->currentIndex(), 34);
+
+    QTest::keyClick(canvas, Qt::Key_Left);
+    QCOMPARE(gridview->currentIndex(), 35);
+
+
+    // turn off auto highlight
+    gridview->setHighlightFollowsCurrentItem(false);
+    QVERIFY(gridview->highlightFollowsCurrentItem() == false);
+    QVERIFY(gridview->highlightItem());
+    hlPosX = gridview->highlightItem()->x();
+    hlPosY = gridview->highlightItem()->y();
+
+    gridview->setCurrentIndex(5);
+    QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
+    QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY);
+
+    // insert item before currentIndex
+    gridview->setCurrentIndex(28);
+    model.insertItem(0, "Foo", "1111");
+    QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29);
+
+    // check removing highlight by setting currentIndex to -1;
+    gridview->setCurrentIndex(-1);
+
+    QCOMPARE(gridview->currentIndex(), -1);
+    QVERIFY(!gridview->highlightItem());
+    QVERIFY(!gridview->currentItem());
+
+    delete canvas;
+}
+
+void tst_QSGGridView::noCurrentIndex()
+{
+    TestModel model;
+    for (int i = 0; i < 60; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i));
+
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    QString filename(SRCDIR "/data/gridview-noCurrent.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QVERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    // current index should be -1
+    QCOMPARE(gridview->currentIndex(), -1);
+    QVERIFY(!gridview->currentItem());
+    QVERIFY(!gridview->highlightItem());
+    QCOMPARE(gridview->contentY(), 0.0);
+
+    gridview->setCurrentIndex(5);
+    QCOMPARE(gridview->currentIndex(), 5);
+    QVERIFY(gridview->currentItem());
+    QVERIFY(gridview->highlightItem());
+
+    delete canvas;
+}
+
+void tst_QSGGridView::changeFlow()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i));
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly and indexes correct
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal((i%3)*80));
+        QTRY_COMPARE(item->y(), qreal((i/3)*60));
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    ctxt->setContextProperty("testTopToBottom", QVariant(true));
+
+    // Confirm items positioned correctly and indexes correct
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal((i/5)*80));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    ctxt->setContextProperty("testRightToLeft", QVariant(true));
+
+    // Confirm items positioned correctly and indexes correct
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80 - item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+    gridview->setContentX(100);
+    QTRY_COMPARE(gridview->contentX(), 100.);
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+    QTRY_COMPARE(gridview->contentX(), 0.);
+
+    // Confirm items positioned correctly and indexes correct
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(240 - (i%3+1)*80));
+        QTRY_COMPARE(item->y(), qreal((i/3)*60));
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    delete canvas;
+}
+
+void tst_QSGGridView::defaultValues()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview3.qml"));
+    QSGGridView *obj = qobject_cast<QSGGridView*>(c.create());
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->model() == QVariant());
+    QTRY_VERIFY(obj->delegate() == 0);
+    QTRY_COMPARE(obj->currentIndex(), -1);
+    QTRY_VERIFY(obj->currentItem() == 0);
+    QTRY_COMPARE(obj->count(), 0);
+    QTRY_VERIFY(obj->highlight() == 0);
+    QTRY_VERIFY(obj->highlightItem() == 0);
+    QTRY_COMPARE(obj->highlightFollowsCurrentItem(), true);
+    QTRY_VERIFY(obj->flow() == 0);
+    QTRY_COMPARE(obj->isWrapEnabled(), false);
+    QTRY_COMPARE(obj->cacheBuffer(), 0);
+    QTRY_COMPARE(obj->cellWidth(), 100); //### Should 100 be the default?
+    QTRY_COMPARE(obj->cellHeight(), 100);
+    delete obj;
+}
+
+void tst_QSGGridView::properties()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview2.qml"));
+    QSGGridView *obj = qobject_cast<QSGGridView*>(c.create());
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->model() != QVariant());
+    QTRY_VERIFY(obj->delegate() != 0);
+    QTRY_COMPARE(obj->currentIndex(), 0);
+    QTRY_VERIFY(obj->currentItem() != 0);
+    QTRY_COMPARE(obj->count(), 4);
+    QTRY_VERIFY(obj->highlight() != 0);
+    QTRY_VERIFY(obj->highlightItem() != 0);
+    QTRY_COMPARE(obj->highlightFollowsCurrentItem(), false);
+    QTRY_VERIFY(obj->flow() == 0);
+    QTRY_COMPARE(obj->isWrapEnabled(), true);
+    QTRY_COMPARE(obj->cacheBuffer(), 200);
+    QTRY_COMPARE(obj->cellWidth(), 100);
+    QTRY_COMPARE(obj->cellHeight(), 100);
+    delete obj;
+}
+
+void tst_QSGGridView::propertyChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGGridView *gridView = canvas->rootObject()->findChild<QSGGridView*>("gridView");
+    QTRY_VERIFY(gridView);
+
+    QSignalSpy keyNavigationWrapsSpy(gridView, SIGNAL(keyNavigationWrapsChanged()));
+    QSignalSpy cacheBufferSpy(gridView, SIGNAL(cacheBufferChanged()));
+    QSignalSpy layoutSpy(gridView, SIGNAL(layoutDirectionChanged()));
+    QSignalSpy flowSpy(gridView, SIGNAL(flowChanged()));
+
+    QTRY_COMPARE(gridView->isWrapEnabled(), true);
+    QTRY_COMPARE(gridView->cacheBuffer(), 10);
+    QTRY_COMPARE(gridView->flow(), QSGGridView::LeftToRight);
+
+    gridView->setWrapEnabled(false);
+    gridView->setCacheBuffer(3);
+    gridView->setFlow(QSGGridView::TopToBottom);
+
+    QTRY_COMPARE(gridView->isWrapEnabled(), false);
+    QTRY_COMPARE(gridView->cacheBuffer(), 3);
+    QTRY_COMPARE(gridView->flow(), QSGGridView::TopToBottom);
+
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
+    QTRY_COMPARE(cacheBufferSpy.count(),1);
+    QTRY_COMPARE(flowSpy.count(),1);
+
+    gridView->setWrapEnabled(false);
+    gridView->setCacheBuffer(3);
+    gridView->setFlow(QSGGridView::TopToBottom);
+
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
+    QTRY_COMPARE(cacheBufferSpy.count(),1);
+    QTRY_COMPARE(flowSpy.count(),1);
+
+    gridView->setFlow(QSGGridView::LeftToRight);
+    QTRY_COMPARE(gridView->flow(), QSGGridView::LeftToRight);
+
+    gridView->setWrapEnabled(true);
+    gridView->setCacheBuffer(5);
+    gridView->setLayoutDirection(Qt::RightToLeft);
+
+    QTRY_COMPARE(gridView->isWrapEnabled(), true);
+    QTRY_COMPARE(gridView->cacheBuffer(), 5);
+    QTRY_COMPARE(gridView->layoutDirection(), Qt::RightToLeft);
+
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),2);
+    QTRY_COMPARE(cacheBufferSpy.count(),2);
+    QTRY_COMPARE(layoutSpy.count(),1);
+    QTRY_COMPARE(flowSpy.count(),2);
+
+    gridView->setWrapEnabled(true);
+    gridView->setCacheBuffer(5);
+    gridView->setLayoutDirection(Qt::RightToLeft);
+
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),2);
+    QTRY_COMPARE(cacheBufferSpy.count(),2);
+    QTRY_COMPARE(layoutSpy.count(),1);
+    QTRY_COMPARE(flowSpy.count(),2);
+
+    gridView->setFlow(QSGGridView::TopToBottom);
+    QTRY_COMPARE(gridView->flow(), QSGGridView::TopToBottom);
+    QTRY_COMPARE(flowSpy.count(),3);
+
+    gridView->setFlow(QSGGridView::TopToBottom);
+    QTRY_COMPARE(flowSpy.count(),3);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::componentChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGGridView *gridView = canvas->rootObject()->findChild<QSGGridView*>("gridView");
+    QTRY_VERIFY(gridView);
+
+    QDeclarativeComponent component(canvas->engine());
+    component.setData("import QtQuick 1.0; Rectangle { color: \"blue\"; }", QUrl::fromLocalFile(""));
+
+    QDeclarativeComponent delegateComponent(canvas->engine());
+    delegateComponent.setData("import QtQuick 1.0; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
+
+    QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged()));
+    QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged()));
+    QSignalSpy headerSpy(gridView, SIGNAL(headerChanged()));
+    QSignalSpy footerSpy(gridView, SIGNAL(footerChanged()));
+
+    gridView->setHighlight(&component);
+    gridView->setDelegate(&delegateComponent);
+    gridView->setHeader(&component);
+    gridView->setFooter(&component);
+
+    QTRY_COMPARE(gridView->highlight(), &component);
+    QTRY_COMPARE(gridView->delegate(), &delegateComponent);
+    QTRY_COMPARE(gridView->header(), &component);
+    QTRY_COMPARE(gridView->footer(), &component);
+
+    QTRY_COMPARE(highlightSpy.count(),1);
+    QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
+
+    gridView->setHighlight(&component);
+    gridView->setDelegate(&delegateComponent);
+    gridView->setHeader(&component);
+    gridView->setFooter(&component);
+
+    QTRY_COMPARE(highlightSpy.count(),1);
+    QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::modelChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGGridView *gridView = canvas->rootObject()->findChild<QSGGridView*>("gridView");
+    QTRY_VERIFY(gridView);
+
+    QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild<QDeclarativeListModel*>("alternateModel");
+    QTRY_VERIFY(alternateModel);
+    QVariant modelVariant = QVariant::fromValue(alternateModel);
+    QSignalSpy modelSpy(gridView, SIGNAL(modelChanged()));
+
+    gridView->setModel(modelVariant);
+    QTRY_COMPARE(gridView->model(), modelVariant);
+    QTRY_COMPARE(modelSpy.count(),1);
+
+    gridView->setModel(modelVariant);
+    QTRY_COMPARE(modelSpy.count(),1);
+
+    gridView->setModel(QVariant());
+    QTRY_COMPARE(modelSpy.count(),2);
+    delete canvas;
+}
+
+void tst_QSGGridView::positionViewAtIndex()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i%3)*80.);
+        QTRY_COMPARE(item->y(), (i/3)*60.);
+    }
+
+    // Position on a currently visible item
+    gridview->positionViewAtIndex(4, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->indexAt(120, 90), 4);
+    QTRY_COMPARE(gridview->contentY(), 60.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i%3)*80.);
+        QTRY_COMPARE(item->y(), (i/3)*60.);
+    }
+
+    // Position on an item beyond the visible items
+    gridview->positionViewAtIndex(21, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->indexAt(40, 450), 21);
+    QTRY_COMPARE(gridview->contentY(), 420.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i%3)*80.);
+        QTRY_COMPARE(item->y(), (i/3)*60.);
+    }
+
+    // Position on an item that would leave empty space if positioned at the top
+    gridview->positionViewAtIndex(31, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->indexAt(120, 630), 31);
+    QTRY_COMPARE(gridview->contentY(), 520.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i%3)*80.);
+        QTRY_COMPARE(item->y(), (i/3)*60.);
+    }
+
+    // Position at the beginning again
+    gridview->positionViewAtIndex(0, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->indexAt(0, 0), 0);
+    QTRY_COMPARE(gridview->indexAt(40, 30), 0);
+    QTRY_COMPARE(gridview->indexAt(80, 60), 4);
+    QTRY_COMPARE(gridview->contentY(), 0.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i%3)*80.);
+        QTRY_COMPARE(item->y(), (i/3)*60.);
+    }
+
+    // Position at End
+    gridview->positionViewAtIndex(30, QSGGridView::End);
+    QTRY_COMPARE(gridview->contentY(), 340.);
+
+    // Position in Center
+    gridview->positionViewAtIndex(15, QSGGridView::Center);
+    QTRY_COMPARE(gridview->contentY(), 170.);
+
+    // Ensure at least partially visible
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentY(), 170.);
+
+    gridview->setContentY(302);
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentY(), 302.);
+
+    gridview->setContentY(360);
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentY(), 300.);
+
+    gridview->setContentY(60);
+    gridview->positionViewAtIndex(20, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentY(), 60.);
+
+    gridview->setContentY(20);
+    gridview->positionViewAtIndex(20, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentY(), 100.);
+
+    // Ensure completely visible
+    gridview->setContentY(120);
+    gridview->positionViewAtIndex(20, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentY(), 120.);
+
+    gridview->setContentY(302);
+    gridview->positionViewAtIndex(15, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentY(), 300.);
+
+    gridview->setContentY(60);
+    gridview->positionViewAtIndex(20, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentY(), 100.);
+
+    // Test for Top To Bottom layout
+    ctxt->setContextProperty("testTopToBottom", QVariant(true));
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), (i/5)*80.);
+        QTRY_COMPARE(item->y(), (i%5)*60.);
+    }
+
+    // Position at End
+    gridview->positionViewAtIndex(30, QSGGridView::End);
+    QTRY_COMPARE(gridview->contentX(), 320.);
+    QTRY_COMPARE(gridview->contentY(), 0.);
+
+    // Position in Center
+    gridview->positionViewAtIndex(15, QSGGridView::Center);
+    QTRY_COMPARE(gridview->contentX(), 160.);
+
+    // Ensure at least partially visible
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), 160.);
+
+    gridview->setContentX(170);
+    gridview->positionViewAtIndex(25, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), 170.);
+
+    gridview->positionViewAtIndex(30, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), 320.);
+
+    gridview->setContentX(170);
+    gridview->positionViewAtIndex(25, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentX(), 240.);
+
+    // positionViewAtBeginning
+    gridview->positionViewAtBeginning();
+    QTRY_COMPARE(gridview->contentX(), 0.);
+
+    gridview->setContentX(80);
+    canvas->rootObject()->setProperty("showHeader", true);
+    gridview->positionViewAtBeginning();
+    QTRY_COMPARE(gridview->contentX(), -30.);
+
+    // positionViewAtEnd
+    gridview->positionViewAtEnd();
+    QTRY_COMPARE(gridview->contentX(), 430.);
+
+    gridview->setContentX(80);
+    canvas->rootObject()->setProperty("showFooter", true);
+    gridview->positionViewAtEnd();
+    QTRY_COMPARE(gridview->contentX(), 460.);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::snapping()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    gridview->setHeight(220);
+    QCOMPARE(gridview->height(), 220.);
+
+    gridview->positionViewAtIndex(12, QSGGridView::Visible);
+    QCOMPARE(gridview->contentY(), 80.);
+
+    gridview->setContentY(0);
+    QCOMPARE(gridview->contentY(), 0.);
+
+    gridview->setSnapMode(QSGGridView::SnapToRow);
+    QCOMPARE(gridview->snapMode(), QSGGridView::SnapToRow);
+
+    gridview->positionViewAtIndex(12, QSGGridView::Visible);
+    QCOMPARE(gridview->contentY(), 60.);
+
+    gridview->positionViewAtIndex(15, QSGGridView::End);
+    QCOMPARE(gridview->contentY(), 120.);
+
+    delete canvas;
+
+}
+
+void tst_QSGGridView::mirroring()
+{
+    QSGView *canvasA = createView();
+    canvasA->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml"));
+    QSGGridView *gridviewA = findItem<QSGGridView>(canvasA->rootObject(), "view");
+    QTRY_VERIFY(gridviewA != 0);
+
+    QSGView *canvasB = createView();
+    canvasB->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml"));
+    QSGGridView *gridviewB = findItem<QSGGridView>(canvasB->rootObject(), "view");
+    QTRY_VERIFY(gridviewA != 0);
+    qApp->processEvents();
+
+    QList<QString> objectNames;
+    objectNames << "item1" << "item2"; // << "item3"
+
+    gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
+    gridviewB->setProperty("layoutDirection", Qt::RightToLeft);
+    QCOMPARE(gridviewA->layoutDirection(), gridviewA->effectiveLayoutDirection());
+
+    // LTR != RTL
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(gridviewA, objectName)->x() != findItem<QSGItem>(gridviewB, objectName)->x());
+
+    gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
+    gridviewB->setProperty("layoutDirection", Qt::LeftToRight);
+
+    // LTR == LTR
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(gridviewA, objectName)->x(), findItem<QSGItem>(gridviewB, objectName)->x());
+
+    QVERIFY(gridviewB->layoutDirection() == gridviewB->effectiveLayoutDirection());
+    QSGItemPrivate::get(gridviewB)->setLayoutMirror(true);
+    QVERIFY(gridviewB->layoutDirection() != gridviewB->effectiveLayoutDirection());
+
+    // LTR != LTR+mirror
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(gridviewA, objectName)->x() != findItem<QSGItem>(gridviewB, objectName)->x());
+
+    gridviewA->setProperty("layoutDirection", Qt::RightToLeft);
+
+    // RTL == LTR+mirror
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(gridviewA, objectName)->x(), findItem<QSGItem>(gridviewB, objectName)->x());
+
+    gridviewB->setProperty("layoutDirection", Qt::RightToLeft);
+
+    // RTL != RTL+mirror
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(gridviewA, objectName)->x() != findItem<QSGItem>(gridviewB, objectName)->x());
+
+    gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
+
+    // LTR == RTL+mirror
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(gridviewA, objectName)->x(), findItem<QSGItem>(gridviewB, objectName)->x());
+
+    delete canvasA;
+    delete canvasB;
+}
+
+void tst_QSGGridView::positionViewAtIndex_rightToLeft()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testTopToBottom", QVariant(true));
+    ctxt->setContextProperty("testRightToLeft", QVariant(true));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+    }
+
+    // Position on a currently visible item
+    gridview->positionViewAtIndex(6, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->contentX(), -320.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+    }
+
+    // Position on an item beyond the visible items
+    gridview->positionViewAtIndex(21, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->contentX(), -560.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+    }
+
+    // Position on an item that would leave empty space if positioned at the top
+    gridview->positionViewAtIndex(31, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->contentX(), -639.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+    }
+
+    // Position at the beginning again
+    gridview->positionViewAtIndex(0, QSGGridView::Beginning);
+    QTRY_COMPARE(gridview->contentX(), -240.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
+        QTRY_COMPARE(item->y(), qreal((i%5)*60));
+    }
+
+    // Position at End
+    gridview->positionViewAtIndex(30, QSGGridView::End);
+    QTRY_COMPARE(gridview->contentX(), -560.);
+
+    // Position in Center
+    gridview->positionViewAtIndex(15, QSGGridView::Center);
+    QTRY_COMPARE(gridview->contentX(), -400.);
+
+    // Ensure at least partially visible
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), -400.);
+
+    gridview->setContentX(-555.);
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), -555.);
+
+    gridview->setContentX(-239);
+    gridview->positionViewAtIndex(15, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), -320.);
+
+    gridview->setContentX(-239);
+    gridview->positionViewAtIndex(20, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), -400.);
+
+    gridview->setContentX(-640);
+    gridview->positionViewAtIndex(20, QSGGridView::Visible);
+    QTRY_COMPARE(gridview->contentX(), -560.);
+
+    // Ensure completely visible
+    gridview->setContentX(-400);
+    gridview->positionViewAtIndex(20, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentX(), -400.);
+
+    gridview->setContentX(-315);
+    gridview->positionViewAtIndex(15, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentX(), -320.);
+
+    gridview->setContentX(-640);
+    gridview->positionViewAtIndex(20, QSGGridView::Contain);
+    QTRY_COMPARE(gridview->contentX(), -560.);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::resetModel()
+{
+    QSGView *canvas = createView();
+
+    QStringList strings;
+    strings << "one" << "two" << "three";
+    QStringListModel model(strings);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaygrid.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(gridview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(contentItem, "displayText", i);
+        QTRY_VERIFY(display != 0);
+        QTRY_COMPARE(display->text(), strings.at(i));
+    }
+
+    strings.clear();
+    strings << "four" << "five" << "six" << "seven";
+    model.setStringList(strings);
+
+    QTRY_COMPARE(gridview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(contentItem, "displayText", i);
+        QTRY_VERIFY(display != 0);
+        QTRY_COMPARE(display->text(), strings.at(i));
+    }
+
+    delete canvas;
+}
+
+void tst_QSGGridView::enforceRange()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml"));
+    qApp->processEvents();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
+    QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
+    QTRY_COMPARE(gridview->highlightRangeMode(), QSGGridView::StrictlyEnforceRange);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // view should be positioned at the top of the range.
+    QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", 0);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(gridview->contentY(), -100.0);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    // Check currentIndex is updated when contentItem moves
+    gridview->setContentY(0);
+    QTRY_COMPARE(gridview->currentIndex(), 2);
+
+    gridview->setCurrentIndex(5);
+    QTRY_COMPARE(gridview->contentY(), 100.);
+
+    TestModel model2;
+    for (int i = 0; i < 5; i++)
+        model2.addItem("Item" + QString::number(i), "");
+
+    ctxt->setContextProperty("testModel", &model2);
+    QCOMPARE(gridview->count(), 5);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::enforceRange_rightToLeft()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(true));
+    ctxt->setContextProperty("testTopToBottom", QVariant(true));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml"));
+    qApp->processEvents();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
+    QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
+    QTRY_COMPARE(gridview->highlightRangeMode(), QSGGridView::StrictlyEnforceRange);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // view should be positioned at the top of the range.
+    QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", 0);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(gridview->contentX(), -100.);
+    QTRY_COMPARE(gridview->contentY(), 0.0);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    // Check currentIndex is updated when contentItem moves
+    gridview->setContentX(-200);
+    QTRY_COMPARE(gridview->currentIndex(), 3);
+
+    gridview->setCurrentIndex(7);
+    QTRY_COMPARE(gridview->contentX(), -300.);
+    QTRY_COMPARE(gridview->contentY(), 0.0);
+
+    TestModel model2;
+    for (int i = 0; i < 5; i++)
+        model2.addItem("Item" + QString::number(i), "");
+
+    ctxt->setContextProperty("testModel", &model2);
+    QCOMPARE(gridview->count(), 5);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::QTBUG_8456()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/setindex.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QTRY_COMPARE(gridview->currentIndex(), 0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::manualHighlight()
+{
+    QSGView *canvas = createView();
+
+    QString filename(SRCDIR "/data/manual-highlight.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QTRY_COMPARE(gridview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 0));
+    QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+    QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+    gridview->setCurrentIndex(2);
+
+    QTRY_COMPARE(gridview->currentIndex(), 2);
+    QTRY_COMPARE(gridview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 2));
+    QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+    QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+    gridview->positionViewAtIndex(8, QSGGridView::Contain);
+
+    QTRY_COMPARE(gridview->currentIndex(), 2);
+    QTRY_COMPARE(gridview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 2));
+    QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+    QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+    gridview->setFlow(QSGGridView::TopToBottom);
+    QTRY_COMPARE(gridview->flow(), QSGGridView::TopToBottom);
+
+    gridview->setCurrentIndex(0);
+    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QTRY_COMPARE(gridview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 0));
+    QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+    QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+    delete canvas;
+}
+
+void tst_QSGGridView::footer()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    TestModel model;
+    for (int i = 0; i < 7; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QSGText *footer = findItem<QSGText>(contentItem, "footer");
+    QVERIFY(footer);
+
+    QCOMPARE(footer->y(), 180.0);
+    QCOMPARE(footer->height(), 30.0);
+
+    model.removeItem(2);
+    QTRY_COMPARE(footer->y(), 120.0);
+
+    model.clear();
+    QTRY_COMPARE(footer->y(), 0.0);
+
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
+
+    footer = findItem<QSGText>(contentItem, "footer");
+    QVERIFY(!footer);
+    footer = findItem<QSGText>(contentItem, "footer2");
+    QVERIFY(footer);
+
+    QCOMPARE(footer->y(), 600.0);
+    QCOMPARE(footer->height(), 20.0);
+    QCOMPARE(gridview->contentY(), 0.0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::header()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QSGText *header = findItem<QSGText>(contentItem, "header");
+    QVERIFY(header);
+
+    QCOMPARE(header->y(), 0.0);
+    QCOMPARE(header->height(), 30.0);
+    QCOMPARE(gridview->contentY(), 0.0);
+
+    QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->y(), 30.0);
+
+    model.clear();
+    QTRY_COMPARE(header->y(), 0.0);
+
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
+
+    header = findItem<QSGText>(contentItem, "header");
+    QVERIFY(!header);
+    header = findItem<QSGText>(contentItem, "header2");
+    QVERIFY(header);
+
+    QCOMPARE(header->y(), 10.0);
+    QCOMPARE(header->height(), 20.0);
+    QCOMPARE(gridview->contentY(), 10.0);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::indexAt()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Billy", "22345");
+    model.addItem("Sam", "2945");
+    model.addItem("Ben", "04321");
+    model.addItem("Jim", "0780");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testRightToLeft", QVariant(false));
+    ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+    qApp->processEvents();
+
+    QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QSGItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(gridview->count(), model.count());
+
+    QCOMPARE(gridview->indexAt(0, 0), 0);
+    QCOMPARE(gridview->indexAt(79, 59), 0);
+    QCOMPARE(gridview->indexAt(80, 0), 1);
+    QCOMPARE(gridview->indexAt(0, 60), 3);
+    QCOMPARE(gridview->indexAt(240, 0), -1);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::onAdd()
+{
+    QFETCH(int, initialItemCount);
+    QFETCH(int, itemsToAdd);
+
+    const int delegateWidth = 50;
+    const int delegateHeight = 100;
+    TestModel model;
+    QSGView *canvas = createView();
+    canvas->setFixedSize(5 * delegateWidth, 5 * delegateHeight); // just ensure all items fit
+
+    // these initial items should not trigger GridView.onAdd
+    for (int i=0; i<initialItemCount; i++)
+        model.addItem("dummy value", "dummy value");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("delegateWidth", delegateWidth);
+    ctxt->setContextProperty("delegateHeight", delegateHeight);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+
+    QObject *object = canvas->rootObject();
+    object->setProperty("width", canvas->width());
+    object->setProperty("height", canvas->height());
+    qApp->processEvents();
+
+    QList<QPair<QString, QString> > items;
+    for (int i=0; i<itemsToAdd; i++)
+        items << qMakePair(QString("value %1").arg(i), QString::number(i));
+    model.addItems(items);
+
+    qApp->processEvents();
+
+    QVariantList result = object->property("addedDelegates").toList();
+    QCOMPARE(result.count(), items.count());
+    for (int i=0; i<items.count(); i++)
+        QCOMPARE(result[i].toString(), items[i].first);
+
+    delete canvas;
+}
+
+void tst_QSGGridView::onAdd_data()
+{
+    QTest::addColumn<int>("initialItemCount");
+    QTest::addColumn<int>("itemsToAdd");
+
+    QTest::newRow("0, add 1") << 0 << 1;
+    QTest::newRow("0, add 2") << 0 << 2;
+    QTest::newRow("0, add 10") << 0 << 10;
+
+    QTest::newRow("1, add 1") << 1 << 1;
+    QTest::newRow("1, add 2") << 1 << 2;
+    QTest::newRow("1, add 10") << 1 << 10;
+
+    QTest::newRow("5, add 1") << 5 << 1;
+    QTest::newRow("5, add 2") << 5 << 2;
+    QTest::newRow("5, add 10") << 5 << 10;
+}
+
+void tst_QSGGridView::onRemove()
+{
+    QFETCH(int, initialItemCount);
+    QFETCH(int, indexToRemove);
+    QFETCH(int, removeCount);
+
+    const int delegateWidth = 50;
+    const int delegateHeight = 100;
+    TestModel model;
+    for (int i=0; i<initialItemCount; i++)
+        model.addItem(QString("value %1").arg(i), "dummy value");
+
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("delegateWidth", delegateWidth);
+    ctxt->setContextProperty("delegateHeight", delegateHeight);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+    QObject *object = canvas->rootObject();
+
+    qApp->processEvents();
+
+    model.removeItems(indexToRemove, removeCount);
+    qApp->processEvents();
+    QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount));
+
+    delete canvas;
+}
+
+void tst_QSGGridView::onRemove_data()
+{
+    QTest::addColumn<int>("initialItemCount");
+    QTest::addColumn<int>("indexToRemove");
+    QTest::addColumn<int>("removeCount");
+
+    QTest::newRow("remove first") << 1 << 0 << 1;
+    QTest::newRow("two items, remove first") << 2 << 0 << 1;
+    QTest::newRow("two items, remove last") << 2 << 1 << 1;
+    QTest::newRow("two items, remove all") << 2 << 0 << 2;
+
+    QTest::newRow("four items, remove first") << 4 << 0 << 1;
+    QTest::newRow("four items, remove 0-2") << 4 << 0 << 2;
+    QTest::newRow("four items, remove 1-3") << 4 << 1 << 2;
+    QTest::newRow("four items, remove 2-4") << 4 << 2 << 2;
+    QTest::newRow("four items, remove last") << 4 << 3 << 1;
+    QTest::newRow("four items, remove all") << 4 << 0 << 4;
+
+    QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8;
+    QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5;
+    QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6;
+}
+
+void tst_QSGGridView::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 1.1; GridView { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; GridView { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_QSGGridView::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtBeginning"
+        << "";
+
+    QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtEnd"
+        << "";
+}
+
+QSGView *tst_QSGGridView::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+/*
+   Find an item with the specified objectName.  If index is supplied then the
+   item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_QSGGridView::findItem(QSGItem *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item);
+                if (context) {
+                    if (context->contextProperty("index").toInt() == index) {
+                        return static_cast<T*>(item);
+                    }
+                }
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+template<typename T>
+QList<T*> tst_QSGGridView::findItems(QSGItem *parent, const QString &objectName)
+{
+    QList<T*> items;
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            items.append(static_cast<T*>(item));
+            //qDebug() << " found:" << item;
+        }
+        items += findItems<T>(item, objectName);
+    }
+
+    return items;
+}
+
+void tst_QSGGridView::dumpTree(QSGItem *parent, int depth)
+{
+    static QString padding("                       ");
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item);
+        qDebug() << padding.left(depth*2) << item << (context ? context->contextProperty("index").toInt() : -1);
+        dumpTree(item, depth+1);
+    }
+}
+
+
+QTEST_MAIN(tst_QSGGridView)
+
+#include "tst_qsggridview.moc"
diff --git a/tests/auto/declarative/qsgimage/data/aspectratio.qml b/tests/auto/declarative/qsgimage/data/aspectratio.qml
new file mode 100644
index 0000000000..b26f0e1f04
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/data/aspectratio.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Image { 
+    source: "heart.png"
+    fillMode: Image.PreserveAspectFit;
+}
diff --git a/tests/auto/declarative/qsgimage/data/big.jpeg b/tests/auto/declarative/qsgimage/data/big.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..bed7bd65c3e5f2cca13e367b7a02fe2721d7b622
GIT binary patch
literal 1700081
zcmeF)2|U#O{x|+XQK_VoQcOh=(UmMk43$(8iWD(PvV~;dRaaTEBt?-WDzZ(BJzLpY
z6j_UGL)l}pjcwd>o%6fz-~as1zx%q*IoCOz>)bCr=F#K9*UWrB->2_<miOoVp8YV}
zMp$xS@BY0678U}5h53&#+eFw+n8(h}!9I5$2M5Re`STVmT)t=_C+EUdOP6si=jS5|
z@bj%%vsOq#c<uVlf@{`@$Zp#F(^e@dDWdQWh3%3%CALXP{_-R&^XJcB$hmOkqD3nu
z*R5G6`8R*f77@7Ti4a5xY%J>utlTVY+$^&t1S0c&&Sm-27vaCYSXkNS%w^}8H-7;q
z^MH&c1XdO{Hr6?8bLY;P!#vu9`E$Y??zv0XZB=Gpre(yj-gdd<g^;`R1b01t&U5(v
zkkGbM=P%A*u!48xD!vUHg+(@rN=eJeZr>rddymRq)qVR99MRS}s(b9Xp7CjuGp1(d
z7IyXyj!w=lu9tqke8tDt&;NSpjhkWNw{Azo#oxRCAR+N#(vzp@8JStxIk_*2OG?Yi
zU%q->T~k|E-|*pMV>`8@^YfRk?w(%Sx8ae|v2psu<S*yN!aUFa{q^S)`yc1U%{(vG
zIdj<NaQt#!EUZq<2OIaCx$CyFFICp!FtS~?Uh=}c<-0=eK7Kx5aNFS_o>S-FFIXWY
z)xLrD%c=e8%zoR6UHrSw?EjqDf1g()VIdm}^Ww2_6G(*dNs&131$dwhU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
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
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz
z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg
zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_
z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=
zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~
U0R|XgfB^;=VBmr=5O#jgk7!5Xp#T5?

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/big256.png b/tests/auto/declarative/qsgimage/data/big256.png
new file mode 100644
index 0000000000000000000000000000000000000000..1dc1596d03cf870fc333f65bbf235ceb290f73b0
GIT binary patch
literal 3566
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/colors.png b/tests/auto/declarative/qsgimage/data/colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfb62f3d64e95a26d2ea1e87065e7892fa7814a3
GIT binary patch
literal 1655
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/colors1.png b/tests/auto/declarative/qsgimage/data/colors1.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfb62f3d64e95a26d2ea1e87065e7892fa7814a3
GIT binary patch
literal 1655
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/green.png b/tests/auto/declarative/qsgimage/data/green.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a2e153ba13c81b7a3ce0e3d002736ccb37c53dc
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1SJ1AFfjuu#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wkP>{XE)7O>#7K<<oCws#u-#nm@Qi*FsiF1B#Zfaf$gL6@8Vo7R>LV0FM
zhJw4NZ-7F6o<gF6Z(?%$igIV5>Uo|njv*Dd-d-?dWMJT6UXc0!T-3qy>`DPM3$Adb
zoSdZUJxzyo6NJGO31KwqfEi02rhyqj3P3eL5zPr8#gUstPJneqQm*~iw$6CQ<0{RY
Rcz`Zt@O1TaS?83{1OS|@XnFtu

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/heart-win32.png b/tests/auto/declarative/qsgimage/data/heart-win32.png
new file mode 100644
index 0000000000000000000000000000000000000000..351da13772d83511453159150f7e2362654dd033
GIT binary patch
literal 12621
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/heart.png b/tests/auto/declarative/qsgimage/data/heart.png
new file mode 100644
index 0000000000000000000000000000000000000000..abe97fee4bbdca9b00962408956013bd2f237736
GIT binary patch
literal 12577
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
E0|#43N&o-=

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/heart.svg b/tests/auto/declarative/qsgimage/data/heart.svg
new file mode 100644
index 0000000000..8c982cd93c
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/data/heart.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg viewBox="100 200 550 500" height="841.88976pt" id="svg1" inkscape:version="0.40+cvs" sodipodi:docbase="C:\Documents and Settings\Jon Phillips\My Documents\projects\clipart-project\submissions" sodipodi:docname="heart-left-highlight.svg" sodipodi:version="0.32" width="595.27559pt" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
+<metadata>
+<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<cc:Work rdf:about="">
+<dc:title>Heart Left-Highlight</dc:title>
+<dc:description>This is a normal valentines day heart.</dc:description>
+<dc:subject>
+<rdf:Bag>
+<rdf:li>holiday</rdf:li>
+<rdf:li>valentines</rdf:li>
+<rdf:li></rdf:li>
+<rdf:li>valentine</rdf:li>
+<rdf:li>hash(0x8a091c0)</rdf:li>
+<rdf:li>hash(0x8a0916c)</rdf:li>
+<rdf:li>signs_and_symbols</rdf:li>
+<rdf:li>hash(0x8a091f0)</rdf:li>
+<rdf:li>day</rdf:li>
+</rdf:Bag>
+</dc:subject>
+<dc:publisher>
+<cc:Agent rdf:about="http://www.openclipart.org">
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:publisher>
+<dc:creator>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:creator>
+<dc:rights>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:rights>
+<dc:date></dc:date>
+<dc:format>image/svg+xml</dc:format>
+<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
+<dc:language>en</dc:language>
+</cc:Work>
+<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
+<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+</cc:License>
+</rdf:RDF>
+</metadata>
+<defs id="defs3"/>
+<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="549.40674" inkscape:cy="596.00159" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="615" inkscape:window-width="866" inkscape:window-x="88" inkscape:window-y="116" inkscape:zoom="0.35000000" pagecolor="#ffffff" showguides="true"/>
+<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
+<path d="M 263.41570,235.14588 C 197.17570,235.14588 143.41575,288.90587 143.41575,355.14588 C 143.41575,489.90139 279.34890,525.23318 371.97820,658.45392 C 459.55244,526.05056 600.54070,485.59932 600.54070,355.14588 C 600.54070,288.90588 546.78080,235.14587 480.54070,235.14588 C 432.49280,235.14588 391.13910,263.51631 371.97820,304.33338 C 352.81740,263.51630 311.46370,235.14587 263.41570,235.14588 z " id="path7" sodipodi:nodetypes="ccccccc" style="fill:#e60000;fill-opacity:1.0000000;stroke:#000000;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+<path d="M 265.00000,253.59375 C 207.04033,253.59375 160.00000,300.63407 160.00000,358.59375 C 160.00000,476.50415 278.91857,507.43251 359.96875,624.00000 C 366.52868,614.08205 220.00000,478.47309 220.00000,378.59375 C 220.00000,320.63407 267.04033,273.59375 325.00000,273.59375 C 325.50453,273.59375 325.99718,273.64912 326.50000,273.65625 C 309.22436,261.07286 288.00557,253.59374 265.00000,253.59375 z " id="path220" sodipodi:nodetypes="ccccccc" style="fill:#e6e6e6;fill-opacity:0.64556962;stroke:none;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+</g>
+</svg>
diff --git a/tests/auto/declarative/qsgimage/data/heart200-win32.png b/tests/auto/declarative/qsgimage/data/heart200-win32.png
new file mode 100644
index 0000000000000000000000000000000000000000..4976ff98ba385ec6a1336b72f0afda692678d3eb
GIT binary patch
literal 8062
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/heart200.png b/tests/auto/declarative/qsgimage/data/heart200.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fbb13c5bbae6bd1492a08b41066196448eec2ef
GIT binary patch
literal 8063
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
A;Q#;t

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/qtbug_16389.qml b/tests/auto/declarative/qsgimage/data/qtbug_16389.qml
new file mode 100644
index 0000000000..7b8adecb11
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/data/qtbug_16389.qml
@@ -0,0 +1,30 @@
+import QtQuick 2.0
+Rectangle {
+    width: 400
+    height: 400
+
+    Item {
+        anchors.top: parent.top
+        anchors.left: parent.left
+        anchors.bottom: blueHandle.top
+        anchors.right: blueHandle.left
+
+        Image {
+            id: iconImage
+            objectName: "iconImage"
+            anchors.top: parent.top
+            anchors.bottom: parent.bottom
+            source: "heart200.png"
+            fillMode: Image.PreserveAspectFit
+            smooth: true
+        }
+    }
+
+    Rectangle {
+        id: blueHandle
+        objectName: "blueHandle"
+        color: "blue"
+        width: 25
+        height: 25
+    }
+}
diff --git a/tests/auto/declarative/qsgimage/data/rect.png b/tests/auto/declarative/qsgimage/data/rect.png
new file mode 100644
index 0000000000000000000000000000000000000000..d564a2d5a5557496171a180b2a2a31fc61e15237
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^CxAGGg9%9bJb4iVq!^2X+?^QKos)S9<Zu>vL>4nJ
za0`PlBg3pY5<tNKPZ!6Kid%0FGBN^rO$z_l=Xp4QnB;*!lCO?1Fz#Qcb_b;2)78&q
Iol`;+09l_MPyhe`

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgimage/data/tiling.qml b/tests/auto/declarative/qsgimage/data/tiling.qml
new file mode 100644
index 0000000000..986b7708a2
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/data/tiling.qml
@@ -0,0 +1,16 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 800; height: 600
+
+    Image {
+        objectName: "vTiling"; height: 550; width: 200
+        source: "green.png"; fillMode: Image.TileVertically
+    }
+
+    Image {
+        objectName: "hTiling"; x: 225; height: 250; width: 550
+        source: "green.png"; fillMode: Image.TileHorizontally
+    }
+}
+
diff --git a/tests/auto/declarative/qsgimage/qsgimage.pro b/tests/auto/declarative/qsgimage/qsgimage.pro
new file mode 100644
index 0000000000..9c33889330
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/qsgimage.pro
@@ -0,0 +1,17 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui network
+macx:CONFIG -= app_bundle
+
+HEADERS += ../shared/testhttpserver.h
+SOURCES += tst_qsgimage.cpp ../shared/testhttpserver.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgimage/tst_qsgimage.cpp b/tests/auto/declarative/qsgimage/tst_qsgimage.cpp
new file mode 100644
index 0000000000..e7366ff1b8
--- /dev/null
+++ b/tests/auto/declarative/qsgimage/tst_qsgimage.cpp
@@ -0,0 +1,776 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QTextDocument>
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QDir>
+
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgimage_p.h>
+#include <private/qsgimagebase_p.h>
+#include <private/qsgloader_p.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtTest/QSignalSpy>
+
+#include "../../../shared/util.h"
+#include "../shared/testhttpserver.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+#define SERVER_PORT 14451
+#define SERVER_ADDR "http://127.0.0.1:14451"
+
+class tst_qsgimage : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgimage();
+
+private slots:
+    void noSource();
+    void imageSource();
+    void imageSource_data();
+    void clearSource();
+    void resized();
+    void preserveAspectRatio();
+    void smooth();
+    void mirror();
+    void mirror_data();
+    void svg();
+    void geometry();
+    void geometry_data();
+    void big();
+    void tiling_QTBUG_6716();
+    void noLoading();
+    void paintedWidthHeight();
+    void sourceSize_QTBUG_14303();
+    void sourceSize_QTBUG_16389();
+    void nullPixmapPaint();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+private:
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &id, int index=-1);
+
+    QDeclarativeEngine engine;
+};
+
+tst_qsgimage::tst_qsgimage()
+{
+}
+
+void tst_qsgimage::noSource()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"\" }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->source(), QUrl());
+    QVERIFY(obj->status() == QSGImage::Null);
+    QCOMPARE(obj->width(), 0.);
+    QCOMPARE(obj->height(), 0.);
+    QCOMPARE(obj->fillMode(), QSGImage::Stretch);
+    QCOMPARE(obj->progress(), 0.0);
+
+    delete obj;
+}
+
+void tst_qsgimage::imageSource_data()
+{
+    QTest::addColumn<QString>("source");
+    QTest::addColumn<double>("width");
+    QTest::addColumn<double>("height");
+    QTest::addColumn<bool>("remote");
+    QTest::addColumn<bool>("async");
+    QTest::addColumn<bool>("cache");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << true << "";
+    QTest::newRow("local no cache") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << false << "";
+    QTest::newRow("local async") << QUrl::fromLocalFile(SRCDIR "/data/colors1.png").toString() << 120.0 << 120.0 << false << true << true << "";
+    QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString() << 0.0 << 0.0 << false
+        << false << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString();
+    QTest::newRow("local async not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString() << 0.0 << 0.0 << false
+        << true << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString();
+    QTest::newRow("remote") << SERVER_ADDR "/colors.png" << 120.0 << 120.0 << true << false << true << "";
+    QTest::newRow("remote redirected") << SERVER_ADDR "/oldcolors.png" << 120.0 << 120.0 << true << false << false << "";
+    QTest::newRow("remote svg") << SERVER_ADDR "/heart.svg" << 550.0 << 500.0 << true << false << false << "";
+    QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.png" << 0.0 << 0.0 << true
+        << false << true << "file::2:1: QML Image: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found";
+
+}
+
+void tst_qsgimage::imageSource()
+{
+    QFETCH(QString, source);
+    QFETCH(double, width);
+    QFETCH(double, height);
+    QFETCH(bool, remote);
+    QFETCH(bool, async);
+    QFETCH(bool, cache);
+    QFETCH(QString, error);
+
+    TestHTTPServer server(SERVER_PORT);
+    if (remote) {
+        QVERIFY(server.isValid());
+        server.serveDirectory(SRCDIR "/data");
+        server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png");
+    }
+
+    if (!error.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, error.toUtf8());
+
+    QString componentStr = "import QtQuick 1.1\nImage { source: \"" + source + "\"; asynchronous: "
+        + (async ? QLatin1String("true") : QLatin1String("false")) + "; cache: "
+        + (cache ? QLatin1String("true") : QLatin1String("false")) + " }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    if (async)
+        QVERIFY(obj->asynchronous() == true);
+    else
+        QVERIFY(obj->asynchronous() == false);
+
+    if (cache)
+        QVERIFY(obj->cache() == true);
+    else
+        QVERIFY(obj->cache() == false);
+
+    if (remote || async)
+        QTRY_VERIFY(obj->status() == QSGImage::Loading);
+
+    QCOMPARE(obj->source(), remote ? source : QUrl(source));
+
+    if (error.isEmpty()) {
+        QTRY_VERIFY(obj->status() == QSGImage::Ready);
+        QCOMPARE(obj->width(), qreal(width));
+        QCOMPARE(obj->height(), qreal(height));
+        QCOMPARE(obj->fillMode(), QSGImage::Stretch);
+        QCOMPARE(obj->progress(), 1.0);
+    } else {
+        QTRY_VERIFY(obj->status() == QSGImage::Error);
+    }
+
+    delete obj;
+}
+
+void tst_qsgimage::clearSource()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QSGImage::Ready);
+    QCOMPARE(obj->width(), 120.);
+    QCOMPARE(obj->height(), 120.);
+    QCOMPARE(obj->progress(), 1.0);
+
+    ctxt->setContextProperty("srcImage", "");
+    QVERIFY(obj->source().isEmpty());
+    QVERIFY(obj->status() == QSGImage::Null);
+    QCOMPARE(obj->width(), 0.);
+    QCOMPARE(obj->height(), 0.);
+    QCOMPARE(obj->progress(), 0.0);
+
+    delete obj;
+}
+
+void tst_qsgimage::resized()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" SRCDIR "/data/colors.png\"; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->fillMode(), QSGImage::Stretch);
+    delete obj;
+}
+
+
+void tst_qsgimage::preserveAspectRatio()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->show();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/aspectratio.qml"));
+    QSGImage *image = qobject_cast<QSGImage*>(canvas->rootObject());
+    QVERIFY(image != 0);
+    image->setWidth(80.0);
+    QCOMPARE(image->width(), 80.);
+    QCOMPARE(image->height(), 80.);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/aspectratio.qml"));
+    image = qobject_cast<QSGImage*>(canvas->rootObject());
+    image->setHeight(60.0);
+    QVERIFY(image != 0);
+    QCOMPARE(image->height(), 60.);
+    QCOMPARE(image->width(), 60.);
+    delete canvas;
+}
+
+void tst_qsgimage::smooth()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" SRCDIR "/data/colors.png\"; smooth: true; width: 300; height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->smooth(), true);
+    QCOMPARE(obj->fillMode(), QSGImage::Stretch);
+
+    delete obj;
+}
+
+void tst_qsgimage::mirror()
+{
+    QFETCH(int, fillMode);
+
+    qreal width = 300;
+    qreal height = 250;
+
+    QString src = QUrl::fromLocalFile(SRCDIR "/data/heart200.png").toString();
+    QString componentStr = "import QtQuick 1.1\nImage { source: \"" + src + "\"; }";
+
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    obj->setProperty("width", width);
+    obj->setProperty("height", height);
+    obj->setFillMode((QSGImage::FillMode)fillMode);
+    obj->setProperty("mirror", true);
+
+    QGraphicsScene scene;
+    scene.addItem(qobject_cast<QSGItem *>(obj));
+    QPixmap screenshot(width, height);
+    screenshot.fill();
+    QPainter p_screenshot(&screenshot);
+    scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+    QPixmap srcPixmap;
+    QVERIFY(srcPixmap.load(SRCDIR "/data/heart200.png"));
+
+    QPixmap expected(width, height);
+    expected.fill();
+    QPainter p_e(&expected);
+    QTransform transform;
+    transform.translate(width, 0).scale(-1, 1.0);
+    p_e.setTransform(transform);
+
+    switch (fillMode) {
+        case QSGImage::Stretch:
+            p_e.drawPixmap(QRect(0, 0, width, height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+            break;
+        case QSGImage::PreserveAspectFit:
+            p_e.drawPixmap(QRect(25, 0, width / (width/height), height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+            break;
+        case QSGImage::PreserveAspectCrop:
+        {
+            qreal ratio = width/srcPixmap.width(); // width is the longer side
+            QRect rect(0, 0, srcPixmap.width()*ratio, srcPixmap.height()*ratio);
+            rect.moveCenter(QRect(0, 0, width, height).center());
+            p_e.drawPixmap(rect, srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+            break;
+        }
+        case QSGImage::Tile:
+            p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+            break;
+        case QSGImage::TileVertically:
+            transform.scale(width / srcPixmap.width(), 1.0);
+            p_e.setTransform(transform);
+            p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+            break;
+        case QSGImage::TileHorizontally:
+            transform.scale(1.0, height / srcPixmap.height());
+            p_e.setTransform(transform);
+            p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+            break;
+    }
+
+    QCOMPARE(screenshot, expected);
+
+    delete obj;
+}
+
+void tst_qsgimage::mirror_data()
+{
+    QTest::addColumn<int>("fillMode");
+
+    QTest::newRow("Stretch") << int(QSGImage::Stretch);
+    QTest::newRow("PreserveAspectFit") << int(QSGImage::PreserveAspectFit);
+    QTest::newRow("PreserveAspectCrop") << int(QSGImage::PreserveAspectCrop);
+    QTest::newRow("Tile") << int(QSGImage::Tile);
+    QTest::newRow("TileVertically") << int(QSGImage::TileVertically);
+    QTest::newRow("TileHorizontally") << int(QSGImage::TileHorizontally);
+}
+
+void tst_qsgimage::svg()
+{
+    QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.svg").toString();
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; sourceSize.width: 300; sourceSize.height: 300 }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->pixmap().width(), 300);
+    QCOMPARE(obj->pixmap().height(), 300);
+    QCOMPARE(obj->width(), 300.0);
+    QCOMPARE(obj->height(), 300.0);
+#if defined(Q_OS_LINUX)
+    QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png"));
+#elif defined(Q_OS_WIN32)
+    QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart-win32.png"));
+#endif
+
+    obj->setSourceSize(QSize(200,200));
+
+    QCOMPARE(obj->pixmap().width(), 200);
+    QCOMPARE(obj->pixmap().height(), 200);
+    QCOMPARE(obj->width(), 200.0);
+    QCOMPARE(obj->height(), 200.0);
+#if defined(Q_OS_LINUX)
+    QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart200.png"));
+#elif defined(Q_OS_WIN32)
+    QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart200-win32.png"));
+#endif
+    delete obj;
+}
+
+void tst_qsgimage::geometry_data()
+{
+    QTest::addColumn<QString>("fillMode");
+    QTest::addColumn<bool>("explicitWidth");
+    QTest::addColumn<bool>("explicitHeight");
+    QTest::addColumn<double>("itemWidth");
+    QTest::addColumn<double>("paintedWidth");
+    QTest::addColumn<double>("boundingWidth");
+    QTest::addColumn<double>("itemHeight");
+    QTest::addColumn<double>("paintedHeight");
+    QTest::addColumn<double>("boundingHeight");
+
+    // tested image has width 200, height 100
+
+    // bounding rect and item rect are equal with fillMode PreserveAspectFit, painted rect may be smaller if the aspect ratio doesn't match
+    QTest::newRow("PreserveAspectFit") << "PreserveAspectFit" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectFit explicit width 300") << "PreserveAspectFit" << true << false << 300.0 << 200.0 << 300.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectFit explicit height 400") << "PreserveAspectFit" << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 100.0 << 400.0;
+    QTest::newRow("PreserveAspectFit explicit width 300, height 400") << "PreserveAspectFit" << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 150.0 << 400.0;
+
+    // bounding rect and painted rect are equal with fillMode PreserveAspectCrop, item rect may be smaller if the aspect ratio doesn't match
+    QTest::newRow("PreserveAspectCrop") << "PreserveAspectCrop" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectCrop explicit width 300") << "PreserveAspectCrop" << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 150.0 << 150.0;
+    QTest::newRow("PreserveAspectCrop explicit height 400") << "PreserveAspectCrop" << false << true << 200.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0;
+    QTest::newRow("PreserveAspectCrop explicit width 300, height 400") << "PreserveAspectCrop" << true << true << 300.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0;
+
+    // bounding rect, painted rect and item rect are equal in stretching and tiling images
+    QStringList fillModes;
+    fillModes << "Stretch" << "Tile" << "TileVertically" << "TileHorizontally";
+    foreach (QString fillMode, fillModes) {
+        QTest::newRow(fillMode.toLatin1()) << fillMode << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+        QTest::newRow(QString(fillMode + " explicit width 300").toLatin1()) << fillMode << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 100.0 << 100.0;
+        QTest::newRow(QString(fillMode + " explicit height 400").toLatin1()) << fillMode << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 400.0 << 400.0;
+        QTest::newRow(QString(fillMode + " explicit width 300, height 400").toLatin1()) << fillMode << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 400.0 << 400.0;
+    }
+}
+
+void tst_qsgimage::geometry()
+{
+    QFETCH(QString, fillMode);
+    QFETCH(bool, explicitWidth);
+    QFETCH(bool, explicitHeight);
+    QFETCH(double, itemWidth);
+    QFETCH(double, itemHeight);
+    QFETCH(double, paintedWidth);
+    QFETCH(double, paintedHeight);
+    QFETCH(double, boundingWidth);
+    QFETCH(double, boundingHeight);
+
+    QString src = QUrl::fromLocalFile(SRCDIR "/data/rect.png").toString();
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; fillMode: Image." + fillMode + "; ";
+
+    if (explicitWidth)
+        componentStr.append("width: 300; ");
+    if (explicitHeight)
+        componentStr.append("height: 400; ");
+    componentStr.append("}");
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->width(), itemWidth);
+    QCOMPARE(obj->paintedWidth(), paintedWidth);
+    QCOMPARE(obj->boundingRect().width(), boundingWidth);
+
+    QCOMPARE(obj->height(), itemHeight);
+    QCOMPARE(obj->paintedHeight(), paintedHeight);
+    QCOMPARE(obj->boundingRect().height(), boundingHeight);
+    delete obj;
+}
+
+void tst_qsgimage::big()
+{
+    // If the JPEG loader does not implement scaling efficiently, it would
+    // have to build a 400 MB image. That would be a bug in the JPEG loader.
+
+    QString src = QUrl::fromLocalFile(SRCDIR "/data/big.jpeg").toString();
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 100; sourceSize.height: 256 }";
+
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->pixmap().width(), 256);
+    QCOMPARE(obj->pixmap().height(), 256);
+    QCOMPARE(obj->width(), 100.0);
+    QCOMPARE(obj->height(), 256.0);
+    QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/big256.png"));
+
+    delete obj;
+}
+
+void tst_qsgimage::tiling_QTBUG_6716()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/tiling.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGImage *vTiling = findItem<QSGImage>(canvas->rootObject(), "vTiling");
+    QSGImage *hTiling = findItem<QSGImage>(canvas->rootObject(), "hTiling");
+
+    QVERIFY(vTiling != 0);
+    QVERIFY(hTiling != 0);
+
+    {
+        QPixmap pm(vTiling->width(), vTiling->height());
+        QPainter p(&pm);
+        vTiling->paint(&p, 0, 0);
+
+        QImage img = pm.toImage();
+        for (int x = 0; x < vTiling->width(); ++x) {
+            for (int y = 0; y < vTiling->height(); ++y) {
+                QVERIFY(img.pixel(x, y) == qRgb(0, 255, 0));
+            }
+        }
+    }
+
+    {
+        QPixmap pm(hTiling->width(), hTiling->height());
+        QPainter p(&pm);
+        hTiling->paint(&p, 0, 0);
+
+        QImage img = pm.toImage();
+        for (int x = 0; x < hTiling->width(); ++x) {
+            for (int y = 0; y < hTiling->height(); ++y) {
+                QVERIFY(img.pixel(x, y) == qRgb(0, 255, 0));
+            }
+        }
+    }
+
+    delete canvas;
+}
+
+void tst_qsgimage::noLoading()
+{
+    TestHTTPServer server(SERVER_PORT);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+    server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png");
+
+    QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart.png"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QSGImage::Ready);
+
+    QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &)));
+    QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
+    QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QSGImageBase::Status)));
+
+    // Loading local file
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 1);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
+    // Loading remote file
+    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png");
+    QTRY_VERIFY(obj->status() == QSGImage::Loading);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 2);
+    QTRY_COMPARE(progressSpy.count(), 2);
+    QTRY_COMPARE(statusSpy.count(), 2);
+
+    // Loading remote file again - should not go through 'Loading' state.
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png");
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 4);
+    QTRY_COMPARE(progressSpy.count(), 2);
+    QTRY_COMPARE(statusSpy.count(), 2);
+
+    delete obj;
+}
+
+void tst_qsgimage::paintedWidthHeight()
+{
+    {
+        QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.png").toString();
+        QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 200; height: 25; fillMode: Image.PreserveAspectFit }";
+
+        QDeclarativeComponent component(&engine);
+        component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+        QVERIFY(obj != 0);
+        QCOMPARE(obj->pixmap().width(), 300);
+        QCOMPARE(obj->pixmap().height(), 300);
+        QCOMPARE(obj->width(), 200.0);
+        QCOMPARE(obj->height(), 25.0);
+        QCOMPARE(obj->paintedWidth(), 25.0);
+        QCOMPARE(obj->paintedHeight(), 25.0);
+        QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png"));
+
+        delete obj;
+    }
+
+    {
+        QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.png").toString();
+        QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 26; height: 175; fillMode: Image.PreserveAspectFit }";
+        QDeclarativeComponent component(&engine);
+        component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+        QVERIFY(obj != 0);
+        QCOMPARE(obj->pixmap().width(), 300);
+        QCOMPARE(obj->pixmap().height(), 300);
+        QCOMPARE(obj->width(), 26.0);
+        QCOMPARE(obj->height(), 175.0);
+        QCOMPARE(obj->paintedWidth(), 26.0);
+        QCOMPARE(obj->paintedHeight(), 26.0);
+        QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png"));
+
+        delete obj;
+    }
+}
+
+void tst_qsgimage::sourceSize_QTBUG_14303()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *obj = qobject_cast<QSGImage*>(component.create());
+
+    QSignalSpy sourceSizeSpy(obj, SIGNAL(sourceSizeChanged()));
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->status() == QSGImage::Ready);
+
+    QTRY_COMPARE(obj->sourceSize().width(), 200);
+    QTRY_COMPARE(obj->sourceSize().height(), 200);
+    QTRY_COMPARE(sourceSizeSpy.count(), 0);
+
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    QTRY_COMPARE(obj->sourceSize().width(), 120);
+    QTRY_COMPARE(obj->sourceSize().height(), 120);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png"));
+    QTRY_COMPARE(obj->sourceSize().width(), 200);
+    QTRY_COMPARE(obj->sourceSize().height(), 200);
+    QTRY_COMPARE(sourceSizeSpy.count(), 2);
+
+    delete obj;
+}
+
+void tst_qsgimage::sourceSize_QTBUG_16389()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug_16389.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGImage *image = findItem<QSGImage>(canvas->rootObject(), "iconImage");
+    QSGItem *handle = findItem<QSGItem>(canvas->rootObject(), "blueHandle");
+
+    QCOMPARE(image->sourceSize().width(), 200);
+    QCOMPARE(image->sourceSize().height(), 200);
+    QCOMPARE(image->paintedWidth(), 0.0);
+    QCOMPARE(image->paintedHeight(), 0.0);
+
+    handle->setY(20);
+
+    QCOMPARE(image->sourceSize().width(), 200);
+    QCOMPARE(image->sourceSize().height(), 200);
+    QCOMPARE(image->paintedWidth(), 20.0);
+    QCOMPARE(image->paintedHeight(), 20.0);
+}
+
+static int numberOfWarnings = 0;
+static void checkWarnings(QtMsgType, const char *)
+{
+    numberOfWarnings++;
+}
+
+// QTBUG-15690
+void tst_qsgimage::nullPixmapPaint()
+{
+    QString componentStr = QString("import QtQuick 1.0\nImage { width: 10; height:10; fillMode: Image.PreserveAspectFit; source: \"")
+            + SERVER_ADDR + QString("/no-such-file.png\" }");
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGImage *image = qobject_cast<QSGImage*>(component.create());
+
+    QTRY_VERIFY(image != 0);
+    
+    QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings);
+
+    QPixmap pm(100, 100);
+    QPainter p(&pm);
+
+    // used to print "QTransform::translate with NaN called"
+    image->paint(&p, 0, 0);
+    qInstallMsgHandler(previousMsgHandler);
+    QVERIFY(numberOfWarnings == 0);
+    delete image;
+}
+
+void tst_qsgimage::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 1.1; Image { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; Image { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_qsgimage::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("mirror") << "mirror: true"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"Image.mirror\" is not available in QtQuick 1.0.\n";
+
+    QTest::newRow("cache") << "cache: true"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"Image.cache\" is not available in QtQuick 1.0.\n";
+}
+
+/*
+   Find an item with the specified objectName.  If index is supplied then the
+   item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_qsgimage::findItem(QSGItem *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeExpression e(qmlContext(item), item, "index");
+                if (e.evaluate().toInt() == index)
+                    return static_cast<T*>(item);
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+QTEST_MAIN(tst_qsgimage)
+
+#include "tst_qsgimage.moc"
diff --git a/tests/auto/declarative/qsgitem/qsgitem.pro b/tests/auto/declarative/qsgitem/qsgitem.pro
new file mode 100644
index 0000000000..6c659a395f
--- /dev/null
+++ b/tests/auto/declarative/qsgitem/qsgitem.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qsgitem.cpp
+
+macx:CONFIG -= app_bundle
+
+CONFIG += parallel_test
diff --git a/tests/auto/declarative/qsgitem/tst_qsgitem.cpp b/tests/auto/declarative/qsgitem/tst_qsgitem.cpp
new file mode 100644
index 0000000000..746b186c1e
--- /dev/null
+++ b/tests/auto/declarative/qsgitem/tst_qsgitem.cpp
@@ -0,0 +1,787 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+
+#include "qsgitem.h"
+#include "qsgcanvas.h"
+#include "private/qsgfocusscope_p.h"
+#include <QDebug>
+
+class TestItem : public QSGItem
+{
+Q_OBJECT
+public:
+    TestItem(QSGItem *parent = 0) : QSGItem(parent), focused(false), pressCount(0), releaseCount(0) {}
+
+    bool focused;
+    int pressCount;
+    int releaseCount;
+protected:
+    virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
+    virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
+    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) { event->accept(); ++pressCount; }
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { event->accept(); ++releaseCount; }
+};
+
+class TestFocusScope : public QSGFocusScope
+{
+Q_OBJECT
+public:
+    TestFocusScope(QSGItem *parent = 0) : QSGFocusScope(parent), focused(false) {}
+
+    bool focused;
+protected:
+    virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
+    virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
+};
+
+class tst_qsgitem : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgitem();
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+
+    void noCanvas();
+    void simpleFocus();
+    void scopedFocus();
+    void addedToCanvas();
+    void changeParent();
+
+    void constructor();
+    void setParentItem();
+
+    void visible();
+    void enabled();
+
+    void mouseGrab();
+};
+
+tst_qsgitem::tst_qsgitem()
+{
+}
+
+void tst_qsgitem::initTestCase()
+{
+}
+
+void tst_qsgitem::cleanupTestCase()
+{
+}
+
+// Focus has no effect when outside a canvas
+void tst_qsgitem::noCanvas()
+{
+    QSGItem *root = new TestItem;
+    QSGItem *child = new TestItem(root);
+    QSGItem *scope = new TestItem(root);
+    QSGFocusScope *scopedChild = new TestFocusScope(scope);
+    QSGFocusScope *scopedChild2 = new TestFocusScope(scope);
+
+    QCOMPARE(root->hasFocus(), false);
+    QCOMPARE(child->hasFocus(), false);
+    QCOMPARE(scope->hasFocus(), false);
+    QCOMPARE(scopedChild->hasFocus(), false);
+    QCOMPARE(scopedChild2->hasFocus(), false);
+
+    root->setFocus(true);
+    scope->setFocus(true);
+    scopedChild2->setFocus(true);
+    QCOMPARE(root->hasFocus(), true);
+    QCOMPARE(child->hasFocus(), false);
+    QCOMPARE(scope->hasFocus(), true);
+    QCOMPARE(scopedChild->hasFocus(), false);
+    QCOMPARE(scopedChild2->hasFocus(), true);
+
+    root->setFocus(false);
+    child->setFocus(true);
+    scopedChild->setFocus(true);
+    scope->setFocus(false);
+    QCOMPARE(root->hasFocus(), false);
+    QCOMPARE(child->hasFocus(), true);
+    QCOMPARE(scope->hasFocus(), false);
+    QCOMPARE(scopedChild->hasFocus(), true);
+    QCOMPARE(scopedChild2->hasFocus(), true);
+
+    delete root;
+}
+
+struct FocusData {
+    FocusData() : focus(false), activeFocus(false) {}
+
+    void set(bool f, bool af) { focus = f; activeFocus = af; }
+    bool focus;
+    bool activeFocus;
+};
+struct FocusState : public QHash<QSGItem *, FocusData>
+{
+    FocusState() : activeFocusItem(0) {}
+    FocusState &operator<<(QSGItem *item) {
+        insert(item, FocusData());
+        return *this;
+    }
+
+    void active(QSGItem *i) {
+        activeFocusItem = i;
+    }
+    QSGItem *activeFocusItem;
+};
+
+#define FVERIFY() \
+    do { \
+        if (focusState.activeFocusItem) { \
+            QCOMPARE(canvas.activeFocusItem(), focusState.activeFocusItem); \
+            if (qobject_cast<TestItem *>(canvas.activeFocusItem())) \
+                QCOMPARE(qobject_cast<TestItem *>(canvas.activeFocusItem())->focused, true); \
+            else if (qobject_cast<TestFocusScope *>(canvas.activeFocusItem())) \
+                QCOMPARE(qobject_cast<TestFocusScope *>(canvas.activeFocusItem())->focused, true); \
+        } else { \
+            QCOMPARE(canvas.activeFocusItem(), canvas.rootItem()); \
+        } \
+        for(QHash<QSGItem *, FocusData>::Iterator iter = focusState.begin(); \
+            iter != focusState.end(); \
+            iter++) { \
+            QCOMPARE(iter.key()->hasFocus(), iter.value().focus); \
+            QCOMPARE(iter.key()->hasActiveFocus(), iter.value().activeFocus); \
+        } \
+    } while(false)
+
+// Tests a simple set of top-level scoped items
+void tst_qsgitem::simpleFocus()
+{
+    QSGCanvas canvas;
+
+    QSGItem *l1c1 = new TestItem(canvas.rootItem());
+    QSGItem *l1c2 = new TestItem(canvas.rootItem());
+    QSGItem *l1c3 = new TestItem(canvas.rootItem());
+
+    QSGItem *l2c1 = new TestItem(l1c1);
+    QSGItem *l2c2 = new TestItem(l1c1);
+    QSGItem *l2c3 = new TestItem(l1c3);
+
+    FocusState focusState;
+    focusState << l1c1 << l1c2 << l1c3
+               << l2c1 << l2c2 << l2c3;
+    FVERIFY();
+
+    l1c1->setFocus(true);
+    focusState[l1c1].set(true, true);
+    focusState.active(l1c1);
+    FVERIFY();
+
+    l2c3->setFocus(true);
+    focusState[l1c1].set(false, false);
+    focusState[l2c3].set(true, true);
+    focusState.active(l2c3);
+    FVERIFY();
+
+    l1c3->setFocus(true);
+    focusState[l2c3].set(false, false);
+    focusState[l1c3].set(true, true);
+    focusState.active(l1c3);
+    FVERIFY();
+
+    l1c2->setFocus(false);
+    FVERIFY();
+
+    l1c3->setFocus(false);
+    focusState[l1c3].set(false, false);
+    focusState.active(0);
+    FVERIFY();
+
+    l2c1->setFocus(true);
+    focusState[l2c1].set(true, true);
+    focusState.active(l2c1);
+    FVERIFY();
+}
+
+// Items with a focus scope
+void tst_qsgitem::scopedFocus()
+{
+    QSGCanvas canvas;
+
+    QSGItem *l1c1 = new TestItem(canvas.rootItem());
+    QSGItem *l1c2 = new TestItem(canvas.rootItem());
+    QSGItem *l1c3 = new TestItem(canvas.rootItem());
+
+    QSGItem *l2c1 = new TestItem(l1c1);
+    QSGItem *l2c2 = new TestItem(l1c1);
+    QSGItem *l2c3 = new TestFocusScope(l1c3);
+
+    QSGItem *l3c1 = new TestItem(l2c3);
+    QSGItem *l3c2 = new TestFocusScope(l2c3);
+
+    QSGItem *l4c1 = new TestItem(l3c2);
+    QSGItem *l4c2 = new TestItem(l3c2);
+
+    FocusState focusState;
+    focusState << l1c1 << l1c2 << l1c3
+               << l2c1 << l2c2 << l2c3
+               << l3c1 << l3c2
+               << l4c1 << l4c2;
+    FVERIFY();
+
+    l4c2->setFocus(true);
+    focusState[l4c2].set(true, false);
+    FVERIFY();
+
+    l4c1->setFocus(true);
+    focusState[l4c2].set(false, false);
+    focusState[l4c1].set(true, false);
+    FVERIFY();
+
+    l1c1->setFocus(true);
+    focusState[l1c1].set(true, true);
+    focusState.active(l1c1);
+    FVERIFY();
+
+    l3c2->setFocus(true);
+    focusState[l3c2].set(true, false);
+    FVERIFY();
+
+    l2c3->setFocus(true);
+    focusState[l1c1].set(false, false);
+    focusState[l2c3].set(true, true);
+    focusState[l3c2].set(true, true);
+    focusState[l4c1].set(true, true);
+    focusState.active(l4c1);
+    FVERIFY();
+
+    l3c2->setFocus(false);
+    focusState[l3c2].set(false, false);
+    focusState[l4c1].set(true, false);
+    focusState.active(l2c3);
+    FVERIFY();
+
+    l3c2->setFocus(true);
+    focusState[l3c2].set(true, true);
+    focusState[l4c1].set(true, true);
+    focusState.active(l4c1);
+    FVERIFY();
+
+    l4c1->setFocus(false);
+    focusState[l4c1].set(false, false);
+    focusState.active(l3c2);
+    FVERIFY();
+
+    l1c3->setFocus(true);
+    focusState[l1c3].set(true, true);
+    focusState[l2c3].set(false, false);
+    focusState[l3c2].set(true, false);
+    focusState.active(l1c3);
+    FVERIFY();
+}
+
+// Tests focus corrects itself when a tree is added to a canvas for the first time
+void tst_qsgitem::addedToCanvas()
+{
+    {
+    QSGCanvas canvas;
+
+    QSGItem *item = new TestItem;
+
+    FocusState focusState;
+    focusState << item;
+
+    item->setFocus(true);
+    focusState[item].set(true, false);
+    FVERIFY();
+
+    item->setParentItem(canvas.rootItem());
+    focusState[item].set(true, true);
+    focusState.active(item);
+    FVERIFY();
+    }
+
+    {
+    QSGCanvas canvas;
+
+    QSGItem *item = new TestItem(canvas.rootItem());
+
+    QSGItem *tree = new TestItem;
+    QSGItem *c1 = new TestItem(tree);
+    QSGItem *c2 = new TestItem(tree);
+
+    FocusState focusState;
+    focusState << item << tree << c1 << c2;
+
+    item->setFocus(true);
+    c1->setFocus(true);
+    c2->setFocus(true);
+    focusState[item].set(true, true);
+    focusState[c1].set(true, false);
+    focusState[c2].set(true, false);
+    focusState.active(item);
+    FVERIFY();
+
+    tree->setParentItem(item);
+    focusState[c1].set(false, false);
+    focusState[c2].set(false, false);
+    FVERIFY();
+    }
+
+    {
+    QSGCanvas canvas;
+
+    QSGItem *tree = new TestItem;
+    QSGItem *c1 = new TestItem(tree);
+    QSGItem *c2 = new TestItem(tree);
+
+    FocusState focusState;
+    focusState << tree << c1 << c2;
+    c1->setFocus(true);
+    c2->setFocus(true);
+    focusState[c1].set(true, false);
+    focusState[c2].set(true, false);
+    FVERIFY();
+
+    tree->setParentItem(canvas.rootItem());
+    focusState[c1].set(true, true);
+    focusState[c2].set(false, false);
+    focusState.active(c1);
+    FVERIFY();
+    }
+
+    {
+    QSGCanvas canvas;
+    QSGItem *tree = new TestFocusScope;
+    QSGItem *c1 = new TestItem(tree);
+    QSGItem *c2 = new TestItem(tree);
+
+    FocusState focusState;
+    focusState << tree << c1 << c2;
+    c1->setFocus(true);
+    c2->setFocus(true);
+    focusState[c1].set(true, false);
+    focusState[c2].set(true, false);
+    FVERIFY();
+
+    tree->setParentItem(canvas.rootItem());
+    focusState[c1].set(true, false);
+    focusState[c2].set(false, false);
+    FVERIFY();
+
+    tree->setFocus(true);
+    focusState[tree].set(true, true);
+    focusState[c1].set(true, true);
+    focusState.active(c1);
+    FVERIFY();
+    }
+
+    {
+    QSGCanvas canvas;
+    QSGItem *tree = new TestFocusScope;
+    QSGItem *c1 = new TestItem(tree);
+    QSGItem *c2 = new TestItem(tree);
+
+    FocusState focusState;
+    focusState << tree << c1 << c2;
+    tree->setFocus(true);
+    c1->setFocus(true);
+    c2->setFocus(true);
+    focusState[tree].set(true, false);
+    focusState[c1].set(true, false);
+    focusState[c2].set(true, false);
+    FVERIFY();
+
+    tree->setParentItem(canvas.rootItem());
+    focusState[tree].set(true, true);
+    focusState[c1].set(true, true);
+    focusState[c2].set(false, false);
+    focusState.active(c1);
+    FVERIFY();
+    }
+
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+    QSGItem *tree = new TestFocusScope;
+    QSGItem *c1 = new TestItem(tree);
+    QSGItem *c2 = new TestItem(tree);
+
+    FocusState focusState;
+    focusState << child << tree << c1 << c2;
+    child->setFocus(true);
+    tree->setFocus(true);
+    c1->setFocus(true);
+    c2->setFocus(true);
+    focusState[child].set(true, true);
+    focusState[tree].set(true, false);
+    focusState[c1].set(true, false);
+    focusState[c2].set(true, false);
+    focusState.active(child);
+    FVERIFY();
+
+    tree->setParentItem(canvas.rootItem());
+    focusState[tree].set(false, false);
+    focusState[c1].set(true, false);
+    focusState[c2].set(false, false);
+    FVERIFY();
+
+    tree->setFocus(true);
+    focusState[child].set(false, false);
+    focusState[tree].set(true, true);
+    focusState[c1].set(true, true);
+    focusState.active(c1);
+    FVERIFY();
+    }
+}
+
+void tst_qsgitem::changeParent()
+{
+    // Parent to no parent
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+
+    FocusState focusState;
+    focusState << child;
+    FVERIFY();
+
+    child->setFocus(true);
+    focusState[child].set(true, true);
+    focusState.active(child);
+    FVERIFY();
+
+    child->setParentItem(0);
+    focusState[child].set(true, false);
+    focusState.active(0);
+    FVERIFY();
+    }
+
+    // Different parent, same focus scope
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+    QSGItem *child2 = new TestItem(canvas.rootItem());
+
+    FocusState focusState;
+    focusState << child << child2;
+    FVERIFY();
+
+    child->setFocus(true);
+    focusState[child].set(true, true);
+    focusState.active(child);
+    FVERIFY();
+
+    child->setParentItem(child2);
+    FVERIFY();
+    }
+
+    // Different parent, different focus scope
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+    QSGItem *child2 = new TestFocusScope(canvas.rootItem());
+    QSGItem *item = new TestItem(child);
+
+    FocusState focusState;
+    focusState << child << child2 << item;
+    FVERIFY();
+
+    item->setFocus(true);
+    focusState[item].set(true, true);
+    focusState.active(item);
+    FVERIFY();
+
+    item->setParentItem(child2);
+    focusState[item].set(true, false);
+    focusState.active(0);
+    FVERIFY();
+    }
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+    QSGItem *child2 = new TestFocusScope(canvas.rootItem());
+    QSGItem *item = new TestItem(child2);
+
+    FocusState focusState;
+    focusState << child << child2 << item;
+    FVERIFY();
+
+    item->setFocus(true);
+    focusState[item].set(true, false);
+    focusState.active(0);
+    FVERIFY();
+
+    item->setParentItem(child);
+    focusState[item].set(true, true);
+    focusState.active(item);
+    FVERIFY();
+    }
+    {
+    QSGCanvas canvas;
+    QSGItem *child = new TestItem(canvas.rootItem());
+    QSGItem *child2 = new TestFocusScope(canvas.rootItem());
+    QSGItem *item = new TestItem(child2);
+
+    FocusState focusState;
+    focusState << child << child2 << item;
+    FVERIFY();
+
+    child->setFocus(true);
+    item->setFocus(true);
+    focusState[child].set(true, true);
+    focusState[item].set(true, false);
+    focusState.active(child);
+    FVERIFY();
+
+    item->setParentItem(child);
+    focusState[item].set(false, false);
+    FVERIFY();
+    }
+    
+}
+
+void tst_qsgitem::constructor()
+{
+    QSGItem *root = new QSGItem;
+    QVERIFY(root->parent() == 0);
+    QVERIFY(root->parentItem() == 0);
+
+    QSGItem *child1 = new QSGItem(root);
+    QVERIFY(child1->parent() == root);
+    QVERIFY(child1->parentItem() == root);
+    QCOMPARE(root->childItems().count(), 1);
+    QCOMPARE(root->childItems().at(0), child1);
+
+    QSGItem *child2 = new QSGItem(root);
+    QVERIFY(child2->parent() == root);
+    QVERIFY(child2->parentItem() == root);
+    QCOMPARE(root->childItems().count(), 2);
+    QCOMPARE(root->childItems().at(0), child1);
+    QCOMPARE(root->childItems().at(1), child2);
+
+    delete root;
+}
+
+void tst_qsgitem::setParentItem()
+{
+    QSGItem *root = new QSGItem;
+    QVERIFY(root->parent() == 0);
+    QVERIFY(root->parentItem() == 0);
+
+    QSGItem *child1 = new QSGItem;
+    QVERIFY(child1->parent() == 0);
+    QVERIFY(child1->parentItem() == 0);
+
+    child1->setParentItem(root);
+    QVERIFY(child1->parent() == 0);
+    QVERIFY(child1->parentItem() == root);
+    QCOMPARE(root->childItems().count(), 1);
+    QCOMPARE(root->childItems().at(0), child1);
+
+    QSGItem *child2 = new QSGItem;
+    QVERIFY(child2->parent() == 0);
+    QVERIFY(child2->parentItem() == 0);
+    child2->setParentItem(root);
+    QVERIFY(child2->parent() == 0);
+    QVERIFY(child2->parentItem() == root);
+    QCOMPARE(root->childItems().count(), 2);
+    QCOMPARE(root->childItems().at(0), child1);
+    QCOMPARE(root->childItems().at(1), child2);
+
+    child1->setParentItem(0);
+    QVERIFY(child1->parent() == 0);
+    QVERIFY(child1->parentItem() == 0);
+    QCOMPARE(root->childItems().count(), 1);
+    QCOMPARE(root->childItems().at(0), child2);
+
+    delete root;
+
+    QVERIFY(child1->parent() == 0);
+    QVERIFY(child1->parentItem() == 0);
+    QVERIFY(child2->parent() == 0);
+    QVERIFY(child2->parentItem() == 0);
+
+    delete child1;
+    delete child2;
+}
+
+void tst_qsgitem::visible()
+{
+    QSGItem *root = new QSGItem;
+
+    QSGItem *child1 = new QSGItem;
+    child1->setParentItem(root);
+
+    QSGItem *child2 = new QSGItem;
+    child2->setParentItem(root);
+
+    QVERIFY(child1->isVisible());
+    QVERIFY(child2->isVisible());
+
+    root->setVisible(false);
+    QVERIFY(!child1->isVisible());
+    QVERIFY(!child2->isVisible());
+
+    root->setVisible(true);
+    QVERIFY(child1->isVisible());
+    QVERIFY(child2->isVisible());
+
+    child1->setVisible(false);
+    QVERIFY(!child1->isVisible());
+    QVERIFY(child2->isVisible());
+
+    child2->setParentItem(child1);
+    QVERIFY(!child1->isVisible());
+    QVERIFY(!child2->isVisible());
+
+    child2->setParentItem(root);
+    QVERIFY(!child1->isVisible());
+    QVERIFY(child2->isVisible());
+
+    delete root;
+    delete child1;
+    delete child2;
+}
+
+void tst_qsgitem::enabled()
+{
+    QSGItem *root = new QSGItem;
+
+    QSGItem *child1 = new QSGItem;
+    child1->setParentItem(root);
+
+    QSGItem *child2 = new QSGItem;
+    child2->setParentItem(root);
+
+    QVERIFY(child1->isEnabled());
+    QVERIFY(child2->isEnabled());
+
+    root->setEnabled(false);
+    QVERIFY(!child1->isEnabled());
+    QVERIFY(!child2->isEnabled());
+
+    root->setEnabled(true);
+    QVERIFY(child1->isEnabled());
+    QVERIFY(child2->isEnabled());
+
+    child1->setEnabled(false);
+    QVERIFY(!child1->isEnabled());
+    QVERIFY(child2->isEnabled());
+
+    child2->setParentItem(child1);
+    QVERIFY(!child1->isEnabled());
+    QVERIFY(!child2->isEnabled());
+
+    child2->setParentItem(root);
+    QVERIFY(!child1->isEnabled());
+    QVERIFY(child2->isEnabled());
+
+    delete root;
+    delete child1;
+    delete child2;
+}
+
+void tst_qsgitem::mouseGrab()
+{
+    QSGCanvas *canvas = new QSGCanvas;
+    canvas->resize(200, 200);
+    canvas->show();
+
+    TestItem *child1 = new TestItem;
+    child1->setAcceptedMouseButtons(Qt::LeftButton);
+    child1->setSize(QSizeF(200, 100));
+    child1->setParentItem(canvas->rootItem());
+
+    TestItem *child2 = new TestItem;
+    child2->setAcceptedMouseButtons(Qt::LeftButton);
+    child2->setY(100);
+    child2->setSize(QSizeF(200, 100));
+    child2->setParentItem(canvas->rootItem());
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QVERIFY(canvas->mouseGrabberItem() == child1);
+    QCOMPARE(child1->pressCount, 1);
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QVERIFY(canvas->mouseGrabberItem() == 0);
+    QCOMPARE(child1->releaseCount, 1);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QVERIFY(canvas->mouseGrabberItem() == child1);
+    QCOMPARE(child1->pressCount, 2);
+    child1->setEnabled(false);
+    QVERIFY(canvas->mouseGrabberItem() == 0);
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QCOMPARE(child1->releaseCount, 1);
+    child1->setEnabled(true);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QVERIFY(canvas->mouseGrabberItem() == child1);
+    QCOMPARE(child1->pressCount, 3);
+    child1->setVisible(false);
+    QVERIFY(canvas->mouseGrabberItem() == 0);
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QCOMPARE(child1->releaseCount, 1);
+    child1->setVisible(true);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QVERIFY(canvas->mouseGrabberItem() == child1);
+    QCOMPARE(child1->pressCount, 4);
+    child2->grabMouse();
+    QVERIFY(canvas->mouseGrabberItem() == child2);
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QCOMPARE(child1->releaseCount, 1);
+    QCOMPARE(child2->releaseCount, 1);
+
+    child2->grabMouse();
+    QVERIFY(canvas->mouseGrabberItem() == child2);
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QCOMPARE(child1->pressCount, 4);
+    QCOMPARE(child2->pressCount, 1);
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
+    QCOMPARE(child1->releaseCount, 1);
+    QCOMPARE(child2->releaseCount, 2);
+
+    delete child1;
+    delete child2;
+    delete canvas;
+}
+
+
+QTEST_MAIN(tst_qsgitem)
+
+#include "tst_qsgitem.moc"
diff --git a/tests/auto/declarative/qsgitem2/data/childrenProperty.qml b/tests/auto/declarative/qsgitem2/data/childrenProperty.qml
new file mode 100644
index 0000000000..85ddbc1446
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/childrenProperty.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+
+    property bool test1: root.children.length == 3
+    property bool test2: root.children[0] == item1
+    property bool test3: root.children[1] == item2
+    property bool test4: root.children[2] == item3
+    property bool test5: root.children[3] == null
+
+    children: [ Item { id: item1 }, Item { id: item2 }, Item { id: item3 } ]
+}
+
diff --git a/tests/auto/declarative/qsgitem2/data/childrenRect.qml b/tests/auto/declarative/qsgitem2/data/childrenRect.qml
new file mode 100644
index 0000000000..ebc57aefbe
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/childrenRect.qml
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400
+    height: 400
+
+    property int childCount: 0;
+
+    Item {
+        objectName: "testItem"
+        width: childrenRect.width
+        height: childrenRect.height
+
+        Repeater {
+            id: repeater
+            model: childCount
+            delegate: Rectangle {
+                x: index*10
+                y: index*20
+                width: 10
+                height: 20
+
+                color: "red"
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/childrenRectBug.qml b/tests/auto/declarative/qsgitem2/data/childrenRectBug.qml
new file mode 100644
index 0000000000..86a4f19c5c
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/childrenRectBug.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400
+    height: 200
+
+    Item {
+        objectName: "theItem"
+        anchors.centerIn: parent
+        width: childrenRect.width
+        height: childrenRect.height
+        Rectangle {
+            id: text1
+            anchors.verticalCenter: parent.verticalCenter
+            width: 100; height: 100; color: "green"
+        }
+        Rectangle {
+            anchors.left: text1.right
+            anchors.verticalCenter: parent.verticalCenter
+            width: 100; height: 100; color: "green"
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/childrenRectBug2.qml b/tests/auto/declarative/qsgitem2/data/childrenRectBug2.qml
new file mode 100644
index 0000000000..6e80ed28af
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/childrenRectBug2.qml
@@ -0,0 +1,53 @@
+import QtQuick 2.0
+
+Rectangle {
+    width:360;
+    height: 200
+
+    Item {
+        objectName: "theItem"
+        anchors.centerIn: parent
+        width: childrenRect.width
+        height: childrenRect.height
+        Rectangle {
+            id: header1
+            anchors.horizontalCenter: parent.horizontalCenter
+            anchors.top: parent.top
+            width: 100; height: 50
+            color: "green"
+        }
+        Rectangle {
+            id: text1
+            anchors.top: header1.bottom
+            anchors.topMargin: 10
+            anchors.horizontalCenter: parent.horizontalCenter
+            width: 100; height: 50
+            color: "blue"
+        }
+    }
+
+    states: [
+    State {
+        name: "row"
+        AnchorChanges {
+            target: header1
+            anchors.horizontalCenter: undefined
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.left: parent.left
+            anchors.top: undefined
+        }
+        AnchorChanges {
+            target: text1
+            anchors.horizontalCenter: undefined
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.top: undefined
+            anchors.left: header1.right
+        }
+        PropertyChanges {
+            target: text1
+            anchors.leftMargin: 10
+            anchors.topMargin: 0
+        }
+    }
+    ]
+}
diff --git a/tests/auto/declarative/qsgitem2/data/childrenRectBug3.qml b/tests/auto/declarative/qsgitem2/data/childrenRectBug3.qml
new file mode 100644
index 0000000000..518e76509e
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/childrenRectBug3.qml
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 300
+    height: 300
+
+    Rectangle {
+        height: childrenRect.height
+
+        Repeater {
+            model: 1
+            Rectangle {	}
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/implicitsize.qml b/tests/auto/declarative/qsgitem2/data/implicitsize.qml
new file mode 100644
index 0000000000..cc6aaf7d60
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/implicitsize.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+Item {
+    implicitWidth: 200
+    implicitHeight: 100
+
+    width: 80
+    height: 60
+
+    function resetSize() {
+        width = undefined
+        height = undefined
+    }
+
+    function changeImplicit() {
+        implicitWidth = 150
+        implicitHeight = 80
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/keynavigationtest.qml b/tests/auto/declarative/qsgitem2/data/keynavigationtest.qml
new file mode 100644
index 0000000000..aacb621fb0
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/keynavigationtest.qml
@@ -0,0 +1,87 @@
+import QtQuick 2.0
+
+Grid {
+    columns: 2
+    width: 100; height: 100
+    function verify() {
+        if (item1.KeyNavigation.right != item2)
+            return false;
+        if (item1.KeyNavigation.down != item3)
+            return false;
+        if (item1.KeyNavigation.tab != item2)
+            return false;
+        if (item1.KeyNavigation.backtab != item4)
+            return false;
+
+        if (item2.KeyNavigation.left != item1)
+            return false;
+        if (item2.KeyNavigation.down != item4)
+            return false;
+        if (item2.KeyNavigation.tab != item3)
+            return false;
+        if (item2.KeyNavigation.backtab != item1)
+            return false;
+
+        if (item3.KeyNavigation.right != item4)
+            return false;
+        if (item3.KeyNavigation.up != item1)
+            return false;
+        if (item3.KeyNavigation.tab != item4)
+            return false;
+        if (item3.KeyNavigation.backtab != item2)
+            return false;
+
+        if (item4.KeyNavigation.left != item3)
+            return false;
+        if (item4.KeyNavigation.up != item2)
+            return false;
+        if (item4.KeyNavigation.tab != item1)
+            return false;
+        if (item4.KeyNavigation.backtab != item3)
+            return false;
+
+        return true;
+    }
+
+    Rectangle {
+        id: item1
+        objectName: "item1"
+        focus: true
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.right: item2
+        KeyNavigation.down: item3
+        KeyNavigation.tab: item2
+        KeyNavigation.backtab: item4
+    }
+    Rectangle {
+        id: item2
+        objectName: "item2"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.left: item1
+        KeyNavigation.down: item4
+        KeyNavigation.tab: item3
+        KeyNavigation.backtab: item1
+    }
+    Rectangle {
+        id: item3
+        objectName: "item3"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.right: item4
+        KeyNavigation.up: item1
+        KeyNavigation.tab: item4
+        KeyNavigation.backtab: item2
+    }
+    Rectangle {
+        id: item4
+        objectName: "item4"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.left: item3
+        KeyNavigation.up: item2
+        KeyNavigation.tab: item1
+        KeyNavigation.backtab: item3
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/keynavigationtest_implicit.qml b/tests/auto/declarative/qsgitem2/data/keynavigationtest_implicit.qml
new file mode 100644
index 0000000000..92d4ae23de
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/keynavigationtest_implicit.qml
@@ -0,0 +1,68 @@
+import QtQuick 2.0
+
+Grid {
+    columns: 2
+    width: 100; height: 100
+    function verify() {
+        if (item1.KeyNavigation.tab != item2)
+            return false;
+        if (item1.KeyNavigation.backtab != item4)
+            return false;
+
+        if (item2.KeyNavigation.left != item1)
+            return false;
+        if (item2.KeyNavigation.down != item4)
+            return false;
+        if (item2.KeyNavigation.tab != item3)
+            return false;
+        if (item2.KeyNavigation.backtab != item1)
+            return false;
+
+        if (item3.KeyNavigation.right != item4)
+            return false;
+        if (item3.KeyNavigation.up != item1)
+            return false;
+        if (item3.KeyNavigation.tab != item4)
+            return false;
+        if (item3.KeyNavigation.backtab != item2)
+            return false;
+
+        return true;
+    }
+
+    Rectangle {
+        id: item1
+        objectName: "item1"
+        focus: true
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.tab: item2
+        KeyNavigation.backtab: item4
+    }
+    Rectangle {
+        id: item2
+        objectName: "item2"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.left: item1
+        KeyNavigation.down: item4
+        KeyNavigation.tab: item3
+        KeyNavigation.backtab: item1
+    }
+    Rectangle {
+        id: item3
+        objectName: "item3"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+        KeyNavigation.right: item4
+        KeyNavigation.up: item1
+        KeyNavigation.tab: item4
+        KeyNavigation.backtab: item2
+    }
+    Rectangle {
+        id: item4
+        objectName: "item4"
+        width: 50; height: 50
+        color: focus ? "red" : "lightgray"
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/keyspriority.qml b/tests/auto/declarative/qsgitem2/data/keyspriority.qml
new file mode 100644
index 0000000000..114cf0488a
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/keyspriority.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+import Test 1.0
+
+KeyTestItem {
+    focus: true
+    Keys.onPressed: keysTestObject.keyPress(event.key, event.text, event.modifiers)
+    Keys.onReleased: { keysTestObject.keyRelease(event.key, event.text, event.modifiers); event.accepted = true; }
+    Keys.priority: keysTestObject.processLast ? Keys.AfterItem : Keys.BeforeItem
+}
diff --git a/tests/auto/declarative/qsgitem2/data/keystest.qml b/tests/auto/declarative/qsgitem2/data/keystest.qml
new file mode 100644
index 0000000000..c70e0061f5
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/keystest.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Item {
+    focus: true
+
+    property bool isEnabled: Keys.enabled
+
+    Keys.onPressed: keysTestObject.keyPress(event.key, event.text, event.modifiers)
+    Keys.onReleased: { keysTestObject.keyRelease(event.key, event.text, event.modifiers); event.accepted = true; }
+    Keys.onReturnPressed: keysTestObject.keyPress(event.key, "Return", event.modifiers)
+    Keys.onDigit0Pressed: keysTestObject.keyPress(event.key, event.text, event.modifiers)
+    Keys.onDigit9Pressed: { event.accepted = false; keysTestObject.keyPress(event.key, event.text, event.modifiers) }
+    Keys.onTabPressed: keysTestObject.keyPress(event.key, "Tab", event.modifiers)
+    Keys.onBacktabPressed: keysTestObject.keyPress(event.key, "Backtab", event.modifiers)
+    Keys.forwardTo: [ item2 ]
+    Keys.enabled: enableKeyHanding
+
+    Item {
+        id: item2
+        visible: forwardeeVisible
+        Keys.onPressed: keysTestObject.forwardedKey(event.key)
+        Keys.onReleased: keysTestObject.forwardedKey(event.key)
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/layoutmirroring.qml b/tests/auto/declarative/qsgitem2/data/layoutmirroring.qml
new file mode 100644
index 0000000000..036819740c
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/layoutmirroring.qml
@@ -0,0 +1,54 @@
+import QtQuick 2.0
+
+Item {
+    property bool childrenInherit: true
+    Item {
+        objectName: "mirrored1"
+        LayoutMirroring.enabled: true
+        LayoutMirroring.childrenInherit: parent.childrenInherit
+        Item {
+            Item {
+                objectName: "notMirrored1"
+                LayoutMirroring.enabled: false
+                Item {
+                    objectName: "inheritedMirror1"
+                }
+            }
+            Item {
+                objectName: "inheritedMirror2"
+            }
+        }
+    }
+    Item {
+        objectName: "mirrored2"
+        LayoutMirroring.enabled: true
+        LayoutMirroring.childrenInherit: false
+        Item {
+            objectName: "notMirrored2"
+        }
+    }
+    Item {
+        LayoutMirroring.enabled: true
+        LayoutMirroring.childrenInherit: true
+        Loader {
+            id: loader
+        }
+    }
+    states: State {
+        name: "newContent"
+        PropertyChanges {
+            target: loader
+            sourceComponent: component
+        }
+    }
+    Component {
+        id: component
+        Item {
+            objectName: "notMirrored3"
+            LayoutMirroring.enabled: false
+            Item {
+                objectName: "inheritedMirror3"
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/mapCoordinates.qml b/tests/auto/declarative/qsgitem2/data/mapCoordinates.qml
new file mode 100644
index 0000000000..a5a073c1a0
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/mapCoordinates.qml
@@ -0,0 +1,43 @@
+import QtQuick 2.0
+
+Item {
+    id: root; objectName: "root"
+    width: 200; height: 200
+
+    Item { id: itemA; objectName: "itemA"; x: 50; y: 50 }
+
+    Item {
+        x: 50; y: 50
+        Item { id: itemB; objectName: "itemB"; x: 100; y: 100 }
+    }
+
+    function mapAToB(x, y) {
+        var pos = itemA.mapToItem(itemB, x, y)
+        return Qt.point(pos.x, pos.y)
+    }
+
+    function mapAFromB(x, y) {
+        var pos = itemA.mapFromItem(itemB, x, y)
+        return Qt.point(pos.x, pos.y)
+    }
+
+    function mapAToNull(x, y) {
+        var pos = itemA.mapToItem(null, x, y)
+        return Qt.point(pos.x, pos.y)
+    }
+
+    function mapAFromNull(x, y) {
+        var pos = itemA.mapFromItem(null, x, y)
+        return Qt.point(pos.x, pos.y)
+    }
+
+    function checkMapAToInvalid(x, y) {
+        var pos = itemA.mapToItem(1122, x, y)
+        return pos.x == undefined && pos.y == undefined
+    }
+
+    function checkMapAFromInvalid(x, y) {
+        var pos = itemA.mapFromItem(1122, x, y)
+        return pos.x == undefined && pos.y == undefined
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/mouseFocus.qml b/tests/auto/declarative/qsgitem2/data/mouseFocus.qml
new file mode 100644
index 0000000000..b120cc0263
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/mouseFocus.qml
@@ -0,0 +1,20 @@
+import QtQuick 2.0
+
+QGraphicsWidget {
+    size: "200x100"
+    focusPolicy: QGraphicsWidget.ClickFocus
+    Item {
+        objectName: "declarativeItem"
+        id: item
+        width: 200
+        height: 100
+        MouseArea {
+            anchors.fill: parent
+            onPressed: {
+                if (!item.focus) {
+                    item.focus = true;
+                }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/propertychanges.qml b/tests/auto/declarative/qsgitem2/data/propertychanges.qml
new file mode 100644
index 0000000000..3fa5ea9c23
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/propertychanges.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Item {
+    Item {
+        objectName: "item"
+    }
+    Item {
+        objectName: "parentItem"
+    }
+}
diff --git a/tests/auto/declarative/qsgitem2/data/qtbug_16871.qml b/tests/auto/declarative/qsgitem2/data/qtbug_16871.qml
new file mode 100644
index 0000000000..f1e7377730
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/qtbug_16871.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Item {
+    children: [ 10 ]
+}
diff --git a/tests/auto/declarative/qsgitem2/data/resourcesProperty.qml b/tests/auto/declarative/qsgitem2/data/resourcesProperty.qml
new file mode 100644
index 0000000000..b8f18bb375
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/resourcesProperty.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+
+    property bool test1
+    property bool test2
+    property bool test3
+    property bool test4
+    property bool test5
+
+    Component.onCompleted: {
+        test1 = (root.resources.length >= 3)
+        test2 = root.resources[0] == item1
+        test3 = root.resources[1] == item2
+        test4 = root.resources[2] == item3
+        test5 = root.resources[10] == null
+    }
+
+    resources: [ Item { id: item1 }, Item { id: item2 }, Item { id: item3 } ]
+}
diff --git a/tests/auto/declarative/qsgitem2/data/transformCrash.qml b/tests/auto/declarative/qsgitem2/data/transformCrash.qml
new file mode 100644
index 0000000000..284e85f0e0
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/data/transformCrash.qml
@@ -0,0 +1,13 @@
+import QtQuick 2.0
+
+Item {
+    id: wrapper
+    width: 200
+    height: 200
+
+    QtObject {
+        id: object
+    }
+
+    Component.onCompleted: wrapper.transform = object
+}
diff --git a/tests/auto/declarative/qsgitem2/qsgitem.pro b/tests/auto/declarative/qsgitem2/qsgitem.pro
new file mode 100644
index 0000000000..b56eec3114
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/qsgitem.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgitem.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgitem2/tst_qsgitem.cpp b/tests/auto/declarative/qsgitem2/tst_qsgitem.cpp
new file mode 100644
index 0000000000..641abefa94
--- /dev/null
+++ b/tests/auto/declarative/qsgitem2/tst_qsgitem.cpp
@@ -0,0 +1,1322 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtTest/QSignalSpy>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgrectangle_p.h>
+#include <private/qsgitem_p.h>
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QSGItem : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_QSGItem();
+
+private slots:
+    void initTestCase();
+    void keys();
+    void keysProcessingOrder();
+    void keyNavigation();
+    void keyNavigation_RightToLeft();
+    void keyNavigation_skipNotVisible();
+    void keyNavigation_implicitSetting();
+    void layoutMirroring();
+    void layoutMirroringIllegalParent();
+    void smooth();
+    void clip();
+    void mapCoordinates();
+    void mapCoordinates_data();
+    void propertyChanges();
+    void transforms();
+    void transforms_data();
+    void childrenRect();
+    void childrenRectBug();
+    void childrenRectBug2();
+    void childrenRectBug3();
+
+    void childrenProperty();
+    void resourcesProperty();
+    void mouseFocus();
+
+    void transformCrash();
+    void implicitSize();
+    void qtbug_16871();
+private:
+    QDeclarativeEngine engine;
+};
+
+template<typename T>
+T *findItem(QSGItem *parent, const QString &objectName)
+{
+    if (!parent)
+        return 0;
+
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->QSGItem::children().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
+            return static_cast<T*>(item);
+        item = findItem<T>(item, objectName);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+class KeysTestObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
+
+public:
+    KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
+
+    void reset() {
+        mKey = 0;
+        mText = QString();
+        mModifiers = 0;
+        mForwardedKey = 0;
+    }
+
+    bool processLast() const { return mLast; }
+    void setProcessLast(bool b) {
+        if (b != mLast) {
+            mLast = b;
+            emit processLastChanged();
+        }
+    }
+
+public slots:
+    void keyPress(int key, QString text, int modifiers) {
+        mKey = key;
+        mText = text;
+        mModifiers = modifiers;
+    }
+    void keyRelease(int key, QString text, int modifiers) {
+        mKey = key;
+        mText = text;
+        mModifiers = modifiers;
+    }
+    void forwardedKey(int key) {
+        mForwardedKey = key;
+    }
+
+signals:
+    void processLastChanged();
+
+public:
+    int mKey;
+    QString mText;
+    int mModifiers;
+    int mForwardedKey;
+    bool mLast;
+
+private:
+};
+
+class KeyTestItem : public QSGItem
+{
+    Q_OBJECT
+public:
+    KeyTestItem(QSGItem *parent=0) : QSGItem(parent), mKey(0) {}
+
+protected:
+    void keyPressEvent(QKeyEvent *e) {
+        keyPressPreHandler(e);
+        if (e->isAccepted())
+            return;
+
+        mKey = e->key();
+
+        if (e->key() == Qt::Key_A)
+            e->accept();
+        else
+            e->ignore();
+
+        if (!e->isAccepted())
+            QSGItem::keyPressEvent(e);
+    }
+
+    void keyReleaseEvent(QKeyEvent *e) {
+        keyReleasePreHandler(e);
+
+        if (e->isAccepted())
+            return;
+
+        if (e->key() == Qt::Key_B)
+            e->accept();
+        else
+            e->ignore();
+
+        if (!e->isAccepted())
+            QSGItem::keyReleaseEvent(e);
+    }
+
+public:
+    int mKey;
+};
+
+QML_DECLARE_TYPE(KeyTestItem);
+
+
+tst_QSGItem::tst_QSGItem()
+{
+}
+
+void tst_QSGItem::initTestCase()
+{
+    qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
+}
+
+void tst_QSGItem::keys()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    KeysTestObject *testObject = new KeysTestObject;
+    canvas->rootContext()->setContextProperty("keysTestObject", testObject);
+
+    canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
+    canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QVERIFY(canvas->rootObject());
+    QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
+
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mText, QLatin1String("A"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(!key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mText, QLatin1String("A"));
+    QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_Return));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
+    QCOMPARE(testObject->mText, QLatin1String("Return"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_0));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
+    QCOMPARE(testObject->mText, QLatin1String("0"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_9));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
+    QCOMPARE(testObject->mText, QLatin1String("9"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(!key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
+    QCOMPARE(testObject->mText, QLatin1String("Tab"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
+    QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
+    QCOMPARE(testObject->mText, QLatin1String("Backtab"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mForwardedKey, 0);
+    QCOMPARE(testObject->mText, QLatin1String("A"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(!key.isAccepted());
+
+    testObject->reset();
+
+    canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
+    QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, 0);
+    QVERIFY(!key.isAccepted());
+
+    canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
+    QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_Return));
+    QVERIFY(key.isAccepted());
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGItem::keysProcessingOrder()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    KeysTestObject *testObject = new KeysTestObject;
+    canvas->rootContext()->setContextProperty("keysTestObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keyspriority.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
+    QVERIFY(testItem);
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mText, QLatin1String("A"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    testObject->setProcessLast(true);
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, 0);
+    QVERIFY(key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_B));
+    QCOMPARE(testObject->mText, QLatin1String("B"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(!key.isAccepted());
+
+    testObject->reset();
+
+    key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, 0);
+    QVERIFY(key.isAccepted());
+
+    delete canvas;
+    delete testObject;
+}
+
+QSGItemPrivate *childPrivate(QSGItem *rootItem, const char * itemString)
+{
+    QSGItem *item = findItem<QSGItem>(rootItem, QString(QLatin1String(itemString)));
+    QSGItemPrivate* itemPrivate = QSGItemPrivate::get(item);
+    return itemPrivate;
+}
+
+QVariant childProperty(QSGItem *rootItem, const char * itemString, const char * property)
+{
+    QSGItem *item = findItem<QSGItem>(rootItem, QString(QLatin1String(itemString)));
+    return item->property(property);
+}
+
+bool anchorsMirrored(QSGItem *rootItem, const char * itemString)
+{
+    QSGItem *item = findItem<QSGItem>(rootItem, QString(QLatin1String(itemString)));
+    QSGItemPrivate* itemPrivate = QSGItemPrivate::get(item);
+    return itemPrivate->anchors()->mirrored();
+}
+
+void tst_QSGItem::layoutMirroring()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/layoutmirroring.qml"));
+    canvas->show();
+
+    QSGItem *rootItem = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(rootItem);
+    QSGItemPrivate *rootPrivate = QSGItemPrivate::get(rootItem);
+    QVERIFY(rootPrivate);
+
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
+
+    QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
+    QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
+    QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
+    QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
+    QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
+    QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
+
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
+
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
+    QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
+
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
+
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
+
+    // load dynamic content using Loader that needs to inherit mirroring
+    rootItem->setProperty("state", "newContent");
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
+
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
+
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
+
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
+
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
+
+    // disable inheritance
+    rootItem->setProperty("childrenInherit", false);
+
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
+
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
+
+    // re-enable inheritance
+    rootItem->setProperty("childrenInherit", true);
+
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
+
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
+    QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
+    
+    //
+    // dynamic parenting
+    //
+    QSGItem *parentItem1 = new QSGItem();
+    QSGItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
+    QSGItemPrivate::get(parentItem1)->isMirrorImplicit = false;
+    QSGItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
+    QSGItemPrivate::get(parentItem1)->resolveLayoutMirror();
+
+    // inherit in constructor
+    QSGItem *childItem1 = new QSGItem(parentItem1);
+    QCOMPARE(QSGItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
+    QCOMPARE(QSGItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
+
+    // inherit through a parent change
+    QSGItem *childItem2 = new QSGItem();
+    QCOMPARE(QSGItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
+    QCOMPARE(QSGItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
+    childItem2->setParentItem(parentItem1);
+    QCOMPARE(QSGItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
+    QCOMPARE(QSGItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
+
+    // stop inherting through a parent change
+    QSGItem *parentItem2 = new QSGItem();
+    QSGItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
+    QSGItemPrivate::get(parentItem2)->resolveLayoutMirror();
+    childItem2->setParentItem(parentItem2);
+    QCOMPARE(QSGItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
+    QCOMPARE(QSGItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
+    
+    delete parentItem1;
+    delete parentItem2;
+}
+
+void tst_QSGItem::layoutMirroringIllegalParent()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
+    QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+}
+
+void tst_QSGItem::keyNavigation()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    QVariant result;
+    QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+            Q_RETURN_ARG(QVariant, result)));
+    QVERIFY(result.toBool());
+
+    // right
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // down
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // left
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // up
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // tab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // backtab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    delete canvas;
+}
+
+void tst_QSGItem::keyNavigation_RightToLeft()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGItem *rootItem = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(rootItem);
+    QSGItemPrivate* rootItemPrivate = QSGItemPrivate::get(rootItem);
+
+    rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
+    rootItemPrivate->isMirrorImplicit = false;
+    rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
+    rootItemPrivate->resolveLayoutMirror();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    QVariant result;
+    QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+            Q_RETURN_ARG(QVariant, result)));
+    QVERIFY(result.toBool());
+
+    // right
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // left
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    delete canvas;
+}
+
+void tst_QSGItem::keyNavigation_skipNotVisible()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // Set item 2 to not visible
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    item->setVisible(false);
+    QVERIFY(!item->isVisible());
+
+    // right
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // tab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // backtab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    //Set item 3 to not visible
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    item->setVisible(false);
+    QVERIFY(!item->isVisible());
+
+    // tab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // backtab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    delete canvas;
+}
+
+void tst_QSGItem::keyNavigation_implicitSetting()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest_implicit.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    QVariant result;
+    QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+            Q_RETURN_ARG(QVariant, result)));
+    QVERIFY(result.toBool());
+
+    // right
+    QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item1
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // down
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // move to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // left
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // up
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item2");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // tab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item1");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // back to item4
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item4");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    // backtab
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QVERIFY(key.isAccepted());
+
+    item = findItem<QSGItem>(canvas->rootObject(), "item3");
+    QVERIFY(item);
+    QVERIFY(item->hasActiveFocus());
+
+    delete canvas;
+}
+
+void tst_QSGItem::smooth()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
+
+    QVERIFY(item);
+    QVERIFY(!item->smooth());
+
+    item->setSmooth(true);
+    QVERIFY(item->smooth());
+    QCOMPARE(spy.count(),1);
+    QList<QVariant> arguments = spy.first();
+    QVERIFY(arguments.count() == 1);
+    QVERIFY(arguments.at(0).toBool() == true);
+
+    item->setSmooth(true);
+    QCOMPARE(spy.count(),1);
+
+    item->setSmooth(false);
+    QVERIFY(!item->smooth());
+    QCOMPARE(spy.count(),2);
+    item->setSmooth(false);
+    QCOMPARE(spy.count(),2);
+
+    delete item;
+}
+
+void tst_QSGItem::clip()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
+
+    QVERIFY(item);
+    QVERIFY(!item->clip());
+
+    item->setClip(true);
+    QVERIFY(item->clip());
+
+    QList<QVariant> arguments = spy.first();
+    QVERIFY(arguments.count() == 1);
+    QVERIFY(arguments.at(0).toBool() == true);
+
+    QCOMPARE(spy.count(),1);
+    item->setClip(true);
+    QCOMPARE(spy.count(),1);
+
+    item->setClip(false);
+    QVERIFY(!item->clip());
+    QCOMPARE(spy.count(),2);
+    item->setClip(false);
+    QCOMPARE(spy.count(),2);
+
+    delete item;
+}
+
+void tst_QSGItem::mapCoordinates()
+{
+    QFETCH(int, x);
+    QFETCH(int, y);
+
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(300, 300);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGItem *root = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(root != 0);
+    QSGItem *a = findItem<QSGItem>(canvas->rootObject(), "itemA");
+    QVERIFY(a != 0);
+    QSGItem *b = findItem<QSGItem>(canvas->rootObject(), "itemB");
+    QVERIFY(b != 0);
+
+    QVariant result;
+
+    QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QCOMPARE(result.value<QPointF>(), qobject_cast<QSGItem*>(a)->mapToItem(b, QPointF(x, y)));
+
+    QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QCOMPARE(result.value<QPointF>(), qobject_cast<QSGItem*>(a)->mapFromItem(b, QPointF(x, y)));
+
+    QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QCOMPARE(result.value<QPointF>(), qobject_cast<QSGItem*>(a)->mapToScene(QPointF(x, y)));
+
+    QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QCOMPARE(result.value<QPointF>(), qobject_cast<QSGItem*>(a)->mapFromScene(QPointF(x, y)));
+
+    QString warning1 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
+    QString warning2 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
+
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
+    QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QVERIFY(result.toBool());
+
+    QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
+    QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
+            Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
+    QVERIFY(result.toBool());
+
+    delete canvas;
+}
+
+void tst_QSGItem::mapCoordinates_data()
+{
+    QTest::addColumn<int>("x");
+    QTest::addColumn<int>("y");
+
+    for (int i=-20; i<=20; i+=10)
+        QTest::newRow(QTest::toString(i)) << i << i;
+}
+
+void tst_QSGItem::transforms_data()
+{
+    QTest::addColumn<QByteArray>("qml");
+    QTest::addColumn<QMatrix>("matrix");
+    QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
+        << QMatrix(1,0,0,1,10,20);
+    QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
+        << QMatrix(0,1,-1,0,0,0);
+    QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2  }")
+        << QMatrix(1.5,0,0,-2,0,0);
+    QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2  } ]")
+        << QMatrix(1,0,0,1,10,20) * QMatrix(1.5,0,0,-2,0,0);
+}
+
+void tst_QSGItem::transforms()
+{
+    QFAIL("This test has not been ported yet");
+    /*QFETCH(QByteArray, qml);
+    QFETCH(QMatrix, matrix);
+    QDeclarativeComponent component(&engine);
+    component.setData("import QtQuick 2.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(item->sceneMatrix(), matrix);*/
+}
+
+void tst_QSGItem::childrenProperty()
+{
+    QDeclarativeComponent component(&engine, SRCDIR "/data/childrenProperty.qml");
+    
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    QCOMPARE(o->property("test1").toBool(), true);
+    QCOMPARE(o->property("test2").toBool(), true);
+    QCOMPARE(o->property("test3").toBool(), true);
+    QCOMPARE(o->property("test4").toBool(), true);
+    QCOMPARE(o->property("test5").toBool(), true);
+    delete o;
+}
+
+void tst_QSGItem::resourcesProperty()
+{
+    QDeclarativeComponent component(&engine, SRCDIR "/data/resourcesProperty.qml");
+    
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    QCOMPARE(o->property("test1").toBool(), true);
+    QCOMPARE(o->property("test2").toBool(), true);
+    QCOMPARE(o->property("test3").toBool(), true);
+    QCOMPARE(o->property("test4").toBool(), true);
+    QCOMPARE(o->property("test5").toBool(), true);
+    delete o;
+}
+
+void tst_QSGItem::mouseFocus()
+{
+    QSGView *canvas = new QSGView(0);
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mouseFocus.qml"));
+    canvas->show();
+    QVERIFY(canvas->rootObject());
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "declarativeItem");
+    QVERIFY(item);
+    QSignalSpy focusSpy(item, SIGNAL(activeFocusChanged(bool)));
+
+    QTest::mouseClick(canvas, Qt::LeftButton, 0, item->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    QCOMPARE(focusSpy.count(), 1);
+    QVERIFY(item->hasActiveFocus());
+
+    // make sure focusable graphics widget underneath does not steal focus
+    QTest::mouseClick(canvas, Qt::LeftButton, 0, item->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    QCOMPARE(focusSpy.count(), 1);
+    QVERIFY(item->hasActiveFocus());
+
+    item->setFocus(false);
+    QVERIFY(!item->hasActiveFocus());
+    QCOMPARE(focusSpy.count(), 2);
+    item->setFocus(true);
+    QCOMPARE(focusSpy.count(), 3);
+
+    delete canvas;
+}
+
+void tst_QSGItem::propertyChanges()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
+    canvas->show();
+
+    QEvent wa(QEvent::WindowActivate);
+    QApplication::sendEvent(canvas, &wa);
+    QFocusEvent fe(QEvent::FocusIn);
+    QApplication::sendEvent(canvas, &fe);
+
+    QSGItem *item = findItem<QSGItem>(canvas->rootObject(), "item");
+    QSGItem *parentItem = findItem<QSGItem>(canvas->rootObject(), "parentItem");
+
+    QVERIFY(item);
+    QVERIFY(parentItem);
+
+    QSignalSpy parentSpy(item, SIGNAL(parentChanged(QSGItem *)));
+    QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
+    QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
+    QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
+    QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
+    QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
+    QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
+    QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
+    QSignalSpy xSpy(item, SIGNAL(xChanged()));
+    QSignalSpy ySpy(item, SIGNAL(yChanged()));
+
+    item->setParentItem(parentItem);
+    item->setWidth(100.0);
+    item->setHeight(200.0);
+    item->setFocus(true);
+    item->setBaselineOffset(10.0);
+
+    QCOMPARE(item->parentItem(), parentItem);
+    QCOMPARE(parentSpy.count(),1);
+    QList<QVariant> parentArguments = parentSpy.first();
+    QVERIFY(parentArguments.count() == 1);
+    QCOMPARE(item->parentItem(), qvariant_cast<QSGItem *>(parentArguments.at(0)));
+    QCOMPARE(childrenChangedSpy.count(),1);
+
+    item->setParentItem(parentItem);
+    QCOMPARE(childrenChangedSpy.count(),1);
+
+    QCOMPARE(item->width(), 100.0);
+    QCOMPARE(widthSpy.count(),1);
+
+    QCOMPARE(item->height(), 200.0);
+    QCOMPARE(heightSpy.count(),1);
+
+    QCOMPARE(item->baselineOffset(), 10.0);
+    QCOMPARE(baselineOffsetSpy.count(),1);
+    QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
+    QVERIFY(baselineOffsetArguments.count() == 1);
+    QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
+
+    QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
+    QCOMPARE(childrenRectSpy.count(),2);
+    QList<QVariant> childrenRectArguments = childrenRectSpy.at(1);
+    QVERIFY(childrenRectArguments.count() == 1);
+    QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
+
+    QCOMPARE(item->hasActiveFocus(), true);
+    QCOMPARE(focusSpy.count(),1);
+    QList<QVariant> focusArguments = focusSpy.first();
+    QVERIFY(focusArguments.count() == 1);
+    QCOMPARE(focusArguments.at(0).toBool(), true);
+
+    QCOMPARE(parentItem->hasActiveFocus(), false);
+    QCOMPARE(parentItem->hasFocus(), false);
+    QCOMPARE(wantsFocusSpy.count(),0);
+
+    item->setX(10.0);
+    QCOMPARE(item->x(), 10.0);
+    QCOMPARE(xSpy.count(), 1);
+
+    item->setY(10.0);
+    QCOMPARE(item->y(), 10.0);
+    QCOMPARE(ySpy.count(), 1);
+
+    delete canvas;
+}
+
+void tst_QSGItem::childrenRect()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRect.qml"));
+    canvas->show();
+
+    QSGItem *o = canvas->rootObject();
+    QSGItem *item = o->findChild<QSGItem*>("testItem");
+    QCOMPARE(item->width(), qreal(0));
+    QCOMPARE(item->height(), qreal(0));
+
+    o->setProperty("childCount", 1);
+    QCOMPARE(item->width(), qreal(10));
+    QCOMPARE(item->height(), qreal(20));
+
+    o->setProperty("childCount", 5);
+    QCOMPARE(item->width(), qreal(50));
+    QCOMPARE(item->height(), qreal(100));
+
+    o->setProperty("childCount", 0);
+    QCOMPARE(item->width(), qreal(0));
+    QCOMPARE(item->height(), qreal(0));
+
+    delete o;
+    delete canvas;
+}
+
+// QTBUG-11383
+void tst_QSGItem::childrenRectBug()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml"));
+    canvas->show();
+
+    QSGItem *o = canvas->rootObject();
+    QSGItem *item = o->findChild<QSGItem*>("theItem");
+    QCOMPARE(item->width(), qreal(200));
+    QCOMPARE(item->height(), qreal(100));
+    QCOMPARE(item->x(), qreal(100));
+
+    delete canvas;
+}
+
+// QTBUG-11465
+void tst_QSGItem::childrenRectBug2()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug2.qml"));
+    canvas->show();
+
+    QSGRectangle *rect = qobject_cast<QSGRectangle*>(canvas->rootObject());
+    QVERIFY(rect);
+    QSGItem *item = rect->findChild<QSGItem*>("theItem");
+    QCOMPARE(item->width(), qreal(100));
+    QCOMPARE(item->height(), qreal(110));
+    QCOMPARE(item->x(), qreal(130));
+
+    QSGItemPrivate *rectPrivate = QSGItemPrivate::get(rect);
+    rectPrivate->setState("row");
+    QCOMPARE(item->width(), qreal(210));
+    QCOMPARE(item->height(), qreal(50));
+    QCOMPARE(item->x(), qreal(75));
+
+    delete canvas;
+}
+
+// QTBUG-12722
+void tst_QSGItem::childrenRectBug3()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug3.qml"));
+    canvas->show();
+
+    //don't crash on delete
+    delete canvas;
+}
+
+// QTBUG-13893
+void tst_QSGItem::transformCrash()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/transformCrash.qml"));
+    canvas->show();
+
+    delete canvas;
+}
+
+void tst_QSGItem::implicitSize()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml"));
+    canvas->show();
+
+    QSGItem *item = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(item);
+    QCOMPARE(item->width(), qreal(80));
+    QCOMPARE(item->height(), qreal(60));
+
+    QCOMPARE(item->implicitWidth(), qreal(200));
+    QCOMPARE(item->implicitHeight(), qreal(100));
+
+    QMetaObject::invokeMethod(item, "resetSize");
+
+    QCOMPARE(item->width(), qreal(200));
+    QCOMPARE(item->height(), qreal(100));
+
+    QMetaObject::invokeMethod(item, "changeImplicit");
+
+    QCOMPARE(item->implicitWidth(), qreal(150));
+    QCOMPARE(item->implicitHeight(), qreal(80));
+    QCOMPARE(item->width(), qreal(150));
+    QCOMPARE(item->height(), qreal(80));
+
+    delete canvas;
+}
+
+void tst_QSGItem::qtbug_16871()
+{
+    QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml");
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+    delete o;
+}
+
+QTEST_MAIN(tst_QSGItem)
+
+#include "tst_qsgitem.moc"
diff --git a/tests/auto/declarative/qsglistview/data/attachedSignals.qml b/tests/auto/declarative/qsglistview/data/attachedSignals.qml
new file mode 100644
index 0000000000..2c3c0bbada
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/attachedSignals.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+ListView {
+    id: view
+    width: 240; height: 320
+
+    property variant addedDelegates: []
+    property int removedDelegateCount
+
+    model: testModel
+
+    delegate: Rectangle {
+        width: 200; height: delegateHeight
+        border.width: 1
+        ListView.onAdd: {
+            var obj = ListView.view.addedDelegates
+            obj.push(model.name)
+            ListView.view.addedDelegates = obj
+        }
+        ListView.onRemove: {
+            view.removedDelegateCount += 1
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/displaylist.qml b/tests/auto/declarative/qsglistview/data/displaylist.qml
new file mode 100644
index 0000000000..c083da5aa5
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/displaylist.qml
@@ -0,0 +1,50 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    property real delegateHeight: 20
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: root.delegateHeight
+                Behavior on height { NumberAnimation {} }
+                width: 240
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 30
+                    objectName: "displayText"
+                    text: display
+                }
+                Text {
+                    x: 200
+                    text: wrapper.y
+                }
+                color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        },
+        Component {
+            id: myHighlight
+            Rectangle { color: "green" }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        highlight: myHighlight
+        highlightMoveSpeed: 1000
+        highlightResizeSpeed: 1000
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/footer.qml b/tests/auto/declarative/qsglistview/data/footer.qml
new file mode 100644
index 0000000000..49e1944b6a
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/footer.qml
@@ -0,0 +1,38 @@
+import QtQuick 2.0
+
+Rectangle {
+    function changeFooter() {
+        list.footer = footer2
+    }
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            height: 20
+            width: 240
+            Text {
+                text: index
+            }
+            color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+        }
+    }
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        footer: Text { objectName: "footer"; text: "Footer"; height: 30 }
+    }
+
+    Component {
+        id: footer2
+        Text { objectName: "footer2"; text: "Footer 2"; height: 20 }
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/header.qml b/tests/auto/declarative/qsglistview/data/header.qml
new file mode 100644
index 0000000000..455159f39d
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/header.qml
@@ -0,0 +1,38 @@
+import QtQuick 2.0
+
+Rectangle {
+    function changeHeader() {
+        list.header = header2
+    }
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            height: 30
+            width: 240
+            Text {
+                text: index
+            }
+            color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+        }
+    }
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        snapMode: ListView.SnapToItem
+        model: testModel
+        delegate: myDelegate
+        header: Text { objectName: "header"; text: "Header"; height: 20 }
+    }
+    Component {
+        id: header2
+        Text { objectName: "header2"; text: "Header 2"; height: 10 }
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/header1.qml b/tests/auto/declarative/qsglistview/data/header1.qml
new file mode 100644
index 0000000000..8ba6e57594
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/header1.qml
@@ -0,0 +1,33 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+
+    ListModel { id: testModel }
+
+    ListView {
+        id: list
+        objectName: "list"
+        width: parent.width
+        anchors.top: parent.top
+        anchors.bottom: parent.bottom
+        model: testModel
+        delegate: Text {
+            objectName: "wrapper"
+            font.pointSize: 20
+            text: index
+        }
+        footer: Rectangle {
+            width: parent.width
+            height: 40
+            color: "green"
+        }
+        header: Text { objectName: "header"; text: "Header" }
+    }
+
+    Component.onCompleted: {
+        for (var i=0; i<30; i++) testModel.append({"name" : i, "val": i})
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/headerfooter.qml b/tests/auto/declarative/qsglistview/data/headerfooter.qml
new file mode 100644
index 0000000000..30b7199445
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/headerfooter.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.0
+
+ListView {
+    id: view
+    property bool horizontal: false
+    property bool rtl: false
+    width: 240
+    height: 320
+    
+    orientation: horizontal ? ListView.Horizontal : ListView.Vertical
+    header: Rectangle {
+        objectName: "header"
+        width: horizontal ? 20 : view.width
+        height: horizontal ? view.height : 20
+        color: "red"
+    }
+    footer: Rectangle {
+        objectName: "footer"
+        width: horizontal ? 30 : view.width
+        height: horizontal ? view.height : 30
+        color: "blue"
+    }
+//    model: testModel
+    delegate: Text { width: 30; height: 30; text: index + "(" + x + ")" }
+    layoutDirection: rtl ? Qt.RightToLeft : Qt.LeftToRight
+}
diff --git a/tests/auto/declarative/qsglistview/data/itemlist.qml b/tests/auto/declarative/qsglistview/data/itemlist.qml
new file mode 100644
index 0000000000..90dd59795b
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/itemlist.qml
@@ -0,0 +1,43 @@
+// This example demonstrates placing items in a view using
+// a VisualItemModel
+
+import QtQuick 2.0
+
+Rectangle {
+    color: "lightgray"
+    width: 240
+    height: 320
+
+    VisualItemModel {
+        id: itemModel
+        objectName: "itemModel"
+        Rectangle {
+            objectName: "item1"
+            height: ListView.view.height; width: view.width; color: "#FFFEF0"
+            Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item2"
+            height: ListView.view.height; width: view.width; color: "#F0FFF7"
+            Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item3"
+            height: ListView.view.height; width: view.width; color: "#F4F0FF"
+            Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+    }
+
+    ListView {
+        id: view
+        objectName: "view"
+        anchors.fill: parent
+        anchors.bottomMargin: 30
+        model: itemModel
+        preferredHighlightBegin: 0
+        preferredHighlightEnd: 0
+        highlightRangeMode: "StrictlyEnforceRange"
+        orientation: ListView.Horizontal
+        flickDeceleration: 2000
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listview-enforcerange.qml b/tests/auto/declarative/qsglistview/data/listview-enforcerange.qml
new file mode 100644
index 0000000000..f1bf6c2b57
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listview-enforcerange.qml
@@ -0,0 +1,55 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Item {
+            id: wrapper
+            objectName: "wrapper"
+            height: 20
+            width: 240
+            Text {
+                text: index
+            }
+            Text {
+                x: 30
+                id: textName
+                objectName: "textName"
+                text: name
+            }
+            Text {
+                x: 120
+                id: textNumber
+                objectName: "textNumber"
+                text: number
+            }
+            Text {
+                x: 200
+                text: wrapper.y
+            }
+        }
+    }
+
+    Component {
+        id: myHighlight
+        Rectangle {
+            color: "lightsteelblue"
+        }
+    }
+        
+    ListView {
+        id: list
+        objectName: "list"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        highlight: myHighlight
+        preferredHighlightBegin: 100
+        preferredHighlightEnd: 100
+        highlightRangeMode: "StrictlyEnforceRange"
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listview-initCurrent.qml b/tests/auto/declarative/qsglistview/data/listview-initCurrent.qml
new file mode 100644
index 0000000000..ee1a333de0
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listview-initCurrent.qml
@@ -0,0 +1,51 @@
+import QtQuick 2.0
+
+Rectangle {
+    property int current: list.currentIndex
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20
+                width: 240
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 30
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    x: 120
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                Text {
+                    x: 200
+                    text: wrapper.y
+                }
+                color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        currentIndex: 20
+        width: 240
+        height: 320
+        keyNavigationWraps: testWrap
+        delegate: myDelegate
+        highlightMoveSpeed: 1000
+        model: testModel
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listview-noCurrent.qml b/tests/auto/declarative/qsglistview/data/listview-noCurrent.qml
new file mode 100644
index 0000000000..079966d8e4
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listview-noCurrent.qml
@@ -0,0 +1,50 @@
+import QtQuick 2.0
+
+Rectangle {
+    property int current: list.currentIndex
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20
+                width: 240
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 30
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    x: 120
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                Text {
+                    x: 200
+                    text: wrapper.y
+                }
+                color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        currentIndex: -1
+        width: 240
+        height: 320
+        delegate: myDelegate
+        highlightMoveSpeed: 1000
+        model: testModel
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listview-sections.qml b/tests/auto/declarative/qsglistview/data/listview-sections.qml
new file mode 100644
index 0000000000..d5b8a4400d
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listview-sections.qml
@@ -0,0 +1,64 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Item {
+                id: wrapper
+                objectName: "wrapper"
+                height: ListView.previousSection != ListView.section ? 40 : 20;
+                width: 240
+                Rectangle {
+                    y: wrapper.ListView.previousSection != wrapper.ListView.section ? 20 : 0
+                    height: 20
+                    width: parent.width
+                    color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white"
+                    Text {
+                        text: index
+                    }
+                    Text {
+                        x: 30
+                        id: textName
+                        objectName: "textName"
+                        text: name
+                    }
+                    Text {
+                        x: 100
+                        id: textNumber
+                        objectName: "textNumber"
+                        text: number
+                    }
+                    Text {
+                        objectName: "nextSection"
+                        x: 150
+                        text: wrapper.ListView.nextSection
+                    }
+                    Text {
+                        x: 200
+                        text: wrapper.y
+                    }
+                }
+                Rectangle {
+                    color: "#99bb99"
+                    height: wrapper.ListView.previousSection != wrapper.ListView.section ? 20 : 0
+                    width: parent.width
+                    visible: wrapper.ListView.previousSection != wrapper.ListView.section ? true : false
+                    Text { text: wrapper.ListView.section }
+                }
+            }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        section.property: "number"
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listview-sections_delegate.qml b/tests/auto/declarative/qsglistview/data/listview-sections_delegate.qml
new file mode 100644
index 0000000000..82f332c951
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listview-sections_delegate.qml
@@ -0,0 +1,69 @@
+import QtQuick 2.0
+
+Rectangle {
+    property string sectionProperty: "number"
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: myDelegate
+            Item {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20;
+                width: 240
+                Rectangle {
+                    height: 20
+                    width: parent.width
+                    color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white"
+                    Text {
+                        text: index
+                    }
+                    Text {
+                        x: 30
+                        id: textName
+                        objectName: "textName"
+                        text: name
+                    }
+                    Text {
+                        x: 100
+                        id: textNumber
+                        objectName: "textNumber"
+                        text: number
+                    }
+                    Text {
+                        objectName: "nextSection"
+                        x: 150
+                        text: wrapper.ListView.nextSection
+                    }
+                    Text {
+                        x: 200
+                        text: wrapper.y
+                    }
+                }
+                ListView.onRemove: SequentialAnimation {
+                    PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true }
+                    NumberAnimation { target: wrapper; property: "height"; to: 0; duration: 100; easing.type: Easing.InOutQuad }
+                    PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false }
+                }
+            }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+        section.property: sectionProperty
+        section.delegate: Rectangle {
+            objectName: "sect_" + section
+            color: "#99bb99"
+            height: 20
+            width: list.width
+            Text { text: section }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/listviewtest.qml b/tests/auto/declarative/qsglistview/data/listviewtest.qml
new file mode 100644
index 0000000000..832eaafa0f
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/listviewtest.qml
@@ -0,0 +1,132 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    width: 240
+    height: 320
+    color: "#ffffff"
+
+    property bool showHeader: false
+    property bool showFooter: false
+    property real hr: list.visibleArea.heightRatio
+    function heightRatio() {
+        return list.visibleArea.heightRatio
+    }
+
+    function checkProperties() {
+        testObject.error = false;
+        if (list.model != testModel) {
+            console.log("model property incorrect");
+            testObject.error = true;
+        }
+        if (!testObject.animate && list.delegate != myDelegate) {
+            console.log("delegate property incorrect - expected myDelegate");
+            testObject.error = true;
+        }
+        if (testObject.animate && list.delegate != animatedDelegate) {
+            console.log("delegate property incorrect - expected animatedDelegate");
+            testObject.error = true;
+        }
+        if (testObject.invalidHighlight && list.highlight != invalidHl) {
+            console.log("highlight property incorrect - expected invalidHl");
+            testObject.error = true;
+        }
+        if (!testObject.invalidHighlight && list.highlight != myHighlight) {
+            console.log("highlight property incorrect - expected myHighlight");
+            testObject.error = true;
+        }
+    }
+    resources: [
+        Component {
+            id: myDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20
+                width: 240
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 30
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    x: 120
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                Text {
+                    x: 200
+                    text: wrapper.y
+                }
+                color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+            }
+        },
+        Component {
+            id: animatedDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20
+                width: 240
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 30
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    x: 120
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                Text {
+                    x: 200
+                    text: wrapper.y
+                }
+                color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+                ListView.onRemove: SequentialAnimation {
+                    PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true }
+                    NumberAnimation { target: wrapper; property: "scale"; to: 0; duration: 250; easing.type: "InOutQuad" }
+                    PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false }
+
+                }
+            }
+        },
+        Component {
+            id: myHighlight
+            Rectangle { color: "green" }
+        },
+        Component {
+            id: invalidHl
+            SmoothedAnimation {}
+        },
+        Component {
+            id: headerFooter
+            Rectangle { height: 30; width: 240; color: "blue" }
+        }
+    ]
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        model: testModel
+        delegate: testObject.animate ? animatedDelegate : myDelegate
+        highlight: testObject.invalidHighlight ? invalidHl : myHighlight
+        highlightMoveSpeed: 1000
+        highlightResizeSpeed: 1000
+        cacheBuffer: testObject.cacheBuffer
+        header: root.showHeader ? headerFooter : null
+        footer: root.showFooter ? headerFooter : null
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/manual-highlight.qml b/tests/auto/declarative/qsglistview/data/manual-highlight.qml
new file mode 100644
index 0000000000..aac4599f01
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/manual-highlight.qml
@@ -0,0 +1,47 @@
+import QtQuick 2.0
+
+Item {
+
+    ListModel {
+        id: model
+        ListElement {
+            name: "Bill Smith"
+            number: "555 3264"
+        }
+        ListElement {
+            name: "John Brown"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Sam Wise"
+            number: "555 0473"
+        }
+        ListElement {
+            name: "Bob Brown"
+            number: "555 5845"
+        }
+    }
+
+    Component {
+        id: highlight
+        Rectangle {
+            objectName: "highlight"
+            width: 180; height: 20
+            color: "lightsteelblue"; radius: 5
+            y: list.currentItem.y+5
+        }
+    }
+
+    ListView {
+        id: list
+        objectName: "list"
+        anchors.fill: parent
+        model: model
+        delegate: Text { objectName: "wrapper"; text: name }
+
+        highlight: highlight
+        highlightFollowsCurrentItem: false
+        focus: true
+    }
+
+}
diff --git a/tests/auto/declarative/qsglistview/data/propertychangestest.qml b/tests/auto/declarative/qsglistview/data/propertychangestest.qml
new file mode 100644
index 0000000000..146f3f13b0
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/propertychangestest.qml
@@ -0,0 +1,71 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 180; height: 120; color: "white"
+    Component {
+        id: delegate
+        Item {
+            id: wrapper
+            width: 180; height: 40; 
+            Column {
+                x: 5; y: 5
+                Text { text: '<b>Name:</b> ' + name }
+                Text { text: '<b>Number:</b> ' + number }
+            }
+        }
+    }
+    Component {
+        id: highlightRed
+        Rectangle {
+            color: "red"
+            radius: 10
+            opacity: 0.5
+        }
+    }
+    ListView {
+        objectName: "listView"
+        anchors.fill: parent
+        model: listModel
+        delegate: delegate
+        highlight: highlightRed
+        focus: true
+        highlightFollowsCurrentItem: true
+        preferredHighlightBegin: 0.0
+        preferredHighlightEnd: 0.0
+        highlightRangeMode: ListView.ApplyRange
+        keyNavigationWraps: true
+        cacheBuffer: 10
+        snapMode: ListView.SnapToItem
+    }
+
+    data:[  
+        ListModel {
+            id: listModel
+            ListElement {
+                name: "Bill Smith"
+                number: "555 3264"
+            }
+            ListElement {
+                name: "John Brown"
+                number: "555 8426"
+            }
+            ListElement {
+               name: "Sam Wise"
+                number: "555 0473"
+            }
+        },
+        ListModel {
+            objectName: "alternateModel"
+            ListElement {
+                name: "Jack"
+                number: "555 8426"
+            }
+            ListElement {
+                name: "Mary"
+                number: "555 3264"
+            }
+        }
+    ]
+}
+ 
+ 
diff --git a/tests/auto/declarative/qsglistview/data/qtbug14821.qml b/tests/auto/declarative/qsglistview/data/qtbug14821.qml
new file mode 100644
index 0000000000..0a5e0acbb4
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/qtbug14821.qml
@@ -0,0 +1,31 @@
+import QtQuick 2.0
+
+ListView {
+    id: view
+    width: 300; height: 200
+    focus: true
+    keyNavigationWraps: true
+
+    model: 100
+
+    preferredHighlightBegin: 90
+    preferredHighlightEnd:   110
+
+    highlightRangeMode: ListView.StrictlyEnforceRange
+    highlight: Component {
+        Rectangle {
+            border.color: "blue"
+            border.width: 3
+            color: "transparent"
+            width: 300; height: 15
+        }
+    }
+
+    delegate: Component {
+           Item {
+               height: 15 + (view.currentIndex == index ? 20 : 0)
+               width: 200
+               Text { text: 'Index: ' + index; anchors.verticalCenter: parent.verticalCenter }
+           }
+       }
+}
diff --git a/tests/auto/declarative/qsglistview/data/qtbug16037.qml b/tests/auto/declarative/qsglistview/data/qtbug16037.qml
new file mode 100644
index 0000000000..21faeb3f32
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/qtbug16037.qml
@@ -0,0 +1,37 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+
+    function setModel() {
+        listView.model = listModel1
+    }
+
+    ListModel {
+        id: listModel1
+        ListElement { text: "Apple" }
+        ListElement { text: "Banana" }
+        ListElement { text: "Orange" }
+        ListElement { text: "Coconut" }
+    }
+
+    Rectangle {
+        width: 200
+        height: listView.contentHeight
+        color: "yellow"
+        anchors.centerIn: parent
+
+        ListView {
+            id: listView
+            objectName: "listview"
+            anchors.fill: parent
+
+            delegate: Item {
+                width: 200
+                height: 20
+                Text { text: model.text; anchors.centerIn: parent }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/rightToLeft.qml b/tests/auto/declarative/qsglistview/data/rightToLeft.qml
new file mode 100644
index 0000000000..6d77de26f4
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/rightToLeft.qml
@@ -0,0 +1,42 @@
+// This example demonstrates how item positioning
+// changes in right-to-left layout direction
+
+import QtQuick 2.0
+
+Rectangle {
+    color: "lightgray"
+    width: 640
+    height: 320
+
+    VisualItemModel {
+        id: itemModel
+        objectName: "itemModel"
+        Rectangle {
+            objectName: "item1"
+            height: view.height; width: 100; color: "#FFFEF0"
+            Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item2"
+            height: view.height; width: 200; color: "#F0FFF7"
+            Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item3"
+            height: view.height; width: 240; color: "#F4F0FF"
+            Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+    }
+
+    ListView {
+        id: view
+        objectName: "view"
+        anchors.fill: parent
+        anchors.bottomMargin: 30
+        model: itemModel
+        highlightRangeMode: "StrictlyEnforceRange"
+        orientation: ListView.Horizontal
+        flickDeceleration: 2000
+        layoutDirection: Qt.RightToLeft
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/sizelessthan1.qml b/tests/auto/declarative/qsglistview/data/sizelessthan1.qml
new file mode 100644
index 0000000000..aa9dc20ae9
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/sizelessthan1.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            height: 0.5
+            width: 240
+            color: ((index % 2) == 1 ? "red" : "blue")
+        }
+    }
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+    }
+}
diff --git a/tests/auto/declarative/qsglistview/data/strictlyenforcerange.qml b/tests/auto/declarative/qsglistview/data/strictlyenforcerange.qml
new file mode 100644
index 0000000000..7960ac4abb
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/data/strictlyenforcerange.qml
@@ -0,0 +1,29 @@
+import QtQuick 2.0
+
+ListView {
+    id: list
+    objectName: "list"
+    width: 320
+    height: 480
+
+    function fillModel() {
+        list.model.append({"col": "red"});
+        list.currentIndex = list.count-1
+        list.model.append({"col": "blue"});
+        list.currentIndex = list.count-1
+        list.model.append({"col": "green"});
+        list.currentIndex = list.count-1
+    }
+
+    model: ListModel { id: listModel }  // empty model
+    delegate: Rectangle { id: wrapper; objectName: "wrapper"; color: col; width: 300; height: 400 }
+    orientation: "Horizontal"
+    snapMode: "SnapToItem"
+    cacheBuffer: 1000
+
+    preferredHighlightBegin: 10
+    preferredHighlightEnd: 10
+
+    highlightRangeMode: "StrictlyEnforceRange"
+    focus: true
+}
diff --git a/tests/auto/declarative/qsglistview/incrementalmodel.cpp b/tests/auto/declarative/qsglistview/incrementalmodel.cpp
new file mode 100644
index 0000000000..cd0512fb06
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/incrementalmodel.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "incrementalmodel.h"
+#include <QApplication>
+#include <QDebug>
+
+IncrementalModel::IncrementalModel(QObject *parent)
+    : QAbstractListModel(parent), count(0)
+{
+    for (int i = 0; i < 100; ++i)
+        list.append("Item " + QString::number(i));
+}
+
+int IncrementalModel::rowCount(const QModelIndex & /* parent */) const
+{
+    return count;
+}
+
+QVariant IncrementalModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid())
+        return QVariant();
+    
+    if (index.row() >= list.size() || index.row() < 0)
+        return QVariant();
+    
+    if (role == Qt::DisplayRole)
+        return list.at(index.row());
+    return QVariant();
+}
+
+bool IncrementalModel::canFetchMore(const QModelIndex & /* index */) const
+{
+    if (count < list.size())
+        return true;
+    else
+        return false;
+}
+
+void IncrementalModel::fetchMore(const QModelIndex & /* index */)
+{
+    int remainder = list.size() - count;
+    int itemsToFetch = qMin(5, remainder);
+
+    beginInsertRows(QModelIndex(), count, count+itemsToFetch-1);
+    
+    count += itemsToFetch;
+
+    endInsertRows();
+}
diff --git a/tests/auto/declarative/qsglistview/incrementalmodel.h b/tests/auto/declarative/qsglistview/incrementalmodel.h
new file mode 100644
index 0000000000..9c4e7ddd4a
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/incrementalmodel.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef IncrementalModel_H
+#define IncrementalModel_H
+
+#include <QAbstractListModel>
+#include <QList>
+#include <QStringList>
+
+class IncrementalModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+public:
+    IncrementalModel(QObject *parent = 0);
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+protected:
+    bool canFetchMore(const QModelIndex &parent) const;
+    void fetchMore(const QModelIndex &parent);
+
+private:
+    QStringList list;
+    int count;
+};
+
+#endif
diff --git a/tests/auto/declarative/qsglistview/qsglistview.pro b/tests/auto/declarative/qsglistview/qsglistview.pro
new file mode 100644
index 0000000000..84b955eb55
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/qsglistview.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+macx:CONFIG -= app_bundle
+
+HEADERS += incrementalmodel.h
+SOURCES += tst_qsglistview.cpp incrementalmodel.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
diff --git a/tests/auto/declarative/qsglistview/tst_qsglistview.cpp b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp
new file mode 100644
index 0000000000..f697e61208
--- /dev/null
+++ b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp
@@ -0,0 +1,2698 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/QStringListModel>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/private/qsgitem_p.h>
+#include <QtDeclarative/private/qsglistview_p.h>
+#include <QtDeclarative/private/qsgtext_p.h>
+#include <QtDeclarative/private/qsgvisualitemmodel_p.h>
+#include <QtDeclarative/private/qdeclarativelistmodel_p.h>
+#include <QtDeclarative/private/qlistmodelinterface_p.h>
+#include "../../../shared/util.h"
+#include "incrementalmodel.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QSGListView : public QObject
+{
+    Q_OBJECT
+public:
+    tst_QSGListView();
+
+private slots:
+    // Test both QListModelInterface and QAbstractItemModel model types
+    void qListModelInterface_items();
+    void qAbstractItemModel_items();
+
+    void qListModelInterface_changed();
+    void qAbstractItemModel_changed();
+
+    void qListModelInterface_inserted();
+    void qAbstractItemModel_inserted();
+
+    void qListModelInterface_removed();
+    void qAbstractItemModel_removed();
+
+    void qListModelInterface_moved();
+    void qAbstractItemModel_moved();
+
+    void qListModelInterface_clear();
+    void qAbstractItemModel_clear();
+
+    void itemList();
+    void currentIndex();
+    void noCurrentIndex();
+    void enforceRange();
+    void spacing();
+    void sections();
+    void sectionsDelegate();
+    void cacheBuffer();
+    void positionViewAtIndex();
+    void resetModel();
+    void propertyChanges();
+    void componentChanges();
+    void modelChanges();
+    void QTBUG_9791();
+    void manualHighlight();
+    void QTBUG_11105();
+    void header();
+    void footer();
+    void headerFooter();
+    void resizeView();
+    void sizeLessThan1();
+    void QTBUG_14821();
+    void resizeDelegate();
+    void QTBUG_16037();
+    void indexAt();
+    void incrementalModel();
+    void onAdd();
+    void onAdd_data();
+    void onRemove();
+    void onRemove_data();
+    void rightToLeft();
+    void test_mirroring();
+
+private:
+    template <class T> void items();
+    template <class T> void changed();
+    template <class T> void inserted();
+    template <class T> void removed(bool animated);
+    template <class T> void moved();
+    template <class T> void clear();
+    QSGView *createView();
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &id, int index=-1);
+    template<typename T>
+    QList<T*> findItems(QSGItem *parent, const QString &objectName);
+    void dumpTree(QSGItem *parent, int depth = 0);
+};
+
+class TestObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool error READ error WRITE setError NOTIFY changedError)
+    Q_PROPERTY(bool animate READ animate NOTIFY changedAnim)
+    Q_PROPERTY(bool invalidHighlight READ invalidHighlight NOTIFY changedHl)
+    Q_PROPERTY(int cacheBuffer READ cacheBuffer NOTIFY changedCacheBuffer)
+
+public:
+    TestObject(QObject *parent = 0)
+        : QObject(parent), mError(true), mAnimate(false), mInvalidHighlight(false)
+        , mCacheBuffer(0) {}
+
+    bool error() const { return mError; }
+    void setError(bool err) { mError = err; emit changedError(); }
+
+    bool animate() const { return mAnimate; }
+    void setAnimate(bool anim) { mAnimate = anim; emit changedAnim(); }
+
+    bool invalidHighlight() const { return mInvalidHighlight; }
+    void setInvalidHighlight(bool invalid) { mInvalidHighlight = invalid; emit changedHl(); }
+
+    int cacheBuffer() const { return mCacheBuffer; }
+    void setCacheBuffer(int buffer) { mCacheBuffer = buffer; emit changedCacheBuffer(); }
+
+signals:
+    void changedError();
+    void changedAnim();
+    void changedHl();
+    void changedCacheBuffer();
+
+public:
+    bool mError;
+    bool mAnimate;
+    bool mInvalidHighlight;
+    int mCacheBuffer;
+};
+
+class TestModel : public QListModelInterface
+{
+    Q_OBJECT
+public:
+    TestModel(QObject *parent = 0) : QListModelInterface(parent) {}
+    ~TestModel() {}
+
+    enum Roles { Name, Number };
+
+    QString name(int index) const { return list.at(index).first; }
+    QString number(int index) const { return list.at(index).second; }
+
+    int count() const { return list.count(); }
+
+    QList<int> roles() const { return QList<int>() << Name << Number; }
+    QString toString(int role) const {
+        switch(role) {
+        case Name:
+            return "name";
+        case Number:
+            return "number";
+        default:
+            return "";
+        }
+    }
+
+    QVariant data(int index, int role) const
+    {
+        if (role==0)
+            return list.at(index).first;
+        if (role==1)
+            return list.at(index).second;
+        return QVariant();
+    }
+    QHash<int, QVariant> data(int index, const QList<int> &roles) const {
+        QHash<int,QVariant> returnHash;
+
+        for (int i = 0; i < roles.size(); ++i) {
+            int role = roles.at(i);
+            QVariant info;
+            switch(role) {
+            case Name:
+                info = list.at(index).first;
+                break;
+            case Number:
+                info = list.at(index).second;
+                break;
+            default:
+                break;
+            }
+            returnHash.insert(role, info);
+        }
+        return returnHash;
+    }
+
+    void addItem(const QString &name, const QString &number) {
+        list.append(QPair<QString,QString>(name, number));
+        emit itemsInserted(list.count()-1, 1);
+    }
+
+    void insertItem(int index, const QString &name, const QString &number) {
+        list.insert(index, QPair<QString,QString>(name, number));
+        emit itemsInserted(index, 1);
+    }
+
+    void removeItem(int index) {
+        list.removeAt(index);
+        emit itemsRemoved(index, 1);
+    }
+
+    void removeItems(int index, int count) {
+        int c = count;
+        while (c--)
+            list.removeAt(index);
+        emit itemsRemoved(index, count);
+    }
+
+    void moveItem(int from, int to) {
+        list.move(from, to);
+        emit itemsMoved(from, to, 1);
+    }
+
+    void modifyItem(int index, const QString &name, const QString &number) {
+        list[index] = QPair<QString,QString>(name, number);
+        emit itemsChanged(index, 1, roles());
+    }
+
+    void clear() {
+        int count = list.count();
+        list.clear();
+        emit itemsRemoved(0, count);
+    }
+
+private:
+    QList<QPair<QString,QString> > list;
+};
+
+
+class TestModel2 : public QAbstractListModel
+{
+public:
+    enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
+
+    TestModel2(QObject *parent=0) : QAbstractListModel(parent) {
+        QHash<int, QByteArray> roles;
+        roles[Name] = "name";
+        roles[Number] = "number";
+        setRoleNames(roles);
+    }
+
+    int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); }
+    QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
+        QVariant rv;
+        if (role == Name)
+            rv = list.at(index.row()).first;
+        else if (role == Number)
+            rv = list.at(index.row()).second;
+
+        return rv;
+    }
+
+    int count() const { return rowCount(); }
+    QString name(int index) const { return list.at(index).first; }
+    QString number(int index) const { return list.at(index).second; }
+
+    void addItem(const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), list.count(), list.count());
+        list.append(QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void addItems(const QList<QPair<QString, QString> > &items) {
+        emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1);
+        for (int i=0; i<items.count(); i++)
+            list.append(QPair<QString,QString>(items[i].first, items[i].second));
+        emit endInsertRows();
+    }
+
+    void insertItem(int index, const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), index, index);
+        list.insert(index, QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void removeItem(int index) {
+        emit beginRemoveRows(QModelIndex(), index, index);
+        list.removeAt(index);
+        emit endRemoveRows();
+    }
+
+    void removeItems(int index, int count) {
+        emit beginRemoveRows(QModelIndex(), index, index+count-1);
+        while (count--)
+            list.removeAt(index);
+        emit endRemoveRows();
+    }
+
+    void moveItem(int from, int to) {
+        emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
+        list.move(from, to);
+        emit endMoveRows();
+    }
+
+    void modifyItem(int idx, const QString &name, const QString &number) {
+        list[idx] = QPair<QString,QString>(name, number);
+        emit dataChanged(index(idx,0), index(idx,0));
+    }
+
+    void clear() {
+        int count = list.count();
+        emit beginRemoveRows(QModelIndex(), 0, count-1);
+        list.clear();
+        emit endRemoveRows();
+    }
+
+private:
+    QList<QPair<QString,QString> > list;
+};
+
+tst_QSGListView::tst_QSGListView()
+{
+}
+
+template <class T>
+void tst_QSGListView::items()
+{
+    QSGView *canvas = createView();
+
+    T model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QTRY_VERIFY(testObject->error() == false);
+
+    QTRY_VERIFY(listview->highlightItem() != 0);
+    QTRY_COMPARE(listview->count(), model.count());
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    // current item should be first item
+    QTRY_COMPARE(listview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 0));
+
+    for (int i = 0; i < model.count(); ++i) {
+        QSGText *name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    // switch to other delegate
+    testObject->setAnimate(true);
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QTRY_VERIFY(testObject->error() == false);
+    QTRY_VERIFY(listview->currentItem());
+
+    // set invalid highlight
+    testObject->setInvalidHighlight(true);
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QTRY_VERIFY(testObject->error() == false);
+    QTRY_VERIFY(listview->currentItem());
+    QTRY_VERIFY(listview->highlightItem() == 0);
+
+    // back to normal highlight
+    testObject->setInvalidHighlight(false);
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QTRY_VERIFY(testObject->error() == false);
+    QTRY_VERIFY(listview->currentItem());
+    QTRY_VERIFY(listview->highlightItem() != 0);
+
+    // set an empty model and confirm that items are destroyed
+    T model2;
+    ctxt->setContextProperty("testModel", &model2);
+
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    QTRY_VERIFY(itemCount == 0);
+
+    QTRY_COMPARE(listview->highlightResizeSpeed(), 1000.0);
+    QTRY_COMPARE(listview->highlightMoveSpeed(), 1000.0);
+
+    delete canvas;
+    delete testObject;
+}
+
+
+template <class T>
+void tst_QSGListView::changed()
+{
+    QSGView *canvas = createView();
+
+    T model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGFlickable *listview = findItem<QSGFlickable>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.modifyItem(1, "Will", "9876");
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    delete canvas;
+    delete testObject;
+}
+
+template <class T>
+void tst_QSGListView::inserted()
+{
+    QSGView *canvas = createView();
+
+    T model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.insertItem(1, "Will", "9876");
+
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    // Confirm items positioned correctly
+    for (int i = 0; i < model.count(); ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_COMPARE(item->y(), i*20.0);
+    }
+
+    model.insertItem(0, "Foo", "1111"); // zero index, and current item
+
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+
+    name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    QTRY_COMPARE(listview->currentIndex(), 1);
+
+    // Confirm items positioned correctly
+    for (int i = 0; i < model.count(); ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_COMPARE(item->y(), i*20.0);
+    }
+
+    for (int i = model.count(); i < 30; ++i)
+        model.insertItem(i, "Hello", QString::number(i));
+
+    listview->setContentY(80);
+
+    // Insert item outside visible area
+    model.insertItem(1, "Hello", "1324");
+
+    QTRY_VERIFY(listview->contentY() == 80);
+
+    // Confirm items positioned correctly
+    for (int i = 5; i < 5+15; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.0 - 20.0);
+    }
+
+//    QTRY_COMPARE(listview->contentItemHeight(), model.count() * 20.0);
+
+    delete canvas;
+    delete testObject;
+}
+
+template <class T>
+void tst_QSGListView::removed(bool animated)
+{
+    QSGView *canvas = createView();
+
+    T model;
+    for (int i = 0; i < 50; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    testObject->setAnimate(animated);
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.removeItem(1);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    // Remove first item (which is the current item);
+    model.removeItem(0);  // post: top item starts at 20
+
+    QTest::qWait(300);
+
+    name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(),i*20.0 + 20.0);
+    }
+
+    // Remove items not visible
+    model.removeItem(18);
+    qApp->processEvents();
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(),i*20.0+20.0);
+    }
+
+    // Remove items before visible
+    listview->setContentY(80);
+    listview->setCurrentIndex(10);
+
+    model.removeItem(1); // post: top item will be at 40
+    qApp->processEvents();
+
+    // Confirm items positioned correctly
+    for (int i = 2; i < 18; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(),40+i*20.0);
+    }
+
+    // Remove current index
+    QTRY_VERIFY(listview->currentIndex() == 9);
+    QSGItem *oldCurrent = listview->currentItem();
+    model.removeItem(9);
+
+    QTRY_COMPARE(listview->currentIndex(), 9);
+    QTRY_VERIFY(listview->currentItem() != oldCurrent);
+
+    listview->setContentY(40); // That's the top now
+    // let transitions settle.
+    QTest::qWait(300);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(),40+i*20.0);
+    }
+
+    // remove current item beyond visible items.
+    listview->setCurrentIndex(20);
+    listview->setContentY(40);
+    model.removeItem(20);
+
+    QTRY_COMPARE(listview->currentIndex(), 20);
+    QTRY_VERIFY(listview->currentItem() != 0);
+
+    // remove item before current, but visible
+    listview->setCurrentIndex(8);
+    oldCurrent = listview->currentItem();
+    model.removeItem(6);
+
+    QTRY_COMPARE(listview->currentIndex(), 7);
+    QTRY_VERIFY(listview->currentItem() == oldCurrent);
+
+    listview->setContentY(80);
+    QTest::qWait(300);
+
+    // remove all visible items
+    model.removeItems(1, 18);
+    QTest::qWait(300);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i+2);
+        if (!item) qWarning() << "Item" << i+2 << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(),80+i*20.0);
+    }
+
+    model.removeItems(1, 17);
+//    QTest::qWait(300);
+
+    model.removeItems(2, 1);
+    model.addItem("New", "1");
+
+    QTRY_VERIFY(name = findItem<QSGText>(contentItem, "textName", model.count()-1));
+    QCOMPARE(name->text(), QString("New"));
+
+    delete canvas;
+    delete testObject;
+}
+
+template <class T>
+void tst_QSGListView::clear()
+{
+    QSGView *canvas = createView();
+
+    T model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.clear();
+
+    QTRY_VERIFY(listview->count() == 0);
+    QTRY_VERIFY(listview->currentItem() == 0);
+    QTRY_VERIFY(listview->contentY() == 0);
+    QVERIFY(listview->currentIndex() == -1);
+
+    // confirm sanity when adding an item to cleared list
+    model.addItem("New", "1");
+    QTRY_VERIFY(listview->count() == 1);
+    QVERIFY(listview->currentItem() != 0);
+    QVERIFY(listview->currentIndex() == 0);
+
+    delete canvas;
+    delete testObject;
+}
+
+
+template <class T>
+void tst_QSGListView::moved()
+{
+    QSGView *canvas = createView();
+
+    T model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    model.moveItem(1, 4);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 1);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(1));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 1);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(1));
+
+    name = findItem<QSGText>(contentItem, "textName", 4);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(4));
+    number = findItem<QSGText>(contentItem, "textNumber", 4);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(4));
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    listview->setContentY(80);
+
+    // move outside visible area
+    model.moveItem(1, 18);
+
+    // Confirm items positioned correctly and indexes correct
+    for (int i = 3; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.0 + 20);
+        name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    // move from outside visible into visible
+    model.moveItem(20, 4);
+
+    // Confirm items positioned correctly and indexes correct
+    for (int i = 3; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.0 + 20);
+        name = findItem<QSGText>(contentItem, "textName", i);
+        QTRY_VERIFY(name != 0);
+        QTRY_COMPARE(name->text(), model.name(i));
+        number = findItem<QSGText>(contentItem, "textNumber", i);
+        QTRY_VERIFY(number != 0);
+        QTRY_COMPARE(number->text(), model.number(i));
+    }
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::enforceRange()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-enforcerange.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QTRY_COMPARE(listview->preferredHighlightBegin(), 100.0);
+    QTRY_COMPARE(listview->preferredHighlightEnd(), 100.0);
+    QTRY_COMPARE(listview->highlightRangeMode(), QSGListView::StrictlyEnforceRange);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // view should be positioned at the top of the range.
+    QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", 0);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(listview->contentY(), -100.0);
+
+    QSGText *name = findItem<QSGText>(contentItem, "textName", 0);
+    QTRY_VERIFY(name != 0);
+    QTRY_COMPARE(name->text(), model.name(0));
+    QSGText *number = findItem<QSGText>(contentItem, "textNumber", 0);
+    QTRY_VERIFY(number != 0);
+    QTRY_COMPARE(number->text(), model.number(0));
+
+    // Check currentIndex is updated when contentItem moves
+    listview->setContentY(20);
+
+    QTRY_COMPARE(listview->currentIndex(), 6);
+
+    // change model
+    TestModel model2;
+    for (int i = 0; i < 5; i++)
+        model2.addItem("Item" + QString::number(i), "");
+
+    ctxt->setContextProperty("testModel", &model2);
+    QCOMPARE(listview->count(), 5);
+
+    delete canvas;
+}
+
+void tst_QSGListView::spacing()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    listview->setSpacing(10);
+    QTRY_VERIFY(listview->spacing() == 10);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*30);
+    }
+
+    listview->setSpacing(0);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.0);
+    }
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::sections()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i/5));
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), qreal(i*20 + ((i+4)/5) * 20));
+        QSGText *next = findItem<QSGText>(item, "nextSection");
+        QCOMPARE(next->text().toInt(), (i+1)/5);
+    }
+
+    QSignalSpy currentSectionChangedSpy(listview, SIGNAL(currentSectionChanged()));
+
+    // Remove section boundary
+    model.removeItem(5);
+
+    // New section header created
+    QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", 5);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 40.0);
+
+    model.insertItem(3, "New Item", "0");
+
+    // Section header moved
+    item = findItem<QSGItem>(contentItem, "wrapper", 5);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 20.0);
+
+    item = findItem<QSGItem>(contentItem, "wrapper", 6);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 40.0);
+
+    // insert item which will become a section header
+    model.insertItem(6, "Replace header", "1");
+
+    item = findItem<QSGItem>(contentItem, "wrapper", 6);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 40.0);
+
+    item = findItem<QSGItem>(contentItem, "wrapper", 7);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 20.0);
+
+    QTRY_COMPARE(listview->currentSection(), QString("0"));
+
+    listview->setContentY(140);
+    QTRY_COMPARE(listview->currentSection(), QString("1"));
+
+    QTRY_COMPARE(currentSectionChangedSpy.count(), 1);
+
+    listview->setContentY(20);
+    QTRY_COMPARE(listview->currentSection(), QString("0"));
+
+    QTRY_COMPARE(currentSectionChangedSpy.count(), 2);
+
+    item = findItem<QSGItem>(contentItem, "wrapper", 1);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 20.0);
+
+    // check that headers change when item changes
+    listview->setContentY(0);
+    model.modifyItem(0, "changed", "2");
+
+    item = findItem<QSGItem>(contentItem, "wrapper", 1);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 40.0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::sectionsDelegate()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i/5));
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections_delegate.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), qreal(i*20 + ((i+5)/5) * 20));
+        QSGText *next = findItem<QSGText>(item, "nextSection");
+        QCOMPARE(next->text().toInt(), (i+1)/5);
+    }
+
+    for (int i = 0; i < 3; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "sect_" + QString::number(i));
+        QVERIFY(item);
+        QTRY_COMPARE(item->y(), qreal(i*20*6));
+    }
+
+    model.modifyItem(0, "One", "aaa");
+    model.modifyItem(1, "Two", "aaa");
+    model.modifyItem(2, "Three", "aaa");
+    model.modifyItem(3, "Four", "aaa");
+    model.modifyItem(4, "Five", "aaa");
+
+    for (int i = 0; i < 3; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem,
+                "sect_" + (i == 0 ? QString("aaa") : QString::number(i)));
+        QVERIFY(item);
+        QTRY_COMPARE(item->y(), qreal(i*20*6));
+    }
+
+    // remove section boundary
+    model.removeItem(5);
+    qApp->processEvents();
+    for (int i = 0; i < 3; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem,
+                "sect_" + (i == 0 ? QString("aaa") : QString::number(i)));
+        QVERIFY(item);
+    }
+
+    // QTBUG-17606
+    QList<QSGItem*> items = findItems<QSGItem>(contentItem, "sect_1");
+    QCOMPARE(items.count(), 1);
+
+    // QTBUG-17759
+    model.modifyItem(0, "One", "aaa");
+    model.modifyItem(1, "One", "aaa");
+    model.modifyItem(2, "One", "aaa");
+    model.modifyItem(3, "Four", "aaa");
+    model.modifyItem(4, "Four", "aaa");
+    model.modifyItem(5, "Four", "aaa");
+    model.modifyItem(6, "Five", "aaa");
+    model.modifyItem(7, "Five", "aaa");
+    model.modifyItem(8, "Five", "aaa");
+    model.modifyItem(9, "Two", "aaa");
+    model.modifyItem(10, "Two", "aaa");
+    model.modifyItem(11, "Two", "aaa");
+    QTRY_COMPARE(findItems<QSGItem>(contentItem, "sect_aaa").count(), 1);
+    canvas->rootObject()->setProperty("sectionProperty", "name");
+    // ensure view has settled.
+    QTRY_COMPARE(findItems<QSGItem>(contentItem, "sect_Four").count(), 1);
+    for (int i = 0; i < 4; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem,
+                "sect_" + model.name(i*3));
+        QVERIFY(item);
+        QTRY_COMPARE(item->y(), qreal(i*20*4));
+    }
+
+    // QTBUG-17769
+    model.removeItems(10, 20);
+    // ensure view has settled.
+    QTRY_COMPARE(findItems<QSGItem>(contentItem, "wrapper").count(), 10);
+    // Drag view up beyond bounds
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(20,20));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(20,0), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(20,-50), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(20,-200), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(20,-200));
+    // view should settle back at 0
+    QTRY_COMPARE(listview->contentY(), 0.0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::currentIndex()
+{
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i));
+
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("testWrap", QVariant(false));
+
+    QString filename(SRCDIR "/data/listview-initCurrent.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // current item should be 20th item at startup
+    // and current item should be in view
+    QCOMPARE(listview->currentIndex(), 20);
+    QCOMPARE(listview->contentY(), 100.0);
+    QCOMPARE(listview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 20));
+    QCOMPARE(listview->highlightItem()->y(), listview->currentItem()->y());
+
+    // no wrap
+    listview->setCurrentIndex(0);
+    QCOMPARE(listview->currentIndex(), 0);
+    // confirm that the velocity is updated
+    QTRY_VERIFY(listview->verticalVelocity() != 0.0);
+
+    listview->incrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 1);
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+
+    // with wrap
+    ctxt->setContextProperty("testWrap", QVariant(true));
+    QVERIFY(listview->isWrapEnabled());
+
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), model.count()-1);
+
+    QTRY_COMPARE(listview->contentY(), 280.0);
+
+    listview->incrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+
+    QTRY_COMPARE(listview->contentY(), 0.0);
+
+    // Test keys
+    canvas->show();
+    qApp->setActiveWindow(canvas);
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(canvas);
+#endif
+    QTRY_VERIFY(canvas->hasFocus());
+    qApp->processEvents();
+
+    QTest::keyClick(canvas, Qt::Key_Down);
+    QCOMPARE(listview->currentIndex(), 1);
+
+    QTest::keyClick(canvas, Qt::Key_Up);
+    QCOMPARE(listview->currentIndex(), 0);
+
+    // turn off auto highlight
+    listview->setHighlightFollowsCurrentItem(false);
+    QVERIFY(listview->highlightFollowsCurrentItem() == false);
+
+    QVERIFY(listview->highlightItem());
+    qreal hlPos = listview->highlightItem()->y();
+
+    listview->setCurrentIndex(4);
+    QTRY_COMPARE(listview->highlightItem()->y(), hlPos);
+
+    // insert item before currentIndex
+    listview->setCurrentIndex(28);
+    model.insertItem(0, "Foo", "1111");
+    QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29);
+
+    // check removing highlight by setting currentIndex to -1;
+    listview->setCurrentIndex(-1);
+
+    QCOMPARE(listview->currentIndex(), -1);
+    QVERIFY(!listview->highlightItem());
+    QVERIFY(!listview->currentItem());
+
+    delete canvas;
+}
+
+void tst_QSGListView::noCurrentIndex()
+{
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), QString::number(i));
+
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    QString filename(SRCDIR "/data/listview-noCurrent.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // current index should be -1 at startup
+    // and we should not have a currentItem or highlightItem
+    QCOMPARE(listview->currentIndex(), -1);
+    QCOMPARE(listview->contentY(), 0.0);
+    QVERIFY(!listview->highlightItem());
+    QVERIFY(!listview->currentItem());
+
+    listview->setCurrentIndex(2);
+    QCOMPARE(listview->currentIndex(), 2);
+    QVERIFY(listview->highlightItem());
+    QVERIFY(listview->currentItem());
+
+    delete canvas;
+}
+
+void tst_QSGListView::itemList()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/itemlist.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "view");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QSGVisualItemModel *model = canvas->rootObject()->findChild<QSGVisualItemModel*>("itemModel");
+    QTRY_VERIFY(model != 0);
+
+    QTRY_VERIFY(model->count() == 3);
+    QTRY_COMPARE(listview->currentIndex(), 0);
+
+    QSGItem *item = findItem<QSGItem>(contentItem, "item1");
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->x(), 0.0);
+    QCOMPARE(item->height(), listview->height());
+
+    QSGText *text = findItem<QSGText>(contentItem, "text1");
+    QTRY_VERIFY(text);
+    QTRY_COMPARE(text->text(), QLatin1String("index: 0"));
+
+    listview->setCurrentIndex(2);
+
+    item = findItem<QSGItem>(contentItem, "item3");
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->x(), 480.0);
+
+    text = findItem<QSGText>(contentItem, "text3");
+    QTRY_VERIFY(text);
+    QTRY_COMPARE(text->text(), QLatin1String("index: 2"));
+
+    delete canvas;
+}
+
+void tst_QSGListView::cacheBuffer()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+    QTRY_VERIFY(listview->delegate() != 0);
+    QTRY_VERIFY(listview->model() != 0);
+    QTRY_VERIFY(listview->highlight() != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    testObject->setCacheBuffer(400);
+    QTRY_VERIFY(listview->cacheBuffer() == 400);
+
+    int newItemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    QTRY_VERIFY(newItemCount > itemCount);
+
+    // Confirm items positioned correctly
+    for (int i = 0; i < model.count() && i < newItemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::positionViewAtIndex()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position on a currently visible item
+    listview->positionViewAtIndex(3, QSGListView::Beginning);
+    QTRY_COMPARE(listview->contentY(), 60.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position on an item beyond the visible items
+    listview->positionViewAtIndex(22, QSGListView::Beginning);
+    QTRY_COMPARE(listview->contentY(), 440.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position on an item that would leave empty space if positioned at the top
+    listview->positionViewAtIndex(28, QSGListView::Beginning);
+    QTRY_COMPARE(listview->contentY(), 480.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position at the beginning again
+    listview->positionViewAtIndex(0, QSGListView::Beginning);
+    QTRY_COMPARE(listview->contentY(), 0.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position at End using last index
+    listview->positionViewAtIndex(model.count()-1, QSGListView::End);
+    QTRY_COMPARE(listview->contentY(), 480.);
+
+    // Confirm items positioned correctly
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 24; i < model.count(); ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    // Position at End
+    listview->positionViewAtIndex(20, QSGListView::End);
+    QTRY_COMPARE(listview->contentY(), 100.);
+
+    // Position in Center
+    listview->positionViewAtIndex(15, QSGListView::Center);
+    QTRY_COMPARE(listview->contentY(), 150.);
+
+    // Ensure at least partially visible
+    listview->positionViewAtIndex(15, QSGListView::Visible);
+    QTRY_COMPARE(listview->contentY(), 150.);
+
+    listview->setContentY(302);
+    listview->positionViewAtIndex(15, QSGListView::Visible);
+    QTRY_COMPARE(listview->contentY(), 302.);
+
+    listview->setContentY(320);
+    listview->positionViewAtIndex(15, QSGListView::Visible);
+    QTRY_COMPARE(listview->contentY(), 300.);
+
+    listview->setContentY(85);
+    listview->positionViewAtIndex(20, QSGListView::Visible);
+    QTRY_COMPARE(listview->contentY(), 85.);
+
+    listview->setContentY(75);
+    listview->positionViewAtIndex(20, QSGListView::Visible);
+    QTRY_COMPARE(listview->contentY(), 100.);
+
+    // Ensure completely visible
+    listview->setContentY(120);
+    listview->positionViewAtIndex(20, QSGListView::Contain);
+    QTRY_COMPARE(listview->contentY(), 120.);
+
+    listview->setContentY(302);
+    listview->positionViewAtIndex(15, QSGListView::Contain);
+    QTRY_COMPARE(listview->contentY(), 300.);
+
+    listview->setContentY(85);
+    listview->positionViewAtIndex(20, QSGListView::Contain);
+    QTRY_COMPARE(listview->contentY(), 100.);
+
+    // positionAtBeginnging
+    listview->positionViewAtBeginning();
+    QTRY_COMPARE(listview->contentY(), 0.);
+
+    listview->setContentY(80);
+    canvas->rootObject()->setProperty("showHeader", true);
+    listview->positionViewAtBeginning();
+    QTRY_COMPARE(listview->contentY(), -30.);
+
+    // positionAtEnd
+    listview->positionViewAtEnd();
+    QTRY_COMPARE(listview->contentY(), 480.); // 40*20 - 320
+
+    listview->setContentY(80);
+    canvas->rootObject()->setProperty("showFooter", true);
+    listview->positionViewAtEnd();
+    QTRY_COMPARE(listview->contentY(), 510.);
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::resetModel()
+{
+    QSGView *canvas = createView();
+
+    QStringList strings;
+    strings << "one" << "two" << "three";
+    QStringListModel model(strings);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(listview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(contentItem, "displayText", i);
+        QTRY_VERIFY(display != 0);
+        QTRY_COMPARE(display->text(), strings.at(i));
+    }
+
+    strings.clear();
+    strings << "four" << "five" << "six" << "seven";
+    model.setStringList(strings);
+
+    QTRY_COMPARE(listview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(contentItem, "displayText", i);
+        QTRY_VERIFY(display != 0);
+        QTRY_COMPARE(display->text(), strings.at(i));
+    }
+
+    delete canvas;
+}
+
+void tst_QSGListView::propertyChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGListView *listView = canvas->rootObject()->findChild<QSGListView*>("listView");
+    QTRY_VERIFY(listView);
+
+    QSignalSpy highlightFollowsCurrentItemSpy(listView, SIGNAL(highlightFollowsCurrentItemChanged()));
+    QSignalSpy preferredHighlightBeginSpy(listView, SIGNAL(preferredHighlightBeginChanged()));
+    QSignalSpy preferredHighlightEndSpy(listView, SIGNAL(preferredHighlightEndChanged()));
+    QSignalSpy highlightRangeModeSpy(listView, SIGNAL(highlightRangeModeChanged()));
+    QSignalSpy keyNavigationWrapsSpy(listView, SIGNAL(keyNavigationWrapsChanged()));
+    QSignalSpy cacheBufferSpy(listView, SIGNAL(cacheBufferChanged()));
+    QSignalSpy snapModeSpy(listView, SIGNAL(snapModeChanged()));
+
+    QTRY_COMPARE(listView->highlightFollowsCurrentItem(), true);
+    QTRY_COMPARE(listView->preferredHighlightBegin(), 0.0);
+    QTRY_COMPARE(listView->preferredHighlightEnd(), 0.0);
+    QTRY_COMPARE(listView->highlightRangeMode(), QSGListView::ApplyRange);
+    QTRY_COMPARE(listView->isWrapEnabled(), true);
+    QTRY_COMPARE(listView->cacheBuffer(), 10);
+    QTRY_COMPARE(listView->snapMode(), QSGListView::SnapToItem);
+
+    listView->setHighlightFollowsCurrentItem(false);
+    listView->setPreferredHighlightBegin(1.0);
+    listView->setPreferredHighlightEnd(1.0);
+    listView->setHighlightRangeMode(QSGListView::StrictlyEnforceRange);
+    listView->setWrapEnabled(false);
+    listView->setCacheBuffer(3);
+    listView->setSnapMode(QSGListView::SnapOneItem);
+
+    QTRY_COMPARE(listView->highlightFollowsCurrentItem(), false);
+    QTRY_COMPARE(listView->preferredHighlightBegin(), 1.0);
+    QTRY_COMPARE(listView->preferredHighlightEnd(), 1.0);
+    QTRY_COMPARE(listView->highlightRangeMode(), QSGListView::StrictlyEnforceRange);
+    QTRY_COMPARE(listView->isWrapEnabled(), false);
+    QTRY_COMPARE(listView->cacheBuffer(), 3);
+    QTRY_COMPARE(listView->snapMode(), QSGListView::SnapOneItem);
+
+    QTRY_COMPARE(highlightFollowsCurrentItemSpy.count(),1);
+    QTRY_COMPARE(preferredHighlightBeginSpy.count(),1);
+    QTRY_COMPARE(preferredHighlightEndSpy.count(),1);
+    QTRY_COMPARE(highlightRangeModeSpy.count(),1);
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
+    QTRY_COMPARE(cacheBufferSpy.count(),1);
+    QTRY_COMPARE(snapModeSpy.count(),1);
+
+    listView->setHighlightFollowsCurrentItem(false);
+    listView->setPreferredHighlightBegin(1.0);
+    listView->setPreferredHighlightEnd(1.0);
+    listView->setHighlightRangeMode(QSGListView::StrictlyEnforceRange);
+    listView->setWrapEnabled(false);
+    listView->setCacheBuffer(3);
+    listView->setSnapMode(QSGListView::SnapOneItem);
+
+    QTRY_COMPARE(highlightFollowsCurrentItemSpy.count(),1);
+    QTRY_COMPARE(preferredHighlightBeginSpy.count(),1);
+    QTRY_COMPARE(preferredHighlightEndSpy.count(),1);
+    QTRY_COMPARE(highlightRangeModeSpy.count(),1);
+    QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
+    QTRY_COMPARE(cacheBufferSpy.count(),1);
+    QTRY_COMPARE(snapModeSpy.count(),1);
+
+    delete canvas;
+}
+
+void tst_QSGListView::componentChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGListView *listView = canvas->rootObject()->findChild<QSGListView*>("listView");
+    QTRY_VERIFY(listView);
+
+    QDeclarativeComponent component(canvas->engine());
+    component.setData("import QtQuick 2.0; Rectangle { color: \"blue\"; }", QUrl::fromLocalFile(""));
+
+    QDeclarativeComponent delegateComponent(canvas->engine());
+    delegateComponent.setData("import QtQuick 2.0; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
+
+    QSignalSpy highlightSpy(listView, SIGNAL(highlightChanged()));
+    QSignalSpy delegateSpy(listView, SIGNAL(delegateChanged()));
+    QSignalSpy headerSpy(listView, SIGNAL(headerChanged()));
+    QSignalSpy footerSpy(listView, SIGNAL(footerChanged()));
+
+    listView->setHighlight(&component);
+    listView->setHeader(&component);
+    listView->setFooter(&component);
+    listView->setDelegate(&delegateComponent);
+
+    QTRY_COMPARE(listView->highlight(), &component);
+    QTRY_COMPARE(listView->header(), &component);
+    QTRY_COMPARE(listView->footer(), &component);
+    QTRY_COMPARE(listView->delegate(), &delegateComponent);
+
+    QTRY_COMPARE(highlightSpy.count(),1);
+    QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
+
+    listView->setHighlight(&component);
+    listView->setHeader(&component);
+    listView->setFooter(&component);
+    listView->setDelegate(&delegateComponent);
+
+    QTRY_COMPARE(highlightSpy.count(),1);
+    QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
+
+    delete canvas;
+}
+
+void tst_QSGListView::modelChanges()
+{
+    QSGView *canvas = createView();
+    QTRY_VERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
+
+    QSGListView *listView = canvas->rootObject()->findChild<QSGListView*>("listView");
+    QTRY_VERIFY(listView);
+
+    QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild<QDeclarativeListModel*>("alternateModel");
+    QTRY_VERIFY(alternateModel);
+    QVariant modelVariant = QVariant::fromValue(alternateModel);
+    QSignalSpy modelSpy(listView, SIGNAL(modelChanged()));
+
+    listView->setModel(modelVariant);
+    QTRY_COMPARE(listView->model(), modelVariant);
+    QTRY_COMPARE(modelSpy.count(),1);
+
+    listView->setModel(modelVariant);
+    QTRY_COMPARE(modelSpy.count(),1);
+
+    listView->setModel(QVariant());
+    QTRY_COMPARE(modelSpy.count(),2);
+
+//    delete canvas;
+}
+
+void tst_QSGListView::QTBUG_9791()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/strictlyenforcerange.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = qobject_cast<QSGListView*>(canvas->rootObject());
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+    QTRY_VERIFY(listview->delegate() != 0);
+    QTRY_VERIFY(listview->model() != 0);
+
+    QMetaObject::invokeMethod(listview, "fillModel");
+    qApp->processEvents();
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    QCOMPARE(itemCount, 3);
+
+    for (int i = 0; i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->x(), i*300.0);
+    }
+
+    // check that view is positioned correctly
+    QTRY_COMPARE(listview->contentX(), 590.0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::manualHighlight()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    QString filename(SRCDIR "/data/manual-highlight.qml");
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(listview->currentIndex(), 0);
+    QTRY_COMPARE(listview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 0));
+    QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
+
+    listview->setCurrentIndex(2);
+
+    QTRY_COMPARE(listview->currentIndex(), 2);
+    QTRY_COMPARE(listview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 2));
+    QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
+
+    // QTBUG-15972
+    listview->positionViewAtIndex(3, QSGListView::Contain);
+
+    QTRY_COMPARE(listview->currentIndex(), 2);
+    QTRY_COMPARE(listview->currentItem(), findItem<QSGItem>(contentItem, "wrapper", 2));
+    QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
+
+    delete canvas;
+}
+
+void tst_QSGListView::QTBUG_11105()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_VERIFY(item->y() == i*20);
+    }
+
+    listview->positionViewAtIndex(20, QSGListView::Beginning);
+    QCOMPARE(listview->contentY(), 280.);
+
+    TestModel model2;
+    for (int i = 0; i < 5; i++)
+        model2.addItem("Item" + QString::number(i), "");
+
+    ctxt->setContextProperty("testModel", &model2);
+
+    itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    QCOMPARE(itemCount, 5);
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::header()
+{
+    {
+        QSGView *canvas = createView();
+
+        TestModel model;
+        for (int i = 0; i < 30; i++)
+            model.addItem("Item" + QString::number(i), "");
+
+        QDeclarativeContext *ctxt = canvas->rootContext();
+        ctxt->setContextProperty("testModel", &model);
+
+        canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
+        qApp->processEvents();
+
+        QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+        QTRY_VERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QTRY_VERIFY(contentItem != 0);
+
+        QSGText *header = findItem<QSGText>(contentItem, "header");
+        QVERIFY(header);
+        QCOMPARE(header->y(), 0.0);
+        QCOMPARE(header->height(), 20.0);
+
+        QCOMPARE(listview->contentY(), 0.0);
+
+        model.clear();
+        QTRY_COMPARE(header->y(), 0.0);
+
+        for (int i = 0; i < 30; i++)
+            model.addItem("Item" + QString::number(i), "");
+
+        QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
+
+        header = findItem<QSGText>(contentItem, "header");
+        QVERIFY(!header);
+        header = findItem<QSGText>(contentItem, "header2");
+        QVERIFY(header);
+
+        QCOMPARE(header->y(), 10.0);
+        QCOMPARE(header->height(), 10.0);
+        QCOMPARE(listview->contentY(), 10.0);
+
+        delete canvas;
+    }
+    {
+        QSGView *canvas = createView();
+
+        TestModel model;
+
+        canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header1.qml"));
+        qApp->processEvents();
+
+        QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+        QTRY_VERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QTRY_VERIFY(contentItem != 0);
+
+        QSGText *header = findItem<QSGText>(contentItem, "header");
+        QVERIFY(header);
+        QCOMPARE(header->y(), 0.0);
+
+        QCOMPARE(listview->contentY(), 0.0);
+
+        model.clear();
+        QTRY_COMPARE(header->y(), 0.0);
+
+        delete canvas;
+    }
+}
+
+void tst_QSGListView::footer()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 3; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml"));
+    canvas->show();
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QSGText *footer = findItem<QSGText>(contentItem, "footer");
+    QVERIFY(footer);
+    QCOMPARE(footer->y(), 60.0);
+    QCOMPARE(footer->height(), 30.0);
+
+    model.removeItem(1);
+    QTRY_COMPARE(footer->y(), 40.0);
+
+    model.clear();
+    QTRY_COMPARE(footer->y(), 0.0);
+
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
+
+    footer = findItem<QSGText>(contentItem, "footer");
+    QVERIFY(!footer);
+    footer = findItem<QSGText>(contentItem, "footer2");
+    QVERIFY(footer);
+
+    QCOMPARE(footer->y(), 600.0);
+    QCOMPARE(footer->height(), 20.0);
+    QCOMPARE(listview->contentY(), 0.0);
+
+    delete canvas;
+}
+
+class LVAccessor : public QSGListView
+{
+public:
+    qreal minY() const { return minYExtent(); }
+    qreal maxY() const { return maxYExtent(); }
+    qreal minX() const { return minXExtent(); }
+    qreal maxX() const { return maxXExtent(); }
+};
+
+void tst_QSGListView::headerFooter()
+{
+    {
+        // Vertical
+        QSGView *canvas = createView();
+
+        TestModel model;
+        QDeclarativeContext *ctxt = canvas->rootContext();
+        ctxt->setContextProperty("testModel", &model);
+
+        canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml"));
+        qApp->processEvents();
+
+        QSGListView *listview = qobject_cast<QSGListView*>(canvas->rootObject());
+        QTRY_VERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QTRY_VERIFY(contentItem != 0);
+
+        QSGItem *header = findItem<QSGItem>(contentItem, "header");
+        QVERIFY(header);
+        QCOMPARE(header->y(), 0.0);
+
+        QSGItem *footer = findItem<QSGItem>(contentItem, "footer");
+        QVERIFY(footer);
+        QCOMPARE(footer->y(), 20.0);
+
+        QVERIFY(static_cast<LVAccessor*>(listview)->minY() == 0);
+        QVERIFY(static_cast<LVAccessor*>(listview)->maxY() == 0);
+
+        delete canvas;
+    }
+    {
+        // Horizontal
+        QSGView *canvas = createView();
+
+        TestModel model;
+        QDeclarativeContext *ctxt = canvas->rootContext();
+        ctxt->setContextProperty("testModel", &model);
+
+        canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml"));
+        canvas->rootObject()->setProperty("horizontal", true);
+        qApp->processEvents();
+
+        QSGListView *listview = qobject_cast<QSGListView*>(canvas->rootObject());
+        QTRY_VERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QTRY_VERIFY(contentItem != 0);
+
+        QSGItem *header = findItem<QSGItem>(contentItem, "header");
+        QVERIFY(header);
+        QCOMPARE(header->x(), 0.0);
+
+        QSGItem *footer = findItem<QSGItem>(contentItem, "footer");
+        QVERIFY(footer);
+        QCOMPARE(footer->x(), 20.0);
+
+        QVERIFY(static_cast<LVAccessor*>(listview)->minX() == 0);
+        QVERIFY(static_cast<LVAccessor*>(listview)->maxX() == 0);
+
+        delete canvas;
+    }
+    {
+        // Horizontal RTL
+        QSGView *canvas = createView();
+
+        TestModel model;
+        QDeclarativeContext *ctxt = canvas->rootContext();
+        ctxt->setContextProperty("testModel", &model);
+
+        canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml"));
+        canvas->rootObject()->setProperty("horizontal", true);
+        canvas->rootObject()->setProperty("rtl", true);
+        qApp->processEvents();
+
+        QSGListView *listview = qobject_cast<QSGListView*>(canvas->rootObject());
+        QTRY_VERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QTRY_VERIFY(contentItem != 0);
+
+        QSGItem *header = findItem<QSGItem>(contentItem, "header");
+        QVERIFY(header);
+        QCOMPARE(header->x(), -20.0);
+
+        QSGItem *footer = findItem<QSGItem>(contentItem, "footer");
+        QVERIFY(footer);
+        QCOMPARE(footer->x(), -50.0);
+
+        QCOMPARE(static_cast<LVAccessor*>(listview)->minX(), 240.);
+        QCOMPARE(static_cast<LVAccessor*>(listview)->maxX(), 240.);
+
+        delete canvas;
+    }
+}
+
+void tst_QSGListView::resizeView()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 40; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*20.);
+    }
+
+    QVariant heightRatio;
+    QMetaObject::invokeMethod(canvas->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio));
+    QCOMPARE(heightRatio.toReal(), 0.4);
+
+    listview->setHeight(200);
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio));
+    QCOMPARE(heightRatio.toReal(), 0.25);
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::sizeLessThan1()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/sizelessthan1.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QSGItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*0.5);
+    }
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::QTBUG_14821()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug14821.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = qobject_cast<QSGListView*>(canvas->rootObject());
+    QVERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 99);
+
+    listview->incrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::resizeDelegate()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    QStringList strings;
+    for (int i = 0; i < 30; ++i)
+        strings << QString::number(i);
+    QStringListModel model(strings);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(listview->count(), model.rowCount());
+
+    listview->setCurrentIndex(25);
+    listview->setContentY(0);
+
+    for (int i = 0; i < 16; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QVERIFY(item != 0);
+        QCOMPARE(item->y(), i*20.0);
+    }
+
+    QCOMPARE(listview->currentItem()->y(), 500.0);
+    QTRY_COMPARE(listview->highlightItem()->y(), 500.0);
+
+    canvas->rootObject()->setProperty("delegateHeight", 30);
+    qApp->processEvents();
+
+    for (int i = 0; i < 11; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QVERIFY(item != 0);
+        QTRY_COMPARE(item->y(), i*30.0);
+    }
+
+    QTRY_COMPARE(listview->currentItem()->y(), 750.0);
+    QTRY_COMPARE(listview->highlightItem()->y(), 750.0);
+
+    listview->setCurrentIndex(1);
+    listview->positionViewAtIndex(25, QSGListView::Beginning);
+    listview->positionViewAtIndex(5, QSGListView::Beginning);
+
+    for (int i = 5; i < 16; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QVERIFY(item != 0);
+        QCOMPARE(item->y(), i*30.0);
+    }
+
+    QTRY_COMPARE(listview->currentItem()->y(), 30.0);
+    QTRY_COMPARE(listview->highlightItem()->y(), 30.0);
+
+    canvas->rootObject()->setProperty("delegateHeight", 20);
+    qApp->processEvents();
+
+    for (int i = 5; i < 11; ++i) {
+        QSGItem *item = findItem<QSGItem>(contentItem, "wrapper", i);
+        QVERIFY(item != 0);
+        QTRY_COMPARE(item->y(), 150 + (i-5)*20.0);
+    }
+
+    QTRY_COMPARE(listview->currentItem()->y(), 70.0);
+    QTRY_COMPARE(listview->highlightItem()->y(), 70.0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::QTBUG_16037()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug16037.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "listview");
+    QTRY_VERIFY(listview != 0);
+
+    QVERIFY(listview->contentHeight() <= 0.0);
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "setModel");
+
+    QTRY_COMPARE(listview->contentHeight(), 80.0);
+
+    delete canvas;
+}
+
+void tst_QSGListView::indexAt()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QCOMPARE(listview->indexAt(0,0), 0);
+    QCOMPARE(listview->indexAt(0,19), 0);
+    QCOMPARE(listview->indexAt(239,19), 0);
+    QCOMPARE(listview->indexAt(0,20), 1);
+    QCOMPARE(listview->indexAt(240,20), -1);
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGListView::incrementalModel()
+{
+    QSGView *canvas = createView();
+
+    IncrementalModel model;
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+    qApp->processEvents();
+
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QTRY_COMPARE(listview->count(), 20);
+
+    listview->positionViewAtIndex(10, QSGListView::Beginning);
+
+    QTRY_COMPARE(listview->count(), 25);
+
+    delete canvas;
+}
+
+void tst_QSGListView::onAdd()
+{
+    QFETCH(int, initialItemCount);
+    QFETCH(int, itemsToAdd);
+
+    const int delegateHeight = 10;
+    TestModel2 model;
+
+    // these initial items should not trigger ListView.onAdd
+    for (int i=0; i<initialItemCount; i++)
+        model.addItem("dummy value", "dummy value");
+
+    QSGView *canvas = createView();
+    canvas->setFixedSize(200, delegateHeight * (initialItemCount + itemsToAdd));
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("delegateHeight", delegateHeight);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+
+    QObject *object = canvas->rootObject();
+    object->setProperty("width", canvas->width());
+    object->setProperty("height", canvas->height());
+    qApp->processEvents();
+
+    QList<QPair<QString, QString> > items;
+    for (int i=0; i<itemsToAdd; i++)
+        items << qMakePair(QString("value %1").arg(i), QString::number(i));
+    model.addItems(items);
+
+    qApp->processEvents();
+
+    QVariantList result = object->property("addedDelegates").toList();
+    QCOMPARE(result.count(), items.count());
+    for (int i=0; i<items.count(); i++)
+        QCOMPARE(result[i].toString(), items[i].first);
+
+    delete canvas;
+}
+
+void tst_QSGListView::onAdd_data()
+{
+    QTest::addColumn<int>("initialItemCount");
+    QTest::addColumn<int>("itemsToAdd");
+
+    QTest::newRow("0, add 1") << 0 << 1;
+    QTest::newRow("0, add 2") << 0 << 2;
+    QTest::newRow("0, add 10") << 0 << 10;
+
+    QTest::newRow("1, add 1") << 1 << 1;
+    QTest::newRow("1, add 2") << 1 << 2;
+    QTest::newRow("1, add 10") << 1 << 10;
+
+    QTest::newRow("5, add 1") << 5 << 1;
+    QTest::newRow("5, add 2") << 5 << 2;
+    QTest::newRow("5, add 10") << 5 << 10;
+}
+
+void tst_QSGListView::onRemove()
+{
+    QFETCH(int, initialItemCount);
+    QFETCH(int, indexToRemove);
+    QFETCH(int, removeCount);
+
+    const int delegateHeight = 10;
+    TestModel2 model;
+    for (int i=0; i<initialItemCount; i++)
+        model.addItem(QString("value %1").arg(i), "dummy value");
+
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+    ctxt->setContextProperty("delegateHeight", delegateHeight);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+    QObject *object = canvas->rootObject();
+
+    qApp->processEvents();
+
+    model.removeItems(indexToRemove, removeCount);
+    qApp->processEvents();
+    QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount));
+
+    delete canvas;
+}
+
+void tst_QSGListView::onRemove_data()
+{
+    QTest::addColumn<int>("initialItemCount");
+    QTest::addColumn<int>("indexToRemove");
+    QTest::addColumn<int>("removeCount");
+
+    QTest::newRow("remove first") << 1 << 0 << 1;
+    QTest::newRow("two items, remove first") << 2 << 0 << 1;
+    QTest::newRow("two items, remove last") << 2 << 1 << 1;
+    QTest::newRow("two items, remove all") << 2 << 0 << 2;
+
+    QTest::newRow("four items, remove first") << 4 << 0 << 1;
+    QTest::newRow("four items, remove 0-2") << 4 << 0 << 2;
+    QTest::newRow("four items, remove 1-3") << 4 << 1 << 2;
+    QTest::newRow("four items, remove 2-4") << 4 << 2 << 2;
+    QTest::newRow("four items, remove last") << 4 << 3 << 1;
+    QTest::newRow("four items, remove all") << 4 << 0 << 4;
+
+    QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8;
+    QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5;
+    QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6;
+}
+
+void tst_QSGListView::rightToLeft()
+{
+    QSGView *canvas = createView();
+    canvas->setFixedSize(640,320);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml"));
+    qApp->processEvents();
+
+    QVERIFY(canvas->rootObject() != 0);
+    QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "view");
+    QTRY_VERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QSGVisualItemModel *model = canvas->rootObject()->findChild<QSGVisualItemModel*>("itemModel");
+    QTRY_VERIFY(model != 0);
+
+    QTRY_VERIFY(model->count() == 3);
+    QTRY_COMPARE(listview->currentIndex(), 0);
+
+    // initial position at first item, right edge aligned
+    QCOMPARE(listview->contentX(), -640.);
+
+    QSGItem *item = findItem<QSGItem>(contentItem, "item1");
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->x(), -100.0);
+    QCOMPARE(item->height(), listview->height());
+
+    QSGText *text = findItem<QSGText>(contentItem, "text1");
+    QTRY_VERIFY(text);
+    QTRY_COMPARE(text->text(), QLatin1String("index: 0"));
+
+    listview->setCurrentIndex(2);
+
+    item = findItem<QSGItem>(contentItem, "item3");
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->x(), -540.0);
+
+    text = findItem<QSGText>(contentItem, "text3");
+    QTRY_VERIFY(text);
+    QTRY_COMPARE(text->text(), QLatin1String("index: 2"));
+
+    QCOMPARE(listview->contentX(), -640.);
+
+    // Ensure resizing maintains position relative to right edge
+    qobject_cast<QSGItem*>(canvas->rootObject())->setWidth(600);
+    QTRY_COMPARE(listview->contentX(), -600.);
+
+    delete canvas;
+}
+
+void tst_QSGListView::test_mirroring()
+{
+    QSGView *canvasA = createView();
+    canvasA->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml"));
+    QSGListView *listviewA = findItem<QSGListView>(canvasA->rootObject(), "view");
+    QTRY_VERIFY(listviewA != 0);
+
+    QSGView *canvasB = createView();
+    canvasB->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml"));
+    QSGListView *listviewB = findItem<QSGListView>(canvasB->rootObject(), "view");
+    QTRY_VERIFY(listviewA != 0);
+    qApp->processEvents();
+
+    QList<QString> objectNames;
+    objectNames << "item1" << "item2"; // << "item3"
+
+    listviewA->setProperty("layoutDirection", Qt::LeftToRight);
+    listviewB->setProperty("layoutDirection", Qt::RightToLeft);
+    QCOMPARE(listviewA->layoutDirection(), listviewA->effectiveLayoutDirection());
+
+    // LTR != RTL
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(listviewA, objectName)->x() != findItem<QSGItem>(listviewB, objectName)->x());
+
+    listviewA->setProperty("layoutDirection", Qt::LeftToRight);
+    listviewB->setProperty("layoutDirection", Qt::LeftToRight);
+
+    // LTR == LTR
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(listviewA, objectName)->x(), findItem<QSGItem>(listviewB, objectName)->x());
+
+    QVERIFY(listviewB->layoutDirection() == listviewB->effectiveLayoutDirection());
+    QSGItemPrivate::get(listviewB)->setLayoutMirror(true);
+    QVERIFY(listviewB->layoutDirection() != listviewB->effectiveLayoutDirection());
+
+    // LTR != LTR+mirror
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(listviewA, objectName)->x() != findItem<QSGItem>(listviewB, objectName)->x());
+
+    listviewA->setProperty("layoutDirection", Qt::RightToLeft);
+
+    // RTL == LTR+mirror
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(listviewA, objectName)->x(), findItem<QSGItem>(listviewB, objectName)->x());
+
+    listviewB->setProperty("layoutDirection", Qt::RightToLeft);
+
+    // RTL != RTL+mirror
+    foreach(const QString objectName, objectNames)
+        QVERIFY(findItem<QSGItem>(listviewA, objectName)->x() != findItem<QSGItem>(listviewB, objectName)->x());
+
+    listviewA->setProperty("layoutDirection", Qt::LeftToRight);
+
+    // LTR == RTL+mirror
+    foreach(const QString objectName, objectNames)
+        QCOMPARE(findItem<QSGItem>(listviewA, objectName)->x(), findItem<QSGItem>(listviewB, objectName)->x());
+
+    delete canvasA;
+    delete canvasB;
+}
+
+void tst_QSGListView::qListModelInterface_items()
+{
+    items<TestModel>();
+}
+
+void tst_QSGListView::qAbstractItemModel_items()
+{
+    items<TestModel2>();
+}
+
+void tst_QSGListView::qListModelInterface_changed()
+{
+    changed<TestModel>();
+}
+
+void tst_QSGListView::qAbstractItemModel_changed()
+{
+    changed<TestModel2>();
+}
+
+void tst_QSGListView::qListModelInterface_inserted()
+{
+    inserted<TestModel>();
+}
+
+void tst_QSGListView::qAbstractItemModel_inserted()
+{
+    inserted<TestModel2>();
+}
+
+void tst_QSGListView::qListModelInterface_removed()
+{
+    removed<TestModel>(false);
+    removed<TestModel>(true);
+}
+
+void tst_QSGListView::qAbstractItemModel_removed()
+{
+    removed<TestModel2>(false);
+    removed<TestModel2>(true);
+}
+
+void tst_QSGListView::qListModelInterface_moved()
+{
+    moved<TestModel>();
+}
+
+void tst_QSGListView::qAbstractItemModel_moved()
+{
+    moved<TestModel2>();
+}
+
+void tst_QSGListView::qListModelInterface_clear()
+{
+    clear<TestModel>();
+}
+
+void tst_QSGListView::qAbstractItemModel_clear()
+{
+    clear<TestModel2>();
+}
+
+QSGView *tst_QSGListView::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+/*
+   Find an item with the specified objectName.  If index is supplied then the
+   item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_QSGListView::findItem(QSGItem *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeExpression e(qmlContext(item), item, "index");
+                if (e.evaluate().toInt() == index)
+                    return static_cast<T*>(item);
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+template<typename T>
+QList<T*> tst_QSGListView::findItems(QSGItem *parent, const QString &objectName)
+{
+    QList<T*> items;
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item || !item->isVisible())
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
+            items.append(static_cast<T*>(item));
+        items += findItems<T>(item, objectName);
+    }
+
+    return items;
+}
+
+void tst_QSGListView::dumpTree(QSGItem *parent, int depth)
+{
+    static QString padding("                       ");
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        qDebug() << padding.left(depth*2) << item;
+        dumpTree(item, depth+1);
+    }
+}
+
+
+QTEST_MAIN(tst_QSGListView)
+
+#include "tst_qsglistview.moc"
diff --git a/tests/auto/declarative/qsgloader/data/AnchoredLoader.qml b/tests/auto/declarative/qsgloader/data/AnchoredLoader.qml
new file mode 100644
index 0000000000..1a2a620d7f
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/AnchoredLoader.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 300
+    height: 200
+    color: "blue"
+    Loader {
+        objectName: "loader"
+        anchors.fill: parent
+        sourceComponent: Component {
+            Rectangle { color: "red"; objectName: "sourceElement" }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/BlueRect.qml b/tests/auto/declarative/qsgloader/data/BlueRect.qml
new file mode 100644
index 0000000000..e96ac00f21
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/BlueRect.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Rectangle {
+    objectName: "blue"
+    width: 100
+    height: 100
+    color: "blue"
+}
diff --git a/tests/auto/declarative/qsgloader/data/CreationContextLoader.qml b/tests/auto/declarative/qsgloader/data/CreationContextLoader.qml
new file mode 100644
index 0000000000..4dd73e797c
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/CreationContextLoader.qml
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Loader {
+    id: myLoader
+    property int testProperty: 1912
+    sourceComponent: loaderComponent
+    Component {
+        id: loaderComponent
+        Item {
+            Component.onCompleted: {
+                test = (myLoader.testProperty == 1912);
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/GraphicsWidget250x250.qml b/tests/auto/declarative/qsgloader/data/GraphicsWidget250x250.qml
new file mode 100644
index 0000000000..dae8e3fbbb
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/GraphicsWidget250x250.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+QGraphicsWidget {
+    size: "250x250"
+}
diff --git a/tests/auto/declarative/qsgloader/data/GreenRect.qml b/tests/auto/declarative/qsgloader/data/GreenRect.qml
new file mode 100644
index 0000000000..99cefaf176
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/GreenRect.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 100; height: 100
+    color: "green"
+    Component.onCompleted: myLoader.source = "BlueRect.qml"
+}
diff --git a/tests/auto/declarative/qsgloader/data/NoResize.qml b/tests/auto/declarative/qsgloader/data/NoResize.qml
new file mode 100644
index 0000000000..9b3ea6410b
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/NoResize.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Item {
+    width: 200; height: 80
+    Loader {
+        source: "Rect120x60.qml"
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/NoResizeGraphicsWidget.qml b/tests/auto/declarative/qsgloader/data/NoResizeGraphicsWidget.qml
new file mode 100644
index 0000000000..c0f51d8c35
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/NoResizeGraphicsWidget.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+
+Item {
+    width: 200
+    height: 80
+    Loader {
+        source: "GraphicsWidget250x250.qml"
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/QTBUG_16928.qml b/tests/auto/declarative/qsgloader/data/QTBUG_16928.qml
new file mode 100644
index 0000000000..903d7f0812
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/QTBUG_16928.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "green"
+    width: loader.implicitWidth+50
+    height: loader.implicitHeight+50
+
+    Loader {
+        id: loader
+        sourceComponent: Item {
+            anchors.centerIn: parent
+
+            implicitWidth: 200
+            implicitHeight: 200
+            Rectangle {
+                color: "red"
+                anchors.fill: parent
+            }
+        }
+        anchors.fill: parent
+        anchors.margins: 15
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/QTBUG_17114.qml b/tests/auto/declarative/qsgloader/data/QTBUG_17114.qml
new file mode 100644
index 0000000000..7402037553
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/QTBUG_17114.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle {
+    property real loaderWidth: loader.width
+    property real loaderHeight: loader.height
+    width: 200
+    height: 200
+
+    Loader {
+        id: loader
+        sourceComponent: Item {
+            property real iwidth: 32
+            property real iheight: 32
+            width: iwidth
+            height: iheight
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/Rect120x60.qml b/tests/auto/declarative/qsgloader/data/Rect120x60.qml
new file mode 100644
index 0000000000..fc9e447e69
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/Rect120x60.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 120
+   height:60
+}
diff --git a/tests/auto/declarative/qsgloader/data/SetSourceComponent.qml b/tests/auto/declarative/qsgloader/data/SetSourceComponent.qml
new file mode 100644
index 0000000000..83cc358f7d
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/SetSourceComponent.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+
+Item {
+    function clear() {
+        loader.sourceComponent = undefined
+    }
+    Component { id: comp; Rectangle { width: 100; height: 50 } }
+    Loader { id: loader; sourceComponent: comp }
+}
diff --git a/tests/auto/declarative/qsgloader/data/SizeGraphicsWidgetToLoader.qml b/tests/auto/declarative/qsgloader/data/SizeGraphicsWidgetToLoader.qml
new file mode 100644
index 0000000000..2a63b4d34f
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/SizeGraphicsWidgetToLoader.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+Loader {
+    width: 200
+    height: 80
+    source: "GraphicsWidget250x250.qml"
+}
diff --git a/tests/auto/declarative/qsgloader/data/SizeLoaderToGraphicsWidget.qml b/tests/auto/declarative/qsgloader/data/SizeLoaderToGraphicsWidget.qml
new file mode 100644
index 0000000000..a9875d8e21
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/SizeLoaderToGraphicsWidget.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Loader {
+    source: "GraphicsWidget250x250.qml"
+}
diff --git a/tests/auto/declarative/qsgloader/data/SizeToItem.qml b/tests/auto/declarative/qsgloader/data/SizeToItem.qml
new file mode 100644
index 0000000000..866365754f
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/SizeToItem.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Loader {
+    source: "Rect120x60.qml"
+}
diff --git a/tests/auto/declarative/qsgloader/data/SizeToLoader.qml b/tests/auto/declarative/qsgloader/data/SizeToLoader.qml
new file mode 100644
index 0000000000..dad18c6939
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/SizeToLoader.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Loader {
+    width: 200; height: 80
+    source: "Rect120x60.qml"
+}
diff --git a/tests/auto/declarative/qsgloader/data/VmeError.qml b/tests/auto/declarative/qsgloader/data/VmeError.qml
new file mode 100644
index 0000000000..0443aa9054
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/VmeError.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 100; height: 100; color: "red"
+    signal somethingHappened
+    onSomethingHappened: QtObject {}
+}
diff --git a/tests/auto/declarative/qsgloader/data/crash.qml b/tests/auto/declarative/qsgloader/data/crash.qml
new file mode 100644
index 0000000000..e6ddc33a10
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/crash.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400
+    height: 400
+
+    function setLoaderSource() {
+        myLoader.source = "GreenRect.qml"
+    }
+
+    Loader {
+        id: myLoader
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/creationContext.qml b/tests/auto/declarative/qsgloader/data/creationContext.qml
new file mode 100644
index 0000000000..17a596cc74
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/creationContext.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Item {
+    property bool test: false
+
+    CreationContextLoader {
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/differentorigin.qml b/tests/auto/declarative/qsgloader/data/differentorigin.qml
new file mode 100644
index 0000000000..56a3034fe0
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/differentorigin.qml
@@ -0,0 +1,3 @@
+import QtQuick 2.0
+
+Loader { source: "http://evil.place/evil.qml" }
diff --git a/tests/auto/declarative/qsgloader/data/implicitSize.qml b/tests/auto/declarative/qsgloader/data/implicitSize.qml
new file mode 100644
index 0000000000..5c8c8348ed
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/implicitSize.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Rectangle {
+    property real implWidth: 0
+    property real implHeight: 0
+    color: "green"
+    width: loader.implicitWidth+50
+    height: loader.implicitHeight+50
+
+    Loader {
+        id: loader
+        sourceComponent: Item {
+            anchors.centerIn: parent
+
+            implicitWidth: 100
+            implicitHeight: 100
+            Rectangle {
+                color: "red"
+                anchors.fill: parent
+            }
+        }
+
+        anchors.fill: parent
+        anchors.margins: 50
+        onImplicitWidthChanged: implWidth = implicitWidth
+        onImplicitHeightChanged: implHeight = loader.implicitHeight
+    }
+}
diff --git a/tests/auto/declarative/qsgloader/data/nonItem.qml b/tests/auto/declarative/qsgloader/data/nonItem.qml
new file mode 100644
index 0000000000..8cfa0d8efb
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/nonItem.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Loader {
+    sourceComponent: QtObject {}
+}
diff --git a/tests/auto/declarative/qsgloader/data/qmldir b/tests/auto/declarative/qsgloader/data/qmldir
new file mode 100644
index 0000000000..bf42b507c0
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/qmldir
@@ -0,0 +1 @@
+# For tst_QDeclarativeLoader::networkRequestUrl; no types needed though.
diff --git a/tests/auto/declarative/qsgloader/data/sameorigin-load.qml b/tests/auto/declarative/qsgloader/data/sameorigin-load.qml
new file mode 100644
index 0000000000..3332500be6
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/sameorigin-load.qml
@@ -0,0 +1,3 @@
+import QtQuick 2.0
+
+Item { }
diff --git a/tests/auto/declarative/qsgloader/data/sameorigin.qml b/tests/auto/declarative/qsgloader/data/sameorigin.qml
new file mode 100644
index 0000000000..84846b6aba
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/sameorigin.qml
@@ -0,0 +1,3 @@
+import QtQuick 2.0
+
+Loader { source: "sameorigin-load.qml" }
diff --git a/tests/auto/declarative/qsgloader/data/vmeErrors.qml b/tests/auto/declarative/qsgloader/data/vmeErrors.qml
new file mode 100644
index 0000000000..8e6c89dc8e
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/vmeErrors.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Loader {
+    source: "VmeError.qml"
+}
+
diff --git a/tests/auto/declarative/qsgloader/qsgloader.pro b/tests/auto/declarative/qsgloader/qsgloader.pro
new file mode 100644
index 0000000000..25093658de
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/qsgloader.pro
@@ -0,0 +1,19 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui network
+macx:CONFIG -= app_bundle
+
+INCLUDEPATH += ../shared/
+HEADERS += ../shared/testhttpserver.h
+SOURCES += tst_qsgloader.cpp \
+           ../shared/testhttpserver.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgloader/tst_qsgloader.cpp b/tests/auto/declarative/qsgloader/tst_qsgloader.cpp
new file mode 100644
index 0000000000..5f4adcbd95
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/tst_qsgloader.cpp
@@ -0,0 +1,559 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+
+#include <QSignalSpy>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <private/qsgloader_p.h>
+#include "testhttpserver.h"
+#include "../../../shared/util.h"
+
+#define SERVER_PORT 14450
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+inline QUrl TEST_FILE(const QString &filename)
+{
+    return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename);
+}
+
+class tst_QSGLoader : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_QSGLoader();
+
+private slots:
+    void sourceOrComponent();
+    void sourceOrComponent_data();
+    void clear();
+    void urlToComponent();
+    void componentToUrl();
+    void anchoredLoader();
+    void sizeLoaderToItem();
+    void sizeItemToLoader();
+    void noResize();
+    void networkRequestUrl();
+    void failNetworkRequest();
+//    void networkComponent();
+
+    void deleteComponentCrash();
+    void nonItem();
+    void vmeErrors();
+    void creationContext();
+    void QTBUG_16928();
+    void implicitSize();
+    void QTBUG_17114();
+
+private:
+    QDeclarativeEngine engine;
+};
+
+
+tst_QSGLoader::tst_QSGLoader()
+{
+}
+
+void tst_QSGLoader::sourceOrComponent()
+{
+    QFETCH(QString, sourceDefinition);
+    QFETCH(QUrl, sourceUrl);
+    QFETCH(QString, errorString);
+
+    bool error = !errorString.isEmpty();
+    if (error)
+        QTest::ignoreMessage(QtWarningMsg, errorString.toUtf8().constData());
+
+    QDeclarativeComponent component(&engine);
+    component.setData(QByteArray(
+            "import QtQuick 2.0\n"
+            "Loader {\n"
+            "   property int onItemChangedCount: 0\n"
+            "   property int onSourceChangedCount: 0\n"
+            "   property int onStatusChangedCount: 0\n"
+            "   property int onProgressChangedCount: 0\n"
+            "   property int onLoadedCount: 0\n")
+            + sourceDefinition.toUtf8()
+            + QByteArray(
+            "   onItemChanged: onItemChangedCount += 1\n"
+            "   onSourceChanged: onSourceChangedCount += 1\n"
+            "   onStatusChanged: onStatusChangedCount += 1\n"
+            "   onProgressChanged: onProgressChangedCount += 1\n"
+            "   onLoaded: onLoadedCount += 1\n"
+            "}")
+        , TEST_FILE(""));
+
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader != 0);
+    QCOMPARE(loader->item() == 0, error);
+    QCOMPARE(loader->source(), sourceUrl);
+    QCOMPARE(loader->progress(), 1.0);
+
+    QCOMPARE(loader->status(), error ? QSGLoader::Error : QSGLoader::Ready);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), error ? 0: 1);
+
+    if (!error) {
+        QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(loader->children().at(0));
+        QVERIFY(c);
+        QCOMPARE(loader->sourceComponent(), c);
+    }
+
+    QCOMPARE(loader->property("onSourceChangedCount").toInt(), 1);
+    QCOMPARE(loader->property("onStatusChangedCount").toInt(), 1);
+    QCOMPARE(loader->property("onProgressChangedCount").toInt(), 1);
+
+    QCOMPARE(loader->property("onItemChangedCount").toInt(), error ? 0 : 1);
+    QCOMPARE(loader->property("onLoadedCount").toInt(), error ? 0 : 1);
+
+    delete loader;
+}
+
+void tst_QSGLoader::sourceOrComponent_data()
+{
+    QTest::addColumn<QString>("sourceDefinition");
+    QTest::addColumn<QUrl>("sourceUrl");
+    QTest::addColumn<QString>("errorString");
+
+    QTest::newRow("source") << "source: 'Rect120x60.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/Rect120x60.qml") << "";
+    QTest::newRow("sourceComponent") << "Component { id: comp; Rectangle { width: 100; height: 50 } }\n sourceComponent: comp\n" << QUrl() << "";
+
+    QTest::newRow("invalid source") << "source: 'IDontExist.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml")
+            << QString(QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml").toString() + ": File not found");
+}
+
+void tst_QSGLoader::clear()
+{
+    {
+        QDeclarativeComponent component(&engine);
+        component.setData(QByteArray(
+                    "import QtQuick 2.0\n"
+                    " Loader { id: loader\n"
+                    "  source: 'Rect120x60.qml'\n"
+                    "  Timer { interval: 200; running: true; onTriggered: loader.source = '' }\n"
+                    " }")
+                , TEST_FILE(""));
+        QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+        QVERIFY(loader != 0);
+        QVERIFY(loader->item());
+        QCOMPARE(loader->progress(), 1.0);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+
+        QTRY_VERIFY(loader->item() == 0);
+        QCOMPARE(loader->progress(), 0.0);
+        QCOMPARE(loader->status(), QSGLoader::Null);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 0);
+
+        delete loader;
+    }
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml"));
+        QSGItem *item = qobject_cast<QSGItem*>(component.create());
+        QVERIFY(item);
+
+        QSGLoader *loader = qobject_cast<QSGLoader*>(item->QSGItem::childItems().at(0));
+        QVERIFY(loader);
+        QVERIFY(loader->item());
+        QCOMPARE(loader->progress(), 1.0);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+
+        loader->setSourceComponent(0);
+
+        QVERIFY(loader->item() == 0);
+        QCOMPARE(loader->progress(), 0.0);
+        QCOMPARE(loader->status(), QSGLoader::Null);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 0);
+
+        delete item;
+    }
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml"));
+        QSGItem *item = qobject_cast<QSGItem*>(component.create());
+        QVERIFY(item);
+
+        QSGLoader *loader = qobject_cast<QSGLoader*>(item->QSGItem::childItems().at(0)); 
+        QVERIFY(loader);
+        QVERIFY(loader->item());
+        QCOMPARE(loader->progress(), 1.0);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+
+        QMetaObject::invokeMethod(item, "clear");
+
+        QVERIFY(loader->item() == 0);
+        QCOMPARE(loader->progress(), 0.0);
+        QCOMPARE(loader->status(), QSGLoader::Null);
+        QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 0);
+
+        delete item;
+    }
+}
+
+void tst_QSGLoader::urlToComponent()
+{
+    QDeclarativeComponent component(&engine);
+    component.setData(QByteArray("import QtQuick 2.0\n"
+                "Loader {\n"
+                " id: loader\n"
+                " Component { id: myComp; Rectangle { width: 10; height: 10 } }\n"
+                " source: \"Rect120x60.qml\"\n"
+                " Timer { interval: 100; running: true; onTriggered: loader.sourceComponent = myComp }\n"
+                "}" )
+            , TEST_FILE(""));
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QTest::qWait(200);
+    QTRY_VERIFY(loader != 0);
+    QVERIFY(loader->item());
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+    QCOMPARE(loader->width(), 10.0);
+    QCOMPARE(loader->height(), 10.0);
+
+    delete loader;
+}
+
+void tst_QSGLoader::componentToUrl()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml"));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    QSGLoader *loader = qobject_cast<QSGLoader*>(item->QSGItem::childItems().at(0)); 
+    QVERIFY(loader);
+    QVERIFY(loader->item());
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+
+    loader->setSource(TEST_FILE("/Rect120x60.qml"));
+    QVERIFY(loader->item());
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+    QCOMPARE(loader->width(), 120.0);
+    QCOMPARE(loader->height(), 60.0);
+
+    delete item;
+}
+
+void tst_QSGLoader::anchoredLoader()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("/AnchoredLoader.qml"));
+    QSGItem *rootItem = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(rootItem != 0);
+    QSGItem *loader = rootItem->findChild<QSGItem*>("loader");
+    QSGItem *sourceElement = rootItem->findChild<QSGItem*>("sourceElement");
+
+    QVERIFY(loader != 0);
+    QVERIFY(sourceElement != 0);
+
+    QCOMPARE(rootItem->width(), 300.0);
+    QCOMPARE(rootItem->height(), 200.0);
+
+    QCOMPARE(loader->width(), 300.0);
+    QCOMPARE(loader->height(), 200.0);
+
+    QCOMPARE(sourceElement->width(), 300.0);
+    QCOMPARE(sourceElement->height(), 200.0);
+}
+
+void tst_QSGLoader::sizeLoaderToItem()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("/SizeToItem.qml"));
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader != 0);
+    QCOMPARE(loader->width(), 120.0);
+    QCOMPARE(loader->height(), 60.0);
+
+    // Check resize
+    QSGItem *rect = qobject_cast<QSGItem*>(loader->item());
+    QVERIFY(rect);
+    rect->setWidth(150);
+    rect->setHeight(45);
+    QCOMPARE(loader->width(), 150.0);
+    QCOMPARE(loader->height(), 45.0);
+
+    // Check explicit width
+    loader->setWidth(200.0);
+    QCOMPARE(loader->width(), 200.0);
+    QCOMPARE(rect->width(), 200.0);
+    rect->setWidth(100.0); // when rect changes ...
+    QCOMPARE(rect->width(), 100.0); // ... it changes
+    QCOMPARE(loader->width(), 200.0); // ... but loader stays the same
+
+    // Check explicit height
+    loader->setHeight(200.0);
+    QCOMPARE(loader->height(), 200.0);
+    QCOMPARE(rect->height(), 200.0);
+    rect->setHeight(100.0); // when rect changes ...
+    QCOMPARE(rect->height(), 100.0); // ... it changes
+    QCOMPARE(loader->height(), 200.0); // ... but loader stays the same
+
+    // Switch mode
+    loader->setWidth(180);
+    loader->setHeight(30);
+    QCOMPARE(rect->width(), 180.0);
+    QCOMPARE(rect->height(), 30.0);
+
+    delete loader;
+}
+
+void tst_QSGLoader::sizeItemToLoader()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("/SizeToLoader.qml"));
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader != 0);
+    QCOMPARE(loader->width(), 200.0);
+    QCOMPARE(loader->height(), 80.0);
+
+    QSGItem *rect = qobject_cast<QSGItem*>(loader->item());
+    QVERIFY(rect);
+    QCOMPARE(rect->width(), 200.0);
+    QCOMPARE(rect->height(), 80.0);
+
+    // Check resize
+    loader->setWidth(180);
+    loader->setHeight(30);
+    QCOMPARE(rect->width(), 180.0);
+    QCOMPARE(rect->height(), 30.0);
+
+    // Switch mode
+    loader->resetWidth(); // reset explicit size
+    loader->resetHeight();
+    rect->setWidth(160);
+    rect->setHeight(45);
+    QCOMPARE(loader->width(), 160.0);
+    QCOMPARE(loader->height(), 45.0);
+
+    delete loader;
+}
+
+void tst_QSGLoader::noResize()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("/NoResize.qml"));
+    QSGItem* item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item != 0);
+    QCOMPARE(item->width(), 200.0);
+    QCOMPARE(item->height(), 80.0);
+
+    delete item;
+}
+
+void tst_QSGLoader::networkRequestUrl()
+{
+    TestHTTPServer server(SERVER_PORT);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+
+    QDeclarativeComponent component(&engine);
+    component.setData(QByteArray("import QtQuick 2.0\nLoader { property int signalCount : 0; source: \"http://127.0.0.1:14450/Rect120x60.qml\"; onLoaded: signalCount += 1 }"), QUrl::fromLocalFile(SRCDIR "/dummy.qml"));
+    if (component.isError())
+        qDebug() << component.errors();
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader != 0);
+
+    QTRY_VERIFY(loader->status() == QSGLoader::Ready);
+
+    QVERIFY(loader->item());
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(loader->property("signalCount").toInt(), 1);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+
+    delete loader;
+}
+
+/* XXX Component waits until all dependencies are loaded.  Is this actually possible?
+void tst_QSGLoader::networkComponent()
+{
+    TestHTTPServer server(SERVER_PORT);
+    QVERIFY(server.isValid());
+    server.serveDirectory("slowdata", TestHTTPServer::Delay);
+
+    QDeclarativeComponent component(&engine);
+    component.setData(QByteArray(
+                "import QtQuick 2.0\n"
+                "import \"http://127.0.0.1:14450/\" as NW\n"
+                "Item {\n"
+                " Component { id: comp; NW.SlowRect {} }\n"
+                " Loader { sourceComponent: comp } }")
+            , TEST_FILE(""));
+
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    QSGLoader *loader = qobject_cast<QSGLoader*>(item->QSGItem::children().at(1)); 
+    QVERIFY(loader);
+    QTRY_VERIFY(loader->status() == QSGLoader::Ready);
+
+    QVERIFY(loader->item());
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(loader->status(), QSGLoader::Ready);
+    QCOMPARE(static_cast<QSGItem*>(loader)->children().count(), 1);
+
+    delete loader;
+}
+*/
+
+void tst_QSGLoader::failNetworkRequest()
+{
+    TestHTTPServer server(SERVER_PORT);
+    QVERIFY(server.isValid());
+    server.serveDirectory(SRCDIR "/data");
+
+    QTest::ignoreMessage(QtWarningMsg, "http://127.0.0.1:14450/IDontExist.qml: File not found");
+
+    QDeclarativeComponent component(&engine);
+    component.setData(QByteArray("import QtQuick 2.0\nLoader { property int did_load: 123; source: \"http://127.0.0.1:14450/IDontExist.qml\"; onLoaded: did_load=456 }"), QUrl::fromLocalFile("http://127.0.0.1:14450/dummy.qml"));
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader != 0);
+
+    QTRY_VERIFY(loader->status() == QSGLoader::Error);
+
+    QVERIFY(loader->item() == 0);
+    QCOMPARE(loader->progress(), 0.0);
+    QCOMPARE(loader->property("did_load").toInt(), 123);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 0);
+
+    delete loader;
+}
+
+// QTBUG-9241
+void tst_QSGLoader::deleteComponentCrash()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("crash.qml"));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    item->metaObject()->invokeMethod(item, "setLoaderSource");
+
+    QSGLoader *loader = qobject_cast<QSGLoader*>(item->QSGItem::childItems().at(0));
+    QVERIFY(loader);
+    QVERIFY(loader->item());
+    QCOMPARE(loader->item()->objectName(), QLatin1String("blue"));
+    QCOMPARE(loader->progress(), 1.0);
+    QCOMPARE(loader->status(), QSGLoader::Ready);
+    QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), 1);
+    QVERIFY(loader->source() == QUrl::fromLocalFile(SRCDIR "/data/BlueRect.qml"));
+
+    delete item;
+}
+
+void tst_QSGLoader::nonItem()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("nonItem.qml"));
+    QString err = QUrl::fromLocalFile(SRCDIR).toString() + "/data/nonItem.qml:3:1: QML Loader: Loader does not support loading non-visual elements.";
+
+    QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData());
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader);
+    QVERIFY(loader->item() == 0);
+
+    delete loader;
+}
+
+void tst_QSGLoader::vmeErrors()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("vmeErrors.qml"));
+    QString err = QUrl::fromLocalFile(SRCDIR).toString() + "/data/VmeError.qml:6: Cannot assign object type QObject with no default method";
+    QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData());
+    QSGLoader *loader = qobject_cast<QSGLoader*>(component.create());
+    QVERIFY(loader);
+    QVERIFY(loader->item() == 0);
+
+    delete loader;
+}
+
+// QTBUG-13481
+void tst_QSGLoader::creationContext()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("creationContext.qml"));
+
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    QCOMPARE(o->property("test").toBool(), true);
+
+    delete o;
+}
+
+void tst_QSGLoader::QTBUG_16928()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_16928.qml"));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    QCOMPARE(item->width(), 250.);
+    QCOMPARE(item->height(), 250.);
+
+    delete item;
+}
+
+void tst_QSGLoader::implicitSize()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("implicitSize.qml"));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    QCOMPARE(item->width(), 150.);
+    QCOMPARE(item->height(), 150.);
+
+    QCOMPARE(item->property("implHeight").toReal(), 100.);
+    QCOMPARE(item->property("implWidth").toReal(), 100.);
+
+    delete item;
+}
+
+void tst_QSGLoader::QTBUG_17114()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_17114.qml"));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+
+    QCOMPARE(item->property("loaderWidth").toReal(), 32.);
+    QCOMPARE(item->property("loaderHeight").toReal(), 32.);
+
+    delete item;
+}
+
+QTEST_MAIN(tst_QSGLoader)
+
+#include "tst_qsgloader.moc"
diff --git a/tests/auto/declarative/qsgmousearea/data/clickThrough.qml b/tests/auto/declarative/qsgmousearea/data/clickThrough.qml
new file mode 100644
index 0000000000..0d954f8511
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/clickThrough.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Item{
+    width: 200
+    height: 200
+    property int doubleClicks: 0
+    property int clicks: 0
+    property int pressAndHolds: 0
+    property int presses: 0
+    MouseArea{
+        z: 0
+        anchors.fill: parent
+        onPressed: presses++
+        onClicked: clicks++
+        onPressAndHold: pressAndHolds++
+        onDoubleClicked: doubleClicks++
+    }
+    MouseArea{
+        z: 1
+        enabled: true
+        anchors.fill: parent
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/clickThrough2.qml b/tests/auto/declarative/qsgmousearea/data/clickThrough2.qml
new file mode 100644
index 0000000000..bc73a1bf8a
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/clickThrough2.qml
@@ -0,0 +1,32 @@
+import QtQuick 2.0
+
+Item{
+    width: 300
+    height: 300
+    property int doubleClicks: 0
+    property int clicks: 0
+    property int pressAndHolds: 0
+    property int presses: 0
+    property bool letThrough: false
+    Rectangle{
+        z: 0
+        color: "lightsteelblue"
+        width: 150
+        height: 150
+        MouseArea{
+            anchors.fill: parent
+            onPressed: presses++
+            onClicked: clicks++
+            onPressAndHold: pressAndHolds++
+            onDoubleClicked: doubleClicks++
+        }
+    }
+    MouseArea{
+        z: 1
+        enabled: true
+        anchors.fill: parent
+        onClicked: mouse.accepted = !letThrough;
+        onDoubleClicked: mouse.accepted = !letThrough;
+        onPressAndHold: mouse.accepted = !letThrough;
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/clickandhold.qml b/tests/auto/declarative/qsgmousearea/data/clickandhold.qml
new file mode 100644
index 0000000000..5e4e48f6db
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/clickandhold.qml
@@ -0,0 +1,13 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property bool clicked: false
+    property bool held: false
+
+    MouseArea {
+        width: 200; height: 200
+        onClicked: { root.clicked = true }
+        onPressAndHold: { root.held = true }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/clicktwice.qml b/tests/auto/declarative/qsgmousearea/data/clicktwice.qml
new file mode 100644
index 0000000000..002d1b9047
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/clicktwice.qml
@@ -0,0 +1,16 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property int clicked: 0
+    property int pressed: 0
+    property int released: 0
+
+    MouseArea {
+        width: 200; height: 200
+        onPressed: { root.pressed++ }
+        onClicked: { root.clicked++ }
+        onReleased: { root.released++ }
+    }
+}
+
diff --git a/tests/auto/declarative/qsgmousearea/data/doubleclick.qml b/tests/auto/declarative/qsgmousearea/data/doubleclick.qml
new file mode 100644
index 0000000000..1030d0c33e
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/doubleclick.qml
@@ -0,0 +1,16 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property int clicked: 0
+    property int doubleClicked: 0
+    property int released: 0
+
+    MouseArea {
+        width: 200; height: 200
+        onClicked: { root.clicked++ }
+        onDoubleClicked: { root.doubleClicked++ }
+        onReleased: { root.released++ }
+    }
+}
+
diff --git a/tests/auto/declarative/qsgmousearea/data/dragging.qml b/tests/auto/declarative/qsgmousearea/data/dragging.qml
new file mode 100644
index 0000000000..d9b6ac4083
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/dragging.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+Rectangle {
+    id: whiteRect
+    width: 200
+    height: 200
+    color: "white"
+    Rectangle {
+        id: blackRect
+        objectName: "blackrect"
+        color: "black"
+        y: 50
+        x: 50
+        width: 100
+        height: 100
+        opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200
+        Text { text: blackRect.opacity}
+        MouseArea {
+            objectName: "mouseregion"
+            anchors.fill: parent
+            drag.target: blackRect
+            drag.axis: Drag.XandYAxis
+            drag.minimumX: 0
+            drag.maximumX: whiteRect.width-blackRect.width
+            drag.minimumY: 0
+            drag.maximumY: whiteRect.height-blackRect.height
+         }
+     }
+ }
diff --git a/tests/auto/declarative/qsgmousearea/data/dragproperties.qml b/tests/auto/declarative/qsgmousearea/data/dragproperties.qml
new file mode 100644
index 0000000000..421dfe26b7
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/dragproperties.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+Rectangle {
+    id: whiteRect
+    width: 200 
+    height: 200
+    color: "white"
+    Rectangle {
+        id: blackRect
+        objectName: "blackrect"
+        color: "black"
+        y: 50
+        x: 50
+        width: 100
+        height: 100
+        opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200
+        Text { text: blackRect.opacity}
+        MouseArea {
+            objectName: "mouseregion"
+            anchors.fill: parent
+            drag.target: blackRect
+            drag.axis: Drag.XandYAxis
+            drag.minimumX: 0
+            drag.maximumX: whiteRect.width-blackRect.width
+            drag.minimumY: 0
+            drag.maximumY: whiteRect.height-blackRect.height
+         }
+     }
+ }
diff --git a/tests/auto/declarative/qsgmousearea/data/dragreset.qml b/tests/auto/declarative/qsgmousearea/data/dragreset.qml
new file mode 100644
index 0000000000..d7949f9139
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/dragreset.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+Rectangle {
+    id: whiteRect
+    width: 200 
+    height: 200
+    color: "white"
+    Rectangle {
+        id: blackRect
+        objectName: "blackrect"
+        color: "black"
+        y: 50
+        x: 50
+        width: 100
+        height: 100
+        opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200
+        Text { text: blackRect.opacity}
+        MouseArea {
+            objectName: "mouseregion"
+            anchors.fill: parent
+            drag.target: haveTarget ? blackRect : undefined
+            drag.axis: Drag.XandYAxis
+            drag.minimumX: 0
+            drag.maximumX: whiteRect.width-blackRect.width
+            drag.minimumY: 0
+            drag.maximumY: whiteRect.height-blackRect.height
+         }
+     }
+ }
diff --git a/tests/auto/declarative/qsgmousearea/data/hoverPosition.qml b/tests/auto/declarative/qsgmousearea/data/hoverPosition.qml
new file mode 100644
index 0000000000..834f91ff29
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/hoverPosition.qml
@@ -0,0 +1,17 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400; height: 400;
+
+    property real mouseX: mousetracker.mouseX
+    property real mouseY: mousetracker.mouseY
+
+    Rectangle {
+        width: 100; height: 100;
+        MouseArea {
+            id: mousetracker;
+            anchors.fill: parent;
+            hoverEnabled: true
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/pressedOrdering.qml b/tests/auto/declarative/qsgmousearea/data/pressedOrdering.qml
new file mode 100644
index 0000000000..7aa3098100
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/pressedOrdering.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property string value: "base"
+
+    MouseArea {
+        id: mouseArea
+        width: 200; height: 200
+        onClicked: toggleState.state = "toggled"
+    }
+
+    StateGroup {
+        states: State {
+            name: "pressed"
+            when: mouseArea.pressed
+            PropertyChanges { target: root; value: "pressed" }
+        }
+    }
+
+    StateGroup {
+        id: toggleState
+        states: State {
+            name: "toggled"
+            PropertyChanges { target: root; value: "toggled" }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/preventstealing.qml b/tests/auto/declarative/qsgmousearea/data/preventstealing.qml
new file mode 100644
index 0000000000..fb0d6955c1
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/preventstealing.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Flickable {
+    property bool stealing: true
+    width: 200
+    height: 200
+    contentWidth: 400
+    contentHeight: 400
+    Rectangle {
+        color: "black"
+        width: 400
+        height: 400
+        Rectangle {
+            x: 50; y: 50
+            width: 100; height: 100
+            color: "steelblue"
+            MouseArea {
+                objectName: "mousearea"
+                anchors.fill: parent
+                preventStealing: stealing
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/rejectEvent.qml b/tests/auto/declarative/qsgmousearea/data/rejectEvent.qml
new file mode 100644
index 0000000000..816fc76fac
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/rejectEvent.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    color: "#ffffff"
+    width: 320; height: 240
+    property bool mr1_pressed: false
+    property bool mr1_released: false
+    property bool mr1_canceled: false
+    property bool mr2_pressed: false
+    property bool mr2_released: false
+    property bool mr2_canceled: false
+
+    MouseArea {
+        id: mouseRegion1
+        anchors.fill: parent
+        onPressed: { root.mr1_pressed = true }
+        onReleased: { root.mr1_released = true }
+        onCanceled: { root.mr1_canceled = true }
+    }
+    MouseArea {
+        id: mouseRegion2
+        width: 120; height: 120
+        onPressed: { root.mr2_pressed = true; mouse.accepted = false }
+        onReleased: { root.mr2_released = true }
+        onCanceled: { root.mr2_canceled = true }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/updateMousePosOnClick.qml b/tests/auto/declarative/qsgmousearea/data/updateMousePosOnClick.qml
new file mode 100644
index 0000000000..7377a2e86c
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/updateMousePosOnClick.qml
@@ -0,0 +1,20 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "#ffffff"
+    width: 320; height: 240
+    MouseArea {
+        id: mouseRegion
+        objectName: "mouseregion"
+        anchors.fill: parent
+        Rectangle {
+            id: ball
+            objectName: "ball"
+            width: 20; height: 20
+            radius: 10
+            color: "#0000ff"
+            x: { mouseRegion.mouseX }
+            y: mouseRegion.mouseY
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/data/updateMousePosOnResize.qml b/tests/auto/declarative/qsgmousearea/data/updateMousePosOnResize.qml
new file mode 100644
index 0000000000..ad52ef3820
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/data/updateMousePosOnResize.qml
@@ -0,0 +1,38 @@
+import QtQuick 2.0
+
+Rectangle {
+    color: "#ffffff"
+    width: 320; height: 240
+    Rectangle {
+        id: brother
+        objectName: "brother"
+        color: "lightgreen"
+        x: 200; y: 100
+        width: 120; height: 120
+    }
+    MouseArea {
+        id: mouseRegion
+        objectName: "mouseregion"
+
+        property int x1
+        property int y1
+        property int x2
+        property int y2
+        property bool emitPositionChanged: false
+        property bool mouseMatchesPos: true
+
+        anchors.fill: brother
+        onPressed: {
+            if (mouse.x != mouseX || mouse.y != mouseY)
+                mouseMatchesPos = false
+            x1 = mouseX; y1 = mouseY
+            anchors.fill = parent
+        }
+        onPositionChanged: { emitPositionChanged = true }
+        onMousePositionChanged: {
+            if (mouse.x != mouseX || mouse.y != mouseY)
+                mouseMatchesPos = false
+            x2 = mouseX; y2 = mouseY
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgmousearea/qsgmousearea.pro b/tests/auto/declarative/qsgmousearea/qsgmousearea.pro
new file mode 100644
index 0000000000..7d47ce3ae3
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/qsgmousearea.pro
@@ -0,0 +1,17 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui network
+macx:CONFIG -= app_bundle
+
+HEADERS += ../shared/testhttpserver.h
+SOURCES += tst_qsgmousearea.cpp ../shared/testhttpserver.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp
new file mode 100644
index 0000000000..857f888c29
--- /dev/null
+++ b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp
@@ -0,0 +1,705 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtTest/QSignalSpy>
+#include <private/qsgmousearea_p.h>
+#include <private/qsgrectangle_p.h>
+#include <private/qsgflickable_p.h>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QSGMouseArea: public QObject
+{
+    Q_OBJECT
+private slots:
+    void dragProperties();
+    void resetDrag();
+    void dragging();
+    void updateMouseAreaPosOnClick();
+    void updateMouseAreaPosOnResize();
+    void noOnClickedWithPressAndHold();
+    void onMousePressRejected();
+    void doubleClick();
+    void clickTwice();
+    void pressedOrdering();
+    void preventStealing();
+    void clickThrough();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+    void hoverPosition();
+
+private:
+    QSGView *createView();
+};
+
+void tst_QSGMouseArea::dragProperties()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragproperties.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGMouseArea *mouseRegion = canvas->rootObject()->findChild<QSGMouseArea*>("mouseregion");
+    QSGDrag *drag = mouseRegion->drag();
+    QVERIFY(mouseRegion != 0);
+    QVERIFY(drag != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+    QVERIFY(blackRect == drag->target());
+    QSGItem *rootItem = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(rootItem != 0);
+    QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
+    drag->setTarget(rootItem);
+    QCOMPARE(targetSpy.count(),1);
+    drag->setTarget(rootItem);
+    QCOMPARE(targetSpy.count(),1);
+
+    // axis
+    QCOMPARE(drag->axis(), QSGDrag::XandYAxis);
+    QSignalSpy axisSpy(drag, SIGNAL(axisChanged()));
+    drag->setAxis(QSGDrag::XAxis);
+    QCOMPARE(drag->axis(), QSGDrag::XAxis);
+    QCOMPARE(axisSpy.count(),1);
+    drag->setAxis(QSGDrag::XAxis);
+    QCOMPARE(axisSpy.count(),1);
+
+    // minimum and maximum properties
+    QSignalSpy xminSpy(drag, SIGNAL(minimumXChanged()));
+    QSignalSpy xmaxSpy(drag, SIGNAL(maximumXChanged()));
+    QSignalSpy yminSpy(drag, SIGNAL(minimumYChanged()));
+    QSignalSpy ymaxSpy(drag, SIGNAL(maximumYChanged()));
+
+    QCOMPARE(drag->xmin(), 0.0);
+    QCOMPARE(drag->xmax(), rootItem->width()-blackRect->width());
+    QCOMPARE(drag->ymin(), 0.0);
+    QCOMPARE(drag->ymax(), rootItem->height()-blackRect->height());
+
+    drag->setXmin(10);
+    drag->setXmax(10);
+    drag->setYmin(10);
+    drag->setYmax(10);
+
+    QCOMPARE(drag->xmin(), 10.0);
+    QCOMPARE(drag->xmax(), 10.0);
+    QCOMPARE(drag->ymin(), 10.0);
+    QCOMPARE(drag->ymax(), 10.0);
+
+    QCOMPARE(xminSpy.count(),1);
+    QCOMPARE(xmaxSpy.count(),1);
+    QCOMPARE(yminSpy.count(),1);
+    QCOMPARE(ymaxSpy.count(),1);
+
+    drag->setXmin(10);
+    drag->setXmax(10);
+    drag->setYmin(10);
+    drag->setYmax(10);
+
+    QCOMPARE(xminSpy.count(),1);
+    QCOMPARE(xmaxSpy.count(),1);
+    QCOMPARE(yminSpy.count(),1);
+    QCOMPARE(ymaxSpy.count(),1);
+
+    // filterChildren
+    QSignalSpy filterChildrenSpy(drag, SIGNAL(filterChildrenChanged()));
+
+    drag->setFilterChildren(true);
+
+    QVERIFY(drag->filterChildren());
+    QCOMPARE(filterChildrenSpy.count(), 1);
+
+    drag->setFilterChildren(true);
+    QCOMPARE(filterChildrenSpy.count(), 1);
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::resetDrag()
+{
+    QSGView *canvas = createView();
+
+    canvas->rootContext()->setContextProperty("haveTarget", QVariant(true));
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragreset.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGMouseArea *mouseRegion = canvas->rootObject()->findChild<QSGMouseArea*>("mouseregion");
+    QSGDrag *drag = mouseRegion->drag();
+    QVERIFY(mouseRegion != 0);
+    QVERIFY(drag != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+    QVERIFY(blackRect == drag->target());
+    QSGItem *rootItem = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(rootItem != 0);
+    QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
+    QVERIFY(drag->target() != 0);
+    canvas->rootContext()->setContextProperty("haveTarget", QVariant(false));
+    QCOMPARE(targetSpy.count(),1);
+    QVERIFY(drag->target() == 0);
+
+    delete canvas;
+}
+
+
+void tst_QSGMouseArea::dragging()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragging.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGMouseArea *mouseRegion = canvas->rootObject()->findChild<QSGMouseArea*>("mouseregion");
+    QSGDrag *drag = mouseRegion->drag();
+    QVERIFY(mouseRegion != 0);
+    QVERIFY(drag != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+    QVERIFY(blackRect == drag->target());
+
+    QVERIFY(!drag->active());
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QVERIFY(!drag->active());
+    QCOMPARE(blackRect->x(), 50.0);
+    QCOMPARE(blackRect->y(), 50.0);
+
+    // First move event triggers drag, second is acted upon.
+    // This is due to possibility of higher stacked area taking precedence.
+    QMouseEvent moveEvent(QEvent::MouseMove, QPoint(106, 106), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(110, 110), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    QVERIFY(drag->active());
+    QCOMPARE(blackRect->x(), 60.0);
+    QCOMPARE(blackRect->y(), 60.0);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(110, 110), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QVERIFY(!drag->active());
+    QCOMPARE(blackRect->x(), 60.0);
+    QCOMPARE(blackRect->y(), 60.0);
+
+    delete canvas;
+}
+
+QSGView *tst_QSGMouseArea::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+void tst_QSGMouseArea::updateMouseAreaPosOnClick()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnClick.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGMouseArea *mouseRegion = canvas->rootObject()->findChild<QSGMouseArea*>("mouseregion");
+    QVERIFY(mouseRegion != 0);
+
+    QSGRectangle *rect = canvas->rootObject()->findChild<QSGRectangle*>("ball");
+    QVERIFY(rect != 0);
+
+    QCOMPARE(mouseRegion->mouseX(), rect->x());
+    QCOMPARE(mouseRegion->mouseY(), rect->y());
+
+    QMouseEvent event(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &event);
+
+    QCOMPARE(mouseRegion->mouseX(), 100.0);
+    QCOMPARE(mouseRegion->mouseY(), 100.0);
+
+    QCOMPARE(mouseRegion->mouseX(), rect->x());
+    QCOMPARE(mouseRegion->mouseY(), rect->y());
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::updateMouseAreaPosOnResize()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnResize.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGMouseArea *mouseRegion = canvas->rootObject()->findChild<QSGMouseArea*>("mouseregion");
+    QVERIFY(mouseRegion != 0);
+
+    QSGRectangle *rect = canvas->rootObject()->findChild<QSGRectangle*>("brother");
+    QVERIFY(rect != 0);
+
+    QCOMPARE(mouseRegion->mouseX(), 0.0);
+    QCOMPARE(mouseRegion->mouseY(), 0.0);
+
+    QMouseEvent event(QEvent::MouseButtonPress, rect->pos().toPoint(), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &event);
+
+    QVERIFY(!mouseRegion->property("emitPositionChanged").toBool());
+    QVERIFY(mouseRegion->property("mouseMatchesPos").toBool());
+
+    QCOMPARE(mouseRegion->property("x1").toInt(), 0);
+    QCOMPARE(mouseRegion->property("y1").toInt(), 0);
+
+    // XXX: is it on purpose that mouseX is real and mouse.x is int?
+    QCOMPARE(mouseRegion->property("x2").toInt(), (int) rect->x());
+    QCOMPARE(mouseRegion->property("y2").toInt(), (int) rect->y());
+
+    QCOMPARE(mouseRegion->mouseX(), rect->x());
+    QCOMPARE(mouseRegion->mouseY(), rect->y());
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::noOnClickedWithPressAndHold()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QVERIFY(!canvas->rootObject()->property("clicked").toBool());
+    QVERIFY(!canvas->rootObject()->property("held").toBool());
+
+    QTest::qWait(1000);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QVERIFY(!canvas->rootObject()->property("clicked").toBool());
+    QVERIFY(canvas->rootObject()->property("held").toBool());
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::onMousePressRejected()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rejectEvent.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+    QVERIFY(canvas->rootObject()->property("enabled").toBool());
+
+    QVERIFY(!canvas->rootObject()->property("mr1_pressed").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr2_pressed").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr2_canceled").toBool());
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QVERIFY(canvas->rootObject()->property("mr1_pressed").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
+    QVERIFY(canvas->rootObject()->property("mr2_pressed").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
+    QVERIFY(canvas->rootObject()->property("mr2_canceled").toBool());
+
+    QTest::qWait(200);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QVERIFY(canvas->rootObject()->property("mr1_released").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
+    QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::doubleClick()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/doubleclick.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
+
+    pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
+
+    delete canvas;
+}
+
+// QTBUG-14832
+void tst_QSGMouseArea::clickTwice()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clicktwice.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
+
+    pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 2);
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
+    QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 2);
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::pressedOrdering()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedOrdering.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("base"));
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("toggled"));
+
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::preventStealing()
+{
+    QSGView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventstealing.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGFlickable *flickable = qobject_cast<QSGFlickable*>(canvas->rootObject());
+    QVERIFY(flickable != 0);
+
+    QSGMouseArea *mouseArea = canvas->rootObject()->findChild<QSGMouseArea*>("mousearea");
+    QVERIFY(mouseArea != 0);
+
+    QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QSGMouseEvent*)));
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(80, 80));
+
+    // Without preventStealing, mouse movement over MouseArea would
+    // cause the Flickable to steal mouse and trigger content movement.
+
+    QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(60, 60), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    // We should have received all three move events
+    QCOMPARE(mousePositionSpy.count(), 3);
+    QVERIFY(mouseArea->pressed());
+
+    // Flickable content should not have moved.
+    QCOMPARE(flickable->contentX(), 0.);
+    QCOMPARE(flickable->contentY(), 0.);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50, 50));
+
+    // Now allow stealing and confirm Flickable does its thing.
+    canvas->rootObject()->setProperty("stealing", false);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(80, 80));
+
+    // Without preventStealing, mouse movement over MouseArea would
+    // cause the Flickable to steal mouse and trigger content movement.
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(60, 60), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    moveEvent = QMouseEvent(QEvent::MouseMove, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    // We should only have received the first move event
+    QCOMPARE(mousePositionSpy.count(), 4);
+    // Our press should be taken away
+    QVERIFY(!mouseArea->pressed());
+
+    // Flickable content should have moved.
+    QCOMPARE(flickable->contentX(), 10.);
+    QCOMPARE(flickable->contentY(), 10.);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50, 50));
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::clickThrough()
+{
+    //With no handlers defined click, doubleClick and PressAndHold should propagate to those with handlers
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickThrough.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 1);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QTest::qWait(1000);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 1);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+    pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 2);
+    QCOMPARE(canvas->rootObject()->property("doubleClicks").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 1);
+
+    delete canvas;
+
+    //With handlers defined click, doubleClick and PressAndHold should propagate only when explicitly ignored
+    canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickThrough2.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    pressEvent = QMouseEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    releaseEvent = QMouseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 0);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QTest::qWait(1000);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 0);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("doubleClicks").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 0);
+
+    canvas->rootObject()->setProperty("letThrough", QVariant(true));
+
+    pressEvent = QMouseEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &pressEvent);
+
+    releaseEvent = QMouseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 1);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QTest::qWait(1000);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 1);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+    pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0);
+
+    QApplication::sendEvent(canvas, &pressEvent);
+    QApplication::sendEvent(canvas, &releaseEvent);
+
+    QCOMPARE(canvas->rootObject()->property("presses").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("clicks").toInt(), 2);
+    QCOMPARE(canvas->rootObject()->property("doubleClicks").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("pressAndHolds").toInt(), 1);
+
+    delete canvas;
+}
+
+void tst_QSGMouseArea::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 1.1; MouseArea { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; MouseArea { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_QSGMouseArea::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("preventStealing") << "preventStealing: true"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"MouseArea.preventStealing\" is not available in QtQuick 1.0.\n";
+}
+
+void tst_QSGMouseArea::hoverPosition()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/hoverPosition.qml"));
+
+    QSGItem *root = canvas->rootObject();
+    QVERIFY(root != 0);
+
+    QCOMPARE(root->property("mouseX").toReal(), qreal(0));
+    QCOMPARE(root->property("mouseY").toReal(), qreal(0));
+
+    QMouseEvent moveEvent(QEvent::MouseMove, QPoint(10, 32), Qt::NoButton, Qt::NoButton, 0);
+    QApplication::sendEvent(canvas, &moveEvent);
+
+    QCOMPARE(root->property("mouseX").toReal(), qreal(10));
+    QCOMPARE(root->property("mouseY").toReal(), qreal(32));
+
+    delete canvas;
+}
+
+QTEST_MAIN(tst_QSGMouseArea)
+
+#include "tst_qsgmousearea.moc"
diff --git a/tests/auto/declarative/qsgpathview/data/closedPath.qml b/tests/auto/declarative/qsgpathview/data/closedPath.qml
new file mode 100644
index 0000000000..3ca34056c8
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/closedPath.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Path {
+    startY: 120
+    startX: 160
+    PathQuad {
+        y: 120
+        x: 80
+        controlY: 330
+        controlX: 100
+    }
+    PathLine {
+        y: 160
+        x: 20
+    }
+    PathCubic {
+        y: 120
+        x: 160
+        control1Y: 0
+        control1X: 100
+        control2Y: 000
+        control2X: 200
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/datamodel.qml b/tests/auto/declarative/qsgpathview/data/datamodel.qml
new file mode 100644
index 0000000000..839049f1fc
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/datamodel.qml
@@ -0,0 +1,37 @@
+import QtQuick 2.0
+
+PathView {
+    id: pathview
+    objectName: "pathview"
+    width: 240; height: 320
+    pathItemCount: testObject.pathItemCount
+
+    function checkProperties() {
+        testObject.error = false;
+        if (testObject.useModel && pathview.model != testData) {
+            console.log("model property incorrect");
+            testObject.error = true;
+        }
+    }
+
+    model: testObject.useModel ? testData : 0
+
+    delegate: Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            property bool onPath: PathView.onPath
+            width: 20; height: 20; color: name
+            Text {
+                objectName: "myText"
+                text: name
+            }
+        }
+    }
+
+    path: Path {
+        startX: 120; startY: 20;
+        PathLine { x: 120; y: 300 }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/displaypath.qml b/tests/auto/declarative/qsgpathview/data/displaypath.qml
new file mode 100644
index 0000000000..af0f381fc4
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/displaypath.qml
@@ -0,0 +1,59 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: delegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: 20
+                width: 60
+                color: "white"
+                border.color: "black"
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 20
+                    id: displayText
+                    objectName: "displayText"
+                    text: display
+                }
+            }
+        }
+    ]
+    PathView {
+        id: view
+        objectName: "view"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: delegate
+        path: Path {
+            startY: 120
+            startX: 160
+            PathQuad {
+                y: 120
+                x: 80
+                controlY: 330
+                controlX: 100
+            }
+            PathLine {
+                y: 160
+                x: 20
+            }
+            PathCubic {
+                y: 120
+                x: 160
+                control1Y: 0
+                control1X: 100
+                control2Y: 000
+                control2X: 200
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/dragpath.qml b/tests/auto/declarative/qsgpathview/data/dragpath.qml
new file mode 100644
index 0000000000..f9c6615b04
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/dragpath.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+PathView {
+    width: 400
+    height: 200
+    model: 100
+    pathItemCount: 20
+    path: Path {
+        startX: 0; startY: 100
+        PathLine { x: 400; y: 100 }
+    }
+    delegate: Rectangle { objectName: "wrapper"; height: 100; width: 2; color: PathView.isCurrentItem?"red" : "black" }
+    dragMargin: 100
+    preferredHighlightBegin: 0.5
+    preferredHighlightEnd: 0.5
+    Text {
+        text: "current index: " + parent.currentIndex
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/emptymodel.qml b/tests/auto/declarative/qsgpathview/data/emptymodel.qml
new file mode 100644
index 0000000000..eb4d3006f4
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/emptymodel.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+PathView {
+    model: emptyModel
+}
diff --git a/tests/auto/declarative/qsgpathview/data/openPath.qml b/tests/auto/declarative/qsgpathview/data/openPath.qml
new file mode 100644
index 0000000000..1bd8375d9e
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/openPath.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Path {
+    startY: 120
+    startX: 160
+    PathLine {
+        y: 160
+        x: 20
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathUpdate.qml b/tests/auto/declarative/qsgpathview/data/pathUpdate.qml
new file mode 100644
index 0000000000..e729291025
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathUpdate.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle {
+   width: 400
+   height: 400
+
+   PathView {
+       id: view
+       objectName: "pathView"
+       anchors.fill: parent
+       model: 10
+       delegate: Rectangle { objectName: "wrapper"; color: "green"; width: 100; height: 100 }
+       path: Path {
+           startX: view.width/2; startY: 0
+           PathLine { x: view.width/2; y: view.height }
+       }
+   }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathUpdateOnStartChanged.qml b/tests/auto/declarative/qsgpathview/data/pathUpdateOnStartChanged.qml
new file mode 100644
index 0000000000..89084b2a37
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathUpdateOnStartChanged.qml
@@ -0,0 +1,38 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 800
+    height: 480
+    color: "black"
+    resources: [
+        ListModel {
+            id: appModel
+            ListElement { color: "green" }
+        },
+        Component {
+            id: appDelegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                color: "green"
+                width: 100
+                height: 100
+            }
+        }
+    ]
+    PathView {
+        id: pathView
+        objectName: "pathView"
+        model: appModel
+        anchors.fill: parent
+
+        transformOrigin: "Top"
+        delegate: appDelegate
+        path: Path {
+            objectName: "path"
+            startX: pathView.width / 2 // startX: 400 <- this works as expected
+            startY: 300
+            PathLine { x: 400; y: 120 }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathtest.qml b/tests/auto/declarative/qsgpathview/data/pathtest.qml
new file mode 100644
index 0000000000..736d58d2a9
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathtest.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Path {
+    startX: 120; startY: 100
+
+    PathAttribute { name: "scale"; value: 1.0 }
+    PathQuad { x: 120; y: 25; controlX: 260; controlY: 75 }
+    PathPercent { value: 0.3 }
+    PathLine { x: 120; y: 100 }
+    PathCubic {
+        x: 180; y: 0; control1X: -10; control1Y: 90
+        control2X: 210; control2Y: 90
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathview0.qml b/tests/auto/declarative/qsgpathview/data/pathview0.qml
new file mode 100644
index 0000000000..0204112812
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathview0.qml
@@ -0,0 +1,83 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    property int currentA: -1
+    property int currentB: -1
+    property real delegateWidth: 60
+    property real delegateHeight: 20
+    property real delegateScale: 1.0
+    width: 240
+    height: 320
+    color: "#ffffff"
+    resources: [
+        Component {
+            id: delegate
+            Rectangle {
+                id: wrapper
+                objectName: "wrapper"
+                height: root.delegateHeight
+                width: root.delegateWidth
+                scale: root.delegateScale
+                color: PathView.isCurrentItem ? "lightsteelblue" : "white"
+                border.color: "black"
+                Text {
+                    text: index
+                }
+                Text {
+                    x: 20
+                    id: textName
+                    objectName: "textName"
+                    text: name
+                }
+                Text {
+                    x: 40
+                    id: textNumber
+                    objectName: "textNumber"
+                    text: number
+                }
+                PathView.onCurrentItemChanged: {
+                    if (PathView.isCurrentItem) {
+                        root.currentA = index;
+                        root.currentB = wrapper.PathView.view.currentIndex;
+                    }
+                }
+            }
+        }
+    ]
+    PathView {
+        id: view
+        objectName: "view"
+        width: 240
+        height: 320
+        model: testModel
+        delegate: delegate
+        highlight: Rectangle {
+            width: 60
+            height: 20
+            color: "yellow"
+        }
+        path: Path {
+            startY: 120
+            startX: 160
+            PathQuad {
+                y: 120
+                x: 80
+                controlY: 330
+                controlX: 100
+            }
+            PathLine {
+                y: 160
+                x: 20
+            }
+            PathCubic {
+                y: 120
+                x: 160
+                control1Y: 0
+                control1X: 100
+                control2Y: 000
+                control2X: 200
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathview1.qml b/tests/auto/declarative/qsgpathview/data/pathview1.qml
new file mode 100644
index 0000000000..53d375e596
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathview1.qml
@@ -0,0 +1,4 @@
+import QtQuick 2.0
+
+PathView {
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathview2.qml b/tests/auto/declarative/qsgpathview/data/pathview2.qml
new file mode 100644
index 0000000000..1d279c42a0
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathview2.qml
@@ -0,0 +1,57 @@
+import QtQuick 2.0
+
+PathView {
+    id: photoPathView
+    y: 100; width: 800; height: 330; pathItemCount: 10; z: 1
+
+    path: Path {
+        startX: -50; startY: 40;
+
+        PathAttribute { name: "scale"; value: 0.5 }
+        PathAttribute { name: "angle"; value: -45 }
+
+        PathCubic {
+            x: 400; y: 220
+            control1X: 140; control1Y: 40
+            control2X: 210; control2Y: 220
+        }
+
+        PathAttribute { name: "scale"; value: 1.2  }
+        PathAttribute { name: "angle"; value: 0 }
+
+        PathCubic {
+            x: 850; y: 40
+            control2X: 660; control2Y: 40
+            control1X: 590; control1Y: 220
+        }
+
+        PathAttribute { name: "scale"; value: 0.5 }
+        PathAttribute { name: "angle"; value: 45 }
+    }
+
+    model: ListModel {
+        id: rssModel
+        ListElement { lColor: "red" }
+        ListElement { lColor: "green" }
+        ListElement { lColor: "yellow" }
+        ListElement { lColor: "blue" }
+        ListElement { lColor: "purple" }
+        ListElement { lColor: "gray" }
+        ListElement { lColor: "brown" }
+        ListElement { lColor: "thistle" }
+    }
+
+    delegate: Component {
+        id: photoDelegate
+        Rectangle {
+            id: wrapper
+            width: 85; height: 85; color: lColor
+            scale: wrapper.PathView.scale
+
+            transform: Rotation {
+                id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2
+                axis.y: 1; axis.z: 0; angle: wrapper.PathView.angle
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathview3.qml b/tests/auto/declarative/qsgpathview/data/pathview3.qml
new file mode 100644
index 0000000000..ded5a3911c
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathview3.qml
@@ -0,0 +1,59 @@
+import QtQuick 2.0
+
+PathView {
+    id: photoPathView
+    y: 100; width: 800; height: 330; pathItemCount: 4; offset: 1
+    dragMargin: 24
+    preferredHighlightBegin: 0.50
+    preferredHighlightEnd: 0.50
+
+    path: Path {
+        startX: -50; startY: 40;
+
+        PathAttribute { name: "scale"; value: 0.5 }
+        PathAttribute { name: "angle"; value: -45 }
+
+        PathCubic {
+            x: 400; y: 220
+            control1X: 140; control1Y: 40
+            control2X: 210; control2Y: 220
+        }
+
+        PathAttribute { name: "scale"; value: 1.2  }
+        PathAttribute { name: "angle"; value: 0 }
+
+        PathCubic {
+            x: 850; y: 40
+            control2X: 660; control2Y: 40
+            control1X: 590; control1Y: 220
+        }
+
+        PathAttribute { name: "scale"; value: 0.5 }
+        PathAttribute { name: "angle"; value: 45 }
+    }
+
+    model: ListModel {
+        id: rssModel
+        ListElement { lColor: "red" }
+        ListElement { lColor: "green" }
+        ListElement { lColor: "yellow" }
+        ListElement { lColor: "blue" }
+        ListElement { lColor: "purple" }
+        ListElement { lColor: "gray" }
+        ListElement { lColor: "brown" }
+        ListElement { lColor: "thistle" }
+    }
+
+    delegate: Component {
+        id: photoDelegate
+        Rectangle {
+            id: wrapper
+            width: 85; height: 85; color: lColor
+
+            transform: Rotation {
+                id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2
+                axis.y: 1; axis.z: 0
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/pathview_package.qml b/tests/auto/declarative/qsgpathview/data/pathview_package.qml
new file mode 100644
index 0000000000..2af57e6bb1
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/pathview_package.qml
@@ -0,0 +1,88 @@
+import QtQuick 2.0
+
+Item {
+    width: 800; height: 600
+    Component {
+        id: photoDelegate
+        Package {
+            Item { id: pathItem; objectName: "pathItem"; Package.name: 'path'; width: 85; height: 85; scale: pathItem.PathView.scale }
+            Item { id: linearItem; Package.name: 'linear'; width: 85; height: 85 }
+            Rectangle {
+                id: wrapper
+                width: 85; height: 85; color: lColor
+
+                transform: Rotation {
+                    id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2
+                    axis.y: 1; axis.z: 0
+                }
+                state: 'path'
+                states: [
+                    State {
+                        name: 'path'
+                        ParentChange { target: wrapper; parent: pathItem; x: 0; y: 0 }
+                        PropertyChanges { target: wrapper; opacity: pathItem.PathView.onPath ? 1.0 : 0 }
+                    }
+                ]
+            }
+        }
+    }
+    ListModel {
+        id: rssModel
+        ListElement { lColor: "red" }
+        ListElement { lColor: "green" }
+        ListElement { lColor: "yellow" }
+        ListElement { lColor: "blue" }
+        ListElement { lColor: "purple" }
+        ListElement { lColor: "gray" }
+        ListElement { lColor: "brown" }
+        ListElement { lColor: "thistle" }
+    }
+    VisualDataModel { id: visualModel; model: rssModel; delegate: photoDelegate }
+
+    PathView {
+        id: photoPathView
+        objectName: "photoPathView"
+        width: 800; height: 330; pathItemCount: 4; offset: 1
+        dragMargin: 24
+        preferredHighlightBegin: 0.50
+        preferredHighlightEnd: 0.50
+
+        path: Path {
+            startX: -50; startY: 40;
+
+            PathAttribute { name: "scale"; value: 0.5 }
+            PathAttribute { name: "angle"; value: -45 }
+
+            PathCubic {
+                x: 400; y: 220
+                control1X: 140; control1Y: 40
+                control2X: 210; control2Y: 220
+            }
+
+            PathAttribute { name: "scale"; value: 1.2  }
+            PathAttribute { name: "angle"; value: 0 }
+
+            PathCubic {
+                x: 850; y: 40
+                control2X: 660; control2Y: 40
+                control1X: 590; control1Y: 220
+            }
+
+            PathAttribute { name: "scale"; value: 0.5 }
+            PathAttribute { name: "angle"; value: 45 }
+        }
+
+        model: visualModel.parts.path
+    }
+
+    PathView {
+        y: 400; width: 800; height: 330; pathItemCount: 8
+
+        path: Path {
+            startX: 0; startY: 40;
+            PathLine { x: 800; y: 40 }
+        }
+
+        model: visualModel.parts.linear
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/propertychanges.qml b/tests/auto/declarative/qsgpathview/data/propertychanges.qml
new file mode 100644
index 0000000000..09b309f86f
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/propertychanges.qml
@@ -0,0 +1,116 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 350; height: 220; color: "white"
+    Component {
+        id: myDelegate
+        Item {
+            id: wrapper
+            width: 180; height: 40; 
+            opacity: PathView.opacity
+            Column {
+                x: 5; y: 5
+                Text { text: '<b>Name:</b> ' + name }
+                Text { text: '<b>Number:</b> ' + number }
+            }
+        }
+    }
+
+    PathView {
+        preferredHighlightBegin: 0.1
+        preferredHighlightEnd: 0.1
+        dragMargin: 5.0
+        id: pathView
+        objectName: "pathView"
+        anchors.fill: parent
+        model: listModel
+        delegate: myDelegate
+        focus: true
+        path: Path {
+            id: myPath
+            objectName: "path"
+            startX: 220; startY: 200
+            PathAttribute { name: "opacity"; value: 1.0; objectName: "pathAttribute"; }
+            PathQuad { x: 220; y: 25; controlX: 260; controlY: 75 }
+            PathAttribute { name: "opacity"; value: 0.3 }
+            PathQuad { x: 220; y: 200; controlX: -20; controlY: 75 }
+        }
+        Timer {
+            interval: 2000; running: true; repeat: true
+            onTriggered: {
+                if (pathView.path == alternatePath)
+                    pathView.path = myPath;
+                else
+                    pathView.path = alternatePath;
+            }
+        }
+    }
+
+    data:[  
+    ListModel {
+        id: listModel
+        ListElement {
+            name: "Bill Smith"
+            number: "555 3264"
+        }
+        ListElement {
+            name: "John Brown"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Sam Wise"
+            number: "555 0473"
+        }
+        ListElement {
+            name: "Bill Smith"
+            number: "555 3264"
+        }
+        ListElement {
+            name: "John Brown"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Sam Wise"
+            number: "555 0473"
+        }
+        ListElement {
+            name: "Bill Smith"
+            number: "555 3264"
+        }
+        ListElement {
+            name: "John Brown"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Sam Wise"
+            number: "555 0473"
+        }
+    },
+    ListModel {
+        objectName: "alternateModel"
+        ListElement {
+            name: "Jack"
+            number: "555 8426"
+        }
+        ListElement {
+            name: "Mary"
+            number: "555 3264"
+        }
+    },
+    Path {
+        id: alternatePath
+        objectName: "alternatePath"
+        startX: 100; startY: 40
+        PathAttribute { name: "opacity"; value: 0.0 }
+        PathLine { x: 100; y: 160 }
+        PathAttribute { name: "opacity"; value: 0.2 }
+        PathLine { x: 300; y: 160 }
+        PathAttribute { name: "opacity"; value: 0.0 }
+        PathLine { x: 300; y: 40 }
+        PathAttribute { name: "opacity"; value: 0.2 }
+        PathLine { x: 100; y: 40 }
+    }
+    ]
+}
+
+
diff --git a/tests/auto/declarative/qsgpathview/data/treemodel.qml b/tests/auto/declarative/qsgpathview/data/treemodel.qml
new file mode 100644
index 0000000000..fcf6922d00
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/treemodel.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+PathView {
+    width: 320
+    height: 240
+    function setRoot(index) {
+        vdm.rootIndex = vdm.modelIndex(index);
+    }
+    model: VisualDataModel {
+        id: vdm
+        model: myModel
+        delegate: Text { objectName: "wrapper"; text: display }
+    }
+
+    path: Path {
+        startX: 0; startY: 120
+        PathLine { x: 320; y: 120 }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/undefinedpath.qml b/tests/auto/declarative/qsgpathview/data/undefinedpath.qml
new file mode 100644
index 0000000000..674e7cca8d
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/undefinedpath.qml
@@ -0,0 +1,17 @@
+import QtQuick 2.0
+
+PathView {
+    id: pathView
+    width: 240; height: 200
+    path: Path {
+        startX: pathView.undef/2.0; startY: 0
+        PathLine { x: pathView.undef/2.0; y: 0 }
+    }
+
+    delegate: Text { text: value }
+    model: ListModel {
+        ListElement { value: "one" }
+        ListElement { value: "two" }
+        ListElement { value: "three" }
+    }
+}
diff --git a/tests/auto/declarative/qsgpathview/data/vdm.qml b/tests/auto/declarative/qsgpathview/data/vdm.qml
new file mode 100644
index 0000000000..839393d9bd
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/data/vdm.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+PathView {
+    id: pathView
+    width: 240; height: 320
+
+    pathItemCount: 4
+    preferredHighlightBegin : 0.5
+    preferredHighlightEnd : 0.5
+
+    path: Path {
+        startX: 120; startY: 20;
+        PathLine { x: 120; y: 300 }
+    }
+
+    ListModel {
+        id: mo
+        ListElement { value: "one" }
+        ListElement { value: "two" }
+        ListElement { value: "three" }
+    }
+
+    model: VisualDataModel {
+        delegate: Text { text: model.value }
+        model : mo
+    }
+}
+
diff --git a/tests/auto/declarative/qsgpathview/qsgpathview.pro b/tests/auto/declarative/qsgpathview/qsgpathview.pro
new file mode 100644
index 0000000000..4380b557fb
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/qsgpathview.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgpathview.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgpathview/tst_qsgpathview.cpp b/tests/auto/declarative/qsgpathview/tst_qsgpathview.cpp
new file mode 100644
index 0000000000..df8057c4c4
--- /dev/null
+++ b/tests/auto/declarative/qsgpathview/tst_qsgpathview.cpp
@@ -0,0 +1,1058 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/private/qsgpathview_p.h>
+#include <QtDeclarative/private/qdeclarativepath_p.h>
+#include <QtDeclarative/private/qsgtext_p.h>
+#include <QtDeclarative/private/qsgrectangle_p.h>
+#include <QtDeclarative/private/qdeclarativelistmodel_p.h>
+#include <QtDeclarative/private/qdeclarativevaluetype_p.h>
+#include <QAbstractListModel>
+#include <QStringListModel>
+#include <QStandardItemModel>
+#include <QFile>
+
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+static void initStandardTreeModel(QStandardItemModel *model)
+{
+    QStandardItem *item;
+    item = new QStandardItem(QLatin1String("Row 1 Item"));
+    model->insertRow(0, item);
+
+    item = new QStandardItem(QLatin1String("Row 2 Item"));
+    item->setCheckable(true);
+    model->insertRow(1, item);
+
+    QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item"));
+    item->setChild(0, childItem);
+
+    item = new QStandardItem(QLatin1String("Row 3 Item"));
+    item->setIcon(QIcon());
+    model->insertRow(2, item);
+}
+
+
+class tst_QSGPathView : public QObject
+{
+    Q_OBJECT
+public:
+    tst_QSGPathView();
+
+private slots:
+    void initValues();
+    void items();
+    void dataModel();
+    void pathview2();
+    void pathview3();
+    void path();
+    void pathMoved();
+    void setCurrentIndex();
+    void resetModel();
+    void propertyChanges();
+    void pathChanges();
+    void componentChanges();
+    void modelChanges();
+    void pathUpdateOnStartChanged();
+    void package();
+    void emptyModel();
+    void closed();
+    void pathUpdate();
+    void visualDataModel();
+    void undefinedPath();
+    void mouseDrag();
+    void treeModel();
+    void changePreferredHighlight();
+
+private:
+    QSGView *createView();
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &objectName, int index=-1);
+    template<typename T>
+    QList<T*> findItems(QSGItem *parent, const QString &objectName);
+};
+
+class TestObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool error READ error WRITE setError)
+    Q_PROPERTY(bool useModel READ useModel NOTIFY useModelChanged)
+    Q_PROPERTY(int pathItemCount READ pathItemCount NOTIFY pathItemCountChanged)
+
+public:
+    TestObject() : QObject(), mError(true), mUseModel(true), mPathItemCount(-1) {}
+
+    bool error() const { return mError; }
+    void setError(bool err) { mError = err; }
+
+    bool useModel() const { return mUseModel; }
+    void setUseModel(bool use) { mUseModel = use; emit useModelChanged(); }
+
+    int pathItemCount() const { return mPathItemCount; }
+    void setPathItemCount(int count) { mPathItemCount = count; emit pathItemCountChanged(); }
+
+signals:
+    void useModelChanged();
+    void pathItemCountChanged();
+
+private:
+    bool mError;
+    bool mUseModel;
+    int mPathItemCount;
+};
+
+class TestModel : public QAbstractListModel
+{
+public:
+    enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
+
+    TestModel(QObject *parent=0) : QAbstractListModel(parent) {
+        QHash<int, QByteArray> roles;
+        roles[Name] = "name";
+        roles[Number] = "number";
+        setRoleNames(roles);
+    }
+
+    int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); }
+    QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
+        QVariant rv;
+        if (role == Name)
+            rv = list.at(index.row()).first;
+        else if (role == Number)
+            rv = list.at(index.row()).second;
+
+        return rv;
+    }
+
+    int count() const { return rowCount(); }
+    QString name(int index) const { return list.at(index).first; }
+    QString number(int index) const { return list.at(index).second; }
+
+    void addItem(const QString &name, const QString &number) {
+        beginInsertRows(QModelIndex(), list.count(), list.count());
+        list.append(QPair<QString,QString>(name, number));
+        endInsertRows();
+    }
+
+    void insertItem(int index, const QString &name, const QString &number) {
+        beginInsertRows(QModelIndex(), index, index);
+        list.insert(index, QPair<QString,QString>(name, number));
+        endInsertRows();
+    }
+
+    void removeItem(int index) {
+        beginRemoveRows(QModelIndex(), index, index);
+        list.removeAt(index);
+        endRemoveRows();
+    }
+
+    void moveItem(int from, int to) {
+        beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
+        list.move(from, to);
+        endMoveRows();
+    }
+
+    void modifyItem(int idx, const QString &name, const QString &number) {
+        list[idx] = QPair<QString,QString>(name, number);
+        emit dataChanged(index(idx,0), index(idx,0));
+    }
+
+private:
+    QList<QPair<QString,QString> > list;
+};
+
+
+tst_QSGPathView::tst_QSGPathView()
+{
+}
+
+void tst_QSGPathView::initValues()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview1.qml"));
+    QSGPathView *obj = qobject_cast<QSGPathView*>(c.create());
+
+    QVERIFY(obj != 0);
+    QVERIFY(obj->path() == 0);
+    QVERIFY(obj->delegate() == 0);
+    QCOMPARE(obj->model(), QVariant());
+    QCOMPARE(obj->currentIndex(), 0);
+    QCOMPARE(obj->offset(), 0.);
+    QCOMPARE(obj->preferredHighlightBegin(), 0.);
+    QCOMPARE(obj->dragMargin(), 0.);
+    QCOMPARE(obj->count(), 0);
+    QCOMPARE(obj->pathItemCount(), -1);
+}
+
+void tst_QSGPathView::items()
+{
+    QSGView *canvas = createView();
+
+    TestModel model;
+    model.addItem("Fred", "12345");
+    model.addItem("John", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Bill", "4321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = findItem<QSGPathView>(canvas->rootObject(), "view");
+    QVERIFY(pathview != 0);
+
+    QCOMPARE(pathview->childItems().count(), model.count()+1); // assumes all are visible, including highlight
+
+    for (int i = 0; i < model.count(); ++i) {
+        QSGText *name = findItem<QSGText>(pathview, "textName", i);
+        QVERIFY(name != 0);
+        QCOMPARE(name->text(), model.name(i));
+        QSGText *number = findItem<QSGText>(pathview, "textNumber", i);
+        QVERIFY(number != 0);
+        QCOMPARE(number->text(), model.number(i));
+    }
+
+    QDeclarativePath *path = qobject_cast<QDeclarativePath*>(pathview->path());
+    QVERIFY(path);
+
+    QVERIFY(pathview->highlightItem());
+    QPointF start = path->pointAt(0.0);
+    QPointF offset;
+    offset.setX(pathview->highlightItem()->width()/2);
+    offset.setY(pathview->highlightItem()->height()/2);
+    QCOMPARE(pathview->highlightItem()->pos() + offset, start);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::pathview2()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview2.qml"));
+    QSGPathView *obj = qobject_cast<QSGPathView*>(c.create());
+
+    QVERIFY(obj != 0);
+    QVERIFY(obj->path() != 0);
+    QVERIFY(obj->delegate() != 0);
+    QVERIFY(obj->model() != QVariant());
+    QCOMPARE(obj->currentIndex(), 0);
+    QCOMPARE(obj->offset(), 0.);
+    QCOMPARE(obj->preferredHighlightBegin(), 0.);
+    QCOMPARE(obj->dragMargin(), 0.);
+    QCOMPARE(obj->count(), 8);
+    QCOMPARE(obj->pathItemCount(), 10);
+}
+
+void tst_QSGPathView::pathview3()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview3.qml"));
+    QSGPathView *obj = qobject_cast<QSGPathView*>(c.create());
+
+    QVERIFY(obj != 0);
+    QVERIFY(obj->path() != 0);
+    QVERIFY(obj->delegate() != 0);
+    QVERIFY(obj->model() != QVariant());
+    QCOMPARE(obj->currentIndex(), 0);
+    QCOMPARE(obj->offset(), 1.0);
+    QCOMPARE(obj->preferredHighlightBegin(), 0.5);
+    QCOMPARE(obj->dragMargin(), 24.);
+    QCOMPARE(obj->count(), 8);
+    QCOMPARE(obj->pathItemCount(), 4);
+}
+
+void tst_QSGPathView::path()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathtest.qml"));
+    QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create());
+
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->startX(), 120.);
+    QCOMPARE(obj->startY(), 100.);
+    QVERIFY(obj->path() != QPainterPath());
+
+    QDeclarativeListReference list(obj, "pathElements");
+    QCOMPARE(list.count(), 5);
+
+    QDeclarativePathAttribute* attr = qobject_cast<QDeclarativePathAttribute*>(list.at(0));
+    QVERIFY(attr != 0);
+    QCOMPARE(attr->name(), QString("scale"));
+    QCOMPARE(attr->value(), 1.0);
+
+    QDeclarativePathQuad* quad = qobject_cast<QDeclarativePathQuad*>(list.at(1));
+    QVERIFY(quad != 0);
+    QCOMPARE(quad->x(), 120.);
+    QCOMPARE(quad->y(), 25.);
+    QCOMPARE(quad->controlX(), 260.);
+    QCOMPARE(quad->controlY(), 75.);
+
+    QDeclarativePathPercent* perc = qobject_cast<QDeclarativePathPercent*>(list.at(2));
+    QVERIFY(perc != 0);
+    QCOMPARE(perc->value(), 0.3);
+
+    QDeclarativePathLine* line = qobject_cast<QDeclarativePathLine*>(list.at(3));
+    QVERIFY(line != 0);
+    QCOMPARE(line->x(), 120.);
+    QCOMPARE(line->y(), 100.);
+
+    QDeclarativePathCubic* cubic = qobject_cast<QDeclarativePathCubic*>(list.at(4));
+    QVERIFY(cubic != 0);
+    QCOMPARE(cubic->x(), 180.);
+    QCOMPARE(cubic->y(), 0.);
+    QCOMPARE(cubic->control1X(), -10.);
+    QCOMPARE(cubic->control1Y(), 90.);
+    QCOMPARE(cubic->control2X(), 210.);
+    QCOMPARE(cubic->control2Y(), 90.);
+}
+
+void tst_QSGPathView::dataModel()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    TestModel model;
+    model.addItem("red", "1");
+    model.addItem("green", "2");
+    model.addItem("blue", "3");
+    model.addItem("purple", "4");
+    model.addItem("gray", "5");
+    model.addItem("brown", "6");
+    model.addItem("yellow", "7");
+    model.addItem("thistle", "8");
+    model.addItem("cyan", "9");
+    model.addItem("peachpuff", "10");
+    model.addItem("powderblue", "11");
+    model.addItem("gold", "12");
+    model.addItem("sandybrown", "13");
+
+    ctxt->setContextProperty("testData", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/datamodel.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = qobject_cast<QSGPathView*>(canvas->rootObject());
+    QVERIFY(pathview != 0);
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QVERIFY(testObject->error() == false);
+
+    QSGItem *item = findItem<QSGItem>(pathview, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->x(), 110.0);
+    QCOMPARE(item->y(), 10.0);
+
+    model.insertItem(4, "orange", "10");
+    QTest::qWait(100);
+
+    QTRY_COMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 14);
+
+    QVERIFY(pathview->currentIndex() == 0);
+
+    QSGText *text = findItem<QSGText>(pathview, "myText", 4);
+    QVERIFY(text);
+    QCOMPARE(text->text(), model.name(4));
+
+    model.removeItem(2);
+    text = findItem<QSGText>(pathview, "myText", 2);
+    QVERIFY(text);
+    QCOMPARE(text->text(), model.name(2));
+
+    testObject->setPathItemCount(5);
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QVERIFY(testObject->error() == false);
+
+    QTRY_COMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 5);
+
+    QSGRectangle *testItem = findItem<QSGRectangle>(pathview, "wrapper", 4);
+    QVERIFY(testItem != 0);
+    testItem = findItem<QSGRectangle>(pathview, "wrapper", 5);
+    QVERIFY(testItem == 0);
+
+    pathview->setCurrentIndex(1);
+
+    model.insertItem(2, "pink", "2");
+    QTest::qWait(100);
+
+    QTRY_COMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 5);
+    QVERIFY(pathview->currentIndex() == 1);
+
+    text = findItem<QSGText>(pathview, "myText", 2);
+    QVERIFY(text);
+    QCOMPARE(text->text(), model.name(2));
+
+    model.removeItem(3);
+    QTRY_COMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 5);
+    text = findItem<QSGText>(pathview, "myText", 3);
+    QVERIFY(text);
+    QCOMPARE(text->text(), model.name(3));
+
+    model.moveItem(3, 5);
+    QTRY_COMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 5);
+    QList<QSGItem*> items = findItems<QSGItem>(pathview, "wrapper");
+    foreach (QSGItem *item, items) {
+        QVERIFY(item->property("onPath").toBool());
+    }
+
+    // QTBUG-14199
+    pathview->setOffset(7);
+    pathview->setOffset(0);
+    QCOMPARE(findItems<QSGItem>(pathview, "wrapper").count(), 5);
+
+    pathview->setCurrentIndex(model.count()-1);
+    model.removeItem(model.count()-1);
+    QCOMPARE(pathview->currentIndex(), model.count()-1);
+
+    delete canvas;
+    delete testObject;
+}
+
+void tst_QSGPathView::pathMoved()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    TestModel model;
+    model.addItem("Ben", "12345");
+    model.addItem("Bohn", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Bill", "4321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = findItem<QSGPathView>(canvas->rootObject(), "view");
+    QVERIFY(pathview != 0);
+
+    QSGRectangle *firstItem = findItem<QSGRectangle>(pathview, "wrapper", 0);
+    QVERIFY(firstItem);
+    QDeclarativePath *path = qobject_cast<QDeclarativePath*>(pathview->path());
+    QVERIFY(path);
+    QPointF start = path->pointAt(0.0);
+    QPointF offset;//Center of item is at point, but pos is from corner
+    offset.setX(firstItem->width()/2);
+    offset.setY(firstItem->height()/2);
+    QCOMPARE(firstItem->pos() + offset, start);
+    pathview->setOffset(1.0);
+
+    for(int i=0; i<model.count(); i++){
+        QSGRectangle *curItem = findItem<QSGRectangle>(pathview, "wrapper", i);
+        QPointF itemPos(path->pointAt(0.25 + i*0.25));
+        QCOMPARE(curItem->pos() + offset, QPointF(qRound(itemPos.x()), qRound(itemPos.y())));
+    }
+
+    pathview->setOffset(0.0);
+    QCOMPARE(firstItem->pos() + offset, start);
+
+    // Change delegate size
+    pathview->setOffset(0.1);
+    pathview->setOffset(0.0);
+    canvas->rootObject()->setProperty("delegateWidth", 30);
+    QCOMPARE(firstItem->width(), 30.0);
+    offset.setX(firstItem->width()/2);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    // Change delegate scale
+    pathview->setOffset(0.1);
+    pathview->setOffset(0.0);
+    canvas->rootObject()->setProperty("delegateScale", 1.2);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::setCurrentIndex()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    TestModel model;
+    model.addItem("Ben", "12345");
+    model.addItem("Bohn", "2345");
+    model.addItem("Bob", "54321");
+    model.addItem("Bill", "4321");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = findItem<QSGPathView>(canvas->rootObject(), "view");
+    QVERIFY(pathview != 0);
+
+    QSGRectangle *firstItem = findItem<QSGRectangle>(pathview, "wrapper", 0);
+    QVERIFY(firstItem);
+    QDeclarativePath *path = qobject_cast<QDeclarativePath*>(pathview->path());
+    QVERIFY(path);
+    QPointF start = path->pointAt(0.0);
+    QPointF offset;//Center of item is at point, but pos is from corner
+    offset.setX(firstItem->width()/2);
+    offset.setY(firstItem->height()/2);
+    QCOMPARE(firstItem->pos() + offset, start);
+    QCOMPARE(canvas->rootObject()->property("currentA").toInt(), 0);
+    QCOMPARE(canvas->rootObject()->property("currentB").toInt(), 0);
+
+    pathview->setCurrentIndex(2);
+
+    firstItem = findItem<QSGRectangle>(pathview, "wrapper", 2);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+    QCOMPARE(canvas->rootObject()->property("currentA").toInt(), 2);
+    QCOMPARE(canvas->rootObject()->property("currentB").toInt(), 2);
+
+    pathview->decrementCurrentIndex();
+    QTRY_COMPARE(pathview->currentIndex(), 1);
+    firstItem = findItem<QSGRectangle>(pathview, "wrapper", 1);
+    QVERIFY(firstItem);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    pathview->decrementCurrentIndex();
+    QTRY_COMPARE(pathview->currentIndex(), 0);
+    firstItem = findItem<QSGRectangle>(pathview, "wrapper", 0);
+    QVERIFY(firstItem);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    pathview->decrementCurrentIndex();
+    QTRY_COMPARE(pathview->currentIndex(), 3);
+    firstItem = findItem<QSGRectangle>(pathview, "wrapper", 3);
+    QVERIFY(firstItem);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    pathview->incrementCurrentIndex();
+    QTRY_COMPARE(pathview->currentIndex(), 0);
+    firstItem = findItem<QSGRectangle>(pathview, "wrapper", 0);
+    QVERIFY(firstItem);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::resetModel()
+{
+    QSGView *canvas = createView();
+
+    QStringList strings;
+    strings << "one" << "two" << "three";
+    QStringListModel model(strings);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaypath.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = findItem<QSGPathView>(canvas->rootObject(), "view");
+    QVERIFY(pathview != 0);
+
+    QCOMPARE(pathview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(pathview, "displayText", i);
+        QVERIFY(display != 0);
+        QCOMPARE(display->text(), strings.at(i));
+    }
+
+    strings.clear();
+    strings << "four" << "five" << "six" << "seven";
+    model.setStringList(strings);
+
+    QCOMPARE(pathview->count(), model.rowCount());
+
+    for (int i = 0; i < model.rowCount(); ++i) {
+        QSGText *display = findItem<QSGText>(pathview, "displayText", i);
+        QVERIFY(display != 0);
+        QCOMPARE(display->text(), strings.at(i));
+    }
+
+    delete canvas;
+}
+
+void tst_QSGPathView::propertyChanges()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QSignalSpy snapPositionSpy(pathView, SIGNAL(preferredHighlightBeginChanged()));
+    QSignalSpy dragMarginSpy(pathView, SIGNAL(dragMarginChanged()));
+
+    QCOMPARE(pathView->preferredHighlightBegin(), 0.1);
+    QCOMPARE(pathView->dragMargin(), 5.0);
+
+    pathView->setPreferredHighlightBegin(0.4);
+    pathView->setPreferredHighlightEnd(0.4);
+    pathView->setDragMargin(20.0);
+
+    QCOMPARE(pathView->preferredHighlightBegin(), 0.4);
+    QCOMPARE(pathView->preferredHighlightEnd(), 0.4);
+    QCOMPARE(pathView->dragMargin(), 20.0);
+
+    QCOMPARE(snapPositionSpy.count(), 1);
+    QCOMPARE(dragMarginSpy.count(), 1);
+
+    pathView->setPreferredHighlightBegin(0.4);
+    pathView->setPreferredHighlightEnd(0.4);
+    pathView->setDragMargin(20.0);
+
+    QCOMPARE(snapPositionSpy.count(), 1);
+    QCOMPARE(dragMarginSpy.count(), 1);
+    delete canvas;
+}
+
+void tst_QSGPathView::pathChanges()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QDeclarativePath *path = canvas->rootObject()->findChild<QDeclarativePath*>("path");
+    QVERIFY(path);
+
+    QSignalSpy startXSpy(path, SIGNAL(startXChanged()));
+    QSignalSpy startYSpy(path, SIGNAL(startYChanged()));
+
+    QCOMPARE(path->startX(), 220.0);
+    QCOMPARE(path->startY(), 200.0);
+
+    path->setStartX(240.0);
+    path->setStartY(220.0);
+
+    QCOMPARE(path->startX(), 240.0);
+    QCOMPARE(path->startY(), 220.0);
+
+    QCOMPARE(startXSpy.count(),1);
+    QCOMPARE(startYSpy.count(),1);
+
+    path->setStartX(240);
+    path->setStartY(220);
+
+    QCOMPARE(startXSpy.count(),1);
+    QCOMPARE(startYSpy.count(),1);
+
+    QDeclarativePath *alternatePath = canvas->rootObject()->findChild<QDeclarativePath*>("alternatePath");
+    QVERIFY(alternatePath);
+
+    QSignalSpy pathSpy(pathView, SIGNAL(pathChanged()));
+
+    QCOMPARE(pathView->path(), path);
+
+    pathView->setPath(alternatePath);
+    QCOMPARE(pathView->path(), alternatePath);
+    QCOMPARE(pathSpy.count(),1);
+
+    pathView->setPath(alternatePath);
+    QCOMPARE(pathSpy.count(),1);
+
+    QDeclarativePathAttribute *pathAttribute = canvas->rootObject()->findChild<QDeclarativePathAttribute*>("pathAttribute");
+    QVERIFY(pathAttribute);
+
+    QSignalSpy nameSpy(pathAttribute, SIGNAL(nameChanged()));
+    QCOMPARE(pathAttribute->name(), QString("opacity"));
+
+    pathAttribute->setName("scale");
+    QCOMPARE(pathAttribute->name(), QString("scale"));
+    QCOMPARE(nameSpy.count(),1);
+
+    pathAttribute->setName("scale");
+    QCOMPARE(nameSpy.count(),1);
+    delete canvas;
+}
+
+void tst_QSGPathView::componentChanges()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QDeclarativeComponent delegateComponent(canvas->engine());
+    delegateComponent.setData("import QtQuick 2.0; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
+
+    QSignalSpy delegateSpy(pathView, SIGNAL(delegateChanged()));
+
+    pathView->setDelegate(&delegateComponent);
+    QCOMPARE(pathView->delegate(), &delegateComponent);
+    QCOMPARE(delegateSpy.count(),1);
+
+    pathView->setDelegate(&delegateComponent);
+    QCOMPARE(delegateSpy.count(),1);
+    delete canvas;
+}
+
+void tst_QSGPathView::modelChanges()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild<QDeclarativeListModel*>("alternateModel");
+    QVERIFY(alternateModel);
+    QVariant modelVariant = QVariant::fromValue(alternateModel);
+    QSignalSpy modelSpy(pathView, SIGNAL(modelChanged()));
+
+    pathView->setModel(modelVariant);
+    QCOMPARE(pathView->model(), modelVariant);
+    QCOMPARE(modelSpy.count(),1);
+
+    pathView->setModel(modelVariant);
+    QCOMPARE(modelSpy.count(),1);
+
+    pathView->setModel(QVariant());
+    QCOMPARE(modelSpy.count(),2);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::pathUpdateOnStartChanged()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathUpdateOnStartChanged.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QDeclarativePath *path = canvas->rootObject()->findChild<QDeclarativePath*>("path");
+    QVERIFY(path);
+    QCOMPARE(path->startX(), 400.0);
+    QCOMPARE(path->startY(), 300.0);
+
+    QSGItem *item = findItem<QSGItem>(pathView, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->x(), path->startX() - item->width() / 2.0);
+    QCOMPARE(item->y(), path->startY() - item->height() / 2.0);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::package()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview_package.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("photoPathView");
+    QVERIFY(pathView);
+
+    QSGItem *item = findItem<QSGItem>(pathView, "pathItem");
+    QVERIFY(item);
+    QVERIFY(item->scale() != 1.0);
+
+    delete canvas;
+}
+
+//QTBUG-13017
+void tst_QSGPathView::emptyModel()
+{
+    QSGView *canvas = createView();
+
+    QStringListModel model;
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("emptyModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/emptymodel.qml"));
+    qApp->processEvents();
+
+    QSGPathView *pathview = qobject_cast<QSGPathView*>(canvas->rootObject());
+    QVERIFY(pathview != 0);
+
+    QCOMPARE(pathview->offset(), qreal(0.0));
+
+    delete canvas;
+}
+
+void tst_QSGPathView::closed()
+{
+    QDeclarativeEngine engine;
+
+    {
+        QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/openPath.qml"));
+        QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create());
+        QVERIFY(obj);
+        QCOMPARE(obj->isClosed(), false);
+        delete obj;
+    }
+
+    {
+        QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/closedPath.qml"));
+        QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create());
+        QVERIFY(obj);
+        QCOMPARE(obj->isClosed(), true);
+        delete obj;
+    }
+}
+
+// QTBUG-14239
+void tst_QSGPathView::pathUpdate()
+{
+    QSGView *canvas = createView();
+    QVERIFY(canvas);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathUpdate.qml"));
+
+    QSGPathView *pathView = canvas->rootObject()->findChild<QSGPathView*>("pathView");
+    QVERIFY(pathView);
+
+    QSGItem *item = findItem<QSGItem>(pathView, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->x(), 150.0);
+
+    delete canvas;
+}
+
+void tst_QSGPathView::visualDataModel()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/vdm.qml"));
+
+    QSGPathView *obj = qobject_cast<QSGPathView*>(c.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->count(), 3);
+
+    delete obj;
+}
+
+void tst_QSGPathView::undefinedPath()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/undefinedpath.qml"));
+
+    QSGPathView *obj = qobject_cast<QSGPathView*>(c.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->count(), 3);
+
+    delete obj;
+}
+
+void tst_QSGPathView::mouseDrag()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml"));
+    canvas->show();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    QSGPathView *pathview = qobject_cast<QSGPathView*>(canvas->rootObject());
+    QVERIFY(pathview != 0);
+
+    int current = pathview->currentIndex();
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(10,100));
+
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(30,100), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(90,100), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(canvas, &mv);
+    }
+
+    QVERIFY(pathview->currentIndex() != current);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(40,100));
+
+    delete canvas;
+}
+
+void tst_QSGPathView::treeModel()
+{
+    QSGView *canvas = createView();
+    canvas->show();
+
+    QStandardItemModel model;
+    initStandardTreeModel(&model);
+    canvas->engine()->rootContext()->setContextProperty("myModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/treemodel.qml"));
+
+    QSGPathView *pathview = qobject_cast<QSGPathView*>(canvas->rootObject());
+    QVERIFY(pathview != 0);
+    QCOMPARE(pathview->count(), 3);
+
+    QSGText *item = findItem<QSGText>(pathview, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->text(), QLatin1String("Row 1 Item"));
+
+    QVERIFY(QMetaObject::invokeMethod(pathview, "setRoot", Q_ARG(QVariant, 1)));
+    QCOMPARE(pathview->count(), 1);
+
+    QTRY_VERIFY(item = findItem<QSGText>(pathview, "wrapper", 0));
+    QTRY_COMPARE(item->text(), QLatin1String("Row 2 Child Item"));
+
+    delete canvas;
+}
+
+void tst_QSGPathView::changePreferredHighlight()
+{
+    QSGView *canvas = createView();
+    canvas->setFixedSize(400,200);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml"));
+    canvas->show();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    QSGPathView *pathview = qobject_cast<QSGPathView*>(canvas->rootObject());
+    QVERIFY(pathview != 0);
+
+    int current = pathview->currentIndex();
+    QCOMPARE(current, 0);
+
+    QSGRectangle *firstItem = findItem<QSGRectangle>(pathview, "wrapper", 0);
+    QVERIFY(firstItem);
+    QDeclarativePath *path = qobject_cast<QDeclarativePath*>(pathview->path());
+    QVERIFY(path);
+    QPointF start = path->pointAt(0.5);
+    start.setX(qRound(start.x()));
+    start.setY(qRound(start.y()));
+    QPointF offset;//Center of item is at point, but pos is from corner
+    offset.setX(firstItem->width()/2);
+    offset.setY(firstItem->height()/2);
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+
+    pathview->setPreferredHighlightBegin(0.8);
+    pathview->setPreferredHighlightEnd(0.8);
+    start = path->pointAt(0.8);
+    start.setX(qRound(start.x()));
+    start.setY(qRound(start.y()));
+    QTRY_COMPARE(firstItem->pos() + offset, start);
+    QCOMPARE(pathview->currentIndex(), 0);
+
+    delete canvas;
+}
+
+QSGView *tst_QSGPathView::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+/*
+   Find an item with the specified objectName.  If index is supplied then the
+   item must also evaluate the {index} expression equal to index
+ */
+template<typename T>
+T *tst_QSGPathView::findItem(QSGItem *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeExpression e(qmlContext(item), item, "index");
+                if (e.evaluate().toInt() == index)
+                    return static_cast<T*>(item);
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+template<typename T>
+QList<T*> tst_QSGPathView::findItems(QSGItem *parent, const QString &objectName)
+{
+    QList<T*> items;
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->QSGItem::children().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
+            items.append(static_cast<T*>(item));
+        items += findItems<T>(item, objectName);
+    }
+
+    return items;
+}
+
+QTEST_MAIN(tst_QSGPathView)
+
+#include "tst_qsgpathview.moc"
diff --git a/tests/auto/declarative/qsgpincharea/data/pinchproperties.qml b/tests/auto/declarative/qsgpincharea/data/pinchproperties.qml
new file mode 100644
index 0000000000..a1cd11302f
--- /dev/null
+++ b/tests/auto/declarative/qsgpincharea/data/pinchproperties.qml
@@ -0,0 +1,46 @@
+import QtQuick 2.0
+Rectangle {
+    id: whiteRect
+    property variant center
+    property real scale
+    width: 240; height: 320
+    color: "white"
+    Rectangle {
+        id: blackRect
+        objectName: "blackrect"
+        color: "black"
+        y: 50
+        x: 50
+        width: 100
+        height: 100
+        opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200
+        Text { text: blackRect.opacity}
+        PinchArea {
+            id: pincharea
+            objectName: "pincharea"
+            anchors.fill: parent
+            pinch.target: blackRect
+            pinch.dragAxis: Drag.XandYAxis
+            pinch.minimumX: 0
+            pinch.maximumX: whiteRect.width-blackRect.width
+            pinch.minimumY: 0
+            pinch.maximumY: whiteRect.height-blackRect.height
+            pinch.minimumScale: 1.0
+            pinch.maximumScale: 2.0
+            pinch.minimumRotation: 0.0
+            pinch.maximumRotation: 90.0
+            onPinchStarted: {
+                whiteRect.center = pinch.center
+                whiteRect.scale = pinch.scale
+            }
+            onPinchUpdated: {
+                whiteRect.center = pinch.center
+                whiteRect.scale = pinch.scale
+            }
+            onPinchFinished: {
+                whiteRect.center = pinch.center
+                whiteRect.scale = pinch.scale
+            }
+         }
+     }
+ }
diff --git a/tests/auto/declarative/qsgpincharea/qsgpincharea.pro b/tests/auto/declarative/qsgpincharea/qsgpincharea.pro
new file mode 100644
index 0000000000..6f785abf63
--- /dev/null
+++ b/tests/auto/declarative/qsgpincharea/qsgpincharea.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgpincharea.cpp
+
+symbian: {
+    importFiles.sources = data
+    importFiles.path = .
+    DEPLOYMENT = importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgpincharea/tst_qsgpincharea.cpp b/tests/auto/declarative/qsgpincharea/tst_qsgpincharea.cpp
new file mode 100644
index 0000000000..01895a69bd
--- /dev/null
+++ b/tests/auto/declarative/qsgpincharea/tst_qsgpincharea.cpp
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtTest/QSignalSpy>
+#include <private/qsgpincharea_p.h>
+#include <private/qsgrectangle_p.h>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QSGPinchArea: public QObject
+{
+    Q_OBJECT
+private slots:
+    void pinchProperties();
+    void scale();
+    void pan();
+
+private:
+    QSGView *createView();
+};
+
+void tst_QSGPinchArea::pinchProperties()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGPinchArea *pinchArea = canvas->rootObject()->findChild<QSGPinchArea*>("pincharea");
+    QSGPinch *pinch = pinchArea->pinch();
+    QVERIFY(pinchArea != 0);
+    QVERIFY(pinch != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+    QVERIFY(blackRect == pinch->target());
+    QSGItem *rootItem = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(rootItem != 0);
+    QSignalSpy targetSpy(pinch, SIGNAL(targetChanged()));
+    pinch->setTarget(rootItem);
+    QCOMPARE(targetSpy.count(),1);
+    pinch->setTarget(rootItem);
+    QCOMPARE(targetSpy.count(),1);
+
+    // axis
+    QCOMPARE(pinch->axis(), QSGPinch::XandYAxis);
+    QSignalSpy axisSpy(pinch, SIGNAL(dragAxisChanged()));
+    pinch->setAxis(QSGPinch::XAxis);
+    QCOMPARE(pinch->axis(), QSGPinch::XAxis);
+    QCOMPARE(axisSpy.count(),1);
+    pinch->setAxis(QSGPinch::XAxis);
+    QCOMPARE(axisSpy.count(),1);
+
+    // minimum and maximum drag properties
+    QSignalSpy xminSpy(pinch, SIGNAL(minimumXChanged()));
+    QSignalSpy xmaxSpy(pinch, SIGNAL(maximumXChanged()));
+    QSignalSpy yminSpy(pinch, SIGNAL(minimumYChanged()));
+    QSignalSpy ymaxSpy(pinch, SIGNAL(maximumYChanged()));
+
+    QCOMPARE(pinch->xmin(), 0.0);
+    QCOMPARE(pinch->xmax(), rootItem->width()-blackRect->width());
+    QCOMPARE(pinch->ymin(), 0.0);
+    QCOMPARE(pinch->ymax(), rootItem->height()-blackRect->height());
+
+    pinch->setXmin(10);
+    pinch->setXmax(10);
+    pinch->setYmin(10);
+    pinch->setYmax(10);
+
+    QCOMPARE(pinch->xmin(), 10.0);
+    QCOMPARE(pinch->xmax(), 10.0);
+    QCOMPARE(pinch->ymin(), 10.0);
+    QCOMPARE(pinch->ymax(), 10.0);
+
+    QCOMPARE(xminSpy.count(),1);
+    QCOMPARE(xmaxSpy.count(),1);
+    QCOMPARE(yminSpy.count(),1);
+    QCOMPARE(ymaxSpy.count(),1);
+
+    pinch->setXmin(10);
+    pinch->setXmax(10);
+    pinch->setYmin(10);
+    pinch->setYmax(10);
+
+    QCOMPARE(xminSpy.count(),1);
+    QCOMPARE(xmaxSpy.count(),1);
+    QCOMPARE(yminSpy.count(),1);
+    QCOMPARE(ymaxSpy.count(),1);
+
+    // minimum and maximum scale properties
+    QSignalSpy scaleMinSpy(pinch, SIGNAL(minimumScaleChanged()));
+    QSignalSpy scaleMaxSpy(pinch, SIGNAL(maximumScaleChanged()));
+
+    QCOMPARE(pinch->minimumScale(), 1.0);
+    QCOMPARE(pinch->maximumScale(), 2.0);
+
+    pinch->setMinimumScale(0.5);
+    pinch->setMaximumScale(1.5);
+
+    QCOMPARE(pinch->minimumScale(), 0.5);
+    QCOMPARE(pinch->maximumScale(), 1.5);
+
+    QCOMPARE(scaleMinSpy.count(),1);
+    QCOMPARE(scaleMaxSpy.count(),1);
+
+    pinch->setMinimumScale(0.5);
+    pinch->setMaximumScale(1.5);
+
+    QCOMPARE(scaleMinSpy.count(),1);
+    QCOMPARE(scaleMaxSpy.count(),1);
+
+    // minimum and maximum rotation properties
+    QSignalSpy rotMinSpy(pinch, SIGNAL(minimumRotationChanged()));
+    QSignalSpy rotMaxSpy(pinch, SIGNAL(maximumRotationChanged()));
+
+    QCOMPARE(pinch->minimumRotation(), 0.0);
+    QCOMPARE(pinch->maximumRotation(), 90.0);
+
+    pinch->setMinimumRotation(-90.0);
+    pinch->setMaximumRotation(45.0);
+
+    QCOMPARE(pinch->minimumRotation(), -90.0);
+    QCOMPARE(pinch->maximumRotation(), 45.0);
+
+    QCOMPARE(rotMinSpy.count(),1);
+    QCOMPARE(rotMaxSpy.count(),1);
+
+    pinch->setMinimumRotation(-90.0);
+    pinch->setMaximumRotation(45.0);
+
+    QCOMPARE(rotMinSpy.count(),1);
+    QCOMPARE(rotMaxSpy.count(),1);
+
+    delete canvas;
+}
+
+QTouchEvent::TouchPoint makeTouchPoint(int id, QPoint p, QSGView *v, QSGItem *i)
+{
+    QTouchEvent::TouchPoint touchPoint(id);
+    touchPoint.setPos(i->mapFromScene(p));
+    touchPoint.setScreenPos(v->mapToGlobal(p));
+    touchPoint.setScenePos(p);
+    return touchPoint;
+}
+
+void tst_QSGPinchArea::scale()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QTest::qWaitForWindowShown(canvas);
+    QVERIFY(canvas->rootObject() != 0);
+    qApp->processEvents();
+
+    QSGPinchArea *pinchArea = canvas->rootObject()->findChild<QSGPinchArea*>("pincharea");
+    QSGPinch *pinch = pinchArea->pinch();
+    QVERIFY(pinchArea != 0);
+    QVERIFY(pinch != 0);
+
+    QSGItem *root = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(root != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+
+    QPoint p1(80, 80);
+    QPoint p2(100, 100);
+
+    QTest::touchEvent(canvas).press(0, p1);
+    QTest::touchEvent(canvas).stationary(0).press(1, p2);
+    p1 -= QPoint(10,10);
+    p2 += QPoint(10,10);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(root->property("scale").toReal(), 1.0);
+
+    p1 -= QPoint(10,10);
+    p2 += QPoint(10,10);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(root->property("scale").toReal(), 1.5);
+    QCOMPARE(root->property("center").toPointF(), QPointF(40, 40)); // blackrect is at 50,50
+    QCOMPARE(blackRect->scale(), 1.5);
+
+    // scale beyond bound
+    p1 -= QPoint(50,50);
+    p2 += QPoint(50,50);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(blackRect->scale(), 2.0);
+
+    QTest::touchEvent(canvas).release(0, p1).release(1, p2);
+
+    delete canvas;
+}
+
+void tst_QSGPinchArea::pan()
+{
+    QSGView *canvas = createView();
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+    canvas->show();
+    canvas->setFocus();
+    QTest::qWaitForWindowShown(canvas);
+    QVERIFY(canvas->rootObject() != 0);
+    qApp->processEvents();
+
+    QSGPinchArea *pinchArea = canvas->rootObject()->findChild<QSGPinchArea*>("pincharea");
+    QSGPinch *pinch = pinchArea->pinch();
+    QVERIFY(pinchArea != 0);
+    QVERIFY(pinch != 0);
+
+    QSGItem *root = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(root != 0);
+
+    // target
+    QSGItem *blackRect = canvas->rootObject()->findChild<QSGItem*>("blackrect");
+    QVERIFY(blackRect != 0);
+
+    QPoint p1(80, 80);
+    QPoint p2(100, 100);
+
+    QTest::touchEvent(canvas).press(0, p1);
+    QTest::touchEvent(canvas).stationary(0).press(1, p2);
+    p1 += QPoint(10,10);
+    p2 += QPoint(10,10);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(root->property("scale").toReal(), 1.0);
+
+    p1 += QPoint(10,10);
+    p2 += QPoint(10,10);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(root->property("center").toPointF(), QPointF(60, 60)); // blackrect is at 50,50
+
+    QCOMPARE(blackRect->x(), 60.0);
+    QCOMPARE(blackRect->y(), 60.0);
+
+    // pan x beyond bound
+    p1 += QPoint(100,100);
+    p2 += QPoint(100,100);
+    QTest::touchEvent(canvas).move(0, p1).move(1, p2);
+
+    QCOMPARE(blackRect->x(), 140.0);
+    QCOMPARE(blackRect->y(), 160.0);
+
+    QTest::touchEvent(canvas).release(0, p1).release(1, p2);
+
+    delete canvas;
+}
+
+QSGView *tst_QSGPinchArea::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setAttribute(Qt::WA_AcceptTouchEvents);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+QTEST_MAIN(tst_QSGPinchArea)
+
+#include "tst_qsgpincharea.moc"
diff --git a/tests/auto/declarative/qsgpositioners/data/flow-testimplicitsize.qml b/tests/auto/declarative/qsgpositioners/data/flow-testimplicitsize.qml
new file mode 100644
index 0000000000..c32b78676c
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/flow-testimplicitsize.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 300; height: 200;
+
+    property int flowLayout: 1
+
+    Flow {
+        objectName: "flow"
+        layoutDirection: (flowLayout == 2) ? Qt.RightToLeft : Qt.LeftToRight
+        flow: (flowLayout == 1) ? Flow.TopToBottom : Flow.LeftToRight;
+
+        spacing: 20
+        anchors.horizontalCenter: parent.horizontalCenter
+        Rectangle { color: "red"; width: 100; height: 50 }
+        Rectangle { color: "blue"; width: 100; height: 50 }
+    }
+}
+
diff --git a/tests/auto/declarative/qsgpositioners/data/flowtest-toptobottom.qml b/tests/auto/declarative/qsgpositioners/data/flowtest-toptobottom.qml
new file mode 100644
index 0000000000..a7d3ee13c7
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/flowtest-toptobottom.qml
@@ -0,0 +1,44 @@
+import QtQuick 2.0
+
+Item {
+    height: 90
+    width: 480
+    property bool testRightToLeft: false
+
+    Flow {
+        objectName: "flow"
+        height: parent.height
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        flow: Flow.TopToBottom
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 50
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/flowtest.qml b/tests/auto/declarative/qsgpositioners/data/flowtest.qml
new file mode 100644
index 0000000000..40b042dd79
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/flowtest.qml
@@ -0,0 +1,43 @@
+import QtQuick 2.0
+
+Item {
+    width: 90
+    height: 480
+    property bool testRightToLeft: false
+
+    Flow {
+        objectName: "flow"
+        width: parent.width
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 50
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/grid-animated.qml b/tests/auto/declarative/qsgpositioners/data/grid-animated.qml
new file mode 100644
index 0000000000..56e8f26953
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/grid-animated.qml
@@ -0,0 +1,64 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    property bool testRightToLeft: true
+
+    Grid {
+        objectName: "grid"
+        columns: 3
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        add: Transition {
+            NumberAnimation {
+                properties: "x,y";
+            }
+        }
+        move: Transition {
+            NumberAnimation {
+                properties: "x,y";
+            }
+        }
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            x: -100
+            y: -100
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            x: -100
+            y: -100
+            opacity: 0
+            color: "green"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            x: -100
+            y: -100
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            x: -100
+            y: -100
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            x: -100
+            y: -100
+            width: 50
+            height: 50
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/grid-spacing.qml b/tests/auto/declarative/qsgpositioners/data/grid-spacing.qml
new file mode 100644
index 0000000000..535a39037f
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/grid-spacing.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Grid {
+        objectName: "grid"
+        columns: 3
+        spacing: 4
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 50
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/grid-toptobottom.qml b/tests/auto/declarative/qsgpositioners/data/grid-toptobottom.qml
new file mode 100644
index 0000000000..45559aab5d
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/grid-toptobottom.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Grid {
+        objectName: "grid"
+        rows: 3
+        flow: Grid.TopToBottom
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 50
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/gridtest.qml b/tests/auto/declarative/qsgpositioners/data/gridtest.qml
new file mode 100644
index 0000000000..50bec1377b
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/gridtest.qml
@@ -0,0 +1,42 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    property bool testRightToLeft: false
+    Grid {
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        objectName: "grid"
+        columns: 3
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 30
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/gridzerocolumns.qml b/tests/auto/declarative/qsgpositioners/data/gridzerocolumns.qml
new file mode 100644
index 0000000000..a252f279c3
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/gridzerocolumns.qml
@@ -0,0 +1,40 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Grid {
+        objectName: "grid"
+        columns: 0
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "green"
+            width: 20
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "blue"
+            width: 50
+            height: 20
+        }
+        Rectangle {
+            objectName: "four"
+            color: "cyan"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "five"
+            color: "magenta"
+            width: 10
+            height: 10
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/horizontal-animated.qml b/tests/auto/declarative/qsgpositioners/data/horizontal-animated.qml
new file mode 100644
index 0000000000..d19cc46c8b
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/horizontal-animated.qml
@@ -0,0 +1,44 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    property bool testRightToLeft: false
+
+    Row {
+        objectName: "row"
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        add: Transition {
+            NumberAnimation {
+                properties: "x";
+            }
+        }
+        move: Transition {
+            NumberAnimation {
+                properties: "x";
+            }
+        }
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            x: -100;
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "blue"
+            x: -100;
+            opacity: 0
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            x: -100;
+            color: "green"
+            width: 50
+            height: 50
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/horizontal-spacing.qml b/tests/auto/declarative/qsgpositioners/data/horizontal-spacing.qml
new file mode 100644
index 0000000000..c6ff75ac6b
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/horizontal-spacing.qml
@@ -0,0 +1,31 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    property bool testRightToLeft: false
+
+    Row {
+        objectName: "row"
+        spacing: 10
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "red"
+            width: 20
+            height: 10
+        }
+        Rectangle {
+            objectName: "three"
+            color: "red"
+            width: 40
+            height: 20
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/horizontal.qml b/tests/auto/declarative/qsgpositioners/data/horizontal.qml
new file mode 100644
index 0000000000..235ee78c9b
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/horizontal.qml
@@ -0,0 +1,29 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    property bool testRightToLeft: false
+    Row {
+        objectName: "row"
+        layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "red"
+            width: 20
+            height: 10
+        }
+        Rectangle {
+            objectName: "three"
+            color: "red"
+            width: 40
+            height: 20
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/propertychangestest.qml b/tests/auto/declarative/qsgpositioners/data/propertychangestest.qml
new file mode 100644
index 0000000000..c9fd62b012
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/propertychangestest.qml
@@ -0,0 +1,39 @@
+import QtQuick 2.0
+
+Grid {
+    id: myGrid
+
+    width: 270
+    height: 270
+    x: 3
+    y: 3
+    columns: 4
+    spacing: 3
+
+    add: columnTransition
+    move: columnTransition
+
+    Repeater {
+        model: 20
+        Rectangle { color: "black"; width: 50; height: 50 }
+    }
+
+    data: [
+    Transition {
+        id: rowTransition
+        objectName: "rowTransition"
+        NumberAnimation {
+            properties: "x,y";
+            easing.type: "OutInCubic"
+        }
+    },
+    Transition {
+        id: columnTransition
+        objectName: "columnTransition"
+        NumberAnimation {
+            properties: "x,y";
+            easing.type: "OutInCubic"
+        }
+    }
+    ]
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/repeatertest.qml b/tests/auto/declarative/qsgpositioners/data/repeatertest.qml
new file mode 100644
index 0000000000..d90e1cf160
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/repeatertest.qml
@@ -0,0 +1,38 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Row {
+        Repeater{ model: 3;
+            delegate: Component {
+                Rectangle {
+                    color: "red"
+                    width: 50
+                    height: 50
+                    z: {if(index == 0){2;}else if(index == 1){1;} else{3;}}
+                    objectName: {if(index == 0){"one";}else if(index == 1){"two";} else{"three";}}
+                }
+            }
+        }
+    }
+
+    //This crashed once (QTBUG-16959) because the repeater ended up on the end of the list
+    //If this grid just instantiates without crashing, then it has not regressed.
+    Grid {
+        id: grid
+        rows: 2
+        flow: Grid.TopToBottom
+
+        Repeater {
+            model: 13
+            Rectangle {
+                color: "goldenrod"
+                width: 100
+                height: 100
+                radius: 10
+                border.width: 1
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/vertical-animated.qml b/tests/auto/declarative/qsgpositioners/data/vertical-animated.qml
new file mode 100644
index 0000000000..69f1b7eb25
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/vertical-animated.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Column {
+        objectName: "column"
+        add: Transition {
+            NumberAnimation {
+                properties: "y";
+            }
+        }
+        move: Transition {
+            NumberAnimation {
+                properties: "y";
+            }
+        }
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            y: -100
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "blue"
+            y: -100
+            opacity: 0
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "three"
+            color: "red"
+            y: -100
+            width: 50
+            height: 50
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/vertical-spacing.qml b/tests/auto/declarative/qsgpositioners/data/vertical-spacing.qml
new file mode 100644
index 0000000000..7087961651
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/vertical-spacing.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Column {
+        objectName: "column"
+        spacing: 10
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "red"
+            width: 20
+            height: 10
+        }
+        Rectangle {
+            objectName: "three"
+            color: "red"
+            width: 40
+            height: 20
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/data/vertical.qml b/tests/auto/declarative/qsgpositioners/data/vertical.qml
new file mode 100644
index 0000000000..0c3a81f008
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/data/vertical.qml
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+
+Item {
+    width: 640
+    height: 480
+    Column {
+        objectName: "column"
+        Rectangle {
+            objectName: "one"
+            color: "red"
+            width: 50
+            height: 50
+        }
+        Rectangle {
+            objectName: "two"
+            color: "red"
+            width: 20
+            height: 10
+        }
+        Rectangle {
+            objectName: "three"
+            color: "red"
+            width: 40
+            height: 20
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgpositioners/qsgpositioners.pro b/tests/auto/declarative/qsgpositioners/qsgpositioners.pro
new file mode 100644
index 0000000000..f1ba7c0505
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/qsgpositioners.pro
@@ -0,0 +1,15 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qsgpositioners.cpp
+macx:CONFIG -= app_bundle
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgpositioners/tst_qsgpositioners.cpp b/tests/auto/declarative/qsgpositioners/tst_qsgpositioners.cpp
new file mode 100644
index 0000000000..4e29b65d16
--- /dev/null
+++ b/tests/auto/declarative/qsgpositioners/tst_qsgpositioners.cpp
@@ -0,0 +1,1268 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtTest/QtTest>
+#include <private/qlistmodelinterface_p.h>
+#include <qsgview.h>
+#include <qdeclarativeengine.h>
+#include <private/qsgrectangle_p.h>
+#include <private/qsgpositioners_p.h>
+#include <private/qdeclarativetransition_p.h>
+#include <private/qsgitem_p.h>
+#include <qdeclarativeexpression.h>
+#include <QtGui/qgraphicswidget.h>
+#include "../../../shared/util.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsgpositioners : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgpositioners();
+
+private slots:
+    void test_horizontal();
+    void test_horizontal_rtl();
+    void test_horizontal_spacing();
+    void test_horizontal_spacing_rightToLeft();
+    void test_horizontal_animated();
+    void test_horizontal_animated_rightToLeft();
+    void test_vertical();
+    void test_vertical_spacing();
+    void test_vertical_animated();
+    void test_grid();
+    void test_grid_topToBottom();
+    void test_grid_rightToLeft();
+    void test_grid_spacing();
+    void test_grid_animated();
+    void test_grid_animated_rightToLeft();
+    void test_grid_zero_columns();
+    void test_propertychanges();
+    void test_repeater();
+    void test_flow();
+    void test_flow_rightToLeft();
+    void test_flow_topToBottom();
+    void test_flow_resize();
+    void test_flow_resize_rightToLeft();
+    void test_flow_implicit_resize();
+    void test_conflictinganchors();
+    void test_mirroring();
+private:
+    QSGView *createView(const QString &filename);
+};
+
+tst_qsgpositioners::tst_qsgpositioners()
+{
+}
+
+void tst_qsgpositioners::test_horizontal()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 70.0);
+    QCOMPARE(three->y(), 0.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QCOMPARE(row->width(), 110.0);
+    QCOMPARE(row->height(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_horizontal_rtl()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 60.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 40.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 0.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QCOMPARE(row->width(), 110.0);
+    QCOMPARE(row->height(), 50.0);
+
+    // Change the width of the row and check that items stay to the right
+    row->setWidth(200);
+    QCOMPARE(one->x(), 150.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 130.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 90.0);
+    QCOMPARE(three->y(), 0.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_horizontal_spacing()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 60.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 90.0);
+    QCOMPARE(three->y(), 0.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QCOMPARE(row->width(), 130.0);
+    QCOMPARE(row->height(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_horizontal_spacing_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 80.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 00.0);
+    QCOMPARE(three->y(), 0.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QCOMPARE(row->width(), 130.0);
+    QCOMPARE(row->height(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_horizontal_animated()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal-animated.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    //Note that they animate in
+    QCOMPARE(one->x(), -100.0);
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(three->x(), -100.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QVERIFY(row);
+    QCOMPARE(row->width(), 100.0);
+    QCOMPARE(row->height(), 50.0);
+
+    //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+    //Note that this means the duration of the animation is NOT tested
+
+    QTRY_COMPARE(one->x(), 0.0);
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(two->opacity(), 0.0);
+    QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
+    QTRY_COMPARE(two->y(), 0.0);
+    QTRY_COMPARE(three->x(), 50.0);
+    QTRY_COMPARE(three->y(), 0.0);
+
+    //Add 'two'
+    two->setOpacity(1.0);
+    QCOMPARE(two->opacity(), 1.0);
+
+    // New size should be immediate
+    QCOMPARE(row->width(), 150.0);
+    QCOMPARE(row->height(), 50.0);
+
+    QTest::qWait(0);//Let the animation start
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(three->x(), 50.0);
+
+    QTRY_COMPARE(two->x(), 50.0);
+    QTRY_COMPARE(three->x(), 100.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_horizontal_animated_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontal-animated.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    //Note that they animate in
+    QCOMPARE(one->x(), -100.0);
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(three->x(), -100.0);
+
+    QSGItem *row = canvas->rootObject()->findChild<QSGItem*>("row");
+    QVERIFY(row);
+    QCOMPARE(row->width(), 100.0);
+    QCOMPARE(row->height(), 50.0);
+
+    //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+    //Note that this means the duration of the animation is NOT tested
+
+    QTRY_COMPARE(one->x(), 50.0);
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(two->opacity(), 0.0);
+    QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
+    QTRY_COMPARE(two->y(), 0.0);
+    QTRY_COMPARE(three->x(), 0.0);
+    QTRY_COMPARE(three->y(), 0.0);
+
+    //Add 'two'
+    two->setOpacity(1.0);
+    QCOMPARE(two->opacity(), 1.0);
+
+    // New size should be immediate
+    QCOMPARE(row->width(), 150.0);
+    QCOMPARE(row->height(), 50.0);
+
+    QTest::qWait(0);//Let the animation start
+    QCOMPARE(one->x(), 50.0);
+    QCOMPARE(two->x(), -100.0);
+
+    QTRY_COMPARE(one->x(), 100.0);
+    QTRY_COMPARE(two->x(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_vertical()
+{
+    QSGView *canvas = createView(SRCDIR "/data/vertical.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 0.0);
+    QCOMPARE(two->y(), 50.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 60.0);
+
+    QSGItem *column = canvas->rootObject()->findChild<QSGItem*>("column");
+    QVERIFY(column);
+    QCOMPARE(column->height(), 80.0);
+    QCOMPARE(column->width(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_vertical_spacing()
+{
+    QSGView *canvas = createView(SRCDIR "/data/vertical-spacing.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 0.0);
+    QCOMPARE(two->y(), 60.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 80.0);
+
+    QSGItem *column = canvas->rootObject()->findChild<QSGItem*>("column");
+    QCOMPARE(column->height(), 100.0);
+    QCOMPARE(column->width(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_vertical_animated()
+{
+    QSGView *canvas = createView(SRCDIR "/data/vertical-animated.qml");
+
+    //Note that they animate in
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QCOMPARE(one->y(), -100.0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QCOMPARE(two->y(), -100.0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QCOMPARE(three->y(), -100.0);
+
+    QSGItem *column = canvas->rootObject()->findChild<QSGItem*>("column");
+    QVERIFY(column);
+    QCOMPARE(column->height(), 100.0);
+    QCOMPARE(column->width(), 50.0);
+
+    //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+    //Note that this means the duration of the animation is NOT tested
+
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(one->x(), 0.0);
+    QTRY_COMPARE(two->opacity(), 0.0);
+    QTRY_COMPARE(two->y(), -100.0);//Not 'in' yet
+    QTRY_COMPARE(two->x(), 0.0);
+    QTRY_COMPARE(three->y(), 50.0);
+    QTRY_COMPARE(three->x(), 0.0);
+
+    //Add 'two'
+    two->setOpacity(1.0);
+    QTRY_COMPARE(two->opacity(), 1.0);
+    QCOMPARE(column->height(), 150.0);
+    QCOMPARE(column->width(), 50.0);
+    QTest::qWait(0);//Let the animation start
+    QCOMPARE(two->y(), -100.0);
+    QCOMPARE(three->y(), 50.0);
+
+    QTRY_COMPARE(two->y(), 50.0);
+    QTRY_COMPARE(three->y(), 100.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid()
+{
+    QSGView *canvas = createView(SRCDIR "/data/gridtest.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 70.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 50.0);
+    QCOMPARE(five->x(), 50.0);
+    QCOMPARE(five->y(), 50.0);
+
+    QSGGrid *grid = canvas->rootObject()->findChild<QSGGrid*>("grid");
+    QCOMPARE(grid->flow(), QSGGrid::LeftToRight);
+    QCOMPARE(grid->width(), 100.0);
+    QCOMPARE(grid->height(), 100.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_topToBottom()
+{
+    QSGView *canvas = createView(SRCDIR "/data/grid-toptobottom.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 0.0);
+    QCOMPARE(two->y(), 50.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 100.0);
+    QCOMPARE(four->x(), 50.0);
+    QCOMPARE(four->y(), 0.0);
+    QCOMPARE(five->x(), 50.0);
+    QCOMPARE(five->y(), 50.0);
+
+    QSGGrid *grid = canvas->rootObject()->findChild<QSGGrid*>("grid");
+    QCOMPARE(grid->flow(), QSGGrid::TopToBottom);
+    QCOMPARE(grid->width(), 100.0);
+    QCOMPARE(grid->height(), 120.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/gridtest.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 50.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 30.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 50.0);
+    QCOMPARE(four->y(), 50.0);
+    QCOMPARE(five->x(), 40.0);
+    QCOMPARE(five->y(), 50.0);
+
+    QSGGrid *grid = canvas->rootObject()->findChild<QSGGrid*>("grid");
+    QCOMPARE(grid->layoutDirection(), Qt::RightToLeft);
+    QCOMPARE(grid->width(), 100.0);
+    QCOMPARE(grid->height(), 100.0);
+
+    // Change the width of the grid and check that items stay to the right
+    grid->setWidth(200);
+    QCOMPARE(one->x(), 150.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 130.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 100.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 150.0);
+    QCOMPARE(four->y(), 50.0);
+    QCOMPARE(five->x(), 140.0);
+    QCOMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_spacing()
+{
+    QSGView *canvas = createView(SRCDIR "/data/grid-spacing.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 54.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 78.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 54.0);
+    QCOMPARE(five->x(), 54.0);
+    QCOMPARE(five->y(), 54.0);
+
+    QSGItem *grid = canvas->rootObject()->findChild<QSGItem*>("grid");
+    QCOMPARE(grid->width(), 128.0);
+    QCOMPARE(grid->height(), 104.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_animated()
+{
+    QSGView *canvas = createView(SRCDIR "/data/grid-animated.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    //Note that all animate in
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QCOMPARE(one->x(), -100.0);
+    QCOMPARE(one->y(), -100.0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(two->y(), -100.0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QCOMPARE(three->x(), -100.0);
+    QCOMPARE(three->y(), -100.0);
+
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QCOMPARE(four->x(), -100.0);
+    QCOMPARE(four->y(), -100.0);
+
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+    QCOMPARE(five->x(), -100.0);
+    QCOMPARE(five->y(), -100.0);
+
+    QSGItem *grid = canvas->rootObject()->findChild<QSGItem*>("grid");
+    QVERIFY(grid);
+    QCOMPARE(grid->width(), 150.0);
+    QCOMPARE(grid->height(), 100.0);
+
+    //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+    //Note that this means the duration of the animation is NOT tested
+
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(one->x(), 0.0);
+    QTRY_COMPARE(two->opacity(), 0.0);
+    QTRY_COMPARE(two->y(), -100.0);
+    QTRY_COMPARE(two->x(), -100.0);
+    QTRY_COMPARE(three->y(), 0.0);
+    QTRY_COMPARE(three->x(), 50.0);
+    QTRY_COMPARE(four->y(), 0.0);
+    QTRY_COMPARE(four->x(), 100.0);
+    QTRY_COMPARE(five->y(), 50.0);
+    QTRY_COMPARE(five->x(), 0.0);
+
+    //Add 'two'
+    two->setOpacity(1.0);
+    QCOMPARE(two->opacity(), 1.0);
+    QCOMPARE(grid->width(), 150.0);
+    QCOMPARE(grid->height(), 100.0);
+    QTest::qWait(0);//Let the animation start
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(two->y(), -100.0);
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(three->x(), 50.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 100.0);
+    QCOMPARE(four->y(), 0.0);
+    QCOMPARE(five->x(), 0.0);
+    QCOMPARE(five->y(), 50.0);
+    //Let the animation complete
+    QTRY_COMPARE(two->x(), 50.0);
+    QTRY_COMPARE(two->y(), 0.0);
+    QTRY_COMPARE(one->x(), 0.0);
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(three->x(), 100.0);
+    QTRY_COMPARE(three->y(), 0.0);
+    QTRY_COMPARE(four->x(), 0.0);
+    QTRY_COMPARE(four->y(), 50.0);
+    QTRY_COMPARE(five->x(), 50.0);
+    QTRY_COMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_animated_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/grid-animated.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    //Note that all animate in
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QCOMPARE(one->x(), -100.0);
+    QCOMPARE(one->y(), -100.0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(two->y(), -100.0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QCOMPARE(three->x(), -100.0);
+    QCOMPARE(three->y(), -100.0);
+
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QCOMPARE(four->x(), -100.0);
+    QCOMPARE(four->y(), -100.0);
+
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+    QCOMPARE(five->x(), -100.0);
+    QCOMPARE(five->y(), -100.0);
+
+    QSGItem *grid = canvas->rootObject()->findChild<QSGItem*>("grid");
+    QVERIFY(grid);
+    QCOMPARE(grid->width(), 150.0);
+    QCOMPARE(grid->height(), 100.0);
+
+    //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+    //Note that this means the duration of the animation is NOT tested
+
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(one->x(), 100.0);
+    QTRY_COMPARE(two->opacity(), 0.0);
+    QTRY_COMPARE(two->y(), -100.0);
+    QTRY_COMPARE(two->x(), -100.0);
+    QTRY_COMPARE(three->y(), 0.0);
+    QTRY_COMPARE(three->x(), 50.0);
+    QTRY_COMPARE(four->y(), 0.0);
+    QTRY_COMPARE(four->x(), 0.0);
+    QTRY_COMPARE(five->y(), 50.0);
+    QTRY_COMPARE(five->x(), 100.0);
+
+    //Add 'two'
+    two->setOpacity(1.0);
+    QCOMPARE(two->opacity(), 1.0);
+    QCOMPARE(grid->width(), 150.0);
+    QCOMPARE(grid->height(), 100.0);
+    QTest::qWait(0);//Let the animation start
+    QCOMPARE(two->x(), -100.0);
+    QCOMPARE(two->y(), -100.0);
+    QCOMPARE(one->x(), 100.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(three->x(), 50.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 0.0);
+    QCOMPARE(five->x(), 100.0);
+    QCOMPARE(five->y(), 50.0);
+    //Let the animation complete
+    QTRY_COMPARE(two->x(), 50.0);
+    QTRY_COMPARE(two->y(), 0.0);
+    QTRY_COMPARE(one->x(), 100.0);
+    QTRY_COMPARE(one->y(), 0.0);
+    QTRY_COMPARE(three->x(), 0.0);
+    QTRY_COMPARE(three->y(), 0.0);
+    QTRY_COMPARE(four->x(), 100.0);
+    QTRY_COMPARE(four->y(), 50.0);
+    QTRY_COMPARE(five->x(), 50.0);
+    QTRY_COMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_grid_zero_columns()
+{
+    QSGView *canvas = createView(SRCDIR "/data/gridzerocolumns.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 70.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 120.0);
+    QCOMPARE(four->y(), 0.0);
+    QCOMPARE(five->x(), 0.0);
+    QCOMPARE(five->y(), 50.0);
+
+    QSGItem *grid = canvas->rootObject()->findChild<QSGItem*>("grid");
+    QCOMPARE(grid->width(), 170.0);
+    QCOMPARE(grid->height(), 60.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_propertychanges()
+{
+    QSGView *canvas = createView(SRCDIR "/data/propertychangestest.qml");
+
+    QSGGrid *grid = qobject_cast<QSGGrid*>(canvas->rootObject());
+    QVERIFY(grid != 0);
+    QDeclarativeTransition *rowTransition = canvas->rootObject()->findChild<QDeclarativeTransition*>("rowTransition");
+    QDeclarativeTransition *columnTransition = canvas->rootObject()->findChild<QDeclarativeTransition*>("columnTransition");
+
+    QSignalSpy addSpy(grid, SIGNAL(addChanged()));
+    QSignalSpy moveSpy(grid, SIGNAL(moveChanged()));
+    QSignalSpy columnsSpy(grid, SIGNAL(columnsChanged()));
+    QSignalSpy rowsSpy(grid, SIGNAL(rowsChanged()));
+
+    QVERIFY(grid);
+    QVERIFY(rowTransition);
+    QVERIFY(columnTransition);
+    QCOMPARE(grid->add(), columnTransition);
+    QCOMPARE(grid->move(), columnTransition);
+    QCOMPARE(grid->columns(), 4);
+    QCOMPARE(grid->rows(), -1);
+
+    grid->setAdd(rowTransition);
+    grid->setMove(rowTransition);
+    QCOMPARE(grid->add(), rowTransition);
+    QCOMPARE(grid->move(), rowTransition);
+    QCOMPARE(addSpy.count(),1);
+    QCOMPARE(moveSpy.count(),1);
+
+    grid->setAdd(rowTransition);
+    grid->setMove(rowTransition);
+    QCOMPARE(addSpy.count(),1);
+    QCOMPARE(moveSpy.count(),1);
+
+    grid->setAdd(0);
+    grid->setMove(0);
+    QCOMPARE(addSpy.count(),2);
+    QCOMPARE(moveSpy.count(),2);
+
+    grid->setColumns(-1);
+    grid->setRows(3);
+    QCOMPARE(grid->columns(), -1);
+    QCOMPARE(grid->rows(), 3);
+    QCOMPARE(columnsSpy.count(),1);
+    QCOMPARE(rowsSpy.count(),1);
+
+    grid->setColumns(-1);
+    grid->setRows(3);
+    QCOMPARE(columnsSpy.count(),1);
+    QCOMPARE(rowsSpy.count(),1);
+
+    grid->setColumns(2);
+    grid->setRows(2);
+    QCOMPARE(columnsSpy.count(),2);
+    QCOMPARE(rowsSpy.count(),2);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_repeater()
+{
+    QSGView *canvas = createView(SRCDIR "/data/repeatertest.qml");
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 100.0);
+    QCOMPARE(three->y(), 0.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 0.0);
+    QCOMPARE(three->y(), 50.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 70.0);
+    QCOMPARE(five->x(), 50.0);
+    QCOMPARE(five->y(), 70.0);
+
+    QSGItem *flow = canvas->rootObject()->findChild<QSGItem*>("flow");
+    QVERIFY(flow);
+    QCOMPARE(flow->width(), 90.0);
+    QCOMPARE(flow->height(), 120.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 40.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 20.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 40.0);
+    QCOMPARE(three->y(), 50.0);
+    QCOMPARE(four->x(), 40.0);
+    QCOMPARE(four->y(), 70.0);
+    QCOMPARE(five->x(), 30.0);
+    QCOMPARE(five->y(), 70.0);
+
+    QSGItem *flow = canvas->rootObject()->findChild<QSGItem*>("flow");
+    QVERIFY(flow);
+    QCOMPARE(flow->width(), 90.0);
+    QCOMPARE(flow->height(), 120.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow_topToBottom()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flowtest-toptobottom.qml");
+
+    canvas->rootObject()->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 50.0);
+    QCOMPARE(three->y(), 50.0);
+    QCOMPARE(four->x(), 100.0);
+    QCOMPARE(four->y(), 00.0);
+    QCOMPARE(five->x(), 100.0);
+    QCOMPARE(five->y(), 50.0);
+
+    QSGItem *flow = canvas->rootObject()->findChild<QSGItem*>("flow");
+    QVERIFY(flow);
+    QCOMPARE(flow->height(), 90.0);
+    QCOMPARE(flow->width(), 150.0);
+
+    canvas->rootObject()->setProperty("testRightToLeft", true);
+
+    QVERIFY(flow);
+    QCOMPARE(flow->height(), 90.0);
+    QCOMPARE(flow->width(), 150.0);
+
+    QCOMPARE(one->x(), 100.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 80.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 50.0);
+    QCOMPARE(three->y(), 50.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 0.0);
+    QCOMPARE(five->x(), 40.0);
+    QCOMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow_resize()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+    QSGItem *root = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(root);
+    root->setWidth(125);
+    root->setProperty("testRightToLeft", false);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 0.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 50.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 70.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 0.0);
+    QCOMPARE(four->y(), 50.0);
+    QCOMPARE(five->x(), 50.0);
+    QCOMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow_resize_rightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+    QSGItem *root = qobject_cast<QSGItem*>(canvas->rootObject());
+    QVERIFY(root);
+    root->setWidth(125);
+    root->setProperty("testRightToLeft", true);
+
+    QSGRectangle *one = canvas->rootObject()->findChild<QSGRectangle*>("one");
+    QVERIFY(one != 0);
+    QSGRectangle *two = canvas->rootObject()->findChild<QSGRectangle*>("two");
+    QVERIFY(two != 0);
+    QSGRectangle *three = canvas->rootObject()->findChild<QSGRectangle*>("three");
+    QVERIFY(three != 0);
+    QSGRectangle *four = canvas->rootObject()->findChild<QSGRectangle*>("four");
+    QVERIFY(four != 0);
+    QSGRectangle *five = canvas->rootObject()->findChild<QSGRectangle*>("five");
+    QVERIFY(five != 0);
+
+    QCOMPARE(one->x(), 75.0);
+    QCOMPARE(one->y(), 0.0);
+    QCOMPARE(two->x(), 55.0);
+    QCOMPARE(two->y(), 0.0);
+    QCOMPARE(three->x(), 5.0);
+    QCOMPARE(three->y(), 0.0);
+    QCOMPARE(four->x(), 75.0);
+    QCOMPARE(four->y(), 50.0);
+    QCOMPARE(five->x(), 65.0);
+    QCOMPARE(five->y(), 50.0);
+
+    delete canvas;
+}
+
+void tst_qsgpositioners::test_flow_implicit_resize()
+{
+    QSGView *canvas = createView(SRCDIR "/data/flow-testimplicitsize.qml");
+    QVERIFY(canvas->rootObject() != 0);
+
+    QSGFlow *flow = canvas->rootObject()->findChild<QSGFlow*>("flow");
+    QVERIFY(flow != 0);
+
+    QCOMPARE(flow->width(), 100.0);
+    QCOMPARE(flow->height(), 120.0);
+
+    canvas->rootObject()->setProperty("flowLayout", 0);
+    QCOMPARE(flow->flow(), QSGFlow::LeftToRight);
+    QCOMPARE(flow->width(), 220.0);
+    QCOMPARE(flow->height(), 50.0);
+
+    canvas->rootObject()->setProperty("flowLayout", 1);
+    QCOMPARE(flow->flow(), QSGFlow::TopToBottom);
+    QCOMPARE(flow->width(), 100.0);
+    QCOMPARE(flow->height(), 120.0);
+
+    canvas->rootObject()->setProperty("flowLayout", 2);
+    QCOMPARE(flow->layoutDirection(), Qt::RightToLeft);
+    QCOMPARE(flow->width(), 220.0);
+    QCOMPARE(flow->height(), 50.0);
+
+    delete canvas;
+}
+
+QString warningMessage;
+
+void interceptWarnings(QtMsgType type, const char *msg)
+{
+    Q_UNUSED( type );
+    warningMessage = msg;
+}
+
+void tst_qsgpositioners::test_conflictinganchors()
+{
+    QtMsgHandler oldMsgHandler = qInstallMsgHandler(interceptWarnings);
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine);
+
+    component.setData("import QtQuick 2.0\nColumn { Item {} }", QUrl::fromLocalFile(""));
+    QSGItem *item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    delete item;
+
+    component.setData("import QtQuick 2.0\nRow { Item {} }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    delete item;
+
+    component.setData("import QtQuick 2.0\nGrid { Item {} }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    delete item;
+
+    component.setData("import QtQuick 2.0\nFlow { Item {} }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    delete item;
+
+    component.setData("import QtQuick 2.0\nColumn { Item { anchors.top: parent.top } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nColumn { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nColumn { Item { anchors.left: parent.left } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nRow { Item { anchors.left: parent.left } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nRow { Item { anchors.fill: parent } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nRow { Item { anchors.top: parent.top } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QVERIFY(warningMessage.isEmpty());
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nGrid { Item { anchors.horizontalCenter: parent.horizontalCenter } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nGrid { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid"));
+    warningMessage.clear();
+    delete item;
+
+    component.setData("import QtQuick 2.0\nFlow { Item { anchors.verticalCenter: parent.verticalCenter } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow"));
+    delete item;
+
+    component.setData("import QtQuick 2.0\nFlow { Item { anchors.fill: parent } }", QUrl::fromLocalFile(""));
+    item = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(item);
+    QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow"));
+    qInstallMsgHandler(oldMsgHandler);
+    delete item;
+}
+
+void tst_qsgpositioners::test_mirroring()
+{
+    QList<QString> qmlFiles;
+    qmlFiles << "horizontal.qml" << "gridtest.qml" << "flowtest.qml";
+    QList<QString> objectNames;
+    objectNames << "one" << "two" << "three" << "four" << "five";
+
+    foreach(const QString qmlFile, qmlFiles) {
+        QSGView *canvasA = createView(QString(SRCDIR) + "/data/" + qmlFile);
+        QSGItem *rootA = qobject_cast<QSGItem*>(canvasA->rootObject());
+
+        QSGView *canvasB = createView(QString(SRCDIR) + "/data/" + qmlFile);
+        QSGItem *rootB = qobject_cast<QSGItem*>(canvasB->rootObject());
+
+        rootA->setProperty("testRightToLeft", true); // layoutDirection: Qt.RightToLeft
+
+        // LTR != RTL
+        foreach(const QString objectName, objectNames) {
+            // horizontal.qml only has three items
+            if (qmlFile == QString("horizontal.qml") && objectName == QString("four"))
+                break;
+            QSGItem *itemA = rootA->findChild<QSGItem*>(objectName);
+            QSGItem *itemB = rootB->findChild<QSGItem*>(objectName);
+            QVERIFY(itemA->x() != itemB->x());
+        }
+
+        QSGItemPrivate* rootPrivateB = QSGItemPrivate::get(rootB);
+
+        rootPrivateB->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
+        rootPrivateB->isMirrorImplicit = false;
+        rootPrivateB->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
+        rootPrivateB->resolveLayoutMirror();
+
+        // RTL == mirror
+        foreach(const QString objectName, objectNames) {
+            // horizontal.qml only has three items
+            if (qmlFile == QString("horizontal.qml") && objectName == QString("four"))
+                break;
+            QSGItem *itemA = rootA->findChild<QSGItem*>(objectName);
+            QSGItem *itemB = rootB->findChild<QSGItem*>(objectName);
+            QCOMPARE(itemA->x(), itemB->x());
+        }
+
+        rootA->setProperty("testRightToLeft", false); // layoutDirection: Qt.LeftToRight
+        rootB->setProperty("testRightToLeft", true); // layoutDirection: Qt.RightToLeft
+
+        // LTR == RTL + mirror
+        foreach(const QString objectName, objectNames) {
+            // horizontal.qml only has three items
+            if (qmlFile == QString("horizontal.qml") && objectName == QString("four"))
+                break;
+            QSGItem *itemA = rootA->findChild<QSGItem*>(objectName);
+            QSGItem *itemB = rootB->findChild<QSGItem*>(objectName);
+            QCOMPARE(itemA->x(), itemB->x());
+        }
+        delete canvasA;
+        delete canvasB;
+    }
+}
+
+QSGView *tst_qsgpositioners::createView(const QString &filename)
+{
+    QSGView *canvas = new QSGView(0);
+
+    canvas->setSource(QUrl::fromLocalFile(filename));
+
+    return canvas;
+}
+
+
+QTEST_MAIN(tst_qsgpositioners)
+
+#include "tst_qsgpositioners.moc"
diff --git a/tests/auto/declarative/qsgrepeater/data/intmodel.qml b/tests/auto/declarative/qsgrepeater/data/intmodel.qml
new file mode 100644
index 0000000000..30a650dd52
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/intmodel.qml
@@ -0,0 +1,29 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: container
+    objectName: "container"
+    width: 240
+    height: 320
+    color: "white"
+
+    function checkProperties() {
+        testObject.error = false;
+        if (repeater.delegate != comp) {
+            console.log("delegate property incorrect");
+            testObject.error = true;
+        }
+    }
+
+    Component {
+        id: comp
+        Item{}
+    }
+
+    Repeater {
+        id: repeater
+        objectName: "repeater"
+        model: testData
+        delegate: comp
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/data/itemlist.qml b/tests/auto/declarative/qsgrepeater/data/itemlist.qml
new file mode 100644
index 0000000000..174bfd4d18
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/itemlist.qml
@@ -0,0 +1,68 @@
+// This example demonstrates placing items in a view using
+// a VisualItemModel
+
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    color: "lightgray"
+    width: 240
+    height: 320
+    property variant itemModel: itemModel1
+
+    function checkProperties() {
+        testObject.error = false;
+        if (testObject.useModel && view.model != root.itemModel) {
+            console.log("model property incorrect");
+            testObject.error = true;
+        }
+    }
+
+    function switchModel() {
+        root.itemModel = itemModel2
+    }
+
+    VisualItemModel {
+        id: itemModel1
+        objectName: "itemModel1"
+        Rectangle {
+            objectName: "item1"
+            height: 50; width: 100; color: "#FFFEF0"
+            Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item2"
+            height: 50; width: 100; color: "#F0FFF7"
+            Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item3"
+            height: 50; width: 100; color: "#F4F0FF"
+            Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+    }
+
+    VisualItemModel {
+        id: itemModel2
+        objectName: "itemModel2"
+        Rectangle {
+            objectName: "item4"
+            height: 50; width: 100; color: "#FFFEF0"
+            Text { objectName: "text4"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+        Rectangle {
+            objectName: "item5"
+            height: 50; width: 100; color: "#F0FFF7"
+            Text { objectName: "text5"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+        }
+    }
+
+    Column {
+        objectName: "container"
+        Repeater {
+            id: view
+            objectName: "repeater"
+            model: testObject.useModel ? root.itemModel : 0
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/data/modelChanged.qml b/tests/auto/declarative/qsgrepeater/data/modelChanged.qml
new file mode 100644
index 0000000000..23af127e79
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/modelChanged.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.0
+
+Column {
+    Repeater {
+        id: repeater
+        objectName: "repeater"
+
+        property int itemsCount
+        property variant itemsFound: []
+
+        delegate: Rectangle {
+            color: "red"
+            width: (index+1)*50
+            height: 50
+        }
+
+        onModelChanged: {
+            repeater.itemsCount = repeater.count
+            var items = []
+            for (var i=0; i<repeater.count; i++)
+                items.push(repeater.itemAt(i))
+            repeater.itemsFound = items
+        }
+    }
+}
+
diff --git a/tests/auto/declarative/qsgrepeater/data/objlist.qml b/tests/auto/declarative/qsgrepeater/data/objlist.qml
new file mode 100644
index 0000000000..c49d5926e5
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/objlist.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: container
+    objectName: "container"
+    width: 240
+    height: 320
+    color: "white"
+    Repeater {
+        id: repeater
+        objectName: "repeater"
+        model: testData
+        property int errors: 0
+        property int instantiated: 0
+        Component {
+            Item{
+                Component.onCompleted: {if(index!=modelData.idx) repeater.errors += 1; repeater.instantiated++}
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/data/properties.qml b/tests/auto/declarative/qsgrepeater/data/properties.qml
new file mode 100644
index 0000000000..035431c784
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/properties.qml
@@ -0,0 +1,11 @@
+import QtQuick 2.0
+
+Row { 
+    Repeater { 
+        objectName: "repeater"
+        model: 5
+        Text { 
+            text: "I'm item " + index 
+        } 
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/data/repeater1.qml b/tests/auto/declarative/qsgrepeater/data/repeater1.qml
new file mode 100644
index 0000000000..596dc9131e
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/repeater1.qml
@@ -0,0 +1,28 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: container
+    objectName: "container"
+    width: 240
+    height: 320
+    color: "white"
+    Text {
+        text: "Zero"
+    }
+    Repeater {
+        id: repeater
+        objectName: "repeater"
+        width: 240
+        height: 320
+        model: testData
+        Component {
+            Text {
+                y: index*20
+                text: modelData
+            }
+        }
+    }
+    Text {
+        text: "Last"
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/data/repeater2.qml b/tests/auto/declarative/qsgrepeater/data/repeater2.qml
new file mode 100644
index 0000000000..691fbda1e5
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/data/repeater2.qml
@@ -0,0 +1,36 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "white"
+    Component {
+        id: myDelegate
+        Item {
+            objectName: "myDelegate"
+            height: 20
+            width: 240
+            Text {
+                objectName: "myName"
+                text: name
+            }
+            Text {
+                objectName: "myNumber"
+                x: 100
+                text: number
+            }
+        }
+    }
+    Column {
+        id: container
+        objectName: "container"
+        Repeater {
+            id: repeater
+            objectName: "repeater"
+            width: 240
+            height: 320
+            delegate: myDelegate
+            model: testData
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgrepeater/qsgrepeater.pro b/tests/auto/declarative/qsgrepeater/qsgrepeater.pro
new file mode 100644
index 0000000000..99c3e1830b
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/qsgrepeater.pro
@@ -0,0 +1,15 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgrepeater.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
diff --git a/tests/auto/declarative/qsgrepeater/tst_qsgrepeater.cpp b/tests/auto/declarative/qsgrepeater/tst_qsgrepeater.cpp
new file mode 100644
index 0000000000..e9d79629c6
--- /dev/null
+++ b/tests/auto/declarative/qsgrepeater/tst_qsgrepeater.cpp
@@ -0,0 +1,697 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtTest/QSignalSpy>
+#include <private/qlistmodelinterface_p.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qsgview.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <private/qsgrepeater_p.h>
+#include <private/qsgtext_p.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+inline QUrl TEST_FILE(const QString &filename)
+{
+    return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename);
+}
+
+class tst_QSGRepeater : public QObject
+{
+    Q_OBJECT
+public:
+    tst_QSGRepeater();
+
+private slots:
+    void numberModel();
+    void objectList();
+    void stringList();
+    void dataModel_adding();
+    void dataModel_removing();
+    void dataModel_changes();
+    void itemModel();
+    void resetModel();
+    void modelChanged();
+    void properties();
+
+private:
+    QSGView *createView();
+    template<typename T>
+    T *findItem(QObject *parent, const QString &objectName, int index);
+    template<typename T>
+    T *findItem(QObject *parent, const QString &id);
+};
+
+class TestObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(bool error READ error WRITE setError)
+    Q_PROPERTY(bool useModel READ useModel NOTIFY useModelChanged)
+
+public:
+    TestObject() : QObject(), mError(true), mUseModel(false) {}
+
+    bool error() const { return mError; }
+    void setError(bool err) { mError = err; }
+
+    bool useModel() const { return mUseModel; }
+    void setUseModel(bool use) { mUseModel = use; emit useModelChanged(); }
+
+signals:
+    void useModelChanged();
+
+private:
+    bool mError;
+    bool mUseModel;
+};
+
+class TestModel : public QAbstractListModel
+{
+public:
+    enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
+
+    TestModel(QObject *parent=0) : QAbstractListModel(parent) {
+        QHash<int, QByteArray> roles;
+        roles[Name] = "name";
+        roles[Number] = "number";
+        setRoleNames(roles);
+    }
+
+    int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); }
+    QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
+        QVariant rv;
+        if (role == Name)
+            rv = list.at(index.row()).first;
+        else if (role == Number)
+            rv = list.at(index.row()).second;
+
+        return rv;
+    }
+
+    int count() const { return rowCount(); }
+    QString name(int index) const { return list.at(index).first; }
+    QString number(int index) const { return list.at(index).second; }
+
+    void addItem(const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), list.count(), list.count());
+        list.append(QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void insertItem(int index, const QString &name, const QString &number) {
+        emit beginInsertRows(QModelIndex(), index, index);
+        list.insert(index, QPair<QString,QString>(name, number));
+        emit endInsertRows();
+    }
+
+    void removeItem(int index) {
+        emit beginRemoveRows(QModelIndex(), index, index);
+        list.removeAt(index);
+        emit endRemoveRows();
+    }
+
+    void moveItem(int from, int to) {
+        emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
+        list.move(from, to);
+        emit endMoveRows();
+    }
+
+    void modifyItem(int idx, const QString &name, const QString &number) {
+        list[idx] = QPair<QString,QString>(name, number);
+        emit dataChanged(index(idx,0), index(idx,0));
+    }
+
+private:
+    QList<QPair<QString,QString> > list;
+};
+
+
+tst_QSGRepeater::tst_QSGRepeater()
+{
+}
+
+void tst_QSGRepeater::numberModel()
+{
+    QSGView *canvas = createView();
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testData", 5);
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/intmodel.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QCOMPARE(repeater->parentItem()->childItems().count(), 5+1);
+
+    QVERIFY(!repeater->itemAt(-1));
+    for (int i=0; i<repeater->count(); i++)
+        QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i));
+    QVERIFY(!repeater->itemAt(repeater->count()));
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QVERIFY(testObject->error() == false);
+
+    delete testObject;
+    delete canvas;
+}
+
+class MyObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int idx READ idx CONSTANT)
+public:
+    MyObject(int i) : QObject(), m_idx(i) {}
+
+    int idx() const { return m_idx; }
+
+    int m_idx;
+};
+
+void tst_QSGRepeater::objectList()
+{
+    QSGView *canvas = createView();
+    QObjectList data;
+    for(int i=0; i<100; i++)
+        data << new MyObject(i);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testData", QVariant::fromValue(data));
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/objlist.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QCOMPARE(repeater->property("errors").toInt(), 0);//If this fails either they are out of order or can't find the object's data
+    QCOMPARE(repeater->property("instantiated").toInt(), 100);
+
+    QVERIFY(!repeater->itemAt(-1));
+    for (int i=0; i<data.count(); i++)
+        QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i));
+    QVERIFY(!repeater->itemAt(data.count()));
+
+    QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QSGItem*)));
+    QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QSGItem*)));
+    ctxt->setContextProperty("testData", QVariant::fromValue(data));
+    QCOMPARE(addedSpy.count(), data.count());
+    QCOMPARE(removedSpy.count(), data.count());
+
+    qDeleteAll(data);
+    delete canvas;
+}
+
+/*
+The Repeater element creates children at its own position in its parent's
+stacking order.  In this test we insert a repeater between two other Text
+elements to test this.
+*/
+void tst_QSGRepeater::stringList()
+{
+    QSGView *canvas = createView();
+
+    QStringList data;
+    data << "One";
+    data << "Two";
+    data << "Three";
+    data << "Four";
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testData", data);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater1.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+
+    QCOMPARE(container->childItems().count(), data.count() + 3);
+
+    bool saw_repeater = false;
+    for (int i = 0; i < container->childItems().count(); ++i) {
+
+        if (i == 0) {
+            QSGText *name = qobject_cast<QSGText*>(container->childItems().at(i));
+            QVERIFY(name != 0);
+            QCOMPARE(name->text(), QLatin1String("Zero"));
+        } else if (i == container->childItems().count() - 2) {
+            // The repeater itself
+            QSGRepeater *rep = qobject_cast<QSGRepeater*>(container->childItems().at(i));
+            QCOMPARE(rep, repeater);
+            saw_repeater = true;
+            continue;
+        } else if (i == container->childItems().count() - 1) {
+            QSGText *name = qobject_cast<QSGText*>(container->childItems().at(i));
+            QVERIFY(name != 0);
+            QCOMPARE(name->text(), QLatin1String("Last"));
+        } else {
+            QSGText *name = qobject_cast<QSGText*>(container->childItems().at(i));
+            QVERIFY(name != 0);
+            QCOMPARE(name->text(), data.at(i-1));
+        }
+    }
+    QVERIFY(saw_repeater);
+
+    delete canvas;
+}
+
+void tst_QSGRepeater::dataModel_adding()
+{
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    TestModel testModel;
+    ctxt->setContextProperty("testData", &testModel);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+
+    QVERIFY(!repeater->itemAt(0));
+
+    QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+    QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QSGItem*)));
+
+    // add to empty model
+    testModel.addItem("two", "2");
+    QCOMPARE(repeater->itemAt(0), container->childItems().at(0));
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(addedSpy.count(), 1);
+    QCOMPARE(addedSpy.at(0).at(0).toInt(), 0);
+    QCOMPARE(addedSpy.at(0).at(1).value<QSGItem*>(), container->childItems().at(0));
+    addedSpy.clear();
+
+    // insert at start
+    testModel.insertItem(0, "one", "1");
+    QCOMPARE(repeater->itemAt(0), container->childItems().at(0));
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(addedSpy.count(), 1);
+    QCOMPARE(addedSpy.at(0).at(0).toInt(), 0);
+    QCOMPARE(addedSpy.at(0).at(1).value<QSGItem*>(), container->childItems().at(0));
+    addedSpy.clear();
+
+    // insert at end
+    testModel.insertItem(2, "four", "4");
+    QCOMPARE(repeater->itemAt(2), container->childItems().at(2));
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(addedSpy.count(), 1);
+    QCOMPARE(addedSpy.at(0).at(0).toInt(), 2);
+    QCOMPARE(addedSpy.at(0).at(1).value<QSGItem*>(), container->childItems().at(2));
+    addedSpy.clear();
+
+    // insert in middle
+    testModel.insertItem(2, "three", "3");
+    QCOMPARE(repeater->itemAt(2), container->childItems().at(2));
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(addedSpy.count(), 1);
+    QCOMPARE(addedSpy.at(0).at(0).toInt(), 2);
+    QCOMPARE(addedSpy.at(0).at(1).value<QSGItem*>(), container->childItems().at(2));
+    addedSpy.clear();
+
+    delete testObject;
+    addedSpy.clear();
+    countSpy.clear();
+    delete canvas;
+}
+
+void tst_QSGRepeater::dataModel_removing()
+{
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    TestModel testModel;
+    testModel.addItem("one", "1");
+    testModel.addItem("two", "2");
+    testModel.addItem("three", "3");
+    testModel.addItem("four", "4");
+    testModel.addItem("five", "5");
+
+    ctxt->setContextProperty("testData", &testModel);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+    QCOMPARE(container->childItems().count(), repeater->count()+1);
+
+    QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+    QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QSGItem*)));
+
+    // remove at start
+    QSGItem *item = repeater->itemAt(0);
+    QCOMPARE(item, container->childItems().at(0));
+
+    testModel.removeItem(0);
+    QVERIFY(repeater->itemAt(0) != item);
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(removedSpy.count(), 1);
+    QCOMPARE(removedSpy.at(0).at(0).toInt(), 0);
+    QCOMPARE(removedSpy.at(0).at(1).value<QSGItem*>(), item);
+    removedSpy.clear();
+
+    // remove at end
+    int lastIndex = testModel.count()-1;
+    item = repeater->itemAt(lastIndex);
+    QCOMPARE(item, container->childItems().at(lastIndex));
+
+    testModel.removeItem(lastIndex);
+    QVERIFY(repeater->itemAt(lastIndex) != item);
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(removedSpy.count(), 1);
+    QCOMPARE(removedSpy.at(0).at(0).toInt(), lastIndex);
+    QCOMPARE(removedSpy.at(0).at(1).value<QSGItem*>(), item);
+    removedSpy.clear();
+
+    // remove from middle
+    item = repeater->itemAt(1);
+    QCOMPARE(item, container->childItems().at(1));
+
+    testModel.removeItem(1);
+    QVERIFY(repeater->itemAt(lastIndex) != item);
+    QCOMPARE(countSpy.count(), 1); countSpy.clear();
+    QCOMPARE(removedSpy.count(), 1);
+    QCOMPARE(removedSpy.at(0).at(0).toInt(), 1);
+    QCOMPARE(removedSpy.at(0).at(1).value<QSGItem*>(), item);
+    removedSpy.clear();
+
+    delete testObject;
+    delete canvas;
+}
+
+void tst_QSGRepeater::dataModel_changes()
+{
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    TestModel testModel;
+    testModel.addItem("one", "1");
+    testModel.addItem("two", "2");
+    testModel.addItem("three", "3");
+
+    ctxt->setContextProperty("testData", &testModel);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+    QCOMPARE(container->childItems().count(), repeater->count()+1);
+
+    // Check that model changes are propagated
+    QSGText *text = findItem<QSGText>(canvas->rootObject(), "myName", 1);
+    QVERIFY(text);
+    QCOMPARE(text->text(), QString("two"));
+
+    testModel.modifyItem(1, "Item two", "_2");
+    text = findItem<QSGText>(canvas->rootObject(), "myName", 1);
+    QVERIFY(text);
+    QCOMPARE(text->text(), QString("Item two"));
+
+    text = findItem<QSGText>(canvas->rootObject(), "myNumber", 1);
+    QVERIFY(text);
+    QCOMPARE(text->text(), QString("_2"));
+
+    delete testObject;
+    delete canvas;
+}
+
+void tst_QSGRepeater::itemModel()
+{
+    QSGView *canvas = createView();
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/itemlist.qml"));
+    qApp->processEvents();
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+
+    QCOMPARE(container->childItems().count(), 1);
+
+    testObject->setUseModel(true);
+    QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
+    QVERIFY(testObject->error() == false);
+
+    QCOMPARE(container->childItems().count(), 4);
+    QVERIFY(qobject_cast<QObject*>(container->childItems().at(0))->objectName() == "item1");
+    QVERIFY(qobject_cast<QObject*>(container->childItems().at(1))->objectName() == "item2");
+    QVERIFY(qobject_cast<QObject*>(container->childItems().at(2))->objectName() == "item3");
+    QVERIFY(container->childItems().at(3) == repeater);
+
+    QMetaObject::invokeMethod(canvas->rootObject(), "switchModel");
+    QCOMPARE(container->childItems().count(), 3);
+    QVERIFY(qobject_cast<QObject*>(container->childItems().at(0))->objectName() == "item4");
+    QVERIFY(qobject_cast<QObject*>(container->childItems().at(1))->objectName() == "item5");
+    QVERIFY(container->childItems().at(2) == repeater);
+
+    testObject->setUseModel(false);
+    QCOMPARE(container->childItems().count(), 1);
+
+    delete testObject;
+    delete canvas;
+}
+
+void tst_QSGRepeater::resetModel()
+{
+    QSGView *canvas = createView();
+
+    QStringList dataA;
+    for (int i=0; i<10; i++)
+        dataA << QString::number(i);
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testData", dataA);
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater1.qml"));
+    qApp->processEvents();
+    QSGRepeater *repeater = findItem<QSGRepeater>(canvas->rootObject(), "repeater");
+    QVERIFY(repeater != 0);
+    QSGItem *container = findItem<QSGItem>(canvas->rootObject(), "container");
+    QVERIFY(container != 0);
+
+    QCOMPARE(repeater->count(), dataA.count());
+    for (int i=0; i<repeater->count(); i++)
+        QCOMPARE(repeater->itemAt(i), container->childItems().at(i+1)); // +1 to skip first Text object
+
+    QSignalSpy modelChangedSpy(repeater, SIGNAL(modelChanged()));
+    QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+    QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QSGItem*)));
+    QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QSGItem*)));
+
+    QStringList dataB;
+    for (int i=0; i<20; i++)
+        dataB << QString::number(i);
+
+    // reset context property
+    ctxt->setContextProperty("testData", dataB);
+    QCOMPARE(repeater->count(), dataB.count());
+
+    QCOMPARE(modelChangedSpy.count(), 1);
+    QCOMPARE(countSpy.count(), 1);
+    QCOMPARE(removedSpy.count(), dataA.count());
+    QCOMPARE(addedSpy.count(), dataB.count());
+    for (int i=0; i<dataB.count(); i++) {
+        QCOMPARE(addedSpy.at(i).at(0).toInt(), i);
+        QCOMPARE(addedSpy.at(i).at(1).value<QSGItem*>(), repeater->itemAt(i));
+    }
+    modelChangedSpy.clear();
+    countSpy.clear();
+    removedSpy.clear();
+    addedSpy.clear();
+
+    // reset via setModel()
+    repeater->setModel(dataA);
+    QCOMPARE(repeater->count(), dataA.count());
+
+    QCOMPARE(modelChangedSpy.count(), 1);
+    QCOMPARE(countSpy.count(), 1);
+    QCOMPARE(removedSpy.count(), dataB.count());
+    QCOMPARE(addedSpy.count(), dataA.count());
+    for (int i=0; i<dataA.count(); i++) {
+        QCOMPARE(addedSpy.at(i).at(0).toInt(), i);
+        QCOMPARE(addedSpy.at(i).at(1).value<QSGItem*>(), repeater->itemAt(i));
+    }
+
+    modelChangedSpy.clear();
+    countSpy.clear();
+    removedSpy.clear();
+    addedSpy.clear();
+
+    delete canvas;
+}
+
+// QTBUG-17156
+void tst_QSGRepeater::modelChanged()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("/modelChanged.qml"));
+
+    QSGItem *rootObject = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(rootObject);
+    QSGRepeater *repeater = findItem<QSGRepeater>(rootObject, "repeater");
+    QVERIFY(repeater);
+
+    repeater->setModel(4);
+    QCOMPARE(repeater->count(), 4);
+    QCOMPARE(repeater->property("itemsCount").toInt(), 4);
+    QCOMPARE(repeater->property("itemsFound").toList().count(), 4);
+
+    repeater->setModel(10);
+    QCOMPARE(repeater->count(), 10);
+    QCOMPARE(repeater->property("itemsCount").toInt(), 10);
+    QCOMPARE(repeater->property("itemsFound").toList().count(), 10);
+
+    delete rootObject;
+}
+
+void tst_QSGRepeater::properties()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("/properties.qml"));
+
+    QSGItem *rootObject = qobject_cast<QSGItem*>(component.create());
+    QVERIFY(rootObject);
+
+    QSGRepeater *repeater = findItem<QSGRepeater>(rootObject, "repeater");
+    QVERIFY(repeater);
+
+    QSignalSpy modelSpy(repeater, SIGNAL(modelChanged()));
+    repeater->setModel(3);
+    QCOMPARE(modelSpy.count(),1);
+    repeater->setModel(3);
+    QCOMPARE(modelSpy.count(),1);
+
+    QSignalSpy delegateSpy(repeater, SIGNAL(delegateChanged()));
+
+    QDeclarativeComponent rectComponent(&engine);
+    rectComponent.setData("import QtQuick 2.0; Rectangle {}", QUrl::fromLocalFile(""));
+
+    repeater->setDelegate(&rectComponent);
+    QCOMPARE(delegateSpy.count(),1);
+    repeater->setDelegate(&rectComponent);
+    QCOMPARE(delegateSpy.count(),1);
+
+    delete rootObject;
+}
+
+QSGView *tst_QSGRepeater::createView()
+{
+    QSGView *canvas = new QSGView(0);
+    canvas->setFixedSize(240,320);
+
+    return canvas;
+}
+
+template<typename T>
+T *tst_QSGRepeater::findItem(QObject *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->children().count() << "children";
+    for (int i = 0; i < parent->children().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->children().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeExpression e(qmlContext(item), item, "index");
+                if (e.evaluate().toInt() == index)
+                    return static_cast<T*>(item);
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+template<typename T>
+T *tst_QSGRepeater::findItem(QObject *parent, const QString &objectName)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    if (mo.cast(parent) && (objectName.isEmpty() || parent->objectName() == objectName))
+        return static_cast<T*>(parent);
+    for (int i = 0; i < parent->children().count(); ++i) {
+        QSGItem *child = qobject_cast<QSGItem*>(parent->children().at(i));
+        if (!child)
+            continue;
+        QSGItem *item = findItem<T>(child, objectName);
+        if (item)
+            return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+QTEST_MAIN(tst_QSGRepeater)
+
+#include "tst_qsgrepeater.moc"
diff --git a/tests/auto/declarative/qsgtext/data/alignments.qml b/tests/auto/declarative/qsgtext/data/alignments.qml
new file mode 100644
index 0000000000..9798d9c736
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/alignments.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 70; height: 70;
+
+    property alias horizontalAlignment: t.horizontalAlignment
+    property alias verticalAlignment: t.verticalAlignment
+    property alias wrapMode: t.wrapMode
+    property alias running: timer.running
+    property string txt: "Test"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 40
+        height: 40
+        color: "green"
+
+        Text {
+            id: t
+
+            anchors.fill: parent
+            horizontalAlignment: Text.AlignRight
+            verticalAlignment: Text.AlignBottom
+            wrapMode: Text.WordWrap
+            text: top.txt
+        }
+        Timer {
+            id: timer
+
+            interval: 1
+            running: true
+            repeat: true
+            onTriggered: {
+                top.txt = top.txt + "<br>more " + top.txt.length;
+                if (top.txt.length > 50)
+                    running = false
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtext/data/alignments_cb.png b/tests/auto/declarative/qsgtext/data/alignments_cb.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf6199a418a00a470de94a46747394952f2c6551
GIT binary patch
literal 496
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*yM
z%C7@)BIAeclYkl+Cwsa$hGaCpo%OnlS&^r;^yc?>H`UAQIUcEQ6Yiaxa>89RuBk#T
z$*=v`lpq1sV-eSS45xjZ67=#K<0I)GQ)Ba%-1``)+PZntt}|CWwVyaTwzAK^7W?PU
zUdGCpNvu~qmDUT0?NWLBn)CPcitU|6!Oy#=tXX@v!-6UD)NF03Ag@?UrL#vmLjKym
zle4;)Z<T%Tiki+!>x#{hMhnh;J|}m_Hlm^Y!=w2JRCha68TMUb-n_&?$ce#pM;D)`
zyt~DkxJMGZRva^I>FrI<N#T5JeoMI}RC0&5cgz9)V~flbJtg{NEWOzl^uF9xQ}OQL
z>r1vfRJdz?e-~oB#kN9|@07|y*+{3Q)i1;n7ag-r*e4<^`;KwaJ^#toKO`!7%lX9$
zJjDXSveJ2hDjg3vXq54<2HJ91-AAtY?mS)5GqN@@GmffU^|`Wx-Kc^Ssy-mgxZ=|8
zc7utHcCVDQ?mFMtbxL$k^?^LaR{<~Oz6Cs%GdO7=4^;c1etE<J)krk-pmEYa#`{&*
Vc{9V>IDm1+;OXk;vd$@?2>{Jf&9ndj

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_cc.png b/tests/auto/declarative/qsgtext/data/alignments_cc.png
new file mode 100644
index 0000000000000000000000000000000000000000..f81ccb4238d278b201067cd15f1d54438967808a
GIT binary patch
literal 556
zcmV+{0@MA8P)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01ejw01aUQ@VAmi0005cNkl<ZXo2mT?QX>&2!?gpeed0syB|#q
z6>UZF6gr<QjUR;dEwpkHVoE8zi?63|K%Xti16z^@UMT5X(N~O-PM<m+qWV9MQQ%W#
z+=*tCs^rk6lxP_9^tdVtTl+2*shBwg<g0F=mPd)+ZXU15x6E2eG}(&8%cv*b!l(5V
z|NdNxzxCIBHR(r?N-vC(JxQ2#U`!Ged`y4D!KNVVU}k)vjYgDkzJdq~Y<%tK+Mti+
z)k6t7b}^+*TM}5xRd=ffU^YX@s)v0pJ;Rpd0RxiI{!|QML(=Vvgwc;U*c4<P%#06~
zF%c!4uVBXx&X)adMfQwORS%FGV^EutB(RjL?p6(Owkf7^cJ<(aEy)8P|GmV)d4SrM
z1Y?qLUKzq<^-wqwVy1dP+m#R-)dMtZKTFlatz{p(dho!O<N;$xZEGOGm?S6^5QeLV
zQ6{1U_7@tDnT}hog1f{+$1WP77GkD)s2UHks|OG4?i3FgIBG)(r1z`n*&A?WLQ+*m
ztC#PVK}o!gmG+>~hPA@J^TE$F?2W%mwDa+}gQEMc^LeYc8-6J9u5UUwxvFT>kyIpJ
uYqx4Z<9w`4YTM_M2eu>+Y)Kw?p`<?mEcS%N;p9;O0000<MNUMnLSTZRPWk@;

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_ct.png b/tests/auto/declarative/qsgtext/data/alignments_ct.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ba64125d564b4bc34fc7b27d49785fa59442e09
GIT binary patch
literal 533
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*yM
z%C7@)BIAeclYkl+cX+xuhGaCpopCqsfC5MB>rLP9-JHCed%K(KT8(X&KE_J8CfPjV
zU;Fu<{QF0bUvi#Eo@A1Miat1b&ezHR{#NYl;@<yBHH?3MYs5CBeb#eX++r{J;@ahx
z#~e+(Tm?cW+!C}r5?ice=bdru{HAASM|uOTUI_}PZd55b;Sl2WAi{p{o7gJ0$x9ml
zsw9>*oK<m5=y~Zav!wF`-y=8eOCBzqnVr9iOTw}qZ;|~KG2b?2!D8{?TT4_I&g5Mn
zX(%vXQK$MsgXg6KY?A`^Yqi~QzO=OU@C#MGOD-wwg^Q=A`T+HFetM(u^^N?rr~W&%
zs~PS~Hs5MdY0TM~lz)+NrT?`j$v2zXd?vBw{f}Fuuy(<fqlw0z9=gssGi_6v4Q{Gc
zJJf2ZRj2SzIP<scl$@UJ?+tGpnfGX{e9#(L^>1bAyYDsgez!(dFu&XUaZd5Q-wV>y
z!kPoE#EmBSrWQR^53j6w%qqE%XX@kprJFNTe`!XhsF~mMO<!rd^HEWZo(r#}=Ud}~
zZ(_1p)fF>(*RgBH{m`4K!fP|%mgQ0U1CzYk&h46~cKjBKpJgi(c!BK)<Jvb@r}PGD
RR0AWH!PC{xWt~$(69Clp>A(O0

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_lb.png b/tests/auto/declarative/qsgtext/data/alignments_lb.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b50a81f3d4591a90ee76782234738242d99e480
GIT binary patch
literal 496
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442+XKT^vI)8sE-(op)G)r#10b_4_v`Z}xk16nJJQr|tf<e3jCJ
z0Kc9yfmdR@JY9;;eO))F_^tlZE2qsGJ_=jcy!XGjE+Wt~H9TngOtZ|Xt3TftS!H{=
zxF%EIVcvu%jJ2MZyEZj%QYp0U3_P;i^~#~z&~q;XZ-1TBHhF1wVW_j_QtP?P?j=3B
zP^j}jZeC^Fm!*+mvu9M#SeN<g*R6{s3gHjsY#eS^{0!gsY@hQ_#hj)5XC|#uS<({u
zT<+GSxNjF0iWl-s&-i87(%XA@!={$s=I^38Vk9q|5)!@8ym4u6v{0L_x$IoF2XdEV
zix%!|x0qhS;VEYk|55J1-o~2(vc{7N-rqbhqxywfV&VbY1Y1$=-0uvP@6!+4?&(<~
z@a`b9;z{PTzFVQqeUhF6#sX@056i95N&K<oXmZ}|)hj3M?rk@B+vs7+&HOG=YLDX%
zcK#L>{uOdt#eXa*=g(ARt`*@-ey7MerRZuo{{+hptDc?goIE?&b&Sra-f3okbYD{r
g=o&Qi!@;xu%*^Y&bKV6!2gVtLr>mdKI;Vst08QW2{{R30

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_lc.png b/tests/auto/declarative/qsgtext/data/alignments_lc.png
new file mode 100644
index 0000000000000000000000000000000000000000..f041b868f8347253aecfe9923a4d2604e01d2d85
GIT binary patch
literal 535
zcmV+y0_gpTP)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01iz601hSrz}(tp0005HNkl<ZXo2mT+pfeQ2t{>r{`>6ta_6Cm
zp<Y^1tkSSDX|yuNEmV2HhY;Mm_^e)lJSIs4CP@P?l=R24_TJO(o)>`cSeEyUf3b{3
z;CZP?bX^F6x-oW-=VQV~zojG;BZq+ae9}<@UZTs5?dRhyGAfA%TM~GYhXZffUe3er
zrEmE#m`(U+gwhMWw1FfD&$n6<<fr5x;>fxn?~$41jmdO*3Fjw>FqgHj=eaiMLLhs%
z0S%*&)HW;$S;!Sfiw4MSB;aKab}y~LBxzu&B-GE00ai=8eZ$AHhXb6S$nGDUE!(GM
z*;iPdJrs>Gq;03{A?fyF*@Fg5k_P6Vco*Q@Kxv52Hj;3DGr(rqLo!Jh8)OftPu0ch
z>;dw*-yYe+ttAJ`9yDN*G_cK8TWj#yMiRslh%K{+F}l2j?B^=mOxv}ooVvh6!ze1Q
z?qY-Np=dmSWe*y#>J$wuy=t9vq$Vt><?Ehsv81AmT8&>LY)N@}E3HkVg=~p^<HnB{
z^7VX6v?B6YK~k01xZjh?5T^&;^`c|(tDv?~NlD<<MvDg2&&L}PZFVndz$9tFBx&G<
Zl78Ru_Jnvz8XN!s002ovPDHLkV1foW_zwU8

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_lt.png b/tests/auto/declarative/qsgtext/data/alignments_lt.png
new file mode 100644
index 0000000000000000000000000000000000000000..c75e0d158e2e034460e8e9a9e1ac3e89304f9da8
GIT binary patch
literal 514
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442(-XT^vI)8sE-1oyV-m<GS!w{r7LDUpA#3sWzC=pl-)~q#?D?
zP(uBhW%|6M*Wa;zSUgE(0V?|7;CWvq`**hZ+Qq%U75^~(`k^6dVt>9tLUm8df@uHc
zlJZA1L>(_U+VmYzm=ksKORQ7zpRDXO?u6b+E8XAp`gl9F^RT?F(s}8xUpxI9(C~r=
z6@%Zmbvgg&z4Vm1soqqWl2(~+=p5*DXVE{a*txUjZ#yU;bJbb8<V;hrbo|$bXE_%c
zX7aK}*?KsrdM2z^xl(+LWw+|xz6%#$9c<p=`t6^>wm0S8o7QjGU8NzF>~-7os`Dqy
zt}uR~08gQa`5&be-Yqb3eJ<hI;jU(}rpjXuPocxthFz-_%fk5|tp9s%g<PJlX2w?q
z#;7SS9}Z}|t;t&ZcmK@mo+sVi?#wIrux9Hy%k}AXwof!-rC)kZGuru4=eKpyhdn&^
zfAv+qE!nijrQT0Sa$58DKYClm!|(Ln?#(dPURle&?&c!Lw><tuE>#bnHol+aHR-@L
z`B%qgDBNw``S69xy=5AY?|Rl`eobgv!26kfyTH{cyv~;kfw9Qo>FVdQ&MBb@0N4`c
A1^@s6

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_rb.png b/tests/auto/declarative/qsgtext/data/alignments_rb.png
new file mode 100644
index 0000000000000000000000000000000000000000..b06a5da715257327dcdd80f24b9b1be21fe4efe9
GIT binary patch
literal 505
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442*L;T^vI)8sE;kop(fm$7SKG`uAT>zho9-D&}O1dUL{kwJ4){
zVp2+)zFo_Me}eC8cP;*I_qAQ%Qli`jgT3$Hdge_$UlHv2Xqn2SnKqf7H%<oa_-d2#
zskEBuxuK`j1ih7!#>YCQZCP+!R{v3o&`OizyKdd_@jP$$e6xu9bdwf=6aOxk@SC2N
zUZ?OqK-jc+>)*91n?6)6KHFe(e$DJz)fX7@AO4&_b=5Ba9|qGdac@@f6q@6_dUB_M
zXTPm*j(A~6`-xwHtyg<5&p9D<s(gw!$7-VjZSR-^{B6bZ$2^y-E{rNVdohjSlthsQ
z?|IuB`%2g+FKIkIe>zuy*#zFZYbvZ2vKPF0sBqhMLid?MCGQn+>pm~}{Ow29IuZS<
zhYvGLWDFWTzJHLgJaVU*&1VwZlDw@;6nAy-J6t=ktMS4ExfvYA{7<G_5!m~|z_812
z)$<9@<z^j}Ib)k~Kqb@RQke9?+54&s=KAuOWcB2He-P%ib4k43h8==}DZATMpX_8W
rF|z61$<BLYf3QiyBy{w_$#egjitC&UxgYcbBagw;)z4*}Q$iB}j~?F?

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_rc.png b/tests/auto/declarative/qsgtext/data/alignments_rc.png
new file mode 100644
index 0000000000000000000000000000000000000000..e468857cd0e192a5c78b28c00ff30d009afdfee1
GIT binary patch
literal 559
zcmV+~0?_@5P)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01iz601hSrz}(tp0005fNkl<ZXo2mT>yCsV425B{?>%Rqoc&>z
zRBlp4Xx)C95H6MRNQIizhY;Mm_}YB~^D#*pFi9GCp``C+|Kz==&F2mezxZ78p7D<?
z<H)*IDiW72gg}=uHjk1eZ0Ea_xMJiG5KHbtZC)jMyRkmzZ;_pnsIw)G7a4H8)!V}Y
z{{6Y+f66cP(}a(b9q%E;O9J}}*^)4F(d<neSreomnOR=B%>%21a|t5MW%c$vZG#G%
zqlar%NBLn)`LHBpE>|2a8X&XjgBLy6xwHq9qyb5iP~Rjt2$OW#)4}ac99a{jADLNR
znazw<!ns6t;NWc8KP}7tkLA$=_{P{9Jz!qAkTkoo=s^P}NdvpTmnb+_K!yZ;FR=ir
z;M~JOcJz=;(#MQdLiTf&Cr#_^+1y#YXvf3VXxpFzk<r7YWfO}YG+>f6AoZwCDxx>>
z1|SuT2M`*f2PVRzhvbr25$$;B7)52N`;Zqs6pcAp^q>LDPSJp*qt-b`(!7%Ny#5(v
zNh->yrR~+YD=E)drRiogH!ZR6eDDLgc@y3xn&f!gL6T_K`Mhst7DiS(Ui+qFKC7Ut
x$;9z$qeTO{&PUIfHanLzV3IUok~Hu_Nxw#4_JDxB@nQe~002ovPDHLkV1il>0TuuN

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/alignments_rt.png b/tests/auto/declarative/qsgtext/data/alignments_rt.png
new file mode 100644
index 0000000000000000000000000000000000000000..576715ffce82fd054908168ca109cf7c534ae43e
GIT binary patch
literal 539
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442=6cT^vI)8sE;inRi5i$93VW`txt6UuKs&A}8aqAy~dw$$;-s
zl34nh;&Xet*WYE1==Yk`fQk-qtJY55^R|C)rcCXf_7ALI-Y+&`-F3CpMnYA_$Y4$S
z1>L6yH9{Rj9J1V>d{8XeS*pJ<oB#Z@XlAoOqqiM`H?=sKjrL63^g-vPzy99o-xf?#
zIS?mwBLBm*7H$2tc1Hq31aAiJnA)0|*CBLC{nmGXjV-@kTAMtWV!I{Ead%e!w3eik
zq0y`PG-{4rc;m>V<;gThWnryHK!V!KD@F&tDE2MtI?;D%t<IV>*C`Y10%I&ZY>)3&
z{V8uV&$i)R&)%EN*OqcemP(wJQvuq%;diwrTP9<m@Z$HXLLFQlx*`?n{E_O(YdVCw
z=4YNMiFx-uE$HJKak+C*zxkLqoRRah-JS7GfiY@|%ZEc6hP$%X{=K~-@!^zd3+p8G
zY_iuDpL@O2V9!mB*3K^}&NJuy$iBQc;bEoZzn9$4X1vUanE7v#j?s0odzY(M+V6N(
zGRM#5Sd!;oTY;$6d}~d8S|5KjILZB9b*c)Z+s$V6eQZq=zbf8auJ!n(^Pg*P4!Sr>
bKNnv#@#+ML9m?v!=w<M9^>bP0l+XkKm%{97

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/embeddedImagesLocal.qml b/tests/auto/declarative/qsgtext/data/embeddedImagesLocal.qml
new file mode 100644
index 0000000000..d71e9bb5bf
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/embeddedImagesLocal.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Text {
+    text: "<img src='http/exists.png'>"
+}
diff --git a/tests/auto/declarative/qsgtext/data/embeddedImagesLocalError.qml b/tests/auto/declarative/qsgtext/data/embeddedImagesLocalError.qml
new file mode 100644
index 0000000000..e6719481db
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/embeddedImagesLocalError.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Text {
+    text: "<img src='http/notexists.png'>"
+}
diff --git a/tests/auto/declarative/qsgtext/data/embeddedImagesRemote.qml b/tests/auto/declarative/qsgtext/data/embeddedImagesRemote.qml
new file mode 100644
index 0000000000..e524d028b5
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/embeddedImagesRemote.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Text {
+    text: "<img src='http://127.0.0.1:14453/exists.png'>"
+}
diff --git a/tests/auto/declarative/qsgtext/data/embeddedImagesRemoteError.qml b/tests/auto/declarative/qsgtext/data/embeddedImagesRemoteError.qml
new file mode 100644
index 0000000000..f541e0e497
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/embeddedImagesRemoteError.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Text {
+    text: "<img src='http://127.0.0.1:14453/notexists.png'>"
+}
diff --git a/tests/auto/declarative/qsgtext/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qsgtext/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000000..5ba4d35684
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 200; height: 70;
+
+    property alias horizontalAlignment: text.horizontalAlignment
+    property string text: "اختبا"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 180
+        height: 20
+        color: "green"
+
+        Text {
+            id: text
+            objectName: "text"
+            anchors.fill: parent
+            text: top.text
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtext/data/http/exists.png b/tests/auto/declarative/qsgtext/data/http/exists.png
new file mode 100644
index 0000000000000000000000000000000000000000..399bd0b1d9d920e11f73922a112d5bbfabf7f01e
GIT binary patch
literal 2738
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

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtext/data/lineCount.qml b/tests/auto/declarative/qsgtext/data/lineCount.qml
new file mode 100644
index 0000000000..b672863684
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/lineCount.qml
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Item {
+    width: 200
+    height: 200
+
+    Text {
+        id: myText
+        objectName: "myText"
+        width: 200
+        wrapMode: Text.WordWrap
+        maximumLineCount: undefined
+        text: "Testing that maximumLines, visibleLines, and totalLines works properly in the autotests. The quick brown fox jumped over the lazy anything with the letter 'g'."
+    }
+}
diff --git a/tests/auto/declarative/qsgtext/data/lineHeight.qml b/tests/auto/declarative/qsgtext/data/lineHeight.qml
new file mode 100644
index 0000000000..c1f337aa05
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/lineHeight.qml
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Item {
+    width: 200
+    height: 200
+
+    Text {
+        id: myText
+        objectName: "myText"
+        width: 200
+        wrapMode: Text.WordWrap
+        font.pixelSize: 13
+        text: "Lorem ipsum sit amet, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum."
+    }
+}
diff --git a/tests/auto/declarative/qsgtext/data/qtbug_14734.qml b/tests/auto/declarative/qsgtext/data/qtbug_14734.qml
new file mode 100644
index 0000000000..e71a798421
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/qtbug_14734.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 640
+    height: 480
+
+    Text {
+        text: "í "
+    }
+}
diff --git a/tests/auto/declarative/qsgtext/data/rotated.qml b/tests/auto/declarative/qsgtext/data/rotated.qml
new file mode 100644
index 0000000000..fecf64b249
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/data/rotated.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle {
+    width : 200
+    height : 100
+
+    Text {
+        objectName: "text"
+        x: 20
+        y: 20
+        height : 20
+        width : 80
+        text : "Something"
+        rotation : 30
+        transformOrigin : Item.TopLeft
+    }
+}
+
diff --git a/tests/auto/declarative/qsgtext/qsgtext.pro b/tests/auto/declarative/qsgtext/qsgtext.pro
new file mode 100644
index 0000000000..132cec4cdc
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/qsgtext.pro
@@ -0,0 +1,21 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+QT += network
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgtext.cpp
+
+INCLUDEPATH += ../shared/
+HEADERS += ../shared/testhttpserver.h
+SOURCES += ../shared/testhttpserver.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgtext/tst_qsgtext.cpp b/tests/auto/declarative/qsgtext/tst_qsgtext.cpp
new file mode 100644
index 0000000000..51184885db
--- /dev/null
+++ b/tests/auto/declarative/qsgtext/tst_qsgtext.cpp
@@ -0,0 +1,1432 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QTextDocument>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <private/qsgtext_p.h>
+#include <private/qsgtext_p_p.h>
+#include <private/qdeclarativevaluetype_p.h>
+#include <QFontMetrics>
+#include <QGraphicsSceneMouseEvent>
+#include <qmath.h>
+#include <QSGView>
+#include <private/qapplication_p.h>
+#include <limits.h>
+
+#include "../../../shared/util.h"
+#include "testhttpserver.h"
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_qsgtext : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_qsgtext();
+
+private slots:
+    void text();
+    void width();
+    void wrap();
+    void elide();
+    void textFormat();
+
+    void alignments_data();
+    void alignments();
+
+    void embeddedImages_data();
+    void embeddedImages();
+
+    void lineCount();
+    void lineHeight();
+
+    // ### these tests may be trivial    
+    void horizontalAlignment();
+    void horizontalAlignment_RightToLeft();
+    void verticalAlignment();
+    void font();
+    void style();
+    void color();
+    void smooth();
+
+    // QDeclarativeFontValueType
+    void weight();
+    void underline();
+    void overline();
+    void strikeout();
+    void capitalization();
+    void letterSpacing();
+    void wordSpacing();
+
+    void clickLink();
+
+    void QTBUG_12291();
+    void implicitSize_data();
+    void implicitSize();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+    void qtbug_14734();
+private:
+    QStringList standard;
+    QStringList richText;
+
+    QStringList horizontalAlignmentmentStrings;
+    QStringList verticalAlignmentmentStrings;
+
+    QList<Qt::Alignment> verticalAlignmentments;
+    QList<Qt::Alignment> horizontalAlignmentments;
+
+    QStringList styleStrings;
+    QList<QSGText::TextStyle> styles;
+
+    QStringList colorStrings;
+
+    QDeclarativeEngine engine;
+
+    QSGView *createView(const QString &filename);
+};
+
+tst_qsgtext::tst_qsgtext()
+{
+    standard << "the quick brown fox jumped over the lazy dog"
+            << "the quick brown fox\n jumped over the lazy dog";
+
+    richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
+            << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
+
+    horizontalAlignmentmentStrings << "AlignLeft"
+            << "AlignRight"
+            << "AlignHCenter";
+
+    verticalAlignmentmentStrings << "AlignTop"
+            << "AlignBottom"
+            << "AlignVCenter";
+
+    horizontalAlignmentments << Qt::AlignLeft
+            << Qt::AlignRight
+            << Qt::AlignHCenter;
+
+    verticalAlignmentments << Qt::AlignTop
+            << Qt::AlignBottom
+            << Qt::AlignVCenter;
+
+    styleStrings << "Normal"
+            << "Outline"
+            << "Raised"
+            << "Sunken";
+
+    styles << QSGText::Normal
+            << QSGText::Outline
+            << QSGText::Raised
+            << QSGText::Sunken;
+
+    colorStrings << "aliceblue"
+            << "antiquewhite"
+            << "aqua"
+            << "darkkhaki"
+            << "darkolivegreen"
+            << "dimgray"
+            << "palevioletred"
+            << "lightsteelblue"
+            << "#000000"
+            << "#AAAAAA"
+            << "#FFFFFF"
+            << "#2AC05F";
+    //
+    // need a different test to do alpha channel test
+    // << "#AA0011DD"
+    // << "#00F16B11";
+    //
+}
+
+QSGView *tst_qsgtext::createView(const QString &filename)
+{
+    QSGView *canvas = new QSGView(0);
+
+    canvas->setSource(QUrl::fromLocalFile(filename));
+    return canvas;
+}
+
+void tst_qsgtext::text()
+{
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->text(), QString(""));
+        QVERIFY(textObject->width() == 0);
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->text(), standard.at(i));
+        QVERIFY(textObject->width() > 0);
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QString expected = richText.at(i);
+        QCOMPARE(textObject->text(), expected.replace("\\\"", "\""));
+        QVERIFY(textObject->width() > 0);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::width()
+{
+    // uses Font metrics to find the width for standard and document to find the width for rich
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->width(), 0.);
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QVERIFY(!Qt::mightBeRichText(standard.at(i))); // self-test
+
+        QFont f;
+        QFontMetricsF fm(f);
+        qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
+        metricWidth = qCeil(metricWidth);
+
+        QString componentStr = "import QtQuick 2.0\nText { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->boundingRect().width() > 0);
+        QCOMPARE(textObject->width(), qreal(metricWidth));
+        QVERIFY(textObject->textFormat() == QSGText::AutoText); // setting text doesn't change format
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QVERIFY(Qt::mightBeRichText(richText.at(i))); // self-test
+
+        QTextDocument document;
+        document.setHtml(richText.at(i));
+        document.setDocumentMargin(0);
+
+        int documentWidth = document.idealWidth();
+
+        QString componentStr = "import QtQuick 2.0\nText { text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->width(), qreal(documentWidth));
+        QVERIFY(textObject->textFormat() == QSGText::AutoText); // setting text doesn't change format
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::wrap()
+{
+    int textHeight = 0;
+    // for specified width and wrap set true
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nText { text: \"Hello\"; wrapMode: Text.WordWrap; width: 300 }", QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+        textHeight = textObject->height();
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->wrapMode() == QSGText::WordWrap);
+        QCOMPARE(textObject->width(), 300.);
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->width(), 30.);
+        QVERIFY(textObject->height() > textHeight);
+
+        int oldHeight = textObject->height();
+        textObject->setWidth(100);
+        QVERIFY(textObject->height() < oldHeight);
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->width(), 30.);
+        QVERIFY(textObject->height() > textHeight);
+
+        qreal oldHeight = textObject->height();
+        textObject->setWidth(100);
+        QVERIFY(textObject->height() < oldHeight);
+
+        delete textObject;
+    }
+
+    // richtext again with a fixed height
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nText { wrapMode: Text.WordWrap; width: 30; height: 50; text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->width(), 30.);
+        QVERIFY(textObject->implicitHeight() > textHeight);
+
+        qreal oldHeight = textObject->implicitHeight();
+        textObject->setWidth(100);
+        QVERIFY(textObject->implicitHeight() < oldHeight);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::elide()
+{
+    for (QSGText::TextElideMode m = QSGText::ElideLeft; m<=QSGText::ElideNone; m=QSGText::TextElideMode(int(m)+1)) {
+        const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"};
+        QString elide = "elide: Text." + QString(elidename[int(m)]) + ";";
+
+        // XXX Poor coverage.
+
+        {
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(("import QtQuick 2.0\nText { text: \"\"; "+elide+" width: 100 }").toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE(textObject->elideMode(), m);
+            QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
+        }
+
+        for (int i = 0; i < standard.size(); i++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { "+elide+" width: 100; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE(textObject->elideMode(), m);
+            QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
+        }
+
+        // richtext - does nothing
+        for (int i = 0; i < richText.size(); i++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { "+elide+" width: 100; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE(textObject->elideMode(), m);
+            QCOMPARE(textObject->width(), 100.);
+
+            delete textObject;
+        }
+    }
+}
+
+void tst_qsgtext::textFormat()
+{
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nText { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->textFormat() == QSGText::RichText);
+
+        delete textObject;
+    }
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nText { text: \"<b>Hello</b>\"; textFormat: Text.PlainText }", QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->textFormat() == QSGText::PlainText);
+
+        delete textObject;
+    }
+}
+
+
+void tst_qsgtext::alignments_data()
+{
+    QTest::addColumn<int>("hAlign");
+    QTest::addColumn<int>("vAlign");
+    QTest::addColumn<QString>("expectfile");
+
+    QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << SRCDIR "/data/alignments_lt.png";
+    QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << SRCDIR "/data/alignments_rt.png";
+    QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << SRCDIR "/data/alignments_ct.png";
+
+    QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_lb.png";
+    QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_rb.png";
+    QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_cb.png";
+
+    QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_lc.png";
+    QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_rc.png";
+    QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_cc.png";
+}
+
+
+void tst_qsgtext::alignments()
+{
+    QFETCH(int, hAlign);
+    QFETCH(int, vAlign);
+    QFETCH(QString, expectfile);
+
+#ifdef Q_WS_X11
+    // Font-specific, but not likely platform-specific, so only test on one platform
+    QFont fn;
+    fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*");
+    QApplication::setFont(fn);
+#endif
+
+    QSGView *canvas = createView(SRCDIR "/data/alignments.qml");
+
+    canvas->show();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    QObject *ob = canvas->rootObject();
+    QVERIFY(ob != 0);
+    ob->setProperty("horizontalAlignment",hAlign);
+    ob->setProperty("verticalAlignment",vAlign);
+    QTRY_COMPARE(ob->property("running").toBool(),false);
+    QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32);
+    actual.fill(qRgb(255,255,255));
+    QPainter p(&actual);
+    canvas->render(&p);
+
+    QImage expect(expectfile);
+
+#ifdef Q_WS_X11
+    // Font-specific, but not likely platform-specific, so only test on one platform
+    if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") {
+        QCOMPARE(actual,expect);
+    }
+#endif
+
+    delete canvas;
+}
+
+//the alignment tests may be trivial o.oa
+void tst_qsgtext::horizontalAlignment()
+{
+    //test one align each, and then test if two align fails.
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
+
+            delete textObject;
+        }
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
+
+            delete textObject;
+        }
+    }
+
+}
+
+void tst_qsgtext::horizontalAlignment_RightToLeft()
+{
+    QSGView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
+    QSGText *text = canvas->rootObject()->findChild<QSGText*>("text");
+    QVERIFY(text != 0);
+    canvas->show();
+
+    QSGTextPrivate *textPrivate = QSGTextPrivate::get(text);
+    QVERIFY(textPrivate != 0);
+
+    // implicit alignment should follow the reading direction of RTL text
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
+
+    // explicitly left aligned text
+    text->setHAlign(QSGText::AlignLeft);
+    QCOMPARE(text->hAlign(), QSGText::AlignLeft);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
+
+    // explicitly right aligned text
+    text->setHAlign(QSGText::AlignRight);
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
+
+    // change to rich text
+    QString textString = text->text();
+    text->setText(QString("<i>") + textString + QString("</i>"));
+    text->setTextFormat(QSGText::RichText);
+    text->resetHAlign();
+
+    // implicitly aligned rich text should follow the reading direction of text
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
+
+    // explicitly left aligned rich text
+    text->setHAlign(QSGText::AlignLeft);
+    QCOMPARE(text->hAlign(), QSGText::AlignLeft);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignRight);
+
+    // explicitly right aligned rich text
+    text->setHAlign(QSGText::AlignRight);
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
+
+    text->setText(textString);
+    text->setTextFormat(QSGText::PlainText);
+
+    // explicitly center aligned
+    text->setHAlign(QSGText::AlignHCenter);
+    QCOMPARE(text->hAlign(), QSGText::AlignHCenter);
+    QCOMPARE(text->effectiveHAlign(), text->hAlign());
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().right() > canvas->width()/2);
+
+    // reseted alignment should go back to following the text reading direction
+    text->resetHAlign();
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
+
+    // mirror the text item
+    QSGItemPrivate::get(text)->setLayoutMirror(true);
+
+    // mirrored implicit alignment should continue to follow the reading direction of the text
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), QSGText::AlignRight);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
+
+    // mirrored explicitly right aligned behaves as left aligned
+    text->setHAlign(QSGText::AlignRight);
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+    QCOMPARE(text->effectiveHAlign(), QSGText::AlignLeft);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
+
+    // mirrored explicitly left aligned behaves as right aligned
+    text->setHAlign(QSGText::AlignLeft);
+    QCOMPARE(text->hAlign(), QSGText::AlignLeft);
+    QCOMPARE(text->effectiveHAlign(), QSGText::AlignRight);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
+
+    // disable mirroring
+    QSGItemPrivate::get(text)->setLayoutMirror(false);
+    text->resetHAlign();
+
+    // English text should be implicitly left aligned
+    text->setText("Hello world!");
+    QCOMPARE(text->hAlign(), QSGText::AlignLeft);
+    QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // empty text with implicit alignment follows the system locale-based
+    // keyboard input direction from QApplication::keyboardInputDirection
+    text->setText("");
+    QCOMPARE(text->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGText::AlignLeft : QSGText::AlignRight);
+    text->setHAlign(QSGText::AlignRight);
+    QCOMPARE(text->hAlign(), QSGText::AlignRight);
+#endif
+
+    delete canvas;
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // alignment of Text with no text set to it
+    QString componentStr = "import QtQuick 2.0\nText {}";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+    QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGText::AlignLeft : QSGText::AlignRight);
+    delete textObject;
+#endif
+}
+
+void tst_qsgtext::verticalAlignment()
+{
+    //test one align each, and then test if two align fails.
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QVERIFY(textObject != 0);
+            QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
+
+            delete textObject;
+        }
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QVERIFY(textObject != 0);
+            QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
+
+            delete textObject;
+        }
+    }
+
+}
+
+void tst_qsgtext::font()
+{
+    //test size, then bold, then italic, then family
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.pointSize: 40; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().pointSize(), 40);
+        QCOMPARE(textObject->font().bold(), false);
+        QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
+    }
+
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.pixelSize: 40; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().pixelSize(), 40);
+        QCOMPARE(textObject->font().bold(), false);
+        QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { font.bold: true; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().bold(), true);
+        QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { font.italic: true; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().italic(), true);
+        QCOMPARE(textObject->font().bold(), false);
+
+        delete textObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { font.family: \"Helvetica\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().family(), QString("Helvetica"));
+        QCOMPARE(textObject->font().bold(), false);
+        QCOMPARE(textObject->font().italic(), false);
+
+        delete textObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { font.family: \"\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->font().family(), QString(""));
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::style()
+{
+    //test style
+    for (int i = 0; i < styles.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { style: \"" + styleStrings.at(i) + "\"; styleColor: \"white\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE((int)textObject->style(), (int)styles.at(i));
+        QCOMPARE(textObject->styleColor(), QColor("white"));
+
+        delete textObject;
+    }
+    QString componentStr = "import QtQuick 2.0\nText { text: \"Hello World\" }";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+    QRectF brPre = textObject->boundingRect();
+    textObject->setStyle(QSGText::Outline);
+    QRectF brPost = textObject->boundingRect();
+
+    QVERIFY(brPre.width() < brPost.width());
+    QVERIFY(brPre.height() < brPost.height());
+
+    delete textObject;
+}
+
+void tst_qsgtext::color()
+{
+    //test style
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
+        QCOMPARE(textObject->styleColor(), QColor());
+
+        delete textObject;
+    }
+
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nText { styleColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
+        // default color to black?
+        QCOMPARE(textObject->color(), QColor("black"));
+
+        delete textObject;
+    }
+    
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        for (int j = 0; j < colorStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nText { color: \"" + colorStrings.at(i) + "\"; styleColor: \"" + colorStrings.at(j) + "\"; text: \"Hello World\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+            QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
+            QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
+
+            delete textObject;
+        }
+    }
+    {
+        QString colorStr = "#AA001234";
+        QColor testColor("#001234");
+        testColor.setAlpha(170);
+
+        QString componentStr = "import QtQuick 2.0\nText { color: \"" + colorStr + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QCOMPARE(textObject->color(), testColor);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::smooth()
+{
+    for (int i = 0; i < standard.size(); i++)
+    {
+        {
+            QString componentStr = "import QtQuick 2.0\nText { smooth: true; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+            QCOMPARE(textObject->smooth(), true);
+
+            delete textObject;
+        }
+        {
+            QString componentStr = "import QtQuick 2.0\nText { text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+            QCOMPARE(textObject->smooth(), false);
+
+            delete textObject;
+        }
+    }
+    for (int i = 0; i < richText.size(); i++)
+    {
+        {
+            QString componentStr = "import QtQuick 2.0\nText { smooth: true; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+            QCOMPARE(textObject->smooth(), true);
+
+            delete textObject;
+        }
+        {
+            QString componentStr = "import QtQuick 2.0\nText { text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent textComponent(&engine);
+            textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+            QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+            QCOMPARE(textObject->smooth(), false);
+
+            delete textObject;
+        }
+    }
+}
+
+void tst_qsgtext::weight()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::underline()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().underline(), false);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.underline: true; text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().underline(), true);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::overline()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().overline(), false);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.overline: true; text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().overline(), true);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::strikeout()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().strikeOut(), false);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { font.strikeout: true; text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().strikeOut(), true);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::capitalization()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::letterSpacing()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().letterSpacing(), 0.0);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().letterSpacing(), -2.);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().letterSpacing(), 3.);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::wordSpacing()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().wordSpacing(), 0.0);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().wordSpacing(), -50.);
+
+        delete textObject;
+    }
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QCOMPARE(textObject->font().wordSpacing(), 200.);
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::QTBUG_12291()
+{
+    QSGView *canvas = createView(SRCDIR "/data/rotated.qml");
+
+    canvas->show();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    QObject *ob = canvas->rootObject();
+    QVERIFY(ob != 0);
+
+    QSGText *text = ob->findChild<QSGText*>("text");
+    QVERIFY(text);
+    QVERIFY(text->boundingRect().isValid());
+
+    delete canvas;
+}
+
+class EventSender : public QSGItem
+{
+public:
+    void sendEvent(QEvent *event) {
+        if (event->type() == QEvent::GraphicsSceneMousePress)
+            mousePressEvent(static_cast<QGraphicsSceneMouseEvent*>(event));
+        else if (event->type() == QEvent::GraphicsSceneMouseRelease)
+            mouseReleaseEvent(static_cast<QGraphicsSceneMouseEvent*>(event));
+        else
+            qWarning() << "Trying to send unsupported event type";
+    }
+};
+
+class LinkTest : public QObject
+{
+    Q_OBJECT
+public:
+    LinkTest() {}
+
+    QString link;
+
+public slots:
+    void linkClicked(QString l) { link = l; }
+};
+
+void tst_qsgtext::clickLink()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nText { text: \"<a href=\\\"http://qt.nokia.com\\\">Hello world!</a>\" }";
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+        QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+
+        LinkTest test;
+        QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString)));
+
+        {
+            QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress);
+            me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
+            me.setButton(Qt::LeftButton);
+            static_cast<EventSender*>(static_cast<QSGItem*>(textObject))->sendEvent(&me);
+        }
+
+        {
+            QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease);
+            me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
+            me.setButton(Qt::LeftButton);
+            static_cast<EventSender*>(static_cast<QSGItem*>(textObject))->sendEvent(&me);
+        }
+
+        QCOMPARE(test.link, QLatin1String("http://qt.nokia.com"));
+
+        delete textObject;
+    }
+}
+
+void tst_qsgtext::embeddedImages_data()
+{
+    QTest::addColumn<QUrl>("qmlfile");
+    QTest::addColumn<QString>("error");
+    QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocal.qml") << "";
+    QTest::newRow("local-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml")
+        << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml").toString()+":3:1: QML Text: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/http/notexists.png").toString();
+    QTest::newRow("remote") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemote.qml") << "";
+    QTest::newRow("remote-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml")
+        << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml").toString()+":3:1: QML Text: Error downloading http://127.0.0.1:14453/notexists.png - server replied: Not found";
+}
+
+void tst_qsgtext::embeddedImages()
+{
+    // Tests QTBUG-9900
+
+    QFETCH(QUrl, qmlfile);
+    QFETCH(QString, error);
+
+    TestHTTPServer server(14453);
+    server.serveDirectory(SRCDIR "/data/http");
+
+    if (!error.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, error.toLatin1());
+    
+    QDeclarativeComponent textComponent(&engine, qmlfile);
+    QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+    QVERIFY(textObject != 0);
+
+    QTRY_COMPARE(textObject->resourcesLoading(), 0);
+
+    QPixmap pm(SRCDIR "/data/http/exists.png");
+    if (error.isEmpty()) {
+        QCOMPARE(textObject->width(), double(pm.width()));
+        QCOMPARE(textObject->height(), double(pm.height()));
+    } else {
+        QVERIFY(16 != pm.width()); // check test is effective
+        QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon
+        QCOMPARE(textObject->height(), 16.0);
+    }
+
+    delete textObject;
+}
+
+void tst_qsgtext::lineCount()
+{
+    QSGView *canvas = createView(SRCDIR "/data/lineCount.qml");
+
+    QSGText *myText = canvas->rootObject()->findChild<QSGText*>("myText");
+    QVERIFY(myText != 0);
+
+    QVERIFY(myText->lineCount() > 1);
+    QVERIFY(!myText->truncated());
+    QCOMPARE(myText->maximumLineCount(), INT_MAX);
+
+    myText->setMaximumLineCount(2);
+    QCOMPARE(myText->lineCount(), 2);
+    QCOMPARE(myText->truncated(), true);
+    QCOMPARE(myText->maximumLineCount(), 2);
+
+    myText->resetMaximumLineCount();
+    QCOMPARE(myText->maximumLineCount(), INT_MAX);
+    QCOMPARE(myText->truncated(), false);
+
+    myText->setElideMode(QSGText::ElideRight);
+    myText->setMaximumLineCount(2);
+    QCOMPARE(myText->lineCount(), 2);
+    QCOMPARE(myText->truncated(), true);
+    QCOMPARE(myText->maximumLineCount(), 2);
+
+    delete canvas;
+}
+
+void tst_qsgtext::lineHeight()
+{
+    QSGView *canvas = createView(SRCDIR "/data/lineHeight.qml");
+
+    QSGText *myText = canvas->rootObject()->findChild<QSGText*>("myText");
+    QVERIFY(myText != 0);
+
+    QVERIFY(myText->lineHeight() == 1);
+    QVERIFY(myText->lineHeightMode() == QSGText::ProportionalHeight);
+
+    qreal h = myText->height();
+    myText->setLineHeight(1.5);
+    QVERIFY(myText->height() == h * 1.5);
+
+    myText->setLineHeightMode(QSGText::FixedHeight);
+    myText->setLineHeight(20);
+    QCOMPARE(myText->height(), myText->lineCount() * 20.0);
+
+    myText->setText("Lorem ipsum sit <b>amet</b>, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum.");
+    myText->setLineHeightMode(QSGText::ProportionalHeight);
+    myText->setLineHeight(1.0);
+
+    qreal h2 = myText->height();
+    myText->setLineHeight(2.0);
+    QEXPECT_FAIL("", "QTBUG-17325", Continue);
+    QVERIFY(myText->height() == h2 * 2.0);
+
+    myText->setLineHeightMode(QSGText::FixedHeight);
+    myText->setLineHeight(10);
+    QEXPECT_FAIL("", "QTBUG-17325", Continue);
+    QCOMPARE(myText->height(), myText->lineCount() * 10.0);
+
+    delete canvas;
+}
+
+void tst_qsgtext::implicitSize_data()
+{
+    QTest::addColumn<QString>("text");
+    QTest::addColumn<QString>("wrap");
+    QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap";
+    QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.NoWrap";
+    QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap";
+    QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.Wrap";
+}
+
+void tst_qsgtext::implicitSize()
+{
+    QFETCH(QString, text);
+    QFETCH(QString, wrap);
+    QString componentStr = "import QtQuick 2.0\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGText *textObject = qobject_cast<QSGText*>(textComponent.create());
+
+    QVERIFY(textObject->width() < textObject->implicitWidth());
+    QVERIFY(textObject->height() == textObject->implicitHeight());
+
+    textObject->resetWidth();
+    QVERIFY(textObject->width() == textObject->implicitWidth());
+    QVERIFY(textObject->height() == textObject->implicitHeight());
+
+    delete textObject;
+}
+
+void tst_qsgtext::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 2.0; Text { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_qsgtext::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("maximumLineCount") << "maximumLineCount: 4"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n";
+
+    QTest::newRow("lineHeight") << "lineHeight: 2"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n";
+
+    QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n";
+
+    QTest::newRow("lineCount") << "property int foo: lineCount"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
+        << "";
+
+    QTest::newRow("truncated") << "property bool foo: truncated"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: truncated"
+        << "";
+}
+
+void tst_qsgtext::qtbug_14734()
+{
+    QSGView *canvas = createView(SRCDIR "/data/qtbug_14734.qml");
+    QVERIFY(canvas);
+
+    canvas->show();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+    delete canvas;
+}
+
+QTEST_MAIN(tst_qsgtext)
+
+#include "tst_qsgtext.moc"
diff --git a/tests/auto/declarative/qsgtextedit/data/CursorRect.qml b/tests/auto/declarative/qsgtextedit/data/CursorRect.qml
new file mode 100644
index 0000000000..cae3e63b72
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/CursorRect.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    objectName: "myEdit"
+    width: 50
+    text: "This is a long piece of text"
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/alignments.qml b/tests/auto/declarative/qsgtextedit/data/alignments.qml
new file mode 100644
index 0000000000..7d365da8cb
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/alignments.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 70; height: 70;
+
+    property alias horizontalAlignment: t.horizontalAlignment
+    property alias verticalAlignment: t.verticalAlignment
+    property alias wrapMode: t.wrapMode
+    property alias running: timer.running
+    property string txt: "Test"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 40
+        height: 40
+        color: "green"
+
+        TextEdit {
+            id: t
+
+            anchors.fill: parent
+            horizontalAlignment: TextEdit.AlignRight
+            verticalAlignment: TextEdit.AlignBottom
+            wrapMode: TextEdit.WordWrap
+            text: top.txt
+        }
+        Timer {
+            id: timer
+
+            interval: 1
+            running: true
+            repeat: true
+            onTriggered: {
+                top.txt = top.txt + "<br>more " + top.txt.length;
+                if (top.txt.length > 50)
+                    running = false
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_cb.png b/tests/auto/declarative/qsgtextedit/data/alignments_cb.png
new file mode 100644
index 0000000000000000000000000000000000000000..99de2192de7fd86a09fa99164b5a86af72038c04
GIT binary patch
literal 496
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442+XKT^vI)8sE-(-NmfP(^`7-`@5U!<@FqoGIDy4`58S~ETZpd
zBW$?bIoV6ILnv7%`<TS(3a^zVuNgk_{yC+0J^1~P6_XA{ditilS|a*s!Gc50{;&1w
z-rZ}k(L2fXN@Zd=2Y2kGZ(m#fdhfaEvUBBUSFdZ=(p+R3b)KFT<<(reOlD%*BKKAQ
z<jVPZ-<!`h&Ce2^c132-MIFh2=auRF@8on2SXX@Xe=sRlVXuVy%f`q{ikylKQZY`w
zOZt^B=fpgEv1`S#i>+UKjo+klUeAx|7YIvzuui9t(OyFP))SS5)<sWrBpb4QE~g$U
z=8v2H?x1SqgWLP3XB6Z%%$nskUnR!<M@A|CStS{ho$Ni+A1yd$>u~0`W--6KvU<Vy
z1jgwpjI~S4uFL?cd?Uqi_g!M=UY&)%TMj0#yS;d6)6VAh&Pbl1vyPLi6`FtUsNT@v
zy{VxuX!gO$_iS4ldA0-^1I<qSt9AY3JI3hN6^^T`Z#Yb@KA>>e=Z<Z}f&X)pK<1;O
dMs}}X>{nl3=T$wrsR0;g44$rjF6*2UngBwc*VO<3

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_cc.png b/tests/auto/declarative/qsgtextedit/data/alignments_cc.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb8525118018bd1c907edf1467c86956bee0abbc
GIT binary patch
literal 556
zcmV+{0@MA8P)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01iz601hSrz}(tp0005cNkl<ZXo2mT?QX>&2!?gpeed0syB|#q
ziuOpw7CN6SjUR;dEwpkHVoE8zi?63|K%Xti16z^@UMT5X(N~O-PM<m+qWV9MQQ%W#
zJcwqLn&i->lxP_9^tdVtTl+3mshBwg<g0F=mPd)+ZXU15x6E2eG})@e%cv*b!l(5V
z|NdNxzwOt3HR(r?N-vC(JxQ2#U`!Ged`y4D!KNVVU}k)vjYgDEUO|KfHa_=rZZO93
z>Y)Y$yO`3ZEeR~;n!8N{Fq=!rs)v0pJ;Rpd0UMIg|60f~BkAMHFcTkfuqntom>D0e
zVJ=E2uV5z+O3QJ#BKwjXs|U!9aYdV+B(Rig?luij+Eh~^yL#}zmgIrke=jvbIY4V`
z7<-aXuE?=kJycF4SgIb-cO}70^#HZn&sg>F(Q<%YJ$PVC@_@agwl^5Yo+Qi`5Vos_
zOUy+H>@Rd4GadI_1$T*ufn9V$Ex}Ut&@`5_s|OG4?i3H$IBG)(r2VUE+mrgSBB?2(
z*Uop&bxFLFmA0YLp0&z;@WEg1*_(QoX!GN72UP>!;Pck)IJ__M&Tl&Rxz1}-lT;;M
uZ?|bc<9w{lXxrzK2eu>+Y)Kw?p`<@wJNAS<)`9B)0000<MNUMnLSTaPas2E6

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_ct.png b/tests/auto/declarative/qsgtextedit/data/alignments_ct.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddca549c82df9ffdabad0e1aa8b2ffed7bfa1a25
GIT binary patch
literal 533
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442(NGT^vI)8sE;inRi5i$JP1j|95YvUuL%wtTvd@GxuYqLxRqc
zqdI<bzW=Kbi+?|l!CuXi84dAI`QrPjY=7Qmn_oZV4~btm?*5XgWOn&MDb+nG2@&TP
zNV8tk2z3l`%yNGsP`-BKPo0I?_NS-a7BP2wnc?0u_3R`A1?Iq$jmm$&Y$|_gJ41!{
z#N?K%j4hr_hb2x=x9Cz+vgX>p=@75`lnK)^?A_Csn)=;O?D>1snT@S#<C5NJp<Oo_
zb_qH^G;U4hmoo5_nxM$}_I6XBgy-~WiDG(%BEBwVB6+E){Mms{QHv@nCsg(Edw=rZ
zX;{s0SJL>_50!;Cimu*U#T+z$jpva~?7Tqx@BG^v!kWptbzR~UPp7Pf%BIyP*cK{i
zRy$N{a3yVG-|)2V(580p^Nc#x7Z`NCv?>y&xY%qx_gDU6@#!gIhcXtK%_}}vE&s*G
zKgZ7Nxf9!_l{$KVPC4o4?om*lvao1RnAPmCW&2gS&zw58`@POr_3+rf)2%BGsjaMM
zJ9lrDb2k5Z#n)8{4;$Z4^1Rg0@kUX=o_TrT7u9>qwI09ouF3vZ;NrOW6FXDI)hV9$
Sb=CkQmci52&t;ucLK6V0vEAVS

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_lb.png b/tests/auto/declarative/qsgtextedit/data/alignments_lb.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b50a81f3d4591a90ee76782234738242d99e480
GIT binary patch
literal 496
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442+XKT^vI)8sE-(op)G)r#10b_4_v`Z}xk16nJJQr|tf<e3jCJ
z0Kc9yfmdR@JY9;;eO))F_^tlZE2qsGJ_=jcy!XGjE+Wt~H9TngOtZ|Xt3TftS!H{=
zxF%EIVcvu%jJ2MZyEZj%QYp0U3_P;i^~#~z&~q;XZ-1TBHhF1wVW_j_QtP?P?j=3B
zP^j}jZeC^Fm!*+mvu9M#SeN<g*R6{s3gHjsY#eS^{0!gsY@hQ_#hj)5XC|#uS<({u
zT<+GSxNjF0iWl-s&-i87(%XA@!={$s=I^38Vk9q|5)!@8ym4u6v{0L_x$IoF2XdEV
zix%!|x0qhS;VEYk|55J1-o~2(vc{7N-rqbhqxywfV&VbY1Y1$=-0uvP@6!+4?&(<~
z@a`b9;z{PTzFVQqeUhF6#sX@056i95N&K<oXmZ}|)hj3M?rk@B+vs7+&HOG=YLDX%
zcK#L>{uOdt#eXa*=g(ARt`*@-ey7MerRZuo{{+hptDc?goIE?&b&Sra-f3okbYD{r
g=o&Qi!@;xu%*^Y&bKV6!2gVtLr>mdKI;Vst08QW2{{R30

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_lc.png b/tests/auto/declarative/qsgtextedit/data/alignments_lc.png
new file mode 100644
index 0000000000000000000000000000000000000000..f041b868f8347253aecfe9923a4d2604e01d2d85
GIT binary patch
literal 535
zcmV+y0_gpTP)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01iz601hSrz}(tp0005HNkl<ZXo2mT+pfeQ2t{>r{`>6ta_6Cm
zp<Y^1tkSSDX|yuNEmV2HhY;Mm_^e)lJSIs4CP@P?l=R24_TJO(o)>`cSeEyUf3b{3
z;CZP?bX^F6x-oW-=VQV~zojG;BZq+ae9}<@UZTs5?dRhyGAfA%TM~GYhXZffUe3er
zrEmE#m`(U+gwhMWw1FfD&$n6<<fr5x;>fxn?~$41jmdO*3Fjw>FqgHj=eaiMLLhs%
z0S%*&)HW;$S;!Sfiw4MSB;aKab}y~LBxzu&B-GE00ai=8eZ$AHhXb6S$nGDUE!(GM
z*;iPdJrs>Gq;03{A?fyF*@Fg5k_P6Vco*Q@Kxv52Hj;3DGr(rqLo!Jh8)OftPu0ch
z>;dw*-yYe+ttAJ`9yDN*G_cK8TWj#yMiRslh%K{+F}l2j?B^=mOxv}ooVvh6!ze1Q
z?qY-Np=dmSWe*y#>J$wuy=t9vq$Vt><?Ehsv81AmT8&>LY)N@}E3HkVg=~p^<HnB{
z^7VX6v?B6YK~k01xZjh?5T^&;^`c|(tDv?~NlD<<MvDg2&&L}PZFVndz$9tFBx&G<
Zl78Ru_Jnvz8XN!s002ovPDHLkV1foW_zwU8

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_lt.png b/tests/auto/declarative/qsgtextedit/data/alignments_lt.png
new file mode 100644
index 0000000000000000000000000000000000000000..c75e0d158e2e034460e8e9a9e1ac3e89304f9da8
GIT binary patch
literal 514
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442(-XT^vI)8sE-1oyV-m<GS!w{r7LDUpA#3sWzC=pl-)~q#?D?
zP(uBhW%|6M*Wa;zSUgE(0V?|7;CWvq`**hZ+Qq%U75^~(`k^6dVt>9tLUm8df@uHc
zlJZA1L>(_U+VmYzm=ksKORQ7zpRDXO?u6b+E8XAp`gl9F^RT?F(s}8xUpxI9(C~r=
z6@%Zmbvgg&z4Vm1soqqWl2(~+=p5*DXVE{a*txUjZ#yU;bJbb8<V;hrbo|$bXE_%c
zX7aK}*?KsrdM2z^xl(+LWw+|xz6%#$9c<p=`t6^>wm0S8o7QjGU8NzF>~-7os`Dqy
zt}uR~08gQa`5&be-Yqb3eJ<hI;jU(}rpjXuPocxthFz-_%fk5|tp9s%g<PJlX2w?q
z#;7SS9}Z}|t;t&ZcmK@mo+sVi?#wIrux9Hy%k}AXwof!-rC)kZGuru4=eKpyhdn&^
zfAv+qE!nijrQT0Sa$58DKYClm!|(Ln?#(dPURle&?&c!Lw><tuE>#bnHol+aHR-@L
z`B%qgDBNw``S69xy=5AY?|Rl`eobgv!26kfyTH{cyv~;kfw9Qo>FVdQ&MBb@0N4`c
A1^@s6

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_rb.png b/tests/auto/declarative/qsgtextedit/data/alignments_rb.png
new file mode 100644
index 0000000000000000000000000000000000000000..b06a5da715257327dcdd80f24b9b1be21fe4efe9
GIT binary patch
literal 505
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442*L;T^vI)8sE;kop(fm$7SKG`uAT>zho9-D&}O1dUL{kwJ4){
zVp2+)zFo_Me}eC8cP;*I_qAQ%Qli`jgT3$Hdge_$UlHv2Xqn2SnKqf7H%<oa_-d2#
zskEBuxuK`j1ih7!#>YCQZCP+!R{v3o&`OizyKdd_@jP$$e6xu9bdwf=6aOxk@SC2N
zUZ?OqK-jc+>)*91n?6)6KHFe(e$DJz)fX7@AO4&_b=5Ba9|qGdac@@f6q@6_dUB_M
zXTPm*j(A~6`-xwHtyg<5&p9D<s(gw!$7-VjZSR-^{B6bZ$2^y-E{rNVdohjSlthsQ
z?|IuB`%2g+FKIkIe>zuy*#zFZYbvZ2vKPF0sBqhMLid?MCGQn+>pm~}{Ow29IuZS<
zhYvGLWDFWTzJHLgJaVU*&1VwZlDw@;6nAy-J6t=ktMS4ExfvYA{7<G_5!m~|z_812
z)$<9@<z^j}Ib)k~Kqb@RQke9?+54&s=KAuOWcB2He-P%ib4k43h8==}DZATMpX_8W
rF|z61$<BLYf3QiyBy{w_$#egjitC&UxgYcbBagw;)z4*}Q$iB}j~?F?

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_rc.png b/tests/auto/declarative/qsgtextedit/data/alignments_rc.png
new file mode 100644
index 0000000000000000000000000000000000000000..e468857cd0e192a5c78b28c00ff30d009afdfee1
GIT binary patch
literal 559
zcmV+~0?_@5P)<h;3K|Lk000e1NJLTq002e+002e^0ssI2{!De#00003b3#c}2nYz<
z;ZNWI000SaNLh0L01iz601hSrz}(tp0005fNkl<ZXo2mT>yCsV425B{?>%Rqoc&>z
zRBlp4Xx)C95H6MRNQIizhY;Mm_}YB~^D#*pFi9GCp``C+|Kz==&F2mezxZ78p7D<?
z<H)*IDiW72gg}=uHjk1eZ0Ea_xMJiG5KHbtZC)jMyRkmzZ;_pnsIw)G7a4H8)!V}Y
z{{6Y+f66cP(}a(b9q%E;O9J}}*^)4F(d<neSreomnOR=B%>%21a|t5MW%c$vZG#G%
zqlar%NBLn)`LHBpE>|2a8X&XjgBLy6xwHq9qyb5iP~Rjt2$OW#)4}ac99a{jADLNR
znazw<!ns6t;NWc8KP}7tkLA$=_{P{9Jz!qAkTkoo=s^P}NdvpTmnb+_K!yZ;FR=ir
z;M~JOcJz=;(#MQdLiTf&Cr#_^+1y#YXvf3VXxpFzk<r7YWfO}YG+>f6AoZwCDxx>>
z1|SuT2M`*f2PVRzhvbr25$$;B7)52N`;Zqs6pcAp^q>LDPSJp*qt-b`(!7%Ny#5(v
zNh->yrR~+YD=E)drRiogH!ZR6eDDLgc@y3xn&f!gL6T_K`Mhst7DiS(Ui+qFKC7Ut
x$;9z$qeTO{&PUIfHanLzV3IUok~Hu_Nxw#4_JDxB@nQe~002ovPDHLkV1il>0TuuN

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/alignments_rt.png b/tests/auto/declarative/qsgtextedit/data/alignments_rt.png
new file mode 100644
index 0000000000000000000000000000000000000000..576715ffce82fd054908168ca109cf7c534ae43e
GIT binary patch
literal 539
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*x3
z82EgFSdH<(om;6442=6cT^vI)8sE;inRi5i$93VW`txt6UuKs&A}8aqAy~dw$$;-s
zl34nh;&Xet*WYE1==Yk`fQk-qtJY55^R|C)rcCXf_7ALI-Y+&`-F3CpMnYA_$Y4$S
z1>L6yH9{Rj9J1V>d{8XeS*pJ<oB#Z@XlAoOqqiM`H?=sKjrL63^g-vPzy99o-xf?#
zIS?mwBLBm*7H$2tc1Hq31aAiJnA)0|*CBLC{nmGXjV-@kTAMtWV!I{Ead%e!w3eik
zq0y`PG-{4rc;m>V<;gThWnryHK!V!KD@F&tDE2MtI?;D%t<IV>*C`Y10%I&ZY>)3&
z{V8uV&$i)R&)%EN*OqcemP(wJQvuq%;diwrTP9<m@Z$HXLLFQlx*`?n{E_O(YdVCw
z=4YNMiFx-uE$HJKak+C*zxkLqoRRah-JS7GfiY@|%ZEc6hP$%X{=K~-@!^zd3+p8G
zY_iuDpL@O2V9!mB*3K^}&NJuy$iBQc;bEoZzn9$4X1vUanE7v#j?s0odzY(M+V6N(
zGRM#5Sd!;oTY;$6d}~d8S|5KjILZB9b*c)Z+s$V6eQZq=zbf8auJ!n(^Pg*P4!Sr>
bKNnv#@#+ML9m?v!=w<M9^>bP0l+XkKm%{97

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextedit/data/cursorTest.qml b/tests/auto/declarative/qsgtextedit/data/cursorTest.qml
new file mode 100644
index 0000000000..e734fc141c
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/cursorTest.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    TextEdit {  text: "Hello world!"; id: textEditObject; objectName: "textEditObject"
+        resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance" } } ] 
+        cursorDelegate: cursor
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/cursorVisible.qml b/tests/auto/declarative/qsgtextedit/data/cursorVisible.qml
new file mode 100644
index 0000000000..49e9386947
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/cursorVisible.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Item {
+    width: 100
+    height: 20
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/geometrySignals.qml b/tests/auto/declarative/qsgtextedit/data/geometrySignals.qml
new file mode 100644
index 0000000000..3dbe61c74b
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/geometrySignals.qml
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Item {
+    width: 400; height: 500;
+    property int bindingWidth: text.width
+    property int bindingHeight: text.height
+
+    TextInput {
+        id: text
+        anchors.fill: parent
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qsgtextedit/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000000..74592fed7f
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 200; height: 70;
+
+    property alias horizontalAlignment: text.horizontalAlignment
+    property string text: "اختبا"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 200
+        height: 20
+        color: "green"
+
+        TextEdit {
+            id: text
+            objectName: "text"
+            anchors.fill: parent
+            text: top.text
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/ErrItem.qml b/tests/auto/declarative/qsgtextedit/data/http/ErrItem.qml
new file mode 100644
index 0000000000..68c0e0c093
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/ErrItem.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+Item{
+    Fungus{
+        palatable: false;
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/NormItem.qml b/tests/auto/declarative/qsgtextedit/data/http/NormItem.qml
new file mode 100644
index 0000000000..2e4c1ed440
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/NormItem.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Item {
+    objectName: "delegateOkay"
+    Rectangle { }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTest.qml b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTest.qml
new file mode 100644
index 0000000000..be4526e22b
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTest.qml
@@ -0,0 +1,22 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    resources: [ 
+        Component { id:cursorFail; FailItem { objectName: "delegateFail" } },
+        Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } },
+        Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } },
+        Component { id:cursorErr; ErrItem { objectName: "delegateErrorA" } }
+    ] 
+    TextEdit {
+        cursorDelegate: cursorFail
+    }
+    TextEdit {
+        cursorDelegate: cursorWait
+    }
+    TextEdit {
+        cursorDelegate: cursorNorm
+    }
+    TextEdit {
+        cursorDelegate: cursorErr
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail1.qml b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail1.qml
new file mode 100644
index 0000000000..1d7763f913
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail1.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    resources: [ 
+        Component { id:cursorFail; FailItem { objectName: "delegateFail" } },
+        Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } },
+        Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } }
+    ] 
+    TextEdit {
+        cursorDelegate: cursorFail
+    }
+    TextEdit {
+        cursorDelegate: cursorWait
+    }
+    TextEdit {
+        cursorDelegate: cursorNorm
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail2.qml b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail2.qml
new file mode 100644
index 0000000000..c82ec02e68
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestFail2.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    resources: [ 
+        Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } },
+        Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } },
+        Component { id:cursorErr; ErrItem { objectName: "delegateErrorA" } }
+    ] 
+    TextEdit {
+        cursorDelegate: cursorWait
+    }
+    TextEdit {
+        cursorDelegate: cursorNorm
+    }
+    TextEdit {
+        cursorDelegate: cursorErr
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestPass.qml b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestPass.qml
new file mode 100644
index 0000000000..96d582c95d
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/cursorHttpTestPass.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    resources: [ 
+        Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } },
+        Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } }
+    ] 
+    TextEdit {
+        cursorDelegate: cursorWait
+        text: "Hello"
+    }
+    TextEdit {
+        objectName: "textEditObject"
+        cursorDelegate: cursorNorm
+        focus: true;
+        text: "Hello"
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/http/qmldir b/tests/auto/declarative/qsgtextedit/data/http/qmldir
new file mode 100644
index 0000000000..886e6ffec0
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/http/qmldir
@@ -0,0 +1,4 @@
+ErrItem ErrItem.qml
+NormItem NormItem.qml
+FailItem FailItem.qml
+WaitItem WaitItem.qml
diff --git a/tests/auto/declarative/qsgtextedit/data/httpfail/FailItem.qml b/tests/auto/declarative/qsgtextedit/data/httpfail/FailItem.qml
new file mode 100644
index 0000000000..8161843479
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/httpfail/FailItem.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Item {
+    Rectangle { }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/httpslow/WaitItem.qml b/tests/auto/declarative/qsgtextedit/data/httpslow/WaitItem.qml
new file mode 100644
index 0000000000..8161843479
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/httpslow/WaitItem.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Item {
+    Rectangle { }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/inputContext.qml b/tests/auto/declarative/qsgtextedit/data/inputContext.qml
new file mode 100644
index 0000000000..a37c77e3bf
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/inputContext.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    width: 200
+    text: "supercalifra"
+    focus: true
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/inputMethodEvent.qml b/tests/auto/declarative/qsgtextedit/data/inputMethodEvent.qml
new file mode 100644
index 0000000000..e3f629ce3e
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/inputMethodEvent.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/inputmethodhints.qml b/tests/auto/declarative/qsgtextedit/data/inputmethodhints.qml
new file mode 100644
index 0000000000..dec3b978e7
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/inputmethodhints.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+TextEdit {  
+    text: "Hello world!"
+    inputMethodHints: Qt.ImhNoPredictiveText
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselection_default.qml b/tests/auto/declarative/qsgtextedit/data/mouseselection_default.qml
new file mode 100644
index 0000000000..ac32f4ced7
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselection_default.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: false
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselection_false.qml b/tests/auto/declarative/qsgtextedit/data/mouseselection_false.qml
new file mode 100644
index 0000000000..ac32f4ced7
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselection_false.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: false
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselection_false_words.qml b/tests/auto/declarative/qsgtextedit/data/mouseselection_false_words.qml
new file mode 100644
index 0000000000..ac32f4ced7
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselection_false_words.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: false
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselection_true.qml b/tests/auto/declarative/qsgtextedit/data/mouseselection_true.qml
new file mode 100644
index 0000000000..7c7cb0b6fc
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselection_true.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselection_true_words.qml b/tests/auto/declarative/qsgtextedit/data/mouseselection_true_words.qml
new file mode 100644
index 0000000000..7c7cb0b6fc
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselection_true_words.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_characters.qml
new file mode 100644
index 0000000000..c1fe42fd57
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_characters.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+    mouseSelectionMode: TextEdit.SelectCharacters
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_default.qml b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_default.qml
new file mode 100644
index 0000000000..7c7cb0b6fc
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_default.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_words.qml b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_words.qml
new file mode 100644
index 0000000000..0a372bbf83
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/mouseselectionmode_words.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+    mouseSelectionMode: TextEdit.SelectWords
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/navigation.qml b/tests/auto/declarative/qsgtextedit/data/navigation.qml
new file mode 100644
index 0000000000..0201c62b3c
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/navigation.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Rectangle {
+    property variant myInput: input
+
+    width: 800; height: 600; color: "blue"
+
+    Item { 
+        id: firstItem;
+        KeyNavigation.right: input
+    }
+
+    TextEdit { id: input; focus: true
+        KeyNavigation.left: firstItem
+        KeyNavigation.right: lastItem
+        KeyNavigation.up: firstItem
+        KeyNavigation.down: lastItem
+        text: "a"
+    }
+    Item {
+        id: lastItem 
+        KeyNavigation.left: input
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/openInputPanel.qml b/tests/auto/declarative/qsgtextedit/data/openInputPanel.qml
new file mode 100644
index 0000000000..8998e55abb
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/openInputPanel.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+TextEdit {
+    text: "Hello world"
+    focus: false
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/positionAt.qml b/tests/auto/declarative/qsgtextedit/data/positionAt.qml
new file mode 100644
index 0000000000..19093281fe
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/positionAt.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+
+TextEdit {
+    focus: true
+    objectName: "myInput"
+    width: 50
+    height: 25
+    text: "This is\n a long piece of text"
+}
diff --git a/tests/auto/declarative/qsgtextedit/data/readOnly.qml b/tests/auto/declarative/qsgtextedit/data/readOnly.qml
new file mode 100644
index 0000000000..085adba5fb
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/data/readOnly.qml
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Rectangle {
+    property variant myInput: input
+
+    width: 800; height: 600; color: "blue"
+
+    TextEdit { id: input; focus: true
+        readOnly: true
+        text: "I am the very model of a modern major general.\n"
+    }
+}
diff --git a/tests/auto/declarative/qsgtextedit/qsgtextedit.pro b/tests/auto/declarative/qsgtextedit/qsgtextedit.pro
new file mode 100644
index 0000000000..a67658efa0
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/qsgtextedit.pro
@@ -0,0 +1,14 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui network
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgtextedit.cpp ../shared/testhttpserver.cpp
+HEADERS += ../shared/testhttpserver.h
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
diff --git a/tests/auto/declarative/qsgtextedit/tst_qsgtextedit.cpp b/tests/auto/declarative/qsgtextedit/tst_qsgtextedit.cpp
new file mode 100644
index 0000000000..5510701962
--- /dev/null
+++ b/tests/auto/declarative/qsgtextedit/tst_qsgtextedit.cpp
@@ -0,0 +1,2388 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtTest/QSignalSpy>
+#include "../../../shared/util.h"
+#include "../shared/testhttpserver.h"
+#include <math.h>
+#include <QFile>
+#include <QTextDocument>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <private/qsgtextedit_p.h>
+#include <private/qsgtextedit_p_p.h>
+#include <QFontMetrics>
+#include <QSGView>
+#include <QDir>
+#include <QStyle>
+#include <QInputContext>
+#include <QClipboard>
+#include <QMimeData>
+#include <private/qapplication_p.h>
+#include <private/qtextcontrol_p.h>
+
+#ifdef Q_WS_MAC
+#include <Carbon/Carbon.h>
+#endif
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+Q_DECLARE_METATYPE(QSGTextEdit::SelectionMode)
+
+QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual)
+{
+    // XXX This will be replaced by some clever persistent platform image store.
+    QString persistent_dir = SRCDIR "/data";
+    QString arch = "unknown-architecture"; // QTest needs to help with this.
+
+    QString expectfile = persistent_dir + QDir::separator() + filebasename + "-" + arch + ".png";
+
+    if (!QFile::exists(expectfile)) {
+        actual.save(expectfile);
+        qWarning() << "created" << expectfile;
+    }
+
+    return expectfile;
+}
+
+
+class tst_qsgtextedit : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_qsgtextedit();
+
+private slots:
+    void text();
+    void width();
+    void wrap();
+    void textFormat();
+    void alignments();
+    void alignments_data();
+
+    // ### these tests may be trivial    
+    void hAlign();
+    void hAlign_RightToLeft();
+    void vAlign();
+    void font();
+    void color();
+    void textMargin();
+    void persistentSelection();
+    void focusOnPress();
+    void selection();
+    void isRightToLeft_data();
+    void isRightToLeft();
+    void keySelection();
+    void moveCursorSelection_data();
+    void moveCursorSelection();
+    void moveCursorSelectionSequence_data();
+    void moveCursorSelectionSequence();
+    void mouseSelection_data();
+    void mouseSelection();
+    void mouseSelectionMode_data();
+    void mouseSelectionMode();
+    void dragMouseSelection();
+    void inputMethodHints();
+
+    void positionAt();
+
+    void cursorDelegate();
+    void cursorVisible();
+    void delegateLoading_data();
+    void delegateLoading();
+    void navigation();
+    void readOnly();
+    void copyAndPaste();
+    void canPaste();
+    void canPasteEmpty();
+    void textInput();
+    void openInputPanelOnClick();
+    void openInputPanelOnFocus();
+    void geometrySignals();
+    void pastingRichText_QTBUG_14003();
+    void implicitSize_data();
+    void implicitSize();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+    void preeditMicroFocus();
+    void inputContextMouseHandler();
+    void inputMethodComposing();
+    void cursorRectangleSize();
+
+private:
+    void simulateKey(QSGView *, int key, Qt::KeyboardModifiers modifiers = 0);
+
+    QStringList standard;
+    QStringList richText;
+
+    QStringList hAlignmentStrings;
+    QStringList vAlignmentStrings;
+
+    QList<Qt::Alignment> vAlignments;
+    QList<Qt::Alignment> hAlignments;
+
+    QStringList colorStrings;
+
+    QDeclarativeEngine engine;
+};
+
+tst_qsgtextedit::tst_qsgtextedit()
+{
+    standard << "the quick brown fox jumped over the lazy dog"
+             << "the quick brown fox\n jumped over the lazy dog"
+             << "Hello, world!"
+             << "!dlrow ,olleH";
+
+    richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
+             << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
+
+    hAlignmentStrings << "AlignLeft"
+                      << "AlignRight"
+                      << "AlignHCenter";
+
+    vAlignmentStrings << "AlignTop"
+                      << "AlignBottom"
+                      << "AlignVCenter";
+
+    hAlignments << Qt::AlignLeft
+                << Qt::AlignRight
+                << Qt::AlignHCenter;
+
+    vAlignments << Qt::AlignTop
+                << Qt::AlignBottom
+                << Qt::AlignVCenter;
+
+    colorStrings << "aliceblue"
+                 << "antiquewhite"
+                 << "aqua"
+                 << "darkkhaki"
+                 << "darkolivegreen"
+                 << "dimgray"
+                 << "palevioletred"
+                 << "lightsteelblue"
+                 << "#000000"
+                 << "#AAAAAA"
+                 << "#FFFFFF"
+                 << "#2AC05F";
+                 //
+                 // need a different test to do alpha channel test
+                 // << "#AA0011DD"
+                 // << "#00F16B11";
+                 // 
+}
+
+void tst_qsgtextedit::text()
+{
+    {
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData("import QtQuick 2.0\nTextEdit {  text: \"\"  }", QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->text(), QString(""));
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->text(), standard.at(i));
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QString actual = textEditObject->text();
+        QString expected = richText.at(i);
+        actual.replace(QRegExp(".*<body[^>]*>"),"");
+        actual.replace(QRegExp("(<[^>]*>)+"),"<>");
+        expected.replace(QRegExp("(<[^>]*>)+"),"<>");
+        QCOMPARE(actual.simplified(),expected.simplified());
+    }
+}
+
+void tst_qsgtextedit::width()
+{
+    // uses Font metrics to find the width for standard and document to find the width for rich
+    {
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData("import QtQuick 2.0\nTextEdit {  text: \"\" }", QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), 0.0);
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QFont f;
+        QFontMetricsF fm(f);
+        qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
+        metricWidth = ceil(metricWidth);
+
+        QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), qreal(metricWidth));
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QTextDocument document;
+        document.setHtml(richText.at(i));
+        document.setDocumentMargin(0);
+
+        int documentWidth = ceil(document.idealWidth());
+
+        QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), qreal(documentWidth));
+    }
+}
+
+void tst_qsgtextedit::wrap()
+{
+    // for specified width and wrap set true
+    {
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData("import QtQuick 2.0\nTextEdit {  text: \"\"; wrapMode: TextEdit.WordWrap; width: 300 }", QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), 300.);
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  wrapMode: TextEdit.WordWrap; width: 300; text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), 300.);
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  wrapMode: TextEdit.WordWrap; width: 300; text: \"" + richText.at(i) + "\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->width(), 300.);
+    }
+
+}
+
+void tst_qsgtextedit::textFormat()
+{
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nTextEdit { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile(""));
+        QSGTextEdit *textObject = qobject_cast<QSGTextEdit*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->textFormat() == QSGTextEdit::RichText);
+    }
+    {
+        QDeclarativeComponent textComponent(&engine);
+        textComponent.setData("import QtQuick 2.0\nTextEdit { text: \"<b>Hello</b>\"; textFormat: Text.PlainText }", QUrl::fromLocalFile(""));
+        QSGTextEdit *textObject = qobject_cast<QSGTextEdit*>(textComponent.create());
+
+        QVERIFY(textObject != 0);
+        QVERIFY(textObject->textFormat() == QSGTextEdit::PlainText);
+    }
+}
+
+void tst_qsgtextedit::alignments_data()
+{
+    QTest::addColumn<int>("hAlign");
+    QTest::addColumn<int>("vAlign");
+    QTest::addColumn<QString>("expectfile");
+
+    QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << "alignments_lt";
+    QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << "alignments_rt";
+    QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << "alignments_ct";
+
+    QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << "alignments_lb";
+    QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << "alignments_rb";
+    QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << "alignments_cb";
+
+    QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << "alignments_lc";
+    QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << "alignments_rc";
+    QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << "alignments_cc";
+}
+
+
+void tst_qsgtextedit::alignments()
+{
+    QFETCH(int, hAlign);
+    QFETCH(int, vAlign);
+    QFETCH(QString, expectfile);
+
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/alignments.qml"));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QObject *ob = canvas.rootObject();
+    QVERIFY(ob != 0);
+    ob->setProperty("horizontalAlignment",hAlign);
+    ob->setProperty("verticalAlignment",vAlign);
+    QTRY_COMPARE(ob->property("running").toBool(),false);
+    QImage actual(canvas.width(), canvas.height(), QImage::Format_RGB32);
+    actual.fill(qRgb(255,255,255));
+    QPainter p(&actual);
+    canvas.render(&p);
+
+    expectfile = createExpectedFileIfNotFound(expectfile, actual);
+
+    QImage expect(expectfile);
+
+    QCOMPARE(actual,expect);
+}
+
+
+//the alignment tests may be trivial o.oa
+void tst_qsgtextedit::hAlign()
+{
+    //test one align each, and then test if two align fails.
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        for (int j=0; j < hAlignmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nTextEdit {  horizontalAlignment: \"" + hAlignmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent texteditComponent(&engine);
+            texteditComponent.setData(componentStr.toLatin1(), QUrl());
+            QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+            QVERIFY(textEditObject != 0);
+            QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j));
+        }
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        for (int j=0; j < hAlignmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nTextEdit {  horizontalAlignment: \"" + hAlignmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent texteditComponent(&engine);
+            texteditComponent.setData(componentStr.toLatin1(), QUrl());
+            QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+            QVERIFY(textEditObject != 0);
+            QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j));
+        }
+    }
+
+}
+
+void tst_qsgtextedit::hAlign_RightToLeft()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/horizontalAlignment_RightToLeft.qml"));
+    QSGTextEdit *textEdit = canvas.rootObject()->findChild<QSGTextEdit*>("text");
+    QVERIFY(textEdit != 0);
+    canvas.show();
+
+    // implicit alignment should follow the reading direction of text
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // explicitly left aligned
+    textEdit->setHAlign(QSGTextEdit::AlignLeft);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignLeft);
+    QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
+
+    // explicitly right aligned
+    textEdit->setHAlign(QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    QString textString = textEdit->text();
+    textEdit->setText(QString("<i>") + textString + QString("</i>"));
+    textEdit->resetHAlign();
+
+    // implicitly aligned rich text should follow the reading direction of RTL text
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign());
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // explicitly left aligned rich text
+    textEdit->setHAlign(QSGTextEdit::AlignLeft);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignLeft);
+    QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign());
+    QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
+
+    // explicitly right aligned rich text
+    textEdit->setHAlign(QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign());
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    textEdit->setText(textString);
+
+    // explicitly center aligned
+    textEdit->setHAlign(QSGTextEdit::AlignHCenter);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignHCenter);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // reseted alignment should go back to following the text reading direction
+    textEdit->resetHAlign();
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // mirror the text item
+    QSGItemPrivate::get(textEdit)->setLayoutMirror(true);
+
+    // mirrored implicit alignment should continue to follow the reading direction of the text
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->effectiveHAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // mirrored explicitly right aligned behaves as left aligned
+    textEdit->setHAlign(QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->effectiveHAlign(), QSGTextEdit::AlignLeft);
+    QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
+
+    // mirrored explicitly left aligned behaves as right aligned
+    textEdit->setHAlign(QSGTextEdit::AlignLeft);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignLeft);
+    QCOMPARE(textEdit->effectiveHAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // disable mirroring
+    QSGItemPrivate::get(textEdit)->setLayoutMirror(false);
+    textEdit->resetHAlign();
+
+    // English text should be implicitly left aligned
+    textEdit->setText("Hello world!");
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignLeft);
+    QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // empty text with implicit alignment follows the system locale-based
+    // keyboard input direction from QApplication::keyboardInputDirection
+    textEdit->setText("");
+    QCOMPARE(textEdit->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGTextEdit::AlignLeft : QSGTextEdit::AlignRight);
+    if (QApplication::keyboardInputDirection() == Qt::LeftToRight)
+        QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
+    else
+        QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+    textEdit->setHAlign(QSGTextEdit::AlignRight);
+    QCOMPARE(textEdit->hAlign(), QSGTextEdit::AlignRight);
+    QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+#endif
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // alignment of TextEdit with no text set to it
+    QString componentStr = "import QtQuick 2.0\nTextEdit {}";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGTextEdit *textObject = qobject_cast<QSGTextEdit*>(textComponent.create());
+    QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGTextEdit::AlignLeft : QSGTextEdit::AlignRight);
+    delete textObject;
+#endif
+}
+
+void tst_qsgtextedit::vAlign()
+{
+    //test one align each, and then test if two align fails.
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        for (int j=0; j < vAlignmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nTextEdit {  verticalAlignment: \"" + vAlignmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
+            QDeclarativeComponent texteditComponent(&engine);
+            texteditComponent.setData(componentStr.toLatin1(), QUrl());
+            QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+            QVERIFY(textEditObject != 0);
+            QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j));
+        }
+    }
+
+    for (int i = 0; i < richText.size(); i++)
+    {
+        for (int j=0; j < vAlignmentStrings.size(); j++)
+        {
+            QString componentStr = "import QtQuick 2.0\nTextEdit {  verticalAlignment: \"" + vAlignmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
+            QDeclarativeComponent texteditComponent(&engine);
+            texteditComponent.setData(componentStr.toLatin1(), QUrl());
+            QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+            QVERIFY(textEditObject != 0);
+            QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j));
+        }
+    }
+
+}
+
+void tst_qsgtextedit::font()
+{
+    //test size, then bold, then italic, then family
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  font.pointSize: 40; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->font().pointSize(), 40);
+        QCOMPARE(textEditObject->font().bold(), false);
+        QCOMPARE(textEditObject->font().italic(), false);
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  font.bold: true; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->font().bold(), true);
+        QCOMPARE(textEditObject->font().italic(), false);
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  font.italic: true; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->font().italic(), true);
+        QCOMPARE(textEditObject->font().bold(), false);
+    }
+ 
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  font.family: \"Helvetica\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->font().family(), QString("Helvetica"));
+        QCOMPARE(textEditObject->font().bold(), false);
+        QCOMPARE(textEditObject->font().italic(), false);
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  font.family: \"\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->font().family(), QString(""));
+    }
+}
+
+void tst_qsgtextedit::color()
+{
+    //test initial color
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QSGTextEditPrivate *textEditPrivate = static_cast<QSGTextEditPrivate*>(QSGItemPrivate::get(textEditObject));
+
+        QVERIFY(textEditObject);
+        QVERIFY(textEditPrivate);
+        QVERIFY(textEditPrivate->control);
+
+        QPalette pal = textEditPrivate->control->palette();
+        QCOMPARE(textEditPrivate->color, QColor("black"));
+        QCOMPARE(textEditPrivate->color, pal.color(QPalette::Text));
+    }
+    //test normal
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        //qDebug() << "textEditObject: " << textEditObject->color() << "vs. " << QColor(colorStrings.at(i));
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->color(), QColor(colorStrings.at(i)));
+    }
+
+    //test selection
+    for (int i = 0; i < colorStrings.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  selectionColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->selectionColor(), QColor(colorStrings.at(i)));
+    }
+
+    //test selected text
+    for (int i = 0; i < colorStrings.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  selectedTextColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->selectedTextColor(), QColor(colorStrings.at(i)));
+    }
+
+    {
+        QString colorStr = "#AA001234";
+        QColor testColor("#001234");
+        testColor.setAlpha(170);
+
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  color: \"" + colorStr + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->color(), testColor);
+    }
+}
+
+void tst_qsgtextedit::textMargin()
+{
+    for(qreal i=0; i<=10; i+=0.3){
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  textMargin: " + QString::number(i) + "; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->textMargin(), i);
+    }
+}
+
+void tst_qsgtextedit::persistentSelection()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  persistentSelection: true; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->persistentSelection(), true);
+    }
+
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  persistentSelection: false; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->persistentSelection(), false);
+    }
+}
+
+void tst_qsgtextedit::focusOnPress()
+{
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  activeFocusOnPress: true; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->focusOnPress(), true);
+    }
+
+    {
+        QString componentStr = "import QtQuick 2.0\nTextEdit {  activeFocusOnPress: false; text: \"Hello World\" }";
+        QDeclarativeComponent texteditComponent(&engine);
+        texteditComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+        QVERIFY(textEditObject != 0);
+        QCOMPARE(textEditObject->focusOnPress(), false);
+    }
+}
+
+void tst_qsgtextedit::selection()
+{
+    QString testStr = standard[0];//TODO: What should happen for multiline/rich text?
+    QString componentStr = "import QtQuick 2.0\nTextEdit {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent texteditComponent(&engine);
+    texteditComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+    QVERIFY(textEditObject != 0);
+
+
+    //Test selection follows cursor
+    for(int i=0; i<= testStr.size(); i++) {
+        textEditObject->setCursorPosition(i);
+        QCOMPARE(textEditObject->cursorPosition(), i);
+        QCOMPARE(textEditObject->selectionStart(), i);
+        QCOMPARE(textEditObject->selectionEnd(), i);
+        QVERIFY(textEditObject->selectedText().isNull());
+    }
+
+    textEditObject->setCursorPosition(0);
+    QVERIFY(textEditObject->cursorPosition() == 0);
+    QVERIFY(textEditObject->selectionStart() == 0);
+    QVERIFY(textEditObject->selectionEnd() == 0);
+    QVERIFY(textEditObject->selectedText().isNull());
+
+    // Verify invalid positions are ignored.
+    textEditObject->setCursorPosition(-1);
+    QVERIFY(textEditObject->cursorPosition() == 0);
+    QVERIFY(textEditObject->selectionStart() == 0);
+    QVERIFY(textEditObject->selectionEnd() == 0);
+    QVERIFY(textEditObject->selectedText().isNull());
+
+    textEditObject->setCursorPosition(textEditObject->text().count()+1);
+    QVERIFY(textEditObject->cursorPosition() == 0);
+    QVERIFY(textEditObject->selectionStart() == 0);
+    QVERIFY(textEditObject->selectionEnd() == 0);
+    QVERIFY(textEditObject->selectedText().isNull());
+
+    //Test selection
+    for(int i=0; i<= testStr.size(); i++) {
+        textEditObject->select(0,i);
+        QCOMPARE(testStr.mid(0,i), textEditObject->selectedText());
+    }
+    for(int i=0; i<= testStr.size(); i++) {
+        textEditObject->select(i,testStr.size());
+        QCOMPARE(testStr.mid(i,testStr.size()-i), textEditObject->selectedText());
+    }
+
+    textEditObject->setCursorPosition(0);
+    QVERIFY(textEditObject->cursorPosition() == 0);
+    QVERIFY(textEditObject->selectionStart() == 0);
+    QVERIFY(textEditObject->selectionEnd() == 0);
+    QVERIFY(textEditObject->selectedText().isNull());
+
+    //Test Error Ignoring behaviour
+    textEditObject->setCursorPosition(0);
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(-10,0);
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(100,101);
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(0,-10);
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(0,100);
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(0,10);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+    textEditObject->select(-10,0);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+    textEditObject->select(100,101);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+    textEditObject->select(0,-10);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+    textEditObject->select(0,100);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+
+    textEditObject->deselect();
+    QVERIFY(textEditObject->selectedText().isNull());
+    textEditObject->select(0,10);
+    QVERIFY(textEditObject->selectedText().size() == 10);
+    textEditObject->deselect();
+    QVERIFY(textEditObject->selectedText().isNull());
+}
+
+void tst_qsgtextedit::isRightToLeft_data()
+{
+    QTest::addColumn<QString>("text");
+    QTest::addColumn<bool>("emptyString");
+    QTest::addColumn<bool>("firstCharacter");
+    QTest::addColumn<bool>("lastCharacter");
+    QTest::addColumn<bool>("middleCharacter");
+    QTest::addColumn<bool>("startString");
+    QTest::addColumn<bool>("midString");
+    QTest::addColumn<bool>("endString");
+
+    const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647};
+    QTest::newRow("Empty") << "" << false << false << false << false << false << false << false;
+    QTest::newRow("Neutral") << "23244242" << false << false << false << false << false << false << false;
+    QTest::newRow("LTR") << "Hello world" << false << false << false << false << false << false << false;
+    QTest::newRow("RTL") << QString::fromUtf16(arabic_str, 11) << false << true << true << true << true << true << true;
+    QTest::newRow("Bidi RTL + LTR + RTL") << QString::fromUtf16(arabic_str, 11) + QString("Hello world") + QString::fromUtf16(arabic_str, 11) << false << true << true << false << true << true << true;
+    QTest::newRow("Bidi LTR + RTL + LTR") << QString("Hello world") + QString::fromUtf16(arabic_str, 11) + QString("Hello world") << false << false << false << true << false << false << false;
+}
+
+void tst_qsgtextedit::isRightToLeft()
+{
+    QFETCH(QString, text);
+    QFETCH(bool, emptyString);
+    QFETCH(bool, firstCharacter);
+    QFETCH(bool, lastCharacter);
+    QFETCH(bool, middleCharacter);
+    QFETCH(bool, startString);
+    QFETCH(bool, midString);
+    QFETCH(bool, endString);
+
+    QSGTextEdit textEdit;
+    textEdit.setText(text);
+
+    // first test that the right string is delivered to the QString::isRightToLeft()
+    QCOMPARE(textEdit.isRightToLeft(0,0), text.mid(0,0).isRightToLeft());
+    QCOMPARE(textEdit.isRightToLeft(0,1), text.mid(0,1).isRightToLeft());
+    QCOMPARE(textEdit.isRightToLeft(text.count()-2, text.count()-1), text.mid(text.count()-2, text.count()-1).isRightToLeft());
+    QCOMPARE(textEdit.isRightToLeft(text.count()/2, text.count()/2 + 1), text.mid(text.count()/2, text.count()/2 + 1).isRightToLeft());
+    QCOMPARE(textEdit.isRightToLeft(0,text.count()/4), text.mid(0,text.count()/4).isRightToLeft());
+    QCOMPARE(textEdit.isRightToLeft(text.count()/4,3*text.count()/4), text.mid(text.count()/4,3*text.count()/4).isRightToLeft());
+    if (text.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start.");
+    QCOMPARE(textEdit.isRightToLeft(3*text.count()/4,text.count()-1), text.mid(3*text.count()/4,text.count()-1).isRightToLeft());
+
+    // then test that the feature actually works
+    QCOMPARE(textEdit.isRightToLeft(0,0), emptyString);
+    QCOMPARE(textEdit.isRightToLeft(0,1), firstCharacter);
+    QCOMPARE(textEdit.isRightToLeft(text.count()-2, text.count()-1), lastCharacter);
+    QCOMPARE(textEdit.isRightToLeft(text.count()/2, text.count()/2 + 1), middleCharacter);
+    QCOMPARE(textEdit.isRightToLeft(0,text.count()/4), startString);
+    QCOMPARE(textEdit.isRightToLeft(text.count()/4,3*text.count()/4), midString);
+    if (text.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start.");
+    QCOMPARE(textEdit.isRightToLeft(3*text.count()/4,text.count()-1), endString);
+}
+
+void tst_qsgtextedit::keySelection()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/navigation.qml"));
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextEdit *input = qobject_cast<QSGTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+
+    QSignalSpy spy(input, SIGNAL(selectionChanged()));
+
+    simulateKey(&canvas, Qt::Key_Right, Qt::ShiftModifier);
+    QVERIFY(input->hasActiveFocus() == true);
+    QCOMPARE(input->selectedText(), QString("a"));
+    QCOMPARE(spy.count(), 1);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == true);
+    QCOMPARE(input->selectedText(), QString());
+    QCOMPARE(spy.count(), 2);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == false);
+    QCOMPARE(input->selectedText(), QString());
+    QCOMPARE(spy.count(), 2);
+
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == true);
+    QCOMPARE(spy.count(), 2);
+    simulateKey(&canvas, Qt::Key_Left, Qt::ShiftModifier);
+    QVERIFY(input->hasActiveFocus() == true);
+    QCOMPARE(input->selectedText(), QString("a"));
+    QCOMPARE(spy.count(), 3);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == true);
+    QCOMPARE(input->selectedText(), QString());
+    QCOMPARE(spy.count(), 4);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == false);
+    QCOMPARE(input->selectedText(), QString());
+    QCOMPARE(spy.count(), 4);
+}
+
+void tst_qsgtextedit::moveCursorSelection_data()
+{
+    QTest::addColumn<QString>("testStr");
+    QTest::addColumn<int>("cursorPosition");
+    QTest::addColumn<int>("movePosition");
+    QTest::addColumn<QSGTextEdit::SelectionMode>("mode");
+    QTest::addColumn<int>("selectionStart");
+    QTest::addColumn<int>("selectionEnd");
+    QTest::addColumn<bool>("reversible");
+
+    QTest::newRow("(t)he|characters")
+            << standard[0] << 0 << 1 << QSGTextEdit::SelectCharacters << 0 << 1 << true;
+    QTest::newRow("do(g)|characters")
+            << standard[0] << 43 << 44 << QSGTextEdit::SelectCharacters << 43 << 44 << true;
+    QTest::newRow("jum(p)ed|characters")
+            << standard[0] << 23 << 24 << QSGTextEdit::SelectCharacters << 23 << 24 << true;
+    QTest::newRow("jumped( )over|characters")
+            << standard[0] << 26 << 27 << QSGTextEdit::SelectCharacters << 26 << 27 << true;
+    QTest::newRow("(the )|characters")
+            << standard[0] << 0 << 4 << QSGTextEdit::SelectCharacters << 0 << 4 << true;
+    QTest::newRow("( dog)|characters")
+            << standard[0] << 40 << 44 << QSGTextEdit::SelectCharacters << 40 << 44 << true;
+    QTest::newRow("( jumped )|characters")
+            << standard[0] << 19 << 27 << QSGTextEdit::SelectCharacters << 19 << 27 << true;
+    QTest::newRow("th(e qu)ick|characters")
+            << standard[0] << 2 << 6 << QSGTextEdit::SelectCharacters << 2 << 6 << true;
+    QTest::newRow("la(zy d)og|characters")
+            << standard[0] << 38 << 42 << QSGTextEdit::SelectCharacters << 38 << 42 << true;
+    QTest::newRow("jum(ped ov)er|characters")
+            << standard[0] << 23 << 29 << QSGTextEdit::SelectCharacters << 23 << 29 << true;
+    QTest::newRow("()the|characters")
+            << standard[0] << 0 << 0 << QSGTextEdit::SelectCharacters << 0 << 0 << true;
+    QTest::newRow("dog()|characters")
+            << standard[0] << 44 << 44 << QSGTextEdit::SelectCharacters << 44 << 44 << true;
+    QTest::newRow("jum()ped|characters")
+            << standard[0] << 23 << 23 << QSGTextEdit::SelectCharacters << 23 << 23 << true;
+
+    QTest::newRow("<(t)he>|words")
+            << standard[0] << 0 << 1 << QSGTextEdit::SelectWords << 0 << 3 << true;
+    QTest::newRow("<do(g)>|words")
+            << standard[0] << 43 << 44 << QSGTextEdit::SelectWords << 41 << 44 << true;
+    QTest::newRow("<jum(p)ed>|words")
+            << standard[0] << 23 << 24 << QSGTextEdit::SelectWords << 20 << 26 << true;
+    QTest::newRow("<jumped( )>over|words")
+            << standard[0] << 26 << 27 << QSGTextEdit::SelectWords << 20 << 27 << false;
+    QTest::newRow("jumped<( )over>|words,reversed")
+            << standard[0] << 27 << 26 << QSGTextEdit::SelectWords << 26 << 31 << false;
+    QTest::newRow("<(the )>quick|words")
+            << standard[0] << 0 << 4 << QSGTextEdit::SelectWords << 0 << 4 << false;
+    QTest::newRow("<(the )quick>|words,reversed")
+            << standard[0] << 4 << 0 << QSGTextEdit::SelectWords << 0 << 9 << false;
+    QTest::newRow("<lazy( dog)>|words")
+            << standard[0] << 40 << 44 << QSGTextEdit::SelectWords << 36 << 44 << false;
+    QTest::newRow("lazy<( dog)>|words,reversed")
+            << standard[0] << 44 << 40 << QSGTextEdit::SelectWords << 40 << 44 << false;
+    QTest::newRow("<fox( jumped )>over|words")
+            << standard[0] << 19 << 27 << QSGTextEdit::SelectWords << 16 << 27 << false;
+    QTest::newRow("fox<( jumped )over>|words,reversed")
+            << standard[0] << 27 << 19 << QSGTextEdit::SelectWords << 19 << 31 << false;
+    QTest::newRow("<th(e qu)ick>|words")
+            << standard[0] << 2 << 6 << QSGTextEdit::SelectWords << 0 << 9 << true;
+    QTest::newRow("<la(zy d)og|words>")
+            << standard[0] << 38 << 42 << QSGTextEdit::SelectWords << 36 << 44 << true;
+    QTest::newRow("<jum(ped ov)er>|words")
+            << standard[0] << 23 << 29 << QSGTextEdit::SelectWords << 20 << 31 << true;
+    QTest::newRow("<()>the|words")
+            << standard[0] << 0 << 0 << QSGTextEdit::SelectWords << 0 << 0 << true;
+    QTest::newRow("dog<()>|words")
+            << standard[0] << 44 << 44 << QSGTextEdit::SelectWords << 44 << 44 << true;
+    QTest::newRow("jum<()>ped|words")
+            << standard[0] << 23 << 23 << QSGTextEdit::SelectWords << 23 << 23 << true;
+
+    QTest::newRow("Hello<(,)> |words")
+            << standard[2] << 5 << 6 << QSGTextEdit::SelectWords << 5 << 6 << true;
+    QTest::newRow("Hello<(, )>world|words")
+            << standard[2] << 5 << 7 << QSGTextEdit::SelectWords << 5 << 7 << false;
+    QTest::newRow("Hello<(, )world>|words,reversed")
+            << standard[2] << 7 << 5 << QSGTextEdit::SelectWords << 5 << 12 << false;
+    QTest::newRow("<Hel(lo, )>world|words")
+            << standard[2] << 3 << 7 << QSGTextEdit::SelectWords << 0 << 7 << false;
+    QTest::newRow("<Hel(lo, )world>|words,reversed")
+            << standard[2] << 7 << 3 << QSGTextEdit::SelectWords << 0 << 12 << false;
+    QTest::newRow("<Hel(lo)>,|words")
+            << standard[2] << 3 << 5 << QSGTextEdit::SelectWords << 0 << 5 << true;
+    QTest::newRow("Hello<()>,|words")
+            << standard[2] << 5 << 5 << QSGTextEdit::SelectWords << 5 << 5 << true;
+    QTest::newRow("Hello,<()>|words")
+            << standard[2] << 6 << 6 << QSGTextEdit::SelectWords << 6 << 6 << true;
+    QTest::newRow("Hello<,( )>world|words")
+            << standard[2] << 6 << 7 << QSGTextEdit::SelectWords << 5 << 7 << false;
+    QTest::newRow("Hello,<( )world>|words,reversed")
+            << standard[2] << 7 << 6 << QSGTextEdit::SelectWords << 6 << 12 << false;
+    QTest::newRow("Hello<,( world)>|words")
+            << standard[2] << 6 << 12 << QSGTextEdit::SelectWords << 5 << 12 << false;
+    QTest::newRow("Hello,<( world)>|words,reversed")
+            << standard[2] << 12 << 6 << QSGTextEdit::SelectWords << 6 << 12 << false;
+    QTest::newRow("Hello<,( world!)>|words")
+            << standard[2] << 6 << 13 << QSGTextEdit::SelectWords << 5 << 13 << false;
+    QTest::newRow("Hello,<( world!)>|words,reversed")
+            << standard[2] << 13 << 6 << QSGTextEdit::SelectWords << 6 << 13 << false;
+    QTest::newRow("Hello<(, world!)>|words")
+            << standard[2] << 5 << 13 << QSGTextEdit::SelectWords << 5 << 13 << true;
+    QTest::newRow("world<(!)>|words")
+            << standard[2] << 12 << 13 << QSGTextEdit::SelectWords << 12 << 13 << true;
+    QTest::newRow("world!<()>)|words")
+            << standard[2] << 13 << 13 << QSGTextEdit::SelectWords << 13 << 13 << true;
+    QTest::newRow("world<()>!)|words")
+            << standard[2] << 12 << 12 << QSGTextEdit::SelectWords << 12 << 12 << true;
+
+    QTest::newRow("<(,)>olleH |words")
+            << standard[3] << 7 << 8 << QSGTextEdit::SelectWords << 7 << 8 << true;
+    QTest::newRow("<dlrow( ,)>olleH|words")
+            << standard[3] << 6 << 8 << QSGTextEdit::SelectWords << 1 << 8 << false;
+    QTest::newRow("dlrow<( ,)>olleH|words,reversed")
+            << standard[3] << 8 << 6 << QSGTextEdit::SelectWords << 6 << 8 << false;
+    QTest::newRow("<dlrow( ,ol)leH>|words")
+            << standard[3] << 6 << 10 << QSGTextEdit::SelectWords << 1 << 13 << false;
+    QTest::newRow("dlrow<( ,ol)leH>|words,reversed")
+            << standard[3] << 10 << 6 << QSGTextEdit::SelectWords << 6 << 13 << false;
+    QTest::newRow(",<(ol)leH>,|words")
+            << standard[3] << 8 << 10 << QSGTextEdit::SelectWords << 8 << 13 << true;
+    QTest::newRow(",<()>olleH|words")
+            << standard[3] << 8 << 8 << QSGTextEdit::SelectWords << 8 << 8 << true;
+    QTest::newRow("<()>,olleH|words")
+            << standard[3] << 7 << 7 << QSGTextEdit::SelectWords << 7 << 7 << true;
+    QTest::newRow("<dlrow( )>,olleH|words")
+            << standard[3] << 6 << 7 << QSGTextEdit::SelectWords << 1 << 7 << false;
+    QTest::newRow("dlrow<( ),>olleH|words,reversed")
+            << standard[3] << 7 << 6 << QSGTextEdit::SelectWords << 6 << 8 << false;
+    QTest::newRow("<(dlrow )>,olleH|words")
+            << standard[3] << 1 << 7 << QSGTextEdit::SelectWords << 1 << 7 << false;
+    QTest::newRow("<(dlrow ),>olleH|words,reversed")
+            << standard[3] << 7 << 1 << QSGTextEdit::SelectWords << 1 << 8 << false;
+    QTest::newRow("<(!dlrow )>,olleH|words")
+            << standard[3] << 0 << 7 << QSGTextEdit::SelectWords << 0 << 7 << false;
+    QTest::newRow("<(!dlrow ),>olleH|words,reversed")
+            << standard[3] << 7 << 0 << QSGTextEdit::SelectWords << 0 << 8 << false;
+    QTest::newRow("(!dlrow ,)olleH|words")
+            << standard[3] << 0 << 8 << QSGTextEdit::SelectWords << 0 << 8 << true;
+    QTest::newRow("<(!)>dlrow|words")
+            << standard[3] << 0 << 1 << QSGTextEdit::SelectWords << 0 << 1 << true;
+    QTest::newRow("<()>!dlrow|words")
+            << standard[3] << 0 << 0 << QSGTextEdit::SelectWords << 0 << 0 << true;
+    QTest::newRow("!<()>dlrow|words")
+            << standard[3] << 1 << 1 << QSGTextEdit::SelectWords << 1 << 1 << true;
+}
+
+void tst_qsgtextedit::moveCursorSelection()
+{
+    QFETCH(QString, testStr);
+    QFETCH(int, cursorPosition);
+    QFETCH(int, movePosition);
+    QFETCH(QSGTextEdit::SelectionMode, mode);
+    QFETCH(int, selectionStart);
+    QFETCH(int, selectionEnd);
+    QFETCH(bool, reversible);
+
+    QString componentStr = "import QtQuick 2.0\nTextEdit {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent textinputComponent(&engine);
+    textinputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *texteditObject = qobject_cast<QSGTextEdit*>(textinputComponent.create());
+    QVERIFY(texteditObject != 0);
+
+    texteditObject->setCursorPosition(cursorPosition);
+    texteditObject->moveCursorSelection(movePosition, mode);
+
+    QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+    QCOMPARE(texteditObject->selectionStart(), selectionStart);
+    QCOMPARE(texteditObject->selectionEnd(), selectionEnd);
+
+    if (reversible) {
+        texteditObject->setCursorPosition(movePosition);
+        texteditObject->moveCursorSelection(cursorPosition, mode);
+
+        QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+        QCOMPARE(texteditObject->selectionStart(), selectionStart);
+        QCOMPARE(texteditObject->selectionEnd(), selectionEnd);
+    }
+}
+
+void tst_qsgtextedit::moveCursorSelectionSequence_data()
+{
+    QTest::addColumn<QString>("testStr");
+    QTest::addColumn<int>("cursorPosition");
+    QTest::addColumn<int>("movePosition1");
+    QTest::addColumn<int>("movePosition2");
+    QTest::addColumn<int>("selection1Start");
+    QTest::addColumn<int>("selection1End");
+    QTest::addColumn<int>("selection2Start");
+    QTest::addColumn<int>("selection2End");
+
+    QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 17
+            << 4 << 15
+            << 4 << 19;
+    QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 17
+            << 9 << 15
+            << 10 << 19;
+    QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 16
+            << 4 << 15
+            << 4 << 16;
+    QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 16
+            << 9 << 15
+            << 10 << 16;
+    QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 15
+            << 4 << 15
+            << 4 << 15;
+    QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 15
+            << 9 << 15
+            << 10 << 15;
+    QTest::newRow("the {<quick() ^}bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 10
+            << 4 << 15
+            << 4 << 10;
+    QTest::newRow("the quick<(^ {^bro)wn>} fox|rtl")
+            << standard[0]
+            << 13 << 9 << 10
+            << 9 << 15
+            << 10 << 15;
+    QTest::newRow("the {<quick^}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 9
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the quick{<(^ bro)wn>} fox|rtl")
+            << standard[0]
+            << 13 << 9 << 9
+            << 9 << 15
+            << 9 << 15;
+    QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 7
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 7
+            << 9 << 15
+            << 4 << 15;
+    QTest::newRow("the {<^quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 4
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the {<^quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 4
+            << 9 << 15
+            << 4 << 15;
+    QTest::newRow("the{^ <quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 3
+            << 4 << 15
+            << 3 << 9;
+    QTest::newRow("the{^ <quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 3
+            << 9 << 15
+            << 3 << 15;
+    QTest::newRow("{t^he <quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 1
+            << 4 << 15
+            << 0 << 9;
+    QTest::newRow("{t^he <quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 1
+            << 9 << 15
+            << 0 << 15;
+
+    QTest::newRow("{<He(ll)o>, w^orld}!|ltr")
+            << standard[2]
+            << 2 << 4 << 8
+            << 0 << 5
+            << 0 << 12;
+    QTest::newRow("{<He(ll)o>, w^orld}!|rtl")
+            << standard[2]
+            << 4 << 2 << 8
+            << 0 << 5
+            << 0 << 12;
+
+    QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr")
+            << standard[3]
+            << 9 << 11 << 5
+            << 8 << 13
+            << 1 << 13;
+    QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl")
+            << standard[3]
+            << 11 << 9 << 5
+            << 8 << 13
+            << 1 << 13;
+}
+
+void tst_qsgtextedit::moveCursorSelectionSequence()
+{
+    QFETCH(QString, testStr);
+    QFETCH(int, cursorPosition);
+    QFETCH(int, movePosition1);
+    QFETCH(int, movePosition2);
+    QFETCH(int, selection1Start);
+    QFETCH(int, selection1End);
+    QFETCH(int, selection2Start);
+    QFETCH(int, selection2End);
+
+    QString componentStr = "import QtQuick 2.0\nTextEdit {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent texteditComponent(&engine);
+    texteditComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *texteditObject = qobject_cast<QSGTextEdit*>(texteditComponent.create());
+    QVERIFY(texteditObject != 0);
+
+    texteditObject->setCursorPosition(cursorPosition);
+
+    texteditObject->moveCursorSelection(movePosition1, QSGTextEdit::SelectWords);
+    QCOMPARE(texteditObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start));
+    QCOMPARE(texteditObject->selectionStart(), selection1Start);
+    QCOMPARE(texteditObject->selectionEnd(), selection1End);
+
+    texteditObject->moveCursorSelection(movePosition2, QSGTextEdit::SelectWords);
+    QCOMPARE(texteditObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start));
+    QCOMPARE(texteditObject->selectionStart(), selection2Start);
+    QCOMPARE(texteditObject->selectionEnd(), selection2End);
+}
+
+
+void tst_qsgtextedit::mouseSelection_data()
+{
+    QTest::addColumn<QString>("qmlfile");
+    QTest::addColumn<bool>("expectSelection");
+
+    // import installed
+    QTest::newRow("on") << SRCDIR "/data/mouseselection_true.qml" << true;
+    QTest::newRow("off") << SRCDIR "/data/mouseselection_false.qml" << false;
+    QTest::newRow("default") << SRCDIR "/data/mouseselection_default.qml" << false;
+    QTest::newRow("on word selection") << SRCDIR "/data/mouseselection_true_words.qml" << true;
+    QTest::newRow("off word selection") << SRCDIR "/data/mouseselection_false_words.qml" << false;
+}
+
+void tst_qsgtextedit::mouseSelection()
+{
+    QFETCH(QString, qmlfile);
+    QFETCH(bool, expectSelection);
+
+    QSGView canvas(QUrl::fromLocalFile(qmlfile));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit *>(canvas.rootObject());
+    QVERIFY(textEditObject != 0);
+
+    // press-and-drag-and-release from x1 to x2
+    int x1 = 10;
+    int x2 = 70;
+    int y = textEditObject->height()/2;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    //QTest::mouseMove(canvas, QPoint(x2,y)); // doesn't work
+    QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+    QApplication::sendEvent(&canvas, &mv);
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str = textEditObject->selectedText();
+    if (expectSelection)
+        QVERIFY(str.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform)
+    else
+        QVERIFY(str.isEmpty());
+}
+
+void tst_qsgtextedit::dragMouseSelection()
+{
+    QString qmlfile = SRCDIR "/data/mouseselection_true.qml";
+
+    QSGView canvas(QUrl::fromLocalFile(qmlfile));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit *>(canvas.rootObject());
+    QVERIFY(textEditObject != 0);
+
+    // press-and-drag-and-release from x1 to x2
+    int x1 = 10;
+    int x2 = 70;
+    int y = textEditObject->height()/2;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&canvas, &mv);
+    }
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str1 = textEditObject->selectedText();
+    QVERIFY(str1.length() > 3);
+
+    // press and drag the current selection.
+    x1 = 40;
+    x2 = 100;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&canvas, &mv);
+    }
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str2 = textEditObject->selectedText();
+    QVERIFY(str2.length() > 3);
+
+    QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and not the first moved.
+}
+
+void tst_qsgtextedit::mouseSelectionMode_data()
+{
+    QTest::addColumn<QString>("qmlfile");
+    QTest::addColumn<bool>("selectWords");
+
+    // import installed
+    QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true;
+    QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false;
+    QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false;
+}
+
+void tst_qsgtextedit::mouseSelectionMode()
+{
+    QFETCH(QString, qmlfile);
+    QFETCH(bool, selectWords);
+
+    QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    QSGView canvas(QUrl::fromLocalFile(qmlfile));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit *>(canvas.rootObject());
+    QVERIFY(textEditObject != 0);
+
+    // press-and-drag-and-release from x1 to x2
+    int x1 = 10;
+    int x2 = 70;
+    int y = textEditObject->height()/2;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    //QTest::mouseMove(canvas, QPoint(x2,y)); // doesn't work
+    QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+    QApplication::sendEvent(&canvas, &mv);
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str = textEditObject->selectedText();
+    if (selectWords) {
+        QCOMPARE(str, text);
+    } else {
+        QVERIFY(str.length() > 3);
+        QVERIFY(str != text);
+    }
+}
+
+void tst_qsgtextedit::inputMethodHints()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/inputmethodhints.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextEdit *textEditObject = qobject_cast<QSGTextEdit *>(canvas.rootObject());
+    QVERIFY(textEditObject != 0);
+    QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText);
+    textEditObject->setInputMethodHints(Qt::ImhUppercaseOnly);
+    QVERIFY(textEditObject->inputMethodHints() & Qt::ImhUppercaseOnly);
+}
+
+void tst_qsgtextedit::positionAt()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/positionAt.qml"));
+    QVERIFY(canvas.rootObject() != 0);
+    canvas.show();
+    canvas.setFocus();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+
+    QSGTextEdit *texteditObject = qobject_cast<QSGTextEdit *>(canvas.rootObject());
+    QVERIFY(texteditObject != 0);
+
+    QFontMetrics fm(texteditObject->font());
+    const int y0 = fm.height() / 2;
+    const int y1 = fm.height() * 3 / 2;
+
+    int pos = texteditObject->positionAt(texteditObject->width()/2, y0);
+    int diff = abs(int(fm.width(texteditObject->text().left(pos))-texteditObject->width()/2));
+
+    // some tollerance for different fonts.
+#ifdef Q_OS_LINUX
+    QVERIFY(diff < 2);
+#else
+    QVERIFY(diff < 5);
+#endif
+
+    const qreal x0 = texteditObject->positionToRectangle(pos).x();
+    const qreal x1 = texteditObject->positionToRectangle(pos + 1).x();
+
+    QString preeditText = texteditObject->text().mid(0, pos);
+    texteditObject->setText(texteditObject->text().mid(pos));
+    texteditObject->setCursorPosition(0);
+
+    QInputMethodEvent inputEvent(preeditText, QList<QInputMethodEvent::Attribute>());
+    QApplication::sendEvent(&canvas, &inputEvent);
+
+    // Check all points within the preedit text return the same position.
+    QCOMPARE(texteditObject->positionAt(0, y0), 0);
+    QCOMPARE(texteditObject->positionAt(x0 / 2, y0), 0);
+    QCOMPARE(texteditObject->positionAt(x0, y0), 0);
+
+    // Verify positioning returns to normal after the preedit text.
+    QCOMPARE(texteditObject->positionAt(x1, y0), 1);
+    QCOMPARE(texteditObject->positionToRectangle(1).x(), x1);
+
+    QVERIFY(texteditObject->positionAt(x0 / 2, y1) > 0);
+}
+
+void tst_qsgtextedit::cursorDelegate()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/cursorTest.qml"));
+    view.show();
+    view.setFocus();
+    QSGTextEdit *textEditObject = view.rootObject()->findChild<QSGTextEdit*>("textEditObject");
+    QVERIFY(textEditObject != 0);
+    QVERIFY(textEditObject->findChild<QSGItem*>("cursorInstance"));
+    //Test Delegate gets created
+    textEditObject->setFocus(true);
+    QSGItem* delegateObject = textEditObject->findChild<QSGItem*>("cursorInstance");
+    QVERIFY(delegateObject);
+    //Test Delegate gets moved
+    for(int i=0; i<= textEditObject->text().length(); i++){
+        textEditObject->setCursorPosition(i);
+        QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x()));
+        QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y()));
+    }
+    textEditObject->setCursorPosition(0);
+    QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x()));
+    QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y()));
+    //Test Delegate gets deleted
+    textEditObject->setCursorDelegate(0);
+    QVERIFY(!textEditObject->findChild<QSGItem*>("cursorInstance"));
+}
+
+void tst_qsgtextedit::cursorVisible()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/cursorVisible.qml"));
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    view.setFocus();
+
+    QSGTextEdit edit;
+    QSignalSpy spy(&edit, SIGNAL(cursorVisibleChanged(bool)));
+
+    QCOMPARE(edit.isCursorVisible(), false);
+
+    edit.setCursorVisible(true);
+    QCOMPARE(edit.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 1);
+
+    edit.setCursorVisible(false);
+    QCOMPARE(edit.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 2);
+
+    edit.setFocus(true);
+    QCOMPARE(edit.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 2);
+
+    edit.setParentItem(view.rootObject());
+    QCOMPARE(edit.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 3);
+
+    edit.setFocus(false);
+    QCOMPARE(edit.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 4);
+
+    edit.setFocus(true);
+    QCOMPARE(edit.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 5);
+
+    view.clearFocus();
+    QCOMPARE(edit.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 6);
+
+    view.setFocus();
+    QCOMPARE(edit.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 7);
+
+    // on mac, setActiveWindow(0) on mac does not deactivate the current application
+    // (you have to switch to a different app or hide the current app to trigger this)
+#if !defined(Q_WS_MAC)
+    QApplication::setActiveWindow(0);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(0));
+    QCOMPARE(edit.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 8);
+
+    QApplication::setActiveWindow(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QCOMPARE(edit.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 9);
+#endif
+}
+
+void tst_qsgtextedit::delegateLoading_data()
+{
+    QTest::addColumn<QString>("qmlfile");
+    QTest::addColumn<QString>("error");
+
+    // import installed
+    QTest::newRow("pass") << "cursorHttpTestPass.qml" << "";
+    QTest::newRow("fail1") << "cursorHttpTestFail1.qml" << "http://localhost:42332/FailItem.qml: Remote host closed the connection ";
+    QTest::newRow("fail2") << "cursorHttpTestFail2.qml" << "http://localhost:42332/ErrItem.qml:4:5: Fungus is not a type ";
+}
+
+void tst_qsgtextedit::delegateLoading()
+{
+    QFETCH(QString, qmlfile);
+    QFETCH(QString, error);
+
+    TestHTTPServer server(42332);
+    server.serveDirectory(SRCDIR "/data/httpfail", TestHTTPServer::Disconnect);
+    server.serveDirectory(SRCDIR "/data/httpslow", TestHTTPServer::Delay);
+    server.serveDirectory(SRCDIR "/data/http");
+
+    QSGView view(QUrl(QLatin1String("http://localhost:42332/") + qmlfile));
+    view.show();
+    view.setFocus();
+
+    if (!error.isEmpty()) {
+        QTest::ignoreMessage(QtWarningMsg, error.toUtf8());
+        QTRY_VERIFY(view.status()==QSGView::Error);
+        QTRY_VERIFY(!view.rootObject()); // there is fail item inside this test
+    } else {
+        QTRY_VERIFY(view.rootObject());//Wait for loading to finish.
+        QSGTextEdit *textEditObject = view.rootObject()->findChild<QSGTextEdit*>("textEditObject");
+        //    view.rootObject()->dumpObjectTree();
+        QVERIFY(textEditObject != 0);
+        textEditObject->setFocus(true);
+        QSGItem *delegate;
+        delegate = view.rootObject()->findChild<QSGItem*>("delegateOkay");
+        QVERIFY(delegate);
+        delegate = view.rootObject()->findChild<QSGItem*>("delegateSlow");
+        QVERIFY(delegate);
+
+        delete delegate;
+    }
+
+
+    //A test should be added here with a component which is ready but component.create() returns null
+    //Not sure how to accomplish this with QSGTextEdits cursor delegate
+    //###This was only needed for code coverage, and could be a case of overzealous defensive programming
+    //delegate = view.rootObject()->findChild<QSGItem*>("delegateErrorB");
+    //QVERIFY(!delegate);
+}
+
+/*
+TextEdit element should only handle left/right keys until the cursor reaches
+the extent of the text, then they should ignore the keys.
+*/
+void tst_qsgtextedit::navigation()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/navigation.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGItem *input = qobject_cast<QSGItem *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == false);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == true);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == true);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == false);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == true);
+}
+
+void tst_qsgtextedit::copyAndPaste() {
+#ifndef QT_NO_CLIPBOARD
+
+#ifdef Q_WS_MAC
+    {
+        PasteboardRef pasteboard;
+        OSStatus status = PasteboardCreate(0, &pasteboard);
+        if (status == noErr)
+            CFRelease(pasteboard);
+        else
+            QSKIP("This machine doesn't support the clipboard", SkipAll);
+    }
+#endif
+
+    QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"Hello world!\" }";
+    QDeclarativeComponent textEditComponent(&engine);
+    textEditComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *textEdit = qobject_cast<QSGTextEdit*>(textEditComponent.create());
+    QVERIFY(textEdit != 0);
+
+    // copy and paste
+    QCOMPARE(textEdit->text().length(), 12);
+    textEdit->select(0, textEdit->text().length());;
+    textEdit->copy();
+    QCOMPARE(textEdit->selectedText(), QString("Hello world!"));
+    QCOMPARE(textEdit->selectedText().length(), 12);
+    textEdit->setCursorPosition(0);
+    QVERIFY(textEdit->canPaste());
+    textEdit->paste();
+    QCOMPARE(textEdit->text(), QString("Hello world!Hello world!"));
+    QCOMPARE(textEdit->text().length(), 24);
+
+    // canPaste
+    QVERIFY(textEdit->canPaste());
+    textEdit->setReadOnly(true);
+    QVERIFY(!textEdit->canPaste());
+    textEdit->setReadOnly(false);
+    QVERIFY(textEdit->canPaste());
+
+    // QTBUG-12339
+    // test that document and internal text attribute are in sync
+    QSGItemPrivate* pri = QSGItemPrivate::get(textEdit);
+    QSGTextEditPrivate *editPrivate = static_cast<QSGTextEditPrivate*>(pri);
+    QCOMPARE(textEdit->text(), editPrivate->text);
+
+    // select word
+    textEdit->setCursorPosition(0);
+    textEdit->selectWord();
+    QCOMPARE(textEdit->selectedText(), QString("Hello"));
+
+    // select all and cut
+    textEdit->selectAll();
+    textEdit->cut();
+    QCOMPARE(textEdit->text().length(), 0);
+    textEdit->paste();
+    QCOMPARE(textEdit->text(), QString("Hello world!Hello world!"));
+    QCOMPARE(textEdit->text().length(), 24);
+#endif
+}
+
+void tst_qsgtextedit::canPaste() {
+#ifndef QT_NO_CLIPBOARD
+
+    QApplication::clipboard()->setText("Some text");
+
+    QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"Hello world!\" }";
+    QDeclarativeComponent textEditComponent(&engine);
+    textEditComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *textEdit = qobject_cast<QSGTextEdit*>(textEditComponent.create());
+    QVERIFY(textEdit != 0);
+
+    // check initial value - QTBUG-17765
+    QTextControl tc;
+    QCOMPARE(textEdit->canPaste(), tc.canPaste());
+
+#endif
+}
+
+void tst_qsgtextedit::canPasteEmpty() {
+#ifndef QT_NO_CLIPBOARD
+
+    QApplication::clipboard()->clear();
+
+    QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"Hello world!\" }";
+    QDeclarativeComponent textEditComponent(&engine);
+    textEditComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextEdit *textEdit = qobject_cast<QSGTextEdit*>(textEditComponent.create());
+    QVERIFY(textEdit != 0);
+
+    // check initial value - QTBUG-17765
+    QTextControl tc;
+    QCOMPARE(textEdit->canPaste(), tc.canPaste());
+
+#endif
+}
+
+void tst_qsgtextedit::readOnly()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/readOnly.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(edit != 0);
+    QTRY_VERIFY(edit->hasActiveFocus() == true);
+    QVERIFY(edit->isReadOnly() == true);
+    QString initial = edit->text();
+    for(int k=Qt::Key_0; k<=Qt::Key_Z; k++)
+        simulateKey(&canvas, k);
+    simulateKey(&canvas, Qt::Key_Return);
+    simulateKey(&canvas, Qt::Key_Space);
+    simulateKey(&canvas, Qt::Key_Escape);
+    QCOMPARE(edit->text(), initial);
+}
+
+void tst_qsgtextedit::simulateKey(QSGView *view, int key, Qt::KeyboardModifiers modifiers)
+{
+    QKeyEvent press(QKeyEvent::KeyPress, key, modifiers);
+    QKeyEvent release(QKeyEvent::KeyRelease, key, modifiers);
+
+    QApplication::sendEvent(view, &press);
+    QApplication::sendEvent(view, &release);
+}
+
+class MyInputContext : public QInputContext
+{
+public:
+    MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {}
+    ~MyInputContext() {}
+
+    QString identifierName() { return QString(); }
+    QString language() { return QString(); }
+
+    void reset() {}
+
+    bool isComposing() const { return false; }
+
+    bool filterEvent( const QEvent *event )
+    {
+        if (event->type() == QEvent::RequestSoftwareInputPanel)
+            openInputPanelReceived = true;
+        if (event->type() == QEvent::CloseSoftwareInputPanel)
+            closeInputPanelReceived = true;
+        return QInputContext::filterEvent(event);
+    }
+
+    void update() { updateReceived = true; }
+
+    void sendPreeditText(const QString &text, int cursor)
+    {
+        QList<QInputMethodEvent::Attribute> attributes;
+        attributes.append(QInputMethodEvent::Attribute(
+                QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+
+        QInputMethodEvent event(text, attributes);
+        sendEvent(event);
+    }
+
+    void mouseHandler(int x, QMouseEvent *event)
+    {
+        cursor = x;
+        eventType = event->type();
+        eventPosition = event->pos();
+        eventGlobalPosition = event->globalPos();
+        eventButton = event->button();
+        eventButtons = event->buttons();
+        eventModifiers = event->modifiers();
+    }
+
+    bool openInputPanelReceived;
+    bool closeInputPanelReceived;
+    bool updateReceived;
+    int cursor;
+    QEvent::Type eventType;
+    QPoint eventPosition;
+    QPoint eventGlobalPosition;
+    Qt::MouseButton eventButton;
+    Qt::MouseButtons eventButtons;
+    Qt::KeyboardModifiers eventModifiers;
+};
+
+void tst_qsgtextedit::textInput()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputMethodEvent.qml"));
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+    QVERIFY(edit->hasActiveFocus() == true);
+
+    // test that input method event is committed
+    QInputMethodEvent event;
+    event.setCommitString( "Hello world!", 0, 0);
+    QApplication::sendEvent(&view, &event);
+    QCOMPARE(edit->text(), QString("Hello world!"));
+
+    // QTBUG-12339
+    // test that document and internal text attribute are in sync
+    QSGTextEditPrivate *editPrivate = static_cast<QSGTextEditPrivate*>(QSGItemPrivate::get(edit));
+    QCOMPARE(editPrivate->text, QString("Hello world!"));
+}
+
+void tst_qsgtextedit::openInputPanelOnClick()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/openInputPanel.qml"));
+    MyInputContext ic;
+    // QSGCanvas won't set the Qt::WA_InputMethodEnabled flag unless a suitable item has focus
+    // and QWidget won't allow an input context to be set when the flag is not set.
+    view.setAttribute(Qt::WA_InputMethodEnabled, true);
+    view.setInputContext(&ic);
+    view.setAttribute(Qt::WA_InputMethodEnabled, false);
+    view.show();
+
+    qApp->setAutoSipEnabled(true);
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+    QSignalSpy focusOnPressSpy(edit, SIGNAL(activeFocusOnPressChanged(bool)));
+
+    QSGItemPrivate* pri = QSGItemPrivate::get(edit);
+    QSGTextEditPrivate *editPrivate = static_cast<QSGTextEditPrivate*>(pri);
+
+    // input panel on click
+    editPrivate->showInputPanelOnFocus = false;
+
+    QStyle::RequestSoftwareInputPanel behavior = QStyle::RequestSoftwareInputPanel(
+            view.style()->styleHint(QStyle::SH_RequestSoftwareInputPanel));
+    QTest::mouseClick(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    if (behavior == QStyle::RSIP_OnMouseClickAndAlreadyFocused) {
+        QCOMPARE(ic.openInputPanelReceived, false);
+        QTest::mouseClick(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+        QApplication::processEvents();
+        QCOMPARE(ic.openInputPanelReceived, true);
+    } else if (behavior == QStyle::RSIP_OnMouseClick) {
+        QCOMPARE(ic.openInputPanelReceived, true);
+    }
+    ic.openInputPanelReceived = false;
+
+    // focus should not cause input panels to open or close
+    edit->setFocus(false);
+    edit->setFocus(true);
+    edit->setFocus(false);
+    edit->setFocus(true);
+    edit->setFocus(false);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+}
+
+void tst_qsgtextedit::openInputPanelOnFocus()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/openInputPanel.qml"));
+    MyInputContext ic;
+    // QSGCanvas won't set the Qt::WA_InputMethodEnabled flag unless a suitable item has focus
+    // and QWidget won't allow an input context to be set when the flag is not set.
+    view.setAttribute(Qt::WA_InputMethodEnabled, true);
+    view.setInputContext(&ic);
+    view.setAttribute(Qt::WA_InputMethodEnabled, false);
+    view.show();
+
+    qApp->setAutoSipEnabled(true);
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+    QSignalSpy focusOnPressSpy(edit, SIGNAL(activeFocusOnPressChanged(bool)));
+
+    QSGItemPrivate* pri = QSGItemPrivate::get(edit);
+    QSGTextEditPrivate *editPrivate = static_cast<QSGTextEditPrivate*>(pri);
+    editPrivate->showInputPanelOnFocus = true;
+
+    // test default values
+    QVERIFY(edit->focusOnPress());
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+
+    // focus on press, input panel on focus
+    QTest::mousePress(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    QVERIFY(edit->hasActiveFocus());
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+
+    // no events on release
+    QTest::mouseRelease(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QCOMPARE(ic.openInputPanelReceived, false);
+    ic.openInputPanelReceived = false;
+
+    // if already focused, input panel can be opened on press
+    QVERIFY(edit->hasActiveFocus());
+    QTest::mousePress(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+
+    // input method should stay enabled if focus
+    // is lost to an item that also accepts inputs
+    QSGTextEdit anotherEdit;
+    anotherEdit.setParentItem(view.rootObject());
+    anotherEdit.setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+    QCOMPARE(view.inputContext(), (QInputContext*)&ic);
+    QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // input method should be disabled if focus
+    // is lost to an item that doesn't accept inputs
+    QSGItem item;
+    item.setParentItem(view.rootObject());
+    item.setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // no automatic input panel events should
+    // be sent if activeFocusOnPress is false
+    edit->setFocusOnPress(false);
+    QCOMPARE(focusOnPressSpy.count(),1);
+    edit->setFocusOnPress(false);
+    QCOMPARE(focusOnPressSpy.count(),1);
+    edit->setFocus(false);
+    edit->setFocus(true);
+    QTest::mousePress(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QTest::mouseRelease(&view, Qt::LeftButton, 0, edit->mapToScene(QPointF(0,0)).toPoint());
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+
+    // one show input panel event should
+    // be set when openSoftwareInputPanel is called
+    edit->openSoftwareInputPanel();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+    ic.openInputPanelReceived = false;
+
+    // one close input panel event should
+    // be sent when closeSoftwareInputPanel is called
+    edit->closeSoftwareInputPanel();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, true);
+    ic.closeInputPanelReceived = false;
+
+    // set activeFocusOnPress back to true
+    edit->setFocusOnPress(true);
+    QCOMPARE(focusOnPressSpy.count(),2);
+    edit->setFocusOnPress(true);
+    QCOMPARE(focusOnPressSpy.count(),2);
+    edit->setFocus(false);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+    ic.closeInputPanelReceived = false;
+
+    // input panel should not re-open
+    // if focus has already been set
+    edit->setFocus(true);
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+    edit->setFocus(true);
+    QCOMPARE(ic.openInputPanelReceived, false);
+
+    // input method should be disabled
+    // if TextEdit loses focus
+    edit->setFocus(false);
+    QApplication::processEvents();
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // input method should not be enabled
+    // if TextEdit is read only.
+    edit->setReadOnly(true);
+    ic.openInputPanelReceived = false;
+    edit->setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+}
+
+void tst_qsgtextedit::geometrySignals()
+{
+    QDeclarativeComponent component(&engine, SRCDIR "/data/geometrySignals.qml");
+    QObject *o = component.create();
+    QVERIFY(o);
+    QCOMPARE(o->property("bindingWidth").toInt(), 400);
+    QCOMPARE(o->property("bindingHeight").toInt(), 500);
+    delete o;
+}
+
+void tst_qsgtextedit::pastingRichText_QTBUG_14003()
+{
+#ifndef QT_NO_CLIPBOARD
+    QString componentStr = "import QtQuick 2.0\nTextEdit { textFormat: TextEdit.PlainText }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGTextEdit *obj = qobject_cast<QSGTextEdit*>(component.create());
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->textFormat() == QSGTextEdit::PlainText);
+
+    QMimeData *mData = new QMimeData;
+    mData->setHtml("<font color=\"red\">Hello</font>");
+    QApplication::clipboard()->setMimeData(mData);
+
+    obj->paste();
+    QTRY_VERIFY(obj->text() == "");
+    QTRY_VERIFY(obj->textFormat() == QSGTextEdit::PlainText);
+#endif
+}
+
+void tst_qsgtextedit::implicitSize_data()
+{
+    QTest::addColumn<QString>("text");
+    QTest::addColumn<QString>("wrap");
+    QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.NoWrap";
+    QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "TextEdit.NoWrap";
+    QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.Wrap";
+    QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "TextEdit.Wrap";
+}
+
+void tst_qsgtextedit::implicitSize()
+{
+    QFETCH(QString, text);
+    QFETCH(QString, wrap);
+    QString componentStr = "import QtQuick 2.0\nTextEdit { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGTextEdit *textObject = qobject_cast<QSGTextEdit*>(textComponent.create());
+
+    QVERIFY(textObject->width() < textObject->implicitWidth());
+    QVERIFY(textObject->height() == textObject->implicitHeight());
+
+    textObject->resetWidth();
+    QVERIFY(textObject->width() == textObject->implicitWidth());
+    QVERIFY(textObject->height() == textObject->implicitHeight());
+}
+
+void tst_qsgtextedit::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 2.0; TextEdit { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; TextEdit { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_qsgtextedit::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("canPaste") << "property bool foo: canPaste"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: canPaste"
+        << "";
+
+    QTest::newRow("lineCount") << "property int foo: lineCount"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
+        << "";
+
+    QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection"
+        << "";
+
+    QTest::newRow("deselect") << "Component.onCompleted: deselect()"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: deselect"
+        << "";
+
+    QTest::newRow("onLinkActivated") << "onLinkActivated: {}"
+        << "QDeclarativeComponent: Component is not ready"
+        << ":1 \"TextEdit.onLinkActivated\" is not available in QtQuick 1.0.\n";
+}
+
+void tst_qsgtextedit::preeditMicroFocus()
+{
+    QString preeditText = "super";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputMethodEvent.qml"));
+    MyInputContext ic;
+    view.setInputContext(&ic);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+
+    QRect currentRect;
+    QRect previousRect = edit->inputMethodQuery(Qt::ImMicroFocus).toRect();
+
+    // Verify that the micro focus rect is positioned the same for position 0 as
+    // it would be if there was no preedit text.
+    ic.updateReceived = false;
+    ic.sendPreeditText(preeditText, 0);
+    currentRect = edit->inputMethodQuery(Qt::ImMicroFocus).toRect();
+    QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+    QCOMPARE(ic.updateReceived, true);
+#endif
+
+    // Verify that the micro focus rect moves to the left as the cursor position
+    // is incremented.
+    for (int i = 1; i <= 5; ++i) {
+        ic.updateReceived = false;
+        ic.sendPreeditText(preeditText, i);
+        currentRect = edit->inputMethodQuery(Qt::ImMicroFocus).toRect();
+        QVERIFY(previousRect.left() < currentRect.left());
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+        QCOMPARE(ic.updateReceived, true);
+#endif
+        previousRect = currentRect;
+    }
+
+    // Verify that if there is no preedit cursor then the micro focus rect is the
+    // same as it would be if it were positioned at the end of the preedit text.
+    ic.sendPreeditText(preeditText, 0);
+    ic.updateReceived = false;
+    ic.sendEvent(QInputMethodEvent(preeditText, QList<QInputMethodEvent::Attribute>()));
+    currentRect = edit->inputMethodQuery(Qt::ImMicroFocus).toRect();
+    QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+    QCOMPARE(ic.updateReceived, true);
+#endif
+}
+
+void tst_qsgtextedit::inputContextMouseHandler()
+{
+    QString text = "supercalifragisiticexpialidocious!";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputContext.qml"));
+    MyInputContext ic;
+    view.setInputContext(&ic);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+    edit->setCursorPosition(12);
+
+    QFontMetricsF fm(edit->font());
+    const qreal y = fm.height() / 2;
+
+    QPoint position2 = edit->mapToScene(QPointF(fm.width(text.mid(0, 2)), y)).toPoint();
+    QPoint position8 = edit->mapToScene(QPointF(fm.width(text.mid(0, 8)), y)).toPoint();
+    QPoint position20 = edit->mapToScene(QPointF(fm.width(text.mid(0, 20)), y)).toPoint();
+    QPoint position27 = edit->mapToScene(QPointF(fm.width(text.mid(0, 27)), y)).toPoint();
+    QPoint globalPosition2 = view.mapToGlobal(position2);
+    QPoint globalposition8 = view.mapToGlobal(position8);
+    QPoint globalposition20 = view.mapToGlobal(position20);
+    QPoint globalposition27 = view.mapToGlobal(position27);
+
+    ic.sendEvent(QInputMethodEvent(text.mid(12), QList<QInputMethodEvent::Attribute>()));
+
+    QTest::mouseDClick(&view, Qt::LeftButton, Qt::NoModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+
+    QTest::mousePress(&view, Qt::LeftButton, Qt::NoModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::None);
+
+    {   QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::MouseMove);
+    QCOMPARE(ic.eventPosition, position27);
+        QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);    // 15 is expected but some platforms may be off by one.
+    ic.eventType = QEvent::None;
+
+    QTest::mouseRelease(&view, Qt::LeftButton, Qt::NoModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    // And in the other direction.
+    QTest::mouseDClick(&view, Qt::LeftButton, Qt::ControlModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    QTest::mousePress(&view, Qt::RightButton, Qt::ControlModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::MouseMove);
+    QCOMPARE(ic.eventPosition, position20);
+    QCOMPARE(ic.eventGlobalPosition, globalposition20);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 7 && ic.cursor <= 9);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::None);
+
+    QTest::mouseRelease(&view, Qt::RightButton, Qt::ControlModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+}
+
+void tst_qsgtextedit::inputMethodComposing()
+{
+    QString text = "supercalifragisiticexpialidocious!";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputContext.qml"));
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextEdit *edit = qobject_cast<QSGTextEdit *>(view.rootObject());
+    QVERIFY(edit);
+    QSignalSpy spy(edit, SIGNAL(inputMethodComposingChanged()));
+    edit->setCursorPosition(12);
+
+    QCOMPARE(edit->isInputMethodComposing(), false);
+
+    {
+        QInputMethodEvent event(text.mid(3), QList<QInputMethodEvent::Attribute>());
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(edit->isInputMethodComposing(), true);
+    QCOMPARE(spy.count(), 1);
+
+    {
+        QInputMethodEvent event(text.mid(12), QList<QInputMethodEvent::Attribute>());
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(spy.count(), 1);
+
+    {
+        QInputMethodEvent event;
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(edit->isInputMethodComposing(), false);
+    QCOMPARE(spy.count(), 2);
+}
+
+void tst_qsgtextedit::cursorRectangleSize()
+{
+    QSGView *canvas = new QSGView(QUrl::fromLocalFile(SRCDIR "/data/CursorRect.qml"));
+    QVERIFY(canvas->rootObject() != 0);
+    canvas->show();
+    canvas->setFocus();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+
+    QSGTextEdit *textEdit = qobject_cast<QSGTextEdit *>(canvas->rootObject());
+    QVERIFY(textEdit != 0);
+    textEdit->setFocus(Qt::OtherFocusReason);
+    QRectF cursorRect = textEdit->positionToRectangle(textEdit->cursorPosition());
+    QRectF microFocusFromScene = canvas->inputMethodQuery(Qt::ImMicroFocus).toRectF();
+    QRectF microFocusFromApp= QApplication::focusWidget()->inputMethodQuery(Qt::ImMicroFocus).toRectF();
+
+    QCOMPARE(microFocusFromScene.size(), cursorRect.size());
+    QCOMPARE(microFocusFromApp.size(), cursorRect.size());
+
+    delete canvas;
+}
+
+QTEST_MAIN(tst_qsgtextedit)
+
+#include "tst_qsgtextedit.moc"
diff --git a/tests/auto/declarative/qsgtextinput/data/cursorTest.qml b/tests/auto/declarative/qsgtextinput/data/cursorTest.qml
new file mode 100644
index 0000000000..01858fba77
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/cursorTest.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    TextInput {  text: "Hello world!"; id: textInputObject; objectName: "textInputObject"
+        resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance";} } ] 
+        cursorDelegate: cursor
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/cursorVisible.qml b/tests/auto/declarative/qsgtextinput/data/cursorVisible.qml
new file mode 100644
index 0000000000..49e9386947
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/cursorVisible.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Item {
+    width: 100
+    height: 20
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/echoMode.qml b/tests/auto/declarative/qsgtextinput/data/echoMode.qml
new file mode 100644
index 0000000000..f8a6cf1c89
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/echoMode.qml
@@ -0,0 +1,11 @@
+import QtQuick 2.0
+
+Rectangle {
+    property QtObject myInput: input
+
+    width: 400; height: 200; color: "green"
+
+    TextInput { id: input; focus: true
+        text: "ABCDefgh"
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/geometrySignals.qml b/tests/auto/declarative/qsgtextinput/data/geometrySignals.qml
new file mode 100644
index 0000000000..90855a61cf
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/geometrySignals.qml
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Item {
+    width: 400; height: 500;
+    property int bindingWidth: text.width
+    property int bindingHeight: text.height
+
+    TextEdit {
+        id: text
+        anchors.fill: parent
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/halign_center.png b/tests/auto/declarative/qsgtextinput/data/halign_center.png
new file mode 100644
index 0000000000000000000000000000000000000000..53e09a8e5ba3919c71d89e0371097d3c9a7b5d6d
GIT binary patch
literal 293
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*yM
z%C7@)BIAeclRz3yc)B=-WHi3L>B!e)Ai@xswP*YN$=9bY6HsL3vM9aR#8GnaNxOr=
z(>d+??yTF_@Xbfbp!0wV(_{`bMibxUca#5q@tGcTT<)jguU)^`gKz1HmHS`G^ZIzM
z<JG)VsoGm-UkVTW)A8}6hS-$lW!9hKx{f}c|Mt$NwdZDCGO*uxt<R^ct4Cv7?~;@8
zX?D}=CVH}{3C?gy5Nh;fxm>=7uf#$X!&ay}793t8uIwhqtvp@v2GCCop00i_>zopr
E0GI7?p8x;=

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextinput/data/halign_left.png b/tests/auto/declarative/qsgtextinput/data/halign_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..247acbc9df0d48ec7fe3a531d6a0530cd84e20ef
GIT binary patch
literal 291
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*yM
z%C7@)BIAeclRz4ddAc};WHi3L>B!e)Ai{9*T1EbT_4V4mnoe0JQ&xT!b6LQxX3x^J
zbIPP=MUu6Q`_qLQJz3NQXSgJwF??o}<bL~X%fGWPf6DDguV2agXdZp1cQDKA<C%_k
z^UkHZNBX{8yQ1#Mr-~5nSHX`<?s#vk{<HONRM`&x<x{q)mr2QbUYsa+wQS3sKdH}(
zU-tMY8FU^{VVcb0qm*&~qng3PDM%u4DG;NHbFy6QXF2X$7s{sqeZ=7D>gTe~DWM4f
Divw;y

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextinput/data/halign_right.png b/tests/auto/declarative/qsgtextinput/data/halign_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..691bc75c89077c876aabd8b22d6a1f991499187c
GIT binary patch
literal 292
zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1SJ3YlwJl>%*9TgAsieWw;%dH0CG7CJR*yM
z%C7@)BIAeclRz4dd%8G=WHi3Ld6BEhK*AwWeDC&p|9yIk3ZlCLH_R>F*L}h8;9+@@
zSw-hg$LQ_NfAHN$$)NLq3e#i`G)5EW<aJjocP-WX{;_wDn1A^H1h2bC9==p>n;B$d
z{HWyoxowHdzJ%rQEsE(s+qQK_#thA^j|%>Ny_wVOlX-J~MDl|r785^4=<KgpS(W<i
z{iO~h<5&ED?3-{%bEZpzP@^Y{n&1pHhOpXQ#=!4#oGv%--35Ay!PC{xWt~$(69CT5
BbF}~f

literal 0
HcmV?d00001

diff --git a/tests/auto/declarative/qsgtextinput/data/horizontalAlignment.qml b/tests/auto/declarative/qsgtextinput/data/horizontalAlignment.qml
new file mode 100644
index 0000000000..e0fef4c11e
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/horizontalAlignment.qml
@@ -0,0 +1,22 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 70; height: 70;
+
+    property alias horizontalAlignment: text.horizontalAlignment
+    property string text: "Test"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 60
+        height: 20
+        color: "green"
+
+        TextInput {
+            id: text
+            anchors.fill: parent
+            text: top.text
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qsgtextinput/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000000..15fbabe28c
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: top
+    width: 200; height: 70;
+
+    property alias horizontalAlignment: text.horizontalAlignment
+    property string text: "اختبا"
+
+    Rectangle {
+        anchors.centerIn: parent
+        width: 180
+        height: 20
+        color: "green"
+
+        TextInput {
+            id: text
+            objectName: "text"
+            anchors.fill: parent
+            text: top.text
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/inputContext.qml b/tests/auto/declarative/qsgtextinput/data/inputContext.qml
new file mode 100644
index 0000000000..dfc80990c6
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/inputContext.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextInput {
+    width: 200
+    text: "supercalifra"
+    focus: true
+    cursorPosition: 12
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/inputMethodEvent.qml b/tests/auto/declarative/qsgtextinput/data/inputMethodEvent.qml
new file mode 100644
index 0000000000..f8446ab7b9
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/inputMethodEvent.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/inputmethods.qml b/tests/auto/declarative/qsgtextinput/data/inputmethods.qml
new file mode 100644
index 0000000000..711e89144c
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/inputmethods.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput {
+    text: "Hello world!"
+    inputMethodHints: Qt.ImhNoPredictiveText
+    Keys.onLeftPressed: {}
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/masks.qml b/tests/auto/declarative/qsgtextinput/data/masks.qml
new file mode 100644
index 0000000000..589b6a3c15
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/masks.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput{
+    focus: true
+    objectName: "myInput"
+    inputMask: "HHHHhhhh; "
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/maxLength.qml b/tests/auto/declarative/qsgtextinput/data/maxLength.qml
new file mode 100644
index 0000000000..cca537ed6b
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/maxLength.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput{
+    focus: true
+    objectName: "myInput"
+    maximumLength: 10
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/mouseselection_true.qml b/tests/auto/declarative/qsgtextinput/data/mouseselection_true.qml
new file mode 100644
index 0000000000..974041b04a
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/mouseselection_true.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_characters.qml
new file mode 100644
index 0000000000..f7c658b618
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_characters.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+    mouseSelectionMode: TextInput.SelectCharacters
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_default.qml b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_default.qml
new file mode 100644
index 0000000000..974041b04a
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_default.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_words.qml b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_words.qml
new file mode 100644
index 0000000000..20e777e470
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/mouseselectionmode_words.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+    text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    selectByMouse: true
+    mouseSelectionMode: TextInput.SelectWords
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/navigation.qml b/tests/auto/declarative/qsgtextinput/data/navigation.qml
new file mode 100644
index 0000000000..3a7d07b3c7
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/navigation.qml
@@ -0,0 +1,24 @@
+import QtQuick 2.0
+
+Rectangle {
+    property variant myInput: input
+
+    width: 800; height: 600; color: "blue"
+
+    Item { 
+        id: firstItem;
+        KeyNavigation.right: input
+    }
+
+    TextInput { id: input; focus: true
+        text: "Needs some text"
+        KeyNavigation.left: firstItem
+        KeyNavigation.right: lastItem
+        KeyNavigation.up: firstItem
+        KeyNavigation.down: lastItem
+    }
+    Item {
+        id: lastItem 
+        KeyNavigation.left: input
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/openInputPanel.qml b/tests/auto/declarative/qsgtextinput/data/openInputPanel.qml
new file mode 100644
index 0000000000..3924b2ab99
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/openInputPanel.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+TextInput {
+    text: "Hello world"
+    focus: false
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/positionAt.qml b/tests/auto/declarative/qsgtextinput/data/positionAt.qml
new file mode 100644
index 0000000000..7611376e13
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/positionAt.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+TextInput{
+    focus: true
+    objectName: "myInput"
+    width: 50
+    text: "This is a long piece of text"
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/preeditAutoScroll.qml b/tests/auto/declarative/qsgtextinput/data/preeditAutoScroll.qml
new file mode 100644
index 0000000000..9d98a2e220
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/preeditAutoScroll.qml
@@ -0,0 +1,7 @@
+import QtQuick 2.0
+
+TextInput {
+    focus: true
+    text: "super"
+    autoScroll: true
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/readOnly.qml b/tests/auto/declarative/qsgtextinput/data/readOnly.qml
new file mode 100644
index 0000000000..9cda7fbd1d
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/readOnly.qml
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Rectangle {
+    property variant myInput: input
+
+    width: 800; height: 600; color: "blue"
+
+    TextInput { id: input; focus: true
+        readOnly: true
+        text: "I am the very model of a modern major general.\n"
+    }
+}
diff --git a/tests/auto/declarative/qsgtextinput/data/validators.qml b/tests/auto/declarative/qsgtextinput/data/validators.qml
new file mode 100644
index 0000000000..0a074ce7dc
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/data/validators.qml
@@ -0,0 +1,22 @@
+import QtQuick 2.0
+
+Item {
+    property variant intInput: intInput
+    property variant dblInput: dblInput
+    property variant strInput: strInput
+
+    width: 800; height: 600;
+
+    Column{
+        TextInput { id: intInput;
+            validator: IntValidator{top: 11; bottom: 2}
+        }
+        TextInput { id: dblInput;
+            validator: DoubleValidator{top: 12.12; bottom: 2.93; decimals: 2; notation: DoubleValidator.StandardNotation}
+        }
+        TextInput { id: strInput;
+            validator: RegExpValidator { regExp: /[a-zA-z]{2,4}/ }
+        }
+    }
+        
+}
diff --git a/tests/auto/declarative/qsgtextinput/qsgtextinput.pro b/tests/auto/declarative/qsgtextinput/qsgtextinput.pro
new file mode 100644
index 0000000000..599c2a8e43
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/qsgtextinput.pro
@@ -0,0 +1,14 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgtextinput.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
diff --git a/tests/auto/declarative/qsgtextinput/tst_qsgtextinput.cpp b/tests/auto/declarative/qsgtextinput/tst_qsgtextinput.cpp
new file mode 100644
index 0000000000..b349de9800
--- /dev/null
+++ b/tests/auto/declarative/qsgtextinput/tst_qsgtextinput.cpp
@@ -0,0 +1,2471 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtTest/QSignalSpy>
+#include "../../../shared/util.h"
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QFile>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsgtextinput_p.h>
+#include <private/qsgtextinput_p_p.h>
+#include <QDebug>
+#include <QDir>
+#include <QStyle>
+#include <QInputContext>
+#include <private/qapplication_p.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+Q_DECLARE_METATYPE(QSGTextInput::SelectionMode)
+
+QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual)
+{
+    // XXX This will be replaced by some clever persistent platform image store.
+    QString persistent_dir = SRCDIR "/data";
+    QString arch = "unknown-architecture"; // QTest needs to help with this.
+
+    QString expectfile = persistent_dir + QDir::separator() + filebasename + "-" + arch + ".png";
+
+    if (!QFile::exists(expectfile)) {
+        actual.save(expectfile);
+        qWarning() << "created" << expectfile;
+    }
+
+    return expectfile;
+}
+
+class tst_qsgtextinput : public QObject
+
+{
+    Q_OBJECT
+public:
+    tst_qsgtextinput();
+
+private slots:
+
+    void text();
+    void width();
+    void font();
+    void color();
+    void selection();
+    void isRightToLeft_data();
+    void isRightToLeft();
+    void moveCursorSelection_data();
+    void moveCursorSelection();
+    void moveCursorSelectionSequence_data();
+    void moveCursorSelectionSequence();
+    void dragMouseSelection();
+    void mouseSelectionMode_data();
+    void mouseSelectionMode();
+
+    void horizontalAlignment_data();
+    void horizontalAlignment();
+    void horizontalAlignment_RightToLeft();
+
+    void positionAt();
+
+    void maxLength();
+    void masks();
+    void validators();
+    void inputMethods();
+
+    void passwordCharacter();
+    void cursorDelegate();
+    void cursorVisible();
+    void cursorRectangle();
+    void navigation();
+    void navigation_RTL();
+    void copyAndPaste();
+    void canPasteEmpty();
+    void canPaste();
+    void readOnly();
+
+    void openInputPanelOnClick();
+    void openInputPanelOnFocus();
+    void setHAlignClearCache();
+    void focusOutClearSelection();
+
+    void echoMode();
+    void geometrySignals();
+    void testQtQuick11Attributes();
+    void testQtQuick11Attributes_data();
+
+    void preeditAutoScroll();
+    void preeditMicroFocus();
+    void inputContextMouseHandler();
+    void inputMethodComposing();
+    void cursorRectangleSize();
+
+private:
+    void simulateKey(QSGView *, int key);
+
+    QDeclarativeEngine engine;
+    QStringList standard;
+    QStringList colorStrings;
+};
+
+tst_qsgtextinput::tst_qsgtextinput()
+{
+    standard << "the quick brown fox jumped over the lazy dog"
+        << "It's supercalifragisiticexpialidocious!"
+        << "Hello, world!"
+        << "!dlrow ,olleH"
+        << " spacey   text ";
+
+    colorStrings << "aliceblue"
+                 << "antiquewhite"
+                 << "aqua"
+                 << "darkkhaki"
+                 << "darkolivegreen"
+                 << "dimgray"
+                 << "palevioletred"
+                 << "lightsteelblue"
+                 << "#000000"
+                 << "#AAAAAA"
+                 << "#FFFFFF"
+                 << "#2AC05F";
+}
+
+void tst_qsgtextinput::text()
+{
+    {
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData("import QtQuick 2.0\nTextInput {  text: \"\"  }", QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->text(), QString(""));
+
+        delete textinputObject;
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextInput { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->text(), standard.at(i));
+
+        delete textinputObject;
+    }
+
+}
+
+void tst_qsgtextinput::width()
+{
+    // uses Font metrics to find the width for standard
+    {
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData("import QtQuick 2.0\nTextInput {  text: \"\" }", QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->width(), 0.0);
+
+        delete textinputObject;
+    }
+
+    for (int i = 0; i < standard.size(); i++)
+    {
+        QFont f;
+        QFontMetricsF fm(f);
+        qreal metricWidth = fm.width(standard.at(i));
+
+        QString componentStr = "import QtQuick 2.0\nTextInput { text: \"" + standard.at(i) + "\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        int delta = abs(int(int(textinputObject->width()) - metricWidth));
+        QVERIFY(delta <= 3.0); // As best as we can hope for cross-platform.
+
+        delete textinputObject;
+    }
+}
+
+void tst_qsgtextinput::font()
+{
+    //test size, then bold, then italic, then family
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  font.pointSize: 40; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->font().pointSize(), 40);
+        QCOMPARE(textinputObject->font().bold(), false);
+        QCOMPARE(textinputObject->font().italic(), false);
+
+        delete textinputObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  font.bold: true; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->font().bold(), true);
+        QCOMPARE(textinputObject->font().italic(), false);
+
+        delete textinputObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  font.italic: true; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->font().italic(), true);
+        QCOMPARE(textinputObject->font().bold(), false);
+
+        delete textinputObject;
+    }
+ 
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  font.family: \"Helvetica\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->font().family(), QString("Helvetica"));
+        QCOMPARE(textinputObject->font().bold(), false);
+        QCOMPARE(textinputObject->font().italic(), false);
+
+        delete textinputObject;
+    }
+
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  font.family: \"\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->font().family(), QString(""));
+
+        delete textinputObject;
+    }
+}
+
+void tst_qsgtextinput::color()
+{
+    //test color
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->color(), QColor(colorStrings.at(i)));
+
+        delete textinputObject;
+    }
+
+    //test selection color
+    for (int i = 0; i < colorStrings.size(); i++)
+    {
+        QString componentStr = "import QtQuick 2.0\nTextInput {  selectionColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->selectionColor(), QColor(colorStrings.at(i)));
+
+        delete textinputObject;
+    }
+
+    //test selected text color
+    for (int i = 0; i < colorStrings.size(); i++)
+    { 
+        QString componentStr = "import QtQuick 2.0\nTextInput {  selectedTextColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->selectedTextColor(), QColor(colorStrings.at(i)));
+
+        delete textinputObject;
+    }
+
+    {
+        QString colorStr = "#AA001234";
+        QColor testColor("#001234");
+        testColor.setAlpha(170);
+
+        QString componentStr = "import QtQuick 2.0\nTextInput {  color: \"" + colorStr + "\"; text: \"Hello World\" }";
+        QDeclarativeComponent textinputComponent(&engine);
+        textinputComponent.setData(componentStr.toLatin1(), QUrl());
+        QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+
+        QVERIFY(textinputObject != 0);
+        QCOMPARE(textinputObject->color(), testColor);
+
+        delete textinputObject;
+    }
+}
+
+void tst_qsgtextinput::selection()
+{
+    QString testStr = standard[0];
+    QString componentStr = "import QtQuick 2.0\nTextInput {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent textinputComponent(&engine);
+    textinputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+    QVERIFY(textinputObject != 0);
+
+
+    //Test selection follows cursor
+    for(int i=0; i<= testStr.size(); i++) {
+        textinputObject->setCursorPosition(i);
+        QCOMPARE(textinputObject->cursorPosition(), i);
+        QCOMPARE(textinputObject->selectionStart(), i);
+        QCOMPARE(textinputObject->selectionEnd(), i);
+        QVERIFY(textinputObject->selectedText().isNull());
+    }
+
+    textinputObject->setCursorPosition(0);
+    QVERIFY(textinputObject->cursorPosition() == 0);
+    QVERIFY(textinputObject->selectionStart() == 0);
+    QVERIFY(textinputObject->selectionEnd() == 0);
+    QVERIFY(textinputObject->selectedText().isNull());
+
+    // Verify invalid positions are ignored.
+    textinputObject->setCursorPosition(-1);
+    QVERIFY(textinputObject->cursorPosition() == 0);
+    QVERIFY(textinputObject->selectionStart() == 0);
+    QVERIFY(textinputObject->selectionEnd() == 0);
+    QVERIFY(textinputObject->selectedText().isNull());
+
+    textinputObject->setCursorPosition(textinputObject->text().count()+1);
+    QVERIFY(textinputObject->cursorPosition() == 0);
+    QVERIFY(textinputObject->selectionStart() == 0);
+    QVERIFY(textinputObject->selectionEnd() == 0);
+    QVERIFY(textinputObject->selectedText().isNull());
+
+    //Test selection
+    for(int i=0; i<= testStr.size(); i++) {
+        textinputObject->select(0,i);
+        QCOMPARE(testStr.mid(0,i), textinputObject->selectedText());
+    }
+    for(int i=0; i<= testStr.size(); i++) {
+        textinputObject->select(i,testStr.size());
+        QCOMPARE(testStr.mid(i,testStr.size()-i), textinputObject->selectedText());
+    }
+
+    textinputObject->setCursorPosition(0);
+    QVERIFY(textinputObject->cursorPosition() == 0);
+    QVERIFY(textinputObject->selectionStart() == 0);
+    QVERIFY(textinputObject->selectionEnd() == 0);
+    QVERIFY(textinputObject->selectedText().isNull());
+
+    //Test Error Ignoring behaviour
+    textinputObject->setCursorPosition(0);
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(-10,0);
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(100,110);
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(0,-10);
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(0,100);
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(0,10);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+    textinputObject->select(-10,10);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+    textinputObject->select(100,101);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+    textinputObject->select(0,-10);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+    textinputObject->select(0,100);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+
+    textinputObject->deselect();
+    QVERIFY(textinputObject->selectedText().isNull());
+    textinputObject->select(0,10);
+    QVERIFY(textinputObject->selectedText().size() == 10);
+    textinputObject->deselect();
+    QVERIFY(textinputObject->selectedText().isNull());
+
+    delete textinputObject;
+}
+
+void tst_qsgtextinput::isRightToLeft_data()
+{
+    QTest::addColumn<QString>("text");
+    QTest::addColumn<bool>("emptyString");
+    QTest::addColumn<bool>("firstCharacter");
+    QTest::addColumn<bool>("lastCharacter");
+    QTest::addColumn<bool>("middleCharacter");
+    QTest::addColumn<bool>("startString");
+    QTest::addColumn<bool>("midString");
+    QTest::addColumn<bool>("endString");
+
+    const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647};
+    QTest::newRow("Empty") << "" << false << false << false << false << false << false << false;
+    QTest::newRow("Neutral") << "23244242" << false << false << false << false << false << false << false;
+    QTest::newRow("LTR") << "Hello world" << false << false << false << false << false << false << false;
+    QTest::newRow("RTL") << QString::fromUtf16(arabic_str, 11) << false << true << true << true << true << true << true;
+    QTest::newRow("Bidi RTL + LTR + RTL") << QString::fromUtf16(arabic_str, 11) + QString("Hello world") + QString::fromUtf16(arabic_str, 11) << false << true << true << false << true << true << true;
+    QTest::newRow("Bidi LTR + RTL + LTR") << QString("Hello world") + QString::fromUtf16(arabic_str, 11) + QString("Hello world") << false << false << false << true << false << false << false;
+}
+
+void tst_qsgtextinput::isRightToLeft()
+{
+    QFETCH(QString, text);
+    QFETCH(bool, emptyString);
+    QFETCH(bool, firstCharacter);
+    QFETCH(bool, lastCharacter);
+    QFETCH(bool, middleCharacter);
+    QFETCH(bool, startString);
+    QFETCH(bool, midString);
+    QFETCH(bool, endString);
+
+    QSGTextInput textInput;
+    textInput.setText(text);
+
+    // first test that the right string is delivered to the QString::isRightToLeft()
+    QCOMPARE(textInput.isRightToLeft(0,0), text.mid(0,0).isRightToLeft());
+    QCOMPARE(textInput.isRightToLeft(0,1), text.mid(0,1).isRightToLeft());
+    QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), text.mid(text.count()-2, text.count()-1).isRightToLeft());
+    QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), text.mid(text.count()/2, text.count()/2 + 1).isRightToLeft());
+    QCOMPARE(textInput.isRightToLeft(0,text.count()/4), text.mid(0,text.count()/4).isRightToLeft());
+    QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), text.mid(text.count()/4,3*text.count()/4).isRightToLeft());
+    if (text.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start.");
+    QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), text.mid(3*text.count()/4,text.count()-1).isRightToLeft());
+
+    // then test that the feature actually works
+    QCOMPARE(textInput.isRightToLeft(0,0), emptyString);
+    QCOMPARE(textInput.isRightToLeft(0,1), firstCharacter);
+    QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), lastCharacter);
+    QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), middleCharacter);
+    QCOMPARE(textInput.isRightToLeft(0,text.count()/4), startString);
+    QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), midString);
+    if (text.isEmpty())
+        QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start.");
+    QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), endString);
+}
+
+void tst_qsgtextinput::moveCursorSelection_data()
+{
+    QTest::addColumn<QString>("testStr");
+    QTest::addColumn<int>("cursorPosition");
+    QTest::addColumn<int>("movePosition");
+    QTest::addColumn<QSGTextInput::SelectionMode>("mode");
+    QTest::addColumn<int>("selectionStart");
+    QTest::addColumn<int>("selectionEnd");
+    QTest::addColumn<bool>("reversible");
+
+    // () contains the text selected by the cursor.
+    // <> contains the actual selection.
+
+    QTest::newRow("(t)he|characters")
+            << standard[0] << 0 << 1 << QSGTextInput::SelectCharacters << 0 << 1 << true;
+    QTest::newRow("do(g)|characters")
+            << standard[0] << 43 << 44 << QSGTextInput::SelectCharacters << 43 << 44 << true;
+    QTest::newRow("jum(p)ed|characters")
+            << standard[0] << 23 << 24 << QSGTextInput::SelectCharacters << 23 << 24 << true;
+    QTest::newRow("jumped( )over|characters")
+            << standard[0] << 26 << 27 << QSGTextInput::SelectCharacters << 26 << 27 << true;
+    QTest::newRow("(the )|characters")
+            << standard[0] << 0 << 4 << QSGTextInput::SelectCharacters << 0 << 4 << true;
+    QTest::newRow("( dog)|characters")
+            << standard[0] << 40 << 44 << QSGTextInput::SelectCharacters << 40 << 44 << true;
+    QTest::newRow("( jumped )|characters")
+            << standard[0] << 19 << 27 << QSGTextInput::SelectCharacters << 19 << 27 << true;
+    QTest::newRow("th(e qu)ick|characters")
+            << standard[0] << 2 << 6 << QSGTextInput::SelectCharacters << 2 << 6 << true;
+    QTest::newRow("la(zy d)og|characters")
+            << standard[0] << 38 << 42 << QSGTextInput::SelectCharacters << 38 << 42 << true;
+    QTest::newRow("jum(ped ov)er|characters")
+            << standard[0] << 23 << 29 << QSGTextInput::SelectCharacters << 23 << 29 << true;
+    QTest::newRow("()the|characters")
+            << standard[0] << 0 << 0 << QSGTextInput::SelectCharacters << 0 << 0 << true;
+    QTest::newRow("dog()|characters")
+            << standard[0] << 44 << 44 << QSGTextInput::SelectCharacters << 44 << 44 << true;
+    QTest::newRow("jum()ped|characters")
+            << standard[0] << 23 << 23 << QSGTextInput::SelectCharacters << 23 << 23 << true;
+
+    QTest::newRow("<(t)he>|words")
+            << standard[0] << 0 << 1 << QSGTextInput::SelectWords << 0 << 3 << true;
+    QTest::newRow("<do(g)>|words")
+            << standard[0] << 43 << 44 << QSGTextInput::SelectWords << 41 << 44 << true;
+    QTest::newRow("<jum(p)ed>|words")
+            << standard[0] << 23 << 24 << QSGTextInput::SelectWords << 20 << 26 << true;
+    QTest::newRow("<jumped( )>over|words,ltr")
+            << standard[0] << 26 << 27 << QSGTextInput::SelectWords << 20 << 27 << false;
+    QTest::newRow("jumped<( )over>|words,rtl")
+            << standard[0] << 27 << 26 << QSGTextInput::SelectWords << 26 << 31 << false;
+    QTest::newRow("<(the )>quick|words,ltr")
+            << standard[0] << 0 << 4 << QSGTextInput::SelectWords << 0 << 4 << false;
+    QTest::newRow("<(the )quick>|words,rtl")
+            << standard[0] << 4 << 0 << QSGTextInput::SelectWords << 0 << 9 << false;
+    QTest::newRow("<lazy( dog)>|words,ltr")
+            << standard[0] << 40 << 44 << QSGTextInput::SelectWords << 36 << 44 << false;
+    QTest::newRow("lazy<( dog)>|words,rtl")
+            << standard[0] << 44 << 40 << QSGTextInput::SelectWords << 40 << 44 << false;
+    QTest::newRow("<fox( jumped )>over|words,ltr")
+            << standard[0] << 19 << 27 << QSGTextInput::SelectWords << 16 << 27 << false;
+    QTest::newRow("fox<( jumped )over>|words,rtl")
+            << standard[0] << 27 << 19 << QSGTextInput::SelectWords << 19 << 31 << false;
+    QTest::newRow("<th(e qu)ick>|words")
+            << standard[0] << 2 << 6 << QSGTextInput::SelectWords << 0 << 9 << true;
+    QTest::newRow("<la(zy d)og|words>")
+            << standard[0] << 38 << 42 << QSGTextInput::SelectWords << 36 << 44 << true;
+    QTest::newRow("<jum(ped ov)er>|words")
+            << standard[0] << 23 << 29 << QSGTextInput::SelectWords << 20 << 31 << true;
+    QTest::newRow("<()>the|words")
+            << standard[0] << 0 << 0 << QSGTextInput::SelectWords << 0 << 0 << true;
+    QTest::newRow("dog<()>|words")
+            << standard[0] << 44 << 44 << QSGTextInput::SelectWords << 44 << 44 << true;
+    QTest::newRow("jum<()>ped|words")
+            << standard[0] << 23 << 23 << QSGTextInput::SelectWords << 23 << 23 << true;
+
+    QTest::newRow("Hello<(,)> |words")
+            << standard[2] << 5 << 6 << QSGTextInput::SelectWords << 5 << 6 << true;
+    QTest::newRow("Hello<(, )>world|words,ltr")
+            << standard[2] << 5 << 7 << QSGTextInput::SelectWords << 5 << 7 << false;
+    QTest::newRow("Hello<(, )world>|words,rtl")
+            << standard[2] << 7 << 5 << QSGTextInput::SelectWords << 5 << 12 << false;
+    QTest::newRow("<Hel(lo, )>world|words,ltr")
+            << standard[2] << 3 << 7 << QSGTextInput::SelectWords << 0 << 7 << false;
+    QTest::newRow("<Hel(lo, )world>|words,rtl")
+            << standard[2] << 7 << 3 << QSGTextInput::SelectWords << 0 << 12 << false;
+    QTest::newRow("<Hel(lo)>,|words")
+            << standard[2] << 3 << 5 << QSGTextInput::SelectWords << 0 << 5 << true;
+    QTest::newRow("Hello<()>,|words")
+            << standard[2] << 5 << 5 << QSGTextInput::SelectWords << 5 << 5 << true;
+    QTest::newRow("Hello,<()>|words")
+            << standard[2] << 6 << 6 << QSGTextInput::SelectWords << 6 << 6 << true;
+    QTest::newRow("Hello<,( )>world|words,ltr")
+            << standard[2] << 6 << 7 << QSGTextInput::SelectWords << 5 << 7 << false;
+    QTest::newRow("Hello,<( )world>|words,rtl")
+            << standard[2] << 7 << 6 << QSGTextInput::SelectWords << 6 << 12 << false;
+    QTest::newRow("Hello<,( world)>|words,ltr")
+            << standard[2] << 6 << 12 << QSGTextInput::SelectWords << 5 << 12 << false;
+    QTest::newRow("Hello,<( world)>|words,rtl")
+            << standard[2] << 12 << 6 << QSGTextInput::SelectWords << 6 << 12 << false;
+    QTest::newRow("Hello<,( world!)>|words,ltr")
+            << standard[2] << 6 << 13 << QSGTextInput::SelectWords << 5 << 13 << false;
+    QTest::newRow("Hello,<( world!)>|words,rtl")
+            << standard[2] << 13 << 6 << QSGTextInput::SelectWords << 6 << 13 << false;
+    QTest::newRow("Hello<(, world!)>|words")
+            << standard[2] << 5 << 13 << QSGTextInput::SelectWords << 5 << 13 << true;
+    // Fails due to an issue with QTextBoundaryFinder and punctuation at the end of strings.
+    // QTBUG-11365
+    // QTest::newRow("world<(!)>|words")
+    //         << standard[2] << 12 << 13 << QSGTextInput::SelectWords << 12 << 13 << true;
+    QTest::newRow("world!<()>)|words")
+            << standard[2] << 13 << 13 << QSGTextInput::SelectWords << 13 << 13 << true;
+    QTest::newRow("world<()>!)|words")
+            << standard[2] << 12 << 12 << QSGTextInput::SelectWords << 12 << 12 << true;
+
+    QTest::newRow("<(,)>olleH |words")
+            << standard[3] << 7 << 8 << QSGTextInput::SelectWords << 7 << 8 << true;
+    QTest::newRow("<dlrow( ,)>olleH|words,ltr")
+            << standard[3] << 6 << 8 << QSGTextInput::SelectWords << 1 << 8 << false;
+    QTest::newRow("dlrow<( ,)>olleH|words,rtl")
+            << standard[3] << 8 << 6 << QSGTextInput::SelectWords << 6 << 8 << false;
+    QTest::newRow("<dlrow( ,ol)leH>|words,ltr")
+            << standard[3] << 6 << 10 << QSGTextInput::SelectWords << 1 << 13 << false;
+    QTest::newRow("dlrow<( ,ol)leH>|words,rtl")
+            << standard[3] << 10 << 6 << QSGTextInput::SelectWords << 6 << 13 << false;
+    QTest::newRow(",<(ol)leH>,|words")
+            << standard[3] << 8 << 10 << QSGTextInput::SelectWords << 8 << 13 << true;
+    QTest::newRow(",<()>olleH|words")
+            << standard[3] << 8 << 8 << QSGTextInput::SelectWords << 8 << 8 << true;
+    QTest::newRow("<()>,olleH|words")
+            << standard[3] << 7 << 7 << QSGTextInput::SelectWords << 7 << 7 << true;
+    QTest::newRow("<dlrow( )>,olleH|words,ltr")
+            << standard[3] << 6 << 7 << QSGTextInput::SelectWords << 1 << 7 << false;
+    QTest::newRow("dlrow<( ),>olleH|words,rtl")
+            << standard[3] << 7 << 6 << QSGTextInput::SelectWords << 6 << 8 << false;
+    QTest::newRow("<(dlrow )>,olleH|words,ltr")
+            << standard[3] << 1 << 7 << QSGTextInput::SelectWords << 1 << 7 << false;
+    QTest::newRow("<(dlrow ),>olleH|words,rtl")
+            << standard[3] << 7 << 1 << QSGTextInput::SelectWords << 1 << 8 << false;
+    QTest::newRow("<(!dlrow )>,olleH|words,ltr")
+            << standard[3] << 0 << 7 << QSGTextInput::SelectWords << 0 << 7 << false;
+    QTest::newRow("<(!dlrow ),>olleH|words,rtl")
+            << standard[3] << 7 << 0 << QSGTextInput::SelectWords << 0 << 8 << false;
+    QTest::newRow("(!dlrow ,)olleH|words")
+            << standard[3] << 0 << 8 << QSGTextInput::SelectWords << 0 << 8 << true;
+    QTest::newRow("<(!)>dlrow|words")
+            << standard[3] << 0 << 1 << QSGTextInput::SelectWords << 0 << 1 << true;
+    QTest::newRow("<()>!dlrow|words")
+            << standard[3] << 0 << 0 << QSGTextInput::SelectWords << 0 << 0 << true;
+    QTest::newRow("!<()>dlrow|words")
+            << standard[3] << 1 << 1 << QSGTextInput::SelectWords << 1 << 1 << true;
+
+    QTest::newRow(" <s(pac)ey>   text |words")
+            << standard[4] << 1 << 4 << QSGTextInput::SelectWords << 1 << 7 << true;
+    QTest::newRow(" spacey   <t(ex)t> |words")
+            << standard[4] << 11 << 13 << QSGTextInput::SelectWords << 10 << 14 << false; // Should be reversible. QTBUG-11365
+    QTest::newRow("<( )>spacey   text |words|ltr")
+            << standard[4] << 0 << 1 << QSGTextInput::SelectWords << 0 << 1 << false;
+    QTest::newRow("<( )spacey>   text |words|rtl")
+            << standard[4] << 1 << 0 << QSGTextInput::SelectWords << 0 << 7 << false;
+    QTest::newRow("spacey   <text( )>|words|ltr")
+            << standard[4] << 14 << 15 << QSGTextInput::SelectWords << 10 << 15 << false;
+//    QTBUG-11365
+//    QTest::newRow("spacey   text<( )>|words|rtl")
+//            << standard[4] << 15 << 14 << QSGTextInput::SelectWords << 14 << 15 << false;
+    QTest::newRow("<()> spacey   text |words")
+            << standard[4] << 0 << 0 << QSGTextInput::SelectWords << 0 << 0 << false;
+    QTest::newRow(" spacey   text <()>|words")
+            << standard[4] << 15 << 15 << QSGTextInput::SelectWords << 15 << 15 << false;
+}
+
+void tst_qsgtextinput::moveCursorSelection()
+{
+    QFETCH(QString, testStr);
+    QFETCH(int, cursorPosition);
+    QFETCH(int, movePosition);
+    QFETCH(QSGTextInput::SelectionMode, mode);
+    QFETCH(int, selectionStart);
+    QFETCH(int, selectionEnd);
+    QFETCH(bool, reversible);
+
+    QString componentStr = "import QtQuick 2.0\nTextInput {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent textinputComponent(&engine);
+    textinputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+    QVERIFY(textinputObject != 0);
+
+    textinputObject->setCursorPosition(cursorPosition);
+    textinputObject->moveCursorSelection(movePosition, mode);
+
+    QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+    QCOMPARE(textinputObject->selectionStart(), selectionStart);
+    QCOMPARE(textinputObject->selectionEnd(), selectionEnd);
+
+    if (reversible) {
+        textinputObject->setCursorPosition(movePosition);
+        textinputObject->moveCursorSelection(cursorPosition, mode);
+
+        QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+        QCOMPARE(textinputObject->selectionStart(), selectionStart);
+        QCOMPARE(textinputObject->selectionEnd(), selectionEnd);
+    }
+
+    delete textinputObject;
+}
+
+void tst_qsgtextinput::moveCursorSelectionSequence_data()
+{
+    QTest::addColumn<QString>("testStr");
+    QTest::addColumn<int>("cursorPosition");
+    QTest::addColumn<int>("movePosition1");
+    QTest::addColumn<int>("movePosition2");
+    QTest::addColumn<int>("selection1Start");
+    QTest::addColumn<int>("selection1End");
+    QTest::addColumn<int>("selection2Start");
+    QTest::addColumn<int>("selection2End");
+
+    // () contains the text selected by the cursor.
+    // <> contains the actual selection.
+    // ^ is the revised cursor position.
+    // {} contains the revised selection.
+
+    QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 17
+            << 4 << 15
+            << 4 << 19;
+    QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 17
+            << 9 << 15
+            << 10 << 19;
+    QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 16
+            << 4 << 15
+            << 4 << 16;
+    QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 16
+            << 9 << 15
+            << 10 << 16;
+    QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr")
+            << standard[0]
+            << 9 << 13 << 15
+            << 4 << 15
+            << 4 << 15;
+    QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl")
+            << standard[0]
+            << 13 << 9 << 15
+            << 9 << 15
+            << 10 << 15;
+    QTest::newRow("the {<quick() ^}bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 10
+            << 4 << 15
+            << 4 << 10;
+    QTest::newRow("the quick<( {^bro)wn>} fox|rtl")
+            << standard[0]
+            << 13 << 9 << 10
+            << 9 << 15
+            << 10 << 15;
+    QTest::newRow("the {<quick^}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 9
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the quick{<(^ bro)wn>} fox|rtl")
+            << standard[0]
+            << 13 << 9 << 9
+            << 9 << 15
+            << 9 << 15;
+    QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 7
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 7
+            << 9 << 15
+            << 4 << 15;
+    QTest::newRow("the {<^quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 4
+            << 4 << 15
+            << 4 << 9;
+    QTest::newRow("the {<^quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 4
+            << 9 << 15
+            << 4 << 15;
+    QTest::newRow("the{^ <quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 3
+            << 4 << 15
+            << 3 << 9;
+    QTest::newRow("the{^ <quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 3
+            << 9 << 15
+            << 3 << 15;
+    QTest::newRow("{t^he <quick}( bro)wn> fox|ltr")
+            << standard[0]
+            << 9 << 13 << 1
+            << 4 << 15
+            << 0 << 9;
+    QTest::newRow("{t^he <quick}( bro)wn> fox|rtl")
+            << standard[0]
+            << 13 << 9 << 1
+            << 9 << 15
+            << 0 << 15;
+
+    QTest::newRow("{<He(ll)o>, w^orld}!|ltr")
+            << standard[2]
+            << 2 << 4 << 8
+            << 0 << 5
+            << 0 << 12;
+    QTest::newRow("{<He(ll)o>, w^orld}!|rtl")
+            << standard[2]
+            << 4 << 2 << 8
+            << 0 << 5
+            << 0 << 12;
+
+    QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr")
+            << standard[3]
+            << 9 << 11 << 5
+            << 8 << 13
+            << 1 << 13;
+    QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl")
+            << standard[3]
+            << 11 << 9 << 5
+            << 8 << 13
+            << 1 << 13;
+
+    QTest::newRow("{<(^} sp)acey>   text |ltr")
+            << standard[4]
+            << 0 << 3 << 0
+            << 0 << 7
+            << 0 << 0;
+    QTest::newRow("{<( ^}sp)acey>   text |ltr")
+            << standard[4]
+            << 0 << 3 << 1
+            << 0 << 7
+            << 0 << 1;
+    QTest::newRow("<( {s^p)acey>}   text |rtl")
+            << standard[4]
+            << 3 << 0 << 2
+            << 0 << 7
+            << 1 << 7;
+    QTest::newRow("<( {^sp)acey>}   text |rtl")
+            << standard[4]
+            << 3 << 0 << 1
+            << 0 << 7
+            << 1 << 7;
+
+    QTest::newRow(" spacey   <te(xt {^)>}|rtl")
+            << standard[4]
+            << 15 << 12 << 15
+            << 10 << 15
+            << 15 << 15;
+//    QTBUG-11365
+//    QTest::newRow(" spacey   <te(xt{^ )>}|rtl")
+//            << standard[4]
+//            << 15 << 12 << 14
+//            << 10 << 15
+//            << 14 << 15;
+    QTest::newRow(" spacey   {<te(x^t} )>|ltr")
+            << standard[4]
+            << 12 << 15 << 13
+            << 10 << 15
+            << 10 << 14;
+//    QTBUG-11365
+//    QTest::newRow(" spacey   {<te(xt^} )>|ltr")
+//            << standard[4]
+//            << 12 << 15 << 14
+//            << 10 << 15
+//            << 10 << 14;
+}
+
+void tst_qsgtextinput::moveCursorSelectionSequence()
+{
+    QFETCH(QString, testStr);
+    QFETCH(int, cursorPosition);
+    QFETCH(int, movePosition1);
+    QFETCH(int, movePosition2);
+    QFETCH(int, selection1Start);
+    QFETCH(int, selection1End);
+    QFETCH(int, selection2Start);
+    QFETCH(int, selection2End);
+
+    QString componentStr = "import QtQuick 2.0\nTextInput {  text: \""+ testStr +"\"; }";
+    QDeclarativeComponent textinputComponent(&engine);
+    textinputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput*>(textinputComponent.create());
+    QVERIFY(textinputObject != 0);
+
+    textinputObject->setCursorPosition(cursorPosition);
+
+    textinputObject->moveCursorSelection(movePosition1, QSGTextInput::SelectWords);
+    QCOMPARE(textinputObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start));
+    QCOMPARE(textinputObject->selectionStart(), selection1Start);
+    QCOMPARE(textinputObject->selectionEnd(), selection1End);
+
+    textinputObject->moveCursorSelection(movePosition2, QSGTextInput::SelectWords);
+    QCOMPARE(textinputObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start));
+    QCOMPARE(textinputObject->selectionStart(), selection2Start);
+    QCOMPARE(textinputObject->selectionEnd(), selection2End);
+
+    delete textinputObject;
+}
+
+void tst_qsgtextinput::dragMouseSelection()
+{
+    QString qmlfile = SRCDIR "/data/mouseselection_true.qml";
+
+    QSGView canvas(QUrl::fromLocalFile(qmlfile));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextInput *textInputObject = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(textInputObject != 0);
+
+    // press-and-drag-and-release from x1 to x2
+    int x1 = 10;
+    int x2 = 70;
+    int y = textInputObject->height()/2;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&canvas, &mv);
+    }
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+
+    QString str1 = textInputObject->selectedText();
+    QVERIFY(str1.length() > 3);
+
+    // press and drag the current selection.
+    x1 = 40;
+    x2 = 100;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    {
+        QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&canvas, &mv);
+    }
+        QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str2 = textInputObject->selectedText();
+    QVERIFY(str2.length() > 3);
+
+    QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved.
+}
+
+void tst_qsgtextinput::mouseSelectionMode_data()
+{
+    QTest::addColumn<QString>("qmlfile");
+    QTest::addColumn<bool>("selectWords");
+
+    // import installed
+    QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true;
+    QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false;
+    QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false;
+}
+
+void tst_qsgtextinput::mouseSelectionMode()
+{
+    QFETCH(QString, qmlfile);
+    QFETCH(bool, selectWords);
+
+    QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    QSGView canvas(QUrl::fromLocalFile(qmlfile));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextInput *textInputObject = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(textInputObject != 0);
+
+    // press-and-drag-and-release from x1 to x2
+    int x1 = 10;
+    int x2 = 70;
+    int y = textInputObject->height()/2;
+    QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y));
+    //QTest::mouseMove(&canvas, canvas.mapFromScene(QPoint(x2,y))); // doesn't work
+    QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+    QApplication::sendEvent(&canvas, &mv);
+    QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y));
+    QString str = textInputObject->selectedText();
+    if (selectWords) {
+        QCOMPARE(str, text);
+    } else {
+        QVERIFY(str.length() > 3);
+        QVERIFY(str != text);
+    }
+}
+
+void tst_qsgtextinput::horizontalAlignment_data()
+{
+    QTest::addColumn<int>("hAlign");
+    QTest::addColumn<QString>("expectfile");
+
+    QTest::newRow("L") << int(Qt::AlignLeft) << "halign_left";
+    QTest::newRow("R") << int(Qt::AlignRight) << "halign_right";
+    QTest::newRow("C") << int(Qt::AlignHCenter) << "halign_center";
+}
+
+void tst_qsgtextinput::horizontalAlignment()
+{
+    QFETCH(int, hAlign);
+    QFETCH(QString, expectfile);
+
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/horizontalAlignment.qml"));
+
+    canvas.show();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+    QObject *ob = canvas.rootObject();
+    QVERIFY(ob != 0);
+    ob->setProperty("horizontalAlignment",hAlign);
+    QImage actual(canvas.width(), canvas.height(), QImage::Format_RGB32);
+    actual.fill(qRgb(255,255,255));
+    {
+        QPainter p(&actual);
+        canvas.render(&p);
+    }
+
+    expectfile = createExpectedFileIfNotFound(expectfile, actual);
+
+    QImage expect(expectfile);
+
+    QCOMPARE(actual,expect);
+}
+
+void tst_qsgtextinput::horizontalAlignment_RightToLeft()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/horizontalAlignment_RightToLeft.qml"));
+    QSGTextInput *textInput = canvas.rootObject()->findChild<QSGTextInput*>("text");
+    QVERIFY(textInput != 0);
+    canvas.show();
+
+    QSGTextInputPrivate *textInputPrivate = QSGTextInputPrivate::get(textInput);
+    QVERIFY(textInputPrivate != 0);
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // implicit alignment should follow the reading direction of RTL text
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // explicitly left aligned
+    textInput->setHAlign(QSGTextInput::AlignLeft);
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignLeft);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QVERIFY(-textInputPrivate->hscroll < canvas.width()/2);
+
+    // explicitly right aligned
+    textInput->setHAlign(QSGTextInput::AlignRight);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // explicitly center aligned
+    textInput->setHAlign(QSGTextInput::AlignHCenter);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignHCenter);
+    QVERIFY(-textInputPrivate->hscroll < canvas.width()/2);
+    QVERIFY(-textInputPrivate->hscroll + textInputPrivate->width > canvas.width()/2);
+
+    // reseted alignment should go back to following the text reading direction
+    textInput->resetHAlign();
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // mirror the text item
+    QSGItemPrivate::get(textInput)->setLayoutMirror(true);
+
+    // mirrored implicit alignment should continue to follow the reading direction of the text
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // explicitly right aligned behaves as left aligned
+    textInput->setHAlign(QSGTextInput::AlignRight);
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QCOMPARE(textInput->effectiveHAlign(), QSGTextInput::AlignLeft);
+    QVERIFY(-textInputPrivate->hscroll < canvas.width()/2);
+
+    // mirrored explicitly left aligned behaves as right aligned
+    textInput->setHAlign(QSGTextInput::AlignLeft);
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignLeft);
+    QCOMPARE(textInput->effectiveHAlign(), QSGTextInput::AlignRight);
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+
+    // disable mirroring
+    QSGItemPrivate::get(textInput)->setLayoutMirror(false);
+    QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign());
+    textInput->resetHAlign();
+
+    // English text should be implicitly left aligned
+    textInput->setText("Hello world!");
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignLeft);
+    QVERIFY(-textInputPrivate->hscroll < canvas.width()/2);
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // empty text with implicit alignment follows the system locale-based
+    // keyboard input direction from QApplication::keyboardInputDirection
+    textInput->setText("");
+    QCOMPARE(textInput->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGTextInput::AlignLeft : QSGTextInput::AlignRight);
+    if (QApplication::keyboardInputDirection() == Qt::LeftToRight)
+        QVERIFY(-textInputPrivate->hscroll < canvas.width()/2);
+    else
+        QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+    textInput->setHAlign(QSGTextInput::AlignRight);
+    QCOMPARE(textInput->hAlign(), QSGTextInput::AlignRight);
+    QVERIFY(-textInputPrivate->hscroll > canvas.width()/2);
+#endif
+
+#ifndef Q_OS_MAC    // QTBUG-18040
+    // alignment of TextInput with no text set to it
+    QString componentStr = "import QtQuick 2.0\nTextInput {}";
+    QDeclarativeComponent textComponent(&engine);
+    textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QSGTextInput *textObject = qobject_cast<QSGTextInput*>(textComponent.create());
+    QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
+                                  QSGTextInput::AlignLeft : QSGTextInput::AlignRight);
+    delete textObject;
+#endif
+}
+
+void tst_qsgtextinput::positionAt()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/positionAt.qml"));
+    QVERIFY(canvas.rootObject() != 0);
+    canvas.show();
+    canvas.setFocus();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(textinputObject != 0);
+
+    // Check autoscrolled...
+    QFontMetrics fm(textinputObject->font());
+
+    int pos = textinputObject->positionAt(textinputObject->width()/2);
+    int diff = abs(int(fm.width(textinputObject->text()) - (fm.width(textinputObject->text().left(pos))+textinputObject->width()/2)));
+
+    // some tollerance for different fonts.
+#ifdef Q_OS_LINUX
+    QVERIFY(diff < 2);
+#else
+    QVERIFY(diff < 5);
+#endif
+
+    int x = textinputObject->positionToRectangle(pos + 1).x() - 1;
+    QCOMPARE(textinputObject->positionAt(x, QSGTextInput::CursorBetweenCharacters), pos + 1);
+    QCOMPARE(textinputObject->positionAt(x, QSGTextInput::CursorOnCharacter), pos);
+
+    // Check without autoscroll...
+    textinputObject->setAutoScroll(false);
+    pos = textinputObject->positionAt(textinputObject->width()/2);
+    diff = abs(int(fm.width(textinputObject->text().left(pos))-textinputObject->width()/2));
+
+    // some tollerance for different fonts.
+#ifdef Q_OS_LINUX
+    QVERIFY(diff < 2);
+#else
+    QVERIFY(diff < 5);
+#endif
+
+    x = textinputObject->positionToRectangle(pos + 1).x() - 1;
+    QCOMPARE(textinputObject->positionAt(x, QSGTextInput::CursorBetweenCharacters), pos + 1);
+    QCOMPARE(textinputObject->positionAt(x, QSGTextInput::CursorOnCharacter), pos);
+
+    const qreal x0 = textinputObject->positionToRectangle(pos).x();
+    const qreal x1 = textinputObject->positionToRectangle(pos + 1).x();
+
+    QString preeditText = textinputObject->text().mid(0, pos);
+    textinputObject->setText(textinputObject->text().mid(pos));
+    textinputObject->setCursorPosition(0);
+
+    QInputMethodEvent inputEvent(preeditText, QList<QInputMethodEvent::Attribute>());
+    QApplication::sendEvent(&canvas, &inputEvent);
+
+    // Check all points within the preedit text return the same position.
+    QCOMPARE(textinputObject->positionAt(0), 0);
+    QCOMPARE(textinputObject->positionAt(x0 / 2), 0);
+    QCOMPARE(textinputObject->positionAt(x0), 0);
+
+    // Verify positioning returns to normal after the preedit text.
+    QCOMPARE(textinputObject->positionAt(x1), 1);
+    QCOMPARE(textinputObject->positionToRectangle(1).x(), x1);
+}
+
+void tst_qsgtextinput::maxLength()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/maxLength.qml"));
+    QVERIFY(canvas.rootObject() != 0);
+    canvas.show();
+    canvas.setFocus();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(textinputObject != 0);
+    QVERIFY(textinputObject->text().isEmpty());
+    QVERIFY(textinputObject->maxLength() == 10);
+    foreach(const QString &str, standard){
+        QVERIFY(textinputObject->text().length() <= 10);
+        textinputObject->setText(str);
+        QVERIFY(textinputObject->text().length() <= 10);
+    }
+
+    textinputObject->setText("");
+    QTRY_VERIFY(textinputObject->hasActiveFocus() == true);
+    for(int i=0; i<20; i++){
+        QCOMPARE(textinputObject->text().length(), qMin(i,10));
+        //simulateKey(&canvas, Qt::Key_A);
+        QTest::keyPress(&canvas, Qt::Key_A);
+        QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    }
+}
+
+void tst_qsgtextinput::masks()
+{
+    //Not a comprehensive test of the possible masks, that's done elsewhere (QLineEdit)
+    //QString componentStr = "import QtQuick 2.0\nTextInput {  inputMask: 'HHHHhhhh'; }";
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/masks.qml"));
+    canvas.show();
+    canvas.setFocus();
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextInput *textinputObject = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(textinputObject != 0);
+    QTRY_VERIFY(textinputObject->hasActiveFocus() == true);
+    QVERIFY(textinputObject->text().length() == 0);
+    QCOMPARE(textinputObject->inputMask(), QString("HHHHhhhh; "));
+    for(int i=0; i<10; i++){
+        QCOMPARE(qMin(i,8), textinputObject->text().length());
+        QCOMPARE(i>=4, textinputObject->hasAcceptableInput());
+        //simulateKey(&canvas, Qt::Key_A);
+        QTest::keyPress(&canvas, Qt::Key_A);
+        QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    }
+}
+
+void tst_qsgtextinput::validators()
+{
+    // Note that this test assumes that the validators are working properly
+    // so you may need to run their tests first. All validators are checked
+    // here to ensure that their exposure to QML is working.
+
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/validators.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextInput *intInput = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("intInput")));
+    QVERIFY(intInput);
+    intInput->setFocus(true);
+    QTRY_VERIFY(intInput->hasActiveFocus());
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(intInput->text(), QLatin1String("1"));
+    QCOMPARE(intInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_2);
+    QTest::keyRelease(&canvas, Qt::Key_2, Qt::NoModifier ,10);
+    QCOMPARE(intInput->text(), QLatin1String("1"));
+    QCOMPARE(intInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(intInput->text(), QLatin1String("11"));
+    QCOMPARE(intInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_0);
+    QTest::keyRelease(&canvas, Qt::Key_0, Qt::NoModifier ,10);
+    QCOMPARE(intInput->text(), QLatin1String("11"));
+    QCOMPARE(intInput->hasAcceptableInput(), true);
+
+    QSGTextInput *dblInput = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("dblInput")));
+    QTRY_VERIFY(dblInput);
+    dblInput->setFocus(true);
+    QVERIFY(dblInput->hasActiveFocus() == true);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("1"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_2);
+    QTest::keyRelease(&canvas, Qt::Key_2, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("12"));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_Period);
+    QTest::keyRelease(&canvas, Qt::Key_Period, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("12."));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("12.1"));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("12.11"));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(dblInput->text(), QLatin1String("12.11"));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+
+    QSGTextInput *strInput = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("strInput")));
+    QTRY_VERIFY(strInput);
+    strInput->setFocus(true);
+    QVERIFY(strInput->hasActiveFocus() == true);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String(""));
+    QCOMPARE(strInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_A);
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String("a"));
+    QCOMPARE(strInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_A);
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String("aa"));
+    QCOMPARE(strInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_A);
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String("aaa"));
+    QCOMPARE(strInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_A);
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String("aaaa"));
+    QCOMPARE(strInput->hasAcceptableInput(), true);
+    QTest::keyPress(&canvas, Qt::Key_A);
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(strInput->text(), QLatin1String("aaaa"));
+    QCOMPARE(strInput->hasAcceptableInput(), true);
+}
+
+void tst_qsgtextinput::inputMethods()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/inputmethods.qml"));
+    canvas.show();
+    canvas.setFocus();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+
+    // test input method hints
+    QVERIFY(canvas.rootObject() != 0);
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(canvas.rootObject());
+    QVERIFY(input != 0);
+    QVERIFY(input->inputMethodHints() & Qt::ImhNoPredictiveText);
+    input->setInputMethodHints(Qt::ImhUppercaseOnly);
+    QVERIFY(input->inputMethodHints() & Qt::ImhUppercaseOnly);
+
+    input->setFocus(true);
+    QVERIFY(input->hasActiveFocus() == true);
+    // test that input method event is committed
+    QInputMethodEvent event;
+    event.setCommitString( "My ", -12, 0);
+    QApplication::sendEvent(&canvas, &event);
+    QCOMPARE(input->text(), QString("My Hello world!"));
+
+    input->setCursorPosition(2);
+    event.setCommitString("Your", -2, 2);
+    QApplication::sendEvent(&canvas, &event);
+    QCOMPARE(input->text(), QString("Your Hello world!"));
+    QCOMPARE(input->cursorPosition(), 4);
+
+    input->setCursorPosition(7);
+    event.setCommitString("Goodbye", -2, 5);
+    QApplication::sendEvent(&canvas, &event);
+    QCOMPARE(input->text(), QString("Your Goodbye world!"));
+    QCOMPARE(input->cursorPosition(), 12);
+
+    input->setCursorPosition(8);
+    event.setCommitString("Our", -8, 4);
+    QApplication::sendEvent(&canvas, &event);
+    QCOMPARE(input->text(), QString("Our Goodbye world!"));
+    QCOMPARE(input->cursorPosition(), 7);
+}
+
+/*
+TextInput element should only handle left/right keys until the cursor reaches
+the extent of the text, then they should ignore the keys.
+
+*/
+void tst_qsgtextinput::navigation()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/navigation.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    input->setCursorPosition(0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == false);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == true);
+    //QT-2944: If text is selected, ensure we deselect upon cursor motion
+    input->setCursorPosition(input->text().length());
+    input->select(0,input->text().length());
+    QVERIFY(input->selectionStart() != input->selectionEnd());
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->selectionStart() == input->selectionEnd());
+    QVERIFY(input->selectionStart() == input->text().length());
+    QVERIFY(input->hasActiveFocus() == true);
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == false);
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == true);
+
+    // Up and Down should NOT do Home/End, even on Mac OS X (QTBUG-10438).
+    input->setCursorPosition(2);
+    QCOMPARE(input->cursorPosition(),2);
+    simulateKey(&canvas, Qt::Key_Up);
+    QCOMPARE(input->cursorPosition(),2);
+    simulateKey(&canvas, Qt::Key_Down);
+    QCOMPARE(input->cursorPosition(),2);
+}
+
+void tst_qsgtextinput::navigation_RTL()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/navigation.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647};
+    input->setText(QString::fromUtf16(arabic_str, 11));
+
+    input->setCursorPosition(0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+
+    // move off
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == false);
+
+    // move back
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == true);
+
+    input->setCursorPosition(input->text().length());
+    QVERIFY(input->hasActiveFocus() == true);
+
+    // move off
+    simulateKey(&canvas, Qt::Key_Left);
+    QVERIFY(input->hasActiveFocus() == false);
+
+    // move back
+    simulateKey(&canvas, Qt::Key_Right);
+    QVERIFY(input->hasActiveFocus() == true);
+}
+
+void tst_qsgtextinput::copyAndPaste() {
+#ifndef QT_NO_CLIPBOARD
+
+#ifdef Q_WS_MAC
+    {
+        PasteboardRef pasteboard;
+        OSStatus status = PasteboardCreate(0, &pasteboard);
+        if (status == noErr)
+            CFRelease(pasteboard);
+        else
+            QSKIP("This machine doesn't support the clipboard", SkipAll);
+    }
+#endif
+
+    QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }";
+    QDeclarativeComponent textInputComponent(&engine);
+    textInputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textInput = qobject_cast<QSGTextInput*>(textInputComponent.create());
+    QVERIFY(textInput != 0);
+
+    // copy and paste
+    QCOMPARE(textInput->text().length(), 12);
+    textInput->select(0, textInput->text().length());;
+    textInput->copy();
+    QCOMPARE(textInput->selectedText(), QString("Hello world!"));
+    QCOMPARE(textInput->selectedText().length(), 12);
+    textInput->setCursorPosition(0);
+    QVERIFY(textInput->canPaste());
+    textInput->paste();
+    QCOMPARE(textInput->text(), QString("Hello world!Hello world!"));
+    QCOMPARE(textInput->text().length(), 24);
+
+    // can paste
+    QVERIFY(textInput->canPaste());
+    textInput->setReadOnly(true);
+    QVERIFY(!textInput->canPaste());
+    textInput->setReadOnly(false);
+    QVERIFY(textInput->canPaste());
+
+    // select word
+    textInput->setCursorPosition(0);
+    textInput->selectWord();
+    QCOMPARE(textInput->selectedText(), QString("Hello"));
+
+    // select all and cut
+    textInput->selectAll();
+    textInput->cut();
+    QCOMPARE(textInput->text().length(), 0);
+    textInput->paste();
+    QCOMPARE(textInput->text(), QString("Hello world!Hello world!"));
+    QCOMPARE(textInput->text().length(), 24);
+
+    // clear copy buffer
+    QClipboard *clipboard = QApplication::clipboard();
+    QVERIFY(clipboard);
+    clipboard->clear();
+    QVERIFY(!textInput->canPaste());
+
+    // test that copy functionality is disabled
+    // when echo mode is set to hide text/password mode
+    int index = 0;
+    while (index < 4) {
+        QSGTextInput::EchoMode echoMode = QSGTextInput::EchoMode(index);
+        textInput->setEchoMode(echoMode);
+        textInput->setText("My password");
+        textInput->select(0, textInput->text().length());;
+        textInput->copy();
+        if (echoMode == QSGTextInput::Normal) {
+            QVERIFY(!clipboard->text().isEmpty());
+            QCOMPARE(clipboard->text(), QString("My password"));
+            clipboard->clear();
+        } else {
+            QVERIFY(clipboard->text().isEmpty());
+        }
+        index++;
+    }
+
+    delete textInput;
+#endif
+}
+
+void tst_qsgtextinput::canPasteEmpty() {
+#ifndef QT_NO_CLIPBOARD
+
+    QApplication::clipboard()->clear();
+
+    QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }";
+    QDeclarativeComponent textInputComponent(&engine);
+    textInputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textInput = qobject_cast<QSGTextInput*>(textInputComponent.create());
+    QVERIFY(textInput != 0);
+
+    QLineControl lc;
+    bool cp = !lc.isReadOnly() && QApplication::clipboard()->text().length() != 0;
+    QCOMPARE(textInput->canPaste(), cp);
+
+#endif
+}
+
+void tst_qsgtextinput::canPaste() {
+#ifndef QT_NO_CLIPBOARD
+
+    QApplication::clipboard()->setText("Some text");
+
+    QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }";
+    QDeclarativeComponent textInputComponent(&engine);
+    textInputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textInput = qobject_cast<QSGTextInput*>(textInputComponent.create());
+    QVERIFY(textInput != 0);
+
+    QLineControl lc;
+    bool cp = !lc.isReadOnly() && QApplication::clipboard()->text().length() != 0;
+    QCOMPARE(textInput->canPaste(), cp);
+
+#endif
+}
+
+void tst_qsgtextinput::passwordCharacter()
+{
+    QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\"; font.family: \"Helvetica\"; echoMode: TextInput.Password }";
+    QDeclarativeComponent textInputComponent(&engine);
+    textInputComponent.setData(componentStr.toLatin1(), QUrl());
+    QSGTextInput *textInput = qobject_cast<QSGTextInput*>(textInputComponent.create());
+    QVERIFY(textInput != 0);
+
+    textInput->setPasswordCharacter("X");
+    QSize contentsSize = textInput->contentsSize();
+    qreal implicitWidth = textInput->implicitWidth();
+    textInput->setPasswordCharacter(".");
+
+    QEXPECT_FAIL("", "QSGPaintedItem::contentSize()/setContentSize() not implemented", Continue);
+    // QTBUG-12383 content is updated and redrawn
+    QVERIFY(contentsSize != textInput->contentsSize());
+    QVERIFY(textInput->implicitWidth() < implicitWidth);
+
+    delete textInput;
+}
+
+void tst_qsgtextinput::cursorDelegate()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/cursorTest.qml"));
+    view.show();
+    view.setFocus();
+    QSGTextInput *textInputObject = view.rootObject()->findChild<QSGTextInput*>("textInputObject");
+    QVERIFY(textInputObject != 0);
+    QVERIFY(textInputObject->findChild<QSGItem*>("cursorInstance"));
+    //Test Delegate gets created
+    textInputObject->setFocus(true);
+    QSGItem* delegateObject = textInputObject->findChild<QSGItem*>("cursorInstance");
+    QVERIFY(delegateObject);
+    //Test Delegate gets moved
+    for(int i=0; i<= textInputObject->text().length(); i++){
+        textInputObject->setCursorPosition(i);
+        QCOMPARE(textInputObject->cursorRectangle().x(), qRound(delegateObject->x()));
+        QCOMPARE(textInputObject->cursorRectangle().y(), qRound(delegateObject->y()));
+    }
+    textInputObject->setCursorPosition(0);
+    QCOMPARE(textInputObject->cursorRectangle().x(), qRound(delegateObject->x()));
+    QCOMPARE(textInputObject->cursorRectangle().y(), qRound(delegateObject->y()));
+    //Test Delegate gets deleted
+    textInputObject->setCursorDelegate(0);
+    QVERIFY(!textInputObject->findChild<QSGItem*>("cursorInstance"));
+}
+
+void tst_qsgtextinput::cursorVisible()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/cursorVisible.qml"));
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    view.setFocus();
+
+    QSGTextInput input;
+    QSignalSpy spy(&input, SIGNAL(cursorVisibleChanged(bool)));
+
+    QCOMPARE(input.isCursorVisible(), false);
+
+    input.setCursorVisible(true);
+    QCOMPARE(input.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 1);
+
+    input.setCursorVisible(false);
+    QCOMPARE(input.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 2);
+
+    input.setFocus(true);
+    QCOMPARE(input.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 2);
+
+    input.setParentItem(view.rootObject());
+    QCOMPARE(input.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 3);
+
+    input.setFocus(false);
+    QCOMPARE(input.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 4);
+
+    input.setFocus(true);
+    QCOMPARE(input.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 5);
+
+    view.clearFocus();
+    QCOMPARE(input.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 6);
+
+    view.setFocus();
+    QCOMPARE(input.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 7);
+
+    // on mac, setActiveWindow(0) on mac does not deactivate the current application
+    // (you have to switch to a different app or hide the current app to trigger this)
+#if !defined(Q_WS_MAC)
+    QApplication::setActiveWindow(0);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(0));
+    QCOMPARE(input.isCursorVisible(), false);
+    QCOMPARE(spy.count(), 8);
+
+    QApplication::setActiveWindow(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QCOMPARE(input.isCursorVisible(), true);
+    QCOMPARE(spy.count(), 9);
+#endif
+}
+
+void tst_qsgtextinput::cursorRectangle()
+{
+    QString text = "Hello World!";
+
+    QSGTextInput input;
+    input.setText(text);
+    QFontMetricsF fm(input.font());
+    input.setWidth(fm.width(text.mid(0, 5)));
+
+    QRect r;
+
+    // some tolerance for different fonts.
+#ifdef Q_OS_LINUX
+    const int error = 2;
+#else
+    const int error = 5;
+#endif
+
+
+    for (int i = 0; i <= 5; ++i) {
+        input.setCursorPosition(i);
+        r = input.cursorRectangle();
+        int textWidth = fm.width(text.mid(0, i));
+
+        QVERIFY(r.left() < textWidth + error);
+        QVERIFY(r.right() > textWidth - error);
+        QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r);
+    }
+
+    // Check the cursor rectangle remains within the input bounding rect when auto scrolling.
+    QVERIFY(r.left() < input.boundingRect().width());
+    QVERIFY(r.right() >= input.width());
+
+    for (int i = 6; i < text.length(); ++i) {
+        input.setCursorPosition(i);
+        QCOMPARE(r, input.cursorRectangle());
+        QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r);
+    }
+
+    for (int i = text.length() - 2; i >= 0; --i) {
+        input.setCursorPosition(i);
+        r = input.cursorRectangle();
+        QVERIFY(r.right() >= 0);
+        QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r);
+    }
+}
+
+void tst_qsgtextinput::readOnly()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/readOnly.qml"));
+    canvas.show();
+    canvas.setFocus();
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+    QVERIFY(input->isReadOnly() == true);
+    QString initial = input->text();
+    for(int k=Qt::Key_0; k<=Qt::Key_Z; k++)
+        simulateKey(&canvas, k);
+    simulateKey(&canvas, Qt::Key_Return);
+    simulateKey(&canvas, Qt::Key_Space);
+    simulateKey(&canvas, Qt::Key_Escape);
+    QCOMPARE(input->text(), initial);
+}
+
+void tst_qsgtextinput::echoMode()
+{
+    QSGView canvas(QUrl::fromLocalFile(SRCDIR "/data/echoMode.qml"));
+    canvas.show();
+    canvas.setFocus();
+    QApplication::setActiveWindow(&canvas);
+    QTest::qWaitForWindowShown(&canvas);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&canvas));
+
+    QVERIFY(canvas.rootObject() != 0);
+
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+
+    QVERIFY(input != 0);
+    QTRY_VERIFY(input->hasActiveFocus() == true);
+    QString initial = input->text();
+    Qt::InputMethodHints ref;
+    QCOMPARE(initial, QLatin1String("ABCDefgh"));
+    QCOMPARE(input->echoMode(), QSGTextInput::Normal);
+    QCOMPARE(input->displayText(), input->text());
+    //Normal
+    ref &= ~Qt::ImhHiddenText;
+    ref &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    QCOMPARE(input->inputMethodHints(), ref);
+    input->setEchoMode(QSGTextInput::NoEcho);
+    QCOMPARE(input->text(), initial);
+    QCOMPARE(input->displayText(), QLatin1String(""));
+    QCOMPARE(input->passwordCharacter(), QLatin1String("*"));
+    //NoEcho
+    ref |= Qt::ImhHiddenText;
+    ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    QCOMPARE(input->inputMethodHints(), ref);
+    input->setEchoMode(QSGTextInput::Password);
+    //Password
+    ref |= Qt::ImhHiddenText;
+    ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    QCOMPARE(input->text(), initial);
+    QCOMPARE(input->displayText(), QLatin1String("********"));
+    QCOMPARE(input->inputMethodHints(), ref);
+    input->setPasswordCharacter(QChar('Q'));
+    QCOMPARE(input->passwordCharacter(), QLatin1String("Q"));
+    QCOMPARE(input->text(), initial);
+    QCOMPARE(input->displayText(), QLatin1String("QQQQQQQQ"));
+    input->setEchoMode(QSGTextInput::PasswordEchoOnEdit);
+    //PasswordEchoOnEdit
+    ref &= ~Qt::ImhHiddenText;
+    ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
+    QCOMPARE(input->inputMethodHints(), ref);
+    QCOMPARE(input->text(), initial);
+    QCOMPARE(input->displayText(), QLatin1String("QQQQQQQQ"));
+    QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("QQQQQQQQ"));
+    QTest::keyPress(&canvas, Qt::Key_A);//Clearing previous entry is part of PasswordEchoOnEdit
+    QTest::keyRelease(&canvas, Qt::Key_A, Qt::NoModifier ,10);
+    QCOMPARE(input->text(), QLatin1String("a"));
+    QCOMPARE(input->displayText(), QLatin1String("a"));
+    QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("a"));
+    input->setFocus(false);
+    QVERIFY(input->hasActiveFocus() == false);
+    QCOMPARE(input->displayText(), QLatin1String("Q"));
+    QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("Q"));
+    input->setFocus(true);
+    QInputMethodEvent inputEvent;
+    inputEvent.setCommitString(initial);
+    QApplication::sendEvent(&canvas, &inputEvent);
+    QCOMPARE(input->text(), initial);
+    QCOMPARE(input->displayText(), initial);
+    QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), initial);
+}
+
+void tst_qsgtextinput::simulateKey(QSGView *view, int key)
+{
+    QKeyEvent press(QKeyEvent::KeyPress, key, 0);
+    QKeyEvent release(QKeyEvent::KeyRelease, key, 0);
+
+    QApplication::sendEvent(view, &press);
+    QApplication::sendEvent(view, &release);
+}
+
+class MyInputContext : public QInputContext
+{
+public:
+    MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {}
+    ~MyInputContext() {}
+
+    QString identifierName() { return QString(); }
+    QString language() { return QString(); }
+
+    void reset() {}
+
+    bool isComposing() const { return false; }
+
+    bool filterEvent( const QEvent *event )
+    {
+        if (event->type() == QEvent::RequestSoftwareInputPanel)
+            openInputPanelReceived = true;
+        if (event->type() == QEvent::CloseSoftwareInputPanel)
+            closeInputPanelReceived = true;
+        return QInputContext::filterEvent(event);
+    }
+
+    void update() { updateReceived = true; }
+
+    void mouseHandler(int x, QMouseEvent *event)
+    {
+        cursor = x;
+        eventType = event->type();
+        eventPosition = event->pos();
+        eventGlobalPosition = event->globalPos();
+        eventButton = event->button();
+        eventButtons = event->buttons();
+        eventModifiers = event->modifiers();
+    }
+
+    void sendPreeditText(const QString &text, int cursor)
+    {
+        QList<QInputMethodEvent::Attribute> attributes;
+        attributes.append(QInputMethodEvent::Attribute(
+                QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+
+        QInputMethodEvent event(text, attributes);
+        sendEvent(event);
+    }
+
+    bool openInputPanelReceived;
+    bool closeInputPanelReceived;
+    bool updateReceived;
+    int cursor;
+    QEvent::Type eventType;
+    QPoint eventPosition;
+    QPoint eventGlobalPosition;
+    Qt::MouseButton eventButton;
+    Qt::MouseButtons eventButtons;
+    Qt::KeyboardModifiers eventModifiers;
+};
+
+void tst_qsgtextinput::openInputPanelOnClick()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/openInputPanel.qml"));
+    MyInputContext ic;
+    // QSGCanvas won't set the Qt::WA_InputMethodEnabled flag unless a suitable item has focus
+    // and QWidget won't allow an input context to be set when the flag is not set.
+    view.setAttribute(Qt::WA_InputMethodEnabled, true);
+    view.setInputContext(&ic);
+    view.setAttribute(Qt::WA_InputMethodEnabled, false);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+
+    QSGItemPrivate* pri = QSGItemPrivate::get(input);
+    QSGTextInputPrivate *inputPrivate = static_cast<QSGTextInputPrivate*>(pri);
+
+    // input panel on click
+    inputPrivate->showInputPanelOnFocus = false;
+
+    QStyle::RequestSoftwareInputPanel behavior = QStyle::RequestSoftwareInputPanel(
+            view.style()->styleHint(QStyle::SH_RequestSoftwareInputPanel));
+    QTest::mouseClick(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QApplication::processEvents();
+    if (behavior == QStyle::RSIP_OnMouseClickAndAlreadyFocused) {
+        QCOMPARE(ic.openInputPanelReceived, false);
+        QTest::mouseClick(&view, Qt::LeftButton, 0, input->pos().toPoint());
+        QApplication::processEvents();
+        QCOMPARE(ic.openInputPanelReceived, true);
+    } else if (behavior == QStyle::RSIP_OnMouseClick) {
+        QCOMPARE(ic.openInputPanelReceived, true);
+    }
+    ic.openInputPanelReceived = false;
+
+    // focus should not cause input panels to open or close
+    input->setFocus(false);
+    input->setFocus(true);
+    input->setFocus(false);
+    input->setFocus(true);
+    input->setFocus(false);
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+}
+
+void tst_qsgtextinput::openInputPanelOnFocus()
+{
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/openInputPanel.qml"));
+    MyInputContext ic;
+    // QSGCanvas won't set the Qt::WA_InputMethodEnabled flag unless a suitable item has focus
+    // and QWidget won't allow an input context to be set when the flag is not set.
+    view.setAttribute(Qt::WA_InputMethodEnabled, true);
+    view.setInputContext(&ic);
+    view.setAttribute(Qt::WA_InputMethodEnabled, false);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+    QSignalSpy focusOnPressSpy(input, SIGNAL(activeFocusOnPressChanged(bool)));
+
+    QSGItemPrivate* pri = QSGItemPrivate::get(input);
+    QSGTextInputPrivate *inputPrivate = static_cast<QSGTextInputPrivate*>(pri);
+    inputPrivate->showInputPanelOnFocus = true;
+
+    // test default values
+    QVERIFY(input->focusOnPress());
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+
+    // focus on press, input panel on focus
+    QTest::mousePress(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QApplication::processEvents();
+    QVERIFY(input->hasActiveFocus());
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+
+    // no events on release
+    QTest::mouseRelease(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QCOMPARE(ic.openInputPanelReceived, false);
+    ic.openInputPanelReceived = false;
+
+    // if already focused, input panel can be opened on press
+    QVERIFY(input->hasActiveFocus());
+    QTest::mousePress(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+
+    // input method should stay enabled if focus
+    // is lost to an item that also accepts inputs
+    QSGTextInput anotherInput;
+    anotherInput.setParentItem(view.rootItem());
+    anotherInput.setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+    QCOMPARE(view.inputContext(), (QInputContext*)&ic);
+    QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // input method should be disabled if focus
+    // is lost to an item that doesn't accept inputs
+    QSGItem item;
+    item.setParentItem(view.rootItem());
+    item.setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // no automatic input panel events should
+    // be sent if activeFocusOnPress is false
+    input->setFocusOnPress(false);
+    QCOMPARE(focusOnPressSpy.count(),1);
+    input->setFocusOnPress(false);
+    QCOMPARE(focusOnPressSpy.count(),1);
+    input->setFocus(false);
+    input->setFocus(true);
+    QTest::mousePress(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QTest::mouseRelease(&view, Qt::LeftButton, 0, input->pos().toPoint());
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+
+    // one show input panel event should
+    // be set when openSoftwareInputPanel is called
+    input->openSoftwareInputPanel();
+    QCOMPARE(ic.openInputPanelReceived, true);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+    ic.openInputPanelReceived = false;
+
+    // one close input panel event should
+    // be sent when closeSoftwareInputPanel is called
+    input->closeSoftwareInputPanel();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, true);
+    ic.closeInputPanelReceived = false;
+
+    // set activeFocusOnPress back to true
+    input->setFocusOnPress(true);
+    QCOMPARE(focusOnPressSpy.count(),2);
+    input->setFocusOnPress(true);
+    QCOMPARE(focusOnPressSpy.count(),2);
+    input->setFocus(false);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QCOMPARE(ic.closeInputPanelReceived, false);
+    ic.closeInputPanelReceived = false;
+
+    // input panel should not re-open
+    // if focus has already been set
+    input->setFocus(true);
+    QCOMPARE(ic.openInputPanelReceived, true);
+    ic.openInputPanelReceived = false;
+    input->setFocus(true);
+    QCOMPARE(ic.openInputPanelReceived, false);
+
+    // input method should be disabled
+    // if TextInput loses focus
+    input->setFocus(false);
+    QApplication::processEvents();
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+    // input method should not be enabled
+    // if TextEdit is read only.
+    input->setReadOnly(true);
+    ic.openInputPanelReceived = false;
+    input->setFocus(true);
+    QApplication::processEvents();
+    QCOMPARE(ic.openInputPanelReceived, false);
+    QVERIFY(view.inputContext() == 0);
+    QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+}
+
+class MyTextInput : public QSGTextInput
+{
+public:
+    MyTextInput(QSGItem *parent = 0) : QSGTextInput(parent)
+    {
+        nbPaint = 0;
+    }
+    void paint(QPainter *painter)
+    {
+       nbPaint++;
+       QSGTextInput::paint(painter);
+    }
+    int nbPaint;
+};
+
+void tst_qsgtextinput::setHAlignClearCache()
+{
+    QSGView view;
+    MyTextInput input;
+    input.setText("Hello world");
+    input.setParentItem(view.rootItem());
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(input.nbPaint, 1);
+    input.setHAlign(QSGTextInput::AlignRight);
+    QApplication::processEvents();
+    //Changing the alignment should trigger a repaint
+    QCOMPARE(input.nbPaint, 2);
+}
+
+void tst_qsgtextinput::focusOutClearSelection()
+{
+    QSGView view;
+    QSGTextInput input;
+    QSGTextInput input2;
+    input.setText(QLatin1String("Hello world"));
+    input.setFocus(true);
+    input2.setParentItem(view.rootItem());
+    input.setParentItem(view.rootItem());
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    input.select(2,5);
+    //The selection should work
+    QTRY_COMPARE(input.selectedText(), QLatin1String("llo"));
+    input2.setFocus(true);
+    QApplication::processEvents();
+    //The input lost the focus selection should be cleared
+    QTRY_COMPARE(input.selectedText(), QLatin1String(""));
+}
+
+void tst_qsgtextinput::geometrySignals()
+{
+    QDeclarativeComponent component(&engine, SRCDIR "/data/geometrySignals.qml");
+    QObject *o = component.create();
+    QVERIFY(o);
+    QCOMPARE(o->property("bindingWidth").toInt(), 400);
+    QCOMPARE(o->property("bindingHeight").toInt(), 500);
+    delete o;
+}
+
+void tst_qsgtextinput::testQtQuick11Attributes()
+{
+    QFETCH(QString, code);
+    QFETCH(QString, warning);
+    QFETCH(QString, error);
+
+    QDeclarativeEngine engine;
+    QObject *obj;
+
+    QDeclarativeComponent valid(&engine);
+    valid.setData("import QtQuick 2.0; TextInput { " + code.toUtf8() + " }", QUrl(""));
+    obj = valid.create();
+    QVERIFY(obj);
+    QVERIFY(valid.errorString().isEmpty());
+    delete obj;
+
+    QDeclarativeComponent invalid(&engine);
+    invalid.setData("import QtQuick 1.0; TextInput { " + code.toUtf8() + " }", QUrl(""));
+    QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+    obj = invalid.create();
+    QCOMPARE(invalid.errorString(), error);
+    delete obj;
+}
+
+void tst_qsgtextinput::testQtQuick11Attributes_data()
+{
+    QTest::addColumn<QString>("code");
+    QTest::addColumn<QString>("warning");
+    QTest::addColumn<QString>("error");
+
+    QTest::newRow("canPaste") << "property bool foo: canPaste"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: canPaste"
+        << "";
+
+    QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection"
+        << "";
+
+    QTest::newRow("deselect") << "Component.onCompleted: deselect()"
+        << "<Unknown File>:1: ReferenceError: Can't find variable: deselect"
+        << "";
+}
+
+void tst_qsgtextinput::preeditAutoScroll()
+{
+    QString preeditText = "califragisiticexpialidocious!";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/preeditAutoScroll.qml"));
+    MyInputContext ic;
+    view.setInputContext(&ic);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+
+    QFontMetricsF fm(input->font());
+    input->setWidth(fm.width(input->text()));
+
+    // test the text is scrolled so the preedit is visible.
+    ic.sendPreeditText(preeditText.mid(0, 3), 1);
+    QVERIFY(input->positionAt(0) != 0);
+    QVERIFY(input->cursorRectangle().left() < input->boundingRect().width());
+
+    // test the text is scrolled back when the preedit is removed.
+    ic.sendEvent(QInputMethodEvent());
+    QCOMPARE(input->positionAt(0), 0);
+    QCOMPARE(input->positionAt(input->width()), 5);
+
+    // test if the preedit is larger than the text input that the
+    // character preceding the cursor is still visible.
+    qreal x = input->positionToRectangle(0).x();
+    for (int i = 0; i < 3; ++i) {
+        ic.sendPreeditText(preeditText, i + 1);
+        QVERIFY(input->cursorRectangle().right() >= fm.width(preeditText.at(i)));
+        QVERIFY(input->positionToRectangle(0).x() < x);
+        x = input->positionToRectangle(0).x();
+    }
+    for (int i = 1; i >= 0; --i) {
+        ic.sendPreeditText(preeditText, i + 1);
+        QVERIFY(input->cursorRectangle().right() >= fm.width(preeditText.at(i)));
+        QVERIFY(input->positionToRectangle(0).x() > x);
+        x = input->positionToRectangle(0).x();
+    }
+
+    // Test incrementing the preedit cursor doesn't cause further
+    // scrolling when right most text is visible.
+    ic.sendPreeditText(preeditText, preeditText.length() - 3);
+    x = input->positionToRectangle(0).x();
+    for (int i = 2; i >= 0; --i) {
+        ic.sendPreeditText(preeditText, preeditText.length() - i);
+        QCOMPARE(input->positionToRectangle(0).x(), x);
+    }
+    for (int i = 1; i <  3; ++i) {
+        ic.sendPreeditText(preeditText, preeditText.length() - i);
+        QCOMPARE(input->positionToRectangle(0).x(), x);
+    }
+
+    // Test disabling auto scroll.
+    ic.sendEvent(QInputMethodEvent());
+
+    input->setAutoScroll(false);
+    ic.sendPreeditText(preeditText.mid(0, 3), 1);
+    QCOMPARE(input->positionAt(0), 0);
+    QCOMPARE(input->positionAt(input->width()), 5);
+}
+
+void tst_qsgtextinput::preeditMicroFocus()
+{
+    QString preeditText = "super";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputMethodEvent.qml"));
+    MyInputContext ic;
+    view.setInputContext(&ic);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+
+    QRect currentRect;
+    QRect previousRect = input->inputMethodQuery(Qt::ImMicroFocus).toRect();
+
+    // Verify that the micro focus rect is positioned the same for position 0 as
+    // it would be if there was no preedit text.
+    ic.updateReceived = false;
+    ic.sendPreeditText(preeditText, 0);
+    currentRect = input->inputMethodQuery(Qt::ImMicroFocus).toRect();
+    QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+    QCOMPARE(ic.updateReceived, true);
+#endif
+
+    // Verify that the micro focus rect moves to the left as the cursor position
+    // is incremented.
+    for (int i = 1; i <= 5; ++i) {
+        ic.updateReceived = false;
+        ic.sendPreeditText(preeditText, i);
+        currentRect = input->inputMethodQuery(Qt::ImMicroFocus).toRect();
+        QVERIFY(previousRect.left() < currentRect.left());
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+        QCOMPARE(ic.updateReceived, true);
+#endif
+        previousRect = currentRect;
+    }
+
+    // Verify that if there is no preedit cursor then the micro focus rect is the
+    // same as it would be if it were positioned at the end of the preedit text.
+    ic.sendPreeditText(preeditText, 0);
+    ic.updateReceived = false;
+    ic.sendEvent(QInputMethodEvent(preeditText, QList<QInputMethodEvent::Attribute>()));
+    currentRect = input->inputMethodQuery(Qt::ImMicroFocus).toRect();
+    QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+    QCOMPARE(ic.updateReceived, true);
+#endif
+}
+
+void tst_qsgtextinput::inputContextMouseHandler()
+{
+    QString text = "supercalifragisiticexpialidocious!";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputContext.qml"));
+    MyInputContext ic;
+    view.setInputContext(&ic);
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+
+    QFontMetricsF fm(input->font());
+    const qreal y = fm.height() / 2;
+
+    QPoint position2 = input->mapToScene(QPointF(fm.width(text.mid(0, 2)), y)).toPoint();
+    QPoint position8 = input->mapToScene(QPointF(fm.width(text.mid(0, 8)), y)).toPoint();
+    QPoint position20 = input->mapToScene(QPointF(fm.width(text.mid(0, 20)), y)).toPoint();
+    QPoint position27 = input->mapToScene(QPointF(fm.width(text.mid(0, 27)), y)).toPoint();
+    QPoint globalPosition2 = view.mapToGlobal(position2);
+    QPoint globalposition8 = view.mapToGlobal(position8);
+    QPoint globalposition20 = view.mapToGlobal(position20);
+    QPoint globalposition27 = view.mapToGlobal(position27);
+
+    ic.sendEvent(QInputMethodEvent(text.mid(12), QList<QInputMethodEvent::Attribute>()));
+
+    QTest::mouseDClick(&view, Qt::LeftButton, Qt::NoModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+
+    QTest::mousePress(&view, Qt::LeftButton, Qt::NoModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::None);
+
+    {   QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::MouseMove);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);    // 15 is expected but some platforms may be off by one.
+    ic.eventType = QEvent::None;
+
+    QTest::mouseRelease(&view, Qt::LeftButton, Qt::NoModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    // And in the other direction.
+    QTest::mouseDClick(&view, Qt::LeftButton, Qt::ControlModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::LeftButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    QTest::mousePress(&view, Qt::RightButton, Qt::ControlModifier, position27);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+    QCOMPARE(ic.eventPosition, position27);
+    QCOMPARE(ic.eventGlobalPosition, globalposition27);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::MouseMove);
+    QCOMPARE(ic.eventPosition, position20);
+    QCOMPARE(ic.eventGlobalPosition, globalposition20);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor >= 7 && ic.cursor <= 9);
+    ic.eventType = QEvent::None;
+
+    {   QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+        QApplication::sendEvent(&view, &mv); }
+    QCOMPARE(ic.eventType, QEvent::None);
+
+    QTest::mouseRelease(&view, Qt::RightButton, Qt::ControlModifier, position2);
+    QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+    QCOMPARE(ic.eventPosition, position2);
+    QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+    QCOMPARE(ic.eventButton, Qt::RightButton);
+    QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+    QVERIFY(ic.cursor < 0);
+    ic.eventType = QEvent::None;
+}
+
+void tst_qsgtextinput::inputMethodComposing()
+{
+    QString text = "supercalifragisiticexpialidocious!";
+
+    QSGView view(QUrl::fromLocalFile(SRCDIR "/data/inputContext.qml"));
+    view.show();
+    QApplication::setActiveWindow(&view);
+    QTest::qWaitForWindowShown(&view);
+    QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+    QSGTextInput *input = qobject_cast<QSGTextInput *>(view.rootObject());
+    QVERIFY(input);
+    QSignalSpy spy(input, SIGNAL(inputMethodComposingChanged()));
+
+    QCOMPARE(input->isInputMethodComposing(), false);
+    {
+        QInputMethodEvent event(text.mid(3), QList<QInputMethodEvent::Attribute>());
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(input->isInputMethodComposing(), true);
+    QCOMPARE(spy.count(), 1);
+
+    {
+        QInputMethodEvent event(text.mid(12), QList<QInputMethodEvent::Attribute>());
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(spy.count(), 1);
+
+    {
+        QInputMethodEvent event;
+        QApplication::sendEvent(&view, &event);
+    }
+    QCOMPARE(input->isInputMethodComposing(), false);
+    QCOMPARE(spy.count(), 2);
+}
+
+void tst_qsgtextinput::cursorRectangleSize()
+{
+    QSGView *canvas = new QSGView(QUrl::fromLocalFile(SRCDIR "/data/positionAt.qml"));
+    QVERIFY(canvas->rootObject() != 0);
+    canvas->show();
+    canvas->setFocus();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
+
+    QSGTextInput *textInput = qobject_cast<QSGTextInput *>(canvas->rootObject());
+    QVERIFY(textInput != 0);
+    textInput->setFocus(Qt::OtherFocusReason);
+    QRectF cursorRect = textInput->positionToRectangle(textInput->cursorPosition());
+    QRectF microFocusFromScene = canvas->inputMethodQuery(Qt::ImMicroFocus).toRectF();
+    QRectF microFocusFromApp= QApplication::focusWidget()->inputMethodQuery(Qt::ImMicroFocus).toRectF();
+
+    QCOMPARE(microFocusFromScene.size(), cursorRect.size());
+    QCOMPARE(microFocusFromApp.size(), cursorRect.size());
+
+    delete canvas;
+}
+
+QTEST_MAIN(tst_qsgtextinput)
+
+#include "tst_qsgtextinput.moc"
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/datalist.qml b/tests/auto/declarative/qsgvisualdatamodel/data/datalist.qml
new file mode 100644
index 0000000000..8ce59caddc
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/datalist.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    model: VisualDataModel {
+        id: visualModel
+        objectName: "visualModel"
+        model: myModel
+        delegate: Component {
+            Rectangle {
+                height: 25
+                width: 100
+                Text { objectName: "display"; text: display }
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties.qml b/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties.qml
new file mode 100644
index 0000000000..6d86cdea2e
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    model: myModel
+    delegate: Item {
+        objectName: "delegate"
+        property variant test1: name
+        property variant test2: model.name
+        property variant test3: modelData
+        property variant test4: model.modelData
+        property variant test5: modelData.name
+        property variant test6: model
+        property variant test7: index
+        property variant test8: model.index
+        property variant test9: model.modelData.name
+    }
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties2.qml b/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties2.qml
new file mode 100644
index 0000000000..6a92431cdf
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/modelproperties2.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    model: myModel
+    delegate: Item {
+        objectName: "delegate"
+        property variant test1: display
+        property variant test2: model.display
+        property variant test3: modelData
+        property variant test4: model.modelData
+        property variant test5: modelData.display
+        property variant test6: model
+        property variant test7: index
+        property variant test8: model.index
+        property variant test9: model.modelData.display
+    }
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/objectlist.qml b/tests/auto/declarative/qsgvisualdatamodel/data/objectlist.qml
new file mode 100644
index 0000000000..9086e5ab57
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/objectlist.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    anchors.fill: parent
+    model: myModel
+    delegate: Component {
+        Rectangle {
+            height: 25
+            width: 100
+            color: model.modelData.color
+            Text { objectName: "name"; text: name }
+            Text { objectName: "section"; text: parent.ListView.section }
+        }
+    }
+    section.property: "name"
+    section.criteria: ViewSection.FullString
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/singlerole1.qml b/tests/auto/declarative/qsgvisualdatamodel/data/singlerole1.qml
new file mode 100644
index 0000000000..d5b0fcf09b
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/singlerole1.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    model: myModel
+    delegate: Component {
+        Text { objectName: "name"; text: name }
+    }
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/singlerole2.qml b/tests/auto/declarative/qsgvisualdatamodel/data/singlerole2.qml
new file mode 100644
index 0000000000..c6d3413dfd
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/singlerole2.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+ListView {
+    width: 100
+    height: 100
+    model: myModel
+    delegate: Component {
+        Text { objectName: "name"; text: modelData }
+    }
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/visualdatamodel.qml b/tests/auto/declarative/qsgvisualdatamodel/data/visualdatamodel.qml
new file mode 100644
index 0000000000..0bb5cd13e0
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/data/visualdatamodel.qml
@@ -0,0 +1,11 @@
+import QtQuick 2.0
+
+VisualDataModel {
+    function setRoot() {
+        rootIndex = modelIndex(0);
+    }
+    function setRootToParent() {
+        rootIndex = parentModelIndex();
+    }
+    model: myModel
+}
diff --git a/tests/auto/declarative/qsgvisualdatamodel/qsgvisualdatamodel.pro b/tests/auto/declarative/qsgvisualdatamodel/qsgvisualdatamodel.pro
new file mode 100644
index 0000000000..7d0df4dc7b
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/qsgvisualdatamodel.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qsgvisualdatamodel.cpp
+
+symbian: {
+    importFiles.files = data
+    importFiles.path = .
+    DEPLOYMENT += importFiles
+} else {
+    DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp b/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp
new file mode 100644
index 0000000000..23e629538d
--- /dev/null
+++ b/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp
@@ -0,0 +1,531 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtest.h>
+#include <QtTest/QSignalSpy>
+#include <QStandardItemModel>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtDeclarative/qsgview.h>
+#include <private/qsglistview_p.h>
+#include <private/qsgtext_p.h>
+#include <private/qsgvisualitemmodel_p.h>
+#include <private/qdeclarativevaluetype_p.h>
+#include <math.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+static void initStandardTreeModel(QStandardItemModel *model)
+{
+    QStandardItem *item;
+    item = new QStandardItem(QLatin1String("Row 1 Item"));
+    model->insertRow(0, item);
+
+    item = new QStandardItem(QLatin1String("Row 2 Item"));
+    item->setCheckable(true);
+    model->insertRow(1, item);
+
+    QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item"));
+    item->setChild(0, childItem);
+
+    item = new QStandardItem(QLatin1String("Row 3 Item"));
+    item->setIcon(QIcon());
+    model->insertRow(2, item);
+}
+
+class SingleRoleModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+public:
+    SingleRoleModel(QObject *parent = 0) {
+        QHash<int, QByteArray> roles;
+        roles.insert(Qt::DisplayRole , "name");
+        setRoleNames(roles);
+        list << "one" << "two" << "three" << "four";
+    }
+
+public slots:
+    void set(int idx, QString string) {
+        list[idx] = string;
+        emit dataChanged(index(idx,0), index(idx,0));
+    }
+
+protected:
+    int rowCount(const QModelIndex &parent = QModelIndex()) const {
+        return list.count();
+    }
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
+        if (role == Qt::DisplayRole)
+            return list.at(index.row());
+        return QVariant();
+    }
+
+private:
+    QStringList list;
+};
+
+
+class tst_qsgvisualdatamodel : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qsgvisualdatamodel();
+
+private slots:
+    void rootIndex();
+    void updateLayout();
+    void childChanged();
+    void objectListModel();
+    void singleRole();
+    void modelProperties();
+    void noDelegate();
+
+private:
+    QDeclarativeEngine engine;
+    template<typename T>
+    T *findItem(QSGItem *parent, const QString &objectName, int index);
+};
+
+class DataObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
+
+public:
+    DataObject(QObject *parent=0) : QObject(parent) {}
+    DataObject(const QString &name, const QString &color, QObject *parent=0)
+        : QObject(parent), m_name(name), m_color(color) { }
+
+
+    QString name() const { return m_name; }
+    void setName(const QString &name) {
+        if (name != m_name) {
+            m_name = name;
+            emit nameChanged();
+        }
+    }
+
+    QString color() const { return m_color; }
+    void setColor(const QString &color) {
+        if (color != m_color) {
+            m_color = color;
+            emit colorChanged();
+        }
+    }
+
+signals:
+    void nameChanged();
+    void colorChanged();
+
+private:
+    QString m_name;
+    QString m_color;
+};
+
+tst_qsgvisualdatamodel::tst_qsgvisualdatamodel()
+{
+}
+
+void tst_qsgvisualdatamodel::rootIndex()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/visualdatamodel.qml"));
+
+    QStandardItemModel model;
+    initStandardTreeModel(&model);
+
+    engine.rootContext()->setContextProperty("myModel", &model);
+
+    QSGVisualDataModel *obj = qobject_cast<QSGVisualDataModel*>(c.create());
+    QVERIFY(obj != 0);
+
+    QMetaObject::invokeMethod(obj, "setRoot");
+    QVERIFY(qvariant_cast<QModelIndex>(obj->rootIndex()) == model.index(0,0));
+
+    QMetaObject::invokeMethod(obj, "setRootToParent");
+    QVERIFY(qvariant_cast<QModelIndex>(obj->rootIndex()) == QModelIndex());
+
+    delete obj;
+}
+
+void tst_qsgvisualdatamodel::updateLayout()
+{
+    QSGView view;
+
+    QStandardItemModel model;
+    initStandardTreeModel(&model);
+
+    view.rootContext()->setContextProperty("myModel", &model);
+
+    view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml"));
+
+    QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+    QVERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    QSGText *name = findItem<QSGText>(contentItem, "display", 0);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 1 Item"));
+    name = findItem<QSGText>(contentItem, "display", 1);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 2 Item"));
+    name = findItem<QSGText>(contentItem, "display", 2);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 3 Item"));
+
+    model.invisibleRootItem()->sortChildren(0, Qt::DescendingOrder);
+
+    name = findItem<QSGText>(contentItem, "display", 0);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 3 Item"));
+    name = findItem<QSGText>(contentItem, "display", 1);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 2 Item"));
+    name = findItem<QSGText>(contentItem, "display", 2);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 1 Item"));
+}
+
+void tst_qsgvisualdatamodel::childChanged()
+{
+    QSGView view;
+
+    QStandardItemModel model;
+    initStandardTreeModel(&model);
+
+    view.rootContext()->setContextProperty("myModel", &model);
+
+    view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml"));
+
+    QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+    QVERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    QSGVisualDataModel *vdm = listview->findChild<QSGVisualDataModel*>("visualModel");
+    vdm->setRootIndex(QVariant::fromValue(model.indexFromItem(model.item(1,0))));
+
+    QSGText *name = findItem<QSGText>(contentItem, "display", 0);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 2 Child Item"));
+
+    model.item(1,0)->child(0,0)->setText("Row 2 updated child");
+
+    name = findItem<QSGText>(contentItem, "display", 0);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 2 updated child"));
+
+    model.item(1,0)->appendRow(new QStandardItem(QLatin1String("Row 2 Child Item 2")));
+    QTest::qWait(300);
+
+    name = findItem<QSGText>(contentItem, "display", 1);
+    QVERIFY(name != 0);
+    QCOMPARE(name->text(), QString("Row 2 Child Item 2"));
+
+    model.item(1,0)->takeRow(1);
+    name = findItem<QSGText>(contentItem, "display", 1);
+    QVERIFY(name == 0);
+
+    vdm->setRootIndex(QVariant::fromValue(QModelIndex()));
+    QTest::qWait(300);
+    name = findItem<QSGText>(contentItem, "display", 0);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 1 Item"));
+    name = findItem<QSGText>(contentItem, "display", 1);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 2 Item"));
+    name = findItem<QSGText>(contentItem, "display", 2);
+    QVERIFY(name);
+    QCOMPARE(name->text(), QString("Row 3 Item"));
+}
+
+void tst_qsgvisualdatamodel::objectListModel()
+{
+    QSGView view;
+
+    QList<QObject*> dataList;
+    dataList.append(new DataObject("Item 1", "red"));
+    dataList.append(new DataObject("Item 2", "green"));
+    dataList.append(new DataObject("Item 3", "blue"));
+    dataList.append(new DataObject("Item 4", "yellow"));
+
+    QDeclarativeContext *ctxt = view.rootContext();
+    ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));
+
+    view.setSource(QUrl::fromLocalFile(SRCDIR "/data/objectlist.qml"));
+
+    QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+    QVERIFY(listview != 0);
+
+    QSGItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    QSGText *name = findItem<QSGText>(contentItem, "name", 0);
+    QCOMPARE(name->text(), QString("Item 1"));
+
+    QSGText *section = findItem<QSGText>(contentItem, "section", 0);
+    QCOMPARE(section->text(), QString("Item 1"));
+
+    dataList[0]->setProperty("name", QLatin1String("Changed"));
+    QCOMPARE(name->text(), QString("Changed"));
+}
+
+void tst_qsgvisualdatamodel::singleRole()
+{
+    {
+        QSGView view;
+
+        SingleRoleModel model;
+
+        QDeclarativeContext *ctxt = view.rootContext();
+        ctxt->setContextProperty("myModel", &model);
+
+        view.setSource(QUrl::fromLocalFile(SRCDIR "/data/singlerole1.qml"));
+
+        QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+        QVERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QVERIFY(contentItem != 0);
+
+        QSGText *name = findItem<QSGText>(contentItem, "name", 1);
+        QCOMPARE(name->text(), QString("two"));
+
+        model.set(1, "Changed");
+        QCOMPARE(name->text(), QString("Changed"));
+    }
+    {
+        QSGView view;
+
+        SingleRoleModel model;
+
+        QDeclarativeContext *ctxt = view.rootContext();
+        ctxt->setContextProperty("myModel", &model);
+
+        view.setSource(QUrl::fromLocalFile(SRCDIR "/data/singlerole2.qml"));
+
+        QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+        QVERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QVERIFY(contentItem != 0);
+
+        QSGText *name = findItem<QSGText>(contentItem, "name", 1);
+        QCOMPARE(name->text(), QString("two"));
+
+        model.set(1, "Changed");
+        QCOMPARE(name->text(), QString("Changed"));
+    }
+}
+
+void tst_qsgvisualdatamodel::modelProperties()
+{
+    {
+        QSGView view;
+
+        SingleRoleModel model;
+
+        QDeclarativeContext *ctxt = view.rootContext();
+        ctxt->setContextProperty("myModel", &model);
+
+        view.setSource(QUrl::fromLocalFile(SRCDIR "/data/modelproperties.qml"));
+
+        QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+        QVERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QVERIFY(contentItem != 0);
+
+        QSGItem *delegate = findItem<QSGItem>(contentItem, "delegate", 1);
+        QVERIFY(delegate);
+        QCOMPARE(delegate->property("test1").toString(),QString("two"));
+        QCOMPARE(delegate->property("test2").toString(),QString("two"));
+        QCOMPARE(delegate->property("test3").toString(),QString("two"));
+        QCOMPARE(delegate->property("test4").toString(),QString("two"));
+        QVERIFY(!delegate->property("test9").isValid());
+        QCOMPARE(delegate->property("test5").toString(),QString(""));
+        QVERIFY(delegate->property("test6").value<QObject*>() != 0);
+        QCOMPARE(delegate->property("test7").toInt(),1);
+        QCOMPARE(delegate->property("test8").toInt(),1);
+    }
+
+    {
+        QSGView view;
+
+        QList<QObject*> dataList;
+        dataList.append(new DataObject("Item 1", "red"));
+        dataList.append(new DataObject("Item 2", "green"));
+        dataList.append(new DataObject("Item 3", "blue"));
+        dataList.append(new DataObject("Item 4", "yellow"));
+
+        QDeclarativeContext *ctxt = view.rootContext();
+        ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));
+
+        view.setSource(QUrl::fromLocalFile(SRCDIR "/data/modelproperties.qml"));
+
+        QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+        QVERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QVERIFY(contentItem != 0);
+
+        QSGItem *delegate = findItem<QSGItem>(contentItem, "delegate", 1);
+        QVERIFY(delegate);
+        QCOMPARE(delegate->property("test1").toString(),QString("Item 2"));
+        QEXPECT_FAIL("", "QTBUG-13576", Continue);
+        QCOMPARE(delegate->property("test2").toString(),QString("Item 2"));
+        QVERIFY(qobject_cast<DataObject*>(delegate->property("test3").value<QObject*>()) != 0);
+        QVERIFY(qobject_cast<DataObject*>(delegate->property("test4").value<QObject*>()) != 0);
+        QCOMPARE(delegate->property("test5").toString(),QString("Item 2"));
+        QCOMPARE(delegate->property("test9").toString(),QString("Item 2"));
+        QVERIFY(delegate->property("test6").value<QObject*>() != 0);
+        QCOMPARE(delegate->property("test7").toInt(),1);
+        QCOMPARE(delegate->property("test8").toInt(),1);
+    }
+
+    {
+        QSGView view;
+
+        QStandardItemModel model;
+        initStandardTreeModel(&model);
+
+        view.rootContext()->setContextProperty("myModel", &model);
+
+        QUrl source(QUrl::fromLocalFile(SRCDIR "/data/modelproperties2.qml"));
+
+        //3 items, 3 warnings each
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":17: TypeError: Result of expression 'model.modelData' [undefined] is not an object.");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":17: TypeError: Result of expression 'model.modelData' [undefined] is not an object.");
+        QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":17: TypeError: Result of expression 'model.modelData' [undefined] is not an object.");
+
+        view.setSource(source);
+
+        QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+        QVERIFY(listview != 0);
+
+        QSGItem *contentItem = listview->contentItem();
+        QVERIFY(contentItem != 0);
+
+        QSGItem *delegate = findItem<QSGItem>(contentItem, "delegate", 1);
+        QVERIFY(delegate);
+        QCOMPARE(delegate->property("test1").toString(),QString("Row 2 Item"));
+        QCOMPARE(delegate->property("test2").toString(),QString("Row 2 Item"));
+        QVERIFY(!delegate->property("test3").isValid());
+        QVERIFY(!delegate->property("test4").isValid());
+        QVERIFY(!delegate->property("test5").isValid());
+        QVERIFY(!delegate->property("test9").isValid());
+        QVERIFY(delegate->property("test6").value<QObject*>() != 0);
+        QCOMPARE(delegate->property("test7").toInt(),1);
+        QCOMPARE(delegate->property("test8").toInt(),1);
+    }
+
+    //### should also test QStringList and QVariantList
+}
+
+void tst_qsgvisualdatamodel::noDelegate()
+{
+    QSGView view;
+
+    QStandardItemModel model;
+    initStandardTreeModel(&model);
+
+    view.rootContext()->setContextProperty("myModel", &model);
+
+    view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml"));
+
+    QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject());
+    QVERIFY(listview != 0);
+
+    QSGVisualDataModel *vdm = listview->findChild<QSGVisualDataModel*>("visualModel");
+    QVERIFY(vdm != 0);
+    QCOMPARE(vdm->count(), 3);
+
+    vdm->setDelegate(0);
+    QCOMPARE(vdm->count(), 0);
+}
+
+
+template<typename T>
+T *tst_qsgvisualdatamodel::findItem(QSGItem *parent, const QString &objectName, int index)
+{
+    const QMetaObject &mo = T::staticMetaObject;
+    //qDebug() << parent->childItems().count() << "children";
+    for (int i = 0; i < parent->childItems().count(); ++i) {
+        QSGItem *item = qobject_cast<QSGItem*>(parent->childItems().at(i));
+        if(!item)
+            continue;
+        //qDebug() << "try" << item;
+        if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
+            if (index != -1) {
+                QDeclarativeExpression e(qmlContext(item), item, "index");
+                if (e.evaluate().toInt() == index)
+                    return static_cast<T*>(item);
+            } else {
+                return static_cast<T*>(item);
+            }
+        }
+        item = findItem<T>(item, objectName, index);
+        if (item)
+        return static_cast<T*>(item);
+    }
+
+    return 0;
+}
+
+QTEST_MAIN(tst_qsgvisualdatamodel)
+
+#include "tst_qsgvisualdatamodel.moc"
diff --git a/tests/benchmarks/declarative/declarative.pro b/tests/benchmarks/declarative/declarative.pro
index cb02a35c27..a827978d63 100644
--- a/tests/benchmarks/declarative/declarative.pro
+++ b/tests/benchmarks/declarative/declarative.pro
@@ -3,6 +3,7 @@ TEMPLATE = subdirs
 SUBDIRS += \
            binding \
            creation \
+           holistic \
            pointers \
            qdeclarativecomponent \
            qdeclarativeimage \
diff --git a/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicFour.qml b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicFour.qml
new file mode 100644
index 0000000000..81a666bf47
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicFour.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 100
+    property int dynamicHeight: rect1.height + rect2.height
+    property int widthSignaledProperty: 10
+    property int heightSignaledProperty: 10
+
+    Rectangle {
+        id: rect1
+        width: root.dynamicWidth + 20
+        height: width + (5*3) - 8 + (width/9)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    Rectangle {
+        id: rect2
+        width: rect1.width - 50
+        height: width + (5*4) - 6 + (width/3)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    onDynamicWidthChanged: {
+        widthSignaledProperty = widthSignaledProperty + (6*5) - 2;
+    }
+
+    onDynamicHeightChanged: {
+        heightSignaledProperty = widthSignaledProperty + heightSignaledProperty + (5*3) - 7;
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicOne.qml b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicOne.qml
new file mode 100644
index 0000000000..6e726b12d4
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicOne.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 10
+
+    Rectangle {
+        width: 100
+        height: root.dynamicWidth + (5*3) - 8 + (root.dynamicWidth/10)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicThree.qml b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicThree.qml
new file mode 100644
index 0000000000..19000d78fa
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicThree.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 10
+    property int widthSignaledProperty: 20
+
+    Rectangle {
+        width: 100
+        height: root.dynamicWidth + (5*3) - 8 + (root.dynamicWidth/10)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    onDynamicWidthChanged: {
+        widthSignaledProperty = dynamicWidth + (20/4) + 7 - 1;
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicTwo.qml b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicTwo.qml
new file mode 100644
index 0000000000..4f7340589b
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/dynamicTargets/DynamicTwo.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 100
+    property int dynamicHeight: rect1.height + rect2.height
+
+    Rectangle {
+        id: rect1
+        width: root.dynamicWidth + 20
+        height: width + (5*3) - 8 + (width/9)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    Rectangle {
+        id: rect2
+        width: rect1.width - 50
+        height: width + (5*4) - 6 + (width/3)
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Mlbsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Mlbsi.qml
new file mode 100644
index 0000000000..2ce9728d6a
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Mlbsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "mlbsi.js" as MlbsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MlbsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Mldsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Mldsi.qml
new file mode 100644
index 0000000000..c4455a46dc
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Mldsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "mldsi.js" as MldsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MldsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Mlsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Mlsi.qml
new file mode 100644
index 0000000000..99bb222e7a
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Mlsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "mlsi.js" as MlsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MlsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/ModuleBm.qml b/tests/benchmarks/declarative/holistic/data/jsImports/ModuleBm.qml
new file mode 100644
index 0000000000..bdae3564fc
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/ModuleBm.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "moduleBm.js" as ModuleBmJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: ModuleBmJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Msbsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Msbsi.qml
new file mode 100644
index 0000000000..05026cbf71
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Msbsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "msbsi.js" as MsbsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MsbsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Msdsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Msdsi.qml
new file mode 100644
index 0000000000..cd6ae72a56
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Msdsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "msdsi.js" as MsdsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MsdsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Mssi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Mssi.qml
new file mode 100644
index 0000000000..604f2ebd6e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Mssi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "mssi.js" as MssiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: MssiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/PragmaBm.qml b/tests/benchmarks/declarative/holistic/data/jsImports/PragmaBm.qml
new file mode 100644
index 0000000000..24709b93c2
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/PragmaBm.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "pragmaBmOne.js" as PragmaBmOneJs
+import "pragmaBmTwo.js" as PragmaBmTwoJs
+
+Item {
+    id: testQtObject
+
+    // value = 20 + 2 + 9 + (nbr times shared testFunc has been called previously == 0)
+    property int importedScriptFunctionValueOne: PragmaBmOneJs.testFuncOne(20)
+
+    // value = 20 + 3 + 9 + (nbr times shared testFunc has been called previously == 1)
+    property int importedScriptFunctionValueTwo: PragmaBmTwoJs.testFuncTwo(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/PragmaModuleBm.qml b/tests/benchmarks/declarative/holistic/data/jsImports/PragmaModuleBm.qml
new file mode 100644
index 0000000000..cac23cf412
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/PragmaModuleBm.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "pragmaModuleBm.js" as PragmaModuleBmJs
+
+Item {
+    id: testQtObject
+
+    // value = 20 + (Qt.test.Enum3 == 2) + 9 + (nbr times shared testFunc has been called previously = 0) + 9 + (nbr times shared testFunc has been called previously = 1)
+    property int importedScriptFunctionValue: PragmaModuleBmJs.testFuncThree(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Slsi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Slsi.qml
new file mode 100644
index 0000000000..50d6de784e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Slsi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "slsi.js" as SlsiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: SlsiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/Sssi.qml b/tests/benchmarks/declarative/holistic/data/jsImports/Sssi.qml
new file mode 100644
index 0000000000..b92a5a7cc9
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/Sssi.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+import "sssi.js" as SssiJs
+
+Item {
+    id: testQtObject
+    property int importedScriptFunctionValue: SssiJs.testFunc(20)
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi.js
new file mode 100644
index 0000000000..c4ea363cb7
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi.js
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports many other (non-nested) single, small, scripts.
+
+.import "mlbsi1.js" as Mlbsi1
+.import "mlbsi2.js" as Mlbsi2
+.import "mlbsi3.js" as Mlbsi3
+.import "mlbsi4.js" as Mlbsi4
+.import "mlbsi5.js" as Mlbsi5
+.import "mlbsi6.js" as Mlbsi6
+.import "mlbsi7.js" as Mlbsi7
+.import "mlbsi8.js" as Mlbsi8
+.import "mlbsi9.js" as Mlbsi9
+.import "mlbsi10.js" as Mlbsi10
+.import "mlbsi11.js" as Mlbsi11
+.import "mlbsi12.js" as Mlbsi12
+.import "mlbsi13.js" as Mlbsi13
+.import "mlbsi14.js" as Mlbsi14
+.import "mlbsi15.js" as Mlbsi15
+
+function testFunc(seedValue) {
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    var retn = cumulativeTotal * 0.53;
+    retn += Mlbsi1.testFunc(seedValue);
+    retn += Mlbsi2.testFunc(seedValue);
+    retn += Mlbsi3.testFunc(seedValue);
+    retn += Mlbsi4.testFunc(seedValue);
+    retn += Mlbsi5.testFunc(seedValue);
+    retn += Mlbsi6.testFunc(retn);
+    retn += Mlbsi7.testFunc(seedValue);
+    retn += Mlbsi8.testFunc(seedValue);
+    retn += Mlbsi9.testFunc(retn);
+    retn += Mlbsi10.testFunc(seedValue);
+    retn += Mlbsi11.testFunc(seedValue);
+    retn += Mlbsi12.testFunc(seedValue);
+    retn += Mlbsi13.testFunc(seedValue);
+    retn += Mlbsi14.testFunc(seedValue);
+    retn += Mlbsi15.testFunc(seedValue);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000017 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000017 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi1.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi1.js
new file mode 100644
index 0000000000..ad91dbf11e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi1.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.145);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi10.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi10.js
new file mode 100644
index 0000000000..ce67b15163
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi10.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1045);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000010 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000010 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi11.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi11.js
new file mode 100644
index 0000000000..54836c520c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi11.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1145);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000011 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000011 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi12.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi12.js
new file mode 100644
index 0000000000..c48a81854c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi12.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1245);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000012 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000012 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi13.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi13.js
new file mode 100644
index 0000000000..f228e129fd
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi13.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1345);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000013 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000013 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi14.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi14.js
new file mode 100644
index 0000000000..e97c58ad90
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi14.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1445);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000014 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000014 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi15.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi15.js
new file mode 100644
index 0000000000..7c08c62f82
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi15.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1545);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000015 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000015 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi2.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi2.js
new file mode 100644
index 0000000000..19154f0580
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi2.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.245);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00002 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00002 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi3.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi3.js
new file mode 100644
index 0000000000..473a8b1145
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi3.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.345);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00003 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00003 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi4.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi4.js
new file mode 100644
index 0000000000..96f8851226
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi4.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.445);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00004 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00004 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi5.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi5.js
new file mode 100644
index 0000000000..0aa4a3b4de
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi5.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.545);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00005 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00005 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi6.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi6.js
new file mode 100644
index 0000000000..550e4054f7
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi6.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.645);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00006 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00006 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi7.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi7.js
new file mode 100644
index 0000000000..a3502c2bdb
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi7.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.745);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00007 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00007 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi8.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi8.js
new file mode 100644
index 0000000000..af9c574e7c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi8.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.845);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00008 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00008 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi9.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi9.js
new file mode 100644
index 0000000000..1f233a6eed
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlbsi9.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.945);
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00009 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00009 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi.js
new file mode 100644
index 0000000000..59df07c1c9
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi.js
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+
+.import "mldsi1.js" as Mldsi1
+
+function testFunc(seedValue) {
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    var retn = cumulativeTotal * 0.5;
+    retn *= Mldsi1.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000017 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000017 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi1.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi1.js
new file mode 100644
index 0000000000..94d186b88c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi1.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi2.js" as Msdsi2
+
+function testFunc(seedValue) {
+    var retn = 0.15;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi2.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi10.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi10.js
new file mode 100644
index 0000000000..5a60306209
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi10.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi11.js" as Msdsi11
+
+function testFunc(seedValue) {
+    var retn = 0.105;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi11.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000010 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000010 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi11.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi11.js
new file mode 100644
index 0000000000..8a7b95304c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi11.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi12.js" as Msdsi12
+
+function testFunc(seedValue) {
+    var retn = 0.115;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi12.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000011 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000011 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi12.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi12.js
new file mode 100644
index 0000000000..30f371649f
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi12.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi13.js" as Msdsi13
+
+function testFunc(seedValue) {
+    var retn = 0.125;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi13.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000012 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000012 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi13.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi13.js
new file mode 100644
index 0000000000..65f3e4a952
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi13.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi14.js" as Msdsi14
+
+function testFunc(seedValue) {
+    var retn = 0.135;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi14.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000013 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000013 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi14.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi14.js
new file mode 100644
index 0000000000..5dd6dcfe49
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi14.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi15.js" as Msdsi15
+
+function testFunc(seedValue) {
+    var retn = 0.145;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi15.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000014 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000014 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi15.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi15.js
new file mode 100644
index 0000000000..c6873d8e72
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi15.js
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It is imported by another script.
+
+function testFunc(seedValue) {
+    var retn = 0.155;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= (seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.000015 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.000015 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi2.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi2.js
new file mode 100644
index 0000000000..a876ebee7d
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi2.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi3.js" as Msdsi3
+
+function testFunc(seedValue) {
+    var retn = 0.25;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi3.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00002 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00002 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi3.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi3.js
new file mode 100644
index 0000000000..cab8b2662d
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi3.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi4.js" as Msdsi4
+
+function testFunc(seedValue) {
+    var retn = 0.35;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi4.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00003 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00003 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi4.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi4.js
new file mode 100644
index 0000000000..69c14a0278
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi4.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi5.js" as Msdsi5
+
+function testFunc(seedValue) {
+    var retn = 0.45;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi5.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00004 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00004 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi5.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi5.js
new file mode 100644
index 0000000000..889766f3ce
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi5.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi6.js" as Msdsi6
+
+function testFunc(seedValue) {
+    var retn = 0.55;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi6.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00005 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00005 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi6.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi6.js
new file mode 100644
index 0000000000..332b60679e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi6.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi7.js" as Msdsi7
+
+function testFunc(seedValue) {
+    var retn = 0.65;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi7.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00006 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00006 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi7.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi7.js
new file mode 100644
index 0000000000..0b1ef645b0
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi7.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi8.js" as Msdsi8
+
+function testFunc(seedValue) {
+    var retn = 0.75;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi8.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00007 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00007 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi8.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi8.js
new file mode 100644
index 0000000000..2f4145aba9
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi8.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi9.js" as Msdsi9
+
+function testFunc(seedValue) {
+    var retn = 0.85;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi9.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00008 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00008 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mldsi9.js b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi9.js
new file mode 100644
index 0000000000..d06a00d31c
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mldsi9.js
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports other large scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi10.js" as Msdsi10
+
+function testFunc(seedValue) {
+    var retn = 0.95;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn *= (1 + (cumulativeTotal * 0.001));
+    retn *= Msdsi10.testFunc(seedValue + retn);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00009 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00009 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mlsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/mlsi.js
new file mode 100644
index 0000000000..fbc9b41882
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mlsi.js
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports many other (non-nested) single, large, scripts,
+// and also imports many other nested, large scripts.
+
+.import "mldsi4.js" as Mldsi4
+.import "mldsi9.js" as Mldsi9
+.import "mlbsi1.js" as Mlbsi1
+.import "mlbsi2.js" as Mlbsi2
+.import "mlbsi3.js" as Mlbsi3
+.import "mlbsi4.js" as Mlbsi4
+.import "mlbsi5.js" as Mlbsi5
+.import "mlbsi6.js" as Mlbsi6
+.import "mlbsi7.js" as Mlbsi7
+.import "mlbsi8.js" as Mlbsi8
+.import "mlbsi9.js" as Mlbsi9
+.import "mlbsi10.js" as Mlbsi10
+.import "mlbsi11.js" as Mlbsi11
+.import "mlbsi12.js" as Mlbsi12
+.import "mlbsi13.js" as Mlbsi13
+.import "mlbsi14.js" as Mlbsi14
+.import "mlbsi15.js" as Mlbsi15
+
+function testFunc(seedValue) {
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    var retn = cumulativeTotal;
+    retn += Mlbsi1.testFunc(seedValue);
+    retn += Mlbsi2.testFunc(seedValue);
+    retn += Mlbsi3.testFunc(retn);
+    retn += Mlbsi4.testFunc(seedValue);
+    retn += Mlbsi5.testFunc(seedValue);
+    retn += Mlbsi6.testFunc(seedValue);
+    retn *= Mldsi9.testFunc(retn);
+    retn += Mlbsi7.testFunc(seedValue);
+    retn += Mlbsi8.testFunc(retn);
+    retn += Mlbsi9.testFunc(seedValue);
+    retn += Mlbsi10.testFunc(seedValue);
+    retn += Mlbsi11.testFunc(seedValue);
+    retn *= Mldsi4.testFunc(retn);
+    retn += Mlbsi12.testFunc(seedValue);
+    retn += Mlbsi13.testFunc(retn);
+    retn += Mlbsi14.testFunc(seedValue);
+    retn += Mlbsi15.testFunc(seedValue);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/moduleBm.js b/tests/benchmarks/declarative/holistic/data/jsImports/moduleBm.js
new file mode 100644
index 0000000000..7de7e89b9a
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/moduleBm.js
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+.import Qt.test 1.0 as QtTest
+
+function testFunc(seedValue) {
+    var retn = QtTest.EnumValue3;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn += (cumulativeTotal * 0.45);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
+
+
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi.js
new file mode 100644
index 0000000000..c60ce88dd9
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi.js
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports many other (non-nested) single, small, scripts.
+
+.import "msbsi1.js" as Msbsi1
+.import "msbsi2.js" as Msbsi2
+.import "msbsi3.js" as Msbsi3
+.import "msbsi4.js" as Msbsi4
+.import "msbsi5.js" as Msbsi5
+.import "msbsi6.js" as Msbsi6
+.import "msbsi7.js" as Msbsi7
+.import "msbsi8.js" as Msbsi8
+.import "msbsi9.js" as Msbsi9
+.import "msbsi10.js" as Msbsi10
+.import "msbsi11.js" as Msbsi11
+.import "msbsi12.js" as Msbsi12
+.import "msbsi13.js" as Msbsi13
+.import "msbsi14.js" as Msbsi14
+.import "msbsi15.js" as Msbsi15
+
+function testFunc(seedValue) {
+    var retn = 10 * (seedValue * 0.45);
+    retn += Msbsi1.testFunc(seedValue);
+    retn += Msbsi2.testFunc(seedValue);
+    retn += Msbsi3.testFunc(seedValue);
+    retn += Msbsi4.testFunc(seedValue);
+    retn += Msbsi5.testFunc(seedValue);
+    retn += Msbsi6.testFunc(seedValue);
+    retn += Msbsi7.testFunc(seedValue);
+    retn += Msbsi8.testFunc(seedValue);
+    retn += Msbsi9.testFunc(seedValue);
+    retn += Msbsi10.testFunc(seedValue);
+    retn += Msbsi11.testFunc(seedValue);
+    retn += Msbsi12.testFunc(seedValue);
+    retn += Msbsi13.testFunc(seedValue);
+    retn += Msbsi14.testFunc(seedValue);
+    retn += Msbsi15.testFunc(seedValue);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi1.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi1.js
new file mode 100644
index 0000000000..422558121d
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi1.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.145);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi10.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi10.js
new file mode 100644
index 0000000000..0ee3a369d6
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi10.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1045);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi11.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi11.js
new file mode 100644
index 0000000000..40e993c9bd
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi11.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1145);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi12.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi12.js
new file mode 100644
index 0000000000..ba8d9d6bda
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi12.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1245);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi13.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi13.js
new file mode 100644
index 0000000000..9544c9fe74
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi13.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1345);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi14.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi14.js
new file mode 100644
index 0000000000..df70f05452
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi14.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1445);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi15.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi15.js
new file mode 100644
index 0000000000..82c1ac581d
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi15.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.1545);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi2.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi2.js
new file mode 100644
index 0000000000..cf10dcb52e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi2.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.245);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi3.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi3.js
new file mode 100644
index 0000000000..d743c44f6a
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi3.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.345);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi4.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi4.js
new file mode 100644
index 0000000000..df8f977ba5
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi4.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.445);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi5.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi5.js
new file mode 100644
index 0000000000..3c00c1cdf0
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi5.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.545);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi6.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi6.js
new file mode 100644
index 0000000000..0aa0e93dbd
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi6.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.645);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi7.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi7.js
new file mode 100644
index 0000000000..933fca8a72
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi7.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.745);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi8.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi8.js
new file mode 100644
index 0000000000..4f76257e72
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi8.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.845);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msbsi9.js b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi9.js
new file mode 100644
index 0000000000..3b2433e076
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msbsi9.js
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+// It is imported from another script.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.945);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi.js
new file mode 100644
index 0000000000..13182480c6
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi.js
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+
+.import "msdsi1.js" as Msdsi1
+
+function testFunc(seedValue) {
+    var retn = 0.5;
+    retn *= Msdsi1.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi1.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi1.js
new file mode 100644
index 0000000000..1d987567cc
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi1.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi2.js" as Msdsi2
+
+function testFunc(seedValue) {
+    var retn = 0.15;
+    retn *= Msdsi2.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi10.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi10.js
new file mode 100644
index 0000000000..90b3e8173b
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi10.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi11.js" as Msdsi11
+
+function testFunc(seedValue) {
+    var retn = 0.105;
+    retn *= Msdsi11.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi11.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi11.js
new file mode 100644
index 0000000000..1df1dae7e0
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi11.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi12.js" as Msdsi12
+
+function testFunc(seedValue) {
+    var retn = 0.115;
+    retn *= Msdsi12.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi12.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi12.js
new file mode 100644
index 0000000000..4c5d6bcdb4
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi12.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi13.js" as Msdsi13
+
+function testFunc(seedValue) {
+    var retn = 0.125;
+    retn *= Msdsi13.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi13.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi13.js
new file mode 100644
index 0000000000..858233dec7
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi13.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi14.js" as Msdsi14
+
+function testFunc(seedValue) {
+    var retn = 0.135;
+    retn *= Msdsi14.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi14.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi14.js
new file mode 100644
index 0000000000..bafceb0931
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi14.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi15.js" as Msdsi15
+
+function testFunc(seedValue) {
+    var retn = 0.145;
+    retn *= Msdsi15.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi15.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi15.js
new file mode 100644
index 0000000000..c3d2c0ba01
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi15.js
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It is imported by another script.
+
+function testFunc(seedValue) {
+    var retn = 0.155;
+    retn *= (seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi2.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi2.js
new file mode 100644
index 0000000000..2d63a9d0a8
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi2.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi3.js" as Msdsi3
+
+function testFunc(seedValue) {
+    var retn = 0.25;
+    retn *= Msdsi3.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi3.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi3.js
new file mode 100644
index 0000000000..c281240f15
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi3.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi4.js" as Msdsi4
+
+function testFunc(seedValue) {
+    var retn = 0.35;
+    retn *= Msdsi4.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi4.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi4.js
new file mode 100644
index 0000000000..eb44d0f5e2
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi4.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi5.js" as Msdsi5
+
+function testFunc(seedValue) {
+    var retn = 0.45;
+    retn *= Msdsi5.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi5.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi5.js
new file mode 100644
index 0000000000..fd3abc3a7a
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi5.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi6.js" as Msdsi6
+
+function testFunc(seedValue) {
+    var retn = 0.55;
+    retn *= Msdsi6.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi6.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi6.js
new file mode 100644
index 0000000000..eb5adde3ca
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi6.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi7.js" as Msdsi7
+
+function testFunc(seedValue) {
+    var retn = 0.65;
+    retn *= Msdsi7.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi7.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi7.js
new file mode 100644
index 0000000000..32e41dc642
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi7.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi8.js" as Msdsi8
+
+function testFunc(seedValue) {
+    var retn = 0.75;
+    retn *= Msdsi8.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi8.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi8.js
new file mode 100644
index 0000000000..ecdb97f5b2
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi8.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi9.js" as Msdsi9
+
+function testFunc(seedValue) {
+    var retn = 0.85;
+    retn *= Msdsi9.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/msdsi9.js b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi9.js
new file mode 100644
index 0000000000..9082cddd3e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/msdsi9.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports other small scripts which are deeply nested.
+// It is imported by another script.
+
+.import "msdsi10.js" as Msdsi10
+
+function testFunc(seedValue) {
+    var retn = 0.95;
+    retn *= Msdsi10.testFunc(seedValue + retn);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/mssi.js b/tests/benchmarks/declarative/holistic/data/jsImports/mssi.js
new file mode 100644
index 0000000000..2254c5c585
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/mssi.js
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It imports many other (non-nested) single, small, scripts,
+// and also imports many other nested, small scripts.
+
+.import "msdsi4.js" as Msdsi4
+.import "msdsi9.js" as Msdsi9
+.import "msbsi1.js" as Msbsi1
+.import "msbsi2.js" as Msbsi2
+.import "msbsi3.js" as Msbsi3
+.import "msbsi4.js" as Msbsi4
+.import "msbsi5.js" as Msbsi5
+.import "msbsi6.js" as Msbsi6
+.import "msbsi7.js" as Msbsi7
+.import "msbsi8.js" as Msbsi8
+.import "msbsi9.js" as Msbsi9
+.import "msbsi10.js" as Msbsi10
+.import "msbsi11.js" as Msbsi11
+.import "msbsi12.js" as Msbsi12
+.import "msbsi13.js" as Msbsi13
+.import "msbsi14.js" as Msbsi14
+.import "msbsi15.js" as Msbsi15
+
+function testFunc(seedValue) {
+    var retn = 10 * (seedValue * 0.85);
+    retn += Msbsi1.testFunc(seedValue);
+    retn += Msbsi2.testFunc(seedValue);
+    retn += Msbsi3.testFunc(retn);
+    retn += Msbsi4.testFunc(seedValue);
+    retn += Msbsi5.testFunc(seedValue);
+    retn += Msbsi6.testFunc(seedValue);
+    retn *= Msdsi9.testFunc(retn);
+    retn += Msbsi7.testFunc(seedValue);
+    retn += Msbsi8.testFunc(retn);
+    retn += Msbsi9.testFunc(seedValue);
+    retn += Msbsi10.testFunc(seedValue);
+    retn += Msbsi11.testFunc(seedValue);
+    retn *= Msdsi4.testFunc(retn);
+    retn += Msbsi12.testFunc(seedValue);
+    retn += Msbsi13.testFunc(retn);
+    retn += Msbsi14.testFunc(seedValue);
+    retn += Msbsi15.testFunc(seedValue);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmOne.js b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmOne.js
new file mode 100644
index 0000000000..e3c54000bb
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmOne.js
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports a shared library script.
+.import "pragmaLib.js" as PragmaLibJs
+
+function testFuncOne(seedValue) {
+    var retn = seedValue + 2;
+    retn += PragmaLibJs.testFunc();
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmTwo.js b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmTwo.js
new file mode 100644
index 0000000000..9a28fafbca
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaBmTwo.js
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports a shared library script.
+.import "pragmaLib.js" as PragmaLibJs
+
+function testFuncTwo(seedValue) {
+    var retn = seedValue + 3;
+    retn += PragmaLibJs.testFunc();
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/pragmaLib.js b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaLib.js
new file mode 100644
index 0000000000..a247d75ed1
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaLib.js
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+// It is a shared script, with data which should be shared.
+.pragma library
+
+var sharedValue = 9;
+
+function testFunc() {
+    var retn = sharedValue;
+    sharedValue += 1; // increment the shared value
+    return retn;
+}
+
+function testFuncBig(seedValue) {
+    var retn = sharedValue;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn += (cumulativeTotal * 0.45);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    sharedValue += 1; // increment the shared value
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
+
+
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/pragmaModuleBm.js b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaModuleBm.js
new file mode 100644
index 0000000000..6f363082da
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/pragmaModuleBm.js
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It imports a QML module and two other scripts.
+// Each of those two other scripts imports a single script,
+// which is a .pragma library script (shared between the two).
+
+.import Qt.test 1.0 as QtTest
+.import "pragmaBmOne.js" as PragmaBmOneJs
+.import "pragmaBmTwo.js" as PragmaBmTwoJs
+
+function testFuncThree(seedValue) {
+    var retn = seedValue + QtTest.EnumValue3;
+    retn += PragmaBmOneJs.testFuncOne(seedValue);
+    retn += PragmaBmTwoJs.testFuncTwo(seedValue);
+    return retn;
+}
+
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/slsi.js b/tests/benchmarks/declarative/holistic/data/jsImports/slsi.js
new file mode 100644
index 0000000000..c1741087fa
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/slsi.js
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, large, imported script.
+// It doesn't import any other scripts.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    var firstFactor = calculateFirstFactor(seedValue);
+    var secondFactor = calculateSecondFactor(seedValue);
+    var modificationTerm = calculateModificationTerm(seedValue);
+
+    // do some regexp matching
+    var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+    var regexpPattern = new RegExp("is", "i");
+    var regexpOutputLength = 0;
+    var temp = regexpPattern.exec(someString);
+    while (temp == "is") {
+        regexpOutputLength += 4;
+        regexpOutputLength *= 2;
+        temp = regexpPattern.exec(someString);
+        if (regexpOutputLength > (seedValue * 3)) {
+            temp = "break";
+        }
+    }
+
+    // spin in a for loop for a while
+    var i = 0;
+    var j = 0;
+    var cumulativeTotal = 3;
+    for (i = 20; i > 1; i--) {
+        for (j = 31; j > 5; j--) {
+            var branchVariable = i + j;
+            if (branchVariable % 3 == 0) {
+                cumulativeTotal -= secondFactor;
+            } else {
+                cumulativeTotal += firstFactor;
+            }
+
+            if (cumulativeTotal > (seedValue * 50)) {
+                break;
+            }
+        }
+    }
+    retn += (cumulativeTotal * 0.45);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
+
+function calculateFirstFactor(seedValue) {
+    var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+    firstFactor *= (1 + (0.00001 / seedValue));
+    return firstFactor;
+}
+
+function calculateSecondFactor(seedValue) {
+    var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+    secondFactor *= (1 + (0.00001 / seedValue));
+    return secondFactor;
+}
+
+function calculateModificationTerm(seedValue) {
+    var modificationTerm = (12 + (9*7) - 54 + 16 - ((calculateFirstFactor(seedValue) * seedValue) / 3) + (4*calculateSecondFactor(seedValue) * seedValue * 1.33)) + (calculateSecondFactor(seedValue) * seedValue);
+    modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+    return modificationTerm;
+}
+
+
diff --git a/tests/benchmarks/declarative/holistic/data/jsImports/sssi.js b/tests/benchmarks/declarative/holistic/data/jsImports/sssi.js
new file mode 100644
index 0000000000..b52e88dc53
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsImports/sssi.js
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This JavaScript file is a single, small, imported script.
+// It doesn't import any other scripts.
+
+function testFunc(seedValue) {
+    var retn = 5;
+    retn += (seedValue * 0.45);
+    retn *= (1 + (3.1415962 / seedValue));
+    retn /= 2.41497;
+    retn -= (seedValue * -1);
+    return retn;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsTargets/JsOne.qml b/tests/benchmarks/declarative/holistic/data/jsTargets/JsOne.qml
new file mode 100644
index 0000000000..fcdd0819d1
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsTargets/JsOne.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 10
+    property int widthSignaledProperty: 20
+
+    Rectangle {
+        width: 100
+        height: 50
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    onDynamicWidthChanged: {
+        widthSignaledProperty = dynamicWidth + (20/4) + 7 - 1;
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/jsTargets/JsTwo.qml b/tests/benchmarks/declarative/holistic/data/jsTargets/JsTwo.qml
new file mode 100644
index 0000000000..980c76f21e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/jsTargets/JsTwo.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int dynamicWidth: 10
+    property int widthSignaledProperty: 20
+
+    Rectangle {
+        width: 100
+        height: 50
+        color: "red"
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+
+    function calculateFirstFactor(seedValue) {
+        var firstFactor = (0.45 * (9.3 / 3.1) - 0.90);
+        firstFactor *= (1 + (0.00001 / seedValue));
+        return firstFactor;
+    }
+
+    function calculateSecondFactor(seedValue) {
+        var secondFactor = 0.78 * (6.3 / 2.1) - (0.39 * 4);
+        secondFactor *= (1 + (0.00001 / seedValue));
+        return secondFactor;
+    }
+
+    function calculateModificationTerm(seedValue) {
+        var modificationTerm = (12 + (9*7) - 54 + 16 - ((root.calculateFirstFactor(seedValue + 0.3) * seedValue) / 3) + (4*root.calculateSecondFactor(seedValue+2) * seedValue * 1.33)) + (root.calculateSecondFactor(seedValue+1) * seedValue);
+        modificationTerm = modificationTerm + (33/2) + 19 - (9*2) - (61*3) + 177;
+        return modificationTerm;
+    }
+
+    onDynamicWidthChanged: {
+        // do a bit of maths
+        var firstFactor = root.calculateFirstFactor(8);
+        var secondFactor = root.calculateSecondFactor(dynamicWidth / firstFactor);
+        var modificationTerm = root.calculateModificationTerm(dynamicWidth / secondFactor);
+
+        // do some regexp matching
+        var someString = "This is a random string which we'll perform regular expression matching on to reduce considerably.  This is meant to be part of a complex javascript expression whose evaluation takes considerably longer than the creation cost of QScriptValue.";
+        var regexpPattern = new RegExp("is", "i");
+        var regexpOutputLength = 0;
+        var temp = regexpPattern.exec(someString);
+        while (temp == "is") {
+            regexpOutputLength += 4;
+            regexpOutputLength *= 2;
+            temp = regexpPattern.exec(someString);
+            if (regexpOutputLength > (dynamicWidth * 3)) {
+                temp = "break";
+            }
+        }
+
+        // spin in a for loop for a while
+        var i = 0;
+        var j = 0;
+        var cumulativeTotal = 3;
+        for (i = 20; i > 1; i--) {
+            for (j = 31; j > 5; j--) {
+                var branchVariable = i + j;
+                if (branchVariable % 3 == 0) {
+                    cumulativeTotal -= secondFactor;
+                } else {
+                    cumulativeTotal += firstFactor;
+                }
+
+                if (cumulativeTotal > (dynamicWidth * 50)) {
+                    break;
+                }
+            }
+        }
+
+        // and update the property
+        widthSignaledProperty = (dynamicWidth + (20/4) + 7 - 1) * modificationTerm + regexpOutputLength - (cumulativeTotal / 73);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/largeTargets/gridview-example.qml b/tests/benchmarks/declarative/holistic/data/largeTargets/gridview-example.qml
new file mode 100644
index 0000000000..e904c0a647
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/largeTargets/gridview-example.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+    width: 300; height: 400
+    color: "white"
+
+    ListModel {
+        id: appModel
+        ListElement { name: "Music"; shade: "blue" }
+        ListElement { name: "Movies"; shade: "red" }
+        ListElement { name: "Camera"; shade: "green" }
+        ListElement { name: "Calendar"; shade: "yellow" }
+        ListElement { name: "Messaging"; shade: "cyan" }
+        ListElement { name: "Todo List"; shade: "magenta" }
+        ListElement { name: "Contacts"; shade: "black" }
+    }
+
+    Component {
+        id: appDelegate
+
+        Item {
+            width: 100; height: 100
+
+            Rectangle {
+                id: myColoredIcon
+                width: 20
+                height: 20
+                y: 20; anchors.horizontalCenter: parent.horizontalCenter
+                color: shade
+            }
+            Text {
+                anchors { top: myColoredIcon.bottom; horizontalCenter: parent.horizontalCenter }
+                text: name
+            }
+        }
+    }
+
+    Component {
+        id: appHighlight
+        Rectangle { width: 80; height: 80; color: "lightsteelblue" }
+    }
+
+    GridView {
+        anchors.fill: parent
+        cellWidth: 100; cellHeight: 100
+        highlight: appHighlight
+        focus: true
+        model: appModel
+        delegate: appDelegate
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/largeTargets/layoutdirection.qml b/tests/benchmarks/declarative/holistic/data/largeTargets/layoutdirection.qml
new file mode 100644
index 0000000000..9b6a652c14
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/largeTargets/layoutdirection.qml
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.1
+
+Rectangle {
+
+    width: column.width + 100
+    height: column.height + 100
+    property int direction: Qt.application.layoutDirection
+
+    Column {
+        id: column
+        spacing: 10
+        anchors.centerIn: parent
+        width: 230
+
+        Text {
+            text: "Row"
+            anchors.horizontalCenter: parent.horizontalCenter
+        }
+        Row {
+            layoutDirection: direction
+            spacing: 10
+            move: Transition {
+                NumberAnimation {
+                    properties: "x"
+                }
+            }
+            Repeater {
+                model: 4
+                Loader {
+                    property int value: index
+                    sourceComponent: delegate
+                }
+            }
+        }
+        Text {
+            text: "Grid"
+            anchors.horizontalCenter: parent.horizontalCenter
+        }
+        Grid {
+           layoutDirection: direction
+           spacing: 10; columns: 4
+           move: Transition {
+               NumberAnimation {
+                   properties: "x"
+               }
+           }
+           Repeater {
+               model: 11
+               Loader {
+                   property int value: index
+                   sourceComponent: delegate
+               }
+            }
+        }
+        Text {
+            text: "Flow"
+            anchors.horizontalCenter: parent.horizontalCenter
+        }
+        Flow {
+           layoutDirection: direction
+           spacing: 10; width: parent.width
+           move: Transition {
+               NumberAnimation {
+                   properties: "x"
+               }
+           }
+           Repeater {
+               model: 10
+               Loader {
+                   property int value: index
+                   sourceComponent: delegate
+               }
+            }
+        }
+        Rectangle {
+           height: 50; width: parent.width
+           color: mouseArea.pressed ? "black" : "gray"
+           Text {
+                text: direction ? "Right to left" : "Left to right"
+                color: "white"
+                font.pixelSize: 16
+                anchors.centerIn: parent
+            }
+            MouseArea {
+                id: mouseArea
+                onClicked: {
+                    if (direction == Qt.LeftToRight) {
+                        direction = Qt.RightToLeft;
+                    } else {
+                        direction = Qt.LeftToRight;
+                    }
+                }
+                anchors.fill: parent
+            }
+        }
+    }
+
+    Component {
+        id: delegate
+        Rectangle {
+            width: 50; height: 50
+            color: Qt.rgba(0.8/(parent.value+1),0.8/(parent.value+1),0.8/(parent.value+1),1.0)
+            Text {
+                text: parent.parent.value+1
+                color: "white"
+                font.pixelSize: 20
+                anchors.centerIn: parent
+            }
+        }
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/largeTargets/mousearea-example.qml b/tests/benchmarks/declarative/holistic/data/largeTargets/mousearea-example.qml
new file mode 100644
index 0000000000..9bca78ff60
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/largeTargets/mousearea-example.qml
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+    id: box
+    width: 350; height: 250
+
+    Rectangle {
+        id: redSquare
+        width: 80; height: 80
+        anchors.top: parent.top; anchors.left: parent.left; anchors.margins: 10
+        color: "red"
+
+        Text { text: "Click"; font.pixelSize: 16; anchors.centerIn: parent }
+
+        MouseArea {
+            anchors.fill: parent
+            hoverEnabled: true
+            acceptedButtons: Qt.LeftButton | Qt.RightButton
+
+            onEntered: info.text = 'Entered'
+            onExited: info.text = 'Exited (pressed=' + pressed + ')'
+
+            onPressed: {
+                info.text = 'Pressed (button=' + (mouse.button == Qt.RightButton ? 'right' : 'left')
+                    + ' shift=' + (mouse.modifiers & Qt.ShiftModifier ? 'true' : 'false') + ')'
+                var posInBox = redSquare.mapToItem(box, mouse.x, mouse.y)
+                posInfo.text = + mouse.x + ',' + mouse.y + ' in square'
+                        + ' (' + posInBox.x + ',' + posInBox.y + ' in window)'
+            }
+
+            onReleased: {
+                info.text = 'Released (isClick=' + mouse.isClick + ' wasHeld=' + mouse.wasHeld + ')'
+                posInfo.text = ''
+            }
+
+            onPressAndHold: info.text = 'Press and hold'
+            onClicked: info.text = 'Clicked (wasHeld=' + mouse.wasHeld + ')'
+            onDoubleClicked: info.text = 'Double clicked'
+        }
+    }
+
+    Rectangle {
+        id: blueSquare
+        width: 80; height: 80
+        x: box.width - width - 10; y: 10    // making this item draggable, so don't use anchors
+        color: "blue"
+
+        Text { text: "Drag"; font.pixelSize: 16; color: "white"; anchors.centerIn: parent }
+
+        MouseArea {
+            anchors.fill: parent
+            drag.target: blueSquare
+            drag.axis: Drag.XandYAxis
+            drag.minimumX: 0
+            drag.maximumX: box.width - parent.width
+            drag.minimumY: 0
+            drag.maximumY: box.height - parent.width
+        }
+    }
+
+    Text {
+        id: info
+        anchors.bottom: posInfo.top; anchors.horizontalCenter: parent.horizontalCenter; anchors.margins: 30
+
+        onTextChanged: console.log(text)
+    }
+
+    Text {
+        id: posInfo
+        anchors.bottom: parent.bottom; anchors.horizontalCenter: parent.horizontalCenter; anchors.margins: 30
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/resolutionTargets/ResolveOne.qml b/tests/benchmarks/declarative/holistic/data/resolutionTargets/ResolveOne.qml
new file mode 100644
index 0000000000..7a5ea39fff
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/resolutionTargets/ResolveOne.qml
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This file has some nested items and does a lot of id resolution.
+// This will allow us to benchmark the cost of resolving names in
+// bindings.
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int baseWidth: 500
+    property int baseHeight: 600
+    property string baseColor: "red"
+
+    Item {
+        id: childOne
+        property int baseWidth: root.baseWidth - 1
+        property int baseHeight: root.baseHeight - 1
+        property string baseColor: root.baseColor
+
+        Item {
+            id: childTwo
+            property int baseWidth: root.baseWidth - 2
+            property int baseHeight: childOne.baseHeight - 1
+            property string baseColor: childOne.baseColor
+
+            Item {
+                id: childThree
+                property int baseWidth: childOne.baseWidth - 2
+                property int baseHeight: root.baseHeight - 3
+                property string baseColor: "blue"
+
+                Item {
+                    id: childFour
+                    property int baseWidth: childTwo.baseWidth - 2
+                    property int baseHeight: childThree.baseHeight - 1
+                    property string baseColor: "earthy " + root.baseColor
+
+                    Item {
+                        id: childFive
+                        property int baseWidth: root.baseWidth - 5
+                        property int baseHeight: childFour.baseHeight - 1
+                        property string baseColor: "carnelian " + childTwo.baseColor
+                    }
+                }
+
+                Item {
+                    id: childSix
+                    property int baseWidth: parent.baseWidth - 3
+                    property int baseHeight: root.baseHeight - 6
+                    property string baseColor: "rust " + root.baseColor
+
+                    Item {
+                        id: childSeven
+                        property int baseWidth: childOne.baseWidth - 6
+                        property int baseHeight: childTwo.baseHeight - 5
+                        property string baseColor: "sky " + childThree.baseColor
+                    }
+                }
+            }
+        }
+    }
+
+    Rectangle {
+        width: childOne.baseWidth
+        height: childOne.baseHeight
+        color: parent.baseColor
+        border.color: "black"
+        border.width: 5
+        radius: 10
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToJs.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToJs.qml
new file mode 100644
index 0000000000..11c6b37f05
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToJs.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import "cppToJs.js" as CppToJs
+
+Item {
+    id: jsConsumer
+    property int sideEffect: 10
+
+    function callJsFunction() {
+        jsConsumer.sideEffect = jsConsumer.sideEffect + CppToJs.nextValue;
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToQml.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToQml.qml
new file mode 100644
index 0000000000..23adcd957b
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/CppToQml.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    id: root
+    property int arbitrary: 10
+    property int dependent: arbitrary + 5
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEight.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEight.qml
new file mode 100644
index 0000000000..1379f62771
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEight.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with an integer return value and an integer argument.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + arbitraryVariantProvider.modifyVariantChangeCount(arbitraryVariantConsumer.sideEffect);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEleven.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEleven.qml
new file mode 100644
index 0000000000..53479e9cb6
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppEleven.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property variant someVariant;
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with variant return value and variant + integer arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 3;
+        var tempVariant = arbitraryVariantProvider.setVariantToFilledPixmap(sideEffect + 183, sideEffect + 134, sideEffect + 38, sideEffect + 77, sideEffect + 21);
+        someVariant = arbitraryVariantProvider.setVariantAddCount(sideEffect, tempVariant);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFive.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFive.qml
new file mode 100644
index 0000000000..52320eb91e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFive.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a const CPP function with an integer return value and no arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + arbitraryVariantProvider.variantChangeCount();
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFour.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFour.qml
new file mode 100644
index 0000000000..ab567012e3
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppFour.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with no return value and an integer argument.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 2;
+        arbitraryVariantProvider.setVariantChangeCount(arbitraryVariantConsumer.sideEffect);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppNine.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppNine.qml
new file mode 100644
index 0000000000..d8f99f4623
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppNine.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property variant someVariant;
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a const CPP function with variant return value and integer arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 3;
+        someVariant = arbitraryVariantProvider.possibleVariant(sideEffect, sideEffect * 2, sideEffect * 5);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppOne.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppOne.qml
new file mode 100644
index 0000000000..057b50c8ec
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppOne.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a const CPP function with no return value and no arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 2;
+        arbitraryVariantProvider.doNothing();
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSeven.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSeven.qml
new file mode 100644
index 0000000000..9f9735bf36
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSeven.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a const CPP function with an integer return value and an integer argument.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + arbitraryVariantProvider.countPlus(arbitraryVariantConsumer.sideEffect);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSix.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSix.qml
new file mode 100644
index 0000000000..f5cd9bf722
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppSix.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with an integer return value and no arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + arbitraryVariantProvider.modifyVariantChangeCount();
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTen.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTen.qml
new file mode 100644
index 0000000000..b9f90e0596
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTen.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property variant someVariant;
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with variant return value and integer arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 3;
+        someVariant = arbitraryVariantProvider.setVariantToFilledPixmap(sideEffect + 183, sideEffect + 134, sideEffect + 38, sideEffect + 77, sideEffect + 21);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppThree.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppThree.qml
new file mode 100644
index 0000000000..65ed8b9925
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppThree.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a const CPP function with no return value and an integer argument.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 2;
+        arbitraryVariantProvider.doNothing(arbitraryVariantConsumer.sideEffect);
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTwo.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTwo.qml
new file mode 100644
index 0000000000..221e196eb8
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/JsToCppTwo.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: arbitraryVariantConsumer
+    property MyArbitraryVariantProvider a: MyArbitraryVariantProvider { id: arbitraryVariantProvider }
+    property int sideEffect: 10
+
+    function callCppFunction() {
+        // in this case, we call a nonconst CPP function with no return value and no arguments.
+        arbitraryVariantConsumer.sideEffect = arbitraryVariantConsumer.sideEffect + 2;
+        arbitraryVariantProvider.incrementVariantChangeCount();
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceOne.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceOne.qml
new file mode 100644
index 0000000000..531849dcce
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceOne.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: scarceResourceConsumer
+
+    property MyScarceResourceProvider a: MyScarceResourceProvider { id: scarceResourceProvider }
+
+    property variant ssr;
+    property variant lsr;
+
+    function copyScarceResources() {
+        ssr = scarceResourceProvider.smallScarceResource;
+        lsr = scarceResourceProvider.largeScarceResource;
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceTwo.qml b/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceTwo.qml
new file mode 100644
index 0000000000..a9ef7e355d
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/ScarceTwo.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import Qt.test 1.0
+
+Item {
+    id: scarceResourceConsumer
+
+    property MyScarceResourceProvider a: MyScarceResourceProvider { id: scarceResourceProvider }
+
+    property variant ssr: scarceResourceProvider.smallScarceResource
+    property variant lsr: scarceResourceProvider.largeScarceResource
+}
diff --git a/tests/benchmarks/declarative/holistic/data/scopeSwitching/cppToJs.js b/tests/benchmarks/declarative/holistic/data/scopeSwitching/cppToJs.js
new file mode 100644
index 0000000000..ace7ec5f5e
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/scopeSwitching/cppToJs.js
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+.pragma library
+
+var generatedValue = 5;
+
+function generateNextValue() {
+    generatedValue += 1;
+    return generatedValue;
+}
diff --git a/tests/benchmarks/declarative/holistic/data/smallTargets/SmallFour.qml b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallFour.qml
new file mode 100644
index 0000000000..fac4966d41
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallFour.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Text {
+    text: "Hello World!"
+    font.family: "Helvetica"
+    font.pointSize: 24
+    color: "red"
+}
diff --git a/tests/benchmarks/declarative/holistic/data/smallTargets/SmallOne.qml b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallOne.qml
new file mode 100644
index 0000000000..e055fd94f7
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallOne.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+    width: 100
+    height: 100
+    color: "red"
+    border.color: "black"
+    border.width: 5
+    radius: 10
+}
diff --git a/tests/benchmarks/declarative/holistic/data/smallTargets/SmallThree.qml b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallThree.qml
new file mode 100644
index 0000000000..70ed0ef046
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallThree.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+    width: 100; height: 100
+    gradient: Gradient {
+        GradientStop { position: 0.0; color: "red" }
+        GradientStop { position: 0.33; color: "yellow" }
+        GradientStop { position: 1.0; color: "green" }
+    }
+}
diff --git a/tests/benchmarks/declarative/holistic/data/smallTargets/SmallTwo.qml b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallTwo.qml
new file mode 100644
index 0000000000..c473ce53a6
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/data/smallTargets/SmallTwo.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+    width: 100
+    height: 100
+    color: "blue"
+    border.color: "black"
+    border.width: 5
+    radius: 10
+}
diff --git a/tests/benchmarks/declarative/holistic/holistic.pro b/tests/benchmarks/declarative/holistic/holistic.pro
new file mode 100644
index 0000000000..7f27696d60
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/holistic.pro
@@ -0,0 +1,19 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_holistic
+QT += declarative script network
+macx:CONFIG -= app_bundle
+
+CONFIG += release
+
+SOURCES += tst_holistic.cpp \
+           testtypes.cpp
+HEADERS += testtypes.h
+
+symbian {
+  data.files += data
+  data.path = .
+  DEPLOYMENT += data
+} else {
+  DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
diff --git a/tests/benchmarks/declarative/holistic/testtypes.cpp b/tests/benchmarks/declarative/holistic/testtypes.cpp
new file mode 100644
index 0000000000..5c232430f7
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/testtypes.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "testtypes.h"
+#include <QWidget>
+#include <QPlainTextEdit>
+#include <QDeclarativeEngine>
+#include <QScriptEngine>
+
+static QScriptValue script_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+    static int testProperty = 13;
+    QScriptValue v = scriptEngine->newObject();
+    v.setProperty("scriptTestProperty", testProperty++);
+    return v;
+}
+
+static QObject *qobject_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+    testQObjectApi *o = new testQObjectApi();
+    o->setQObjectTestProperty(20);
+    return o;
+}
+
+static QObject *qobject_api_engine_parent(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
+{
+    Q_UNUSED(scriptEngine)
+
+    static int testProperty = 26;
+    testQObjectApi *o = new testQObjectApi(engine);
+    o->setQObjectTestProperty(testProperty++);
+    return o;
+}
+
+void registerTypes()
+{
+    qmlRegisterType<MyQmlObject>("Qt.test", 1,0, "MyQmlObjectAlias");
+    qmlRegisterType<MyQmlObject>("Qt.test", 1,0, "MyQmlObject");
+
+    qmlRegisterType<QPlainTextEdit>("Qt.test",1,0,"QPlainTextEdit");
+    qRegisterMetaType<MyQmlObject::MyType>("MyQmlObject::MyType");
+
+    qmlRegisterType<ScarceResourceProvider>("Qt.test", 1,0, "MyScarceResourceProvider");
+    qmlRegisterType<ArbitraryVariantProvider>("Qt.test", 1,0, "MyArbitraryVariantProvider");
+
+    qmlRegisterModuleApi("Qt.test",1,0,script_api);             // register (script) module API for an existing uri which contains elements
+    qmlRegisterModuleApi("Qt.test",1,0,qobject_api);            // register (qobject) for an existing uri for which another module API was previously regd.  Should replace!
+    qmlRegisterModuleApi("Qt.test.scriptApi",1,0,script_api);   // register (script) module API for a uri which doesn't contain elements
+    qmlRegisterModuleApi("Qt.test.qobjectApi",1,0,qobject_api); // register (qobject) module API for a uri which doesn't contain elements
+    qmlRegisterModuleApi("Qt.test.qobjectApi",1,3,qobject_api); // register (qobject) module API for a uri which doesn't contain elements, minor version set
+    qmlRegisterModuleApi("Qt.test.qobjectApi",2,0,qobject_api); // register (qobject) module API for a uri which doesn't contain elements, major version set
+    qmlRegisterModuleApi("Qt.test.qobjectApiParented",1,0,qobject_api_engine_parent); // register (parented qobject) module API for a uri which doesn't contain elements
+}
+
+//#include "testtypes.moc"
diff --git a/tests/benchmarks/declarative/holistic/testtypes.h b/tests/benchmarks/declarative/holistic/testtypes.h
new file mode 100644
index 0000000000..e3e0ffa482
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/testtypes.h
@@ -0,0 +1,355 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef TESTTYPES_H
+#define TESTTYPES_H
+
+#include <QtCore/qobject.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/qdeclarativeexpression.h>
+#include <QtCore/qpoint.h>
+#include <QtCore/qsize.h>
+#include <QtDeclarative/qdeclarativelist.h>
+#include <QtCore/qrect.h>
+#include <QtGui/qmatrix.h>
+#include <QtGui/qcolor.h>
+#include <QtGui/qpixmap.h>
+#include <QtGui/qvector3d.h>
+#include <QtCore/qdatetime.h>
+#include <QtScript/qscriptvalue.h>
+#include <QtDeclarative/qdeclarativescriptstring.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+
+class MyQmlAttachedObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int value READ value CONSTANT)
+    Q_PROPERTY(int value2 READ value2 WRITE setValue2)
+public:
+    MyQmlAttachedObject(QObject *parent) : QObject(parent), m_value2(0) {}
+
+    int value() const { return 19; }
+    int value2() const { return m_value2; }
+    void setValue2(int v) { m_value2 = v; }
+
+    void emitMySignal() { emit mySignal(); }
+
+signals:
+    void mySignal();
+
+private:
+    int m_value2;
+};
+
+class MyQmlObject : public QObject
+{
+    Q_OBJECT
+    Q_ENUMS(MyEnum)
+    Q_ENUMS(MyEnum2)
+    Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet)
+    Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT)
+    Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT)
+    Q_PROPERTY(int value READ value WRITE setValue)
+    Q_PROPERTY(int console READ console CONSTANT)
+    Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged)
+    Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged)
+    Q_PROPERTY(QDeclarativeListProperty<QObject> objectListProperty READ objectListProperty CONSTANT)
+    Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty)
+    Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp)
+    Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false)
+
+public:
+    MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {}
+
+    enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 };
+    enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3 };
+
+    bool trueProperty() const { return true; }
+    bool falseProperty() const { return false; }
+
+    QString stringProperty() const { return m_string; }
+    void setStringProperty(const QString &s)
+    {
+        if (s == m_string)
+            return;
+        m_string = s;
+        emit stringChanged();
+    }
+
+    QObject *objectProperty() const { return m_object; }
+    void setObjectProperty(QObject *obj) {
+        if (obj == m_object)
+            return;
+        m_object = obj;
+        emit objectChanged();
+    }
+
+    QDeclarativeListProperty<QObject> objectListProperty() { return QDeclarativeListProperty<QObject>(this, m_objectQList); }
+
+    bool methodCalled() const { return m_methodCalled; }
+    bool methodIntCalled() const { return m_methodIntCalled; }
+
+    QString string() const { return m_string; }
+
+    static MyQmlAttachedObject *qmlAttachedProperties(QObject *o) {
+        return new MyQmlAttachedObject(o);
+    }
+
+    int deleteOnSet() const { return 1; }
+    void setDeleteOnSet(int v) { if(v) delete this; }
+
+    int value() const { return m_value; }
+    void setValue(int v) { m_value = v; }
+
+    int resettableProperty() const { return m_resetProperty; }
+    void setResettableProperty(int v) { m_resetProperty = v; }
+    void resetProperty() { m_resetProperty = 13; }
+
+    QRegExp regExp() { return m_regExp; }
+    void setRegExp(const QRegExp &regExp) { m_regExp = regExp; }
+
+    int console() const { return 11; }
+
+    int nonscriptable() const { return 0; }
+    void setNonscriptable(int) {}
+
+    MyQmlObject *myinvokableObject;
+    Q_INVOKABLE MyQmlObject *returnme() { return this; }
+
+    struct MyType {
+        int value;
+    };
+    QVariant variant() const { return m_variant; }
+
+signals:
+    void basicSignal();
+    void argumentSignal(int a, QString b, qreal c);
+    void stringChanged();
+    void objectChanged();
+    void anotherBasicSignal();
+    void thirdBasicSignal();
+    void signalWithUnknownType(const MyQmlObject::MyType &arg);
+
+public slots:
+    void deleteMe() { delete this; }
+    void methodNoArgs() { m_methodCalled = true; }
+    void method(int a) { if(a == 163) m_methodIntCalled = true; }
+    void setString(const QString &s) { m_string = s; }
+    void myinvokable(MyQmlObject *o) { myinvokableObject = o; }
+    void variantMethod(const QVariant &v) { m_variant = v; }
+
+private:
+    friend class tst_qdeclarativeecmascript;
+    bool m_methodCalled;
+    bool m_methodIntCalled;
+
+    QObject *m_object;
+    QString m_string;
+    QList<QObject *> m_objectQList;
+    int m_value;
+    int m_resetProperty;
+    QRegExp m_regExp;
+    QVariant m_variant;
+};
+
+QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES)
+Q_DECLARE_METATYPE(MyQmlObject::MyType)
+
+class testQObjectApi : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY (int qobjectTestProperty READ qobjectTestProperty NOTIFY qobjectTestPropertyChanged)
+
+public:
+    testQObjectApi(QObject* parent = 0)
+        : QObject(parent), m_testProperty(0)
+    {
+    }
+
+    ~testQObjectApi() {}
+
+    int qobjectTestProperty() const { return m_testProperty; }
+    void setQObjectTestProperty(int tp) { m_testProperty = tp; emit qobjectTestPropertyChanged(tp); }
+
+signals:
+    void qobjectTestPropertyChanged(int testProperty);
+
+private:
+    int m_testProperty;
+};
+
+class ArbitraryVariantProvider : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QVariant arbitraryVariant READ arbitraryVariant WRITE setArbitraryVariant NOTIFY arbitraryVariantChanged)
+
+public:
+    ArbitraryVariantProvider(QObject *parent = 0)
+        : QObject(parent), m_value(QVariant(QString(QLatin1String("random string value")))), m_count(1)
+    {
+    }
+
+    ~ArbitraryVariantProvider() {}
+
+    // the variant provided by the provider
+    QVariant arbitraryVariant() const { return m_value; }
+    void setArbitraryVariant(const QVariant& value) { m_value = value; emit arbitraryVariantChanged(); }
+    Q_INVOKABLE int changeVariant()
+    {
+        QPixmap pv(150, 150);
+        pv.fill(Qt::green);
+        int choice = qrand() % 4;
+        switch (choice) {
+            case 0: setArbitraryVariant(QVariant(QString(QLatin1String("string variant value")))); break;
+            case 1: setArbitraryVariant(QVariant(QColor(110, 120, 130))); break;
+            case 2: setArbitraryVariant(QVariant(55)); break;
+            default: setArbitraryVariant(QVariant(pv)); break;
+        }
+
+        m_count += 1;
+        return m_count;
+    }
+    Q_INVOKABLE QVariant setVariantToFilledPixmap(int width, int height, int r, int g, int b)
+    {
+        QPixmap pv(width % 300, height % 300);
+        pv.fill(QColor(r % 256, g % 256, b % 256));
+        m_value = pv;
+        m_count += 1;
+        return m_value;
+    }
+    Q_INVOKABLE QVariant setVariantAddCount(int addToCount, const QVariant& newValue)
+    {
+        m_value = newValue;
+        m_count += addToCount;
+        return m_value;
+    }
+    Q_INVOKABLE QVariant possibleVariant(int randomFactorOne, int randomFactorTwo, int randomFactorThree) const
+    {
+        QVariant retn;
+        QPixmap pv(randomFactorOne % 300, randomFactorTwo % 300);
+        pv.fill(QColor(randomFactorOne % 256, randomFactorTwo % 256, randomFactorThree % 256));
+        int choice = qrand() % 4;
+        switch (choice) {
+            case 0: retn = QVariant(QString(QLatin1String("string variant value"))); break;
+            case 1: retn = QVariant(QColor(randomFactorThree % 256, randomFactorTwo % 256, randomFactorOne % 256)); break;
+            case 2: retn = QVariant((55 + randomFactorThree)); break;
+            default: retn = QVariant(pv); break;
+        }
+        return retn;
+    }
+
+    // the following functions cover permutations of return value and arguments.
+    // functions with no return value:
+    Q_INVOKABLE void doNothing() const { /* does nothing */ }                      // no args, const
+    Q_INVOKABLE void incrementVariantChangeCount() { m_count = m_count + 1; }      // no args, nonconst
+    Q_INVOKABLE void doNothing(int) const { /* does nothing. */ }                  // arg, const
+    Q_INVOKABLE void setVariantChangeCount(int newCount) { m_count = newCount; }   // arg, nonconst
+    // functions with return value:
+    Q_INVOKABLE int variantChangeCount() const { return m_count; }                 // no args, const
+    Q_INVOKABLE int modifyVariantChangeCount() { m_count += 3; return m_count; }   // no args, nonconst
+    Q_INVOKABLE int countPlus(int value) const { return m_count + value; }         // arg, const
+    Q_INVOKABLE int modifyVariantChangeCount(int modifier) { m_count += modifier; return m_count; } // arg, nonconst.
+
+signals:
+    void arbitraryVariantChanged();
+
+private:
+    QVariant m_value;
+    int m_count;
+};
+
+class ScarceResourceProvider : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QPixmap smallScarceResource READ smallScarceResource WRITE setSmallScarceResource NOTIFY smallScarceResourceChanged)
+    Q_PROPERTY(QPixmap largeScarceResource READ largeScarceResource WRITE setLargeScarceResource NOTIFY largeScarceResourceChanged)
+
+public:
+    ScarceResourceProvider(QObject *parent = 0)
+        : QObject(parent), m_small(100, 100), m_large(1000, 1000), m_colour(1)
+    {
+        m_small.fill(Qt::blue);
+        m_large.fill(Qt::blue);
+    }
+
+    ~ScarceResourceProvider() {}
+
+    QPixmap smallScarceResource() const { return m_small; }
+    void setSmallScarceResource(QPixmap v) { m_small = v; emit smallScarceResourceChanged(); }
+    bool smallScarceResourceIsDetached() const { return m_small.isDetached(); }
+
+    QPixmap largeScarceResource() const { return m_large; }
+    void setLargeScarceResource(QPixmap v) { m_large = v; emit largeScarceResourceChanged(); }
+    bool largeScarceResourceIsDetached() const { return m_large.isDetached(); }
+
+    Q_INVOKABLE void changeResources()
+    {
+        QPixmap newSmall(100, 100);
+        QPixmap newLarge(1000, 1000);
+
+        if (m_colour == 1) {
+            m_colour = 2;
+            newSmall.fill(Qt::red);
+            newLarge.fill(Qt::red);
+        } else {
+            m_colour = 1;
+            newSmall.fill(Qt::blue);
+            newLarge.fill(Qt::blue);
+        }
+
+        setSmallScarceResource(newSmall);
+        setLargeScarceResource(newLarge);
+    }
+
+signals:
+    void smallScarceResourceChanged();
+    void largeScarceResourceChanged();
+
+private:
+    QPixmap m_small;
+    QPixmap m_large;
+
+    int m_colour;
+};
+
+void registerTypes();
+
+#endif // TESTTYPES_H
+
diff --git a/tests/benchmarks/declarative/holistic/tst_holistic.cpp b/tests/benchmarks/declarative/holistic/tst_holistic.cpp
new file mode 100644
index 0000000000..63dc11fc4b
--- /dev/null
+++ b/tests/benchmarks/declarative/holistic/tst_holistic.cpp
@@ -0,0 +1,612 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "testtypes.h"
+
+#include <qtest.h>
+#include <QDeclarativeEngine>
+#include <QDeclarativeComponent>
+#include <QDeclarativeContext>
+#include <QDeclarativeProperty>
+#include <QFile>
+#include <QDebug>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+// Conceptually, there are several different "holistic" areas to benchmark:
+// 1) Loading
+//     - read file from disk
+//     - parse/lex file
+//     - handle nested imports
+// 2) Compilation
+//     - create meta object templates etc
+//     - compile to bytecode and cache it
+// 3) Instantiation
+//     - running the bytecode to create an object tree, assign properties, etc
+//     - and, importantly, to evaluate bindings for the first time (incl. js expressions)
+// 4) Dynamicism
+//     - bindings evaluation
+//     - signal handlers
+//
+// Aside from this, we also need to determine:
+// 1) JavaScript Metrics
+//     - simple expressions
+//     - complex expressions
+//     - instantiation vs evaluation time
+//     - imports and nested imports
+// 2) Context-switch costs
+//     - how expensive is it to call a cpp function from QML
+//     - how expensive is it to call a js function from cpp via QML
+//     - how expensive is it to pass around objects between them
+// 3) Complete creation time.
+//     - loading + compilation + instantiation (for "application startup time" metric)
+//
+// In some cases, we want to include "initialization costs";
+// i.e., we need to tell the engine not to cache type data resulting
+// in compilation between rounds, and we need to tell the engine not
+// to cache whatever it caches between instantiations of components.
+// The reason for this is that it is often the "first start of application"
+// performance which we're attempting to benchmark.
+
+// define some custom types we use in test data functions.
+typedef QList<QString> PropertyNameList;
+Q_DECLARE_METATYPE(PropertyNameList);
+typedef QList<QVariant> PropertyValueList;
+Q_DECLARE_METATYPE(PropertyValueList);
+
+class tst_holistic : public QObject
+{
+    Q_OBJECT
+
+public:
+    tst_holistic();
+
+private slots:
+    void initTestCase()
+    {
+        registerTypes();
+        qRegisterMetaType<PropertyNameList>("PropertyNameList");
+        qRegisterMetaType<PropertyValueList>("PropertyValueList");
+    }
+
+    void compilation_data();
+    void compilation();
+    void instantiation_data() { compilation_data(); }
+    void instantiation();
+    void creation_data() { compilation_data(); }
+    void creation();
+    void dynamicity_data();
+    void dynamicity();
+
+    void cppToJsDirect_data();
+    void cppToJsDirect();
+    void cppToJsIndirect();
+
+    void typeResolution_data();
+    void typeResolution();
+
+private:
+    QDeclarativeEngine engine;
+};
+
+tst_holistic::tst_holistic()
+{
+}
+
+inline QUrl TEST_FILE(const QString &filename)
+{
+    return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename);
+}
+
+
+void tst_holistic::compilation_data()
+{
+    QTest::addColumn<QStringList>("files");
+    QTest::addColumn<int>("repetitions");
+
+    QStringList f;
+
+    // Benchmarks: a single, small component once with no caching.
+    f << QString(SRCDIR + QLatin1String("/data/smallTargets/SmallOne.qml"));
+    QTest::newRow("single small component") << f << 1;
+
+    // Benchmarks: a single, small component ten times with caching.
+    QTest::newRow("single small component cached") << f << 10; f.clear();
+
+    // Benchmarks: a single, large component once with no caching.
+    f << QString(SRCDIR + QLatin1String("/data/largeTargets/mousearea-example.qml"));
+    QTest::newRow("single large component") << f << 1;
+
+    // Benchmarks: a single, large component ten times with caching.
+    QTest::newRow("single large component cached") << f << 10; f.clear();
+
+    // Benchmarks: 4 small components once each with no caching
+    f << QString(SRCDIR + QLatin1String("/data/smallTargets/SmallOne.qml"));
+    f << QString(SRCDIR + QLatin1String("/data/smallTargets/SmallTwo.qml"));
+    f << QString(SRCDIR + QLatin1String("/data/smallTargets/SmallThree.qml"));
+    f << QString(SRCDIR + QLatin1String("/data/smallTargets/SmallFour.qml"));
+    QTest::newRow("multiple small components") << f << 1;
+
+    // Benchmarks: 4 small components ten times each with caching
+    QTest::newRow("multiple small components cached") << f << 10; f.clear();
+
+    // Benchmarks: 3 large components once each with no caching.
+    f << QString(SRCDIR + QLatin1String("/data/largeTargets/mousearea-example.qml"));
+    f << QString(SRCDIR + QLatin1String("/data/largeTargets/gridview-example.qml"));
+    f << QString(SRCDIR + QLatin1String("/data/largeTargets/layoutdirection.qml"));
+    QTest::newRow("multiple large components") << f << 1;
+
+    // Benchmarks: 3 large components ten times each with caching.
+    QTest::newRow("multiple large components cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports a single small js file, no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Sssi.qml"));
+    QTest::newRow("single small js import") << f << 1;
+
+    // Benchmarks: single small component which imports a single small js file, 10 reps, with caching
+    QTest::newRow("single small js import, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple small js files (no deep nesting), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Msbsi.qml"));
+    QTest::newRow("multiple small js imports, shallow") << f << 1;
+
+    // Benchmarks: single small component which imports multiple small js files (no deep nesting), 10 reps, with caching
+    QTest::newRow("multiple small js imports, shallow, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple small js files (with deep nesting), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Msdsi.qml"));
+    QTest::newRow("multiple small js imports, deeply nested") << f << 1;
+
+    // Benchmarks: single small component which imports multiple small js files (with deep nesting), 10 reps, with caching
+    QTest::newRow("multiple small js imports, deeply nested, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple small js files (nested and unnested), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Mssi.qml"));
+    QTest::newRow("muliple small js imports, both") << f << 1;
+
+    // Benchmarks: single small component which imports multiple small js files (nested and unnested), 10 reps, with caching
+    QTest::newRow("muliple small js imports, both, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports a single large js file, no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Slsi.qml"));
+    QTest::newRow("single large js import") << f << 1;
+
+    // Benchmarks: single small component which imports a single large js file, 10 reps, with caching
+    QTest::newRow("single large js import, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple large js files (no deep nesting), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Mlbsi.qml"));
+    QTest::newRow("multiple large js imports, shallow") << f << 1;
+
+    // Benchmarks: single small component which imports multiple large js files (no deep nesting), 10 reps, with caching
+    QTest::newRow("multiple large js imports, shallow, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple large js files (with deep nesting), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Mldsi.qml"));
+    QTest::newRow("multiple large js imports, deeply nested") << f << 1;
+
+    // Benchmarks: single small component which imports multiple large js files (with deep nesting), 10 reps, with caching
+    QTest::newRow("multiple large js imports, deeply nested, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple large js files (nested and unnested), no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/Mlsi.qml"));
+    QTest::newRow("multiple large js imports, both") << f << 1;
+
+    // Benchmarks: single small component which imports multiple large js files (nested and unnested), 10 reps, with caching
+    QTest::newRow("multiple large js imports, both, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple js files which all import a .pragma library js file, no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/PragmaBm.qml"));
+    QTest::newRow(".pragma library js import") << f << 1;
+
+    // Benchmarks: single small component which imports multiple js files which all import a .pragma library js file, 10 reps, with caching
+    QTest::newRow(".pragma library js import, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports a js file which imports a QML module, no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/ModuleBm.qml"));
+    QTest::newRow("import js with QML import") << f << 1;
+
+    // Benchmarks: single small component which imports a js file which imports a QML module, 10 reps, with caching
+    QTest::newRow("import js with QML import, cached") << f << 10; f.clear();
+
+    // Benchmarks: single small component which imports multiple js files which all import a .pragma library js file and a QML module, no caching
+    f << QString(SRCDIR + QLatin1String("/data/jsImports/PragmaModuleBm.qml"));
+    QTest::newRow("import js with QML import and .pragma library") << f << 1;
+
+    // Benchmarks: single small component which imports multiple js files which all import a .pragma library js file and a QML module, 10 reps, with caching
+    QTest::newRow("import js with QML import and .pragma library, cached") << f << 10; f.clear();
+}
+
+void tst_holistic::compilation()
+{
+    // This function benchmarks the cost of loading and compiling specified QML files.
+    // If "repetitions" is non-zero, each file from "files" will be compiled "repetitions"
+    // times, without clearing the engine's component cache between compilations.
+
+    QFETCH(QStringList, files);
+    QFETCH(int, repetitions);
+    Q_ASSERT(files.size() > 0);
+    Q_ASSERT(repetitions > 0);
+
+    QBENCHMARK {
+        engine.clearComponentCache();
+        for (int i = 0; i < repetitions; ++i) {
+            for (int j = 0; j < files.size(); ++j) {
+                QDeclarativeComponent c(&engine, QUrl::fromLocalFile(files.at(j)));
+            }
+        }
+    }
+}
+
+void tst_holistic::instantiation()
+{
+    // This function benchmarks the cost of instantiating components compiled from specified QML files.
+    // If "repetitions" is non-zero, each component compiled from "files" will be instantiated "repetitions"
+    // times, without clearing the component's instantiation cache between instantiations.
+
+    QFETCH(QStringList, files);
+    QFETCH(int, repetitions);
+    Q_ASSERT(files.size() > 0);
+    Q_ASSERT(repetitions > 0);
+
+    QList<QDeclarativeComponent*> components;
+    for (int i = 0; i < files.size(); ++i) {
+        QDeclarativeComponent *c = new QDeclarativeComponent(&engine, QUrl::fromLocalFile(files.at(i)));
+        components.append(c);
+    }
+
+    QBENCHMARK {
+        // XXX TODO: clear each component's instantiation cache
+
+        for (int i = 0; i < repetitions; ++i) {
+            for (int j = 0; j < components.size(); ++j) {
+                QObject *obj = components.at(j)->create();
+                delete obj;
+            }
+        }
+    }
+
+    // cleanup
+    for (int i = 0; i < components.size(); ++i) {
+        delete components.at(i);
+    }
+}
+
+void tst_holistic::creation()
+{
+    // This function benchmarks the cost of loading, compiling  and instantiating specified QML files.
+    // If "repetitions" is non-zero, each file from "files" will be created "repetitions"
+    // times, without clearing the engine's component cache between component creation.
+
+    QFETCH(QStringList, files);
+    QFETCH(int, repetitions);
+    Q_ASSERT(files.size() > 0);
+    Q_ASSERT(repetitions > 0);
+
+    QBENCHMARK {
+        engine.clearComponentCache();
+        for (int i = 0; i < repetitions; ++i) {
+            for (int j = 0; j < files.size(); ++j) {
+                QDeclarativeComponent c(&engine, QUrl::fromLocalFile(files.at(j)));
+                QObject *obj = c.create();
+                delete obj;
+            }
+        }
+    }
+}
+
+void tst_holistic::dynamicity_data()
+{
+    QTest::addColumn<QString>("file");
+    QTest::addColumn<QString>("writeProperty");
+    QTest::addColumn<QVariant>("writeValueOne");
+    QTest::addColumn<QVariant>("writeValueTwo");
+    QTest::addColumn<QString>("readProperty");
+
+    QString f;
+
+    // Benchmarks: single simple property binding
+    f = QString(SRCDIR + QLatin1String("/data/dynamicTargets/DynamicOne.qml"));
+    QTest::newRow("single simple property binding") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("height"));
+
+    // Benchmarks: multiple simple property bindings in one component
+    f = QString(SRCDIR + QLatin1String("/data/dynamicTargets/DynamicTwo.qml"));
+    QTest::newRow("multiple simple property bindings") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("dynamicWidth"));
+
+    // Benchmarks: single simple property binding plus onPropertyChanged slot
+    f = QString(SRCDIR + QLatin1String("/data/dynamicTargets/DynamicThree.qml"));
+    QTest::newRow("single simple plus slot") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("dynamicWidth"));
+
+    // Benchmarks: multiple simple property bindings plus multiple onPropertyChanged slots in one component
+    f = QString(SRCDIR + QLatin1String("/data/dynamicTargets/DynamicFour.qml"));
+    QTest::newRow("multiple simple plus slots") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("dynamicHeight"));
+
+    // Benchmarks: single simple js expression in a slot
+    f = QString(SRCDIR + QLatin1String("/data/jsTargets/JsOne.qml"));
+    QTest::newRow("single simple js expression slot") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("dynamicWidth"));
+
+    // Benchmarks: single complex js expression in a slot
+    f = QString(SRCDIR + QLatin1String("/data/jsTargets/JsTwo.qml"));
+    QTest::newRow("single complex js expression slot") << f << QString(QLatin1String("dynamicWidth")) << QVariant(300) << QVariant(500) << QString(QLatin1String("dynamicWidth"));
+
+    // Benchmarks: simple property assignment and bindings update
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/CppToQml.qml"));
+    QTest::newRow("single simple property binding") << f << QString(QLatin1String("arbitrary")) << QVariant(36) << QVariant(35) << QString(QLatin1String("arbitrary"));
+}
+
+void tst_holistic::dynamicity()
+{
+    // This function benchmarks the cost of "continued operation" - signal invocation,
+    // updating bindings, etc.  Note that we take two different writeValues in order
+    // to force updates to occur, and we read to force lazy evaluation to occur.
+
+    QFETCH(QString, file);
+    QFETCH(QString, writeProperty);
+    QFETCH(QVariant, writeValueOne);
+    QFETCH(QVariant, writeValueTwo);
+    QFETCH(QString, readProperty);
+
+    QDeclarativeComponent c(&engine, file);
+    QObject *obj = c.create();
+
+    QVariant readValue;
+    QVariant writeValue;
+    bool usedFirst = false;
+
+    QBENCHMARK {
+        if (usedFirst) {
+            writeValue = writeValueTwo;
+            usedFirst = false;
+        } else {
+            writeValue = writeValueOne;
+            usedFirst = true;
+        }
+
+        obj->setProperty(writeProperty.toAscii().constData(), writeValue);
+        readValue = obj->property(readProperty.toAscii().constData());
+    }
+
+    delete obj;
+}
+
+
+
+
+
+
+
+void tst_holistic::cppToJsDirect_data()
+{
+    QTest::addColumn<QString>("file");
+    QTest::addColumn<QString>("methodName");
+
+    QString f;
+
+    // Benchmarks: cost of calling a js function from cpp directly
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/CppToJs.qml"));
+    QTest::newRow("cpp-to-js") << f << QString(QLatin1String("callJsFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // const CPP function with no return value and no arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppOne.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: no retn, no args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with no return value and no arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppTwo.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, no retn, no args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // const CPP function with no return value and a single integer argument.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppThree.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: const, no retn, int arg") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with no return value and a single integer argument.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppFour.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, no retn, int arg") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // const CPP function with an integer return value and no arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppFive.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: const, int retn, no args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with an integer return value and no arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppSix.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, int retn, no args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // const CPP function with an integer return value and a single integer argument.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppSeven.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: const, int retn, int arg") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with an integer return value and a single integer argument.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppEight.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, int retn, int arg") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // const CPP function with a variant return value and multiple integer arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppNine.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: const, variant retn, int args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with a variant return value and multiple integer arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppTen.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, variant retn, int args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: cost of calling js function which calls cpp function:
+    // nonconst CPP function with a variant return value and multiple integer arguments.
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/JsToCppEleven.qml"));
+    QTest::newRow("cpp-to-js-to-cpp: nonconst, variant retn, variant + int args") << f << QString(QLatin1String("callCppFunction"));
+
+    // Benchmarks: calling js function which copies scarce resources by calling back into cpp scope
+    f = QString(SRCDIR + QLatin1String("/data/scopeSwitching/ScarceOne.qml"));
+    QTest::newRow("cpp-to-js-to-coo: copy scarce resources") << f << QString(QLatin1String("copyScarceResources"));
+}
+
+
+void tst_holistic::cppToJsDirect()
+{
+    // This function benchmarks the cost of calling from CPP scope to JS scope
+    // (and possibly vice versa, if the invoked js method then calls to cpp).
+
+    QFETCH(QString, file);
+    QFETCH(QString, methodName);
+
+    QDeclarativeComponent c(&engine, file);
+    QObject *obj = c.create();
+
+    QBENCHMARK {
+        QMetaObject::invokeMethod(obj, methodName.toLatin1().constData());
+    }
+
+    delete obj;
+}
+
+
+void tst_holistic::cppToJsIndirect()
+{
+    // This function benchmarks the cost of binding scarce resources
+    // to properties of a QML component.  The engine should automatically release such
+    // resources when they are no longer used.
+    // The benchmark deliberately causes change signals to be emitted (and
+    // modifies the scarce resources) so that the properties are updated.
+
+    QDeclarativeComponent c(&engine, QString(SRCDIR + QLatin1String("/data/scopeSwitching/ScarceTwo.qml")));
+    QObject *obj = c.create();
+
+    ScarceResourceProvider *srp = 0;
+    srp = qobject_cast<ScarceResourceProvider*>(QDeclarativeProperty::read(obj, "a").value<QObject*>());
+
+    QBENCHMARK {
+        srp->changeResources(); // will cause small+large scarce resources changed signals to be emitted.
+    }
+
+    delete obj;
+}
+
+
+
+
+
+void tst_holistic::typeResolution_data()
+{
+    QTest::addColumn<QString>("file");
+    QTest::addColumn<PropertyNameList>("propertyNameOne");
+    QTest::addColumn<PropertyValueList>("propertyValueOne");
+    QTest::addColumn<PropertyNameList>("propertyNameTwo");
+    QTest::addColumn<PropertyValueList>("propertyValueTwo");
+    QTest::addColumn<int>("repetitions");
+
+    QString f;
+    PropertyNameList pn1;
+    PropertyValueList pv1;
+    PropertyNameList pn2;
+    PropertyValueList pv2;
+
+    // Benchmarks: resolving nested ids and types, no caching
+    f = QString(SRCDIR + QLatin1String("/data/resolutionTargets/ResolveOne.qml"));
+    pn1 << QString(QLatin1String("baseWidth")) << QString(QLatin1String("baseHeight")) << QString(QLatin1String("baseColor"));
+    pv1 << QVariant(401) << QVariant(402) << QVariant(QString(QLatin1String("brown")));
+    pn2 << QString(QLatin1String("baseWidth")) << QString(QLatin1String("baseHeight")) << QString(QLatin1String("baseColor"));
+    pv2 << QVariant(403) << QVariant(404) << QVariant(QString(QLatin1String("orange")));
+    QTest::newRow("nested id resolution") << f << pn1 << pv1 << pn2 << pv2 << 1;
+
+    // Benchmarks: resolving nested ids and types, 10 reps with caching
+    QTest::newRow("nested id resolution, cached") << f << pn1 << pv1 << pn2 << pv2 << 10;
+    pn1.clear(); pn2.clear(); pv1.clear(); pv2.clear();
+}
+
+void tst_holistic::typeResolution()
+{
+    // This function benchmarks the cost of "continued operation" (signal invocation,
+    // updating bindings, etc) where the component has lots of nested items with
+    // lots of resolving required.  Note that we take two different writeValues in order
+    // to force updates to occur.
+
+    QFETCH(QString, file);
+    QFETCH(PropertyNameList, propertyNameOne);
+    QFETCH(PropertyValueList, propertyValueOne);
+    QFETCH(PropertyNameList, propertyNameTwo);
+    QFETCH(PropertyValueList, propertyValueTwo);
+    QFETCH(int, repetitions);
+
+    Q_ASSERT(propertyNameOne.size() == propertyValueOne.size());
+    Q_ASSERT(propertyNameTwo.size() == propertyValueTwo.size());
+    Q_ASSERT(repetitions > 0);
+
+    QDeclarativeComponent c(&engine, file);
+    QObject *obj = c.create();
+
+    PropertyNameList writeProperty;
+    PropertyValueList writeValue;
+    bool usedFirst = false;
+
+    QBENCHMARK {
+        for (int i = 0; i < repetitions; ++i) {
+            if (usedFirst) {
+                writeProperty = propertyNameOne;
+                writeValue = propertyValueOne;
+                usedFirst = false;
+            } else {
+                writeProperty = propertyNameTwo;
+                writeValue = propertyValueTwo;
+                usedFirst = true;
+            }
+
+            for (int j = 0; j < writeProperty.size(); ++j) {
+                obj->setProperty(writeProperty.at(j).toAscii().constData(), writeValue.at(j));
+            }
+        }
+    }
+
+    delete obj;
+}
+
+
+QTEST_MAIN(tst_holistic)
+
+#include "tst_holistic.moc"
diff --git a/tests/benchmarks/declarative/script/data/enums.qml b/tests/benchmarks/declarative/script/data/enums.qml
new file mode 100644
index 0000000000..81b27b9a58
--- /dev/null
+++ b/tests/benchmarks/declarative/script/data/enums.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Item {
+    function runtest() {
+        var a = 0;
+        for (var ii = 0; ii < 100000; ++ii)
+            a += Text.RichText;
+        return a;
+    }
+}
diff --git a/tests/benchmarks/declarative/script/data/namespacedEnums.qml b/tests/benchmarks/declarative/script/data/namespacedEnums.qml
new file mode 100644
index 0000000000..dd3fa97de9
--- /dev/null
+++ b/tests/benchmarks/declarative/script/data/namespacedEnums.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0 as QtQuick
+
+QtQuick.Item {
+    function runtest() {
+        var a = 0;
+        for (var ii = 0; ii < 100000; ++ii)
+            a += QtQuick.Text.RichText;
+        return a;
+    }
+}
+
diff --git a/tests/benchmarks/declarative/script/data/script.js b/tests/benchmarks/declarative/script/data/script.js
new file mode 100644
index 0000000000..9f46570004
--- /dev/null
+++ b/tests/benchmarks/declarative/script/data/script.js
@@ -0,0 +1 @@
+function func() { return 1; }
diff --git a/tests/benchmarks/declarative/script/data/script2.js b/tests/benchmarks/declarative/script/data/script2.js
new file mode 100644
index 0000000000..102f081140
--- /dev/null
+++ b/tests/benchmarks/declarative/script/data/script2.js
@@ -0,0 +1,2 @@
+function func() { return 2; }
+
diff --git a/tests/benchmarks/declarative/script/data/scriptCall.qml b/tests/benchmarks/declarative/script/data/scriptCall.qml
new file mode 100644
index 0000000000..62014eb87a
--- /dev/null
+++ b/tests/benchmarks/declarative/script/data/scriptCall.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Declarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+import "script.js" as Script
+import "script2.js" as OtherScript
+
+Item {
+    function runtest() {
+        var a = 0;
+        for (var ii = 0; ii < 1000000; ++ii)
+            a += Script.func();
+        return a;
+    }
+}
+
diff --git a/tests/benchmarks/declarative/script/tst_script.cpp b/tests/benchmarks/declarative/script/tst_script.cpp
index 2020a18440..ff4bbb698e 100644
--- a/tests/benchmarks/declarative/script/tst_script.cpp
+++ b/tests/benchmarks/declarative/script/tst_script.cpp
@@ -70,6 +70,9 @@ private slots:
     void property_qobject();
     void property_qmlobject();
 
+    void setproperty_js();
+    void setproperty_qmlobject();
+
     void function_js();
     void function_cpp();
     void function_qobject();
@@ -98,6 +101,10 @@ private slots:
     void global_property_qml_js();
 
     void scriptfile_property();
+
+    void enums();
+    void namespacedEnums();
+    void scriptCall();
 };
 
 inline QUrl TEST_FILE(const QString &filename)
@@ -108,12 +115,13 @@ inline QUrl TEST_FILE(const QString &filename)
 class TestObject : public QObject
 {
     Q_OBJECT
-    Q_PROPERTY(int x READ x)
+    Q_PROPERTY(int x READ x WRITE setX)
 
 public:
     TestObject(QObject *parent = 0);
 
     int x();
+    void setX(int x) { m_x = x; }
 
     void emitMySignal() { emit mySignal(); }
     void emitMySignalWithArgs(int n) { emit mySignalWithArgs(n); }
@@ -323,6 +331,49 @@ void tst_script::property_qmlobject()
     }
 }
 
+#define SETPROPERTY_PROGRAM \
+    "(function(testObject) { return (function() { " \
+    "    for (var ii = 0; ii < 10000; ++ii) { " \
+    "        testObject.x = ii; " \
+    "    } " \
+    "}); })"
+
+void tst_script::setproperty_js()
+{
+    QScriptEngine engine;
+
+    QScriptValue v = engine.newObject();
+    v.setProperty(QLatin1String("x"), 0);
+
+    QScriptValueList args;
+    args << v;
+    QScriptValue prog = engine.evaluate(SETPROPERTY_PROGRAM).call(engine.globalObject(), args);
+    prog.call();
+
+    QBENCHMARK {
+        prog.call();
+    }
+}
+
+void tst_script::setproperty_qmlobject()
+{
+    QDeclarativeEngine qmlengine;
+
+    QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(&qmlengine);
+    TestObject to;
+
+    QScriptValue v = QDeclarativeEnginePrivate::get(&qmlengine)->objectClass->newQObject(&to);
+
+    QScriptValueList args;
+    args << v;
+    QScriptValue prog = engine->evaluate(SETPROPERTY_PROGRAM).call(engine->globalObject(), args);
+    prog.call();
+
+    QBENCHMARK {
+        prog.call();
+    }
+}
+
 #define FUNCTION_PROGRAM \
     "(function(testObject) { return (function() { " \
     "    var test = 0; " \
@@ -698,6 +749,60 @@ void tst_script::scriptfile_property()
     delete rect;
 }
 
+void tst_script::enums()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("enums.qml"));
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    int index = o->metaObject()->indexOfMethod("runtest()");
+    QVERIFY(index != -1);
+    QMetaMethod method = o->metaObject()->method(index);
+
+    QBENCHMARK {
+        method.invoke(o, Qt::DirectConnection);
+    }
+
+    delete o;
+}
+
+void tst_script::namespacedEnums()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("namespacedEnums.qml"));
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    int index = o->metaObject()->indexOfMethod("runtest()");
+    QVERIFY(index != -1);
+    QMetaMethod method = o->metaObject()->method(index);
+
+    QBENCHMARK {
+        method.invoke(o, Qt::DirectConnection);
+    }
+
+    delete o;
+}
+
+void tst_script::scriptCall()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("scriptCall.qml"));
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    int index = o->metaObject()->indexOfMethod("runtest()");
+    QVERIFY(index != -1);
+    QMetaMethod method = o->metaObject()->method(index);
+
+    QBENCHMARK {
+        method.invoke(o, Qt::DirectConnection);
+    }
+
+    delete o;
+}
+
 QTEST_MAIN(tst_script)
 
 #include "tst_script.moc"
diff --git a/tools/distfieldgen/distfieldgen.pro b/tools/distfieldgen/distfieldgen.pro
new file mode 100644
index 0000000000..4c2d63603b
--- /dev/null
+++ b/tools/distfieldgen/distfieldgen.pro
@@ -0,0 +1,12 @@
+TARGET = distfieldgen
+TEMPLATE = app
+
+QT += declarative opengl
+
+CONFIG   += console
+CONFIG   -= app_bundle
+DESTDIR = ../../bin
+
+INCLUDEPATH += $$PWD/../../src/3rdparty/harfbuzz/src
+
+SOURCES += main.cpp
diff --git a/tools/distfieldgen/main.cpp b/tools/distfieldgen/main.cpp
new file mode 100644
index 0000000000..3c944b3d4c
--- /dev/null
+++ b/tools/distfieldgen/main.cpp
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt scene graph research project.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+
+#include <private/qsgdistancefieldglyphcache_p.h>
+
+static void usage()
+{
+    qWarning("Usage: distfieldgen [options] <font_filename>");
+    qWarning(" ");
+    qWarning("Distfieldgen generates distance-field renderings of the provided font file,");
+    qWarning("one for each font family/style it contains.");
+    qWarning("Unless the QT_QML_DISTFIELDDIR environment variable is set, the renderings are");
+    qWarning("saved in the fonts/distancefields directory where the Qt libraries are located.");
+    qWarning("You can also override the output directory with the -d option.");
+    qWarning(" ");
+    qWarning(" options:");
+    qWarning("  -d <directory>................................ output directory");
+    qWarning("  --no-multithread.............................. don't use multiple threads to render distance-fields");
+    qWarning("  --force-all-styles............................ force rendering of styles Normal, Bold, Italic and Bold Italic");
+    qWarning("  -styles \"style1,style2,..\".................... force rendering of specified styles");
+
+    qWarning(" ");
+    exit(1);
+}
+
+void printProgress(int p)
+{
+    printf("\r  [");
+    for (int i = 0; i < 50; ++i)
+        printf(i < p / 2 ? "=" : " ");
+    printf("]");
+    printf(" %d%%", p);
+    fflush(stdout);
+}
+
+class DistFieldGenTask : public QRunnable
+{
+public:
+    DistFieldGenTask(QSGDistanceFieldGlyphCache *atlas, int c, int nbGlyph, QMap<int, QImage> *outList)
+        : QRunnable()
+        , m_atlas(atlas)
+        , m_char(c)
+        , m_nbGlyph(nbGlyph)
+        , m_outList(outList)
+    { }
+
+    void run()
+    {
+        QImage df = m_atlas->renderDistanceFieldGlyph(m_char);
+        QMutexLocker lock(&m_mutex);
+        m_outList->insert(m_char, df);
+        printProgress(float(m_outList->count()) / m_nbGlyph * 100);
+    }
+
+    static QMutex m_mutex;
+    QSGDistanceFieldGlyphCache *m_atlas;
+    int m_char;
+    int m_nbGlyph;
+    QMap<int, QImage> *m_outList;
+};
+
+QMutex DistFieldGenTask::m_mutex;
+
+static void generateDistanceFieldForFont(const QFont &font, const QString &destinationDir, bool multithread)
+{
+    QSGDistanceFieldGlyphCache *atlas = QSGDistanceFieldGlyphCache::get(QGLContext::currentContext(), font);
+    QFontDatabase db;
+    QString fontString = font.family() + QLatin1String(" ") + db.styleString(font);
+    qWarning("> Generating distance-field for font '%s' (%d glyphs)", fontString.toLatin1().constData(), atlas->glyphCount());
+
+    QMap<int, QImage> distfields;
+    for (int i = 0; i < atlas->glyphCount(); ++i) {
+        if (multithread) {
+            DistFieldGenTask *task = new DistFieldGenTask(atlas, i, atlas->glyphCount(), &distfields);
+            QThreadPool::globalInstance()->start(task);
+        } else {
+            QImage df = atlas->renderDistanceFieldGlyph(i);
+            distfields.insert(i, df);
+            printProgress(float(distfields.count()) / atlas->glyphCount() * 100);
+        }
+    }
+
+    if (multithread)
+        QThreadPool::globalInstance()->waitForDone();
+
+    // Combine dist fields in one image
+    int size = qCeil(qSqrt(qreal(atlas->glyphCount()))) * 64;
+    QImage output(size, size, QImage::Format_ARGB32_Premultiplied);
+    output.fill(Qt::transparent);
+    QPainter p(&output);
+    int x, y = 0;
+    for (QMap<int, QImage>::const_iterator i = distfields.constBegin(); i != distfields.constEnd(); ++i) {
+        p.drawImage(x, y, i.value());
+        x += 64;
+        if (x >= size) {
+            x = 0;
+            y += 64;
+        }
+    }
+    p.end();
+    printProgress(100);
+    printf("\n");
+
+    // Save output
+    QFileInfo dfi(destinationDir);
+    if (!dfi.isDir()) {
+        qWarning("Error: '%s' is not a directory.", destinationDir.toLatin1().constData());
+        qWarning(" ");
+        exit(1);
+    }
+
+    QString filename = font.family();
+    filename.remove(QLatin1String(" "));
+    QString italic = font.italic() ? QLatin1String("i") : QLatin1String("");
+    QString bold = font.weight() > QFont::Normal ? QLatin1String("b") : QLatin1String("");
+    filename = filename + bold + italic;
+    QString out = QString(QLatin1String("%1/%2.png")).arg(destinationDir).arg(filename);
+    output.save(out);
+    qWarning("  Distance-field saved to '%s'\n", out.toLatin1().constData());
+}
+
+class MyWidget : public QGLWidget
+{
+    Q_OBJECT
+public:
+    MyWidget()
+        : QGLWidget()
+    { }
+
+    ~MyWidget() { }
+
+    void showEvent(QShowEvent *e)
+    {
+        QStringList args = QApplication::arguments();
+
+        bool noMultithread = args.contains(QLatin1String("--no-multithread"));
+        bool forceAllStyles = args.contains(QLatin1String("--force-all-styles"));
+
+        QString fontFile;
+        QString destDir;
+        for (int i = 0; i < args.count(); ++i) {
+            QString a = args.at(i);
+            if (!a.startsWith('-') && QFileInfo(a).exists())
+                fontFile = a;
+            if (a == QLatin1String("-d"))
+                destDir = args.at(++i);
+        }
+        if (destDir.isEmpty()) {
+            destDir = QFileInfo(fontFile).canonicalPath();
+        }
+
+        QStringList customStyles;
+        if (args.contains(QLatin1String("-styles"))) {
+            int index = args.indexOf(QLatin1String("-styles"));
+            QString styles = args.at(index + 1);
+            customStyles = styles.split(QLatin1String(","));
+        }
+
+        // Load the font
+        int fontID = QFontDatabase::addApplicationFont(fontFile);
+        if (fontID == -1) {
+            qWarning("Error: Invalid font file.");
+            qWarning(" ");
+            exit(1);
+        }
+
+        QStringList allStyles = QStringList() << QLatin1String("Normal")
+                                              << QLatin1String("Bold")
+                                              << QLatin1String("Italic")
+                                              << QLatin1String("Bold Italic");
+
+        // Generate distance-fields for all families and all styles provided by the font file
+        QFontDatabase fontDatabase;
+        QStringList families = QFontDatabase::applicationFontFamilies(fontID);
+        int famCount = families.count();
+        for (int i = 0; i < famCount; ++i) {
+            QStringList styles;
+            if (forceAllStyles)
+                styles = allStyles;
+            else if (customStyles.count() > 0)
+                styles = customStyles;
+            else
+                styles = fontDatabase.styles(families.at(i));
+
+            int styleCount = styles.count();
+            for (int j = 0; j < styleCount; ++j) {
+                QFont font;
+                if (forceAllStyles || customStyles.count() > 0) {
+                    int weight = styles.at(j).contains(QLatin1String("Bold")) ? QFont::Bold : QFont::Normal;
+                    font = QFont(families.at(i), 10, weight, styles.at(j).contains(QLatin1String("Italic")));
+                } else {
+                    font = fontDatabase.font(families.at(i), styles.at(j), 10); // point size is ignored
+                }
+                generateDistanceFieldForFont(font, destDir, !noMultithread);
+            }
+        }
+
+        exit(0);
+    }
+};
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+    QStringList args = QApplication::arguments();
+
+    if (argc < 2
+            || args.contains(QLatin1String("--help"))
+            || args.contains(QLatin1String("-help"))
+            || args.contains(QLatin1String("--h"))
+            || args.contains(QLatin1String("-h")))
+        usage();
+
+
+   MyWidget w;
+   w.show();
+
+   return app.exec();
+}
+
+#include "main.moc"
diff --git a/tools/qmlplugindump/Info.plist b/tools/qmlplugindump/Info.plist
new file mode 100644
index 0000000000..f35846d048
--- /dev/null
+++ b/tools/qmlplugindump/Info.plist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+        <key>CFBundlePackageType</key>
+        <string>APPL</string>
+        <key>CFBundleSignature</key>
+        <string>@TYPEINFO@</string>
+        <key>CFBundleExecutable</key>
+        <string>@EXECUTABLE@</string>
+        <key>CFBundleIdentifier</key>
+        <string>com.nokia.qt.qmlplugindump</string>
+        <key>LSUIElement</key>
+        <string>1</string>
+</dict>
+</plist>
diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp
new file mode 100644
index 0000000000..848b0917cb
--- /dev/null
+++ b/tools/qmlplugindump/main.cpp
@@ -0,0 +1,597 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtDeclarative/QtDeclarative>
+#include <QtDeclarative/private/qdeclarativemetatype_p.h>
+#include <QtDeclarative/private/qdeclarativeopenmetaobject_p.h>
+#include <QtDeclarative/QDeclarativeView>
+
+#include <QtGui/QApplication>
+
+#include <QtCore/QSet>
+#include <QtCore/QMetaObject>
+#include <QtCore/QMetaProperty>
+#include <QtCore/QDebug>
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/private/qmetaobject_p.h>
+
+#include <iostream>
+
+#include "qmlstreamwriter.h"
+
+#ifdef QT_SIMULATOR
+#include <QtGui/private/qsimulatorconnection_p.h>
+#endif
+
+#ifdef Q_OS_UNIX
+#include <signal.h>
+#endif
+
+void collectReachableMetaObjects(const QMetaObject *meta, QSet<const QMetaObject *> *metas)
+{
+    if (! meta || metas->contains(meta))
+        return;
+
+    // dynamic meta objects break things badly, so just ignore them
+    const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate *>(meta->d.data);
+    if (!(mop->flags & DynamicMetaObject))
+        metas->insert(meta);
+
+    collectReachableMetaObjects(meta->superClass(), metas);
+}
+
+QString currentProperty;
+
+void collectReachableMetaObjects(QObject *object, QSet<const QMetaObject *> *metas)
+{
+    if (! object)
+        return;
+
+    const QMetaObject *meta = object->metaObject();
+    qDebug() << "Processing object" << meta->className();
+    collectReachableMetaObjects(meta, metas);
+
+    for (int index = 0; index < meta->propertyCount(); ++index) {
+        QMetaProperty prop = meta->property(index);
+        if (QDeclarativeMetaType::isQObject(prop.userType())) {
+            qDebug() << "  Processing property" << prop.name();
+            currentProperty = QString("%1::%2").arg(meta->className(), prop.name());
+
+            // if the property was not initialized during construction,
+            // accessing a member of oo is going to cause a segmentation fault
+            QObject *oo = QDeclarativeMetaType::toQObject(prop.read(object));
+            if (oo && !metas->contains(oo->metaObject()))
+                collectReachableMetaObjects(oo, metas);
+            currentProperty.clear();
+        }
+    }
+}
+
+void collectReachableMetaObjects(const QDeclarativeType *ty, QSet<const QMetaObject *> *metas)
+{
+    collectReachableMetaObjects(ty->metaObject(), metas);
+    if (ty->attachedPropertiesType())
+        collectReachableMetaObjects(ty->attachedPropertiesType(), metas);
+}
+
+/* We want to add the MetaObject for 'Qt' to the list, this is a
+   simple way to access it.
+*/
+class FriendlyQObject: public QObject
+{
+public:
+    static const QMetaObject *qtMeta() { return &staticQtMetaObject; }
+};
+
+/* When we dump a QMetaObject, we want to list all the types it is exported as.
+   To do this, we need to find the QDeclarativeTypes associated with this
+   QMetaObject.
+*/
+static QHash<QByteArray, QSet<const QDeclarativeType *> > qmlTypesByCppName;
+
+static QHash<QByteArray, QByteArray> cppToId;
+
+/* Takes a C++ type name, such as Qt::LayoutDirection or QString and
+   maps it to how it should appear in the description file.
+
+   These names need to be unique globally, so we don't change the C++ symbol's
+   name much. It is mostly used to for explicit translations such as
+   QString->string and translations for extended QML objects.
+*/
+QByteArray convertToId(const QByteArray &cppName)
+{
+    return cppToId.value(cppName, cppName);
+}
+
+QSet<const QMetaObject *> collectReachableMetaObjects(const QString &importCode, QDeclarativeEngine *engine)
+{
+    QSet<const QMetaObject *> metas;
+    metas.insert(FriendlyQObject::qtMeta());
+
+    QHash<QByteArray, QSet<QByteArray> > extensions;
+    foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) {
+        qmlTypesByCppName[ty->metaObject()->className()].insert(ty);
+        if (ty->isExtendedType()) {
+            extensions[ty->typeName()].insert(ty->metaObject()->className());
+        }
+        collectReachableMetaObjects(ty, &metas);
+    }
+
+    // Adjust ids of extended objects.
+    // The chain ends up being:
+    // __extended__.originalname - the base object
+    // __extension_0_.originalname - first extension
+    // ..
+    // __extension_n-2_.originalname - second to last extension
+    // originalname - last extension
+    // ### does this actually work for multiple extensions? it seems like the prototypes might be wrong
+    foreach (const QByteArray &extendedCpp, extensions.keys()) {
+        cppToId.remove(extendedCpp);
+        const QByteArray extendedId = convertToId(extendedCpp);
+        cppToId.insert(extendedCpp, "__extended__." + extendedId);
+        QSet<QByteArray> extensionCppNames = extensions.value(extendedCpp);
+        int c = 0;
+        foreach (const QByteArray &extensionCppName, extensionCppNames) {
+            if (c != extensionCppNames.size() - 1) {
+                QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(c), QString(extendedId)).toAscii();
+                cppToId.insert(extensionCppName, adjustedName);
+            } else {
+                cppToId.insert(extensionCppName, extendedId);
+            }
+            ++c;
+        }
+    }
+
+    // find even more QMetaObjects by instantiating QML types and running
+    // over the instances
+    foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) {
+        if (ty->isExtendedType())
+            continue;
+
+        QByteArray tyName = ty->qmlTypeName();
+        tyName = tyName.mid(tyName.lastIndexOf('/') + 1);
+
+        QByteArray code = importCode.toUtf8();
+        code += tyName;
+        code += " {}\n";
+
+        QDeclarativeComponent c(engine);
+        c.setData(code, QUrl("typeinstance"));
+
+        QObject *object = c.create();
+        if (object)
+            collectReachableMetaObjects(object, &metas);
+        else
+            qDebug() << "Could not create" << tyName << ":" << c.errorString();
+    }
+
+    return metas;
+}
+
+
+class Dumper
+{
+    QmlStreamWriter *qml;
+    QString relocatableModuleUri;
+
+public:
+    Dumper(QmlStreamWriter *qml) : qml(qml) {}
+
+    void setRelocatableModuleUri(const QString &uri)
+    {
+        relocatableModuleUri = uri;
+    }
+
+    void dump(const QMetaObject *meta)
+    {
+        qml->writeStartObject("Component");
+
+        QByteArray id = convertToId(meta->className());
+        qml->writeScriptBinding(QLatin1String("name"), enquote(id));
+
+        for (int index = meta->classInfoCount() - 1 ; index >= 0 ; --index) {
+            QMetaClassInfo classInfo = meta->classInfo(index);
+            if (QLatin1String(classInfo.name()) == QLatin1String("DefaultProperty")) {
+                qml->writeScriptBinding(QLatin1String("defaultProperty"), enquote(QLatin1String(classInfo.value())));
+                break;
+            }
+        }
+
+        if (meta->superClass())
+            qml->writeScriptBinding(QLatin1String("prototype"), enquote(convertToId(meta->superClass()->className())));
+
+        QSet<const QDeclarativeType *> qmlTypes = qmlTypesByCppName.value(meta->className());
+        if (!qmlTypes.isEmpty()) {
+            QStringList exports;
+
+            foreach (const QDeclarativeType *qmlTy, qmlTypes) {
+                QString qmlTyName = qmlTy->qmlTypeName();
+                // some qmltype names are missing the actual names, ignore that import
+                if (qmlTyName.endsWith('/'))
+                    continue;
+                if (qmlTyName.startsWith(relocatableModuleUri + QLatin1Char('/'))) {
+                    qmlTyName.remove(0, relocatableModuleUri.size() + 1);
+                }
+                exports += enquote(QString("%1 %2.%3").arg(
+                                       qmlTyName,
+                                       QString::number(qmlTy->majorVersion()),
+                                       QString::number(qmlTy->minorVersion())));
+            }
+
+            // ensure exports are sorted and don't change order when the plugin is dumped again
+            exports.removeDuplicates();
+            qSort(exports);
+
+            qml->writeArrayBinding(QLatin1String("exports"), exports);
+
+            if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType()) {
+                qml->writeScriptBinding(QLatin1String("attachedType"), enquote(
+                                            convertToId(attachedType->className())));
+            }
+        }
+
+        for (int index = meta->enumeratorOffset(); index < meta->enumeratorCount(); ++index)
+            dump(meta->enumerator(index));
+
+        for (int index = meta->propertyOffset(); index < meta->propertyCount(); ++index)
+            dump(meta->property(index));
+
+        for (int index = meta->methodOffset(); index < meta->methodCount(); ++index)
+            dump(meta->method(index));
+
+        qml->writeEndObject();
+    }
+
+    void writeEasingCurve()
+    {
+        qml->writeStartObject("Component");
+        qml->writeScriptBinding(QLatin1String("name"), enquote(QLatin1String("QEasingCurve")));
+        qml->writeScriptBinding(QLatin1String("prototype"), enquote(QLatin1String("QDeclarativeEasingValueType")));
+        qml->writeEndObject();
+    }
+
+private:
+    static QString enquote(const QString &string)
+    {
+        return QString("\"%1\"").arg(string);
+    }
+
+    /* Removes pointer and list annotations from a type name, returning
+       what was removed in isList and isPointer
+    */
+    static void removePointerAndList(QByteArray *typeName, bool *isList, bool *isPointer)
+    {
+        static QByteArray declListPrefix = "QDeclarativeListProperty<";
+
+        if (typeName->endsWith('*')) {
+            *isPointer = true;
+            typeName->truncate(typeName->length() - 1);
+            removePointerAndList(typeName, isList, isPointer);
+        } else if (typeName->startsWith(declListPrefix)) {
+            *isList = true;
+            typeName->truncate(typeName->length() - 1); // get rid of the suffix '>'
+            *typeName = typeName->mid(declListPrefix.size());
+            removePointerAndList(typeName, isList, isPointer);
+        }
+
+        *typeName = convertToId(*typeName);
+    }
+
+    void writeTypeProperties(QByteArray typeName, bool isWritable)
+    {
+        bool isList = false, isPointer = false;
+        removePointerAndList(&typeName, &isList, &isPointer);
+
+        qml->writeScriptBinding(QLatin1String("type"), enquote(typeName));
+        if (isList)
+            qml->writeScriptBinding(QLatin1String("isList"), QLatin1String("true"));
+        if (!isWritable)
+            qml->writeScriptBinding(QLatin1String("isReadonly"), QLatin1String("true"));
+        if (isPointer)
+            qml->writeScriptBinding(QLatin1String("isPointer"), QLatin1String("true"));
+    }
+
+    void dump(const QMetaProperty &prop)
+    {
+        qml->writeStartObject("Property");
+
+        qml->writeScriptBinding(QLatin1String("name"), enquote(QString::fromUtf8(prop.name())));
+        writeTypeProperties(prop.typeName(), prop.isWritable());
+
+        qml->writeEndObject();
+    }
+
+    void dump(const QMetaMethod &meth)
+    {
+        if (meth.methodType() == QMetaMethod::Signal) {
+            if (meth.access() != QMetaMethod::Protected)
+                return; // nothing to do.
+        } else if (meth.access() != QMetaMethod::Public) {
+            return; // nothing to do.
+        }
+
+        QByteArray name = meth.signature();
+        int lparenIndex = name.indexOf('(');
+        if (lparenIndex == -1) {
+            return; // invalid signature
+        }
+        name = name.left(lparenIndex);
+
+        if (meth.methodType() == QMetaMethod::Signal)
+            qml->writeStartObject(QLatin1String("Signal"));
+        else
+            qml->writeStartObject(QLatin1String("Method"));
+
+        qml->writeScriptBinding(QLatin1String("name"), enquote(name));
+
+        const QString typeName = convertToId(meth.typeName());
+        if (! typeName.isEmpty())
+            qml->writeScriptBinding(QLatin1String("type"), enquote(typeName));
+
+        for (int i = 0; i < meth.parameterTypes().size(); ++i) {
+            QByteArray argName = meth.parameterNames().at(i);
+
+            qml->writeStartObject(QLatin1String("Parameter"));
+            if (! argName.isEmpty())
+                qml->writeScriptBinding(QLatin1String("name"), enquote(argName));
+            writeTypeProperties(meth.parameterTypes().at(i), true);
+            qml->writeEndObject();
+        }
+
+        qml->writeEndObject();
+    }
+
+    void dump(const QMetaEnum &e)
+    {
+        qml->writeStartObject(QLatin1String("Enum"));
+        qml->writeScriptBinding(QLatin1String("name"), enquote(QString::fromUtf8(e.name())));
+
+        QList<QPair<QString, QString> > namesValues;
+        for (int index = 0; index < e.keyCount(); ++index) {
+            namesValues.append(qMakePair(enquote(QString::fromUtf8(e.key(index))), QString::number(e.value(index))));
+        }
+
+        qml->writeScriptObjectLiteralBinding(QLatin1String("values"), namesValues);
+        qml->writeEndObject();
+    }
+};
+
+
+enum ExitCode {
+    EXIT_INVALIDARGUMENTS = 1,
+    EXIT_SEGV = 2,
+    EXIT_IMPORTERROR = 3
+};
+
+#ifdef Q_OS_UNIX
+void sigSegvHandler(int) {
+    fprintf(stderr, "Error: SEGV\n");
+    if (!currentProperty.isEmpty())
+        fprintf(stderr, "While processing the property '%s', which probably has uninitialized data.\n", currentProperty.toLatin1().constData());
+    exit(EXIT_SEGV);
+}
+#endif
+
+void printUsage(const QString &appName)
+{
+    qWarning() << qPrintable(QString(
+                                 "Usage: %1 [-notrelocatable] module.uri version [module/import/path]\n"
+                                 "       %1 -path path/to/qmldir/directory [version]\n"
+                                 "       %1 -builtins\n"
+                                 "Example: %1 Qt.labs.particles 4.7 /home/user/dev/qt-install/imports").arg(
+                                 appName));
+}
+
+int main(int argc, char *argv[])
+{
+#ifdef Q_OS_UNIX
+    // qmldump may crash, but we don't want any crash handlers to pop up
+    // therefore we intercept the segfault and just exit() ourselves
+    struct sigaction action;
+
+    sigemptyset(&action.sa_mask);
+    action.sa_handler = &sigSegvHandler;
+    action.sa_flags   = 0;
+
+    sigaction(SIGSEGV, &action, 0);
+#endif
+
+#ifdef QT_SIMULATOR
+    // Running this application would bring up the Qt Simulator (since it links QtGui), avoid that!
+    QtSimulatorPrivate::SimulatorConnection::createStubInstance();
+#endif
+    QApplication app(argc, argv);
+    const QStringList args = app.arguments();
+    const QString appName = QFileInfo(app.applicationFilePath()).baseName();
+    if (!(args.size() >= 3
+          || (args.size() == 2
+              && (args.at(1) == QLatin1String("--builtins")
+                  || args.at(1) == QLatin1String("-builtins"))))) {
+        printUsage(appName);
+        return EXIT_INVALIDARGUMENTS;
+    }
+
+    QString pluginImportUri;
+    QString pluginImportVersion;
+    QString pluginImportPath;
+    bool relocatable = true;
+    bool pathImport = false;
+    if (args.size() >= 3) {
+        QStringList positionalArgs;
+        foreach (const QString &arg, args) {
+            if (!arg.startsWith(QLatin1Char('-'))) {
+                positionalArgs.append(arg);
+                continue;
+            }
+
+            if (arg == QLatin1String("--notrelocatable")
+                    || arg == QLatin1String("-notrelocatable")) {
+                relocatable = false;
+            } else if (arg == QLatin1String("--path")
+                       || arg == QLatin1String("-path")) {
+                pathImport = true;
+            } else {
+                qWarning() << "Invalid argument: " << arg;
+                return EXIT_INVALIDARGUMENTS;
+            }
+        }
+
+        if (!pathImport) {
+            if (positionalArgs.size() != 3 && positionalArgs.size() != 4) {
+                qWarning() << "Incorrect number of positional arguments";
+                return EXIT_INVALIDARGUMENTS;
+            }
+            pluginImportUri = positionalArgs[1];
+            pluginImportVersion = positionalArgs[2];
+            if (positionalArgs.size() >= 4)
+                pluginImportPath = positionalArgs[3];
+        } else {
+            if (positionalArgs.size() != 2 && positionalArgs.size() != 3) {
+                qWarning() << "Incorrect number of positional arguments";
+                return EXIT_INVALIDARGUMENTS;
+            }
+            pluginImportPath = positionalArgs[1];
+            if (positionalArgs.size() == 3)
+                pluginImportVersion = positionalArgs[2];
+        }
+    }
+
+    QDeclarativeView view;
+    QDeclarativeEngine *engine = view.engine();
+    if (!pluginImportPath.isEmpty())
+        engine->addImportPath(pluginImportPath);
+
+    // find all QMetaObjects reachable from the builtin module
+    QByteArray importCode("import QtQuick 1.0\n");
+    QSet<const QMetaObject *> defaultReachable = collectReachableMetaObjects(importCode, engine);
+
+    // this will hold the meta objects we want to dump information of
+    QSet<const QMetaObject *> metas;
+
+    if (pluginImportUri.isEmpty() && !pathImport) {
+        metas = defaultReachable;
+    } else {
+        // find all QMetaObjects reachable when the specified module is imported
+        if (!pathImport) {
+            importCode += QString("import %0 %1\n").arg(pluginImportUri, pluginImportVersion).toAscii();
+        } else {
+            // pluginImportVersion can be empty
+            importCode += QString("import \"%1\" %2\n").arg(pluginImportPath, pluginImportVersion).toAscii();
+        }
+
+        // create a component with these imports to make sure the imports are valid
+        // and to populate the declarative meta type system
+        {
+            QByteArray code = importCode;
+            code += "QtObject {}";
+            QDeclarativeComponent c(engine);
+
+            c.setData(code, QUrl("typelist"));
+            c.create();
+            if (!c.errors().isEmpty()) {
+                foreach (const QDeclarativeError &error, c.errors())
+                    qWarning() << error.toString();
+                return EXIT_IMPORTERROR;
+            }
+        }
+
+        QSet<const QMetaObject *> candidates = collectReachableMetaObjects(importCode, engine);
+        candidates.subtract(defaultReachable);
+
+        // Also eliminate meta objects with the same classname.
+        // This is required because extended objects seem not to share
+        // a single meta object instance.
+        QSet<QByteArray> defaultReachableNames;
+        foreach (const QMetaObject *mo, defaultReachable)
+            defaultReachableNames.insert(QByteArray(mo->className()));
+        foreach (const QMetaObject *mo, candidates) {
+            if (!defaultReachableNames.contains(mo->className()))
+                metas.insert(mo);
+        }
+    }
+
+    // setup static rewrites of type names
+    cppToId.insert("QString", "string");
+    cppToId.insert("QDeclarativeEasingValueType::Type", "Type");
+
+    // start dumping data
+    QByteArray bytes;
+    QmlStreamWriter qml(&bytes);
+
+    qml.writeStartDocument();
+    qml.writeLibraryImport(QLatin1String("QtQuick.tooling"), 1, 0);
+    qml.write("\n"
+              "// This file describes the plugin-supplied types contained in the library.\n"
+              "// It is used for QML tooling purposes only.\n"
+              "\n");
+    qml.writeStartObject("Module");
+
+    // put the metaobjects into a map so they are always dumped in the same order
+    QMap<QString, const QMetaObject *> nameToMeta;
+    foreach (const QMetaObject *meta, metas)
+        nameToMeta.insert(convertToId(meta->className()), meta);
+
+    Dumper dumper(&qml);
+    if (relocatable)
+        dumper.setRelocatableModuleUri(pluginImportUri);
+    foreach (const QMetaObject *meta, nameToMeta) {
+        dumper.dump(meta);
+    }
+
+    // define QEasingCurve as an extension of QDeclarativeEasingValueType, this way
+    // properties using the QEasingCurve type get useful type information.
+    if (pluginImportUri.isEmpty())
+        dumper.writeEasingCurve();
+
+    qml.writeEndObject();
+    qml.writeEndDocument();
+
+    std::cout << bytes.constData();
+
+    // workaround to avoid crashes on exit
+    QTimer timer;
+    timer.setSingleShot(true);
+    timer.setInterval(0);
+    QObject::connect(&timer, SIGNAL(timeout()), &app, SLOT(quit()));
+    timer.start();
+
+    return app.exec();
+}
diff --git a/tools/qmlplugindump/qmlplugindump.pro b/tools/qmlplugindump/qmlplugindump.pro
new file mode 100644
index 0000000000..53827e2f40
--- /dev/null
+++ b/tools/qmlplugindump/qmlplugindump.pro
@@ -0,0 +1,20 @@
+TEMPLATE = app
+CONFIG += qt uic console
+DESTDIR = ../../bin
+
+QT += declarative
+
+TARGET = qmlplugindump
+
+SOURCES += \
+    main.cpp \
+    qmlstreamwriter.cpp
+
+HEADERS += \
+    qmlstreamwriter.h
+
+OTHER_FILES += Info.plist
+macx: QMAKE_INFO_PLIST = Info.plist
+
+target.path = $$[QT_INSTALL_BINS]
+INSTALLS += target
diff --git a/tools/qmlplugindump/qmlstreamwriter.cpp b/tools/qmlplugindump/qmlstreamwriter.cpp
new file mode 100644
index 0000000000..d083f7b64c
--- /dev/null
+++ b/tools/qmlplugindump/qmlstreamwriter.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmlstreamwriter.h"
+
+#include <QtCore/QBuffer>
+#include <QtCore/QStringList>
+
+QmlStreamWriter::QmlStreamWriter(QByteArray *array)
+    : m_indentDepth(0)
+    , m_pendingLineLength(0)
+    , m_maybeOneline(false)
+    , m_stream(new QBuffer(array))
+{
+    m_stream->open(QIODevice::WriteOnly);
+}
+
+void QmlStreamWriter::writeStartDocument()
+{
+}
+
+void QmlStreamWriter::writeEndDocument()
+{
+}
+
+void QmlStreamWriter::writeLibraryImport(const QString &uri, int majorVersion, int minorVersion, const QString &as)
+{
+    m_stream->write(QString("import %1 %2.%3").arg(uri, QString::number(majorVersion), QString::number(minorVersion)).toUtf8());
+    if (!as.isEmpty())
+        m_stream->write(QString(" as %1").arg(as).toUtf8());
+    m_stream->write("\n");
+}
+
+void QmlStreamWriter::writeStartObject(const QString &component)
+{
+    flushPotentialLinesWithNewlines();
+    writeIndent();
+    m_stream->write(QString("%1 {").arg(component).toUtf8());
+    ++m_indentDepth;
+    m_maybeOneline = true;
+}
+
+void QmlStreamWriter::writeEndObject()
+{
+    if (m_maybeOneline && !m_pendingLines.isEmpty()) {
+        --m_indentDepth;
+        for (int i = 0; i < m_pendingLines.size(); ++i) {
+            m_stream->write(" ");
+            m_stream->write(m_pendingLines.at(i).trimmed());
+            if (i != m_pendingLines.size() - 1)
+                m_stream->write(";");
+        }
+        m_stream->write(" }\n");
+        m_pendingLines.clear();
+        m_pendingLineLength = 0;
+        m_maybeOneline = false;
+    } else {
+        if (m_maybeOneline)
+            flushPotentialLinesWithNewlines();
+        --m_indentDepth;
+        writeIndent();
+        m_stream->write("}\n");
+    }
+}
+
+void QmlStreamWriter::writeScriptBinding(const QString &name, const QString &rhs)
+{
+    writePotentialLine(QString("%1: %2").arg(name, rhs).toUtf8());
+}
+
+void QmlStreamWriter::writeArrayBinding(const QString &name, const QStringList &elements)
+{
+    flushPotentialLinesWithNewlines();
+    writeIndent();
+    m_stream->write(QString("%1: [\n").arg(name).toUtf8());
+    ++m_indentDepth;
+    for (int i = 0; i < elements.size(); ++i) {
+        writeIndent();
+        m_stream->write(elements.at(i).toUtf8());
+        if (i != elements.size() - 1) {
+            m_stream->write(",\n");
+        } else {
+            m_stream->write("\n");
+        }
+    }
+    --m_indentDepth;
+    writeIndent();
+    m_stream->write("]\n");
+}
+
+void QmlStreamWriter::write(const QString &data)
+{
+    flushPotentialLinesWithNewlines();
+    m_stream->write(data.toUtf8());
+}
+
+void QmlStreamWriter::writeScriptObjectLiteralBinding(const QString &name, const QList<QPair<QString, QString> > &keyValue)
+{
+    flushPotentialLinesWithNewlines();
+    writeIndent();
+    m_stream->write(QString("%1: {\n").arg(name).toUtf8());
+    ++m_indentDepth;
+    for (int i = 0; i < keyValue.size(); ++i) {
+        const QString key = keyValue.at(i).first;
+        const QString value = keyValue.at(i).second;
+        writeIndent();
+        m_stream->write(QString("%1: %2").arg(key, value).toUtf8());
+        if (i != keyValue.size() - 1) {
+            m_stream->write(",\n");
+        } else {
+            m_stream->write("\n");
+        }
+    }
+    --m_indentDepth;
+    writeIndent();
+    m_stream->write("}\n");
+}
+
+void QmlStreamWriter::writeIndent()
+{
+    m_stream->write(QByteArray(m_indentDepth * 4, ' '));
+}
+
+void QmlStreamWriter::writePotentialLine(const QByteArray &line)
+{
+    m_pendingLines.append(line);
+    m_pendingLineLength += line.size();
+    if (m_pendingLineLength >= 80) {
+        flushPotentialLinesWithNewlines();
+    }
+}
+
+void QmlStreamWriter::flushPotentialLinesWithNewlines()
+{
+    if (m_maybeOneline)
+        m_stream->write("\n");
+    foreach (const QByteArray &line, m_pendingLines) {
+        writeIndent();
+        m_stream->write(line);
+        m_stream->write("\n");
+    }
+    m_pendingLines.clear();
+    m_pendingLineLength = 0;
+    m_maybeOneline = false;
+}
diff --git a/tools/qmlplugindump/qmlstreamwriter.h b/tools/qmlplugindump/qmlstreamwriter.h
new file mode 100644
index 0000000000..cd73aad8f2
--- /dev/null
+++ b/tools/qmlplugindump/qmlstreamwriter.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMLSTREAMWRITER_H
+#define QMLSTREAMWRITER_H
+
+#include <QtCore/QIODevice>
+#include <QtCore/QList>
+#include <QtCore/QString>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QPair>
+
+class QmlStreamWriter
+{
+public:
+    QmlStreamWriter(QByteArray *array);
+
+    void writeStartDocument();
+    void writeEndDocument();
+    void writeLibraryImport(const QString &uri, int majorVersion, int minorVersion, const QString &as = QString());
+    //void writeFilesystemImport(const QString &file, const QString &as = QString());
+    void writeStartObject(const QString &component);
+    void writeEndObject();
+    void writeScriptBinding(const QString &name, const QString &rhs);
+    void writeScriptObjectLiteralBinding(const QString &name, const QList<QPair<QString, QString> > &keyValue);
+    void writeArrayBinding(const QString &name, const QStringList &elements);
+    void write(const QString &data);
+
+private:
+    void writeIndent();
+    void writePotentialLine(const QByteArray &line);
+    void flushPotentialLinesWithNewlines();
+
+    int m_indentDepth;
+    QList<QByteArray> m_pendingLines;
+    int m_pendingLineLength;
+    bool m_maybeOneline;
+    QScopedPointer<QIODevice> m_stream;
+};
+
+#endif // QMLSTREAMWRITER_H
diff --git a/tools/qmlscene/main.cpp b/tools/qmlscene/main.cpp
new file mode 100644
index 0000000000..765a9dc2fb
--- /dev/null
+++ b/tools/qmlscene/main.cpp
@@ -0,0 +1,574 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qabstractanimation.h>
+#include <QtGui/qapplication.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativeview.h>
+#include <QtCore/qdir.h>
+#include <QtGui/QFormLayout>
+#include <QtGui/QComboBox>
+#include <QtGui/QCheckBox>
+#include <QtGui/QDialog>
+#include <QtGui/QDialogButtonBox>
+#include <QtGui/QFileDialog>
+#include <QtGui/QGraphicsView>
+
+#include <QtDeclarative/qdeclarativeitem.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <private/qdeclarativedebughelper_p.h>
+
+// ### This should be private API
+#include <qsgitem.h>
+#include <qsgview.h>
+
+#define QT_NO_SCENEGRAPHITEM
+
+#ifndef QT_NO_SCENEGRAPHITEM
+#include "scenegraphitem.h"
+#endif
+
+#include <QtCore/qmath.h>
+
+#ifdef QML_RUNTIME_TESTING
+class RenderStatistics
+{
+public:
+    static void updateStats();
+    static void printTotalStats();
+private:
+    static QVector<qreal> timePerFrame;
+    static QVector<int> timesPerFrames;
+};
+
+QVector<qreal> RenderStatistics::timePerFrame;
+QVector<int> RenderStatistics::timesPerFrames;
+
+void RenderStatistics::updateStats()
+{
+    static QTime time;
+    static int frames;
+    static int lastTime;
+
+    if (frames == 0) {
+        time.start();
+    } else {
+        int elapsed = time.elapsed();
+        timesPerFrames.append(elapsed - lastTime);
+        lastTime = elapsed;
+
+        if (elapsed > 5000) {
+            qreal avgtime = elapsed / (qreal) frames;
+            qreal var = 0;
+            for (int i = 0; i < timesPerFrames.size(); ++i) {
+                qreal diff = timesPerFrames.at(i) - avgtime;
+                var += diff * diff;
+            }
+            var /= timesPerFrames.size();
+
+            qDebug("Average time per frame: %f ms (%i fps), std.dev: %f ms", avgtime, qRound(1000. / avgtime), qSqrt(var));
+
+            timePerFrame.append(avgtime);
+            timesPerFrames.clear();
+            time.start();
+            lastTime = 0;
+            frames = 0;
+        }
+    }
+    ++frames;
+}
+
+void RenderStatistics::printTotalStats()
+{
+    int count = timePerFrame.count();
+    if (count == 0)
+        return;
+
+    qreal minTime = 0;
+    qreal maxTime = 0;
+    qreal avg = 0;
+    for (int i = 0; i < count; ++i) {
+        minTime = minTime == 0 ? timePerFrame.at(i) : qMin(minTime, timePerFrame.at(i));
+        maxTime = qMax(maxTime, timePerFrame.at(i));
+        avg += timePerFrame.at(i);
+    }
+    avg /= count;
+
+    qDebug(" ");
+    qDebug("----- Statistics -----");
+    qDebug("Average time per frame: %f ms (%i fps)", avg, qRound(1000. / avg));
+    qDebug("Best time per frame: %f ms (%i fps)", minTime, int(1000 / minTime));
+    qDebug("Worst time per frame: %f ms (%i fps)", maxTime, int(1000 / maxTime));
+    qDebug("----------------------");
+    qDebug(" ");
+}
+#endif
+
+
+static QGLFormat getFormat()
+{
+    QGLFormat f = QGLFormat::defaultFormat();
+    f.setSampleBuffers(!qApp->arguments().contains("--no-multisample"));
+    f.setSwapInterval(qApp->arguments().contains("--nonblocking-swap") ? 0 : 1);
+    f.setStereo(qApp->arguments().contains("--stereo"));
+    return f;
+}
+
+class MyQSGView : public QSGView
+{
+public:
+    MyQSGView() : QSGView(getFormat())
+    {
+        setResizeMode(QSGView::SizeRootObjectToView);
+    }
+
+protected:
+    void paintEvent(QPaintEvent *e) {
+        QSGView::paintEvent(e);
+
+#ifdef QML_RUNTIME_TESTING
+//        RenderStatistics::updateStats();
+#endif
+
+        static bool continuousUpdate = qApp->arguments().contains("--continuous-update");
+        if (continuousUpdate)
+            update();
+    }
+};
+
+class MyDeclarativeView: public QDeclarativeView
+{
+public:
+    MyDeclarativeView(QWidget *parent = 0) : QDeclarativeView(parent)
+    {
+        setResizeMode(QDeclarativeView::SizeRootObjectToView);
+    }
+
+protected:
+    void paintEvent(QPaintEvent *event)
+    {
+        QDeclarativeView::paintEvent(event);
+
+#ifdef QML_RUNTIME_TESTING
+        RenderStatistics::updateStats();
+#endif
+
+        static bool continuousUpdate = qApp->arguments().contains("--continuous-update");
+        if (continuousUpdate)
+            scene()->update();
+    }
+};
+
+#ifndef QT_NO_SCENEGRAPHITEM
+class MyGraphicsView: public QGraphicsView
+{
+public:
+    MyGraphicsView(bool clip, QWidget *parent = 0) : QGraphicsView(parent)
+    {
+        setViewport(new QGLWidget(getFormat()));
+        setScene(&scene);
+        scene.addItem(&item);
+        item.setFlag(QGraphicsItem::ItemClipsToShape, clip);
+        QGraphicsTextItem *text;
+        text = scene.addText(QLatin1String("Scene graph on graphics view."), QFont(QLatin1String("Times"), 10));
+        text->setX(5);
+        text->setY(5);
+        text->setDefaultTextColor(Qt::black);
+        text = scene.addText(QLatin1String("Scene graph on graphics view."), QFont(QLatin1String("Times"), 10));
+        text->setX(4);
+        text->setY(4);
+        text->setDefaultTextColor(Qt::yellow);
+    }
+
+    SceneGraphItem *sceneGraphItem() { return &item; }
+
+protected:
+    void paintEvent(QPaintEvent *event)
+    {
+        QGraphicsView::paintEvent(event);
+
+#ifdef QML_RUNTIME_TESTING
+        RenderStatistics::updateStats();
+#endif
+
+        static bool continuousUpdate = qApp->arguments().contains("--continuous-update");
+        if (continuousUpdate)
+            QGraphicsView::scene()->update();
+    }
+
+    QGraphicsScene scene;
+    SceneGraphItem item;
+};
+#endif
+
+struct Options
+{
+    Options()
+        : originalQml(false)
+        , originalQmlRaster(false)
+        , maximized(false)
+        , fullscreen(false)
+        , scenegraphOnGraphicsview(false)
+        , clip(false)
+        , versionDetection(true)
+    {
+    }
+
+    QUrl file;
+    bool originalQml;
+    bool originalQmlRaster;
+    bool maximized;
+    bool fullscreen;
+    bool scenegraphOnGraphicsview;
+    bool clip;
+    bool versionDetection;
+};
+
+#if defined(QMLSCENE_BUNDLE)
+Q_DECLARE_METATYPE(QFileInfo);
+QFileInfoList findQmlFiles(const QString &dirName)
+{
+    QDir dir(dirName);
+
+    QFileInfoList ret;
+    if (dir.exists()) {
+        QFileInfoList fileInfos = dir.entryInfoList(QStringList() << "*.qml",
+                                                    QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot);
+
+        foreach (QFileInfo fileInfo, fileInfos) {
+            if (fileInfo.isDir())
+                ret += findQmlFiles(fileInfo.filePath());
+            else if (fileInfo.fileName().length() > 0 && fileInfo.fileName().at(0).isLower())
+                ret.append(fileInfo);
+        }
+    }
+
+    return ret;
+}
+
+static int displayOptionsDialog(Options *options)
+{
+    QDialog dialog;
+
+    QFormLayout *layout = new QFormLayout(&dialog);
+
+    QComboBox *qmlFileComboBox = new QComboBox(&dialog);
+    QFileInfoList fileInfos = findQmlFiles(":/bundle") + findQmlFiles("./qmlscene-resources");
+
+    foreach (QFileInfo fileInfo, fileInfos)
+        qmlFileComboBox->addItem(fileInfo.dir().dirName() + "/" + fileInfo.fileName(), QVariant::fromValue(fileInfo));
+
+    QCheckBox *originalCheckBox = new QCheckBox(&dialog);
+    originalCheckBox->setText("Use original QML viewer");
+    originalCheckBox->setChecked(options->originalQml);
+
+    QCheckBox *fullscreenCheckBox = new QCheckBox(&dialog);
+    fullscreenCheckBox->setText("Start fullscreen");
+    fullscreenCheckBox->setChecked(options->fullscreen);
+
+    QCheckBox *maximizedCheckBox = new QCheckBox(&dialog);
+    maximizedCheckBox->setText("Start maximized");
+    maximizedCheckBox->setChecked(options->maximized);
+
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
+                                                       Qt::Horizontal,
+                                                       &dialog);
+    QObject::connect(buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept()));
+    QObject::connect(buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject()));
+
+    layout->addRow("Qml file:", qmlFileComboBox);
+    layout->addWidget(originalCheckBox);
+    layout->addWidget(maximizedCheckBox);
+    layout->addWidget(fullscreenCheckBox);
+    layout->addWidget(buttonBox);
+
+    int result = dialog.exec();
+    if (result == QDialog::Accepted) {
+        QVariant variant = qmlFileComboBox->itemData(qmlFileComboBox->currentIndex());
+        QFileInfo fileInfo = variant.value<QFileInfo>();
+
+        if (fileInfo.canonicalFilePath().startsWith(":"))
+            options->file = QUrl("qrc" + fileInfo.canonicalFilePath());
+        else
+            options->file = QUrl::fromLocalFile(fileInfo.canonicalFilePath());
+        options->originalQml = originalCheckBox->isChecked();
+        options->maximized = maximizedCheckBox->isChecked();
+        options->fullscreen = fullscreenCheckBox->isChecked();
+    }
+    return result;
+}
+#endif
+
+static void checkAndAdaptVersion(const QUrl &url)
+{
+    if (!qgetenv("QMLSCENE_IMPORT_NAME").isEmpty()) {
+        return;
+    }
+
+    QString fileName = url.toLocalFile();
+    if (fileName.isEmpty())
+        return;
+
+    QFile f(fileName);
+    if (!f.open(QFile::ReadOnly | QFile::Text)) {
+        qWarning("qmlscene: failed to check version of file '%s', could not open...",
+                 qPrintable(fileName));
+        return;
+    }
+
+    QRegExp quick1("import +QtQuick +1\\.");
+    QRegExp qt47("import +Qt +4\\.7");
+
+    QString envToWrite;
+    QString compat;
+
+    QTextStream stream(&f);
+    bool codeFound= false;
+    while (!codeFound && envToWrite.isEmpty()) {
+        QString line = stream.readLine();
+        if (line.contains("{"))
+            codeFound = true;
+        if (quick1.indexIn(line) >= 0) {
+            envToWrite = QLatin1String("quick1");
+            compat = QLatin1String("QtQuick 1.0");
+        } else if (qt47.indexIn(line) >= 0) {
+            envToWrite = QLatin1String("qt");
+            compat = QLatin1String("Qt 4.7");
+        }
+    }
+
+    if (!envToWrite.isEmpty()) {
+        qWarning("qmlscene: Autodetecting compatibility import \"%s\"...", qPrintable(compat));
+        if (qgetenv("QMLSCENE_IMPORT_NAME").isEmpty())
+            qputenv("QMLSCENE_IMPORT_NAME", envToWrite.toLatin1().constData());
+    }
+}
+
+static void displayFileDialog(Options *options)
+{
+    QString fileName = QFileDialog::getOpenFileName(0, "Open QML file", QString(), "QML Files (*.qml)");
+    if (!fileName.isEmpty()) {
+        QFileInfo fi(fileName);
+        options->file = QUrl::fromLocalFile(fi.canonicalFilePath());
+    }
+}
+
+static void loadDummyDataFiles(QDeclarativeEngine &engine, const QString& directory)
+{
+    QDir dir(directory+"/dummydata", "*.qml");
+    QStringList list = dir.entryList();
+    for (int i = 0; i < list.size(); ++i) {
+        QString qml = list.at(i);
+        QFile f(dir.filePath(qml));
+        f.open(QIODevice::ReadOnly);
+        QByteArray data = f.readAll();
+        QDeclarativeComponent comp(&engine);
+        comp.setData(data, QUrl());
+        QObject *dummyData = comp.create();
+
+        if(comp.isError()) {
+            QList<QDeclarativeError> errors = comp.errors();
+            foreach (const QDeclarativeError &error, errors) {
+                qWarning() << error;
+            }
+        }
+
+        if (dummyData) {
+            qWarning() << "Loaded dummy data:" << dir.filePath(qml);
+            qml.truncate(qml.length()-4);
+            engine.rootContext()->setContextProperty(qml, dummyData);
+            dummyData->setParent(&engine);
+        }
+    }
+}
+
+static void usage()
+{
+    qWarning("Usage: qmlscene [options] <filename>");
+    qWarning(" ");
+    qWarning(" options:");
+    qWarning("  --maximized ............................... run maximized");
+    qWarning("  --fullscreen .............................. run fullscreen");
+    qWarning("  --original-qml ............................ run using QGraphicsView instead of scenegraph (OpenGL engine)");
+    qWarning("  --original-qml-raster ..................... run using QGraphicsView instead of scenegraph (Raster engine)");
+    qWarning("  --no-multisample .......................... Disable multisampling (anti-aliasing)");
+    qWarning("  --continuous-update ....................... Continuously render the scene");
+    qWarning("  --nonblocking-swap ........................ Do not wait for v-sync to swap buffers");
+    qWarning("  --stereo .................................. Enable stereo on the GL context");
+#ifndef QT_NO_SCENEGRAPHITEM
+    qWarning("  --sg-on-gv [--clip] ....................... Scenegraph on graphicsview (and clip to item)");
+#endif
+    qWarning("  --no-version-detection .................... Do not try to detect the version of the .qml file");
+
+    qWarning(" ");
+    exit(1);
+}
+
+int main(int argc, char ** argv)
+{
+#ifdef Q_WS_X11
+    QApplication::setAttribute(Qt::AA_X11InitThreads);
+#endif
+
+    Options options;
+
+    QDeclarativeDebugHelper::enableDebugging();
+    QStringList imports;
+    for (int i = 1; i < argc; ++i) {
+        if (*argv[i] != '-' && QFileInfo(argv[i]).exists())
+            options.file = QUrl::fromLocalFile(argv[i]);
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--original-qml"))
+            options.originalQml = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--original-qml-raster"))
+            options.originalQmlRaster = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--maximized"))
+            options.maximized = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--fullscreen"))
+            options.fullscreen = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--sg-on-gv"))
+            options.scenegraphOnGraphicsview = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--clip"))
+            options.clip = true;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--no-version-detection"))
+            options.versionDetection = false;
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("-i") && i + 1 < argc)
+            imports.append(QString::fromLatin1(argv[++i]));
+        else if (QString::fromLatin1(argv[i]).toLower() == QLatin1String("--help")
+                 || QString::fromLatin1(argv[i]).toLower() == QLatin1String("-help")
+                 || QString::fromLatin1(argv[i]).toLower() == QLatin1String("--h")
+                 || QString::fromLatin1(argv[i]).toLower() == QLatin1String("-h"))
+            usage();
+    }
+
+    QApplication::setGraphicsSystem("raster");
+
+    QApplication app(argc, argv);
+    app.setApplicationName("QtQmlViewer");
+    app.setOrganizationName("Nokia");
+    app.setOrganizationDomain("nokia.com");
+
+    if (options.file.isEmpty())
+#if defined(QMLSCENE_BUNDLE)
+        displayOptionsDialog(&options);
+#else
+        displayFileDialog(&options);
+#endif
+
+    QWidget *view = 0;
+    QDeclarativeEngine *engine = 0;
+
+    int exitCode = 0;
+
+    if (!options.file.isEmpty()) {
+#ifndef QT_NO_SCENEGRAPHITEM
+        if (options.scenegraphOnGraphicsview) {
+            MyGraphicsView *gvView = new MyGraphicsView(options.clip);
+            SceneGraphItem *item = gvView->sceneGraphItem();
+            engine = item->engine();
+            for (int i = 0; i < imports.size(); ++i)
+                engine->addImportPath(imports.at(i));
+            view = gvView;
+            if (options.file.isLocalFile()) {
+                QFileInfo fi(options.file.toLocalFile());
+                loadDummyDataFiles(*engine, fi.path());
+            }
+            item->setSource(options.file);
+        } else
+#endif
+        if (!options.originalQml && !options.originalQmlRaster) {
+            if (options.versionDetection)
+                checkAndAdaptVersion(options.file);
+            QSGView *qxView = new MyQSGView();
+            engine = qxView->engine();
+            for (int i = 0; i < imports.size(); ++i)
+                engine->addImportPath(imports.at(i));
+            view = qxView;
+            if (options.file.isLocalFile()) {
+                QFileInfo fi(options.file.toLocalFile());
+                loadDummyDataFiles(*engine, fi.path());
+            }
+            qxView->setSource(options.file);
+
+        } else {
+            MyDeclarativeView *gvView = new MyDeclarativeView();
+            engine = gvView->engine();
+            for (int i = 0; i < imports.size(); ++i)
+                engine->addImportPath(imports.at(i));
+            view = gvView;
+            if (options.file.isLocalFile()) {
+                QFileInfo fi(options.file.toLocalFile());
+                loadDummyDataFiles(*engine, fi.path());
+            }
+            gvView->setSource(options.file);
+            if (!options.originalQmlRaster) {
+                QGLWidget *viewport = new QGLWidget(getFormat());
+                gvView->setViewport(viewport);
+            }
+        }
+
+        QObject::connect(engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit()));
+
+        if (options.fullscreen)
+            view->showFullScreen();
+        else if (options.maximized)
+            view->showMaximized();
+        else
+            view->show();
+
+#ifdef Q_WS_MAC
+        view->raise();
+#endif
+
+        exitCode = app.exec();
+
+        delete view;
+
+#ifdef QML_RUNTIME_TESTING
+        RenderStatistics::printTotalStats();
+#endif
+    }
+
+    return exitCode;
+}
+
diff --git a/tools/qmlscene/qmlscene.pro b/tools/qmlscene/qmlscene.pro
new file mode 100644
index 0000000000..3849336fc8
--- /dev/null
+++ b/tools/qmlscene/qmlscene.pro
@@ -0,0 +1,20 @@
+TEMPLATE = app
+TARGET = qmlscene
+DESTDIR= ../../bin
+
+QT += declarative
+
+target.path = $$[QT_INSTALL_BINS]
+INSTALLS += target
+
+macx: CONFIG -= app_bundle
+
+SOURCES += main.cpp
+
+CONFIG += console
+
+symbian {
+    TARGET.EPOCHEAPSIZE = 0x20000 0x5000000
+}
+
+DEFINES += QML_RUNTIME_TESTING
diff --git a/tools/qmlviewer/main.cpp b/tools/qmlviewer/main.cpp
index b2c7f4f730..b1a10ff6c4 100644
--- a/tools/qmlviewer/main.cpp
+++ b/tools/qmlviewer/main.cpp
@@ -156,7 +156,9 @@ void usage()
     qWarning("  -P <directory> ........................... prepend to the plugin search path");
 #if defined(Q_WS_MAC)
     qWarning("  -no-opengl ............................... don't use a QGLWidget for the viewport");
+    qWarning("  -opengl .................................. use a QGLWidget for the viewport (default)");
 #else
+    qWarning("  -no-opengl ............................... don't use a QGLWidget for the viewport (default)");
     qWarning("  -opengl .................................. use a QGLWidget for the viewport");
 #endif
     qWarning("  -script <path> ........................... set the script to use");
@@ -375,13 +377,10 @@ static void parseCommandLineOptions(const QStringList &arguments)
         } else if (arg == "-translation") {
             if (lastArg) usage();
             opts.translationFile = arguments.at(++i);
-#if defined(Q_WS_MAC)
         } else if (arg == "-no-opengl") {
             opts.useGL = false;
-#else
         } else if (arg == "-opengl") {
             opts.useGL = true;
-#endif
         } else if (arg == "-qmlbrowser") {
             opts.useNativeFileBrowser = false;
         } else if (arg == "-warnings") {
@@ -522,6 +521,8 @@ QDeclarativeViewer *openFile(const QString &fileName)
 
 int main(int argc, char ** argv)
 {
+    QDeclarativeDebugHelper::enableDebugging();
+
     systemMsgOutput = qInstallMsgHandler(myMessageOutput);
 
 #if defined (Q_WS_X11) || defined (Q_WS_MAC)
diff --git a/tools/qmlviewer/qmlruntime.cpp b/tools/qmlviewer/qmlruntime.cpp
index 36915d12bf..4bae7f3ec0 100644
--- a/tools/qmlviewer/qmlruntime.cpp
+++ b/tools/qmlviewer/qmlruntime.cpp
@@ -1477,6 +1477,7 @@ void QDeclarativeViewer::setUseGL(bool useGL)
         QGLFormat format = QGLFormat::defaultFormat();
 #ifdef Q_WS_MAC
         format.setSampleBuffers(true);
+        format.setSwapInterval(1);
 #else
         format.setSampleBuffers(false);
 #endif
diff --git a/tools/tools.pro b/tools/tools.pro
index 2035460ce2..6d5b43a9e4 100644
--- a/tools/tools.pro
+++ b/tools/tools.pro
@@ -1,2 +1,2 @@
 TEMPLATE = subdirs
-SUBDIRS +=  qmlviewer
+SUBDIRS +=  qmlviewer qmlscene qmlplugindump distfieldgen
-- 
GitLab