From c454bc7054f1a791a0b046eb8bb9f853a9e89e50 Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Thu, 20 Sep 2012 12:37:19 +0000
Subject: [PATCH] SWE-2 / SP-263: Working towards controlling the filters in
 all the browsing pages

SVN: 26703
---
 .../uitest/infra/ApplicationRunner.java       | 38 ++--------
 .../cisd/openbis/uitest/infra/Browsable.java  |  1 -
 .../cisd/openbis/uitest/infra/Browser.java    |  2 -
 .../uitest/{page/common => infra}/Cell.java   | 13 +---
 .../cisd/openbis/uitest/infra/Filterable.java | 27 +++++++
 .../uitest/{page/common => infra}/Row.java    |  2 +-
 .../matcher/BrowserListsElementMatcher.java   |  3 +-
 .../infra/matcher/CellDisplaysMatcher.java    |  2 +-
 .../infra/matcher/CellLinksToMatcher.java     |  2 +-
 .../uitest/infra/webdriver/Refreshing.java    | 25 +++++++
 .../infra/webdriver/WaitForRefreshOf.java     | 49 ++++++++++++
 .../uitest/page/{common => menu}/TopBar.java  |  2 +-
 .../uitest/page/tab/ExperimentBrowser.java    |  4 +-
 .../page/tab/ExperimentTypeBrowser.java       |  4 +-
 .../page/{common => tab}/LoginPage.java       |  2 +-
 .../uitest/page/tab/ProjectBrowser.java       |  4 +-
 .../tab/PropertyTypeAssignmentBrowser.java    |  4 +-
 .../uitest/page/tab/PropertyTypeBrowser.java  |  4 +-
 .../page/tab/RoleAssignmentBrowser.java       |  4 +-
 .../uitest/page/tab/SampleBrowser.java        |  4 +-
 .../uitest/page/tab/SampleTypeBrowser.java    |  4 +-
 .../openbis/uitest/page/tab/SpaceBrowser.java | 56 +++++++++++++-
 .../uitest/page/tab/VocabularyBrowser.java    |  4 +-
 .../uitest/suite/AuthorizationTest.java       |  4 +-
 .../openbis/uitest/suite/SeleniumTest.java    |  2 +-
 .../cisd/openbis/uitest/suite/SpaceTest.java  |  2 +-
 .../cisd/openbis/uitest/type/Experiment.java  |  4 +-
 .../openbis/uitest/type/ExperimentType.java   |  4 +-
 .../cisd/openbis/uitest/type/Project.java     |  4 +-
 .../openbis/uitest/type/PropertyType.java     |  4 +-
 .../uitest/type/PropertyTypeAssignment.java   |  4 +-
 .../cisd/openbis/uitest/type/Sample.java      |  4 +-
 .../cisd/openbis/uitest/type/SampleType.java  |  4 +-
 .../cisd/openbis/uitest/type/Space.java       |  4 +-
 .../cisd/openbis/uitest/type/Vocabulary.java  |  4 +-
 .../uitest/widget/AlertMessageBox.java        |  3 +-
 .../cisd/openbis/uitest/widget/Button.java    | 13 +++-
 .../cisd/openbis/uitest/widget/Checkbox.java  |  3 +-
 .../widget/DeletionConfirmationBox.java       |  7 +-
 .../cisd/openbis/uitest/widget/DropDown.java  |  2 +-
 .../openbis/uitest/widget/FilterToolBar.java  | 38 ++++++++++
 .../cisd/openbis/uitest/widget/Form.java      |  4 +-
 .../cisd/openbis/uitest/widget/Grid.java      | 75 +++++++++++++++----
 .../openbis/uitest/widget/PagingToolBar.java  | 37 +++++++++
 .../cisd/openbis/uitest/widget/Text.java      |  3 +-
 .../cisd/openbis/uitest/widget/TextArea.java  |  8 +-
 .../cisd/openbis/uitest/widget/TreeGrid.java  |  4 +-
 .../cisd/openbis/uitest/widget/Widget.java    | 13 ++++
 48 files changed, 380 insertions(+), 134 deletions(-)
 rename ui-test/source/java/ch/systemsx/cisd/openbis/uitest/{page/common => infra}/Cell.java (81%)
 create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Filterable.java
 rename ui-test/source/java/ch/systemsx/cisd/openbis/uitest/{page/common => infra}/Row.java (95%)
 create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Refreshing.java
 create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java
 rename ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/{common => menu}/TopBar.java (96%)
 rename ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/{common => tab}/LoginPage.java (95%)
 create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java
 create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java

diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/ApplicationRunner.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/ApplicationRunner.java
index 47e3eccd8e3..6eca934070d 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/ApplicationRunner.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/ApplicationRunner.java
@@ -18,8 +18,6 @@ package ch.systemsx.cisd.openbis.uitest.infra;
 
 import ch.systemsx.cisd.openbis.uitest.infra.uid.UidGenerator;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.PageProxy;
-import ch.systemsx.cisd.openbis.uitest.page.common.LoginPage;
-import ch.systemsx.cisd.openbis.uitest.page.common.TopBar;
 import ch.systemsx.cisd.openbis.uitest.page.dialog.AddExperimentTypeDialog;
 import ch.systemsx.cisd.openbis.uitest.page.dialog.AddSampleTypeDialog;
 import ch.systemsx.cisd.openbis.uitest.page.dialog.AddSpaceDialog;
@@ -30,12 +28,14 @@ import ch.systemsx.cisd.openbis.uitest.page.menu.AuthorizationMenu;
 import ch.systemsx.cisd.openbis.uitest.page.menu.BrowseMenu;
 import ch.systemsx.cisd.openbis.uitest.page.menu.MetadataMenu;
 import ch.systemsx.cisd.openbis.uitest.page.menu.NewMenu;
+import ch.systemsx.cisd.openbis.uitest.page.menu.TopBar;
 import ch.systemsx.cisd.openbis.uitest.page.menu.TypesMenu;
 import ch.systemsx.cisd.openbis.uitest.page.menu.UserMenu;
 import ch.systemsx.cisd.openbis.uitest.page.tab.AddPropertyType;
 import ch.systemsx.cisd.openbis.uitest.page.tab.AssignSamplePropertyType;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ExperimentBrowser;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ExperimentTypeBrowser;
+import ch.systemsx.cisd.openbis.uitest.page.tab.LoginPage;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ProjectBrowser;
 import ch.systemsx.cisd.openbis.uitest.page.tab.PropertyTypeAssignmentBrowser;
 import ch.systemsx.cisd.openbis.uitest.page.tab.PropertyTypeBrowser;
@@ -89,34 +89,10 @@ public class ApplicationRunner
 
     public void delete(Space space)
     {
-        /*
         SpaceBrowser browser = browseToSpaceBrowser();
-
-        PagingToolBar paging = get(PagingToolBar.class);
-        paging.showFilters();
-
-        FilterToolBar bar = get(FilterToolBar.class).reset();
-        Widget filter = null;
-        for (Widget widget : bar.getFilters()) {
-            if (widget.getValue().equalsIgnoreCase("code")) {
-                filter  = widget;
-            }
-        }
-        if (filter == null) {
-            Setting settings = paging.settings();
-            settings.enableFilter("Code");
-        }
-        // then re-find filter
-        
-        filter.write(space.code();
-        
-        Row row = browser.getRow(space);
-        if (row != null)
-        {
-            row.select();
-            browser.deleteSelection();
-        }
-        */
+        browser.filter(space.getCode());
+        browser.select(space);
+        browser.delete();
     }
 
     public Project create(Project project)
@@ -249,7 +225,9 @@ public class ApplicationRunner
     {
         getMenus().admin();
         load(AdminMenu.class).spaces();
-        return load(SpaceBrowser.class);
+        SpaceBrowser browser = load(SpaceBrowser.class);
+        browser.resetFilters();
+        return browser;
     }
 
     public ProjectBrowser browseToProjectBrowser()
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browsable.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browsable.java
index 5b91eef45fc..502bc5b563e 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browsable.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browsable.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.infra;
 
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browser.java
index 013edb56a2b..06d7a15e7b7 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Browser.java
@@ -16,8 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.infra;
 
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Cell.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Cell.java
similarity index 81%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Cell.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Cell.java
index 0f981d4b1e4..e704e0bb481 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Cell.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Cell.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.page.common;
+package ch.systemsx.cisd.openbis.uitest.infra;
 
-import org.openqa.selenium.WebElement;
 
 /**
  * @author anttil
@@ -27,13 +26,10 @@ public class Cell
 
     private final String url;
 
-    private final WebElement element;
-
-    public Cell(String text, String url, WebElement element)
+    public Cell(String text, String url)
     {
         this.text = text;
         this.url = url;
-        this.element = element;
     }
 
     public String getText()
@@ -46,11 +42,6 @@ public class Cell
         return url;
     }
 
-    public WebElement getElement()
-    {
-        return this.element;
-    }
-
     public boolean hasLink()
     {
         return this.url != null;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Filterable.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Filterable.java
new file mode 100644
index 00000000000..5a4de0c1c82
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Filterable.java
@@ -0,0 +1,27 @@
+/*
+ * 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 Filterable
+{
+    public void filter(String code);
+
+    public void resetFilters();
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Row.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Row.java
similarity index 95%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Row.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Row.java
index 698dde00b6a..8fbf677284e 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/Row.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/Row.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.page.common;
+package ch.systemsx.cisd.openbis.uitest.infra;
 
 import java.util.Map;
 
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/BrowserListsElementMatcher.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/BrowserListsElementMatcher.java
index 0945747f61f..be8a3875e19 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/BrowserListsElementMatcher.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/BrowserListsElementMatcher.java
@@ -21,7 +21,7 @@ import org.hamcrest.TypeSafeMatcher;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
@@ -45,7 +45,6 @@ public class BrowserListsElementMatcher<T extends Browsable, U extends Browser<T
     @Override
     public boolean matchesSafely(U browser)
     {
-
         Row row = browser.row(expected);
         if (row.exists())
         {
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellDisplaysMatcher.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellDisplaysMatcher.java
index 63c63c9306c..e33e2fbb61c 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellDisplaysMatcher.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellDisplaysMatcher.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.uitest.infra.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellLinksToMatcher.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellLinksToMatcher.java
index 351701f65be..4990bb93398 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellLinksToMatcher.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/matcher/CellLinksToMatcher.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.uitest.infra.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 
 /**
  * @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/webdriver/Refreshing.java
new file mode 100644
index 00000000000..369103f9652
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Refreshing.java
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+/**
+ * @author anttil
+ */
+public interface Refreshing
+{
+    public boolean hasRefreshed();
+}
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
new file mode 100644
index 00000000000..5ebe8131da4
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/WaitForRefreshOf.java
@@ -0,0 +1,49 @@
+/*
+ * 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.concurrent.TimeUnit;
+
+import org.openqa.selenium.support.ui.FluentWait;
+
+import com.google.common.base.Predicate;
+
+/**
+ * @author anttil
+ */
+public class WaitForRefreshOf extends FluentWait<Refreshing>
+{
+
+    public WaitForRefreshOf(Refreshing widget)
+    {
+        super(widget);
+    }
+
+    public void withTimeoutOf(int seconds)
+    {
+        this.withTimeout(seconds, TimeUnit.SECONDS)
+                .pollingEvery(100, TimeUnit.MILLISECONDS)
+                .until(new Predicate<Refreshing>()
+                    {
+                        @Override
+                        public boolean apply(Refreshing widget)
+                        {
+                            return widget.hasRefreshed();
+                        }
+                    });
+    }
+}
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/TopBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TopBar.java
similarity index 96%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/TopBar.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TopBar.java
index 47f27b166a8..1405297b88c 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/TopBar.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TopBar.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.page.common;
+package ch.systemsx.cisd.openbis.uitest.page.menu;
 
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentBrowser.java
index 3545589586e..5ebf219f997 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentBrowser.java
@@ -17,10 +17,10 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Lazy;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.Experiment;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.DeletionConfirmationBox;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentTypeBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentTypeBrowser.java
index a4f64a22f52..1b15fc476c3 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentTypeBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ExperimentTypeBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.ExperimentType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/LoginPage.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
similarity index 95%
rename from ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/LoginPage.java
rename to ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
index 6c417e1c42d..77c1faa36a3 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/common/LoginPage.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/LoginPage.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.uitest.page.common;
+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;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ProjectBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ProjectBrowser.java
index 06854817381..d3fd5b13a59 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ProjectBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/ProjectBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.Project;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeAssignmentBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeAssignmentBrowser.java
index 2dcec5c6d1d..1f64e2f1055 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeAssignmentBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeAssignmentBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyTypeAssignment;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeBrowser.java
index abbbdf47700..728586cc953 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/PropertyTypeBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.PropertyType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RoleAssignmentBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RoleAssignmentBrowser.java
index 9ddf53a4377..81e9bd32f92 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RoleAssignmentBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/RoleAssignmentBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.Experiment;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleBrowser.java
index 651e0874433..79f0d8982be 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleBrowser.java
@@ -19,9 +19,9 @@ package ch.systemsx.cisd.openbis.uitest.page.tab;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.Sample;
 import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleTypeBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleTypeBrowser.java
index 55dd61db7b8..e4be935b1e3 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleTypeBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SampleTypeBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.SampleType;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SpaceBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SpaceBrowser.java
index dbb1793df85..04132c0a9d6 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SpaceBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/SpaceBrowser.java
@@ -17,14 +17,20 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Filterable;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Lazy;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WaitForRefreshOf;
 import ch.systemsx.cisd.openbis.uitest.type.Space;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
+import ch.systemsx.cisd.openbis.uitest.widget.DeletionConfirmationBox;
+import ch.systemsx.cisd.openbis.uitest.widget.FilterToolBar;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
+import ch.systemsx.cisd.openbis.uitest.widget.PagingToolBar;
 
-public class SpaceBrowser implements Browser<Space>
+public class SpaceBrowser implements Browser<Space>, Filterable
 {
 
     @Locate("openbis_space-browser-grid")
@@ -33,15 +39,36 @@ public class SpaceBrowser implements Browser<Space>
     @Locate("openbis_space-browser_add-button")
     private Button addSpace;
 
-    @SuppressWarnings("unused")
     @Locate("openbis_space-browser_delete-button")
     private Button delete;
 
+    @Locate("openbis_space-browser-grid-paging-toolbar")
+    private PagingToolBar paging;
+
+    @Lazy
+    @Locate("openbis_space-browser-grid-filter-toolbar")
+    private FilterToolBar filters;
+
+    @Lazy
+    @Locate("deletion-confirmation-dialog")
+    private DeletionConfirmationBox confimDeletion;
+
     public void addSpace()
     {
         addSpace.click();
     }
 
+    public void select(Space space)
+    {
+        grid.select(space.getCode());
+    }
+
+    public void delete()
+    {
+        delete.click();
+        confimDeletion.confirm("WebDriver");
+    }
+
     @Override
     public Row row(Space space)
     {
@@ -54,4 +81,25 @@ public class SpaceBrowser implements Browser<Space>
         return row(space).get(column);
     }
 
+    @Override
+    public void filter(String filter)
+    {
+        paging.filters();
+        filters.setCode(filter);
+        new WaitForRefreshOf(grid).withTimeoutOf(10);
+    }
+
+    @Override
+    public void resetFilters()
+    {
+        paging.filters();
+        filters.reset();
+    }
+
+    @Override
+    public String toString()
+    {
+        String s = "SpaceBrowser\n==========\n";
+        return s + grid.toString();
+    }
 }
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/VocabularyBrowser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/VocabularyBrowser.java
index 7314011baae..702169a6100 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/VocabularyBrowser.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/VocabularyBrowser.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.page.tab;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Locate;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
 import ch.systemsx.cisd.openbis.uitest.type.Vocabulary;
 import ch.systemsx.cisd.openbis.uitest.widget.Button;
 import ch.systemsx.cisd.openbis.uitest.widget.Grid;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/AuthorizationTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/AuthorizationTest.java
index ad5a5f2ab19..11a7ff86cb4 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/AuthorizationTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/AuthorizationTest.java
@@ -5,9 +5,9 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.uitest.infra.User;
-import ch.systemsx.cisd.openbis.uitest.page.common.LoginPage;
-import ch.systemsx.cisd.openbis.uitest.page.common.TopBar;
 import ch.systemsx.cisd.openbis.uitest.page.dialog.InvalidPasswordDialog;
+import ch.systemsx.cisd.openbis.uitest.page.menu.TopBar;
+import ch.systemsx.cisd.openbis.uitest.page.tab.LoginPage;
 import ch.systemsx.cisd.openbis.uitest.page.tab.RoleAssignmentBrowser;
 
 @Test(groups =
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 8ba8fe12bef..4405576f088 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
@@ -37,6 +37,7 @@ import org.testng.annotations.BeforeSuite;
 import ch.systemsx.cisd.openbis.uitest.infra.ApplicationRunner;
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
 import ch.systemsx.cisd.openbis.uitest.infra.Browser;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 import ch.systemsx.cisd.openbis.uitest.infra.User;
 import ch.systemsx.cisd.openbis.uitest.infra.matcher.BrowserListsElementMatcher;
 import ch.systemsx.cisd.openbis.uitest.infra.matcher.CellDisplaysMatcher;
@@ -49,7 +50,6 @@ import ch.systemsx.cisd.openbis.uitest.infra.screenshot.ScreenShotter;
 import ch.systemsx.cisd.openbis.uitest.infra.uid.DictionaryUidGenerator;
 import ch.systemsx.cisd.openbis.uitest.infra.uid.UidGenerator;
 import ch.systemsx.cisd.openbis.uitest.infra.webdriver.PageProxy;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ExperimentBrowser;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ExperimentTypeBrowser;
 import ch.systemsx.cisd.openbis.uitest.page.tab.ProjectBrowser;
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SpaceTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SpaceTest.java
index f43bc9dce0a..72c01ace581 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SpaceTest.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SpaceTest.java
@@ -19,7 +19,7 @@ public class SpaceTest extends SeleniumTest
         assertThat(spaceBrowser(), lists(space));
     }
 
-    @Test(enabled = false)
+    @Test
     public void deletedSpaceIsRemovedFromSpaceBrowser() throws Exception
     {
         Space space = create(aSpace());
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Experiment.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Experiment.java
index d85acf7bc31..e7b60d7d351 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Experiment.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Experiment.java
@@ -19,9 +19,9 @@ package ch.systemsx.cisd.openbis.uitest.type;
 import java.util.Collection;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 import ch.systemsx.cisd.openbis.uitest.infra.EntityType;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/ExperimentType.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/ExperimentType.java
index 5b1184103de..efc5055c2c6 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/ExperimentType.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/ExperimentType.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.uitest.type;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Project.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Project.java
index c3aeb540329..1b77fb4e692 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Project.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Project.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.uitest.type;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyType.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyType.java
index 4df78f5c1d5..5eb89d76ee7 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyType.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyType.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.uitest.type;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeAssignment.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeAssignment.java
index d7d8d6c98a4..23184a1de6d 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeAssignment.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/PropertyTypeAssignment.java
@@ -17,9 +17,9 @@
 package ch.systemsx.cisd.openbis.uitest.type;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 import ch.systemsx.cisd.openbis.uitest.infra.EntityType;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Sample.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Sample.java
index f9ba77d5b6b..240ad875127 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Sample.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Sample.java
@@ -20,9 +20,9 @@ import java.util.Collection;
 import java.util.Map;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 import ch.systemsx.cisd.openbis.uitest.infra.EntityType;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/SampleType.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/SampleType.java
index 80b1277d161..b044b3ffc58 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/SampleType.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/SampleType.java
@@ -19,9 +19,9 @@ package ch.systemsx.cisd.openbis.uitest.type;
 import java.util.Collection;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
 import ch.systemsx.cisd.openbis.uitest.infra.EntityType;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Space.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Space.java
index 72ae1959a30..09f36908edc 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Space.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Space.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.uitest.type;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @author anttil
diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Vocabulary.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Vocabulary.java
index d559148cc40..742678b7e42 100644
--- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Vocabulary.java
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/type/Vocabulary.java
@@ -19,8 +19,8 @@ package ch.systemsx.cisd.openbis.uitest.type;
 import java.util.Set;
 
 import ch.systemsx.cisd.openbis.uitest.infra.Browsable;
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
 
 /**
  * @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 d965666bf9f..a16ba6cc6d4 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,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -26,7 +25,7 @@ public class AlertMessageBox extends Widget
 {
     public void dismiss()
     {
-        WebElement ok = context.findElement(By.xpath(".//button[text()=\"OK\"]"));
+        WebElement ok = find(".//button[text()=\"OK\"]");
         ok.click();
     }
 }
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 f72c044e975..cfdb31783be 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,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
 
 /**
  * @author anttil
@@ -30,7 +30,14 @@ public class Button extends Widget
 
     public boolean isPressed()
     {
-        return "true".equalsIgnoreCase(context.findElement(By.xpath(".//button")).getAttribute(
-                "aria-pressed"));
+        WebElement button;
+        if (context.getTagName().equals("button"))
+        {
+            button = context;
+        } else
+        {
+            button = find(".//button");
+        }
+        return "true".equalsIgnoreCase(button.getAttribute("aria-pressed"));
     }
 }
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 72571fbe167..6afa0d7fb58 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,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -26,7 +25,7 @@ public class Checkbox extends Widget implements Fillable
 {
     public void set(boolean value)
     {
-        WebElement input = context.findElement(By.xpath("input"));
+        WebElement input = find("input");
         if (input.getAttribute("checked") != null ^ value)
         {
             input.click();
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 5eda8fb6eea..ba600da29f5 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,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -27,16 +26,16 @@ public class DeletionConfirmationBox extends Widget
     public void confirm(String reason)
     {
 
-        WebElement text = context.findElement(By.xpath(".//textarea"));
+        WebElement text = find(".//textarea");
         text.sendKeys(reason);
 
-        WebElement ok = context.findElement(By.xpath(".//button[text()=\"OK\"]"));
+        WebElement ok = find(".//button[text()=\"OK\"]");
         ok.click();
     }
 
     public void confirm()
     {
-        WebElement ok = context.findElement(By.xpath(".//button[text()=\"OK\"]"));
+        WebElement ok = find(".//button[text()=\"OK\"]");
         ok.click();
     }
 }
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 0e2dddc75a2..3df548affcb 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
@@ -60,7 +60,7 @@ public class DropDown extends Widget implements Fillable
 
     private List<WebElement> getChoiceElements()
     {
-        WebElement opener = context.findElement(By.xpath(".//img"));
+        WebElement opener = find(".//img");
         opener.click();
         return SeleniumTest.driver.findElements(By.className("x-combo-list-item"));
     }
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
new file mode 100644
index 00000000000..2c1611ba0a8
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+/**
+ * @author anttil
+ */
+public class FilterToolBar extends Widget
+{
+
+    public void setCode(String text)
+    {
+        Text t = new Text();
+        t.setContext(find(".//input[contains(@id, 'Code-input')]"));
+        t.write(text);
+    }
+
+    public void reset()
+    {
+        Button b = new Button();
+        b.setContext(find(".//button[text()='Reset']"));
+        b.click();
+    }
+}
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 46fbe6cb305..da9bd363b07 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
@@ -29,7 +29,7 @@ public class Form extends Widget
 {
     public Widget getWidget(String label)
     {
-        List<WebElement> elements = context.findElements(By.xpath(".//form/div/label"));
+        List<WebElement> elements = findAll(".//form/div/label");
 
         for (WebElement element : elements)
         {
@@ -48,7 +48,7 @@ public class Form extends Widget
     public List<String> getLabels()
     {
         List<String> labels = new ArrayList<String>();
-        List<WebElement> elements = context.findElements(By.xpath(".//form/div/label"));
+        List<WebElement> elements = findAll(".//form/div/label");
         for (WebElement element : elements)
         {
             labels.add(element.getText());
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 08bcb527a9f..df20a668641 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
@@ -22,16 +22,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
-import ch.systemsx.cisd.openbis.uitest.page.common.Cell;
-import ch.systemsx.cisd.openbis.uitest.page.common.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.Cell;
+import ch.systemsx.cisd.openbis.uitest.infra.Row;
+import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Refreshing;
 
 /**
  * @author anttil
  */
-public class Grid extends Widget
+public class Grid extends Widget implements Refreshing
 {
 
     public Row getRow(String column, String value)
@@ -71,8 +71,7 @@ public class Grid extends Widget
 
         if (!found)
         {
-            throw new IllegalArgumentException("Row with value " + value + " in column " + column
-                    + " not found");
+            return new Row();
         }
 
         index = index - (index % numColumns);
@@ -82,23 +81,19 @@ public class Grid extends Widget
         {
             WebElement element = cells.get(i + index);
             m.put(columns.get(i).getText(),
-                    new Cell(element.getText(), element.getAttribute("href"), element));
+                    new Cell(element.getText(), element.getAttribute("href")));
         }
         return new Row(m);
     }
 
-    public List<WebElement> getColumns()
+    private List<WebElement> getColumns()
     {
-        return context
-                .findElements(By
-                        .xpath(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-header ')]//span[not(*)]"));
+        return findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-header ')]//span[not(*)]");
     }
 
-    public List<WebElement> getCells()
+    private List<WebElement> getCells()
     {
-        return context
-                .findElements(By
-                        .xpath(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-col ')]//*[not(*)]"));
+        return findAll(".//td[not(ancestor::div[contains(@style,'display:none')]) and contains(@class, 'x-grid') and contains(@class, '-col ')]//*[not(*)]");
     }
 
     public void select(String string)
@@ -117,4 +112,54 @@ public class Grid extends Widget
         throw new IllegalArgumentException("Grid does not contain element with text " + string
                 + ", found " + found);
     }
+
+    @Override
+    public String toString()
+    {
+        List<WebElement> columns = getColumns();
+        String s = "";
+        for (WebElement column : columns)
+        {
+            s += column.getText() + "\t";
+        }
+        s += "\n";
+
+        int counter = 0;
+        for (WebElement cell : getCells())
+        {
+            s += cell.getText() + "\t";
+            counter++;
+            if (counter % columns.size() == 0)
+            {
+                s += "\n";
+            }
+        }
+        return s;
+    }
+
+    boolean itsOn = false;
+
+    int last = 0;
+
+    @Override
+    public synchronized boolean hasRefreshed()
+    {
+        if (itsOn)
+        {
+            if (this.last != getCells().size())
+            {
+                this.itsOn = false;
+                return true;
+            } else
+            {
+                return false;
+            }
+        } else
+        {
+            itsOn = true;
+            this.last = getCells().size();
+            return false;
+        }
+
+    }
 }
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
new file mode 100644
index 00000000000..58ad8aa7591
--- /dev/null
+++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java
@@ -0,0 +1,37 @@
+/*
+ * 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 org.openqa.selenium.WebElement;
+
+/**
+ * @author anttil
+ */
+public class PagingToolBar extends Widget
+{
+
+    public void filters()
+    {
+        WebElement button = find(".//button[text()='Filters']");
+        Button b = new Button();
+        b.setContext(button);
+        if (!b.isPressed())
+        {
+            b.click();
+        }
+    }
+}
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 460a348ba7b..7656326fae6 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,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -48,7 +47,7 @@ public class Text extends Widget implements Fillable
             return context;
         } else
         {
-            return context.findElement(By.xpath("input"));
+            return find("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 1cc461fd439..1e1b84394a5 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,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -26,20 +25,20 @@ public class TextArea extends Widget implements Fillable
 {
     public void write(String text)
     {
-        WebElement element = context.findElement(By.xpath(".//textarea"));
+        WebElement element = find(".//textarea");
         element.clear();
         element.sendKeys(text);
     }
 
     public void clear()
     {
-        WebElement element = context.findElement(By.xpath(".//textarea"));
+        WebElement element = find(".//textarea");
         element.clear();
     }
 
     public void append(String text)
     {
-        WebElement element = context.findElement(By.xpath(".//textarea"));
+        WebElement element = find(".//textarea");
         element.sendKeys(text);
     }
 
@@ -48,5 +47,4 @@ public class TextArea extends Widget implements Fillable
     {
         write(string);
     }
-
 }
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 5836f55d593..c7c86e1ff87 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
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -30,8 +29,7 @@ public class TreeGrid extends Widget
 {
     public void select(String label)
     {
-        List<WebElement> elements =
-                context.findElements(By.xpath(".//span[not(*) and @class='gwt-InlineHTML']"));
+        List<WebElement> elements = findAll(".//span[not(*) and @class='gwt-InlineHTML']");
 
         Collection<String> found = new ArrayList<String>();
         for (WebElement element : elements)
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/Widget.java
index 1e4816fb507..5e0992453a1 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/Widget.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.uitest.widget;
 
+import java.util.List;
+
+import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 
 /**
@@ -35,6 +38,16 @@ public abstract class Widget
         return context;
     }
 
+    protected WebElement find(String xpath)
+    {
+        return context.findElement(By.xpath(xpath));
+    }
+
+    protected List<WebElement> findAll(String xpath)
+    {
+        return context.findElements(By.xpath(xpath));
+    }
+
     public <T extends Widget> T handleAs(Class<T> clazz)
     {
         T t;
-- 
GitLab