diff --git a/metaserver/cmd.cpp b/metaserver/cmd.cpp
index 9126b1b54..dd011f0eb 100644
--- a/metaserver/cmd.cpp
+++ b/metaserver/cmd.cpp
@@ -329,7 +329,7 @@ static void ParseCreateGame(Session *session, char *buf)
 	CreateGame(session, description, map, players, ip, port, password);
 
 	DebugPrint("%s created a game\n" _C_ session->UserData.Name);
-	DBAddGame(description, map, players_int);
+	DBAddGame(session->Game->ID, description, map, players_int);
 	Send(session, "CREATEGAME_OK\n");
 }
 
@@ -476,6 +476,30 @@ static void ParseEndGame(Session *session, char *buf)
 	Send(session, "ENDGAME_OK\n");
 }
 
+
+/**
+**  Parse STATS
+*/
+static void ParseStats(Session *session, char *buf)
+{
+	char *result;
+	int start_time = 0;
+	char resultbuf[20] = {'\0'};
+
+	while (*buf == ' ') ++buf;
+	if (*buf) {
+		Parse1Arg(buf, &result);
+		start_time = atoi(result);
+	}
+
+	DebugPrint("%s requested stats\n" _C_ session->UserData.Name);
+	char* reply = (char*)calloc(sizeof(char), strlen("GAMES SINCE 12345678901234567890: 12345678901234567890\n") + 1);
+	DBStats(resultbuf, start_time);
+	sprintf(reply, "GAMES SINCE %d: %s\n", start_time, resultbuf);
+	Send(session, reply);
+	Send(session, "STATS_OK\n");
+}
+
 /**
 **  Parse MSG
 */
@@ -525,6 +549,8 @@ static void ParseBuffer(Session *session)
 			ParsePartGame(session, buf + 8);
 		} else if (!strncmp(buf, "ENDGAME ", 8)) {
 			ParseEndGame(session, buf + 8);
+		} else if (!strncmp(buf, "STATS ", 6)) {
+			ParseStats(session, buf + 6);
 		} else if (!strncmp(buf, "MSG ", 4)) {
 			ParseMsg(session, buf + 4);
 		} else {
diff --git a/metaserver/db.cpp b/metaserver/db.cpp
index 390fda93a..f34845a06 100644
--- a/metaserver/db.cpp
+++ b/metaserver/db.cpp
@@ -62,7 +62,7 @@ static sqlite3 *DB;
 	"id INTEGER PRIMARY KEY," \
 	"date INTEGER," \
 	"gamename TEXT," \
-	"mapname TEXT" \
+	"mapname TEXT,"	 \
 	"slots INTEGER" \
 	");"
 
@@ -261,15 +261,15 @@ int DBUpdateLoginDate(char *username)
 	return 0;
 }
 
-int DBAddGame(char *description, char *mapname, int numplayers)
+int DBAddGame(int id, char *description, char *mapname, int numplayers)
 {
 	char buf[1024];
 	int t;
 	char *errmsg;
 
 	t = (int)time(0);
-	sprintf(buf, "INSERT INTO games VALUES(%d, '%s', '%s', %d);",
-			t, description, mapname, numplayers);
+	sprintf(buf, "INSERT INTO games VALUES(%d, %d, '%s', '%s', %d);",
+			id, t, description, mapname, numplayers);
 	if (sqlite3_exec(DB, buf, NULL, NULL, &errmsg) != SQLITE_OK) {
 		fprintf(stderr, "SQL error: %s\n", errmsg);
 		sqlite3_free(errmsg);
@@ -277,3 +277,27 @@ int DBAddGame(char *description, char *mapname, int numplayers)
 	}
 	return 0;
 }
+
+static int DBStatsCallback(void *resultbuf, int argc, char **argv, char **colname)
+{
+	Assert(argc == 1);
+	strcpy((char *)resultbuf, argv[0]);
+	return 0;
+}
+
+
+int DBStats(char* resultbuf, int start_time)
+{
+	char buf[1024];
+	int t;
+	char *errmsg;
+
+	t = (int)time(0);
+	sprintf(buf, "SELECT COUNT(id) FROM games WHERE date > %d;", start_time);
+	if (sqlite3_exec(DB, buf, DBStatsCallback, resultbuf, &errmsg) != SQLITE_OK) {
+		fprintf(stderr, "SQL error: %s\n", errmsg);
+		sqlite3_free(errmsg);
+		return -1;
+	}
+	return 0;
+}
diff --git a/metaserver/db.h b/metaserver/db.h
index d06dde504..3a244fb71 100644
--- a/metaserver/db.h
+++ b/metaserver/db.h
@@ -41,7 +41,8 @@ extern void DBQuit(void);
 extern int DBFindUser(char *username, char *password);
 extern int DBAddUser(char *username, char *password);
 extern int DBUpdateLoginDate(char *username);
-extern int DBAddGame(char *description, char *mapname, int numplayers);
+extern int DBAddGame(int id, char *description, char *mapname, int numplayers);
+extern int DBStats(char *results, int resultlen);
 
 //@}