diff --git a/src/draw/draw.service.ts b/src/draw/draw.service.ts
index 97556e6e7282919465f76026163bf1649bf8f3d1..ffa48d4b634a35c6b0dc4bb26391d269c9f9b76a 100644
--- a/src/draw/draw.service.ts
+++ b/src/draw/draw.service.ts
@@ -18,7 +18,8 @@ export class DrawService {
 
     if (data.mapDrawingId == null || data.mapDrawingId == '') {
       // luo uuden instanssin.
-      return this.mapDrawingRepository.insert(drawing)[0];
+      const mapDrawing = await this.mapDrawingRepository.insert(drawing);
+      return mapDrawing.identifiers;
     } else {
       //päivittää mapDrawingin
       return await this.mapDrawingRepository.save(drawing);
diff --git a/src/tracking/tracking.controller.ts b/src/tracking/tracking.controller.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fdd8fb8609fa152cfd57b90d38e04f6183132a74
--- /dev/null
+++ b/src/tracking/tracking.controller.ts
@@ -0,0 +1,33 @@
+import {
+  Controller,
+  Post,
+  Param,
+  UseGuards,
+  UsePipes,
+  Body,
+} from '@nestjs/common';
+
+import { TrackingService } from './tracking.service';
+import { TrackingDTO } from './tracking.dto';
+import { User } from '../user/user.decorator';
+import { Roles, GameStates } from '../shared/guard.decorator';
+import { ValidationPipe } from '../shared/validation.pipe';
+
+@Controller('tracking')
+export class TrackingController {
+  constructor(private trackingservice: TrackingService) {}
+
+  // inserts tracking data to the database
+  // :id is the id of the game
+  @Post('location/:id')
+  @Roles('soldier')
+  @GameStates('started')
+  @UsePipes(new ValidationPipe())
+  async trackLocation(
+    @User('id') userId,
+    @Param('id') id,
+    @Body() trackdata: TrackingDTO,
+  ) {
+    return this.trackingservice.trackLocation(userId, id, trackdata);
+  }
+}
diff --git a/src/tracking/tracking.dto.ts b/src/tracking/tracking.dto.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8dc949c954931fb730a455ba2096f89fe9bb5fec
--- /dev/null
+++ b/src/tracking/tracking.dto.ts
@@ -0,0 +1,8 @@
+import { Game_PersonEntity } from '../game/game.entity';
+import { Allow } from 'class-validator';
+
+export class TrackingDTO {
+  @Allow()
+  data: JSON;
+  gamepersonId: Game_PersonEntity;
+}
diff --git a/src/tracking/tracking.entity.ts b/src/tracking/tracking.entity.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b31239101176a0316031cf6c1449205a26bcd150
--- /dev/null
+++ b/src/tracking/tracking.entity.ts
@@ -0,0 +1,10 @@
+import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
+import { Game_PersonEntity } from '../game/game.entity';
+
+@Entity('Tracking')
+export class TrackingEntity {
+  @PrimaryGeneratedColumn('uuid') id: string;
+  @Column({ type: 'json', nullable: true }) data: JSON;
+  @ManyToOne(type => Game_PersonEntity, person => person.gamepersonId)
+  gamepersonId: Game_PersonEntity;
+}
diff --git a/src/tracking/tracking.module.ts b/src/tracking/tracking.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..45b167fc526ab41addbb87575518c9acae884482
--- /dev/null
+++ b/src/tracking/tracking.module.ts
@@ -0,0 +1,14 @@
+import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+
+import { TrackingController } from './tracking.controller';
+import { TrackingService } from './tracking.service';
+import { TrackingEntity } from './tracking.entity';
+import { Game_PersonEntity } from '../game/game.entity';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([TrackingEntity, Game_PersonEntity])],
+  controllers: [TrackingController],
+  providers: [TrackingService],
+})
+export class TrackingModule {}
diff --git a/src/tracking/tracking.service.ts b/src/tracking/tracking.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6dc01c1d9c6dbfcf7336750602d2c90c5092f81b
--- /dev/null
+++ b/src/tracking/tracking.service.ts
@@ -0,0 +1,63 @@
+import { Injectable, HttpStatus, HttpException } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+
+import { Game_PersonEntity } from '../game/game.entity';
+import { TrackingEntity } from './tracking.entity';
+import { TrackingDTO } from './tracking.dto';
+
+@Injectable()
+export class TrackingService {
+  constructor(
+    @InjectRepository(TrackingEntity)
+    private trackingrepository: Repository<TrackingEntity>,
+    @InjectRepository(Game_PersonEntity)
+    private gamepersonrepository: Repository<Game_PersonEntity>,
+  ) {}
+
+  async trackLocation(personId, gameId, trackdata: TrackingDTO) {
+    // find player
+    let gameperson = await this.gamepersonrepository.findOne({
+      game: gameId,
+      person: personId,
+    });
+    if (!gameperson) {
+      throw new HttpException(
+        'You have not joined this game',
+        HttpStatus.BAD_REQUEST,
+      );
+    }
+    let trackedperson = await this.trackingrepository.findOne({
+      gamepersonId: gameperson,
+    });
+
+    // if player has pushed tracking data, update entry
+    if (trackedperson) {
+      //add coordinates
+      trackedperson.data['geometry']['coordinates'].push(
+        await this.mapFunction(trackdata.data['geometry']['coordinates']),
+      );
+      //add timestamp
+      trackedperson.data['geometry']['properties']['time'].push(
+        new Date(Date.now()),
+      );
+
+      return await this.trackingrepository.save(trackedperson);
+    } else {
+      // first entry will be empty
+      // initialize coordinates
+      trackdata.data['geometry']['coordinates'] = [];
+      // initialize timestamp
+      trackdata.data['geometry']['properties']['time'] = [];
+      trackedperson = await this.trackingrepository.create(trackdata);
+      trackedperson.gamepersonId = gameperson;
+      return await this.trackingrepository.save(trackedperson);
+    }
+  }
+
+  private async mapFunction(data): Promise<Number> {
+    return await data.map(type => {
+      return type;
+    });
+  }
+}