From 834ce7773c0371d2cb816964737d7c5d3bc58edb Mon Sep 17 00:00:00 2001
From: eikek <eike.kettner@posteo.de>
Date: Sun, 27 Feb 2022 22:31:17 +0100
Subject: [PATCH] Select item in detail view

---
 modules/webapp/src/main/elm/App/Update.elm    |  67 +++--
 modules/webapp/src/main/elm/App/View2.elm     |  26 +-
 .../webapp/src/main/elm/Comp/ItemDetail.elm   |   6 +-
 .../src/main/elm/Comp/ItemDetail/Model.elm    |   9 +-
 .../src/main/elm/Comp/ItemDetail/Update.elm   | 226 ++++++++-------
 .../src/main/elm/Comp/ItemDetail/View2.elm    |  66 ++++-
 .../webapp/src/main/elm/Comp/SearchMenu.elm   |   6 +-
 .../webapp/src/main/elm/Data/Environment.elm  |   4 +-
 .../src/main/elm/Messages/Comp/ItemDetail.elm |   8 +-
 .../Comp/ItemDetail/MultiEditMenu.elm         |   2 +-
 .../src/main/elm/Messages/Comp/SearchMenu.elm |   6 +
 .../src/main/elm/Page/ItemDetail/Data.elm     |   2 +
 .../src/main/elm/Page/ItemDetail/Update.elm   |  42 +--
 .../src/main/elm/Page/ItemDetail/View2.elm    |  15 +-
 .../webapp/src/main/elm/Page/Search/Data.elm  |   1 +
 .../src/main/elm/Page/Search/Update.elm       | 257 +++++++++---------
 modules/webapp/src/main/elm/Styles.elm        |  46 +++-
 17 files changed, 449 insertions(+), 340 deletions(-)

diff --git a/modules/webapp/src/main/elm/App/Update.elm b/modules/webapp/src/main/elm/App/Update.elm
index 96b0d98e..d2cc9b5f 100644
--- a/modules/webapp/src/main/elm/App/Update.elm
+++ b/modules/webapp/src/main/elm/App/Update.elm
@@ -15,7 +15,9 @@ import App.Data exposing (..)
 import Browser exposing (UrlRequest(..))
 import Browser.Navigation as Nav
 import Data.AppEvent exposing (AppEvent(..))
+import Data.Environment as Env
 import Data.Flags
+import Data.ItemIds exposing (ItemIds)
 import Data.ServerEvent exposing (ServerEvent(..))
 import Data.UiSettings exposing (UiSettings)
 import Data.UiTheme
@@ -346,6 +348,15 @@ updateWithSub msg model =
             )
 
 
+modelEnv : Model -> Env.Update
+modelEnv model =
+    { key = model.key
+    , selectedItems = model.selectedItems
+    , flags = model.flags
+    , settings = model.uiSettings
+    }
+
+
 applyClientSettings : Messages -> Model -> UiSettings -> ( Model, Cmd Msg, Sub Msg )
 applyClientSettings texts model settings =
     let
@@ -368,6 +379,18 @@ applyClientSettings texts model settings =
         { model | uiSettings = settings }
 
 
+applySelectionChange : Messages -> Model -> ItemIds -> ( Model, Cmd Msg, Sub Msg )
+applySelectionChange texts model newSelection =
+    if model.selectedItems == newSelection then
+        ( { model | selectedItems = newSelection }, Cmd.none, Sub.none )
+
+    else
+        Util.Update.andThen2
+            [ updateSearch texts Page.Search.Data.ItemSelectionChanged
+            ]
+            { model | selectedItems = newSelection }
+
+
 updateDashboard : Messages -> Page.Dashboard.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
 updateDashboard texts lmsg model =
     let
@@ -427,17 +450,16 @@ updateItemDetail texts lmsg model =
 
         result =
             Page.ItemDetail.Update.update
-                model.key
-                model.flags
                 inav
-                model.uiSettings
+                (modelEnv model)
                 lmsg
                 model.itemDetailModel
 
-        model_ =
-            { model
-                | itemDetailModel = result.model
-            }
+        ( model_, cmd_, sub_ ) =
+            applySelectionChange
+                texts
+                { model | itemDetailModel = result.model }
+                result.selectedItems
 
         ( hm, hc, hs ) =
             updateSearch texts (Page.Search.Data.SetLinkTarget result.linkTarget) model_
@@ -451,8 +473,8 @@ updateItemDetail texts lmsg model =
                     ( hm, hc, hs )
     in
     ( hm1
-    , Cmd.batch [ Cmd.map ItemDetailMsg result.cmd, hc, hc1 ]
-    , Sub.batch [ Sub.map ItemDetailMsg result.sub, hs, hs1 ]
+    , Cmd.batch [ Cmd.map ItemDetailMsg result.cmd, hc, hc1, cmd_ ]
+    , Sub.batch [ Sub.map ItemDetailMsg result.sub, hs, hs1, sub_ ]
     )
 
 
@@ -576,7 +598,7 @@ updateLogin lmsg model =
 updateSearch : Messages -> Page.Search.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
 updateSearch texts lmsg model =
     let
-        ( mid, bmId ) =
+        ( lastViewItemId, bookmarkId ) =
             case model.page of
                 SearchPage bId ->
                     ( Util.Maybe.fromString model.itemDetailModel.detail.item.id, bId )
@@ -585,19 +607,10 @@ updateSearch texts lmsg model =
                     ( Nothing, Nothing )
 
         env =
-            { bookmarkId = bmId
-            , lastViewedItemId = mid
-            , key = model.key
-            , selectedItems = model.selectedItems
-            , flags = model.flags
-            , settings = model.uiSettings
-            }
+            modelEnv model
 
         result =
-            Page.Search.Update.update texts.search env lmsg model.searchModel
-
-        model_ =
-            { model | searchModel = result.model, selectedItems = result.selectedItems }
+            Page.Search.Update.update texts.search bookmarkId lastViewItemId env lmsg model.searchModel
 
         lc =
             case result.appEvent of
@@ -606,15 +619,13 @@ updateSearch texts lmsg model =
 
                 AppNothing ->
                     Cmd.none
+
+        ( model_, cmd_, sub_ ) =
+            applySelectionChange texts { model | searchModel = result.model } result.selectedItems
     in
     ( model_
-    , Cmd.batch
-        [ Cmd.map SearchMsg result.cmd
-        , lc
-        ]
-    , Sub.batch
-        [ Sub.map SearchMsg result.sub
-        ]
+    , Cmd.batch [ Cmd.map SearchMsg result.cmd, lc, cmd_ ]
+    , Sub.batch [ Sub.map SearchMsg result.sub, sub_ ]
     )
 
 
diff --git a/modules/webapp/src/main/elm/App/View2.elm b/modules/webapp/src/main/elm/App/View2.elm
index de2dc8ac..6913438e 100644
--- a/modules/webapp/src/main/elm/App/View2.elm
+++ b/modules/webapp/src/main/elm/App/View2.elm
@@ -10,6 +10,7 @@ module App.View2 exposing (view)
 import Api.Model.AuthResult exposing (AuthResult)
 import App.Data exposing (..)
 import Comp.Basic as B
+import Data.Environment as Env
 import Data.Flags
 import Data.Icons as Icons
 import Data.UiSettings
@@ -485,6 +486,15 @@ dropdownMenu =
     " absolute right-0 bg-white dark:bg-slate-800 border dark:border-slate-700 dark:text-slate-300 shadow-lg opacity-1 transition duration-200 min-w-max "
 
 
+modelEnv : Model -> Env.View
+modelEnv model =
+    { sidebarVisible = model.sidebarVisible
+    , flags = model.flags
+    , settings = model.uiSettings
+    , selectedItems = model.selectedItems
+    }
+
+
 viewDashboard : Messages -> Model -> List (Html Msg)
 viewDashboard texts model =
     [ Html.map DashboardMsg
@@ -551,11 +561,7 @@ viewSearch : Messages -> Maybe String -> Model -> List (Html Msg)
 viewSearch texts bmId model =
     let
         env =
-            { sidebarVisible = model.sidebarVisible
-            , flags = model.flags
-            , settings = model.uiSettings
-            , selectedItems = model.selectedItems
-            }
+            modelEnv model
     in
     [ Html.map SearchMsg
         (Search.viewSidebar texts.search
@@ -690,19 +696,19 @@ viewItemDetail texts id model =
     let
         inav =
             Page.Search.Data.itemNav id model.searchModel
+
+        env =
+            modelEnv model
     in
     [ Html.map ItemDetailMsg
         (ItemDetail.viewSidebar texts.itemDetail
-            model.sidebarVisible
-            model.flags
-            model.uiSettings
+            env
             model.itemDetailModel
         )
     , Html.map ItemDetailMsg
         (ItemDetail.viewContent texts.itemDetail
             inav
-            model.flags
-            model.uiSettings
+            env
             model.itemDetailModel
         )
     ]
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Comp/ItemDetail.elm
index 9be2dce5..7096d7f4 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail.elm
@@ -12,10 +12,10 @@ module Comp.ItemDetail exposing
     , view2
     )
 
-import Browser.Navigation as Nav
 import Comp.ItemDetail.Model exposing (Msg(..), UpdateResult)
 import Comp.ItemDetail.Update
 import Comp.ItemDetail.View2
+import Data.Environment as Env
 import Data.Flags exposing (Flags)
 import Data.ItemNav exposing (ItemNav)
 import Data.UiSettings exposing (UiSettings)
@@ -33,11 +33,11 @@ emptyModel =
     Comp.ItemDetail.Model.emptyModel
 
 
-update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult
+update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
 update =
     Comp.ItemDetail.Update.update
 
 
-view2 : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
+view2 : Texts -> ItemNav -> Env.View -> Model -> Html Msg
 view2 =
     Comp.ItemDetail.View2.view
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/Model.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/Model.elm
index b3a58c4a..b0f577be 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/Model.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/Model.elm
@@ -57,6 +57,7 @@ import Comp.SimpleTextInput
 import Comp.TagDropdown
 import Data.Direction exposing (Direction)
 import Data.Fields exposing (Field)
+import Data.ItemIds exposing (ItemIdChange)
 import DatePicker exposing (DatePicker)
 import Dict exposing (Dict)
 import File exposing (File)
@@ -367,6 +368,7 @@ type Msg
     | ToggleShowQrAttach String
     | PrintElement String
     | SetNameMsg Comp.SimpleTextInput.Msg
+    | ToggleSelectItem
 
 
 type SaveNameState
@@ -381,22 +383,23 @@ type alias UpdateResult =
     , sub : Sub Msg
     , linkTarget : LinkTarget
     , removedItem : Maybe String
+    , selectionChange : ItemIdChange
     }
 
 
 resultModel : Model -> UpdateResult
 resultModel model =
-    UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing
+    UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
 
 
 resultModelCmd : ( Model, Cmd Msg ) -> UpdateResult
 resultModelCmd ( model, cmd ) =
-    UpdateResult model cmd Sub.none Comp.LinkTarget.LinkNone Nothing
+    UpdateResult model cmd Sub.none Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
 
 
 resultModelCmdSub : ( Model, Cmd Msg, Sub Msg ) -> UpdateResult
 resultModelCmdSub ( model, cmd, sub ) =
-    UpdateResult model cmd sub Comp.LinkTarget.LinkNone Nothing
+    UpdateResult model cmd sub Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
 
 
 personMatchesOrg : Model -> Bool
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/Update.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/Update.elm
index 39bbee54..fa5ac06a 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/Update.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/Update.elm
@@ -20,7 +20,6 @@ import Api.Model.OptionalDate exposing (OptionalDate)
 import Api.Model.OptionalId exposing (OptionalId)
 import Api.Model.OptionalText exposing (OptionalText)
 import Api.Model.StringList exposing (StringList)
-import Browser.Navigation as Nav
 import Comp.AttachmentMeta
 import Comp.CustomFieldMultiInput
 import Comp.DatePicker
@@ -58,10 +57,12 @@ import Comp.SimpleTextInput
 import Comp.TagDropdown
 import Data.CustomFieldChange exposing (CustomFieldChange(..))
 import Data.Direction
+import Data.Environment as Env
 import Data.EquipmentOrder
 import Data.Fields exposing (Field)
 import Data.Flags exposing (Flags)
 import Data.FolderOrder
+import Data.ItemIds
 import Data.ItemNav exposing (ItemNav)
 import Data.PersonOrder
 import Data.PersonUse
@@ -74,7 +75,6 @@ import Http
 import Page exposing (Page(..))
 import Ports
 import Set exposing (Set)
-import Time
 import Util.File exposing (makeFileId)
 import Util.List
 import Util.Maybe
@@ -82,8 +82,8 @@ import Util.String
 import Util.Tag
 
 
-update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult
-update key flags inav settings msg model =
+update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
+update inav env msg model =
     case msg of
         Init ->
             let
@@ -91,10 +91,10 @@ update key flags inav settings msg model =
                     Comp.DatePicker.init
 
                 ( im, ic ) =
-                    Comp.ItemMail.init flags
+                    Comp.ItemMail.init env.flags
 
                 ( cm, cc ) =
-                    Comp.CustomFieldMultiInput.init flags
+                    Comp.CustomFieldMultiInput.init env.flags
             in
             resultModelCmd
                 ( { model
@@ -106,30 +106,26 @@ update key flags inav settings msg model =
                     , customFieldsModel = cm
                   }
                 , Cmd.batch
-                    [ getOptions flags
+                    [ getOptions env.flags
                     , Cmd.map ItemDatePickerMsg dpc
                     , Cmd.map DueDatePickerMsg dpc
                     , Cmd.map ItemMailMsg ic
                     , Cmd.map CustomFieldMsg cc
-                    , Api.getSentMails flags model.item.id SentMailsResp
+                    , Api.getSentMails env.flags model.item.id SentMailsResp
                     ]
                 )
 
         SetItem item ->
             let
                 res1 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (TagDropdownMsg (Comp.TagDropdown.setSelected item.tags))
                         model
 
                 res2 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (DirDropdownMsg
                             (Comp.Dropdown.SetSelection
                                 (Data.Direction.fromString item.direction
@@ -141,10 +137,8 @@ update key flags inav settings msg model =
                         res1.model
 
                 res3 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (OrgDropdownMsg
                             (Comp.Dropdown.SetSelection
                                 (item.corrOrg
@@ -156,10 +150,8 @@ update key flags inav settings msg model =
                         res2.model
 
                 res4 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (CorrPersonMsg
                             (Comp.Dropdown.SetSelection
                                 (item.corrPerson
@@ -171,10 +163,8 @@ update key flags inav settings msg model =
                         res3.model
 
                 res5 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (ConcPersonMsg
                             (Comp.Dropdown.SetSelection
                                 (item.concPerson
@@ -186,10 +176,8 @@ update key flags inav settings msg model =
                         res4.model
 
                 res6 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (ConcEquipMsg
                             (Comp.Dropdown.SetSelection
                                 (item.concEquipment
@@ -201,13 +189,11 @@ update key flags inav settings msg model =
                         res5.model
 
                 res7 =
-                    update key flags inav settings AddFilesReset res6.model
+                    update inav env AddFilesReset res6.model
 
                 res8 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (FolderDropdownMsg
                             (Comp.Dropdown.SetSelection
                                 (item.folder
@@ -219,16 +205,14 @@ update key flags inav settings msg model =
                         res7.model
 
                 res9 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (CustomFieldMsg (Comp.CustomFieldMultiInput.setValues item.customfields))
                         res8.model
 
                 proposalCmd =
                     if item.state == "created" then
-                        Api.getItemProposals flags item.id GetProposalResp
+                        Api.getItemProposals env.flags item.id GetProposalResp
 
                     else
                         Cmd.none
@@ -265,11 +249,11 @@ update key flags inav settings msg model =
                     , res7.cmd
                     , res8.cmd
                     , res9.cmd
-                    , getOptions flags
+                    , getOptions env.flags
                     , proposalCmd
-                    , Api.getSentMails flags item.id SentMailsResp
-                    , Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp
-                    , Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd flags)
+                    , Api.getSentMails env.flags item.id SentMailsResp
+                    , Api.getPersons env.flags "" Data.PersonOrder.NameAsc GetPersonResp
+                    , Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd env.flags)
                     ]
             , sub =
                 Sub.batch
@@ -285,6 +269,7 @@ update key flags inav settings msg model =
                     ]
             , linkTarget = Comp.LinkTarget.LinkNone
             , removedItem = Nothing
+            , selectionChange = Data.ItemIds.noChange
             }
 
         SetActiveAttachment pos ->
@@ -322,7 +307,7 @@ update key flags inav settings msg model =
                 resultModel model
 
             else
-                resultModelCmd ( model, Api.itemDetail flags model.item.id GetItemResp )
+                resultModelCmd ( model, Api.itemDetail env.flags model.item.id GetItemResp )
 
         FolderDropdownMsg m ->
             let
@@ -337,7 +322,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setFolder flags newModel idref
+                        setFolder env.flags newModel idref
 
                     else
                         Cmd.none
@@ -354,7 +339,7 @@ update key flags inav settings msg model =
 
                 save =
                     if Comp.TagDropdown.isChangeMsg m then
-                        saveTags flags newModel
+                        saveTags env.flags newModel
 
                     else
                         Cmd.none
@@ -371,7 +356,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setDirection flags newModel
+                        setDirection env.flags newModel
 
                     else
                         Cmd.none
@@ -393,7 +378,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setCorrOrg flags newModel idref
+                        setCorrOrg env.flags newModel idref
 
                     else
                         Cmd.none
@@ -413,7 +398,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setCorrPerson flags newModel idref
+                        setCorrPerson env.flags newModel idref
 
                     else
                         Cmd.none
@@ -433,7 +418,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setConcPerson flags newModel idref
+                        setConcPerson env.flags newModel idref
 
                     else
                         Cmd.none
@@ -453,7 +438,7 @@ update key flags inav settings msg model =
 
                 save =
                     if isDropdownChangeMsg m then
-                        setConcEquip flags newModel idref
+                        setConcEquip env.flags newModel idref
 
                     else
                         Cmd.none
@@ -468,7 +453,7 @@ update key flags inav settings msg model =
                 ( setter, value, save ) =
                     case result.change of
                         Comp.SimpleTextInput.ValueUpdated v ->
-                            ( setName flags { model | nameModel = Maybe.withDefault "" v }, v, Saving )
+                            ( setName env.flags { model | nameModel = Maybe.withDefault "" v }, v, Saving )
 
                         Comp.SimpleTextInput.ValueUnchanged ->
                             ( Cmd.none, Nothing, model.nameState )
@@ -478,6 +463,7 @@ update key flags inav settings msg model =
             , sub = Sub.map SetNameMsg result.sub
             , linkTarget = Comp.LinkTarget.LinkNone
             , removedItem = Nothing
+            , selectionChange = Data.ItemIds.noChange
             }
 
         SetNotes str ->
@@ -509,22 +495,22 @@ update key flags inav settings msg model =
                     resultModel model
 
         SaveNotes ->
-            resultModelCmd ( model, setNotes flags model )
+            resultModelCmd ( model, setNotes env.flags model )
 
         ConfirmItem ->
             let
                 resetCmds =
-                    resetHiddenFields settings flags model.item.id ResetHiddenMsg
+                    resetHiddenFields env.settings env.flags model.item.id ResetHiddenMsg
             in
             resultModelCmd
                 ( { model | mobileItemMenuOpen = False }
-                , Cmd.batch (Api.setConfirmed flags model.item.id SaveResp :: resetCmds)
+                , Cmd.batch (Api.setConfirmed env.flags model.item.id SaveResp :: resetCmds)
                 )
 
         UnconfirmItem ->
             resultModelCmd
                 ( { model | mobileItemMenuOpen = False }
-                , Api.setUnconfirmed flags model.item.id SaveResp
+                , Api.setUnconfirmed env.flags model.item.id SaveResp
                 )
 
         ItemDatePickerMsg m ->
@@ -538,13 +524,13 @@ update key flags inav settings msg model =
                         newModel =
                             { model | itemDatePicker = dp, itemDate = Just (Comp.DatePicker.midOfDay date) }
                     in
-                    resultModelCmd ( newModel, setDate flags newModel newModel.itemDate )
+                    resultModelCmd ( newModel, setDate env.flags newModel newModel.itemDate )
 
                 _ ->
                     resultModel { model | itemDatePicker = dp }
 
         RemoveDate ->
-            resultModelCmd ( { model | itemDate = Nothing }, setDate flags model Nothing )
+            resultModelCmd ( { model | itemDate = Nothing }, setDate env.flags model Nothing )
 
         DueDatePickerMsg m ->
             let
@@ -557,18 +543,18 @@ update key flags inav settings msg model =
                         newModel =
                             { model | dueDatePicker = dp, dueDate = Just (Comp.DatePicker.midOfDay date) }
                     in
-                    resultModelCmd ( newModel, setDueDate flags newModel newModel.dueDate )
+                    resultModelCmd ( newModel, setDueDate env.flags newModel newModel.dueDate )
 
                 _ ->
                     resultModel { model | dueDatePicker = dp }
 
         RemoveDueDate ->
-            resultModelCmd ( { model | dueDate = Nothing }, setDueDate flags model Nothing )
+            resultModelCmd ( { model | dueDate = Nothing }, setDueDate env.flags model Nothing )
 
         DeleteItemConfirmed ->
             let
                 cmd =
-                    Api.deleteItem flags model.item.id (DeleteResp model.item.id)
+                    Api.deleteItem env.flags model.item.id (DeleteResp model.item.id)
             in
             resultModelCmd ( { model | itemModal = Nothing }, cmd )
 
@@ -583,22 +569,22 @@ update key flags inav settings msg model =
                 }
 
         SetCorrOrgSuggestion idname ->
-            resultModelCmd ( model, setCorrOrg flags model (Just idname) )
+            resultModelCmd ( model, setCorrOrg env.flags model (Just idname) )
 
         SetCorrPersonSuggestion idname ->
-            resultModelCmd ( model, setCorrPerson flags model (Just idname) )
+            resultModelCmd ( model, setCorrPerson env.flags model (Just idname) )
 
         SetConcPersonSuggestion idname ->
-            resultModelCmd ( model, setConcPerson flags model (Just idname) )
+            resultModelCmd ( model, setConcPerson env.flags model (Just idname) )
 
         SetConcEquipSuggestion idname ->
-            resultModelCmd ( model, setConcEquip flags model (Just idname) )
+            resultModelCmd ( model, setConcEquip env.flags model (Just idname) )
 
         SetItemDateSuggestion date ->
-            resultModelCmd ( model, setDate flags model (Just date) )
+            resultModelCmd ( model, setDate env.flags model (Just date) )
 
         SetDueDateSuggestion date ->
-            resultModelCmd ( model, setDueDate flags model (Just date) )
+            resultModelCmd ( model, setDueDate env.flags model (Just date) )
 
         GetFolderResp (Ok fs) ->
             let
@@ -613,7 +599,7 @@ update key flags inav settings msg model =
                         |> List.map mkIdName
                         |> Comp.Dropdown.SetOptions
             in
-            update key flags inav settings (FolderDropdownMsg opts) model_
+            update inav env (FolderDropdownMsg opts) model_
 
         GetFolderResp (Err _) ->
             resultModel model
@@ -636,7 +622,7 @@ update key flags inav settings msg model =
                 opts =
                     Comp.Dropdown.SetOptions orgs.items
             in
-            update key flags inav settings (OrgDropdownMsg opts) model
+            update inav env (OrgDropdownMsg opts) model
 
         GetOrgResp (Err _) ->
             resultModel model
@@ -673,18 +659,14 @@ update key flags inav settings msg model =
                     { model | allPersons = personDict }
 
                 res1 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (CorrPersonMsg (Comp.Dropdown.SetOptions corrRefs))
                         model_
 
                 res2 =
-                    update key
-                        flags
-                        inav
-                        settings
+                    update inav
+                        env
                         (ConcPersonMsg (Comp.Dropdown.SetOptions concRefs))
                         res1.model
             in
@@ -693,6 +675,7 @@ update key flags inav settings msg model =
             , sub = Sub.batch [ res1.sub, res2.sub ]
             , linkTarget = Comp.LinkTarget.LinkNone
             , removedItem = Nothing
+            , selectionChange = Data.ItemIds.noChange
             }
 
         GetPersonResp (Err _) ->
@@ -706,14 +689,14 @@ update key flags inav settings msg model =
                             equips.items
                         )
             in
-            update key flags inav settings (ConcEquipMsg opts) model
+            update inav env (ConcEquipMsg opts) model
 
         GetEquipResp (Err _) ->
             resultModel model
 
         SaveResp (Ok res) ->
             if res.success then
-                resultModelCmd ( model, Api.itemDetail flags model.item.id GetItemResp )
+                resultModelCmd ( model, Api.itemDetail env.flags model.item.id GetItemResp )
 
             else
                 resultModel model
@@ -742,10 +725,10 @@ update key flags inav settings msg model =
                     result_ =
                         case inav.next of
                             Just id ->
-                                resultModelCmd ( model, Page.set key (ItemDetailPage id) )
+                                resultModelCmd ( model, Page.set env.key (ItemDetailPage id) )
 
                             Nothing ->
-                                resultModelCmd ( model, Page.set key (SearchPage Nothing) )
+                                resultModelCmd ( model, Page.set env.key (SearchPage Nothing) )
                 in
                 { result_ | removedItem = Just removedId }
 
@@ -756,7 +739,7 @@ update key flags inav settings msg model =
             resultModel model
 
         GetItemResp (Ok item) ->
-            update key flags inav settings (SetItem item) model
+            update inav env (SetItem item) model
 
         GetItemResp (Err _) ->
             resultModel model
@@ -770,7 +753,7 @@ update key flags inav settings msg model =
         ItemMailMsg m ->
             let
                 ( im, ic, fa ) =
-                    Comp.ItemMail.update flags m model.itemMail
+                    Comp.ItemMail.update env.flags m model.itemMail
             in
             case fa of
                 Comp.ItemMail.FormNone ->
@@ -798,7 +781,7 @@ update key flags inav settings msg model =
                         ( { model | mailSending = True }
                         , Cmd.batch
                             [ Cmd.map ItemMailMsg ic
-                            , Api.sendMail flags mail SendMailResp
+                            , Api.sendMail env.flags mail SendMailResp
                             ]
                         )
 
@@ -850,7 +833,7 @@ update key flags inav settings msg model =
                             MailSendFailed br.message
                   }
                 , if br.success then
-                    Api.itemDetail flags model.item.id GetItemResp
+                    Api.itemDetail env.flags model.item.id GetItemResp
 
                   else
                     Cmd.none
@@ -895,7 +878,7 @@ update key flags inav settings msg model =
                 Nothing ->
                     let
                         ( am, ac ) =
-                            Comp.AttachmentMeta.init flags id
+                            Comp.AttachmentMeta.init env.flags id
 
                         nextMeta =
                             Dict.insert id am model.attachMeta
@@ -925,7 +908,7 @@ update key flags inav settings msg model =
         DeleteAttachConfirmed attachId ->
             let
                 cmd =
-                    Api.deleteAttachment flags attachId DeleteAttachResp
+                    Api.deleteAttachment env.flags attachId DeleteAttachResp
             in
             resultModelCmd ( { model | attachModal = Nothing }, cmd )
 
@@ -934,7 +917,7 @@ update key flags inav settings msg model =
 
         DeleteAttachResp (Ok res) ->
             if res.success then
-                update key flags inav settings ReloadItem model
+                update inav env ReloadItem model
 
             else
                 resultModel model
@@ -980,7 +963,7 @@ update key flags inav settings msg model =
                 SelectView svm ->
                     let
                         cmd =
-                            Api.deleteAttachments flags svm.ids DeleteAttachResp
+                            Api.deleteAttachments env.flags svm.ids DeleteAttachResp
                     in
                     resultModelCmd ( { model | attachModal = Nothing, viewMode = SimpleView }, cmd )
 
@@ -1029,7 +1012,7 @@ update key flags inav settings msg model =
                     List.map makeFileId model.selectedFiles
 
                 uploads =
-                    Cmd.batch (Api.uploadAmend flags model.item.id model.selectedFiles AddFilesUploadResp)
+                    Cmd.batch (Api.uploadAmend env.flags model.item.id model.selectedFiles AddFilesUploadResp)
 
                 tracker =
                     Sub.batch <| List.map (\id -> Http.track id (AddFilesProgress id)) fileids
@@ -1112,7 +1095,7 @@ update key flags inav settings msg model =
                     case result of
                         Just ( src, trg, _ ) ->
                             if src /= trg then
-                                Api.moveAttachmentBefore flags
+                                Api.moveAttachmentBefore env.flags
                                     model.item.id
                                     (MoveAttachment src trg)
                                     SaveResp
@@ -1130,7 +1113,7 @@ update key flags inav settings msg model =
                 Just mm ->
                     let
                         ( mm_, mc_, mv ) =
-                            Comp.DetailEdit.update flags lm mm
+                            Comp.DetailEdit.update env.flags lm mm
 
                         ( model_, cmd_ ) =
                             case mv of
@@ -1138,7 +1121,7 @@ update key flags inav settings msg model =
                                     ( { model | modalEdit = Nothing }, Cmd.none )
 
                                 Just _ ->
-                                    ( model, Api.itemDetail flags model.item.id GetItemResp )
+                                    ( model, Api.itemDetail env.flags model.item.id GetItemResp )
 
                                 Nothing ->
                                     ( { model | modalEdit = Just mm_ }, Cmd.none )
@@ -1180,7 +1163,7 @@ update key flags inav settings msg model =
                 Just oid ->
                     let
                         ( m, c ) =
-                            Comp.DetailEdit.editOrg flags oid Comp.OrgForm.emptyModel
+                            Comp.DetailEdit.editOrg env.flags oid Comp.OrgForm.emptyModel
                     in
                     resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
 
@@ -1198,7 +1181,7 @@ update key flags inav settings msg model =
                 Just eid ->
                     let
                         ( m, c ) =
-                            Comp.DetailEdit.editEquip flags eid Comp.EquipmentForm.emptyModel
+                            Comp.DetailEdit.editEquip env.flags eid Comp.EquipmentForm.emptyModel
                     in
                     resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
 
@@ -1209,7 +1192,7 @@ update key flags inav settings msg model =
             let
                 ( pm, pc ) =
                     Comp.DetailEdit.initCorrPerson
-                        flags
+                        env.flags
                         model.item.id
                         Comp.PersonForm.emptyModel
             in
@@ -1222,7 +1205,7 @@ update key flags inav settings msg model =
             let
                 ( p, c ) =
                     Comp.DetailEdit.initConcPerson
-                        flags
+                        env.flags
                         model.item.id
                         Comp.PersonForm.emptyModel
             in
@@ -1242,7 +1225,7 @@ update key flags inav settings msg model =
                 Just pid ->
                     let
                         ( m, c ) =
-                            Comp.DetailEdit.editPerson flags pid Comp.PersonForm.emptyModel
+                            Comp.DetailEdit.editPerson env.flags pid Comp.PersonForm.emptyModel
                     in
                     resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
 
@@ -1318,7 +1301,7 @@ update key flags inav settings msg model =
                     resultModelCmd
                         ( model
                         , Api.setAttachmentName
-                            flags
+                            env.flags
                             m.id
                             (Util.Maybe.fromString m.newName)
                             EditAttachNameResp
@@ -1370,15 +1353,15 @@ update key flags inav settings msg model =
             in
             if keys == Just Comp.KeyInput.ctrlC then
                 if model.item.state == "created" then
-                    update key flags inav settings ConfirmItem model_
+                    update inav env ConfirmItem model_
 
                 else
-                    update key flags inav settings UnconfirmItem model_
+                    update inav env UnconfirmItem model_
 
             else if keys == Just Comp.KeyInput.ctrlPoint then
                 case inav.next of
                     Just id ->
-                        resultModelCmd ( model_, Page.set key (ItemDetailPage id) )
+                        resultModelCmd ( model_, Page.set env.key (ItemDetailPage id) )
 
                     Nothing ->
                         resultModel model_
@@ -1386,7 +1369,7 @@ update key flags inav settings msg model =
             else if keys == Just Comp.KeyInput.ctrlComma then
                 case inav.prev of
                     Just id ->
-                        resultModelCmd ( model_, Page.set key (ItemDetailPage id) )
+                        resultModelCmd ( model_, Page.set env.key (ItemDetailPage id) )
 
                     Nothing ->
                         resultModel model_
@@ -1405,7 +1388,7 @@ update key flags inav settings msg model =
             let
                 model_ =
                     { model
-                        | menuOpen = settings.sideMenuVisible
+                        | menuOpen = env.settings.sideMenuVisible
                     }
             in
             resultModel model_
@@ -1416,12 +1399,13 @@ update key flags inav settings msg model =
             , sub = Sub.none
             , linkTarget = lt
             , removedItem = Nothing
+            , selectionChange = Data.ItemIds.noChange
             }
 
         CustomFieldMsg lm ->
             let
                 result =
-                    Comp.CustomFieldMultiInput.update flags lm model.customFieldsModel
+                    Comp.CustomFieldMultiInput.update env.flags lm model.customFieldsModel
 
                 cmd_ =
                     Cmd.map CustomFieldMsg result.cmd
@@ -1438,7 +1422,7 @@ update key flags inav settings msg model =
                             ( Cmd.none, model.customFieldSavingIcon )
 
                         FieldValueRemove field ->
-                            ( Api.deleteCustomValue flags
+                            ( Api.deleteCustomValue env.flags
                                 model.item.id
                                 field.id
                                 (CustomFieldRemoveResp field.id)
@@ -1446,7 +1430,7 @@ update key flags inav settings msg model =
                             )
 
                         FieldValueChange field value ->
-                            ( Api.putCustomValue flags
+                            ( Api.putCustomValue env.flags
                                 model.item.id
                                 (CustomFieldValue field.id value)
                                 (CustomFieldSaveResp field value)
@@ -1497,7 +1481,7 @@ update key flags inav settings msg model =
             if res.success then
                 resultModelCmd
                     ( model_
-                    , Api.itemDetail flags model.item.id GetItemResp
+                    , Api.itemDetail env.flags model.item.id GetItemResp
                     )
 
             else
@@ -1551,7 +1535,7 @@ update key flags inav settings msg model =
         ReprocessFileConfirmed id ->
             let
                 cmd =
-                    Api.reprocessItem flags model.item.id [ id ] ReprocessFileResp
+                    Api.reprocessItem env.flags model.item.id [ id ] ReprocessFileResp
             in
             resultModelCmd ( { model | attachModal = Nothing }, cmd )
 
@@ -1572,7 +1556,7 @@ update key flags inav settings msg model =
         ReprocessItemConfirmed ->
             let
                 cmd =
-                    Api.reprocessItem flags model.item.id [] ReprocessFileResp
+                    Api.reprocessItem env.flags model.item.id [] ReprocessFileResp
             in
             resultModelCmd ( { model | itemModal = Nothing }, cmd )
 
@@ -1594,9 +1578,9 @@ update key flags inav settings msg model =
                 )
 
         RestoreItem ->
-            resultModelCmd ( model, Api.restoreItem flags model.item.id SaveResp )
+            resultModelCmd ( model, Api.restoreItem env.flags model.item.id SaveResp )
 
-        ToggleShowQrItem id ->
+        ToggleShowQrItem _ ->
             let
                 sqm =
                     model.showQrModel
@@ -1606,7 +1590,7 @@ update key flags inav settings msg model =
             in
             resultModel { model | showQrModel = next, mobileItemMenuOpen = False }
 
-        ToggleShowQrAttach id ->
+        ToggleShowQrAttach _ ->
             let
                 sqm =
                     model.showQrModel
@@ -1619,6 +1603,16 @@ update key flags inav settings msg model =
         PrintElement id ->
             resultModelCmd ( model, Ports.printElement id )
 
+        ToggleSelectItem ->
+            let
+                res =
+                    resultModel { model | mobileItemMenuOpen = False }
+
+                newSelection =
+                    Data.ItemIds.toggle env.selectedItems model.item.id
+            in
+            { res | selectionChange = newSelection }
+
 
 
 --- Helper
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
index a321744b..40094489 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
@@ -27,8 +27,10 @@ import Comp.ItemDetail.SingleAttachment
 import Comp.ItemMail
 import Comp.MenuBar as MB
 import Comp.SentMails
+import Data.Environment as Env
 import Data.Flags exposing (Flags)
 import Data.Icons as Icons
+import Data.ItemIds
 import Data.ItemNav exposing (ItemNav)
 import Data.UiSettings exposing (UiSettings)
 import Html exposing (..)
@@ -39,13 +41,13 @@ import Page exposing (Page(..))
 import Styles as S
 
 
-view : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
-view texts flags inav settings model =
+view : Texts -> ItemNav -> Env.View -> Model -> Html Msg
+view texts inav env model =
     div [ class "flex flex-col h-full" ]
-        [ header texts settings inav model
+        [ header texts inav env model
 
         --        , menuBar texts inav settings model
-        , body texts flags inav settings model
+        , body texts env.flags inav env.settings model
         , itemModal texts model
         ]
 
@@ -60,25 +62,35 @@ itemModal texts model =
             span [ class "hidden" ] []
 
 
-header : Texts -> UiSettings -> ItemNav -> Model -> Html Msg
-header texts settings inav model =
+header : Texts -> ItemNav -> Env.View -> Model -> Html Msg
+header texts inav env model =
     div [ class "my-3" ]
         [ Comp.ItemDetail.ItemInfoHeader.view texts.itemInfoHeader
-            settings
+            env.settings
             model
-            (menuBar texts inav settings model)
+            (menuBar texts inav env model)
         ]
 
 
-menuBar : Texts -> ItemNav -> UiSettings -> Model -> Html Msg
-menuBar texts inav settings model =
+menuBar : Texts -> ItemNav -> Env.View -> Model -> Html Msg
+menuBar texts inav env model =
     let
         keyDescr name =
-            if settings.itemDetailShortcuts && model.menuOpen then
+            if env.settings.itemDetailShortcuts && model.menuOpen then
                 " " ++ texts.key ++ "'" ++ name ++ "'."
 
             else
                 ""
+
+        isSelected =
+            Data.ItemIds.isMember env.selectedItems model.item.id
+
+        foldSelected fsel funsel =
+            if isSelected then
+                fsel
+
+            else
+                funsel
     in
     MB.view
         { start =
@@ -210,7 +222,18 @@ menuBar texts inav settings model =
                 , toggleMenu = ToggleMobileItemMenu
                 , menuOpen = model.mobileItemMenuOpen
                 , items =
-                    [ { icon = i [ class "fa fa-envelope font-thin" ] []
+                    [ { icon =
+                            foldSelected
+                                (i [ class "fa fa-check-square dark:text-lime-400 text-lime-600" ] [])
+                                (i [ class "fa fa-tasks" ] [])
+                      , label = foldSelected texts.deselectItem texts.selectItem
+                      , disabled = False
+                      , attrs =
+                            [ href "#"
+                            , onClick ToggleSelectItem
+                            ]
+                      }
+                    , { icon = i [ class "fa fa-envelope font-thin" ] []
                       , label = texts.sendMail
                       , disabled = False
                       , attrs =
@@ -281,13 +304,28 @@ menuBar texts inav settings model =
             ]
         , end =
             [ MB.CustomElement <|
+                a
+                    [ href "#"
+                    , onClick ToggleSelectItem
+                    , title (foldSelected texts.deselectItem texts.selectItem)
+                    , class "hidden md:flex flex-row items-center h-full "
+                    , classList
+                        [ ( S.greenButton, isSelected )
+                        , ( S.secondaryBasicButton, not isSelected )
+                        ]
+                    ]
+                    [ foldSelected
+                        (i [ class "fa fa-square-check" ] [])
+                        (i [ class "fa fa-list-check" ] [])
+                    ]
+            , MB.CustomElement <|
                 a
                     [ class S.secondaryBasicButton
                     , href "#"
                     , onClick UnconfirmItem
                     , title texts.unconfirmItemMetadata
-                    , classList [ ( "hidden", model.item.state == "created" ) ]
-                    , class "hidden md:block"
+                    , class "hidden"
+                    , classList [ ( "md:block", model.item.state /= "created" ) ]
                     ]
                     [ i [ class "fa fa-eye-slash font-thin" ] []
                     ]
diff --git a/modules/webapp/src/main/elm/Comp/SearchMenu.elm b/modules/webapp/src/main/elm/Comp/SearchMenu.elm
index 7c929f80..2937c320 100644
--- a/modules/webapp/src/main/elm/Comp/SearchMenu.elm
+++ b/modules/webapp/src/main/elm/Comp/SearchMenu.elm
@@ -1594,8 +1594,8 @@ searchTabs texts ddd flags settings selectedItems model =
                         i [ class "fa fa-check mr-2" ] []
 
                       else
-                        i [ class "fa fa-list mr-2" ] []
-                    , text "Show selection"
+                        i [ class "fa fa-list-check mr-2" ] []
+                    , text texts.showSelection
                     ]
                 , a
                     [ class "flex flex-row items-center"
@@ -1604,7 +1604,7 @@ searchTabs texts ddd flags settings selectedItems model =
                     , Html.Events.onClick ClearSelection
                     ]
                     [ i [ class "fa fa-times mr-2" ] []
-                    , text "Clear selection"
+                    , text texts.clearSelection
                     ]
                 ]
             ]
diff --git a/modules/webapp/src/main/elm/Data/Environment.elm b/modules/webapp/src/main/elm/Data/Environment.elm
index 171ef95d..c9d58de9 100644
--- a/modules/webapp/src/main/elm/Data/Environment.elm
+++ b/modules/webapp/src/main/elm/Data/Environment.elm
@@ -14,9 +14,7 @@ import Data.UiSettings exposing (UiSettings)
 
 
 type alias Update =
-    { bookmarkId : Maybe String
-    , lastViewedItemId : Maybe String
-    , key : Nav.Key
+    { key : Nav.Key
     , selectedItems : ItemIds
     , flags : Flags
     , settings : UiSettings
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
index 59af72d8..11a315e8 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
@@ -57,6 +57,8 @@ type alias Texts =
     , mailSendSuccessful : String
     , showQrCode : String
     , close : String
+    , selectItem : String
+    , deselectItem : String
     }
 
 
@@ -93,6 +95,8 @@ gb =
     , mailSendSuccessful = "Mail sent."
     , showQrCode = "Show URL as QR code"
     , close = "Close"
+    , selectItem = "Select this item"
+    , deselectItem = "Deselect this item"
     }
 
 
@@ -115,7 +119,7 @@ de =
     , addMoreFiles = "Diesem Dokument weitere Dateien anfügen"
     , confirmItemMetadata = "Metadaten bestätigen"
     , confirm = "Bestätige"
-    , unconfirmItemMetadata = "Widerrufe"
+    , unconfirmItemMetadata = "Widerrufe Bestätigung"
     , reprocessItem = "Das Dokument erneut verarbeiten"
     , deleteThisItem = "Das Dokument löschen"
     , undeleteThisItem = "Das Dokument wiederherstellen"
@@ -129,4 +133,6 @@ de =
     , mailSendSuccessful = "E-Mail wurde versendet."
     , showQrCode = "Link als QR code anzeigen"
     , close = "Schließen"
+    , selectItem = "Zur Auswahl hinzufügen"
+    , deselectItem = "Aus Auswahl entfernen"
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/MultiEditMenu.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/MultiEditMenu.elm
index b46a81d1..0cb8edfd 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/MultiEditMenu.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/MultiEditMenu.elm
@@ -64,7 +64,7 @@ de =
     , chooseDirection = "Wähle eine Richtung…"
     , confirmUnconfirm = "Bestätige/Widerrufe Metadaten"
     , confirm = "Bestätige"
-    , unconfirm = "Widerrufe"
+    , unconfirm = "Widerrufe Bestätigung"
     , changeTagMode = "Wechsel den Änderungsmodus für Tags"
     , dueDateTab = "Fälligkeitsdatum"
     , direction = Messages.Data.Direction.de
diff --git a/modules/webapp/src/main/elm/Messages/Comp/SearchMenu.elm b/modules/webapp/src/main/elm/Messages/Comp/SearchMenu.elm
index fc3ecc27..6b301bc7 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/SearchMenu.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/SearchMenu.elm
@@ -51,6 +51,8 @@ type alias Texts =
     , trashcan : String
     , bookmarks : String
     , selection : String
+    , showSelection : String
+    , clearSelection : String
     }
 
 
@@ -86,6 +88,8 @@ gb =
     , trashcan = "Trash"
     , bookmarks = "Bookmarks"
     , selection = "Selection"
+    , showSelection = "Show selection"
+    , clearSelection = "Clear selection"
     }
 
 
@@ -121,4 +125,6 @@ de =
     , trashcan = "Papierkorb"
     , bookmarks = "Bookmarks"
     , selection = "Auswahl"
+    , showSelection = "Auswahl anzeigen"
+    , clearSelection = "Auswahl aufheben"
     }
diff --git a/modules/webapp/src/main/elm/Page/ItemDetail/Data.elm b/modules/webapp/src/main/elm/Page/ItemDetail/Data.elm
index 21c8939c..3d0111a4 100644
--- a/modules/webapp/src/main/elm/Page/ItemDetail/Data.elm
+++ b/modules/webapp/src/main/elm/Page/ItemDetail/Data.elm
@@ -17,6 +17,7 @@ import Browser.Dom as Dom
 import Comp.ItemDetail
 import Comp.ItemDetail.Model
 import Comp.LinkTarget exposing (LinkTarget)
+import Data.ItemIds exposing (ItemIds)
 import Http
 
 
@@ -45,4 +46,5 @@ type alias UpdateResult =
     , sub : Sub Msg
     , linkTarget : LinkTarget
     , removedItem : Maybe String
+    , selectedItems : ItemIds
     }
diff --git a/modules/webapp/src/main/elm/Page/ItemDetail/Update.elm b/modules/webapp/src/main/elm/Page/ItemDetail/Update.elm
index 5e4e7128..f8ef0541 100644
--- a/modules/webapp/src/main/elm/Page/ItemDetail/Update.elm
+++ b/modules/webapp/src/main/elm/Page/ItemDetail/Update.elm
@@ -8,29 +8,26 @@
 module Page.ItemDetail.Update exposing (update)
 
 import Api
-import Browser.Navigation as Nav
 import Comp.ItemDetail
 import Comp.ItemDetail.Model
 import Comp.LinkTarget
-import Data.Flags exposing (Flags)
+import Data.Environment as Env
+import Data.ItemIds
 import Data.ItemNav exposing (ItemNav)
-import Data.UiSettings exposing (UiSettings)
 import Page exposing (Page(..))
 import Page.ItemDetail.Data exposing (Model, Msg(..), UpdateResult)
 import Scroll
 import Task
 
 
-update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult
-update key flags inav settings msg model =
+update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
+update inav env msg model =
     case msg of
         Init id ->
             let
                 result =
-                    Comp.ItemDetail.update key
-                        flags
-                        inav
-                        settings
+                    Comp.ItemDetail.update inav
+                        env
                         Comp.ItemDetail.Model.Init
                         model.detail
 
@@ -40,19 +37,20 @@ update key flags inav settings msg model =
             { model = { model | detail = result.model }
             , cmd =
                 Cmd.batch
-                    [ Api.itemDetail flags id ItemResp
+                    [ Api.itemDetail env.flags id ItemResp
                     , Cmd.map ItemDetailMsg result.cmd
                     , Task.attempt ScrollResult task
                     ]
             , sub = Sub.map ItemDetailMsg result.sub
             , linkTarget = result.linkTarget
             , removedItem = result.removedItem
+            , selectedItems = env.selectedItems
             }
 
         ItemDetailMsg lmsg ->
             let
                 result =
-                    Comp.ItemDetail.update key flags inav settings lmsg model.detail
+                    Comp.ItemDetail.update inav env lmsg model.detail
 
                 pageSwitch =
                     case result.linkTarget of
@@ -60,13 +58,14 @@ update key flags inav settings msg model =
                             Cmd.none
 
                         _ ->
-                            Page.set key (SearchPage Nothing)
+                            Page.set env.key (SearchPage Nothing)
             in
             { model = { model | detail = result.model }
             , cmd = Cmd.batch [ pageSwitch, Cmd.map ItemDetailMsg result.cmd ]
             , sub = Sub.map ItemDetailMsg result.sub
             , linkTarget = result.linkTarget
             , removedItem = result.removedItem
+            , selectedItems = Data.ItemIds.apply env.selectedItems result.selectionChange
             }
 
         ItemResp (Ok item) ->
@@ -74,17 +73,28 @@ update key flags inav settings msg model =
                 lmsg =
                     Comp.ItemDetail.Model.SetItem item
             in
-            update key flags inav settings (ItemDetailMsg lmsg) model
+            update inav env (ItemDetailMsg lmsg) model
 
         ItemResp (Err _) ->
-            UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing
+            unit env model
 
         ScrollResult _ ->
-            UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing
+            unit env model
 
         UiSettingsUpdated ->
             let
                 lmsg =
                     ItemDetailMsg Comp.ItemDetail.Model.UiSettingsUpdated
             in
-            update key flags inav settings lmsg model
+            update inav env lmsg model
+
+
+unit : Env.Update -> Model -> UpdateResult
+unit env model =
+    { model = model
+    , cmd = Cmd.none
+    , sub = Sub.none
+    , linkTarget = Comp.LinkTarget.LinkNone
+    , removedItem = Nothing
+    , selectedItems = env.selectedItems
+    }
diff --git a/modules/webapp/src/main/elm/Page/ItemDetail/View2.elm b/modules/webapp/src/main/elm/Page/ItemDetail/View2.elm
index 00ab403a..8f1c2855 100644
--- a/modules/webapp/src/main/elm/Page/ItemDetail/View2.elm
+++ b/modules/webapp/src/main/elm/Page/ItemDetail/View2.elm
@@ -12,6 +12,7 @@ import Comp.ItemDetail
 import Comp.ItemDetail.EditForm
 import Comp.ItemDetail.Model
 import Comp.MenuBar as MB
+import Data.Environment as Env
 import Data.Flags exposing (Flags)
 import Data.ItemNav exposing (ItemNav)
 import Data.UiSettings exposing (UiSettings)
@@ -23,13 +24,13 @@ import Page.ItemDetail.Data exposing (..)
 import Styles as S
 
 
-viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg
-viewSidebar texts visible flags settings model =
+viewSidebar : Texts -> Env.View -> Model -> Html Msg
+viewSidebar texts env model =
     div
         [ id "sidebar"
         , class S.sidebar
         , class S.sidebarBg
-        , classList [ ( "hidden", not visible ) ]
+        , classList [ ( "hidden", not env.sidebarVisible ) ]
         ]
         [ div
             [ class S.header2
@@ -57,16 +58,16 @@ viewSidebar texts visible flags settings model =
             , sticky = True
             }
         , Html.map ItemDetailMsg
-            (Comp.ItemDetail.EditForm.view2 texts.editForm flags settings model.detail)
+            (Comp.ItemDetail.EditForm.view2 texts.editForm env.flags env.settings model.detail)
         ]
 
 
-viewContent : Texts -> ItemNav -> Flags -> UiSettings -> Model -> Html Msg
-viewContent texts inav flags settings model =
+viewContent : Texts -> ItemNav -> Env.View -> Model -> Html Msg
+viewContent texts inav env model =
     div
         [ id "content"
         , class S.content
         ]
         [ Html.map ItemDetailMsg
-            (Comp.ItemDetail.view2 texts.itemDetail flags inav settings model.detail)
+            (Comp.ItemDetail.view2 texts.itemDetail inav env model.detail)
         ]
diff --git a/modules/webapp/src/main/elm/Page/Search/Data.elm b/modules/webapp/src/main/elm/Page/Search/Data.elm
index ba1ca9a0..6679ea77 100644
--- a/modules/webapp/src/main/elm/Page/Search/Data.elm
+++ b/modules/webapp/src/main/elm/Page/Search/Data.elm
@@ -234,6 +234,7 @@ type Msg
     | ToggleExpandCollapseRows
     | ToggleBookmarkCurrentQueryView
     | BookmarkQueryMsg Comp.BookmarkQueryManage.Msg
+    | ItemSelectionChanged
 
 
 type SearchType
diff --git a/modules/webapp/src/main/elm/Page/Search/Update.elm b/modules/webapp/src/main/elm/Page/Search/Update.elm
index 3db0ae46..3b1b5771 100644
--- a/modules/webapp/src/main/elm/Page/Search/Update.elm
+++ b/modules/webapp/src/main/elm/Page/Search/Update.elm
@@ -50,8 +50,8 @@ type alias UpdateResult =
     }
 
 
-update : Texts -> Env.Update -> Msg -> Model -> UpdateResult
-update texts env msg model =
+update : Texts -> Maybe String -> Maybe String -> Env.Update -> Msg -> Model -> UpdateResult
+update texts bookmarkId lastViewedItemId env msg model =
     case msg of
         Init ->
             let
@@ -65,14 +65,14 @@ update texts env msg model =
                     }
 
                 setBookmark =
-                    Maybe.map (\bmId -> SearchMenuMsg <| Comp.SearchMenu.SetBookmark bmId) env.bookmarkId
+                    Maybe.map (\bmId -> SearchMenuMsg <| Comp.SearchMenu.SetBookmark bmId) bookmarkId
                         |> Maybe.withDefault DoNothing
             in
-            makeResult env <|
+            makeResult env.selectedItems <|
                 Util.Update.andThen3
-                    [ update texts env (SearchMenuMsg Comp.SearchMenu.Init)
-                    , update texts env setBookmark
-                    , doSearch env searchParam
+                    [ update texts bookmarkId lastViewedItemId env (SearchMenuMsg Comp.SearchMenu.Init)
+                    , update texts bookmarkId lastViewedItemId env setBookmark
+                    , doSearch env.selectedItems searchParam
                     ]
                     model
 
@@ -84,7 +84,7 @@ update texts env msg model =
                 nm =
                     { model | searchOffset = 0, powerSearchInput = Comp.PowerSearchInput.init }
             in
-            update texts env (SearchMenuMsg Comp.SearchMenu.ResetForm) nm
+            update texts bookmarkId lastViewedItemId env (SearchMenuMsg Comp.SearchMenu.ResetForm) nm
 
         SearchMenuMsg m ->
             let
@@ -125,10 +125,10 @@ update texts env msg model =
 
                 result =
                     if nextState.stateChange && not model.searchInProgress then
-                        doSearch env searchParam newModel
+                        doSearch env.selectedItems searchParam newModel
 
                     else
-                        resultModelCmd env ( newModel, Cmd.none )
+                        resultModelCmd env.selectedItems ( newModel, Cmd.none )
             in
             { result
                 | cmd =
@@ -144,10 +144,10 @@ update texts env msg model =
         SetLinkTarget lt ->
             case linkTargetMsg lt of
                 Just m ->
-                    update texts env m model
+                    update texts bookmarkId lastViewedItemId env m model
 
                 Nothing ->
-                    makeResult env ( model, Cmd.none, Sub.none )
+                    makeResult env.selectedItems ( model, Cmd.none, Sub.none )
 
         ItemCardListMsg m ->
             let
@@ -197,7 +197,7 @@ update texts env msg model =
                     else
                         Set.empty
             in
-            resultModelCmd env ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none )
+            resultModelCmd env.selectedItems ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none )
 
         ItemSearchResp scroll (Ok list) ->
             let
@@ -211,14 +211,14 @@ update texts env msg model =
                         , moreAvailable = list.groups /= []
                     }
             in
-            makeResult env <|
+            makeResult env.selectedItems <|
                 Util.Update.andThen3
-                    [ update texts env (ItemCardListMsg (Comp.ItemCardList.SetResults list))
+                    [ update texts bookmarkId lastViewedItemId env (ItemCardListMsg (Comp.ItemCardList.SetResults list))
                     , if scroll then
-                        scrollToCard env
+                        scrollToCard env.selectedItems lastViewedItemId
 
                       else
-                        \next -> makeResult env ( next, Cmd.none, Sub.none )
+                        \next -> makeResult env.selectedItems ( next, Cmd.none, Sub.none )
                     ]
                     m
 
@@ -235,10 +235,10 @@ update texts env msg model =
                         , moreAvailable = list.groups /= []
                     }
             in
-            update texts env (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
+            update texts bookmarkId lastViewedItemId env (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
 
         ItemSearchAddResp (Err _) ->
-            resultModelCmd env
+            resultModelCmd env.selectedItems
                 ( { model
                     | moreInProgress = False
                   }
@@ -246,7 +246,7 @@ update texts env msg model =
                 )
 
         ItemSearchResp _ (Err _) ->
-            resultModelCmd env
+            resultModelCmd env.selectedItems
                 ( { model
                     | searchInProgress = False
                   }
@@ -268,10 +268,10 @@ update texts env msg model =
                     }
             in
             if model.searchInProgress then
-                resultModelCmd env ( model, Cmd.none )
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
             else
-                doSearch env param nm
+                doSearch env.selectedItems param nm
 
         RefreshView ->
             let
@@ -285,10 +285,10 @@ update texts env msg model =
                     }
             in
             if model.searchInProgress then
-                resultModelCmd env ( model, Cmd.none )
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
             else
-                doSearch env param model
+                doSearch env.selectedItems param model
 
         ToggleSelectView ->
             let
@@ -303,45 +303,45 @@ update texts env msg model =
                         PublishView q ->
                             ( PublishView q, Cmd.none )
             in
-            resultModelCmd env ( { model | viewMode = nextView }, cmd )
+            resultModelCmd env.selectedItems ( { model | viewMode = nextView }, cmd )
 
         LoadMore ->
             if model.moreAvailable then
-                doSearchMore env model |> resultModelCmd env
+                doSearchMore env model |> resultModelCmd env.selectedItems
 
             else
-                resultModelCmd env ( model, Cmd.none )
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
         SetBasicSearch str ->
             let
                 smMsg =
                     SearchMenuMsg (Comp.SearchMenu.SetTextSearch str)
             in
-            update texts env smMsg model
+            update texts bookmarkId lastViewedItemId env smMsg model
 
         ToggleSearchType ->
             case model.searchTypeDropdownValue of
                 BasicSearch ->
-                    update texts env (SearchMenuMsg Comp.SearchMenu.SetFulltextSearch) model
+                    update texts bookmarkId lastViewedItemId env (SearchMenuMsg Comp.SearchMenu.SetFulltextSearch) model
 
                 ContentOnlySearch ->
-                    update texts env (SearchMenuMsg Comp.SearchMenu.SetNamesSearch) model
+                    update texts bookmarkId lastViewedItemId env (SearchMenuMsg Comp.SearchMenu.SetNamesSearch) model
 
         KeyUpSearchbarMsg (Just Enter) ->
-            update texts env (DoSearch model.searchTypeDropdownValue) model
+            update texts bookmarkId lastViewedItemId env (DoSearch model.searchTypeDropdownValue) model
 
         KeyUpSearchbarMsg _ ->
-            resultModelCmd env ( model, Cmd.none )
+            resultModelCmd env.selectedItems ( model, Cmd.none )
 
         ScrollResult _ ->
             let
                 cmd =
                     Process.sleep 800 |> Task.perform (always ClearItemDetailId)
             in
-            resultModelCmd env ( model, cmd )
+            resultModelCmd env.selectedItems ( model, cmd )
 
         ClearItemDetailId ->
-            resultModelCmd env ( { model | scrollToCard = Nothing }, Cmd.none )
+            resultModelCmd env.selectedItems ( { model | scrollToCard = Nothing }, Cmd.none )
 
         SelectAllItems ->
             let
@@ -352,16 +352,12 @@ update texts env msg model =
                     Data.ItemIds.apply env.selectedItems (Data.ItemIds.selectAll visible)
 
                 res_ =
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
             in
             { res_ | selectedItems = itemIds }
 
         SelectNoItems ->
-            let
-                result =
-                    update texts env (SearchMenuMsg <| Comp.SearchMenu.setIncludeSelection False) model
-            in
-            { result | selectedItems = Data.ItemIds.empty }
+            resultModelCmd Data.ItemIds.empty ( model, Cmd.none )
 
         DeleteSelectedConfirmed ->
             case model.viewMode of
@@ -370,7 +366,7 @@ update texts env msg model =
                         cmd =
                             Api.deleteAllItems env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp
                     in
-                    resultModelCmd env
+                    resultModelCmd env.selectedItems
                         ( { model
                             | viewMode =
                                 SelectView
@@ -383,7 +379,7 @@ update texts env msg model =
                         )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         RestoreSelectedConfirmed ->
             case model.viewMode of
@@ -392,7 +388,7 @@ update texts env msg model =
                         cmd =
                             Api.restoreAllItems env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp
                     in
-                    resultModelCmd env
+                    resultModelCmd env.selectedItems
                         ( { model
                             | viewMode =
                                 SelectView
@@ -405,7 +401,7 @@ update texts env msg model =
                         )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         DeleteAllResp (Ok res) ->
             if res.success then
@@ -422,19 +418,19 @@ update texts env msg model =
                         , selectedItems = env.selectedItems
                         }
                 in
-                doSearch env param nm
+                doSearch env.selectedItems param nm
 
             else
-                resultModelCmd env ( model, Cmd.none )
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
         DeleteAllResp (Err _) ->
-            resultModelCmd env ( model, Cmd.none )
+            resultModelCmd env.selectedItems ( model, Cmd.none )
 
         RequestReprocessSelected ->
             case model.viewMode of
                 SelectView svm ->
                     if Data.ItemIds.isEmpty env.selectedItems then
-                        resultModelCmd env ( model, Cmd.none )
+                        resultModelCmd env.selectedItems ( model, Cmd.none )
 
                     else
                         let
@@ -448,15 +444,15 @@ update texts env msg model =
                                             }
                                 }
                         in
-                        resultModelCmd env ( model_, Cmd.none )
+                        resultModelCmd env.selectedItems ( model_, Cmd.none )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         CloseConfirmModal ->
             case model.viewMode of
                 SelectView svm ->
-                    resultModelCmd env
+                    resultModelCmd env.selectedItems
                         ( { model
                             | viewMode = SelectView { svm | confirmModal = Nothing, action = NoneAction }
                           }
@@ -464,20 +460,20 @@ update texts env msg model =
                         )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         ReprocessSelectedConfirmed ->
             case model.viewMode of
                 SelectView svm ->
                     if Data.ItemIds.isEmpty env.selectedItems then
-                        resultModelCmd env ( model, Cmd.none )
+                        resultModelCmd env.selectedItems ( model, Cmd.none )
 
                     else
                         let
                             cmd =
                                 Api.reprocessMultiple env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp
                         in
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( { model
                                 | viewMode =
                                     SelectView
@@ -490,13 +486,13 @@ update texts env msg model =
                             )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         RequestDeleteSelected ->
             case model.viewMode of
                 SelectView svm ->
                     if Data.ItemIds.isEmpty env.selectedItems then
-                        resultModelCmd env ( model, Cmd.none )
+                        resultModelCmd env.selectedItems ( model, Cmd.none )
 
                     else
                         let
@@ -510,16 +506,16 @@ update texts env msg model =
                                             }
                                 }
                         in
-                        resultModelCmd env ( model_, Cmd.none )
+                        resultModelCmd env.selectedItems ( model_, Cmd.none )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         RequestRestoreSelected ->
             case model.viewMode of
                 SelectView svm ->
                     if Data.ItemIds.isEmpty env.selectedItems then
-                        resultModelCmd env ( model, Cmd.none )
+                        resultModelCmd env.selectedItems ( model, Cmd.none )
 
                     else
                         let
@@ -533,37 +529,37 @@ update texts env msg model =
                                             }
                                 }
                         in
-                        resultModelCmd env ( model_, Cmd.none )
+                        resultModelCmd env.selectedItems ( model_, Cmd.none )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         EditSelectedItems ->
             case model.viewMode of
                 SelectView svm ->
                     if svm.action == EditSelected then
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( { model | viewMode = SelectView { svm | action = NoneAction } }
                             , Cmd.none
                             )
 
                     else if Data.ItemIds.isEmpty env.selectedItems then
-                        resultModelCmd env ( model, Cmd.none )
+                        resultModelCmd env.selectedItems ( model, Cmd.none )
 
                     else
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( { model | viewMode = SelectView { svm | action = EditSelected } }
                             , Cmd.none
                             )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         MergeSelectedItems ->
             case model.viewMode of
                 SelectView svm ->
                     if svm.action == MergeSelected then
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( { model
                                 | viewMode =
                                     SelectView
@@ -582,7 +578,7 @@ update texts env msg model =
                                     ( mm, mc ) =
                                         Comp.ItemMerge.initQuery env.flags model.searchMenuModel.searchMode q
                                 in
-                                resultModelCmd env
+                                resultModelCmd env.selectedItems
                                     ( { model
                                         | viewMode =
                                             SelectView
@@ -595,10 +591,10 @@ update texts env msg model =
                                     )
 
                             Nothing ->
-                                resultModelCmd env ( model, Cmd.none )
+                                resultModelCmd env.selectedItems ( model, Cmd.none )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         MergeItemsMsg lmsg ->
             case model.viewMode of
@@ -623,18 +619,20 @@ update texts env msg model =
                     in
                     if result.outcome == Comp.ItemMerge.OutcomeMerged then
                         update texts
+                            bookmarkId
+                            lastViewedItemId
                             env
                             (DoSearch model.searchTypeDropdownValue)
                             model_
 
                     else
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( model_
                             , Cmd.map MergeItemsMsg result.cmd
                             )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         PublishSelectedItems ->
             case model.viewMode of
@@ -644,7 +642,7 @@ update texts env msg model =
                             ( mm, mc ) =
                                 Comp.PublishItems.init env.flags
                         in
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( { model
                                 | viewMode =
                                     SelectView
@@ -663,7 +661,7 @@ update texts env msg model =
                                     ( mm, mc ) =
                                         Comp.PublishItems.initQuery env.flags q
                                 in
-                                resultModelCmd env
+                                resultModelCmd env.selectedItems
                                     ( { model
                                         | viewMode =
                                             SelectView
@@ -676,10 +674,10 @@ update texts env msg model =
                                     )
 
                             Nothing ->
-                                resultModelCmd env ( model, Cmd.none )
+                                resultModelCmd env.selectedItems ( model, Cmd.none )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         PublishItemsMsg lmsg ->
             case model.viewMode of
@@ -701,18 +699,20 @@ update texts env msg model =
                     in
                     if result.outcome == Comp.PublishItems.OutcomeDone then
                         update texts
+                            bookmarkId
+                            lastViewedItemId
                             env
                             (DoSearch model.searchTypeDropdownValue)
                             model_
 
                     else
-                        resultModelCmd env
+                        resultModelCmd env.selectedItems
                             ( model_
                             , Cmd.map PublishItemsMsg result.cmd
                             )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         EditMenuMsg lmsg ->
             case model.viewMode of
@@ -755,14 +755,14 @@ update texts env msg model =
                                 res.change
                                 (MultiUpdateResp res.change)
                     in
-                    makeResult env
+                    makeResult env.selectedItems
                         ( { model | viewMode = SelectView svm_ }
                         , Cmd.batch [ cmd_, upCmd ]
                         , sub_
                         )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         MultiUpdateResp change (Ok res) ->
             let
@@ -771,23 +771,23 @@ update texts env msg model =
             in
             if res.success then
                 -- replace changed items in the view
-                resultModelCmd env ( nm, loadChangedItems env.flags model.searchMenuModel.searchMode env.selectedItems )
+                resultModelCmd env.selectedItems ( nm, loadChangedItems env.flags model.searchMenuModel.searchMode env.selectedItems )
 
             else
-                resultModelCmd env ( nm, Cmd.none )
+                resultModelCmd env.selectedItems ( nm, Cmd.none )
 
         MultiUpdateResp change (Err _) ->
-            makeResult env
+            makeResult env.selectedItems
                 ( updateSelectViewNameState False model change
                 , Cmd.none
                 , Sub.none
                 )
 
         ReplaceChangedItemsResp (Ok items) ->
-            resultModelCmd env ( replaceItems model items, Cmd.none )
+            resultModelCmd env.selectedItems ( replaceItems model items, Cmd.none )
 
         ReplaceChangedItemsResp (Err _) ->
-            resultModelCmd env ( model, Cmd.none )
+            resultModelCmd env.selectedItems ( model, Cmd.none )
 
         UiSettingsUpdated ->
             let
@@ -805,7 +805,7 @@ update texts env msg model =
                 model_ =
                     { model | viewMode = viewMode }
             in
-            update texts env (DoSearch model.lastSearchType) model_
+            update texts bookmarkId lastViewedItemId env (DoSearch model.lastSearchType) model_
 
         SearchStatsResp result ->
             let
@@ -815,7 +815,7 @@ update texts env msg model =
                 stats =
                     Result.withDefault model.searchStats result
             in
-            update texts env lm { model | searchStats = stats }
+            update texts bookmarkId lastViewedItemId env lm { model | searchStats = stats }
 
         TogglePreviewFullWidth ->
             let
@@ -825,7 +825,7 @@ update texts env msg model =
                 cmd =
                     Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp
             in
-            resultModelCmd env ( { model | viewMenuOpen = False }, cmd )
+            resultModelCmd env.selectedItems ( { model | viewMenuOpen = False }, cmd )
 
         ClientSettingsSaveResp (Ok res) ->
             if res.success then
@@ -837,10 +837,10 @@ update texts env msg model =
                 }
 
             else
-                resultModelCmd env ( model, Cmd.none )
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
         ClientSettingsSaveResp (Err _) ->
-            resultModelCmd env ( model, Cmd.none )
+            resultModelCmd env.selectedItems ( model, Cmd.none )
 
         PowerSearchMsg lm ->
             let
@@ -855,19 +855,19 @@ update texts env msg model =
             in
             case result.action of
                 Comp.PowerSearchInput.NoAction ->
-                    makeResult env ( model_, cmd_, Sub.map PowerSearchMsg result.subs )
+                    makeResult env.selectedItems ( model_, cmd_, Sub.map PowerSearchMsg result.subs )
 
                 Comp.PowerSearchInput.SubmitSearch ->
-                    update texts env (DoSearch model_.searchTypeDropdownValue) model_
+                    update texts bookmarkId lastViewedItemId env (DoSearch model_.searchTypeDropdownValue) model_
 
         KeyUpPowerSearchbarMsg (Just Enter) ->
-            update texts env (DoSearch model.searchTypeDropdownValue) model
+            update texts bookmarkId lastViewedItemId env (DoSearch model.searchTypeDropdownValue) model
 
         KeyUpPowerSearchbarMsg _ ->
-            resultModelCmd env ( model, Cmd.none )
+            resultModelCmd env.selectedItems ( model, Cmd.none )
 
         RemoveItem id ->
-            update texts env (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model
+            update texts bookmarkId lastViewedItemId env (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model
 
         TogglePublishCurrentQueryView ->
             case createQuery env.selectedItems model of
@@ -876,30 +876,33 @@ update texts env msg model =
                         ( pm, pc ) =
                             Comp.PublishItems.initQuery env.flags q
                     in
-                    resultModelCmd env ( { model | viewMode = PublishView pm, viewMenuOpen = False }, Cmd.map PublishViewMsg pc )
+                    resultModelCmd env.selectedItems
+                        ( { model | viewMode = PublishView pm, viewMenuOpen = False }
+                        , Cmd.map PublishViewMsg pc
+                        )
 
                 Nothing ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         ToggleBookmarkCurrentQueryView ->
             case createQuery env.selectedItems model of
                 Just q ->
                     case model.topWidgetModel of
                         BookmarkQuery _ ->
-                            resultModelCmd env ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none )
+                            resultModelCmd env.selectedItems ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none )
 
                         TopWidgetHidden ->
                             let
                                 ( qm, qc ) =
                                     Comp.BookmarkQueryManage.init (Q.render q)
                             in
-                            resultModelCmd env
+                            resultModelCmd env.selectedItems
                                 ( { model | topWidgetModel = BookmarkQuery qm, viewMenuOpen = False }
                                 , Cmd.map BookmarkQueryMsg qc
                                 )
 
                 Nothing ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         BookmarkQueryMsg lm ->
             case model.topWidgetModel of
@@ -927,7 +930,7 @@ update texts env msg model =
                             else
                                 Cmd.none
                     in
-                    makeResult env
+                    makeResult env.selectedItems
                         ( { model | topWidgetModel = nextModel }
                         , Cmd.batch
                             [ Cmd.map BookmarkQueryMsg res.cmd
@@ -937,7 +940,7 @@ update texts env msg model =
                         )
 
                 TopWidgetHidden ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         PublishViewMsg lmsg ->
             case model.viewMode of
@@ -948,22 +951,22 @@ update texts env msg model =
                     in
                     case result.outcome of
                         Comp.PublishItems.OutcomeInProgress ->
-                            resultModelCmd env
+                            resultModelCmd env.selectedItems
                                 ( { model | viewMode = PublishView result.model }
                                 , Cmd.map PublishViewMsg result.cmd
                                 )
 
                         Comp.PublishItems.OutcomeDone ->
-                            resultModelCmd env
+                            resultModelCmd env.selectedItems
                                 ( { model | viewMode = SearchView }
                                 , Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks env.flags)
                                 )
 
                 _ ->
-                    resultModelCmd env ( model, Cmd.none )
+                    resultModelCmd env.selectedItems ( model, Cmd.none )
 
         ToggleViewMenu ->
-            resultModelCmd env ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none )
+            resultModelCmd env.selectedItems ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none )
 
         ToggleShowGroups ->
             let
@@ -973,7 +976,7 @@ update texts env msg model =
                 cmd =
                     Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp
             in
-            resultModelCmd env ( { model | viewMenuOpen = False }, cmd )
+            resultModelCmd env.selectedItems ( { model | viewMenuOpen = False }, cmd )
 
         ToggleArrange am ->
             let
@@ -983,7 +986,19 @@ update texts env msg model =
                 cmd =
                     Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp
             in
-            resultModelCmd env ( { model | viewMenuOpen = False }, cmd )
+            resultModelCmd env.selectedItems ( { model | viewMenuOpen = False }, cmd )
+
+        ItemSelectionChanged ->
+            if Data.ItemIds.isEmpty env.selectedItems then
+                update texts
+                    bookmarkId
+                    lastViewedItemId
+                    env
+                    (SearchMenuMsg <| Comp.SearchMenu.setIncludeSelection False)
+                    model
+
+            else
+                resultModelCmd env.selectedItems ( model, Cmd.none )
 
 
 
@@ -1068,16 +1083,16 @@ loadChangedItems flags smode ids =
         Api.itemSearch flags search ReplaceChangedItemsResp
 
 
-scrollToCard : Env.Update -> Model -> UpdateResult
-scrollToCard env model =
+scrollToCard : ItemIds -> Maybe String -> Model -> UpdateResult
+scrollToCard selection lastViewedItemId model =
     let
         scroll id =
             Scroll.scrollElementY "item-card-list" id 0.5 0.5
     in
-    makeResult env <|
-        case env.lastViewedItemId of
+    makeResult selection <|
+        case lastViewedItemId of
             Just id ->
-                ( { model | scrollToCard = env.lastViewedItemId }
+                ( { model | scrollToCard = lastViewedItemId }
                 , Task.attempt ScrollResult (scroll id)
                 , Sub.none
                 )
@@ -1091,8 +1106,8 @@ loadEditModel flags =
     Cmd.map EditMenuMsg (Comp.ItemDetail.MultiEditMenu.loadModel flags)
 
 
-doSearch : Env.Update -> SearchParam -> Model -> UpdateResult
-doSearch env param model =
+doSearch : ItemIds -> SearchParam -> Model -> UpdateResult
+doSearch selection param model =
     let
         param_ =
             { param | offset = 0 }
@@ -1100,7 +1115,7 @@ doSearch env param model =
         searchCmd =
             doSearchCmd param_ model
     in
-    resultModelCmd env
+    resultModelCmd selection
         ( { model
             | searchInProgress = True
             , searchOffset = 0
@@ -1135,16 +1150,16 @@ doSearchMore env model =
     )
 
 
-resultModelCmd : Env.Update -> ( Model, Cmd Msg ) -> UpdateResult
-resultModelCmd env ( m, c ) =
-    makeResult env ( m, c, Sub.none )
+resultModelCmd : ItemIds -> ( Model, Cmd Msg ) -> UpdateResult
+resultModelCmd selection ( m, c ) =
+    makeResult selection ( m, c, Sub.none )
 
 
-makeResult : Env.Update -> ( Model, Cmd Msg, Sub Msg ) -> UpdateResult
-makeResult env ( m, c, s ) =
+makeResult : ItemIds -> ( Model, Cmd Msg, Sub Msg ) -> UpdateResult
+makeResult selection ( m, c, s ) =
     { model = m
     , cmd = c
     , sub = s
     , appEvent = AppNothing
-    , selectedItems = env.selectedItems
+    , selectedItems = selection
     }
diff --git a/modules/webapp/src/main/elm/Styles.elm b/modules/webapp/src/main/elm/Styles.elm
index 88fd0438..894526c2 100644
--- a/modules/webapp/src/main/elm/Styles.elm
+++ b/modules/webapp/src/main/elm/Styles.elm
@@ -189,6 +189,26 @@ secondaryButtonHover =
     " hover:bg-gray-400 dark:hover:bg-slate-300 "
 
 
+
+--- Secondary Basic Button
+
+
+secondaryBasicButtonNoColor : String
+secondaryBasicButtonNoColor =
+    " my-auto whitespace-nowrap text-center shadow-none focus:outline-none focus:ring focus:ring-opacity-75 "
+
+
+secondaryBasicButtonMain : String
+secondaryBasicButtonMain =
+    secondaryBasicButtonNoColor
+        ++ " border-gray-500 dark:border-slate-500 text-gray-500 dark:text-slate-400 "
+
+
+secondaryBasicButtonHover : String
+secondaryBasicButtonHover =
+    " hover:bg-gray-600 hover:text-white dark:hover:text-white dark:hover:bg-slate-500 dark:hover:text-slate-100 "
+
+
 secondaryBasicButton : String
 secondaryBasicButton =
     secondaryBasicButtonRounded ++ secondaryBasicButtonPlain
@@ -205,20 +225,6 @@ secondaryBasicButtonRounded =
 
 
 
---- Secondary Basic Button
-
-
-secondaryBasicButtonMain : String
-secondaryBasicButtonMain =
-    " my-auto whitespace-nowrap border-gray-500 dark:border-slate-500 text-gray-500 dark:text-slate-400 text-center shadow-none focus:outline-none focus:ring focus:ring-opacity-75 "
-
-
-secondaryBasicButtonHover : String
-secondaryBasicButtonHover =
-    " hover:bg-gray-600 hover:text-white dark:hover:text-white dark:hover:bg-slate-500 dark:hover:text-slate-100 "
-
-
-
 --- Delete Button
 
 
@@ -248,6 +254,18 @@ deleteLabel =
 
 
 
+--- Green Button
+
+
+greenButton : String
+greenButton =
+    secondaryBasicButtonNoColor
+        ++ secondaryBasicButtonRounded
+        ++ " dark:bg-lime-600 dark:bg-opacity-30 dark:border-lime-600 dark:text-lime-400 "
+        ++ " bg-lime-600  border-lime-600 text-white"
+
+
+
 --- Others