diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Contextual.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Contextual.java
new file mode 100644
index 0000000000000000000000000000000000000000..234588a528614fcb7449323e9df55460a9c49fb3
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Contextual.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.uitest.infra;
+
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
+
+/**
+ * @author anttil
+ */
+public interface Contextual
+{
+    public void setContext(WidgetWebElement context);
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Fillable.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Fillable.java
similarity index 93%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Fillable.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Fillable.java
index be2c5863796621d9e598d308be4a6abf81dca8ff..7181c162c1f30b43c0ad1838c87553cb5282dfa0 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Fillable.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Fillable.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.widget;
+package ch.systemsx.cisd.openbis.uitest.infra;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Refreshing.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Refreshing.java
similarity index 92%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Refreshing.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Refreshing.java
index 7876b72cdaadc8d4ec6c53b18492356db24df01f..ed13891adca0b867f85931dfc15af20638ed96a8 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Refreshing.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Refreshing.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.infra.webdriver;
+package ch.systemsx.cisd.openbis.uitest.infra;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Widget.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Widget.java
new file mode 100644
index 0000000000000000000000000000000000000000..6517bebcc872c25e24199ca060aabf9642080ed6
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Widget.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.uitest.infra;
+
+/**
+ * @author anttil
+ */
+public interface Widget extends Contextual
+{
+    public String getTagName();
+
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java
index 087037f4c5e9c58c9e3119e01c74ee1d40cee094..ee1fb656514ddee65b05eac5c1c94fcfcb587872 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.uitest.infra.webdriver;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 
 import javassist.util.proxy.MethodHandler;
 import javassist.util.proxy.ProxyFactory;
@@ -28,10 +27,11 @@ import org.openqa.selenium.By;
 import org.openqa.selenium.StaleElementReferenceException;
 import org.openqa.selenium.WebElement;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
 import ch.systemsx.cisd.openbis.uitest.infra.screenshot.ScreenShotProxy;
 import ch.systemsx.cisd.openbis.uitest.infra.screenshot.ScreenShotter;
 import ch.systemsx.cisd.openbis.uitest.suite.SeleniumTest;
-import ch.systemsx.cisd.openbis.uitest.widget.Widget;
 
 /**
  * @author anttil
@@ -115,29 +115,31 @@ public class PageProxy
                     try
                     {
                         field.setAccessible(true);
-                        Class<?> type = field.getType();
+                        Contextual widget = (Contextual) field.getType().newInstance();
 
-                        Widget widget;
-                        if (Modifier.isAbstract(type.getModifiers()))
+                        String tagName = null;
+                        if (widget instanceof Widget)
                         {
-                            widget = new Widget()
-                                {
-                                };
-                        } else
-                        {
-                            widget = (Widget) type.newInstance();
+                            tagName = ((Widget) widget).getTagName();
                         }
 
                         WebElement element;
                         if (field.getAnnotation(Lazy.class) != null)
                         {
-                            element = (WebElement) WebElementProxy.newInstance(locate.value());
+                            element =
+                                    (WebElement) WebElementProxy.newInstance(locate.value(),
+                                            tagName);
                         } else
                         {
                             element = SeleniumTest.driver.findElement(By.id(locate.value()));
+                            if (tagName != null && !element.getTagName().equals(tagName))
+                            {
+                                element = element.findElement(By.xpath(".//" + tagName));
+                            }
                         }
-                        widget.setContext((WebElement) ScreenShotProxy
-                                .newInstance(element, shotter));
+
+                        widget.setContext(new WidgetWebElement((WebElement) ScreenShotProxy
+                                .newInstance(element, shotter)));
                         field.set(t, widget);
                     } catch (IllegalArgumentException ex)
                     {
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java
index 0ca199555459f0cdbb3d88055fcde5cd39602ae3..a2739d472417517cf150eff253c493dead0cfbd8 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java
@@ -22,6 +22,8 @@ import org.openqa.selenium.support.ui.FluentWait;
 
 import com.google.common.base.Predicate;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Refreshing;
+
 /**
  * @author anttil
  */
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WebElementProxy.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WebElementProxy.java
index d0415744bc8bca8572714a056a25c0bc579c31e1..bf6472d69e3703af5687f76ef574d7af6a47203f 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WebElementProxy.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WebElementProxy.java
@@ -30,18 +30,21 @@ public class WebElementProxy implements InvocationHandler
 
     private String id;
 
-    public static Object newInstance(String id)
+    private String tag;
+
+    public static Object newInstance(String id, String tag)
     {
         return java.lang.reflect.Proxy.newProxyInstance(
                 WebElement.class.getClassLoader(),
                 new Class<?>[]
                     { WebElement.class },
-                new WebElementProxy(id));
+                new WebElementProxy(id, tag));
     }
 
-    private WebElementProxy(String id)
+    private WebElementProxy(String id, String tag)
     {
         this.id = id;
+        this.tag = tag;
     }
 
     @Override
@@ -50,6 +53,10 @@ public class WebElementProxy implements InvocationHandler
         try
         {
             WebElement e = SeleniumTest.driver.findElement(By.id(id));
+            if (tag != null && !tag.equals(e.getTagName()))
+            {
+                e = e.findElement(By.xpath(".//" + tag));
+            }
             return m.invoke(e, args);
         } catch (InvocationTargetException e)
         {
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WidgetWebElement.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WidgetWebElement.java
new file mode 100644
index 0000000000000000000000000000000000000000..e98938c4efd1c45aa4a3493fd072dc43a627cc83
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WidgetWebElement.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.uitest.infra.webdriver;
+
+import java.util.List;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.suite.SeleniumTest;
+
+/**
+ * @author anttil
+ */
+public class WidgetWebElement
+{
+
+    public WebElement element;
+
+    public WidgetWebElement(WebElement element)
+    {
+        this.element = element;
+    }
+
+    public void click()
+    {
+        element.click();
+    }
+
+    public String getAttribute(String key)
+    {
+        return element.getAttribute(key);
+    }
+
+    public String getTagName()
+    {
+        return element.getTagName();
+    }
+
+    public void sendKeys(String keys)
+    {
+        element.sendKeys(keys);
+    }
+
+    public void clear()
+    {
+        element.clear();
+    }
+
+    public WebElement find(String xpath)
+    {
+        return element.findElement(By.xpath(xpath));
+    }
+
+    public <T extends Widget> T find(String xpath, Class<T> widgetClass)
+    {
+        T t;
+        try
+        {
+            t = widgetClass.newInstance();
+        } catch (InstantiationException ex)
+        {
+            throw new RuntimeException(ex);
+        } catch (IllegalAccessException ex)
+        {
+            throw new RuntimeException(ex);
+        }
+
+        WebElement e = element.findElement(By.xpath(xpath));
+        if (!e.getTagName().equals(t.getTagName()))
+        {
+            e = e.findElement(By.xpath(".//" + t.getTagName()));
+        }
+        t.setContext(new WidgetWebElement(e));
+        return t;
+    }
+
+    public List<WebElement> findAll(String xpath)
+    {
+        return element.findElements(By.xpath(xpath));
+    }
+
+    public void mouseOver()
+    {
+        Actions builder = new Actions(SeleniumTest.driver);
+        builder.moveToElement(element).build().perform();
+    }
+
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/AddSampleTypeDialog.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/AddSampleTypeDialog.java
index bb09f51be8dcc72b8594d657cae4f3a981864d77..1d200775a0d84158223222bc32417272100d3d2f 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/AddSampleTypeDialog.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/AddSampleTypeDialog.java
@@ -21,6 +21,7 @@ import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Checkbox;
 import ch.systemsx.cisd.openbis.uitest.widget.Text;
+import ch.systemsx.cisd.openbis.uitest.widget.TextArea;
 
 @SuppressWarnings("unused")
 public class AddSampleTypeDialog
@@ -30,7 +31,7 @@ public class AddSampleTypeDialog
     private Text code;
 
     @Locate("openbis_add-type-dialog-description-field")
-    private Text description;
+    private TextArea description;
 
     @Locate("openbis_add-type-dialog-listable")
     private Checkbox listable;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/EditSampleTypeDialog.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/EditSampleTypeDialog.java
index be1fc5449ca7dc1464d613a884d66d30eedaba3c..16b5986898850c2e2fdc11d0e1d144b1acc3ba31 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/EditSampleTypeDialog.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/dialog/EditSampleTypeDialog.java
@@ -21,13 +21,14 @@ import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Checkbox;
 import ch.systemsx.cisd.openbis.uitest.widget.Text;
+import ch.systemsx.cisd.openbis.uitest.widget.TextArea;
 
 @SuppressWarnings("unused")
 public class EditSampleTypeDialog
 {
 
     @Locate("openbis_edit-type-dialog-description")
-    private Text description;
+    private TextArea description;
 
     @Locate("openbis_add-type-dialog-listable")
     private Checkbox listable;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/AssignSamplePropertyType.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/AssignSamplePropertyType.java
index 97acb322e5121a3acad1c3e91ce9cb5cedc1a062..504e3f16887b0e5c27c3af4c29effa96c1e64c77 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/AssignSamplePropertyType.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/AssignSamplePropertyType.java
@@ -16,14 +16,15 @@
 
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Lazy;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyTypeAssignment;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Checkbox;
 import ch.systemsx.cisd.openbis.uitest.widget.DropDown;
-import ch.systemsx.cisd.openbis.uitest.widget.Fillable;
-import ch.systemsx.cisd.openbis.uitest.widget.Widget;
+import ch.systemsx.cisd.openbis.uitest.widget.Dynamic;
 
 public class AssignSamplePropertyType
 {
@@ -39,7 +40,7 @@ public class AssignSamplePropertyType
 
     @Lazy
     @Locate("openbis_property-type-assignment_SAMPLEdefault_value")
-    private Widget initialValue;
+    private Dynamic initialValue;
 
     @Locate("openbis_property-type-assignment_SAMPLEsave-button")
     private Button save;
@@ -52,7 +53,9 @@ public class AssignSamplePropertyType
 
         if (assignment.getInitialValue() != null && assignment.getInitialValue().length() > 0)
         {
-            ((Fillable) initialValue).fillWith(assignment.getInitialValue());
+            Contextual c =
+                    initialValue.define(assignment.getPropertyType().getDataType().representedAs());
+            ((Fillable) c).fillWith(assignment.getInitialValue());
         }
     }
 
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
index 77c1faa36a3a5a96bfcd16b1acd79ac3dce5d47c..1d13ce42b5c0747aa608f86dc81ac629e6c8e1f3 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
@@ -17,7 +17,7 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.widget.Button;
+import ch.systemsx.cisd.openbis.uitest.widget.SubmitButton;
 import ch.systemsx.cisd.openbis.uitest.widget.Text;
 
 public class LoginPage
@@ -29,7 +29,7 @@ public class LoginPage
     private Text password;
 
     @Locate("openbis_login_submit")
-    private Button button;
+    private SubmitButton button;
 
     public void loginAs(String user, String pwd)
     {
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RegisterSample.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RegisterSample.java
index fae6edc569218c575627e6655cac65e3fa3923d1..be57fc53ad642a0124ddf08448bed99e5fe4b277 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RegisterSample.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RegisterSample.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Lazy;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyType;
@@ -27,7 +28,6 @@ import ch.systemsx.cisd.openbis.uitest.type.Sample;
 import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.DropDown;
-import ch.systemsx.cisd.openbis.uitest.widget.Fillable;
 import ch.systemsx.cisd.openbis.uitest.widget.Form;
 import ch.systemsx.cisd.openbis.uitest.widget.Text;
 
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/ExperimentTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/ExperimentTest.java
index 93dfef7a7d6fda2fa4643a14e0ad8232df24cd10..f6f71dcac8e3db59c2f11b7f6736f30139c675a8 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/ExperimentTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/ExperimentTest.java
@@ -42,7 +42,7 @@ public class ExperimentTest extends SeleniumTest
 
         Experiment experiment = create(anExperiment().in(project).withSamples(sample));
 
-        assertThat(sampleBrowser().cell(sample, "Experiment"), displays(experiment.getCode()));
-        assertThat(sampleBrowser().cell(sample, "Project"), displays(project.getCode()));
+        assertThat(cell(sample, "Experiment").of(sampleBrowser()), displays(experiment.getCode()));
+        assertThat(cell(sample, "Project").of(sampleBrowser()), displays(project.getCode()));
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/PropertyTypeAssignmentTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/PropertyTypeAssignmentTest.java
index 4de3402039cfe8924e51cf1da136513633a8cfa8..239551cbc65b9dc48c143579e8d087b34106ba29 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/PropertyTypeAssignmentTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/PropertyTypeAssignmentTest.java
@@ -20,7 +20,10 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.uitest.type.PropertyType;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyTypeAssignment;
+import ch.systemsx.cisd.openbis.uitest.type.Sample;
+import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 
 /**
  * @author anttil
@@ -32,9 +35,27 @@ public class PropertyTypeAssignmentTest extends SeleniumTest
     @Test
     public void newPropertyTypeAssignmentIsListedInPropertyTypeAssignmentBrowser() throws Exception
     {
-        PropertyTypeAssignment assignment =
-                create(aSamplePropertyTypeAssignment());
+        PropertyTypeAssignment assignment = create(aSamplePropertyTypeAssignment());
 
         assertThat(propertyTypeAssignmentBrowser(), lists(assignment));
     }
+
+    @Test
+    public void existingSamplesGetInitialValueSetForNewProperty()
+            throws Exception
+    {
+        SampleType sampleType = create(aSampleType());
+        Sample sample = create(aSample().ofType(sampleType));
+
+        PropertyType propertyType = create(aVarcharPropertyType());
+
+        create(aSamplePropertyTypeAssignment()
+                .with(sampleType)
+                .with(propertyType)
+                .thatIsMandatory()
+                .havingInitialValueOf("Test Initial Value"));
+
+        assertThat(cell(sample, propertyType.getLabel()).of(sampleBrowser()),
+                displays("Test Initial Value"));
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SampleTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SampleTest.java
index 550c458cb92ff8b21e872ac56094ec688b0b1a35..0df8c3f36c9dd6ceb67bc67f3dfcb975ad3baaf0 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SampleTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SampleTest.java
@@ -76,8 +76,8 @@ public class SampleTest extends SeleniumTest
         Sample sample =
                 create(aSample().ofType(sampleType).withProperty(vocabularyType, "mouse"));
 
-        assertThat(sampleBrowser().cell(sample, vocabularyType.getLabel()), displays("mouse"));
-        assertThat(sampleBrowser().cell(sample, vocabularyType.getLabel()),
+        assertThat(cell(sample, vocabularyType.getLabel()).of(sampleBrowser()), displays("mouse"));
+        assertThat(cell(sample, vocabularyType.getLabel()).of(sampleBrowser()),
                 linksTo("http://www.ask.com/web?q=MOUSE"));
     }
 
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java
index cc8fdc45ea6e73a6e4e9210ae1469206dbdbcfe4..06f2d48def6048a8abeada05e1ef0a8e921d9e6a 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java
@@ -101,7 +101,7 @@ public abstract class SeleniumTest
         System.setProperty("webdriver.firefox.profile", "default");
 
         driver = new FirefoxDriver();
-        driver.manage().timeouts().implicitlyWait(IMPLICIT_WAIT, TimeUnit.SECONDS);
+        setImplicitWaitToDefault();
         delete(new File("targets/dist"));
 
         driver.manage().deleteAllCookies();
@@ -116,6 +116,16 @@ public abstract class SeleniumTest
         driver.get(url);
     }
 
+    public static void setImplicitWait(long amount, TimeUnit unit)
+    {
+        driver.manage().timeouts().implicitlyWait(amount, unit);
+    }
+
+    public static void setImplicitWaitToDefault()
+    {
+        driver.manage().timeouts().implicitlyWait(IMPLICIT_WAIT, TimeUnit.SECONDS);
+    }
+
     @AfterSuite
     public void closeBrowser()
     {
@@ -273,6 +283,30 @@ public abstract class SeleniumTest
         return new RegisterSampleFormContainsInputsForPropertiesMatcher(fields);
     }
 
+    protected <T extends Browsable> CellExtractor<T> cell(T browsable, String column)
+    {
+        return new CellExtractor<T>(browsable, column);
+    }
+
+    protected class CellExtractor<T extends Browsable>
+    {
+        private final T browsable;
+
+        private final String column;
+
+        public CellExtractor(T browsable, String column)
+        {
+            this.browsable = browsable;
+            this.column = column;
+        }
+
+        public Cell of(Browser<T> browser)
+        {
+            browser.filter(browsable);
+            return browser.cell(browsable, column);
+        }
+    }
+
     protected Matcher<Cell> linksTo(String url)
     {
         return new CellLinksToMatcher(url);
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SprintTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SprintTest.java
index 0b6cb262ad60b587844df617d8a5eb9aea614b99..b9150c124ca8bbc405e699c8d2a2e01b28168cde 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SprintTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SprintTest.java
@@ -124,8 +124,9 @@ public class SprintTest extends SeleniumTest
                         .withProperty(animalPropertyType, "mouse"));
 
         assertThat(sampleBrowser(), lists(sample));
-        assertThat(sampleBrowser().cell(sample, animalPropertyType.getLabel()), displays("mouse"));
-        assertThat(sampleBrowser().cell(sample, animalPropertyType.getLabel()),
+        assertThat(cell(sample, animalPropertyType.getLabel()).of(sampleBrowser()),
+                displays("mouse"));
+        assertThat(cell(sample, animalPropertyType.getLabel()).of(sampleBrowser()),
                 linksTo("http://www.ask.com/web?q=MOUSE"));
 
         // 5) Project and experiment
@@ -135,7 +136,7 @@ public class SprintTest extends SeleniumTest
         Experiment experiment =
                 create(anExperiment().ofType(experimentType).in(project).withCode("exp1")
                         .withSamples(sample));
-        assertThat(sampleBrowser().cell(sample, "Experiment"), displays(experiment.getCode()));
-        assertThat(sampleBrowser().cell(sample, "Project"), displays(project.getCode()));
+        assertThat(cell(sample, "Experiment").of(sampleBrowser()), displays(experiment.getCode()));
+        assertThat(cell(sample, "Project").of(sampleBrowser()), displays(project.getCode()));
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeDataType.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeDataType.java
index 0af09b6c2bf8be6fcf34f64aa1cf3ab35c4ec12b..40fbced28cba2431f947ebc908fd62c3f2a5ed63 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeDataType.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeDataType.java
@@ -16,16 +16,17 @@
 
 package ch.systemsx.cisd.openbis.uitest.type;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
 import ch.systemsx.cisd.openbis.uitest.widget.Checkbox;
 import ch.systemsx.cisd.openbis.uitest.widget.DropDown;
 import ch.systemsx.cisd.openbis.uitest.widget.Text;
 import ch.systemsx.cisd.openbis.uitest.widget.TextArea;
-import ch.systemsx.cisd.openbis.uitest.widget.Widget;
 
 /**
  * @author anttil
  */
-public enum PropertyTypeDataType 
+public enum PropertyTypeDataType
 {
     BOOLEAN("BOOLEAN", Checkbox.class),
     HYPERLINK("HYPERLINK", Text.class),
@@ -40,9 +41,9 @@ public enum PropertyTypeDataType
 
     private String name;
 
-    private Class<? extends Widget> widgetClass;
+    private Class<?> widgetClass;
 
-    private PropertyTypeDataType(String name, Class<? extends Widget> widgetClass)
+    private <T extends Widget & Fillable> PropertyTypeDataType(String name, Class<T> widgetClass)
     {
         this.name = name;
         this.widgetClass = widgetClass;
@@ -53,17 +54,9 @@ public enum PropertyTypeDataType
         return this.name;
     }
 
-    public Widget representedAs()
+    @SuppressWarnings("unchecked")
+    public <T extends Widget & Fillable> Class<T> representedAs()
     {
-        try
-        {
-            return widgetClass.newInstance();
-        } catch (InstantiationException ex)
-        {
-            throw new RuntimeException(ex);
-        } catch (IllegalAccessException ex)
-        {
-            throw new RuntimeException(ex);
-        }
+        return (Class<T>) widgetClass;
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Representable.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Representable.java
index 2ccf348d20a15b69431f0fbb2904a26767e8c809..d7e87c1a14e35e442f37c0d571dce89673b338f5 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Representable.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Representable.java
@@ -16,8 +16,8 @@
 
 package ch.systemsx.cisd.openbis.uitest.type;
 
-import ch.systemsx.cisd.openbis.uitest.widget.Fillable;
-import ch.systemsx.cisd.openbis.uitest.widget.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/AlertMessageBox.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/AlertMessageBox.java
index 98f971d490dd73fbd0ab240094e5e6c5b050514d..94c132e8e2b289d37b735005a51b9d739959db64 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/AlertMessageBox.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/AlertMessageBox.java
@@ -16,15 +16,27 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public class AlertMessageBox extends Widget
+public class AlertMessageBox implements Contextual
 {
+
+    private WidgetWebElement context;
+
     public void dismiss()
     {
-        Button ok = find(".//button[text()=\"OK\"]").handleAs(Button.class);
+        Button ok = context.find(".//button[text()=\"OK\"]", Button.class);
         ok.click();
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Button.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Button.java
index 32e776acd77daa5300daf76f3babc150bf1e544c..480aca59458985da47c91f23487bcd4c25418ef6 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Button.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Button.java
@@ -16,13 +16,18 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.WebElement;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
 
 /**
  * @author anttil
  */
-public class Button extends Widget
+public class Button implements Widget
 {
+
+    private WidgetWebElement context;
+
     public void click()
     {
         context.click();
@@ -30,14 +35,18 @@ public class Button extends Widget
 
     public boolean isPressed()
     {
-        WebElement button;
-        if (context.getTagName().equals("button"))
-        {
-            button = context;
-        } else
-        {
-            button = find(".//button").getContext();
-        }
-        return "true".equalsIgnoreCase(button.getAttribute("aria-pressed"));
+        return "true".equalsIgnoreCase(context.getAttribute("aria-pressed"));
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "button";
+    }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Checkbox.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Checkbox.java
index e2c25b8b05d25f0eae902b327a97687b22b3eb84..0227f69eb6d045956a68af2883d18304bdd7ef10 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Checkbox.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Checkbox.java
@@ -16,19 +16,24 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.WebElement;
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
 
 /**
  * @author anttil
  */
-public class Checkbox extends Widget implements Fillable
+public class Checkbox implements Widget, Fillable
 {
+
+    private WidgetWebElement context;
+
     public void set(boolean value)
     {
-        WebElement input = find("input").getContext();
-        if (input.getAttribute("checked") != null ^ value)
+        if (context.getAttribute("checked") != null ^ value)
         {
-            input.click();
+            context.click();
         }
     }
 
@@ -37,4 +42,16 @@ public class Checkbox extends Widget implements Fillable
     {
         set("true".equalsIgnoreCase(string));
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "input";
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DeletionConfirmationBox.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DeletionConfirmationBox.java
index 043a9a48daa4908e084b36c55655759da39a6506..cbdf376ced4b3d452a534979a809589f3f45618d 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DeletionConfirmationBox.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DeletionConfirmationBox.java
@@ -16,16 +16,20 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
 /**
  * @author anttil
  */
-public class DeletionConfirmationBox extends Widget
+public class DeletionConfirmationBox implements Contextual
 {
+    private WidgetWebElement context;
+
     public void confirm(String reason)
     {
-        TextArea text = find(".//textarea").handleAs(TextArea.class);
+        TextArea text = context.find(".//textarea", TextArea.class);
         text.write(reason);
-
         getOkButton().click();
     }
 
@@ -36,6 +40,12 @@ public class DeletionConfirmationBox extends Widget
 
     private Button getOkButton()
     {
-        return find(".//button[text()=\"OK\"]").handleAs(Button.class);
+        return context.find(".//button[text()=\"OK\"]", Button.class);
+    }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DropDown.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DropDown.java
index 8bed7177f2677393337e4c5f3ffb8ae5d2c90d74..653495d82612c0acab81e9b937422f98d2a1f4c0 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DropDown.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/DropDown.java
@@ -25,13 +25,18 @@ import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.interactions.Actions;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 import ch.systemsx.cisd.openbis.uitest.suite.SeleniumTest;
 
 /**
  * @author anttil
  */
-public class DropDown extends Widget implements Fillable
+public class DropDown implements Widget, Fillable
 {
+    private WidgetWebElement context;
+
     public void select(String text)
     {
         Collection<String> found = new HashSet<String>();
@@ -60,8 +65,7 @@ public class DropDown extends Widget implements Fillable
 
     private List<WebElement> getChoiceElements()
     {
-        WebElement opener = find(".//img").getContext();
-        opener.click();
+        context.click();
         return SeleniumTest.driver.findElements(By.className("x-combo-list-item"));
     }
 
@@ -71,4 +75,16 @@ public class DropDown extends Widget implements Fillable
         select(string);
     }
 
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "img";
+    }
+
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Widget.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Dynamic.java
similarity index 54%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Widget.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Dynamic.java
index 8abaeaa3f211e65c5eeb0454adc060525bc37608..a66984713e3d011bf2243b21b36fd1f618a36616 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Widget.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Dynamic.java
@@ -16,48 +16,24 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import java.util.List;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebElement;
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public abstract class Widget
+public class Dynamic implements Contextual
 {
-    protected WebElement context;
-
-    public void setContext(WebElement context)
-    {
-        this.context = context;
-    }
-
-    public WebElement getContext()
-    {
-        return context;
-    }
 
-    protected Widget find(String xpath)
-    {
-        Widget w = new Widget()
-            {
-            };
-        w.setContext(context.findElement(By.xpath(xpath)));
-        return w;
-    }
+    private WidgetWebElement context;
 
-    protected List<WebElement> findAll(String xpath)
+    public Contextual define(Class<? extends Contextual> clazz)
     {
-        return context.findElements(By.xpath(xpath));
-    }
-
-    public <T extends Widget> T handleAs(Class<T> clazz)
-    {
-        T t;
+        Contextual widget;
         try
         {
-            t = clazz.newInstance();
+            widget = clazz.newInstance();
         } catch (InstantiationException ex)
         {
             throw new RuntimeException(ex);
@@ -65,7 +41,24 @@ public abstract class Widget
         {
             throw new RuntimeException(ex);
         }
-        t.setContext(context);
-        return t;
+
+        if (widget instanceof Widget)
+        {
+            Widget w = (Widget) widget;
+            if (!w.getTagName().equals(context.getTagName()))
+            {
+                widget.setContext(new WidgetWebElement(context.find(".//" + w.getTagName())));
+                return widget;
+            }
+        }
+        widget.setContext(this.context);
+        return widget;
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java
index 799de2351137690d89f0a1db428a9d5c0e5969e7..6d61a184bec4724f40c7b6f89faaab61a49f0e93 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java
@@ -16,18 +16,22 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Action;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WaitForRefreshOf;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public class FilterToolBar extends Widget
+public class FilterToolBar implements Contextual
 {
 
+    private WidgetWebElement context;
+
     public void setCode(final String text, Grid refreshingGrid)
     {
-        final Text t = find(".//input[contains(@id, 'Code-input')]").handleAs(Text.class);
+        final Text t = context.find(".//input[contains(@id, 'Code-input')]", Text.class);
 
         new WaitForRefreshOf(refreshingGrid).after(new Action()
             {
@@ -42,7 +46,13 @@ public class FilterToolBar extends Widget
 
     public void reset()
     {
-        Button b = find(".//button[text()='Reset']").handleAs(Button.class);
+        Button b = context.find(".//button[text()='Reset']", Button.class);
         b.click();
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Form.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Form.java
index a555229a209fc2d320a1c7e6eae9db24308eecfc..81a0e8d302cd9b9bda133fa288832d52520cb6a1 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Form.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Form.java
@@ -22,23 +22,46 @@ import java.util.List;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyType;
 
 /**
  * @author anttil
  */
-public class Form extends Widget
+public class Form implements Contextual
 {
+    private WidgetWebElement context;
+
     public Widget getWidget(PropertyType type)
     {
-        List<WebElement> elements = findAll(".//form/div/label");
+        List<WebElement> elements = context.findAll(".//form/div/label");
 
         for (WebElement element : elements)
         {
             if (element.getText().toLowerCase().startsWith(type.getLabel().toLowerCase()))
             {
-                Widget w = type.getDataType().representedAs();
-                w.setContext(element.findElement(By.xpath("../div/div")));
+
+                Widget w;
+                try
+                {
+                    w = type.getDataType().representedAs().newInstance();
+                } catch (InstantiationException ex)
+                {
+                    throw new RuntimeException(ex);
+                } catch (IllegalAccessException ex)
+                {
+                    throw new RuntimeException(ex);
+                }
+
+                WebElement e = element.findElement(By.xpath("../div/div"));
+                if (w.getTagName() != null && !e.getTagName().equals(w.getTagName()))
+                {
+                    e = e.findElement(By.xpath(".//" + w.getTagName()));
+                }
+
+                w.setContext(new WidgetWebElement(e));
                 return w;
             }
         }
@@ -48,11 +71,17 @@ public class Form extends Widget
     public List<String> getLabels()
     {
         List<String> labels = new ArrayList<String>();
-        List<WebElement> elements = findAll(".//form/div/label");
+        List<WebElement> elements = context.findAll(".//form/div/label");
         for (WebElement element : elements)
         {
             labels.add(element.getText());
         }
         return labels;
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java
index 3b5ea166c691bbef0b723c1818bd77d89f48360b..f8f4e568ff3aef0e0266066395926fad5a557cf1 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java
@@ -25,16 +25,20 @@ import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.Refreshing;
 import ch.systemsx.cisd.openbis.uitest.infra.Row;
-import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Refreshing;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 import ch.systemsx.cisd.openbis.uitest.suite.SeleniumTest;
 
 /**
  * @author anttil
  */
-public class Grid extends Widget implements Refreshing
+public class Grid implements Contextual, Refreshing
 {
 
+    private WidgetWebElement context;
+
     public Row select(String column, String value)
     {
 
@@ -90,19 +94,20 @@ public class Grid extends Widget implements Refreshing
 
     private List<WebElement> getColumns()
     {
-        return findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-header ')]//span[not(*)]");
+        return context
+                .findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-header ')]//span[not(*)]");
     }
 
     private List<WebElement> getCells()
     {
-        SeleniumTest.driver.manage().timeouts().implicitlyWait(500, TimeUnit.MILLISECONDS);
+        SeleniumTest.setImplicitWait(500, TimeUnit.MILLISECONDS);
         try
         {
-            return findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-col ')]//*[not(*)]");
+            return context
+                    .findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-col ')]//*[not(*)]");
         } finally
         {
-            SeleniumTest.driver.manage().timeouts().implicitlyWait(SeleniumTest.IMPLICIT_WAIT,
-                    TimeUnit.SECONDS);
+            SeleniumTest.setImplicitWaitToDefault();
         }
     }
 
@@ -135,4 +140,10 @@ public class Grid extends Widget implements Refreshing
     {
         return "" + this.getCells().size();
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Link.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Link.java
index c8d4a0f8e4ae88ccb80f85b7ad0e4f6df20878aa..f93b17bf78fecf15802d44849948a2f0676609a2 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Link.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Link.java
@@ -16,15 +16,16 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.interactions.Actions;
-
-import ch.systemsx.cisd.openbis.uitest.suite.SeleniumTest;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public class Link extends Widget
+public class Link implements Widget
 {
+    private WidgetWebElement context;
+
     public void click()
     {
         context.click();
@@ -32,7 +33,18 @@ public class Link extends Widget
 
     public void highlight()
     {
-        Actions builder = new Actions(SeleniumTest.driver);
-        builder.moveToElement(context).build().perform();
+        context.mouseOver();
+    }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "a";
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java
index c5f767137196e76a4f8df37d237cfea5093035f9..66c9036f6bc5fc5171b62a7c26494a6b2120ee0f 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java
@@ -16,19 +16,29 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public class PagingToolBar extends Widget
+public class PagingToolBar implements Contextual
 {
 
+    private WidgetWebElement context;
+
     public void filters()
     {
-        Button b = find(".//button[text()='Filters']").handleAs(Button.class);
+        Button b = context.find(".//button[text()='Filters']", Button.class);
         if (!b.isPressed())
         {
             b.click();
         }
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/SubmitButton.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/SubmitButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fc59c4430e154e6d0655a780769ce179139b437
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/SubmitButton.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.uitest.widget;
+
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
+/**
+ * @author anttil
+ */
+public class SubmitButton implements Widget
+{
+
+    private WidgetWebElement context;
+
+    public void click()
+    {
+        context.click();
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "input";
+    }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java
index c27cbd56a6f45724558961435a14741ca27a51d3..24053f5cdbed70638f42070c7b78fea36d8abebe 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java
@@ -16,45 +16,50 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.WebElement;
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
 
 /**
  * @author anttil
  */
-public class Text extends Widget implements Fillable
+public class Text implements Widget, Fillable
 {
+    private WidgetWebElement context;
+
     public void write(String text)
     {
-        WebElement element = getInputElement();
-        element.clear();
-        element.sendKeys(text);
+        context.clear();
+        context.sendKeys(text);
     }
 
     public void clear()
     {
-        getInputElement().clear();
+        context.clear();
     }
 
     public void append(String text)
     {
-        getInputElement().sendKeys(text);
+        context.sendKeys(text);
     }
 
-    private WebElement getInputElement()
+    @Override
+    public void fillWith(String string)
     {
-        if (context.getTagName().equals("input"))
-        {
-            return context;
-        } else
-        {
-            return find("input").getContext();
-        }
+        write(string);
     }
 
     @Override
-    public void fillWith(String string)
+    public void setContext(WidgetWebElement context)
     {
-        write(string);
+        this.context = context;
+    }
+
+    @Override
+    public String getTagName()
+    {
+        return "input";
     }
 
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TextArea.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TextArea.java
index e4cc7a41e11d42f7f91abeffff383bc582a33648..46ae4ac7547f2cf3fb057db93fca0bf903d80a43 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TextArea.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TextArea.java
@@ -16,28 +16,31 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.WebElement;
+import ch.systemsx.cisd.openbis.uitest.infra.Fillable;
+import ch.systemsx.cisd.openbis.uitest.infra.Widget;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
 
 /**
  * @author anttil
  */
-public class TextArea extends Widget implements Fillable
+public class TextArea implements Widget, Fillable
 {
+    private WidgetWebElement context;
+
     public void write(String text)
     {
-        WebElement element = getElement();
-        element.clear();
-        element.sendKeys(text);
+        context.clear();
+        context.sendKeys(text);
     }
 
     public void clear()
     {
-        getElement().clear();
+        context.clear();
     }
 
     public void append(String text)
     {
-        getElement().sendKeys(text);
+        context.sendKeys(text);
     }
 
     @Override
@@ -46,14 +49,15 @@ public class TextArea extends Widget implements Fillable
         write(string);
     }
 
-    private WebElement getElement()
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
+
+    @Override
+    public String getTagName()
     {
-        if (context.getTagName().equals("textarea"))
-        {
-            return context;
-        } else
-        {
-            return find(".//textarea").getContext();
-        }
+        return "textarea";
     }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TreeGrid.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TreeGrid.java
index c7c86e1ff87752c1feb87e83ffa6e58ed5923644..4da7211cdc8af33f1bc3ad5f12da244e5600a464 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TreeGrid.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/TreeGrid.java
@@ -22,14 +22,19 @@ import java.util.List;
 
 import org.openqa.selenium.WebElement;
 
+import ch.systemsx.cisd.openbis.uitest.infra.Contextual;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetWebElement;
+
 /**
  * @author anttil
  */
-public class TreeGrid extends Widget
+public class TreeGrid implements Contextual
 {
+    private WidgetWebElement context;
+
     public void select(String label)
     {
-        List<WebElement> elements = findAll(".//span[not(*) and @class='gwt-InlineHTML']");
+        List<WebElement> elements = context.findAll(".//span[not(*) and @class='gwt-InlineHTML']");
 
         Collection<String> found = new ArrayList<String>();
         for (WebElement element : elements)
@@ -47,4 +52,10 @@ public class TreeGrid extends Widget
         throw new IllegalArgumentException("Selection " + label + " not found - these were found: "
                 + found);
     }
+
+    @Override
+    public void setContext(WidgetWebElement context)
+    {
+        this.context = context;
+    }
 }