diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile
index b2d3bf1584e31bebacd1d49ccff76f2b149313e7..b406417469a8bc06b1f84c79764c5540ab328a0f 100644
--- a/package/system/procd/Makefile
+++ b/package/system/procd/Makefile
@@ -1,14 +1,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=procd
-PKG_VERSION:=2013-11-08
+PKG_VERSION:=2013-11-13
 
 PKG_RELEASE=$(PKG_SOURCE_VERSION)-1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=git://nbd.name/luci2/procd.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=315f04d8b823adda96041c17f6672b7790376ccb
+PKG_SOURCE_VERSION:=f9d31edb8938341b9217ee4c14eb58111414eb97
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 CMAKE_INSTALL:=1
 
@@ -30,13 +30,14 @@ define Package/procd
 endef
 
 define Package/procd/install
-	$(INSTALL_DIR) $(1)/sbin $(1)/lib/functions $(1)/etc/init.d
+	$(INSTALL_DIR) $(1)/sbin $(1)/lib/functions $(1)/etc/init.d $(1)/lib
 
-	$(CP) $(PKG_INSTALL_DIR)/usr/sbin/{procd,askfirst,udevtrigger,logread} $(1)/sbin/
+	$(CP) $(PKG_INSTALL_DIR)/usr/sbin/{procd,askfirst,udevtrigger,logread,validate_data} $(1)/sbin/
+	$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libvalidate.so $(1)/lib/
 	$(INSTALL_BIN) ./files/reload_config $(1)/sbin/
 	$(INSTALL_BIN) ./files/log.init $(1)/etc/init.d/log
 	$(INSTALL_DATA) ./files/hotplug*.json $(1)/etc/
-	$(INSTALL_DATA) ./files/procd.sh $(1)/lib/functions/
+	$(INSTALL_DATA) ./files/procd.sh ./files/procd-validate.sh $(1)/lib/functions/
 	ln -s /sbin/procd $(1)/sbin/init
 endef
 
diff --git a/package/system/procd/files/procd.sh b/package/system/procd/files/procd.sh
index 5327c1dbc3fe108dc1fb35d8916ee02521dde51e..7b8640ad727921a011e4d078fd09282dddf05123 100644
--- a/package/system/procd/files/procd.sh
+++ b/package/system/procd/files/procd.sh
@@ -68,9 +68,7 @@ _procd_open_service() {
 
 _procd_close_service() {
 	json_close_object
-	_procd_open_trigger
 	service_triggers
-	_procd_close_trigger
 	_procd_ubus_call set
 }
 
@@ -117,6 +115,10 @@ _procd_open_trigger() {
 	json_add_array "triggers"
 }
 
+_procd_open_validate() {
+	json_add_array "validate"
+}
+
 _procd_set_param() {
 	local type="$1"; shift
 
@@ -135,7 +137,8 @@ _procd_set_param() {
 
 _procd_add_config_trigger() {
 	json_add_array
-	_procd_add_array_data "config.change"
+	_procd_add_array_data "$1"
+	shift
 
 	json_add_array
 	_procd_add_array_data "if"
@@ -158,14 +161,15 @@ _procd_add_reload_trigger() {
 	local script=$(readlink "$initscript")
 	local name=$(basename ${script:-$initscript})
 
-	_procd_add_config_trigger $1 /etc/init.d/$name reload
+	_procd_open_trigger
+	_procd_add_config_trigger "config.change" $1 /etc/init.d/$name reload
+	_procd_close_trigger
 }
 
-_procd_add_reload_trigger() {
-	local script=$(readlink "$initscript")
-	local name=$(basename ${script:-$initscript})
-
-	_procd_add_config_trigger $1 /etc/init.d/$name reload
+_procd_add_validation() {
+	_procd_open_validate
+	$@
+	_procd_close_validate
 }
 
 _procd_append_param() {
@@ -191,6 +195,10 @@ _procd_close_trigger() {
 	json_close_array
 }
 
+_procd_close_validate() {
+	json_close_array
+}
+
 _procd_add_instance() {
 	_procd_open_instance
 	_procd_set_param command "$@"
@@ -207,6 +215,63 @@ _procd_kill() {
 	_procd_ubus_call delete
 }
 
+uci_validate_section()
+{
+	local error=0
+
+	[ "$4" = "" ] && return 1
+	[ "$3" = "" ] && {
+		json_add_object
+		json_add_string "package" "$1"
+		json_add_string "type" "$2"
+		json_add_object "data"
+
+		shift; shift; shift
+
+		while [ -n "$1" ]; do
+			json_add_string "${1%:*}" "${1#*:}"
+			shift
+		done
+
+		json_close_object
+		json_close_object
+		return 0
+	}
+
+	local section="${3}"
+	config_load "${1}"
+	shift; shift; shift
+
+	while [ -n "$1" ]; do
+		local name=${1%%:*}
+		local tmp=${1#*:}
+		local type=${tmp%%:*}
+		local default=""
+
+		[ "$tmp" = "$type" ] || default=${tmp#*:}
+
+		shift
+		config_get "${name}" "${section}" "${name}"
+		eval val=\$$name
+
+		[ "$type" = "bool" ] && {
+			case "$val" in
+			1|on|true|enabled) val=1;;
+			0|off|false|disabled) val=0;;
+			*) val="";;
+			esac
+		}
+		[ -z "$val" ] && val=${default}
+		eval $name=\"$val\"
+		[ -z "$val" ] || {
+			/sbin/validate_data "${type}" "${val}"
+			[ $? -eq 0 ] || error="$((error + 1))"
+		}
+	done
+
+	return $error
+}
+
 _procd_wrapper \
 	procd_open_service \
 	procd_close_service \
@@ -219,4 +284,5 @@ _procd_wrapper \
 	procd_close_instance \
 	procd_set_param \
 	procd_append_param \
+	procd_add_validation \
 	procd_kill