diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index c01ccad5710d1ecaec25bec91788d6568ff630c7..3458d7ee8ac5ad75805bcccac9ab09e9a5d85844 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -436,18 +436,20 @@ ServerConnector.columnsToString = function(columns) {
   return columns;
 };
 
-ServerConnector.getReactionsUrl = function(reactionIds, projectId, token, columns) {
-  var id = this.idsToString(reactionIds);
-  columns = this.columnsToString(columns);
+ServerConnector.getReactionsUrl = function(params) {
+  var id = this.idsToString(params.ids);
+  var columns = this.columnsToString(params.columns);
+  var participantId = this.idsToString(params.participantId);
 
   return this.getApiUrl({
     type : "project",
     method : "getReactions",
     params : {
-      projectId : projectId,
-      token : token,
+      projectId : params.projectId,
+      token : params.token,
       columns : columns,
       id : id,
+      participantId : participantId,
     },
   });
 };
@@ -930,13 +932,14 @@ ServerConnector.getOverlayById = function(layoutId, projectId) {
   });
 };
 
-ServerConnector.getReactions = function(reactionIds, projectId, columns) {
+ServerConnector.getReactions = function(params) {
   var self = this;
-  return self.getProjectId(projectId).then(function(result) {
-    projectId = result;
+  return self.getProjectId(params.projectId).then(function(result) {
+    params.projectId = result;
     return self.getToken();
   }).then(function(token) {
-    return self.readFile(self.getReactionsUrl(reactionIds, projectId, token, columns));
+    params.token = token;
+    return self.readFile(self.getReactionsUrl(params));
   }).then(function(content) {
     var array = JSON.parse(content);
     var result = [];
diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js
index f129a987b668116a03ed6cee7cd9729bfa74d46e..ae53829cbe057e16b6f3de3e1a4fc4febeda79dc 100644
--- a/frontend-js/src/main/js/map/data/MapModel.js
+++ b/frontend-js/src/main/js/map/data/MapModel.js
@@ -26,6 +26,7 @@ function MapModel(configuration) {
 
   // list of reactions is empty (it will be filled dynamically - when necessary)
   this._reactions = [];
+  this._reactionsByParticipantElementId = [];
 
   // list of aliases that should be updated from server side during the next
   // connection
@@ -193,7 +194,9 @@ MapModel.prototype.getCompleteReactionById = function(id) {
     return Promise.resolve(self._reactions[id]);
   } else {
     var result;
-    return ServerConnector.getReactions([ id ]).then(
+    return ServerConnector.getReactions({
+      ids : [ id ]
+    }).then(
         function(reactions) {
           if (self._reactions[id] === undefined) {
             self._reactions[id] = reactions[0];
@@ -300,7 +303,9 @@ MapModel.prototype.getMissingElements = function(elements) {
   }
   var reactionPromise = null;
   if (reactionIds.length > 0) {
-    reactionPromise = ServerConnector.getReactions(reactionIds);
+    reactionPromise = ServerConnector.getReactions({
+      ids : reactionIds
+    });
   }
 
   var aliasPromise = null;
@@ -694,4 +699,36 @@ MapModel.prototype.isAvailable = function(ie, complete) {
   }
 };
 
+MapModel.prototype.getReactionsForElement = function(element, complete) {
+  var self = this;
+  if (this._reactionsByParticipantElementId[element.getId()]) {
+    var reactions = self._reactionsByParticipantElementId[element.getId()]
+    if (!complete) {
+      return Promise.resolve(reactions);
+    } else {
+      var promises = [];
+      for (var i = 0; i < reactions.length; i++) {
+        promises.push(self.getCompleteReactionById(reactions[i].getId()));
+      }
+      return Promise.all(promises);
+    }
+  }
+  return ServerConnector.getReactions({
+    participantId : [ element.getId() ],
+  }).then(function(reactions) {
+    var promises = []
+    for (var i = 0; i < reactions.length; i++) {
+      var reaction = reactions[i];
+      var id = reaction.getId();
+      if (self._reactions[id] === undefined) {
+        self._reactions[id] = reaction;
+      } else {
+        self._reactions[id].update(reaction);
+      }
+      promises.push(self.getReactionById(id, complete));
+    }
+    return Promise.all(promises);
+  })
+};
+
 module.exports = MapModel;
diff --git a/frontend-js/src/test/js/map/data/MapModel-test.js b/frontend-js/src/test/js/map/data/MapModel-test.js
index 66930c9a4026ac625558afe025ac1ab329f6df6f..736b64b52437fe92fcbd8cd11c7bcca8c1e194ce 100644
--- a/frontend-js/src/test/js/map/data/MapModel-test.js
+++ b/frontend-js/src/test/js/map/data/MapModel-test.js
@@ -2,6 +2,7 @@
 
 var Helper = require('../../Helper');
 
+var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement');
 var LayoutData = require('../../../../main/js/map/data/LayoutData');
 var MapModel = require('../../../../main/js/map/data/MapModel');
 var assert = require('chai').assert;
@@ -30,8 +31,8 @@ describe('MapModel', function() {
     var layout = helper.createLayout();
 
     model.getLayoutDataById(layout.getId()).then(function() {
-      throw new Error('expected rejection');
-    }).catch(function(exception){
+      assert.ok(false, 'expected rejection');
+    }, function(exception) {
       assert.ok(exception);
 
       model.addLayout(layout);
@@ -41,7 +42,7 @@ describe('MapModel', function() {
         assert.ok(layoutData instanceof LayoutData);
         done();
       });
-    }) ;
+    });
   });
 
   it("init invalid layout data", function() {
@@ -58,24 +59,24 @@ describe('MapModel', function() {
     var model = helper.createModel();
 
     var aliasObj = {
-        idObject : 32,
-        modelId : model.id,
+      idObject : 32,
+      modelId : model.id,
     };
 
     model.addAlias(aliasObj);
 
-    model.getAliasById(32).then(function (alias){
+    model.getAliasById(32).then(function(alias) {
 
       assert.equal(alias.getName(), undefined);
 
       var aliasObj2 = {
-          idObject : 32,
-          modelId : model.id,
-          name : "testName",
+        idObject : 32,
+        modelId : model.id,
+        name : "testName",
       };
 
       model.addAlias(aliasObj2);
-      model.getAliasById(32).then(function(alias){
+      model.getAliasById(32).then(function(alias) {
         assert.equal(alias.getName(), "testName");
         done();
       });
@@ -111,37 +112,36 @@ describe('MapModel', function() {
 
     var alias = helper.createAlias();
 
-    return model.getAliasById(alias.getId()).then(function(result){
+    return model.getAliasById(alias.getId()).then(function(result) {
       assert.equal(null, result);
-    }).catch(function(exception) {
+    }, function(exception) {
       assert.ok(exception.message.indexOf("no such file"));
       // check if this is exception about not finding file
       model.addAlias(alias);
       return model.getAliasById(alias.getId());
-    }).then(function(result){
+    }).then(function(result) {
       assert.deepEqual(alias, result);
     });
   });
 
-
   it("getReactionById 1", function() {
     var model = helper.createModel();
 
     var reaction = helper.createReaction();
 
-    return model.getReactionById(reaction.getId()).then(function(result){
+    return model.getReactionById(reaction.getId()).then(function(result) {
       assert.equal(null, result);
-    }).catch(function(exception) {
+    }, function(exception) {
       assert.ok(exception.path);
       // check if this is exception about not finding file
       model.addReaction(reaction);
       return model.getReactionById(reaction.getId());
-    }).then(function(result){
+    }).then(function(result) {
       assert.equal(reaction, result);
     });
   });
 
-  it("getReactionById 2", function() {
+  it("addReaction 2", function() {
     var model = helper.createModel();
 
     var reaction = helper.createReaction();
@@ -153,9 +153,29 @@ describe('MapModel', function() {
 
   it("getMissingElements when everything is up to date", function() {
     var model = helper.createModel();
-    
-    return model.getMissingElements({}).then(function(result){
-      assert.equal(result.length,0);
+
+    return model.getMissingElements({}).then(function(result) {
+      assert.equal(result.length, 0);
+    });
+  });
+
+  it("getReactionByParticipantId", function() {
+    var model;
+    return ServerConnector.getProject().then(function(project) {
+
+      model = project.getModel();
+      var ie = new IdentifiedElement({
+        modelId : 15781,
+        type : "ALIAS",
+        id : 329167
+      });
+
+      return model.getByIdentifiedElement(ie);
+    }).then(function(element) {
+
+      return model.getReactionsForElement(element);
+    }).then(function(reactions) {
+      assert.equal(reactions.length, 5);
     });
   });
 
diff --git a/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..502896f668b31af12360dadaa61ac4ed7e77dc01
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/project/getElements/columns=id,bounds,modelId&id=329167&projectId=sample&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"modelId":15781,"bounds":{"x":101.0,"y":129.5,"width":90.0,"height":25.0},"id":329167}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..c83882f5a9cf78e97016eacefb773c7aea70e7dc
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=&participantId=329167&projectId=sample&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"modelId":15781,"reactants":"329167","reactionId":"re3","id":153504,"type":"State transition","lines":[{"start":{"x":155.9662162162162,"y":129.5},"end":{"x":169.67962640764847,"y":112.300129590407},"type":"START"},{"start":{"x":174.6668714987086,"y":106.04494083212823},"end":{"x":188.38028169014086,"y":88.84507042253522},"type":"END"}],"modifiers":"","centerPoint":{"x":172.17324895317853,"y":109.17253521126761},"products":"329179","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329173","reactionId":"re5","id":153510,"type":"State transition","lines":[{"start":{"x":92.0,"y":36.98039215686274},"end":{"x":124.64269540833152,"y":45.94113207287532},"type":"START"},{"start":{"x":132.35730459166848,"y":48.05886792712468},"end":{"x":165.0,"y":57.01960784313726},"type":"END"},{"start":{"x":144.03021943732247,"y":129.5},"end":{"x":131.99804583067973,"y":53.145215648491444},"type":"MIDDLE"}],"modifiers":"329167","centerPoint":{"x":128.5,"y":47.0},"products":"329179","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329167","reactionId":"re10","id":153499,"type":"State transition","lines":[{"start":{"x":180.0362865221489,"y":142.31809613572102},"end":{"x":192.68309645382215,"y":142.43629062106376},"type":"START"},{"start":{"x":200.68274710121602,"y":142.5110537112263},"end":{"x":213.32955703288923,"y":142.62924819656908},"type":"END"}],"modifiers":"","centerPoint":{"x":196.68292177751908,"y":142.47367216614504},"products":"329172","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329169","reactionId":"re8","id":153518,"type":"State transition","lines":[{"start":{"x":141.01308884552796,"y":203.5052375718217},"end":{"x":142.676524190943,"y":182.98953497836953},"type":"START"},{"start":{"x":143.32305114107143,"y":175.01570259345215},"end":{"x":144.98648648648648,"y":154.5},"type":"END"}],"modifiers":"","centerPoint":{"x":142.99978766600722,"y":179.00261878591084},"products":"329167","hierarchyVisibilityLevel":0},{"modelId":15781,"reactants":"329168","reactionId":"re4","id":153512,"type":"State transition","lines":[{"start":{"x":75.73715058611361,"y":134.3476104598738},"end":{"x":88.18325303297577,"y":135.7031265679479},"type":"START"},{"start":{"x":96.13622466620043,"y":136.56929179532878},"end":{"x":108.58232711306259,"y":137.92480790340286},"type":"END"}],"modifiers":"","centerPoint":{"x":92.15973884958811,"y":136.13620918163832},"products":"329167","hierarchyVisibilityLevel":0}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153508&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153510&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153511&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153515&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153519&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&participantId=&projectId=sample&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&projectId=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/project/getReactions/columns=&id=153521&participantId=&projectId=sample&token=MOCK_TOKEN_ID&