diff --git a/src/main/java/cz/it4i/qcmp/io/BufferInputData.java b/src/main/java/cz/it4i/qcmp/io/BufferInputData.java
index 3b263a20697aabeb2b80af99bd30952eaa41ed1f..094123e2c13b95159ead08793f62e521a7b13352 100644
--- a/src/main/java/cz/it4i/qcmp/io/BufferInputData.java
+++ b/src/main/java/cz/it4i/qcmp/io/BufferInputData.java
@@ -1,6 +1,6 @@
 package cz.it4i.qcmp.io;
 
-import cz.it4i.qcmp.data.V3i;
+import cz.it4i.qcmp.data.HyperStackDimensions;
 
 /**
  * Input data backed by the buffer object.
@@ -17,19 +17,16 @@ public class BufferInputData extends InputData {
     /**
      * Create input data backed by buffer object.
      *
-     * @param imageBuffers    Image buffer references.
-     * @param imageDimensions Image dimensions.
-     * @param pixelType       Image pixel type.
-     * @param cacheHint       Name of the image used in caching.
+     * @param imageBuffers      Image buffer references.
+     * @param datasetDimensions Dataset dimensions.
+     * @param cacheHint         Name of the image used in caching.
      */
     public BufferInputData(final Object[] imageBuffers,
-                           final V3i imageDimensions,
-                           final PixelType pixelType,
+                           final HyperStackDimensions datasetDimensions,
                            final String cacheHint) {
+        super(datasetDimensions);
         this.imageBuffers = imageBuffers;
         setDataLoaderType(DataLoaderType.ImageJBufferLoader);
-        setDimension(imageDimensions);
-        setPixelType(pixelType);
         this.cacheHint = cacheHint;
     }
 
diff --git a/src/main/java/cz/it4i/qcmp/io/CallbackInputData.java b/src/main/java/cz/it4i/qcmp/io/CallbackInputData.java
index ef046c29022f0cd371344c1cd9f01ddd370e1e16..cfe9c021eb7eedafd14538e5e336d3d0708c51ab 100644
--- a/src/main/java/cz/it4i/qcmp/io/CallbackInputData.java
+++ b/src/main/java/cz/it4i/qcmp/io/CallbackInputData.java
@@ -1,6 +1,6 @@
 package cz.it4i.qcmp.io;
 
-import cz.it4i.qcmp.data.V3i;
+import cz.it4i.qcmp.data.HyperStackDimensions;
 
 public class CallbackInputData extends InputData {
 
@@ -22,14 +22,21 @@ public class CallbackInputData extends InputData {
         int getValueAt(final int x, final int y, final int z);
     }
 
+    /**
+     * Create very generic loader, which load data by executing callbacks with parameters.
+     *
+     * @param pixelLoadCallback Object with callbacks.
+     * @param datasetDimensions Dataset dimensions.
+     * @param cacheHint         Qcmp cache file name.
+     */
     public CallbackInputData(final LoadCallback pixelLoadCallback,
-                             final V3i dimensions,
+                             final HyperStackDimensions datasetDimensions,
                              final String cacheHint) {
+        super(datasetDimensions);
         this.pixelLoadCallback = pixelLoadCallback;
         this.cacheHint = cacheHint;
         setDataLoaderType(DataLoaderType.CallbackLoader);
         setPixelType(PixelType.Gray16);
-        setDimension(dimensions);
     }
 
     @Override
@@ -37,6 +44,11 @@ public class CallbackInputData extends InputData {
         return cacheHint;
     }
 
+    /**
+     * Get the pixel value callback object.
+     *
+     * @return Callback object.
+     */
     public final LoadCallback getPixelLoadCallback() {
         return pixelLoadCallback;
     }
diff --git a/src/main/java/cz/it4i/qcmp/io/FileInputData.java b/src/main/java/cz/it4i/qcmp/io/FileInputData.java
index fccce4c13c494939461ebcb49207daa73c227d53..1d1186a49c7f638410e3e054ab9102192a85efb4 100644
--- a/src/main/java/cz/it4i/qcmp/io/FileInputData.java
+++ b/src/main/java/cz/it4i/qcmp/io/FileInputData.java
@@ -1,8 +1,7 @@
 package cz.it4i.qcmp.io;
 
-/**
- * Input data backed by the file.
- */
+import cz.it4i.qcmp.data.HyperStackDimensions;
+
 public class FileInputData extends InputData {
 
     /**
@@ -13,16 +12,19 @@ public class FileInputData extends InputData {
     /**
      * Create input data backed by data file.
      *
-     * @param filePath
+     * @param filePath          Path to the file.
+     * @param datasetDimensions Dataset dimensions.
      */
-    public FileInputData(final String filePath) {
+    public FileInputData(final String filePath,
+                         final HyperStackDimensions datasetDimensions) {
+        super(datasetDimensions);
         this.filePath = filePath;
     }
 
     /**
      * Get path to the data file.
      *
-     * @return
+     * @return Path to data file.
      */
     @Override
     public String getFilePath() {
diff --git a/src/main/java/cz/it4i/qcmp/io/FlatBufferInputData.java b/src/main/java/cz/it4i/qcmp/io/FlatBufferInputData.java
index 3cad98b4a9c8680da0d14429184c4fb8bd44eb23..490e694e4099a150a8f0469d45e5f8ee8e1ba8d1 100644
--- a/src/main/java/cz/it4i/qcmp/io/FlatBufferInputData.java
+++ b/src/main/java/cz/it4i/qcmp/io/FlatBufferInputData.java
@@ -1,6 +1,6 @@
 package cz.it4i.qcmp.io;
 
-import cz.it4i.qcmp.data.V3i;
+import cz.it4i.qcmp.data.HyperStackDimensions;
 
 /**
  * Input data backed by the single buffer object.
@@ -20,19 +20,16 @@ public class FlatBufferInputData extends InputData {
     /**
      * Create input data backed by buffer object.
      *
-     * @param imageBuffer     Image buffer reference.
-     * @param imageDimensions Image dimensions.
-     * @param pixelType       Image pixel type.
-     * @param cacheHint       Name of the image used in caching.
+     * @param imageBuffer       Image buffer reference.
+     * @param datasetDimensions Dataset dimensions.
+     * @param cacheHint         Name of the image used in caching.
      */
     public FlatBufferInputData(final Object imageBuffer,
-                               final V3i imageDimensions,
-                               final PixelType pixelType,
+                               final HyperStackDimensions datasetDimensions,
                                final String cacheHint) {
+        super(datasetDimensions);
         this.imageBuffer = imageBuffer;
         setDataLoaderType(DataLoaderType.FlatBufferLoader);
-        setDimension(imageDimensions);
-        setPixelType(pixelType);
         this.cacheHint = cacheHint;
     }
 
diff --git a/src/main/java/cz/it4i/qcmp/io/InputData.java b/src/main/java/cz/it4i/qcmp/io/InputData.java
index 0cda8309055e301d3aa15236a757a811d9227c5e..1441b18480aa59d39f3bed866c4db5b545609f06 100644
--- a/src/main/java/cz/it4i/qcmp/io/InputData.java
+++ b/src/main/java/cz/it4i/qcmp/io/InputData.java
@@ -1,7 +1,7 @@
 package cz.it4i.qcmp.io;
 
+import cz.it4i.qcmp.data.HyperStackDimensions;
 import cz.it4i.qcmp.data.Range;
-import cz.it4i.qcmp.data.V3i;
 
 /**
  * Information about the input file.
@@ -15,6 +15,7 @@ public abstract class InputData {
         CallbackLoader
     }
 
+    // NOTE(Moravec): Supporting this will need a lot of work. If only we had C++ templates.
     public enum PixelType {
         Gray16,
         AnythingElse
@@ -32,9 +33,9 @@ public abstract class InputData {
     private PixelType pixelType = PixelType.Gray16;
 
     /**
-     * Image dimension.
+     * Dataset dimensions.
      */
-    private V3i dimension;
+    private HyperStackDimensions dimension;
 
     /**
      * Index of the plane to compress.
@@ -46,6 +47,15 @@ public abstract class InputData {
      */
     Range<Integer> planeRange = null;
 
+    /**
+     * Create InputData object with dataset dimensions.
+     *
+     * @param datasetDimensions Dataset dimensions.
+     */
+    public InputData(final HyperStackDimensions datasetDimensions) {
+        this.dimension = datasetDimensions;
+    }
+
 
     public boolean isPlaneIndexSet() {
         return (planeIndex != null);
@@ -55,12 +65,11 @@ public abstract class InputData {
         return (planeRange != null);
     }
 
-    public void setDimension(final V3i dimension) {
+    public void setDimension(final HyperStackDimensions dimension) {
         this.dimension = dimension;
     }
 
-
-    public V3i getDimensions() {
+    public HyperStackDimensions getDimensions() {
         return dimension;
     }
 
@@ -96,11 +105,10 @@ public abstract class InputData {
         this.pixelType = pixelType;
     }
 
-
     /**
-     * Override in FileInputData!!!
+     * This is mostly used by loaders which are backed by file.
      *
-     * @return null!
+     * @return Basic non-overloaded versions always returns null.
      */
     public String getFilePath() {
         return null;