diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
index d93af8f6444cb0a62290d37c0162e1ae89676bc5..c5524fd208f8d8b4fbc0e94acf45b75db9f6ae30 100644
--- a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
@@ -16,6 +16,8 @@ import cz.nic.tablexia.game.games.shooting_range.actors.Watch;
 import cz.nic.tablexia.game.games.shooting_range.media.SoundType;
 import cz.nic.tablexia.game.games.shooting_range.media.Textures;
 import cz.nic.tablexia.game.games.shooting_range.model.GameState;
+import cz.nic.tablexia.game.games.shooting_range.tools.TargetGenerator;
+import cz.nic.tablexia.util.Log;
 
 /**
  * Created by lhoracek
@@ -25,10 +27,12 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> {
     private GfxLibrary gfxLibrary = new GfxLibrary(this, Textures.values());
     private SfxLibrary sfxLibrary = new SfxLibrary(this, SoundType.values());
 
-    private Scene    scene;
-    private Carousel carousel;
-    private Watch    watch;
-    List<Target>[] waves;
+    private Scene           scene;
+    private Carousel        carousel;
+    private Watch           watch;
+    private List<Target>[]  waves;
+    private TargetGenerator targetGenerator;
+
 
     @Override
     protected void prepareScreenSoundAssetNames(List<String> soundsFileNames) {
@@ -38,7 +42,7 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> {
 
     @Override
     protected GameState prepareGameData(Map<String, String> gameState) {
-        GameState gameData = new GameState(getGameDifficulty(), getRandom());
+        GameState gameData = new GameState();
         return gameData;
     }
 
@@ -48,14 +52,15 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> {
         super.gameLoaded(gameState);
         initScene();
 
-        // TODO start game
-
-        // TODO next flower
-        // start timer
-
-        waves = getData().getTargetGenerator().initWaves();
-
+        targetGenerator = new TargetGenerator(getGameDifficulty(), getRandom(), gfxLibrary);
+        waves = targetGenerator.initWaves();
 
+        for (List<Target> wave : waves) {
+            for (Target target : wave) {
+                scene.addActor(target);
+                Log.info(getClass(), "Added target " + target.toString());
+            }
+        }
         getStage().addAction(Actions.sequence(Actions.delay(1), Actions.run(new Runnable() {
             // TODO animate flowers in
             // TODO animate hand in
@@ -79,8 +84,8 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> {
 
         for (List<Target> wave : waves) {
             for (Target target : wave) {
-                scene.addActor(target);
-                target.getWave().getY(getData().getTime() - target.getStartTime(), 100);
+                target.setX(target.getWave().getX(getData().getTime() - target.getStartTime(), getStage().getWidth()));
+                target.setY(target.getWave().getY(getData().getTime() - target.getStartTime(), 100));
             }
         }
 
diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java b/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java
index 9d41468db5a5b0b4dd427965a3b34ed9286a4ae2..133c31c68cc62a0a45977cb3f6abb3189fbc58b0 100644
--- a/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java
@@ -101,4 +101,13 @@ public class Target extends Image {
         this.effect = effect;
     }
 
+
+    @Override
+    public String toString() {
+        return "Target{" +
+                "textureType=" + textureType +
+                ", wave=" + wave +
+                ", shot=" + shot +
+                '}';
+    }
 }
diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java b/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java
index ccf160fb7e4752662f9cc6bf5308037f4c6af1b2..1d0418559deabcf2bf2346a254b307acd142df0b 100644
--- a/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java
@@ -1,29 +1,15 @@
 package cz.nic.tablexia.game.games.shooting_range.model;
 
-import java.util.Random;
-
-import cz.nic.tablexia.game.difficulty.GameDifficulty;
-import cz.nic.tablexia.game.games.shooting_range.tools.TargetGenerator;
-
 /**
  * Created by lhoracek on 6/22/15.
  */
 public class GameState {
-    private TargetGenerator targetGenerator;
 
     private boolean running = false;
 
     private int   score = 0;
     private float time  = 0f;
 
-    public GameState(GameDifficulty gameDifficulty, Random random) {
-        targetGenerator = new TargetGenerator(gameDifficulty, random);
-    }
-
-    public TargetGenerator getTargetGenerator() {
-        return targetGenerator;
-    }
-
     public int getScore() {
         return score;
     }
diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java
index 56cc497c9f7bcea14ba11ddec0e9ca6075871a6c..6319b69ae16621fb5d62b1668db8c97e8d165e59 100644
--- a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java
@@ -7,6 +7,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import cz.nic.tablexia.game.common.media.GfxLibrary;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.game.games.shooting_range.media.Textures;
 import cz.nic.tablexia.game.games.shooting_range.actors.Target;
@@ -28,11 +29,14 @@ public class TargetGenerator {
 
     private GameDifficulty gameDifficulty;
     private Random         random;
+    private GfxLibrary gfxLibrary;
 
-    public TargetGenerator(GameDifficulty gameDifficulty, Random random) {
+    public TargetGenerator(GameDifficulty gameDifficulty, Random random, GfxLibrary gfxLibrary) {
         super();
         this.random = random;
         this.gameDifficulty = gameDifficulty;
+        this.gfxLibrary = gfxLibrary;
+
     }
 
     public Textures getRandomFlowerType(GameDifficulty gameDifficulty) {
@@ -78,7 +82,6 @@ public class TargetGenerator {
 
         // přidáme jeden terč za okraj na prvn obrazovce
         for (int i = -flowerNumber; i <= 0; i++) {
-
             Target target = getRandomTarget(textureTypeBag, targetPeriod * i, wave);
             flowers.add(target);
             if (i == 0) {
@@ -109,10 +112,7 @@ public class TargetGenerator {
             textureType = textureTypeBag.get(random);
         }
 
-        // TODO
-        // Target target = new Target(0, 0, gfxManager.get(textureType).second, startTime, wave, textureType);
-        // return target;
-        return null;
+        return new Target(gfxLibrary.getTextureRegion(textureType), startTime, wave, textureType);
     }
 
     private float getBoxProbability() {
diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java
new file mode 100644
index 0000000000000000000000000000000000000000..32b0a960fd01ffeb746cb8e40ca69bbcd75aeef9
--- /dev/null
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java
@@ -0,0 +1,141 @@
+package cz.nic.tablexia.game.games.shooting_range.tools;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import cz.nic.tablexia.game.games.shooting_range.actors.Target;
+import cz.nic.tablexia.game.games.shooting_range.media.Textures;
+import cz.nic.tablexia.game.games.shooting_range.model.Wave;
+
+/**
+ * Created by lhoracek on 7/2/15.
+ */
+public class TargetPositionController {
+
+    public static final float GAME_SPEED_FAST    = 2.0f;
+    public static final float GAME_SPEED_NORMAL  = 1f;
+    public static final float GAME_SPEED_SLOW    = 0.5f;
+    public static final float GAME_SPEED_TIMEOUT = 5f;
+
+    private float elapsedTime = 0;
+    private final List<Target> targets;
+    private float gameSpeed = 1;
+    private final TargetGenerator targetGenerator;
+    private final Random          random;
+    private final float           width;
+
+
+    public TargetPositionController(List<Target> targets, TargetGenerator targetGenerator, Random random, float width) {
+        super();
+        this.targets = targets;
+        this.targetGenerator = targetGenerator;
+        this.random = random;
+        this.width = width;
+    }
+
+    public void setGameSpeed(float gameSpeed) {
+        this.gameSpeed = gameSpeed;
+    }
+
+    public void resetGameSpeed() {
+        gameSpeed = GAME_SPEED_NORMAL;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.andengine.engine.handler.IUpdateHandler#onUpdate(float)
+     */
+    @Override
+    public void onUpdate(float pSecondsElapsed) {
+        elapsedTime += (pSecondsElapsed * gameSpeed);
+
+        List<Target> toRemove = new ArrayList<Target>();
+        List<Target> toAdd = new ArrayList<Target>();
+        List<Target> invisibles = new ArrayList<Target>();
+        Set<Textures> availableTypes = new HashSet<Textures>();
+        Set<Wave> waves = new HashSet<Wave>();
+        for (Target target : targets) {
+            float x = target.getWave().getX(elapsedTime - target.getStartTime(), width);
+            if ((x > 0) && (x < width)) {
+                // cil je na scene
+                if (target.getParent() == null) {
+                    // jeste nebyl vykreslen, tak ho pridame do sceny
+                    // TODO
+
+                    scene.attachChild(target);
+                    scene.registerTouchArea(target);
+                    scene.sortChildren();
+                    target.setOnAreaTouchedListener(parent);
+                    if (targetGenerator.getLastTargetInWave(target.getWave()).equals(target)) {
+                        toAdd.add(targetGenerator.addNewTargetToWave(target.getWave(), parent.getVertexBufferObjectManager(), null));
+                    }
+                }
+                target.setX(x);
+                target.setY((baseHeight - ((height * StrelniceActivity.WAVE_VERTICAL_OFFSET) / 2)) + target.getWave().getY(elapsedTime - target.getStartTime(), height) + (target.getWave().getVerticalOrder() * (height * StrelniceActivity.WAVE_VERTICAL_OFFSET)));
+
+                if (target.getEffect() != null) {
+                    target.getEffect().setX(x);
+                }
+                // koukame pouze na prvnĂ­ polovinu obrazovky a ukladama si dostupne kytky
+                if ((x > (Direction.RIGHT == target.getWave().getDirection() ? 0 : width / 2)) && (x < (Direction.RIGHT == target.getWave().getDirection() ? width / 2 : width))) {
+                    // pouze nesestřelené
+                    if (!target.isShot()) {
+                        availableTypes.add(target.getTextureType());
+                    }
+                }
+                waves.add(target.getWave());
+            } else {
+                if (target.getParent() != null) {
+                    // je na scene, ale je mimo jeji sirku, tak ho odebereme ze sceny
+                    final Target flowerToRemove = target;
+                    parent.runOnUpdateThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            scene.unregisterTouchArea(flowerToRemove);
+                            flowerToRemove.detachSelf();
+                        }
+                    });
+                } else {
+                    if (((target.getWave().getDirection() == Direction.LEFT) && (x < 0)) || ((target.getWave().getDirection() == Direction.RIGHT) && (x > width))) {
+                        // uĹľ je mimo obraz
+                        toRemove.add(target);
+                    } else {
+                        // teprve přichází do obrazu
+                        availableTypes.add(target.getTextureType()); // TODO zkusime vypnout ocekavane kytky, aby jich rovnou pridaval vic
+                        invisibles.add(target);
+                    }
+                }
+            }
+        }
+
+        targets.removeAll(toRemove);
+        targets.addAll(toAdd);
+        invisibles.addAll(toAdd);
+
+        if ((parent.getCurrentTarget() != null) && !availableTypes.contains(parent.getCurrentTarget().first)) {
+            if (invisibles.size() > 0) {
+                int index = random.nextInt(invisibles.size());
+                Target swap = invisibles.get(index);
+                Target swapTo = targetGenerator.addNewTargetToWave(swap.getWave(), parent.getVertexBufferObjectManager(), parent.getCurrentTarget().first, swap.getStartTime(), targetGenerator.getLastTargetInWave(swap.getWave()).equals(swap));
+                targets.remove(swap);
+                targets.add(swapTo);
+            } else {
+                targets.add(targetGenerator.addNewTargetToWave(waves.toArray(new Wave[0])[random.nextInt(waves.size())], parent.getVertexBufferObjectManager(), parent.getCurrentTarget().first));
+            }
+        }
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.andengine.engine.handler.IUpdateHandler#reset()
+     */
+    @Override
+    public void reset() {
+    }
+
+
+}