diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
index d7a1a4e0a7c89455993e1c0f0f36703cd2f89a8e..64bb096b83695fc3cd83d4f6fb5784416fd54c56 100644
--- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
+++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
@@ -11,6 +11,7 @@ import de.tobias.playpad.server.plugin.Plugin
 import de.tobias.playpad.server.server.account._
 import de.tobias.playpad.server.server.plugin.{PluginGet, PluginList}
 import de.tobias.playpad.server.server.project._
+import de.tobias.playpad.server.server.project.sync.ProjectSyncHandler
 import de.tobias.playpad.server.settings.SettingsHandler
 import de.tobias.playpad.server.transformer.JsonTransformer
 import spark.Spark._
@@ -56,7 +57,7 @@ object PlayPadServer extends App {
 	secure("deploy/keystore.jks", settings.keystorePassword, null, null)
 
 	// PlayWall Cloud
-	webSocket("/project", new ProjectHandler(sessionDao, databaseConnection))
+	webSocket("/project", new ProjectSyncHandler(sessionDao, databaseConnection))
 
 	// Project
 	get("/projects", new ProjectGet(databaseConnection, sessionDao), new JsonTransformer)
diff --git a/src/main/scala/de/tobias/playpad/server/account/Account.scala b/src/main/scala/de/tobias/playpad/server/account/Account.scala
index 0172127788aa331366b0e52f3bbdd35e6fcbb134..f1cca086229c93c5aa80f51b8615a7dabd695917 100644
--- a/src/main/scala/de/tobias/playpad/server/account/Account.scala
+++ b/src/main/scala/de/tobias/playpad/server/account/Account.scala
@@ -22,7 +22,6 @@ import com.j256.ormlite.table.DatabaseTable
 
 	def getId: Int = id
 
-
 	def canEqual(other: Any): Boolean = other.isInstanceOf[Account]
 
 	override def equals(other: Any): Boolean = other match {
diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala
new file mode 100644
index 0000000000000000000000000000000000000000..2bb19596377fbbe721801212ea3c9e171c313e78
--- /dev/null
+++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala
@@ -0,0 +1,92 @@
+package de.tobias.playpad.server.server.project.sync
+
+import java.sql.Connection
+
+import com.google.gson.{JsonObject, JsonParser}
+import com.j256.ormlite.dao.Dao
+import de.tobias.playpad.server.account
+import de.tobias.playpad.server.account.Account
+import de.tobias.playpad.server.server.project.sync.listener.project.ProjectAddListener
+import org.eclipse.jetty.websocket.api.Session
+import org.eclipse.jetty.websocket.api.annotations.{OnWebSocketClose, OnWebSocketConnect, OnWebSocketMessage, WebSocket}
+
+import scala.collection.{Map, mutable}
+
+/**
+  * Created by tobias on 19.02.17.
+  */
+@WebSocket class ProjectSyncHandler(sessionDao: Dao[account.Session, Int], connection: Connection) {
+
+	// TODO mutable.HashSet --> Set
+	private var sessions: Map[Account, mutable.HashSet[Session]] = new mutable.HashMap[Account, mutable.HashSet[Session]]()
+
+	private val listeners = Map(
+		"pro-add" -> new ProjectAddListener()
+	)
+
+	@OnWebSocketConnect def onConnect(serverSession: Session): Unit = {
+		val key = serverSession.getUpgradeRequest.getHeader("key")
+		if (key == null) {
+			serverSession.close(500, "Invalid Key")
+		}
+
+		val sessions = sessionDao.queryForEq("key", key)
+		if (sessions.size() == 1) {
+			val session = sessions.get(0)
+			if (!this.sessions.contains(session.getAccount)) {
+				this.sessions += (session.getAccount -> new mutable.HashSet[Session]())
+			}
+			this.sessions(session.getAccount) += serverSession
+		} else {
+			serverSession.close(500, "Invalid Key")
+		}
+	}
+
+	@OnWebSocketClose def onClose(serverSession: Session, status: Int, reason: String): Unit = {
+		val key = serverSession.getUpgradeRequest.getHeader("key")
+		if (key == null) {
+			serverSession.close(500, "Invalid Key")
+		}
+
+		val sessions = sessionDao.queryForEq("key", key)
+		if (sessions.size() == 1) {
+			val session = sessions.get(0)
+			this.sessions(session.getAccount) -= serverSession
+		}
+	}
+
+	@OnWebSocketMessage def onMessage(serverSession: Session, text: String): Unit = {
+		println(text)
+		// Store in Database
+		try {
+			// Push to clients
+			val key = serverSession.getUpgradeRequest.getHeader("key")
+			if (key != null) {
+
+				val parser = new JsonParser()
+				val json = parser.parse(text)
+				json match {
+					case json: JsonObject =>
+						val session = account.Session.getSession(key, sessionDao)
+						session match {
+							case Some(s) => listeners(json.get("cmd").getAsString).onChange(json, connection, s)
+							case None => serverSession.close(500, "Invalid Session")
+						}
+					case _ => serverSession.close(500, "Invalid Data")
+				}
+			} else {
+				serverSession.close(500, "Invalid Key")
+			}
+
+			val sessions = sessionDao.queryForEq("key", key)
+			if (sessions.size() == 1) {
+				val session = sessions.get(0)
+				this.sessions(session.getAccount)
+					.filter(s => s != serverSession)
+					.foreach(s => s.getRemote.sendStringByFuture(text))
+			}
+		} catch {
+			case e: Exception => e.printStackTrace()
+		}
+	}
+}
diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala
new file mode 100644
index 0000000000000000000000000000000000000000..217ddf9c57140bc603432a4f400d10b04d64721f
--- /dev/null
+++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala
@@ -0,0 +1,14 @@
+package de.tobias.playpad.server.server.project.sync.listener
+
+import java.sql.Connection
+
+import com.google.gson.JsonObject
+import de.tobias.playpad.server.account.Session
+
+/**
+  * Created by tobias on 18.02.17.
+  */
+trait Listener {
+
+	def onChange(json: JsonObject, connection: Connection, session: Session): Unit
+}
diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala
new file mode 100644
index 0000000000000000000000000000000000000000..c83326d61b9b56368fcef9e67247c42b85408f3b
--- /dev/null
+++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala
@@ -0,0 +1,23 @@
+package de.tobias.playpad.server.server.project.sync.listener.project
+
+import java.sql.Connection
+import java.util.UUID
+
+import com.google.gson.JsonObject
+import de.tobias.playpad.server.account.Session
+import de.tobias.playpad.server.project.utils.SqlDef
+import de.tobias.playpad.server.server.SqlHelper
+import de.tobias.playpad.server.server.project.sync.listener.Listener
+
+/**
+  * Created by tobias on 19.02.17.
+  */
+class ProjectAddListener extends Listener {
+	override def onChange(json: JsonObject, connection: Connection, session: Session): Unit = {
+		val projectId = UUID.fromString(json.get("id").getAsString)
+		val projectName = json.get("name").getAsString
+
+		SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectId, SqlDef.PROJECT_NAME, projectName)
+		SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectId, SqlDef.PROJECT_ACCOUNT_ID, session.getAccount.id)
+	}
+}