diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/QueryException.java b/rest-api/src/main/java/lcsb/mapviewer/api/QueryException.java
index f3e367c483446ecf25012692b2212161757c5187..11abd5a073ceb56b9b39967cd6b0d26418a83ec6 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/QueryException.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/QueryException.java
@@ -23,6 +23,10 @@ public class QueryException extends Exception {
 		super(message);
 	}
 
+  public QueryException(Exception e) {
+    super(e);
+  }
+
 	/**
 	 * Constructor with error message and parent exception.
 	 * 
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
index faf0b5f30b12f14283d6635609d0b754034b017e..00b9af74a6fb89cb5a3d3ffcc4e9ebbf9dcd3533 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
@@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 
 import lcsb.mapviewer.api.BaseController;
+import lcsb.mapviewer.api.QueryException;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.interfaces.IConfigurationService;
@@ -76,7 +77,7 @@ public class ConfigurationController extends BaseController {
       @RequestBody String body, //
       @CookieValue(value = Configuration.AUTH_TOKEN) String token, //
       @PathVariable(value = "option") String option //
-  ) throws SecurityException, JsonParseException, JsonMappingException, IOException {
+  ) throws SecurityException, JsonParseException, JsonMappingException, IOException, QueryException {
     Map<String, Object> node = parseBody(body);
     Map<String, Object> data = getData(node, "option");
     return configurationController.updateOption(token, option, data);
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
index f39bc6d4b641af4c12878e6cee1163f0b04a3640..e186c711507b8e7c448a6b13230cf5dca66a8390 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
@@ -18,7 +18,9 @@ import org.springframework.transaction.annotation.Transactional;
 import lcsb.mapviewer.annotation.services.ModelAnnotator;
 import lcsb.mapviewer.annotation.services.annotators.ElementAnnotator;
 import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.api.QueryException;
 import lcsb.mapviewer.common.Pair;
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.converter.IConverter;
 import lcsb.mapviewer.converter.graphics.AbstractImageGenerator;
 import lcsb.mapviewer.converter.graphics.ImageGenerators;
@@ -273,13 +275,17 @@ public class ConfigurationRestImpl extends BaseRestImpl {
   }
 
   public Map<String, Object> updateOption(String token, String option, Map<String, Object> data)
-      throws SecurityException {
+      throws SecurityException, QueryException {
     if (!getUserService().userHasPrivilege(token, PrivilegeType.CONFIGURATION_MANAGE)) {
       throw new SecurityException("Acces denied");
     }
     ConfigurationElementType type = ConfigurationElementType.valueOf(option);
     String value = (String) data.get("value");
-    configurationService.setConfigurationValue(type, value);
+    try {
+      configurationService.setConfigurationValue(type, value);
+    } catch (InvalidArgumentException e) {
+      throw new QueryException(e);
+    }
     return optionToMap(configurationService.getValue(type));
   }
 
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationRestImplTest.java
index d0387acc10aa11cc4647fc3776a16845823fa231..3bd8484bc5eda1760760ec39339bb661ad2f5b81 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationRestImplTest.java
@@ -2,7 +2,9 @@ package lcsb.mapviewer.api.configuration;
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -14,10 +16,12 @@ import org.junit.Before;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import lcsb.mapviewer.api.QueryException;
 import lcsb.mapviewer.api.RestTestFunctions;
 import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction;
 import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.user.ConfigurationElementType;
 
 public class ConfigurationRestImplTest extends RestTestFunctions {
 
@@ -50,6 +54,34 @@ public class ConfigurationRestImplTest extends RestTestFunctions {
     }
   }
 
+  @Test
+  public void testSetSmtpPortToInvalid() throws Exception {
+    try {
+      Map<String, Object> data = new HashMap<>();
+      data.put("value", "not a number");
+      configurationRestImpl.updateOption(adminToken, ConfigurationElementType.EMAIL_SMTP_PORT.name(), data);
+      fail("Exception expected");
+    } catch (QueryException e) {
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  @Test
+  public void testSetSmtpPortToValid() throws Exception {
+    try {
+      Map<String, Object> data = new HashMap<>();
+      data.put("value", "255");
+      Map<String, Object> result = configurationRestImpl.updateOption(adminToken,
+          ConfigurationElementType.EMAIL_SMTP_PORT.name(), data);
+      assertNotNull(result);
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
   @Test
   public void testImageFormats() throws Exception {
     try {
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
index 491868922accaadcf8b17e4fc2eaaecafdab2398..90f4c7b16d0c7aa7b758a10fe280e2d1554c0846 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
@@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.FrameworkVersion;
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ConfigurationOption;
 import lcsb.mapviewer.model.user.PrivilegeType;
@@ -57,6 +58,17 @@ public class ConfigurationService implements IConfigurationService {
 
   @Override
   public void setConfigurationValue(ConfigurationElementType type, String value) {
+    if (value == null) {
+      throw new InvalidArgumentException("null is not a proper value");
+    }
+    switch (type.getEditType()) {
+    case INTEGER:
+      if (!value.matches("-?\\d+")) {
+        throw new InvalidArgumentException("Expected integer value but got: " + value);
+      }
+      break;
+    default:
+    }
     ConfigurationOption configuration = configurationDao.getByType(type);
     if (configuration == null) {
       configuration = new ConfigurationOption();