diff --git a/.dockerignore b/.dockerignore
index 17a8f5409f6076009cd717b8a76672feab1c9519..0727a20a84abbcc1eaa66a9feb70bd2b55944389 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -5,4 +5,5 @@ node_modules/
 .circleci/
 helm/
 google-storage.json
-*.tgz
\ No newline at end of file
+*.tgz
+.dck
\ No newline at end of file
diff --git a/Makefile b/Makefile
index a6d22faa68cb882cb4517025a346e1ae824cde78..89609969c797e0b54289adf198f2d952d04762d2 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ ORG=jetsam
 APPNAME=api
 TAG=latest
 REMOTE_TAG=$(TAG)
-REMOTE=lcr.gr
+REMOTE=registry.digitalocean.com
 
 export
 
diff --git a/package.json b/package.json
index 42ec44a4f9089026db161ec63c4d995efce00160..59878e97d640c0fcbfb6dcc52083841f5c1d51b5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jetsam-api",
-  "version": "2.0.0-beta.2",
+  "version": "2.2.0",
   "description": "The Jetsam App API Server",
   "main": "server.js",
   "scripts": {
diff --git a/src/domain/data/MetricsService.js b/src/domain/data/MetricsService.js
index 832087609270e732c08eeaf41141dc82bc82abc8..8aa9027bb87d283988597cd0ff8e435394821635 100644
--- a/src/domain/data/MetricsService.js
+++ b/src/domain/data/MetricsService.js
@@ -3,6 +3,7 @@ const crypto = require('core/utils/crypto')
 const { User, AccessToken, Metric, Sequelize } = require('database/models')
 const { unset } = require('bootstrap')
 const HttpError = require('core/errors/HttpError')
+const moment = require("moment");
 
 const { Op } = Sequelize
 
@@ -17,6 +18,22 @@ module.exports = class MetricsService extends ContextualModule {
 
 	async recordMetric(value, type, location, meta = {}, transaction) {
 		const user = await this.ctx.services['core.auth'].getUser()
+		const surveys = await user.getSurveys({
+			where: {
+				expires_at: {
+					[Sequelize.Op.gt]: moment.utc().toISOString()
+				},
+				published_at: {
+					[Sequelize.Op.lt]: moment.utc().toISOString()
+				},
+				public: true,
+			},
+		})
+
+		if (surveys.length > 0) {
+			meta.surveys = surveys.map(s => s.id)
+		}
+
 		const point = {
 			type: 'Point',
 			coordinates: [location.longitude, location.latitude],
diff --git a/src/http/controllers/api/v2/surveys.js b/src/http/controllers/api/v2/surveys.js
index 9752c7dc00de19d884e2d586488decbbb23fe394..8a4251a025d3892e1f18b7cebcd222691e839b76 100644
--- a/src/http/controllers/api/v2/surveys.js
+++ b/src/http/controllers/api/v2/surveys.js
@@ -2,11 +2,11 @@ const moment = require('moment')
 const UnauthorizedError = require("../../../../core/errors/UnauthorizedError");
 const NotFoundError = require("../../../../core/errors/NotFoundError");
 const HttpError = require("../../../../core/errors/HttpError");
-const { Survey, SurveyUser, User, sequelize } = require('database/models')
-const { QueryTypes } = require('sequelize')
+const {Survey, SurveyUser, User, sequelize} = require('database/models')
+const {QueryTypes} = require('sequelize')
 
 exports.list = async ctx => {
-	const { Sequelize, Survey } = require('database/models')
+	const {Sequelize, Survey} = require('database/models')
 	const user = await ctx.services['core.auth'].getUser()
 
 	let includes = user ? [{
@@ -26,15 +26,18 @@ exports.list = async ctx => {
 				[Sequelize.Op.lt]: moment.utc().toISOString()
 			},
 			public: true,
-		}
-	}, {
+		},
 		include: includes
+	}, {
 	})
 
-	console.log(surveys)
-
 	ctx.body = {
-		surveys: surveys.map(s => s.asOwnSurvey()),
+		surveys: surveys.map(s => {
+			if (Array.isArray(s.SurveyUsers) && s.SurveyUsers[0] != null) {
+				s.SurveyUser = s.SurveyUsers[0]
+			}
+			return s.asOwnSurvey();
+		}),
 	}
 }
 
@@ -47,7 +50,7 @@ exports.joined = async ctx => {
 		return
 	}
 
-	const surveys = await user.getSurveys({ include: [SurveyUser] })
+	const surveys = await user.getSurveys({include: [SurveyUser]})
 
 	ctx.body = {
 		surveys: surveys.map(s => s.asOwnSurvey())
@@ -64,19 +67,19 @@ exports.join = async ctx => {
 		throw new UnauthorizedError()
 	}
 
-	const { survey } = ctx.models
-	const { properties = {} } = ctx.request.body
+	const {survey} = ctx.models
+	const {properties = {}} = ctx.request.body
 
 	console.log(survey.properties, properties)
 
 	if (Object.values(survey.properties).length !== Object.values(properties).length) {
-		throw new HttpError(400, 'Must provide values for all properties')
+		throw new HttpError(400, `Must provide values for all properties. Expecting: [${Object.keys(survey.properties).join(', ')}]; Found [${Object.keys(properties).join(', ')}] `)
 	}
 
 	const surveyUserProperties = {}
 	Object.entries(survey.properties).forEach(([key, type]) => {
 		if (properties[key] == null) {
-			throw new HttpError(400, `Must provide value for property ${ key }`)
+			throw new HttpError(400, `Must provide value for property ${key}`)
 		}
 		surveyUserProperties[key] = properties[key]
 	})
@@ -101,10 +104,10 @@ exports.join = async ctx => {
 	}
 
 	const [rows, count] = await sequelize.query(`
-		INSERT INTO "survey_users" ("user_id","properties","survey_id") 
-		VALUES (:user_id,:properties,:survey_id) RETURNING "user_id","survey_id","properties","created_at";
+		INSERT INTO "survey_users" ("user_id", "properties", "survey_id")
+		VALUES (:user_id, :properties, :survey_id) RETURNING "user_id","survey_id","properties","created_at";
 	`, {
-		replacements: { survey_id: survey.id, user_id: user.id, properties: JSON.stringify(properties) },
+		replacements: {survey_id: survey.id, user_id: user.id, properties: JSON.stringify(properties)},
 		type: QueryTypes.INSERT,
 	})
 
@@ -130,4 +133,20 @@ exports.leave = async ctx => {
 		throw new UnauthorizedError()
 	}
 
+	const result = await sequelize.query(`DELETE
+										  FROM "survey_users"
+										  WHERE user_id = :user_id
+											AND survey_id = :survey_id`, {
+		replacements: {
+			survey_id: ctx.models.survey.id,
+			user_id: user.id,
+		},
+		type: QueryTypes.DELETE
+	})
+
+	console.log(result)
+
+	ctx.body = {
+		success: true
+	}
 }
\ No newline at end of file