diff --git a/src/main/java/cz/it4i/qcmp/cli/functions/CalculateDifference.java b/src/main/java/cz/it4i/qcmp/cli/functions/CalculateDifference.java
new file mode 100644
index 0000000000000000000000000000000000000000..6813eff4c1cb843a4b86bcc11ab2361759fb71c2
--- /dev/null
+++ b/src/main/java/cz/it4i/qcmp/cli/functions/CalculateDifference.java
@@ -0,0 +1,76 @@
+package cz.it4i.qcmp.cli.functions;
+
+import cz.it4i.qcmp.cli.CompressionOptionsCLIParser;
+import cz.it4i.qcmp.cli.CustomFunctionBase;
+import cz.it4i.qcmp.io.RawDataIO;
+import cz.it4i.qcmp.io.loader.PlaneLoaderFactory;
+import cz.it4i.qcmp.utilities.TypeConverter;
+import cz.it4i.qcmp.utilities.Utils;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+public class CalculateDifference extends CustomFunctionBase {
+
+    /**
+     * Base constructor with parsed CLI options.
+     *
+     * @param options Parsed cli options.
+     */
+    public CalculateDifference(final CompressionOptionsCLIParser options) {
+        super(options);
+    }
+
+    @Override
+    public boolean run() {
+        assert (options.getInputDataInfo().isPlaneIndexSet());
+        final int planeIndex = options.getInputDataInfo().getPlaneIndex();
+        final String directory = options.getOutputFilePath();
+        final int[] referenceData;
+        try {
+            referenceData = PlaneLoaderFactory.getPlaneLoaderForInputFile(options.getInputDataInfo()).loadPlaneData(planeIndex);
+        } catch (final Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+        final Collection<File> rawFiles = FileUtils.listFiles(new File(directory), new String[]{"raw"}, false);
+        //        final Collection<File> rawFiles = Arrays.asList(new File("gc_vq3x3_8b_670.raw"),
+        //                                                        new File("mpc_vq3x3_8b_670.raw"),
+        //                                                        new File("ic_vq3x3_8b_670.raw"));
+        for (final File file : rawFiles) {
+            final String absoluteDiffResultFile = file.getAbsolutePath().replace(".raw", "_adiff.raw");
+            final String diffResultFile = file.getAbsolutePath().replace(".raw", "_diff.raw");
+            final int[] fileData;
+            try {
+                final byte[] fileBytes = FileUtils.readFileToByteArray(file);
+                fileData = TypeConverter.unsignedShortBytesToIntArray(fileBytes);
+            } catch (final IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+
+            final int[] diffData = Utils.getDifference(referenceData, fileData);
+            try {
+                RawDataIO.writeDataI32(diffResultFile, diffData, true);
+            } catch (final IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+            Utils.applyAbsFunction(diffData);
+
+            final byte[] resultBytes = TypeConverter.unsignedShortArrayToByteArray(diffData, true);
+            try {
+                FileUtils.writeByteArrayToFile(new File(absoluteDiffResultFile), resultBytes);
+            } catch (final IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+            System.out.println("Finished: " + diffResultFile);
+        }
+
+        return true;
+    }
+}