    Ext.define('Ext.event.Touch', {
        extend: 'Ext.event.Dom',

        requires: [
            'Ext.util.Point'
        ],

        constructor: function(event, info) {
            if (info) {
                this.set(info);
            }

            this.touchesMap = {};

            this.changedTouches = this.cloneTouches(event.changedTouches);
            this.touches = this.cloneTouches(event.touches);
            this.targetTouches = this.cloneTouches(event.targetTouches);

            return this.callParent([event]);
        },

        clone: function() {
            return new this.self(this);
        },

        setTargets: function(targetsMap) {
            this.doSetTargets(this.changedTouches, targetsMap);
            this.doSetTargets(this.touches, targetsMap);
            this.doSetTargets(this.targetTouches, targetsMap);
        },

        doSetTargets: function(touches, targetsMap) {
            var i, ln, touch, identifier, targets;

            for (i = 0,ln = touches.length; i < ln; i++) {
                touch = touches[i];

                identifier = touch.identifier;

                targets = targetsMap[identifier];

                if (targets) {
                    touch.targets = targets;
                }
            }
        },

        cloneTouches: function(touches) {
            var map = this.touchesMap,
                clone = [],
                lastIdentifier = null,
                i, ln, touch, identifier;

            for (i = 0,ln = touches.length; i < ln; i++) {
                touch = touches[i];

                identifier = touch.identifier;

                // A quick fix for a bug found in Bada 1.0 where all touches have
                // idenfitier of 0
                if (lastIdentifier !== null && identifier === lastIdentifier) {
                    identifier++;
                }

                lastIdentifier = identifier;

                if (!map[identifier]) {
                    map[identifier] = {
                        pageX: touch.pageX,
                        pageY: touch.pageY,
                        identifier: identifier,
                        target: touch.target,
                        timeStamp: touch.timeStamp,
                        point: Ext.util.Point.fromTouch(touch),
                        targets: touch.targets
                    };
                }

                clone[i] = map[identifier];
            }

            return clone;
        }
    });