diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java
index 9d4f8f4bc0bc0eebcf390e4be161b9e5fcb2c815..8e3ae707bda271160d382269ab84cd8dd542c486 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search
 import java.util.ArrayList;
 import java.util.List;
 
+import com.extjs.gxt.ui.client.event.KeyboardEvents;
 import com.extjs.gxt.ui.client.widget.VerticalPanel;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
@@ -38,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
  */
 public class DetailedSearchCriteriaWidget extends VerticalPanel
 {
-
     public static final String FIRST_ID_SUFFIX = "_first";
 
     private final List<DetailedSearchCriterionWidget> criteriaWidgets;
@@ -78,6 +78,7 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel
         add(criterion);
         enableRemovalIfOneExists(false);
         layout();
+        criterion.focus();
     }
 
     /**
@@ -92,12 +93,30 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel
             criteriaWidgets.remove(w);
             remove(w);
             enableRemovalIfOneExists(false);
+
+            focusLastWidget();
         } else
         {
             w.reset();
         }
     }
 
+    /**
+     * Set focus on the last widget
+     */
+    private void focusLastWidget()
+    {
+        DetailedSearchCriterionWidget lastWidget = criteriaWidgets.get(criteriaWidgets.size() - 1);
+        lastWidget.focus();
+    }
+
+    @Override
+    public void focus()
+    {
+        super.focus();
+        focusLastWidget();
+    }
+
     public List<PropertyType> getAvailablePropertyTypes()
     {
         return criteriaWidgets.get(0).getAvailablePropertyTypes();
@@ -184,4 +203,9 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel
         widget.setSearchCriterion(initialField, initialSearchString);
     }
 
+    void onEnterKey()
+    {
+        fireEvent(KeyboardEvents.Enter);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java
index a474aa0afc31f7e92eaa752720f083b3794ccae0..ca6d126cc97b38b37768ad6b2250b107b61f7311 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java
@@ -21,11 +21,14 @@ import java.util.List;
 import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
 import com.extjs.gxt.ui.client.Style.VerticalAlignment;
 import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.KeyListener;
 import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.HorizontalPanel;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.form.TextField;
 import com.extjs.gxt.ui.client.widget.layout.TableData;
+import com.google.gwt.event.dom.client.KeyCodes;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
@@ -84,6 +87,7 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel
         this.nameField = nameField;
         this.valueField = new TextField<String>();
         valueField.setId(VALUE_FIELD_ID_PREFIX + idSuffix);
+        addEnterListener();
 
         final TableData tableData =
                 new TableData(HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM);
@@ -96,6 +100,24 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel
         add(removeButton = createRemoveButton(idSuffix), tableData);
     }
 
+    /**
+     * Adds a keyboard listener to the input field. Only call this during initialization.
+     */
+    private void addEnterListener()
+    {
+        valueField.addKeyListener(new KeyListener()
+            {
+                @Override
+                public final void componentKeyUp(final ComponentEvent event)
+                {
+                    if (event.getKeyCode() == KeyCodes.KEY_ENTER)
+                    {
+                        parent.onEnterKey();
+                    }
+                }
+            });
+    }
+
     /**
      * Allows to enable/disable "remove" button.
      */
@@ -165,6 +187,13 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel
         nameField.reset();
     }
 
+    @Override
+    public void focus()
+    {
+        super.focus();
+        valueField.focus();
+    }
+
     /**
      * Returns {@link DetailedSearchCriterion} for selected <em>name</em> and <em>value</em>. If
      * either <em>name</em> or <em>value</em> is not specified, returns null.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java
index 18bd87938e297123ca48dbc50860f252588dd81c..27d5e6a22f23038ee820720b2afa0e41615794b8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java
@@ -4,12 +4,17 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.Style.Scroll;
 import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.EventType;
+import com.extjs.gxt.ui.client.event.KeyboardEvents;
+import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.button.ButtonBar;
 import com.extjs.gxt.ui.client.widget.layout.FitData;
 import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.event.dom.client.KeyCodes;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -52,6 +57,7 @@ public class DetailedSearchWindow extends Dialog
         setResizable(false);
         add(criteriaWidget = new DetailedSearchCriteriaWidget(viewContext, entityKind),
                 new FitData(MARGIN));
+        addEnterListener();
         final ButtonBar bar = getButtonBar();
         bar.removeAll();
         bar.add(new Button(viewContext.getMessage(Dict.BUTTON_CANCEL),
@@ -79,15 +85,7 @@ public class DetailedSearchWindow extends Dialog
                                 @Override
                                 public void componentSelected(ButtonEvent ce)
                                 {
-                                    List<PropertyType> availablePropertyTypes =
-                                            criteriaWidget.getAvailablePropertyTypes();
-                                    DetailedSearchCriteria criteria =
-                                            criteriaWidget.tryGetCriteria();
-                                    String criteriaDescription =
-                                            criteriaWidget.getCriteriaDescription();
-                                    updateListener.updateSearchResults(criteria,
-                                            criteriaDescription, availablePropertyTypes);
-                                    hide();
+                                    onSearch();
                                 }
                             });
 
@@ -98,6 +96,34 @@ public class DetailedSearchWindow extends Dialog
                 createHelpPageIdentifier(entityKind));
     }
 
+    private void addEnterListener()
+    {
+        criteriaWidget.addListener(KeyboardEvents.Enter, new Listener<ComponentEvent>()
+            {
+                public void handleEvent(ComponentEvent ce)
+                {
+                    EventType type = ce.getType();
+                    switch (type.getEventCode())
+                    {
+                        case KeyCodes.KEY_ENTER:
+                            onSearch();
+                            break;
+                        default:
+                            break;
+                    }
+
+                }
+
+            });
+    }
+
+    @Override
+    protected void afterShow()
+    {
+        super.afterShow();
+        criteriaWidget.focus();
+    }
+
     public DetailedSearchCriteria tryGetCriteria()
     {
         return criteriaWidget.tryGetCriteria();
@@ -139,4 +165,13 @@ public class DetailedSearchWindow extends Dialog
         // Set the widget
         criteriaWidget.setInitialSearchCriterion(initialField, searchString);
     }
+
+    private void onSearch()
+    {
+        hide();
+        List<PropertyType> availablePropertyTypes = criteriaWidget.getAvailablePropertyTypes();
+        DetailedSearchCriteria criteria = criteriaWidget.tryGetCriteria();
+        String criteriaDescription = criteriaWidget.getCriteriaDescription();
+        updateListener.updateSearchResults(criteria, criteriaDescription, availablePropertyTypes);
+    }
 }