diff --git a/Image3dAPI/IImage3d.idl b/Image3dAPI/IImage3d.idl
index bce48ba..df7779c 100644
--- a/Image3dAPI/IImage3d.idl
+++ b/Image3dAPI/IImage3d.idl
@@ -22,6 +22,15 @@ enum Image3dAPIVersion {
 } Image3dAPIVersion;
 
 
+typedef [
+    v1_enum, // 32bit enum size
+    helpstring("Enum of supported image types (extended upon demand).")]
+enum ImageType {
+    IMAGE_TYPE_INVALID   = 0, ///< make sure that "cleared" state is invalid
+    IMAGE_TYPE_TISSUE    = 1, ///< grayscale B-mode image
+    IMAGE_TYPE_BLOOD_VEL = 2, ///< blood velocities (color-flow) (rel. to probe)
+} ImageType;
+
 typedef [
   v1_enum, // 32bit enum size
   helpstring("Enum of supported image formats (extended upon demand).")]
@@ -285,21 +294,40 @@ cpp_quote("#else")
 cpp_quote("static_assert(sizeof(EcgSeries) == 2*8+2*4, \"EcgSeries size mismatch\");")
 cpp_quote("#endif")
 
+
+[object,
+    oleautomation, // use "automation" marshaler (oleaut32.dll)
+    uuid(D7D2A41A-F738-41EB-8133-1B06DDA1FF40),
+    helpstring("3D image stream interface. Used to group frames sharing a common type (e.g. tissue or color-flow).")]
+interface IImage3dStream : IUnknown {
+    [helpstring("Get stream type.")]
+    HRESULT GetType ([out, retval] ImageType * type);
+
+    [helpstring("Get the number of frames available")]
+    HRESULT GetFrameCount ([out, retval] unsigned int * size);
+
+    [helpstring("Get the time of all frames (useful for matching frame indices to ECG before retrieving image data) ")]
+    HRESULT GetFrameTimes ([out, retval] SAFEARRAY(double) * frame_times);
+
+    [helpstring("Get image data (const) for a given frame within a specified geometry")]
+    HRESULT GetFrame ([in] unsigned int index, [out, retval] Image3d * data);
+};
+
+
 [ object,
   oleautomation, // use "automation" marshaler (oleaut32.dll)
   uuid(D483D815-52DD-4750-8CA2-5C6C489588B6),
   helpstring("Interface for retrieving 3D image data.")]
 interface IImage3dSource : IUnknown {
-    [helpstring("Get the number of frames available")]
-    HRESULT GetFrameCount ([out,retval] unsigned int * size);
+    [helpstring("Get the number of streams available.")]
+    HRESULT GetStreamCount ([out, retval] unsigned int * size);
 
-    [helpstring("Get the time of all frames (useful for matching frame indices to ECG before retrieving image data) ")]
-    HRESULT GetFrameTimes ([out, retval] SAFEARRAY(double) * frame_times);
+    [helpstring("Get cartesian image stream. The geometry and resolution arguments are advisory, and might not be honored.\n"
+                "Clients should therefore check the actual geometry and resolution of the retrieved stream afterwards.")]
+    HRESULT GetStream ([in] int index, [in] Cart3dGeom geom, [in] unsigned int max_resolution[3], [out, retval] IImage3dStream ** stream);
 
-    [helpstring("Get image data (const) for a given frame within a specified geometry")]
-    HRESULT GetFrame ([in] unsigned int index, [in] Cart3dGeom geom, [in] unsigned short max_resolution[3], [out,retval] Image3d * data);
 
-    [helpstring("Get a bounding box encapsulating all image data. Can be used as intput to GetFrame to avoid cropping.")]
+    [helpstring("Get a bounding box encapsulating all image data. Can be used as intput to GetStream to avoid cropping.")]
     HRESULT GetBoundingBox ([out,retval] Cart3dGeom * geom);
 
     [helpstring("Retrieve color-map table for mapping image intensities to RGBx values. Length depend on format.")]
diff --git a/Image3dAPI/UNREGISTER_Image3dAPI.bat b/Image3dAPI/UNREGISTER_Image3dAPI.bat
index 6f6a849..98ce305 100644
--- a/Image3dAPI/UNREGISTER_Image3dAPI.bat
+++ b/Image3dAPI/UNREGISTER_Image3dAPI.bat
@@ -14,6 +14,7 @@ reg delete "HKCR\TypeLib\{3ff1aab8-f3d8-33d4-825d-00104b3646c0}" /f 2> NUL
 
 for %%P in (32 64) do (
   :: IImage3d.idl
+  reg delete "HKCR\Interface\{D7D2A41A-F738-41EB-8133-1B06DDA1FF40}" /f /reg:%%P 2> NUL
   reg delete "HKCR\Interface\{D483D815-52DD-4750-8CA2-5C6C489588B6}" /f /reg:%%P 2> NUL
   reg delete "HKCR\Interface\{CD30759B-EB38-4469-9CA5-4DF75737A31B}" /f /reg:%%P 2> NUL
 )