diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/AbstractWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/AbstractWidget.js
index 00d2bbe30a9f01c322f6bd5bafd99f9c81a23028..7e2100fa8b6749e192520cc9ee89c2df6a06f01e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/AbstractWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/AbstractWidget.js
@@ -46,6 +46,30 @@ define([ "jquery", "components/common/ListenerManager" ], function($, ListenerMa
 			}
 		},
 
+		getState : function() {
+			if (!this.state) {
+				this.state = {};
+			}
+			this.doGetState(this.state);
+			return this.state;
+		},
+
+		setState : function(state) {
+			if (state) {
+				if (!this.state) {
+					this.state = {};
+				}
+				$.extend(this.state, state);
+				this.doSetState(this.state);
+			}
+		},
+
+		doGetState : function(state) {
+		},
+
+		doSetState : function(state) {
+		},
+
 		getView : function() {
 			return this.view;
 		},
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelChooserWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelChooserWidget.js
index 68cd9e355911cf4c6d6fb98042518903c4ee6595..bf6b212aa42aa924063a7dcf169533702953c093 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelChooserWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelChooserWidget.js
@@ -16,18 +16,14 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			this.setChannels(channels);
 		},
 
-		getState : function() {
-			var state = {};
+		doGetState : function(state) {
 			state.selectedChannel = this.getSelectedChannel();
 			state.selectedMergedChannels = this.getSelectedMergedChannels();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.setSelectedChannel(state.selectedChannel);
-				this.setSelectedMergedChannels(state.selectedMergedChannels);
-			}
+		doSetState : function(state) {
+			this.setSelectedChannel(state.selectedChannel);
+			this.setSelectedMergedChannels(state.selectedMergedChannels);
 		},
 
 		getSelectedChannel : function() {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserWidget.js
index 5ec6f87f57a6356ac8ab4798e4afc6be1e92e375..f670e728efc89d0882eea19d4787d0522ed4b519 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserWidget.js
@@ -21,20 +21,16 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			}
 		},
 
-		getState : function() {
-			var state = {};
+		doGetState : function(state) {
 			state.timePointButtonsState = this.getTimePointButtonsWidget().getState();
 			state.selectedTimePoint = this.getSelectedTimePoint();
 			state.selectedDepth = this.getSelectedDepth();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.getTimePointButtonsWidget().setState(state.timePointButtonsState);
-				this.setSelectedTimePoint(state.selectedTimePoint);
-				this.setSelectedDepth(state.selectedDepth);
-			}
+		doSetState : function(state) {
+			this.getTimePointButtonsWidget().setState(state.timePointButtonsState);
+			this.setSelectedTimePoint(state.selectedTimePoint);
+			this.setSelectedDepth(state.selectedDepth);
 		},
 
 		getTimePoints : function() {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserView.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserView.js
index 5607a98973065af3c4283a091ac300d5ee0f52b6..4a140f77fffc88e6501bb76002e7210b841203ff 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserView.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserView.js
@@ -19,7 +19,7 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 			var thisView = this;
 
 			this.panel.append(this.createSliderWidget());
-			this.panel.append(this.controller.getButtonsWidget().render());
+			this.panel.append(this.controller.getChannelStackButtonsWidget().render());
 
 			this.refresh();
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserWidget.js
index 640355ec3ad46bba50f46cef605d40b5a2bf7add..5557d781dd592bcdf009ab05fcd908796760bb66 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserWidget.js
@@ -21,18 +21,14 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			}
 		},
 
-		getState : function() {
-			var state = {};
-			state.buttonsWidget = this.getButtonsWidget().getState();
+		doGetState : function(state) {
+			state.channelStackButtonsWidget = this.getChannelStackButtonsWidget().getState();
 			state.selectedChannelStackIndex = this.getSelectedChannelStackIndex();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.getButtonsWidget().setState(state.buttonsWidget);
-				this.setSelectedChannelStackIndex(state.selectedChannelStackIndex);
-			}
+		doSetState : function(state) {
+			this.getChannelStackButtonsWidget().setState(state.getChannelStackButtonsWidget);
+			this.setSelectedChannelStackIndex(state.selectedChannelStackIndex);
 		},
 
 		getChannelStacks : function() {
@@ -95,13 +91,13 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 
 			if (this.getSelectedChannelStackId() != channelStackId) {
 				this.selectedChannelStackId = channelStackId;
-				this.getButtonsWidget().setSelectedFrame(this.getSelectedChannelStackIndex());
+				this.getChannelStackButtonsWidget().setSelectedFrame(this.getSelectedChannelStackIndex());
 				this.refresh();
 				this.notifyChangeListeners();
 			}
 		},
 
-		getButtonsWidget : function() {
+		getChannelStackButtonsWidget : function() {
 			if (this.buttonsWidget == null) {
 				var thisWidget = this;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersWidget.js
index fcbd6226d86393f4fb0a800fd2ab69440997e694..d58f1ddb0f6d5dcad48b188b4ae21a7c4f1e9329 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersWidget.js
@@ -18,20 +18,16 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			this.imageResolutions = imageResolutions;
 		},
 
-		getState : function() {
-			var state = {};
+		doGetState : function(state) {
 			state.channelChooserState = this.getChannelChooserWidget().getState();
 			state.resolutionChooserState = this.getResolutionChooserWidget().getState();
 			state.channelStackChooserState = this.getChannelStackChooserWidget().getState();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.getChannelChooserWidget().setState(state.channelChooserState);
-				this.getResolutionChooserWidget().setState(state.resolutionChooserState);
-				this.getChannelStackChooserWidget().setState(state.channelStackChooserState);
-			}
+		doSetState : function(state) {
+			this.getChannelChooserWidget().setState(state.channelChooserState);
+			this.getResolutionChooserWidget().setState(state.resolutionChooserState);
+			this.getChannelStackChooserWidget().setState(state.channelStackChooserState);
 		},
 
 		getChannelChooserWidget : function() {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/MovieButtonsWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/MovieButtonsWidget.js
index 4444583bffea9950ac79428d606fa9e227c5d7a4..633189813a9ce08fce837fdffd3169a2f9f18be4 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/MovieButtonsWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/MovieButtonsWidget.js
@@ -116,18 +116,14 @@ define([ "jquery", "components/imageviewer/AbstractView", "components/imageviewe
 			this.selectedFrame = 0;
 		},
 
-		getState : function() {
-			var state = {};
+		doGetState : function(state) {
 			state.selectedFrame = this.getSelectedFrame();
 			state.selectedDelay = this.getSelectedDelay();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.setSelectedFrame(state.selectedFrame);
-				this.setSelectedDelay(state.selectedDelay);
-			}
+		doSetState : function(state) {
+			this.setSelectedFrame(state.selectedFrame);
+			this.setSelectedDelay(state.selectedDelay);
 		},
 
 		play : function() {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ResolutionChooserWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ResolutionChooserWidget.js
index 29bb0f6bafde691cc23d8e031d07767d9ba80803..7020719b30d5934603164c8a57c30ca528c90e07 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ResolutionChooserWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ResolutionChooserWidget.js
@@ -16,16 +16,12 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			this.setResolutions(resolutions);
 		},
 
-		getState : function() {
-			var state = {};
+		doGetState : function(state) {
 			state.selectedResolution = this.getSelectedResolution();
-			return state;
 		},
 
-		setState : function(state) {
-			if (state) {
-				this.setSelectedResolution(state.selectedResolution);
-			}
+		doSetState : function(state) {
+			this.setSelectedResolution(state.selectedResolution);
 		},
 
 		getSelectedResolution : function() {