diff --git a/data-access/servlet/src/main/java/common/vo/NullValueCount.java b/data-access/servlet/src/main/java/common/vo/NullValueCount.java
index d265b3d11bd1c0fcb78266165b6dc94ed373bc13..623c05e179ba4699a64f1db8843006884ae44e03 100644
--- a/data-access/servlet/src/main/java/common/vo/NullValueCount.java
+++ b/data-access/servlet/src/main/java/common/vo/NullValueCount.java
@@ -6,6 +6,13 @@ class NullValueCount
    double percent;
    long nullCount;
    long totalCount;
+
+   NullValueCount()
+   {
+      percent = 0.0;
+      nullCount = 0;
+      totalCount = 0;
+   }
 }
 
 
diff --git a/data-access/servlet/src/main/java/datasets/Cutout.java b/data-access/servlet/src/main/java/datasets/Cutout.java
index 0ef94405e8cc5a6ccc8efc0a74ed8b653ee42035..9cb950779ea27a69ac4c3f8613bf33e0d407acce 100644
--- a/data-access/servlet/src/main/java/datasets/Cutout.java
+++ b/data-access/servlet/src/main/java/datasets/Cutout.java
@@ -17,7 +17,9 @@ public interface Cutout
 
 
    public CutResult doFile(String relPathname, int hdunum, Pos pos, Band band, Time time, Pol pol,
-         boolean countNullValues, FitsCard[] extraCards);
+         boolean countNullValues, FitsCard[] extraCards)
+         throws IOException, InterruptedException;
+;
 
 }
 
diff --git a/data-access/servlet/src/main/java/datasets/CutoutImpl.java b/data-access/servlet/src/main/java/datasets/CutoutImpl.java
index a40de95062f8f2373e67ca2da08fc76cad60fe99..a253c4cc671b5bbeaefdc3f0c7eafce2434130a9 100644
--- a/data-access/servlet/src/main/java/datasets/CutoutImpl.java
+++ b/data-access/servlet/src/main/java/datasets/CutoutImpl.java
@@ -16,6 +16,7 @@ import java.io.PrintWriter;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.FileNotFoundException;
 import java.nio.file.StandardOpenOption;
 import java.nio.file.Files;
@@ -184,24 +185,48 @@ class CutoutImpl implements Cutout
    public CutResult doFile(String relPathname, int hdunum,
          Pos pos, Band band, Time time, Pol pol,
          boolean countNullValues, FitsCard[] extraCards)
-   {
-      LOGGER.info("trace: " + pos.toString() );
+         throws IOException, InterruptedException
+      {
+         LOGGER.info("trace: " + pos.toString() );
 
-      String absSubimgPathname = settings.fitsPaths.cutouts() + "/" + generateSubimgPathname(relPathname, hdunum);
+         CutResult cutResult = new CutResult();
 
-      JsonEncoder jReq = new JsonEncoder();
-      jReq.add(relPathname, hdunum);
-      jReq.add(pos);
-      jReq.add(band);
-      jReq.add(time);
-      jReq.add(pol);
-      jReq.add(countNullValues);
-      jReq.add(extraCards);
+         if(settings.amqpConn.isHostnameEmpty())
+         {
+            String absSubimgPathname = settings.fitsPaths.cutouts()
+               + "/" + generateSubimgPathname(relPathname, hdunum);
 
-      String outJson = doRpc( jReq.toString() );
+            OutputStream fileOutputStream = new FileOutputStream( new File(absSubimgPathname) );
 
-      return JsonDecoder.responseFromCutoutJson( outJson );
-   }
+            doStream(relPathname, hdunum, pos, band, time, pol, fileOutputStream);
+
+            // engine returns absPathname see common/cutout.cpp::do_cutout_file()
+            cutResult.filename = absSubimgPathname;
+            cutResult.filesize = Files.size(Paths.get(absSubimgPathname));
+
+            if(countNullValues)
+            {
+               LOGGER.info("NullValuesCount not implemented when used with Cutout::doStream()");
+            }
+         }
+         else
+         {
+            JsonEncoder jReq = new JsonEncoder();
+            jReq.add(relPathname, hdunum);
+            jReq.add(pos);
+            jReq.add(band);
+            jReq.add(time);
+            jReq.add(pol);
+            jReq.add(countNullValues);
+            jReq.add(extraCards);
+
+            String outJson = doRpc( jReq.toString() );
+
+            cutResult = JsonDecoder.responseFromCutoutJson( outJson );
+         }
+
+         return cutResult;
+      }
 
 
 
diff --git a/data-access/servlet/src/main/java/webapi/ServletCutout.java b/data-access/servlet/src/main/java/webapi/ServletCutout.java
index 26e673e427c374d654c2dbe7a5c55ec56d59c969..8b77375f2663d9477543877e6b99b565228571e5 100644
--- a/data-access/servlet/src/main/java/webapi/ServletCutout.java
+++ b/data-access/servlet/src/main/java/webapi/ServletCutout.java
@@ -113,7 +113,7 @@ public class ServletCutout extends javax.servlet.http.HttpServlet
 
 
    protected void doCutoutFileStream(String id, Pos pos, Band band, Time time, Pol pol, OutputStream respOutputStream)
-      throws IOException
+      throws IOException, InterruptedException
    {
       LOGGER.info("trace" + pos);
 
@@ -137,6 +137,7 @@ public class ServletCutout extends javax.servlet.http.HttpServlet
 
    protected DataLink doCutoutFile(String id, Pos pos, Band band, Time time, Pol pol,
          boolean countNullValues, String respFormat)
+         throws IOException, InterruptedException
    {
       LOGGER.info("trace");
 
diff --git a/data-access/servlet/src/main/java/webapi/Settings.java b/data-access/servlet/src/main/java/webapi/Settings.java
index 233bfe3882e3580257f9c2c5d433a9302d6514c0..c56f91a3605a79545cf380366d233dced18ce698 100644
--- a/data-access/servlet/src/main/java/webapi/Settings.java
+++ b/data-access/servlet/src/main/java/webapi/Settings.java
@@ -71,6 +71,11 @@ class Settings
       public int    portNumber() { return portNum; }
       public String routingKey() { return routingKey; }
 
+      public boolean isHostnameEmpty()
+      {
+         return ( (hostName == null) || hostName.trim().isEmpty() );
+      }
+
       public String toString()
       {
          return hostName + " " + String.valueOf(portNum) + " " + routingKey;