diff --git a/lam/HISTORY b/lam/HISTORY
index d3357ce9..4a26def9 100644
--- a/lam/HISTORY
+++ b/lam/HISTORY
@@ -2,6 +2,9 @@ March 2014 4.5
   - IMAP: allow dynamic admin user names by replacing wildcards with LDAP attributes
   - Personal: allow to set fields read-only
   - Added option to server profile if referrals should be followed (fixes problems with Samba 4 and AD)
+  - LAM Pro:
+   -> Separate IP restriction list for self service
+
 
 18.12.2013 4.4
   - PyKota support: users, groups, printers, billing codes
@@ -11,14 +14,14 @@ March 2014 4.5
   - Unix: switch also additional membership if primary group is changed (RFE 108)
   - Windows: fixed user name handling, sAMAccountName now optional
   - Apache 2.4 support (requires Apache "version" module)
-  - added Turkish, Ukrainian and US English translation
+  - Added Turkish, Ukrainian and US English translation
   - LAM Pro:
    -> Bind DLZ support
    -> Samba/Shadow: display password change date in self service
    -> Custom fields: support custom label and icon, auto-completion
    -> User self registration: support constant attribute values
    -> Self service: allow to set custom field labels
-  - fixed bugs:
+  - Fixed bugs:
    -> Format of photo in Personal tab (158)
 
 
@@ -34,14 +37,14 @@ March 2014 4.5
    -> Custom fields: read-only fields for admin interface and file upload for binary data
    -> Custom scripts: support user self registration
    -> Password self reset: Samba 3 sync, identification with login attribute, Samba 4 support
-  - fixed bugs:
+  - Fixed bugs:
    -> Custom fields: auto-adding object classes via profile editor fixed
    -> PHP 5.5 compatibility
    -> Lamdaemon: do not show message if home directory to delete was not found (154)
 
 
 18.06.2013 4.2.1
-  - fixed bugs:
+  - Fixed bugs:
    -> Unix: suggested user name must be lower case
    -> Quota: profile editor does not work in some cases
 
diff --git a/lam/docs/manual-sources/howto.xml b/lam/docs/manual-sources/howto.xml
index 49a65384..521d4e9e 100644
--- a/lam/docs/manual-sources/howto.xml
+++ b/lam/docs/manual-sources/howto.xml
@@ -720,6 +720,10 @@ Have fun!
           most installations. If you use LDAP referrals please activate
           referral following for your server profile (tab General settings
           -> Server settings -> Advanced options).
+
+          The self service pages now have an own option for allowed IPs.
+          If your LAM installation uses IP restrictions please update the LAM
+          main configuration.
         
 
         
@@ -994,7 +998,8 @@ Have fun!
         You may also set a list of IP addresses which are allowed to
         access LAM. The IPs can be specified as full IP (e.g. 123.123.123.123)
         or with the "*" wildcard (e.g. 123.123.123.*). Users which try to
-        access LAM via an untrusted IP only get blank pages.
+        access LAM via an untrusted IP only get blank pages. There is a
+        separate field for LAM Pro self service.
 
         Session encryption will encrypt sensitive
         data like passwords in your session files. This is only available when
diff --git a/lam/docs/manual-sources/images/configGeneral1.png b/lam/docs/manual-sources/images/configGeneral1.png
index 46cf276f..121da807 100644
Binary files a/lam/docs/manual-sources/images/configGeneral1.png and b/lam/docs/manual-sources/images/configGeneral1.png differ
diff --git a/lam/lib/config.inc b/lam/lib/config.inc
index ddcefb0e..1753ff0d 100644
--- a/lam/lib/config.inc
+++ b/lam/lib/config.inc
@@ -3,7 +3,7 @@
 $Id$
 
   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
-  Copyright (C) 2003 - 2012  Roland Gruber
+  Copyright (C) 2003 - 2014  Roland Gruber
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -1400,6 +1400,9 @@ class LAMCfgMain {
 	/** list of hosts which may access LAM */
 	public $allowedHosts;
 	
+	/** list of hosts which may access LAM Pro self service */
+	public $allowedHostsSelfService;
+	
 	/** session encryption */
 	public $encryptSession;
 	
@@ -1441,7 +1444,7 @@ class LAMCfgMain {
 		"logLevel", "logDestination", "allowedHosts", "passwordMinLength",
 		"passwordMinUpper", "passwordMinLower", "passwordMinNumeric",
 		"passwordMinClasses", "passwordMinSymbol", "mailEOL", 'errorReporting',
-		'encryptSession');
+		'encryptSession', 'allowedHostsSelfService');
 
 	/**
 	* Loads preferences from config file
@@ -1453,6 +1456,7 @@ class LAMCfgMain {
 		$this->logLevel = LOG_NOTICE;
 		$this->logDestination = "SYSLOG";
 		$this->allowedHosts = "";
+		$this->allowedHostsSelfService = '';
 		$this->encryptSession = 'true';
 		$this->reload();
 	}
@@ -1521,6 +1525,7 @@ class LAMCfgMain {
 		if (!in_array("logLevel", $saved)) array_push($file_array, "\n\n# log level\n" . "logLevel: " . $this->logLevel);
 		if (!in_array("logDestination", $saved)) array_push($file_array, "\n\n# log destination\n" . "logDestination: " . $this->logDestination);
 		if (!in_array("allowedHosts", $saved)) array_push($file_array, "\n\n# list of hosts which may access LAM\n" . "allowedHosts: " . $this->allowedHosts);
+		if (!in_array("allowedHostsSelfService", $saved)) array_push($file_array, "\n\n# list of hosts which may access LAM Pro self service\n" . "allowedHostsSelfService: " . $this->allowedHostsSelfService);
 		if (!in_array("encryptSession", $saved)) array_push($file_array, "\n\n# encrypt session data\n" . "encryptSession: " . $this->encryptSession);
 		if (!in_array("passwordMinLength", $saved)) array_push($file_array, "\n\n# Password: minimum password length\n" . "passwordMinLength: " . $this->passwordMinLength);
 		if (!in_array("passwordMinUpper", $saved)) array_push($file_array, "\n\n# Password: minimum uppercase characters\n" . "passwordMinUpper: " . $this->passwordMinUpper);
diff --git a/lam/lib/security.inc b/lam/lib/security.inc
index d5ffa5ca..8ee5ea5e 100644
--- a/lam/lib/security.inc
+++ b/lam/lib/security.inc
@@ -3,7 +3,7 @@
 $Id$
 
   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
-  Copyright (C) 2006 - 2013  Roland Gruber
+  Copyright (C) 2006 - 2014  Roland Gruber
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -32,6 +32,8 @@ $Id$
 include_once('config.inc');
 /** ldap connection */
 include_once('ldap.inc');
+/** common functions */
+include_once('account.inc');
 
 // check client IP address
 checkClientIP();
@@ -104,6 +106,11 @@ function checkClientIP() {
 	if (isset($_SESSION['cfgMain'])) $cfg = $_SESSION['cfgMain'];
 	else $cfg = new LAMCfgMain();
 	$allowedHosts = $cfg->allowedHosts;
+	$url = getCallingURL();
+	if ((strpos($url, '/selfService/selfService') !== false) || ((strpos($url, '/misc/ajax.php?') !== false) && strpos($url, 'selfservice=1') !== false)) {
+		// self service pages have separate IP list
+		$allowedHosts = $cfg->allowedHostsSelfService;
+	}
 	// skip test if no hosts are defined
 	if ($allowedHosts == "") return;
 	$allowedHosts = explode(",", $allowedHosts);
diff --git a/lam/templates/config/mainmanage.php b/lam/templates/config/mainmanage.php
index cf7ae048..a3f5078f 100644
--- a/lam/templates/config/mainmanage.php
+++ b/lam/templates/config/mainmanage.php
@@ -3,7 +3,7 @@
 $Id$
 
   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
-  Copyright (C) 2003 - 2013  Roland Gruber
+  Copyright (C) 2003 - 2014  Roland Gruber
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -104,6 +104,29 @@ if (isset($_POST['submitFormData'])) {
 	}
 	else $allowedHosts = "";
 	$cfg->allowedHosts = $allowedHosts;
+	// set allowed hosts for self service
+	if (isLAMProVersion()) {
+		if (isset($_POST['allowedHostsSelfService'])) {
+			$allowedHostsSelfService = $_POST['allowedHostsSelfService'];
+			$allowedHostsSelfServiceList = explode("\n", $allowedHostsSelfService);
+			for ($i = 0; $i < sizeof($allowedHostsSelfServiceList); $i++) {
+				$allowedHostsSelfServiceList[$i] = trim($allowedHostsSelfServiceList[$i]);
+				// ignore empty lines
+				if ($allowedHostsSelfServiceList[$i] == "") {
+					unset($allowedHostsSelfServiceList[$i]);
+					continue;
+				}
+				// check each line
+				$ipRegex = '/^[0-9a-f\\.:\\*]+$/i';
+				if (!preg_match($ipRegex, $allowedHostsSelfServiceList[$i]) || (strlen($allowedHostsSelfServiceList[$i]) > 15)) {
+					$errors[] = sprintf(_("The IP address %s is invalid!"), htmlspecialchars(str_replace('%', '%%', $allowedHostsSelfServiceList[$i])));
+				}
+			}
+			$allowedHostsSelfService = implode(",", $allowedHostsSelfServiceList);
+		}
+		else $allowedHostsSelfService = "";
+		$cfg->allowedHostsSelfService = $allowedHostsSelfService;
+	}
 	// set session encryption
 	if (function_exists('mcrypt_create_iv')) {
 		$encryptSession = 'false';
@@ -271,6 +294,9 @@ $securityTable = new htmlTable();
 $options = array(5, 10, 20, 30, 60, 90, 120, 240);
 $securityTable->addElement(new htmlTableExtendedSelect('sessionTimeout', $options, array($cfg->sessionTimeout), _("Session timeout"), '238'), true);
 $securityTable->addElement(new htmlTableExtendedInputTextarea('allowedHosts', implode("\n", explode(",", $cfg->allowedHosts)), '30', '7', _("Allowed hosts"), '241'), true);
+if (isLAMProVersion()) {
+	$securityTable->addElement(new htmlTableExtendedInputTextarea('allowedHostsSelfService', implode("\n", explode(",", $cfg->allowedHostsSelfService)), '30', '7', _("Allowed hosts (self service)"), '241'), true);
+}
 $encryptSession = ($cfg->encryptSession === 'true');
 $encryptSessionBox = new htmlTableExtendedInputCheckbox('encryptSession', $encryptSession, _('Encrypt session'), '245');
 $encryptSessionBox->setIsEnabled(function_exists('mcrypt_create_iv'));