diff --git a/frontend/assets/bullet.png b/frontend/assets/bullet.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d3738673768d778c97c07c961024bc1de9788ce
Binary files /dev/null and b/frontend/assets/bullet.png differ
diff --git a/frontend/core/src/com/game/tankwars/controller/GameController.java b/frontend/core/src/com/game/tankwars/controller/GameController.java
index 78b7051e1c2ca304cc7b27635e5571f066b24672..d5625eff6c193fc24c7a7e63385db0bf91dd1244 100644
--- a/frontend/core/src/com/game/tankwars/controller/GameController.java
+++ b/frontend/core/src/com/game/tankwars/controller/GameController.java
@@ -2,9 +2,14 @@ package com.game.tankwars.controller;
 
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Input;
+import com.badlogic.gdx.graphics.OrthographicCamera;
+import com.badlogic.gdx.math.Rectangle;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
 import com.game.tankwars.TankWarsGame;
 import com.game.tankwars.model.Bullet;
@@ -20,21 +25,27 @@ public class GameController {
     private Tank tank;
 
     private Bullet bullet;
+    private Vector3 touchPos;
 
     private boolean moveRightTouched;
     private boolean moveLeftTouched;
 
+    private boolean aimUpTouched;
+    private boolean aimDownTouched;
+
+
     public GameController(Tank tank, TankWarsGame tankWarsGame, GameHud hud) {
         this.hud = hud;
         this.tank = tank;
         this.tankWarsGame = tankWarsGame;
+        this.touchPos = new Vector3();
     }
 
     public void checkKeyInput(Tank tank){
-        if(Gdx.input.isKeyPressed(Input.Keys.Q)) {
+        if(aimUpTouched) {
             tank.rotateCannonLeft();
         }
-        else if (Gdx.input.isKeyPressed(Input.Keys.E)) {
+        else if (aimDownTouched) {
             tank.rotateCannonRight();
         }
 
@@ -50,7 +61,8 @@ public class GameController {
         hud.getFireButton().addListener(new ChangeListener() {
             public void changed (ChangeEvent event, Actor actor) {
                 bullet = new Bullet(tank);
-                bullet.shoot();
+                float power = hud.getPowerSlider().getValue();
+                bullet.shoot(power);
                 //actor.setTouchable(Touchable.disabled);
                 // TODO: send turn  to server + enable touchable when it is players turn
                 endPlayerTurn();
@@ -61,7 +73,7 @@ public class GameController {
             @Override
             public void changed(ChangeEvent event, Actor actor) {
 
-                System.out.println(hud.getPowerSlider().getValue());
+                //System.out.println(hud.getPowerSlider().getValue());
                 tank.setPower(Math.round(hud.getPowerSlider().getValue()));
             }
         });
@@ -79,6 +91,37 @@ public class GameController {
             }
         });
 
+        hud.getAimUp().addListener(new InputListener() {
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                System.out.println("Aim up start");
+                aimUpTouched = true;
+                return true;
+            }
+
+            @Override
+            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+                System.out.println("Aim up stop");
+                aimUpTouched = false;
+            }
+        });
+
+        hud.getAimDown().addListener(new InputListener() {
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                System.out.println("Aim down start");
+                aimDownTouched = true;
+                return true;
+            }
+
+            @Override
+            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+                System.out.println("Aim down stop");
+                aimDownTouched = false;
+            }
+        });
+
+
         hud.getMoveRight().addListener(new InputListener() {
             @Override
             public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
@@ -94,12 +137,23 @@ public class GameController {
         });
 
 
+
+
     }
 
+
     public boolean endPlayerTurn() {
-        System.out.println(tank.getPower());
-        System.out.println(tank.getPosition());
+        //System.out.println(tank.getPower());
+        //System.out.println(tank.getPosition());
         // end turn for player and send data to server
         return true;
     }
+
+    public Bullet getBullet() {
+        if (bullet != null) {
+            return bullet;
+        }
+        return null;
+    }
+
 }
diff --git a/frontend/core/src/com/game/tankwars/model/Bullet.java b/frontend/core/src/com/game/tankwars/model/Bullet.java
index 70fe72fc1da4f94551be6fd26c4daaae0de24972..23dd7c38a2a004c34c0c892f65864430807365ae 100644
--- a/frontend/core/src/com/game/tankwars/model/Bullet.java
+++ b/frontend/core/src/com/game/tankwars/model/Bullet.java
@@ -1,49 +1,87 @@
 package com.game.tankwars.model;
 
 import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.Sprite;
+import com.badlogic.gdx.math.MathUtils;
 import com.badlogic.gdx.math.Vector2;
 import com.badlogic.gdx.physics.box2d.Body;
 import com.badlogic.gdx.physics.box2d.BodyDef;
 import com.badlogic.gdx.physics.box2d.CircleShape;
 import com.badlogic.gdx.physics.box2d.FixtureDef;
 import com.badlogic.gdx.physics.box2d.World;
+import com.game.tankwars.TankWarsGame;
 
 public class Bullet {
-
-    BodyDef bodyDef = new BodyDef();
-    FixtureDef fixtureDef = new FixtureDef();
-    World world;
-    Body body;
-    Tank tank;
+    private static final Vector2 IMPULSE = new Vector2(0.7f, 0.8f);
+    private BodyDef bodyDef = new BodyDef();
+    private FixtureDef fixtureDef = new FixtureDef();
+    private World world;
+    private Body body;
+    private Tank tank;
     private Vector2 position;
 
+    private Sprite bulletSprite;
+
+    private float angle;
+
     public Bullet(Tank tank) {
         this.tank = tank;
-        //this.position = new Vector2(tank.getPosition().add(0, 1f));
+        this.angle = tank.getCannonAngle();
         world = Box2dWorld.getWorld();
         bodyDef.type = BodyDef.BodyType.DynamicBody;
-        bodyDef.position.set(new Vector2(tank.getPosition().add(0, 1f)));
+        bodyDef.position.set(new Vector2(tank.getCannonPosition().add(Tank.CANNON_WIDTH + 1, Tank.CANNON_HEIGHT + 1)));
         body = world.createBody(bodyDef);
 
         CircleShape shape = new CircleShape();
         shape.setRadius(0.1f);
         fixtureDef.shape = shape;
         fixtureDef.density = 0.5f;
-        fixtureDef.restitution = 0.6f;
-        fixtureDef.friction = 0.4f;
+        fixtureDef.restitution = 0.0f;
+        fixtureDef.friction = 1f;
         body.createFixture(fixtureDef);
 
+
         shape.dispose();
+        bulletSprite = new Sprite(new Texture("bullet.png"));
+        bulletSprite.setScale(0.5f);
+        body.setUserData(bulletSprite);
+
+        position = new Vector2(body.getPosition());
 
     }
 
-    public void shoot() {
+    public void shoot(float power) {
+        Vector2 impulsePower = calculatePower(power);
         body.applyLinearImpulse(
-                0.2f,
-                0.3f,
-                new Vector2(tank.getPosition()).x-1,
-                new Vector2(tank.getPosition()).y-2,
+                impulsePower.x,
+                impulsePower.y,
+                position.x,
+                position.y,
                 false);
     }
 
+    private Vector2 calculatePower(float power) {
+
+        float scale = power / 100;
+        double radAngle = (angle * MathUtils.degRad) - (Math.PI / 2);
+        float impulseX = IMPULSE.x * (float) Math.cos(radAngle);
+        float impulseY = IMPULSE.y * (float) Math.sin(radAngle);
+
+        Vector2 impulse = new Vector2(impulseX, impulseY).scl(scale);
+        return impulse;
+    }
+
+    public Sprite getBulletSprite() { return bulletSprite; }
+
+
+    public void removeBullet() {
+        world.destroyBody(body);
+        bulletSprite.getTexture().dispose();
+    }
+
+    public Body getBody() { return body; }
+
+
+
 }
diff --git a/frontend/core/src/com/game/tankwars/model/Tank.java b/frontend/core/src/com/game/tankwars/model/Tank.java
index 41236a44780eddebace7003c89c0f97de416d9af..6ed7c6d5990ac24705ebf81e4dd4cedaeb24016a 100644
--- a/frontend/core/src/com/game/tankwars/model/Tank.java
+++ b/frontend/core/src/com/game/tankwars/model/Tank.java
@@ -3,8 +3,10 @@ package com.game.tankwars.model;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.Sprite;
+import com.badlogic.gdx.math.MathUtils;
 import com.badlogic.gdx.math.Rectangle;
 import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.physics.box2d.Body;
 import com.badlogic.gdx.physics.box2d.BodyDef;
 import com.badlogic.gdx.physics.box2d.FixtureDef;
@@ -71,6 +73,8 @@ public class Tank {
         PolygonShape shape = new PolygonShape();
         shape.setAsBox(TANK_WIDTH, TANK_HEIGHT);
         fixtureDef.shape = shape;
+        fixtureDef.isSensor = true;
+        cannonPosition = new Vector2(bodyDef.position.add(1, -1));
 
         //Chassis
         chassis = world.createBody(bodyDef);
@@ -80,11 +84,15 @@ public class Tank {
 
         //Cannon
         shape.setAsBox(CANNON_WIDTH, CANNON_HEIGHT);
+        FixtureDef canonFixture = new FixtureDef();
+        canonFixture.shape = shape;
+        canonFixture.isSensor = true;
+        bodyDef.position.set(cannonPosition);
 
         cannonSprite.setOrigin(1, cannonSprite.getHeight()/2);
         cannon = world.createBody(bodyDef);
         cannon.setUserData(cannonSprite);
-
+        cannon.createFixture(canonFixture);
         shape.dispose();
         updateCannonPos();
         moveLeft();
@@ -151,6 +159,7 @@ public class Tank {
         Vector2 chassisPos = chassis.getPosition();
         chassisPos.add(0, 0.35f);
         cannon.setTransform(chassisPos, cannon.getAngle());
+        cannonPosition.set(cannon.getPosition());
     }
 
     public void rotateCannonRight(){
@@ -202,5 +211,7 @@ public class Tank {
     }
     public void setCannonTexture(Texture texture) {
         this.cannonTexture = texture;
+
     }
+
 }
diff --git a/frontend/core/src/com/game/tankwars/view/GameHud.java b/frontend/core/src/com/game/tankwars/view/GameHud.java
index 634dab2dc3094b246758616f5fb906251a9610d8..2d2974bc41d5292ec6b0a19540150bf9e92ecc81 100644
--- a/frontend/core/src/com/game/tankwars/view/GameHud.java
+++ b/frontend/core/src/com/game/tankwars/view/GameHud.java
@@ -1,6 +1,7 @@
 package com.game.tankwars.view;
 
 import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.g2d.Sprite;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.scenes.scene2d.ui.Button;
@@ -38,7 +39,11 @@ public class GameHud {
 
     private Button moveLeft;
     private Button moveRight;
+
+    private Button aimUp;
+    private Button aimDown;
     private HorizontalGroup moveContainer;
+    private HorizontalGroup aimContainer;
 
     public GameHud(Viewport viewport, SpriteBatch batch) {
         this.viewport = viewport;
@@ -86,7 +91,23 @@ public class GameHud {
         moveContainer.addActor(moveLeft);
         moveContainer.addActor(moveRight);
 
+
+        aimUp = new Button(skin.get("move-right", Button.ButtonStyle.class));
+        aimDown = new Button(skin.get("move-left", Button.ButtonStyle.class));
+        aimUp.setTransform(true);
+        aimDown.setTransform(true);
+        aimUp.setOrigin(aimUp.getWidth() / 2, aimUp.getHeight() / 2);
+        aimUp.setRotation(90);
+        aimDown.setOrigin(aimDown.getWidth() / 2, aimDown.getHeight() / 2);
+        aimDown.setRotation(90);
+
+        aimContainer = new HorizontalGroup().space(10);
+        moveContainer.addActor(aimUp);
+        moveContainer.addActor(aimDown);
+
+
         table.add(moveContainer).expand().bottom().right().padBottom(10).padRight(10);
+        table.add(aimContainer).expand().bottom().padBottom(10);
 
     }
 
@@ -118,6 +139,10 @@ public class GameHud {
         return moveRight;
     }
 
+    public Button getAimUp() { return aimUp; }
+
+    public Button getAimDown() { return aimDown; }
+
     /**
      * Set visible health of player
      * @param health new health of player
diff --git a/frontend/core/src/com/game/tankwars/view/GameScreen.java b/frontend/core/src/com/game/tankwars/view/GameScreen.java
index 5f52edb7565c25c0226c12e830463de393343db7..fa81a9ebb9f1154883e4a368c7131f0f709ade48 100644
--- a/frontend/core/src/com/game/tankwars/view/GameScreen.java
+++ b/frontend/core/src/com/game/tankwars/view/GameScreen.java
@@ -47,6 +47,8 @@ public class GameScreen implements Screen {
     Box2DDebugRenderer debugRenderer;
     GameController controller;
 
+    private Bullet bullet;
+
     public GameScreen(final TankWarsGame tankWarsGame){
         this.tankWarsGame = tankWarsGame;
 
@@ -109,9 +111,12 @@ public class GameScreen implements Screen {
 
         controller.checkKeyInput(myTank);
 
+        //controller.handleTouchInput(worldCam);
+
         Array<Body> bodies = new Array<Body>();
         world.getBodies(bodies);
 
+
         //Rendering Bullet bodies
         for (Body b : bodies) {
             Sprite s = (Sprite) b.getUserData();
@@ -137,12 +142,15 @@ public class GameScreen implements Screen {
                 }
             }
         }
-
         shapeRender.begin(ShapeRenderer.ShapeType.Filled);
         terrain.draw(shapeRender);
         shapeRender.end();
+        updateBullet();
 
         batch.begin();
+        if (bullet != (null)) {
+            bullet.getBulletSprite().draw(batch);
+        }
         myTank.getChassisSprite().draw(batch);
         myTank.getCannonSprite().draw(batch);
         opponentTank.getChassisSprite().draw(batch);
@@ -189,4 +197,11 @@ public class GameScreen implements Screen {
     private float scale(float value) {
         return value / TankWarsGame.SCALE;
     }
+
+    private void updateBullet() {
+        Bullet bullet = controller.getBullet();
+        if (bullet != (null)) {
+            this.bullet = bullet;
+        }
+    }
 }