diff --git a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
index 07c9ef5e971cae00129404e44201b45da611581d..2ec0d71fa648a76f8d289d81224f11c9d04e7a31 100644
--- a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
+++ b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
@@ -53,6 +53,7 @@ function Node:__init__(name, title, description)
 	self.name = name
 	self.index = nil
 	self.parent = nil
+	self.state = M.FORM_NODATA
 	self.package = 'gluon-web-model'
 end
 
@@ -73,17 +74,32 @@ function Node:id()
 end
 
 function Node:reset_node()
+	self.state = M.FORM_NODATA
 	for _, child in ipairs(self.children) do
 		child:reset_node()
 	end
 end
 
 function Node:parse(http)
+	self.state = M.FORM_VALID
 	for _, child in ipairs(self.children) do
 		child:parse(http)
 	end
 end
 
+function Node:propagate_state()
+	if self.state == M.FORM_NODATA then
+		return
+	end
+
+	for _, child in ipairs(self.children) do
+		child:propagate_state()
+		if child.state == M.FORM_INVALID then
+			self.state = M.FORM_INVALID
+		end
+	end
+end
+
 function Node:render(renderer, scope)
 	if self.template then
 		local env = setmetatable({
@@ -158,9 +174,16 @@ function Node:resolve_node_depends()
 	return true
 end
 
+-- will be overridden: write(value)
+function Node:write()
+end
+
 function Node:handle()
-	for _, node in ipairs(self.children) do
-		node:handle()
+	if self.state == M.FORM_VALID then
+		for _, node in ipairs(self.children) do
+			node:handle()
+		end
+		self:write(self.data)
 	end
 end
 
@@ -187,7 +210,6 @@ function AbstractValue:__init__(...)
 	self.template  = "model/valuewrapper"
 
 	self.error = false
-	self.state = M.FORM_NODATA
 end
 
 function AbstractValue:defaultvalue()
@@ -250,16 +272,6 @@ function AbstractValue:validate()
 
 end
 
-function AbstractValue:handle()
-	if self.state == M.FORM_VALID then
-		self:write(self.data)
-	end
-end
-
--- will be overridden: write(value)
-function AbstractValue:write()
-end
-
 
 local Value = class(AbstractValue)
 M.Value = Value
@@ -438,26 +450,7 @@ function Form:parse(http)
 
 	while self:resolve_depends() do end
 
-	for _, s in ipairs(self.children) do
-		for _, v in ipairs(s.children) do
-			if v.state == M.FORM_INVALID then
-				self.state = M.FORM_INVALID
-				return
-			end
-		end
-	end
-
-	self.state = M.FORM_VALID
-end
-
-function Form:handle()
-	if self.state == M.FORM_VALID then
-		Node.handle(self)
-		self:write()
-	end
-end
-
-function Form:write()
+	self:propagate_state()
 end
 
 function Form:section(t, ...)