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 c5f7884500c79e3bb224f3d1c3a38c73ba848247..68cd9e355911cf4c6d6fb98042518903c4ee6595 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,6 +16,20 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			this.setChannels(channels);
 		},
 
+		getState : function() {
+			var state = {};
+			state.selectedChannel = this.getSelectedChannel();
+			state.selectedMergedChannels = this.getSelectedMergedChannels();
+			return state;
+		},
+
+		setState : function(state) {
+			if (state) {
+				this.setSelectedChannel(state.selectedChannel);
+				this.setSelectedMergedChannels(state.selectedMergedChannels);
+			}
+		},
+
 		getSelectedChannel : function() {
 			if (this.selectedChannel) {
 				return this.selectedChannel;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserView.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserView.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a346227d567b9e7eb45af7ba8114f40c777b942
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserView.js
@@ -0,0 +1,27 @@
+define([ "jquery", "components/imageviewer/AbstractView" ], function($, AbstractView) {
+
+	//
+	// CHANNEL STACK CHOOSER VIEW
+	//
+
+	function ChannelStackChooserView(controller) {
+		this.init(controller);
+	}
+
+	$.extend(ChannelStackChooserView.prototype, AbstractView.prototype, {
+
+		init : function(controller) {
+			AbstractView.prototype.init.call(this, controller);
+			this.panel = $("<div>");
+		},
+
+		render : function() {
+			this.panel.append(this.controller.getWidget().render());
+			return this.panel;
+		}
+
+	});
+
+	return ChannelStackChooserView;
+
+});
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserWidget.js
index 03342503b6916598c1d17d89d4ff91c8db2b8e93..0dc8a2af485fbe4cef8bb17ffc6b4bd6c3206cca 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackChooserWidget.js
@@ -1,9 +1,10 @@
-define([ "jquery", "components/imageviewer/AbstractWidget", "components/imageviewer/ChannelStackMatrixChooserView",
-		"components/imageviewer/ChannelStackSeriesChooserView", "components/imageviewer/ChannelStackManager" ], function($, AbstractWidget,
-		ChannelStackMatrixChooserView, ChannelStackSeriesChooserView, ChannelStackManager) {
+define([ "jquery", "components/imageviewer/AbstractWidget", "components/imageviewer/ChannelStackChooserView",
+		"components/imageviewer/ChannelStackMatrixChooserWidget", "components/imageviewer/ChannelStackSeriesChooserWidget",
+		"components/imageviewer/ChannelStackManager" ], function($, AbstractWidget, ChannelStackChooserView, ChannelStackMatrixChooserWidget,
+		ChannelStackSeriesChooserWidget, ChannelStackManager) {
 
 	//
-	// CHANNEL STACK CHOOSER
+	// CHANNEL STACK CHOOSER WIDGET
 	//
 
 	function ChannelStackChooserWidget(channelStacks) {
@@ -13,133 +14,48 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 	$.extend(ChannelStackChooserWidget.prototype, AbstractWidget.prototype, {
 
 		init : function(channelStacks) {
+			AbstractWidget.prototype.init.call(this, new ChannelStackChooserView(this));
 			this.channelStackManager = new ChannelStackManager(channelStacks);
 
 			if (this.channelStackManager.isMatrix()) {
-				AbstractWidget.prototype.init.call(this, new ChannelStackMatrixChooserView(this));
+				this.widget = new ChannelStackMatrixChooserWidget(channelStacks);
 			} else {
-				AbstractWidget.prototype.init.call(this, new ChannelStackSeriesChooserView(this));
+				this.widget = new ChannelStackSeriesChooserWidget(channelStacks);
 			}
 
-			if (channelStacks && channelStacks.length > 0) {
-				this.setSelectedChannelStack(channelStacks[0]);
-			}
-		},
-
-		getTimePoints : function() {
-			return this.channelStackManager.getTimePoints();
-		},
-
-		getDepths : function() {
-			return this.channelStackManager.getDepths();
-		},
-
-		getChannelStacks : function() {
-			return this.channelStackManager.getChannelStacks();
-		},
-
-		getChannelStackIndex : function(channelStackId) {
-			return this.channelStackManager.getChannelStackIndex(channelStackId);
-		},
+			var thisWidget = this;
 
-		getChannelStackById : function(channelStackId) {
-			return this.channelStackManager.getChannelStackById(channelStackId);
+			this.widget.addChangeListener(function() {
+				thisWidget.notifyChangeListeners();
+			});
 		},
 
-		getChannelStackByTimePointAndDepth : function(timePoint, depth) {
-			return this.channelStackManager.getChannelStackByTimePointAndDepth(timePoint, depth);
+		getState : function() {
+			return this.widget.getState();
 		},
 
-		loadChannelStackContent : function(channelStack, callback) {
-			this.getChannelStackContentLoader()(channelStack, callback);
+		setState : function(state) {
+			this.widget.setState(state);
 		},
 
 		getChannelStackContentLoader : function() {
-			if (this.channelStackContentLoader) {
-				return this.channelStackContentLoader;
-			} else {
-				return function(channelStack, callback) {
-					callback();
-				}
-			}
+			return this.widget.getChannelStackContentLoader();
 		},
 
 		setChannelStackContentLoader : function(channelStackContentLoader) {
-			this.channelStackContentLoader = channelStackContentLoader;
+			this.widget.setChannelStackContentLoader(channelStackContentLoader);
 		},
 
 		getSelectedChannelStackId : function() {
-			return this.selectedChannelStackId;
+			return this.widget.getSelectedChannelStackId();
 		},
 
 		setSelectedChannelStackId : function(channelStackId) {
-			if (this.selectedChannelStackId != channelStackId) {
-				this.selectedChannelStackId = channelStackId;
-				this.refresh();
-				this.notifyChangeListeners();
-			}
-		},
-
-		getSelectedChannelStack : function() {
-			var channelStackId = this.getSelectedChannelStackId();
-
-			if (channelStackId != null) {
-				return this.channelStackManager.getChannelStackById(channelStackId);
-			} else {
-				return null;
-			}
-		},
-
-		setSelectedChannelStack : function(channelStack) {
-			if (channelStack != null) {
-				this.setSelectedChannelStackId(channelStack.id);
-			} else {
-				this.setSelectedChannelStackId(null);
-			}
-		},
-
-		getSelectedTimePoint : function() {
-			var channelStack = this.getSelectedChannelStack();
-			if (channelStack != null) {
-				return channelStack.timePointOrNull;
-			} else {
-				return null;
-			}
-		},
-
-		setSelectedTimePoint : function(timePoint) {
-			if (timePoint != null && $.inArray(timePoint, this.getTimePoints()) == -1) {
-				timePoint = this.getTimePoints().length > 0 ? this.getTimePoints()[0] : null;
-			}
-
-			if (timePoint != null && this.getSelectedDepth() != null) {
-				var channelStack = this.channelStackManager.getChannelStackByTimePointAndDepth(timePoint, this.getSelectedDepth());
-				this.setSelectedChannelStack(channelStack);
-			} else {
-				this.setSelectedChannelStack(null);
-			}
-		},
-
-		getSelectedDepth : function() {
-			var channelStack = this.getSelectedChannelStack();
-			if (channelStack != null) {
-				return channelStack.depthOrNull;
-			} else {
-				return null;
-			}
+			this.widget.setSelectedChannelStackId(channelStackId);
 		},
 
-		setSelectedDepth : function(depth) {
-			if (depth != null && $.inArray(depth, this.getDepths()) == -1) {
-				depth = this.getDepths().length > 0 ? this.getDepths()[0] : null;
-			}
-
-			if (depth != null && this.getSelectedTimePoint() != null) {
-				var channelStack = this.channelStackManager.getChannelStackByTimePointAndDepth(this.getSelectedTimePoint(), depth);
-				this.setSelectedChannelStack(channelStack);
-			} else {
-				this.setSelectedChannelStack(null);
-			}
+		getWidget : function() {
+			return this.widget;
 		}
 
 	});
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserView.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserView.js
index f3853bb26bfd646beecb558c42555e17c553a775..560cc13f100e319465108a8e80384469f76870b1 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserView.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserView.js
@@ -1,5 +1,4 @@
-define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/AbstractView", "components/imageviewer/MovieButtonsWidget" ], function($,
-		bootstrap, bootstrapSlider, AbstractView, MovieButtonsWidget) {
+define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/AbstractView" ], function($, bootstrap, bootstrapSlider, AbstractView) {
 
 	//
 	// CHANNEL STACK MATRIX CHOOSER VIEW
@@ -24,7 +23,7 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 			$("<div>").addClass("col-md-6").append(this.createDepthWidget()).appendTo(slidersRow);
 
 			var buttonsRow = $("<div>").appendTo(this.panel);
-			buttonsRow.append(this.createTimePointButtonsWidget());
+			buttonsRow.append(this.controller.getTimePointButtonsWidget().render());
 
 			this.refresh();
 
@@ -42,8 +41,6 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 
 				timeLabel.text("Time: " + time + " sec (" + (timeIndex + 1) + "/" + timeCount + ")");
 				timeInput.slider("setValue", time);
-
-				this.timePointButtons.setSelectedFrame(timeIndex);
 			}
 
 			var depth = this.controller.getSelectedDepth();
@@ -109,27 +106,6 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 			});
 
 			return widget;
-		},
-
-		createTimePointButtonsWidget : function() {
-			var thisView = this;
-
-			var buttons = new MovieButtonsWidget(this.controller.getTimePoints().length);
-
-			buttons.setFrameContentLoader(function(frameIndex, callback) {
-				var timePoint = thisView.controller.getTimePoints()[frameIndex];
-				var depth = thisView.controller.getSelectedDepth();
-				var channelStack = thisView.controller.getChannelStackByTimePointAndDepth(timePoint, depth);
-				thisView.controller.loadChannelStackContent(channelStack, callback);
-			});
-
-			buttons.addChangeListener(function() {
-				var timePoint = thisView.controller.getTimePoints()[buttons.getSelectedFrame()];
-				thisView.controller.setSelectedTimePoint(timePoint);
-			});
-
-			this.timePointButtons = buttons;
-			return buttons.render();
 		}
 
 	});
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
new file mode 100644
index 0000000000000000000000000000000000000000..5ec6f87f57a6356ac8ab4798e4afc6be1e92e375
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackMatrixChooserWidget.js
@@ -0,0 +1,152 @@
+define([ "jquery", "components/imageviewer/AbstractWidget", "components/imageviewer/ChannelStackMatrixChooserView",
+		"components/imageviewer/MovieButtonsWidget", "components/imageviewer/ChannelStackManager" ], function($, AbstractWidget,
+		ChannelStackMatrixChooserView, MovieButtonsWidget, ChannelStackManager) {
+
+	//
+	// CHANNEL STACK MATRIX CHOOSER
+	//
+
+	function ChannelStackMatrixChooserWidget(channelStacks) {
+		this.init(channelStacks);
+	}
+
+	$.extend(ChannelStackMatrixChooserWidget.prototype, AbstractWidget.prototype, {
+
+		init : function(channelStacks) {
+			AbstractWidget.prototype.init.call(this, new ChannelStackMatrixChooserView(this));
+			this.channelStackManager = new ChannelStackManager(channelStacks);
+
+			if (channelStacks && channelStacks.length > 0) {
+				this.setSelectedChannelStackId(channelStacks[0].id);
+			}
+		},
+
+		getState : function() {
+			var 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);
+			}
+		},
+
+		getTimePoints : function() {
+			return this.channelStackManager.getTimePoints();
+		},
+
+		getDepths : function() {
+			return this.channelStackManager.getDepths();
+		},
+
+		getChannelStackByTimePointAndDepth : function(timePoint, depth) {
+			return this.channelStackManager.getChannelStackByTimePointAndDepth(timePoint, depth);
+		},
+
+		loadChannelStackContent : function(channelStack, callback) {
+			this.getChannelStackContentLoader()(channelStack, callback);
+		},
+
+		getChannelStackContentLoader : function() {
+			if (this.channelStackContentLoader) {
+				return this.channelStackContentLoader;
+			} else {
+				return function(channelStack, callback) {
+					callback();
+				}
+			}
+		},
+
+		setChannelStackContentLoader : function(channelStackContentLoader) {
+			this.channelStackContentLoader = channelStackContentLoader;
+		},
+
+		getSelectedChannelStackId : function() {
+			var channelStack = this.getChannelStackByTimePointAndDepth(this.getSelectedTimePoint(), this.getSelectedDepth());
+			return channelStack != null ? channelStack.id : null;
+		},
+
+		setSelectedChannelStackId : function(channelStackId) {
+			var channelStack = this.channelStackManager.getChannelStackById(channelStackId);
+			if (channelStack != null) {
+				this.setSelectedTimePoint(channelStack.timePointOrNull);
+				this.setSelectedDepth(channelStack.depthOrNull);
+			}
+		},
+
+		getSelectedTimePoint : function() {
+			if (this.selectedTimePoint != undefined) {
+				return this.selectedTimePoint;
+			} else {
+				return null;
+			}
+		},
+
+		setSelectedTimePoint : function(timePoint) {
+			if ($.inArray(timePoint, this.getTimePoints()) == -1) {
+				timePoint = this.getTimePoints().length > 0 ? this.getTimePoints()[0] : null;
+			}
+
+			if (this.getSelectedTimePoint() != timePoint) {
+				this.selectedTimePoint = timePoint;
+				this.getTimePointButtonsWidget().setSelectedFrame(this.getTimePoints().indexOf(timePoint));
+				this.refresh();
+				this.notifyChangeListeners();
+			}
+		},
+
+		getSelectedDepth : function() {
+			if (this.selectedDepth != undefined) {
+				return this.selectedDepth;
+			} else {
+				return null;
+			}
+		},
+
+		setSelectedDepth : function(depth) {
+			if ($.inArray(depth, this.getDepths()) == -1) {
+				depth = this.getDepths().length > 0 ? this.getDepths()[0] : null;
+			}
+
+			if (this.getSelectedDepth() != depth) {
+				this.selectedDepth = depth;
+				this.refresh();
+				this.notifyChangeListeners();
+			}
+		},
+
+		getTimePointButtonsWidget : function() {
+			if (this.timeButtonsWidget == null) {
+				var thisWidget = this;
+
+				var widget = new MovieButtonsWidget(this.getTimePoints().length);
+
+				widget.setFrameContentLoader(function(frameIndex, callback) {
+					var timePoint = thisWidget.getTimePoints()[frameIndex];
+					var depth = thisWidget.getSelectedDepth();
+					var channelStack = thisWidget.getChannelStackByTimePointAndDepth(timePoint, depth);
+					thisWidget.loadChannelStackContent(channelStack, callback);
+				});
+
+				widget.addChangeListener(function() {
+					var timePoint = thisWidget.getTimePoints()[widget.getSelectedFrame()];
+					thisWidget.setSelectedTimePoint(timePoint);
+				});
+
+				this.timeButtonsWidget = widget;
+			}
+
+			return this.timeButtonsWidget;
+		}
+
+	});
+
+	return ChannelStackMatrixChooserWidget;
+
+});
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 5698f29021d1ac8cffb8b3ef7a9242aad4383569..5607a98973065af3c4283a091ac300d5ee0f52b6 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
@@ -1,5 +1,4 @@
-define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/AbstractView", "components/imageviewer/MovieButtonsWidget", ], function(
-		$, bootstrap, bootstrapSlider, AbstractView, MovieButtonsWidget) {
+define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/AbstractView" ], function($, bootstrap, bootstrapSlider, AbstractView) {
 
 	//
 	// CHANNEL STACK SERIES CHOOSER VIEW
@@ -20,7 +19,7 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 			var thisView = this;
 
 			this.panel.append(this.createSliderWidget());
-			this.panel.append(this.createButtonsWidget());
+			this.panel.append(this.controller.getButtonsWidget().render());
 
 			this.refresh();
 
@@ -39,8 +38,6 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 
 				var sliderInput = this.panel.find(".sliderWidget input");
 				sliderInput.slider("setValue", index);
-
-				this.buttons.setSelectedFrame(index);
 			}
 		},
 
@@ -68,25 +65,6 @@ define([ "jquery", "bootstrap", "bootstrap-slider", "components/imageviewer/Abst
 			});
 
 			return widget;
-		},
-
-		createButtonsWidget : function() {
-			var thisView = this;
-
-			var buttons = new MovieButtonsWidget(this.controller.getChannelStacks().length);
-
-			buttons.setFrameContentLoader(function(frameIndex, callback) {
-				var channelStack = thisView.controller.getChannelStacks()[frameIndex];
-				thisView.controller.loadChannelStackContent(channelStack, callback);
-			});
-
-			buttons.addChangeListener(function() {
-				var channelStack = thisView.controller.getChannelStacks()[buttons.getSelectedFrame()];
-				thisView.controller.setSelectedChannelStackId(channelStack.id);
-			});
-
-			this.buttons = buttons;
-			return buttons.render();
 		}
 
 	});
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
new file mode 100644
index 0000000000000000000000000000000000000000..640355ec3ad46bba50f46cef605d40b5a2bf7add
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ChannelStackSeriesChooserWidget.js
@@ -0,0 +1,130 @@
+define([ "jquery", "components/imageviewer/AbstractWidget", "components/imageviewer/ChannelStackSeriesChooserView",
+		"components/imageviewer/MovieButtonsWidget", "components/imageviewer/ChannelStackManager" ], function($, AbstractWidget,
+		ChannelStackSeriesChooserView, MovieButtonsWidget, ChannelStackManager) {
+
+	//
+	// CHANNEL STACK SERIES CHOOSER
+	//
+
+	function ChannelStackSeriesChooserWidget(channelStacks) {
+		this.init(channelStacks);
+	}
+
+	$.extend(ChannelStackSeriesChooserWidget.prototype, AbstractWidget.prototype, {
+
+		init : function(channelStacks) {
+			AbstractWidget.prototype.init.call(this, new ChannelStackSeriesChooserView(this));
+			this.channelStackManager = new ChannelStackManager(channelStacks);
+
+			if (channelStacks && channelStacks.length > 0) {
+				this.setSelectedChannelStackId(channelStacks[0].id);
+			}
+		},
+
+		getState : function() {
+			var state = {};
+			state.buttonsWidget = this.getButtonsWidget().getState();
+			state.selectedChannelStackIndex = this.getSelectedChannelStackIndex();
+			return state;
+		},
+
+		setState : function(state) {
+			if (state) {
+				this.getButtonsWidget().setState(state.buttonsWidget);
+				this.setSelectedChannelStackIndex(state.selectedChannelStackIndex);
+			}
+		},
+
+		getChannelStacks : function() {
+			return this.channelStackManager.getChannelStacks();
+		},
+
+		getChannelStackIndex : function(channelStackId) {
+			return this.channelStackManager.getChannelStackIndex(channelStackId);
+		},
+
+		loadChannelStackContent : function(channelStack, callback) {
+			this.getChannelStackContentLoader()(channelStack, callback);
+		},
+
+		getChannelStackContentLoader : function() {
+			if (this.channelStackContentLoader) {
+				return this.channelStackContentLoader;
+			} else {
+				return function(channelStack, callback) {
+					callback();
+				}
+			}
+		},
+
+		setChannelStackContentLoader : function(channelStackContentLoader) {
+			this.channelStackContentLoader = channelStackContentLoader;
+		},
+
+		getSelectedChannelStackIndex : function() {
+			return this.channelStackManager.getChannelStackIndex(this.getSelectedChannelStackId());
+		},
+
+		setSelectedChannelStackIndex : function(index) {
+			index = Math.min(Math.max(0, index), this.channelStackManager.getChannelStacks().length - 1);
+			if (index > 0) {
+				var channelStack = this.channelStackManager.getChannelStacks()[index];
+				this.setSelectedChannelStackId(channelStack.id);
+			} else {
+				this.setSelectedChannelStackId(null);
+			}
+		},
+
+		getSelectedChannelStackId : function() {
+			if (this.selectedChannelStackId != undefined) {
+				return this.selectedChannelStackId;
+			} else {
+				return null;
+			}
+		},
+
+		setSelectedChannelStackId : function(channelStackId) {
+			var channelStack = this.channelStackManager.getChannelStackById(channelStackId);
+			var channelStackId = null;
+
+			if (channelStack == null) {
+				channelStackId = this.getChannelStacks().length > 0 ? this.getChannelStacks()[0].id : null;
+			} else {
+				channelStackId = channelStack.id;
+			}
+
+			if (this.getSelectedChannelStackId() != channelStackId) {
+				this.selectedChannelStackId = channelStackId;
+				this.getButtonsWidget().setSelectedFrame(this.getSelectedChannelStackIndex());
+				this.refresh();
+				this.notifyChangeListeners();
+			}
+		},
+
+		getButtonsWidget : function() {
+			if (this.buttonsWidget == null) {
+				var thisWidget = this;
+
+				var widget = new MovieButtonsWidget(this.getChannelStacks().length);
+
+				widget.setFrameContentLoader(function(frameIndex, callback) {
+					var channelStack = thisWidget.getChannelStacks()[frameIndex];
+					thisWidget.loadChannelStackContent(channelStack, callback);
+				});
+
+				widget.addChangeListener(function() {
+					var channelStack = thisWidget.getChannelStacks()[widget.getSelectedFrame()];
+					thisWidget.setSelectedChannelStackId(channelStack.id);
+				});
+
+				this.buttonsWidget = widget;
+			}
+
+			return this.buttonsWidget;
+		}
+
+	});
+
+	return ChannelStackSeriesChooserWidget;
+
+});
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersView.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersView.js
new file mode 100644
index 0000000000000000000000000000000000000000..636eb5563ed2c97a34dff1005686c645e5bda0f3
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersView.js
@@ -0,0 +1,31 @@
+define([ "jquery", "components/imageviewer/AbstractView" ], function($, AbstractView) {
+
+	//
+	// IMAGE PARAMETERS VIEW
+	//
+
+	function ImageParametersView(controller) {
+		this.init(controller);
+	}
+
+	$.extend(ImageParametersView.prototype, AbstractView.prototype, {
+		init : function(controller) {
+			AbstractView.prototype.init.call(this, controller);
+			this.panel = $("<div>").addClass("imageViewer");
+		},
+
+		render : function() {
+			this.panel.append(this.controller.getChannelChooserWidget().render());
+			this.panel.append(this.controller.getResolutionChooserWidget().render());
+			this.panel.append(this.controller.getChannelStackChooserWidget().render());
+
+			this.refresh();
+
+			return this.panel;
+		}
+
+	});
+
+	return ImageParametersView;
+
+});
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..fcbd6226d86393f4fb0a800fd2ab69440997e694
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageParametersWidget.js
@@ -0,0 +1,77 @@
+define([ "jquery", "components/imageviewer/AbstractWidget", "components/imageviewer/ImageParametersView",
+		"components/imageviewer/ChannelChooserWidget", "components/imageviewer/ResolutionChooserWidget",
+		"components/imageviewer/ChannelStackChooserWidget" ], function($, AbstractWidget, ImageParametersView, ChannelChooserWidget,
+		ResolutionChooserWidget, ChannelStackChooserWidget) {
+
+	//
+	// IMAGE PARAMETERS WIDGET
+	//
+
+	function ImageParametersWidget(imageInfo, imageResolutions) {
+		this.init(imageInfo, imageResolutions);
+	}
+
+	$.extend(ImageParametersWidget.prototype, AbstractWidget.prototype, {
+		init : function(imageInfo, imageResolutions, imageLoader) {
+			AbstractWidget.prototype.init.call(this, new ImageParametersView(this));
+			this.imageInfo = imageInfo;
+			this.imageResolutions = imageResolutions;
+		},
+
+		getState : function() {
+			var 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);
+			}
+		},
+
+		getChannelChooserWidget : function() {
+			if (this.channelChooserWidget == null) {
+				var thisWidget = this;
+				this.channelChooserWidget = new ChannelChooserWidget(this.imageInfo.imageDataset.imageDataset.imageParameters.channels);
+				this.channelChooserWidget.addChangeListener(function() {
+					thisWidget.refresh();
+					thisWidget.notifyChangeListeners();
+				});
+			}
+			return this.channelChooserWidget;
+		},
+
+		getResolutionChooserWidget : function() {
+			if (this.resolutionChooserWidget == null) {
+				var thisWidget = this;
+				this.resolutionChooserWidget = new ResolutionChooserWidget(this.imageResolutions);
+				this.resolutionChooserWidget.addChangeListener(function() {
+					thisWidget.refresh();
+					thisWidget.notifyChangeListeners();
+				});
+			}
+			return this.resolutionChooserWidget;
+		},
+
+		getChannelStackChooserWidget : function() {
+			if (this.channelStackChooserWidget == null) {
+				var thisWidget = this;
+				this.channelStackChooserWidget = new ChannelStackChooserWidget(this.imageInfo.channelStacks);
+				this.channelStackChooserWidget.addChangeListener(function() {
+					thisWidget.refresh();
+					thisWidget.notifyChangeListeners();
+				});
+			}
+			return this.channelStackChooserWidget;
+		}
+
+	});
+
+	return ImageParametersWidget;
+
+});
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerView.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerView.js
index 15ae117bfdf3133341ae62788208fa59ce13de5f..0c4c8c85f42f56ff5d81075e3d1fd746c5dc0d99 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerView.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerView.js
@@ -17,7 +17,7 @@ define([ "jquery", "components/imageviewer/AbstractView" ], function($, Abstract
 
 		render : function() {
 			this.panel.append(this.renderDataSetChooserWidget());
-			this.panel.append(this.renderDataSetImageViewerWidget());
+			this.panel.append(this.renderImageParametersWidget());
 			this.panel.append(this.renderImageWidget());
 
 			this.refresh();
@@ -26,26 +26,26 @@ define([ "jquery", "components/imageviewer/AbstractView" ], function($, Abstract
 		},
 
 		refresh : function() {
-			this.refreshDataSetImageViewerWidget();
+			this.refreshImageParametersWidget();
 		},
 
 		renderDataSetChooserWidget : function() {
 			return this.controller.getDataSetChooserWidget().render();
 		},
 
-		renderDataSetImageViewerWidget : function() {
-			return $("<div>").addClass("dataSetImageViewerContainer");
+		renderImageParametersWidget : function() {
+			return $("<div>").addClass("imageParametersWidgetContainer");
 		},
 
 		renderImageWidget : function() {
 			return this.controller.getImageWidget().render();
 		},
 
-		refreshDataSetImageViewerWidget : function() {
-			var container = this.panel.find(".dataSetImageViewerContainer");
-			var imageViewer = this.controller.getDataSetImageViewerWidget(this.controller.getSelectedDataSetCode());
+		refreshImageParametersWidget : function() {
+			var container = this.panel.find(".imageParametersWidgetContainer");
+			var widget = this.controller.getImageParametersWidget(this.controller.getSelectedDataSetCode());
 			container.children().detach();
-			container.append(imageViewer.render());
+			container.append(widget.render());
 		}
 
 	});
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerWidget.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerWidget.js
index 001262d4b0b4ee6f4722dd09b46db06df974b68f..a35088b5850a1df5d57716ef6d77baa666f46afc 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerWidget.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/resources/components/imageviewer/ImageViewerWidget.js
@@ -1,7 +1,7 @@
 define([ "jquery", "components/common/CallbackManager", "components/imageviewer/AbstractWidget", "components/imageviewer/ImageViewerView",
-		"components/imageviewer/DataSetChooserWidget", "components/imageviewer/DataSetImageViewerWidget", "components/imageviewer/ImageWidget",
+		"components/imageviewer/DataSetChooserWidget", "components/imageviewer/ImageParametersWidget", "components/imageviewer/ImageWidget",
 		"components/imageviewer/ImageLoader", "components/imageviewer/ImageData", "components/imageviewer/OpenbisFacade" ], function($,
-		CallbackManager, AbstractWidget, ImageViewerView, DataSetChooserWidget, DataSetImageViewerWidget, ImageWidget, ImageLoader, ImageData,
+		CallbackManager, AbstractWidget, ImageViewerView, DataSetChooserWidget, ImageParametersWidget, ImageWidget, ImageLoader, ImageData,
 		OpenbisFacade) {
 
 	//
@@ -80,37 +80,42 @@ define([ "jquery", "components/common/CallbackManager", "components/imageviewer/
 		},
 
 		getSelectedChannel : function() {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getChannelChooserWidget().getSelectedChannel();
 		},
 
+		setSelectedChannel : function(channel) {
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
+			return viewer.getChannelChooserWidget().setSelectedChannel(channel);
+		},
+
 		getSelectedMergedChannels : function() {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getChannelChooserWidget().getSelectedMergedChannels();
 		},
 
 		setSelectedMergedChannels : function(channels) {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getChannelChooserWidget().setSelectedMergedChannels(channels);
 		},
 
 		getSelectedResolution : function() {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getResolutionChooserWidget().getSelectedResolution();
 		},
 
 		setSelectedResolution : function(resolution) {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getResolutionChooserWidget().setSelectedResolution(resolution);
 		},
 
 		getSelectedChannelStackId : function() {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getChannelStackChooserWidget().getSelectedChannelStackId();
 		},
 
 		setSelectedChannelStackId : function(channelStackId) {
-			var viewer = this.getDataSetImageViewerWidget(this.getSelectedDataSetCode());
+			var viewer = this.getImageParametersWidget(this.getSelectedDataSetCode());
 			return viewer.getChannelStackChooserWidget().setSelectedChannelStackId(channelStackId);
 		},
 
@@ -137,14 +142,10 @@ define([ "jquery", "components/common/CallbackManager", "components/imageviewer/
 				var widget = new DataSetChooserWidget(this.getDataSetCodes());
 
 				widget.addChangeListener(function(event) {
-					var oldViewer = thisWidget.getDataSetImageViewerWidget(event.getOldValue());
-					var newViewer = thisWidget.getDataSetImageViewerWidget(event.getNewValue());
+					var oldWidget = thisWidget.getImageParametersWidget(event.getOldValue());
+					var newWidget = thisWidget.getImageParametersWidget(event.getNewValue());
 
-					newViewer.getChannelChooserWidget().setSelectedChannel(oldViewer.getChannelChooserWidget().getSelectedChannel());
-					newViewer.getChannelChooserWidget().setSelectedMergedChannels(oldViewer.getChannelChooserWidget().getSelectedMergedChannels());
-					newViewer.getResolutionChooserWidget().setSelectedResolution(oldViewer.getResolutionChooserWidget().getSelectedResolution());
-					newViewer.getChannelStackChooserWidget().setSelectedTimePoint(oldViewer.getChannelStackChooserWidget().getSelectedTimePoint());
-					newViewer.getChannelStackChooserWidget().setSelectedDepth(oldViewer.getChannelStackChooserWidget().getSelectedDepth());
+					newWidget.setState(oldWidget.getState());
 
 					thisWidget.getImageWidget().setImageData(thisWidget.getSelectedImageData());
 					thisWidget.refresh();
@@ -156,7 +157,7 @@ define([ "jquery", "components/common/CallbackManager", "components/imageviewer/
 			return this.dataSetChooserWidget;
 		},
 
-		getDataSetImageViewerWidget : function(dataSetCode) {
+		getImageParametersWidget : function(dataSetCode) {
 			var thisWidget = this;
 
 			if (!this.imageViewerMap) {
@@ -164,7 +165,7 @@ define([ "jquery", "components/common/CallbackManager", "components/imageviewer/
 			}
 
 			if (!this.imageViewerMap[dataSetCode]) {
-				var widget = new DataSetImageViewerWidget(this.getImageInfo(dataSetCode), this.getImageResolutions(dataSetCode));
+				var widget = new ImageParametersWidget(this.getImageInfo(dataSetCode), this.getImageResolutions(dataSetCode));
 
 				widget.getChannelStackChooserWidget().setChannelStackContentLoader(function(channelStack, callback) {
 					var imageData = thisWidget.getSelectedImageData();
@@ -174,7 +175,6 @@ define([ "jquery", "components/common/CallbackManager", "components/imageviewer/
 
 				widget.addChangeListener(function() {
 					thisWidget.getImageWidget().setImageData(thisWidget.getSelectedImageData());
-					thisWidget.refresh();
 				});
 
 				this.imageViewerMap[dataSetCode] = widget;
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 fb3b4b3c5c4a6290015ad805780418813828776a..4444583bffea9950ac79428d606fa9e227c5d7a4 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,6 +116,20 @@ define([ "jquery", "components/imageviewer/AbstractView", "components/imageviewe
 			this.selectedFrame = 0;
 		},
 
+		getState : function() {
+			var state = {};
+			state.selectedFrame = this.getSelectedFrame();
+			state.selectedDelay = this.getSelectedDelay();
+			return state;
+		},
+
+		setState : function(state) {
+			if (state) {
+				this.setSelectedFrame(state.selectedFrame);
+				this.setSelectedDelay(state.selectedDelay);
+			}
+		},
+
 		play : function() {
 			if (this.frameAction) {
 				return;
@@ -202,7 +216,6 @@ define([ "jquery", "components/imageviewer/AbstractView", "components/imageviewe
 			frame = Math.min(Math.max(0, frame), this.frameCount - 1);
 
 			if (this.selectedFrame != frame) {
-				// log("Selected frame: " + frame);
 				this.selectedFrame = frame;
 				this.frameContentLoader(frame, callback);
 				this.refresh();
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 d8f5652e9b90901a70ac782ecbeff189c11f383b..29bb0f6bafde691cc23d8e031d07767d9ba80803 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,6 +16,18 @@ define([ "jquery", "components/imageviewer/AbstractWidget", "components/imagevie
 			this.setResolutions(resolutions);
 		},
 
+		getState : function() {
+			var state = {};
+			state.selectedResolution = this.getSelectedResolution();
+			return state;
+		},
+
+		setState : function(state) {
+			if (state) {
+				this.setSelectedResolution(state.selectedResolution);
+			}
+		},
+
 		getSelectedResolution : function() {
 			return this.selectedResolution;
 		},