diff --git a/base/src/org/compiere/model/GridField.java b/base/src/org/compiere/model/GridField.java
index ac6474393a..b0dadc67e5 100644
--- a/base/src/org/compiere/model/GridField.java
+++ b/base/src/org/compiere/model/GridField.java
@@ -1278,6 +1278,19 @@ public class GridField
 		m_inserting = inserting;
 		m_error = false;        //  reset error
 
+		updateContext();
+
+		//  Does not fire, if same value
+		Object oldValue = m_oldValue;
+		if (inserting)
+			oldValue = INSERTING;
+		m_propertyChangeListeners.firePropertyChange(PROPERTY, oldValue, m_value);
+	}   //  setValue
+
+	/**
+	 * Update env. context with current value
+	 */
+	public void updateContext() {
 		//	Set Context
 		if (m_vo.displayType == DisplayType.Text 
 			|| m_vo.displayType == DisplayType.Memo
@@ -1286,15 +1299,15 @@ public class GridField
 			|| m_vo.displayType == DisplayType.RowID
 			|| isEncrypted())
 			;	//	ignore
-		else if (newValue instanceof Boolean)
+		else if (m_value instanceof Boolean)
 		{
 			backupValue(); // teo_sarca [ 1699826 ]
 			Env.setContext(m_vo.ctx, m_vo.WindowNo, m_vo.ColumnName, 
-				((Boolean)newValue).booleanValue());
+				((Boolean)m_value).booleanValue());
 			Env.setContext(m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName, 
 					m_value==null ? null : (((Boolean)m_value) ? "Y" : "N"));
 		}
-		else if (newValue instanceof Timestamp)
+		else if (m_value instanceof Timestamp)
 		{
 			backupValue(); // teo_sarca [ 1699826 ]
 			Env.setContext(m_vo.ctx, m_vo.WindowNo, m_vo.ColumnName, (Timestamp)m_value);
@@ -1308,14 +1321,8 @@ public class GridField
 				m_value==null ? null : m_value.toString());
 			Env.setContext(m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName, 
 				m_value==null ? null : m_value.toString());
-		}
-		
-		//  Does not fire, if same value
-		Object oldValue = m_oldValue;
-		if (inserting)
-			oldValue = INSERTING;
-		m_propertyChangeListeners.firePropertyChange(PROPERTY, oldValue, m_value);
-	}   //  setValue
+		}		
+	}
 
 	/**
 	 * 	Set Value and Validate
diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/AbstractADTab.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/AbstractADTab.java
index c0bb78cf44..f7a65cc212 100644
--- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/AbstractADTab.java
+++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/AbstractADTab.java
@@ -18,14 +18,18 @@
 package org.adempiere.webui.component;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
+import org.adempiere.webui.panel.ADSortTab;
 import org.adempiere.webui.panel.ADTabpanel;
 import org.adempiere.webui.panel.IADTabpanel;
 import org.adempiere.webui.part.AbstractUIPart;
 import org.compiere.model.DataStatusEvent;
+import org.compiere.model.GridField;
 import org.compiere.model.GridTab;
 import org.compiere.util.CLogger;
+import org.compiere.util.Env;
 import org.compiere.util.Evaluator;
 
 /**
@@ -119,6 +123,7 @@ public abstract class AbstractADTab extends AbstractUIPart implements IADTab
             canJump = canNavigateTo(oldIndex, newIndex);
             if (canJump) 
             {
+            	prepareContext(newIndex, newTab);
 	            doTabSelectionChanged(oldIndex, newIndex);
             }
         }
@@ -126,6 +131,59 @@ public abstract class AbstractADTab extends AbstractUIPart implements IADTab
         return canJump;
     }
     
+    private void prepareContext(int newIndex, IADTabpanel newTab) {
+		//update context
+		if (newTab != null)
+		{
+			List<Integer> parents = new ArrayList<Integer>();
+			//get parent list
+			if (newIndex > 0)
+			{
+				int currentLevel = newTab.getTabLevel();
+				for (int i = newIndex - 1; i >= 0; i--)
+				{
+					IADTabpanel adtab = tabPanelList.get(i);
+					if (adtab.getGridTab() == null) continue;
+					if (adtab instanceof ADSortTab) continue;
+					if (adtab.getTabLevel() < currentLevel || i == 0)
+					{
+						parents.add(i);
+						currentLevel = adtab.getTabLevel();
+					}
+				}
+				Collections.reverse(parents);
+			}
+
+			//clear context
+			for (int i = 0; i < tabPanelList.size(); i++)
+			{
+				IADTabpanel adtab = tabPanelList.get(i);
+				if (adtab.getGridTab() == null) continue;
+				if (adtab instanceof ADSortTab) continue;
+				GridField[] fields = adtab.getGridTab().getFields();
+				for (GridField gf : fields)
+				{
+					Env.setContext(Env.getCtx(), gf.getWindowNo(),  gf.getColumnName(), "");
+				}
+			}
+
+			//add parent value to context
+			if (!parents.isEmpty())
+			{
+				for(int i : parents)
+				{
+					IADTabpanel adtab = tabPanelList.get(i);
+
+					GridField[] fields = adtab.getGridTab().getFields();
+					for (GridField gf : fields)
+					{
+						gf.updateContext();
+					}
+				}
+			}
+		}
+	}
+
     protected abstract void doTabSelectionChanged(int oldIndex, int newIndex);
 
     public boolean isDisplay(int index) {