diff --git a/src/calng/DetectorAssembler.py b/src/calng/DetectorAssembler.py
index 94418b1a621e101cff0925e27727835c8938d5cb..3ec407bff51a1bbf8b4b88dfc6140bf19de6e2aa 100644
--- a/src/calng/DetectorAssembler.py
+++ b/src/calng/DetectorAssembler.py
@@ -1,7 +1,5 @@
 import enum
 import functools
-import gzip
-import pickle
 import re
 
 import numpy as np
@@ -30,7 +28,7 @@ from karabo.bound import (
 )
 from TrainMatcher import TrainMatcher
 
-from . import scenes
+from . import geom_utils, scenes, utils
 from ._version import version as deviceVersion
 
 
@@ -163,9 +161,9 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
             .key("geometryDevice")
             .displayedName("Geometry device")
             .description(
-                "The name of the device which will provide geometries. The device is "
-                "expected to provide a current geometry as a VectorChar (gzipped "
-                "pickled extra-geom geometry) element named pickledGeometry"
+                "The the device which will provide geometry. The device is expected to "
+                "have current geometry as a string (for now using custom non-robust "
+                "serialization scheme) element named serializedGeometry."
             )
             .assignmentMandatory()
             .commit(),
@@ -189,10 +187,10 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
         geometry_device = self.get("geometryDevice")
         client = self.remote()
         try:
-            initial_geometry = client.get(geometry_device, "pickledGeometry")
+            initial_geometry = client.get(geometry_device, "serializedGeometry")
         except RuntimeError:
             self.log.WARN(
-                f"Failed to get initial geometry, maybe geometry device is down"
+                "Failed to get initial geometry, maybe geometry device is down"
             )
         else:
             self.log.INFO("Got geometry immediately after init :D")
@@ -230,14 +228,14 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
             return super().requestScene(params)
 
     def _receive_geometry(self, device_id, config):
-        if not config.has("pickledGeometry"):
+        if not config.has("serializedGeometry"):
             return
         self.log.INFO(f"Found geometry on {device_id}")
-        zipped_geometry = config["pickledGeometry"]
-        if len(zipped_geometry) == 0:
+        serialized_geometry = config["serializedGeometry"]
+        if len(serialized_geometry) == 0:
             self.log.INFO("New geometry empty, will ignore update.")
             return
-        self._geometry = pickle.loads(gzip.decompress(zipped_geometry))
+        self._geometry = geom_utils.deserialize_geometry(serialized_geometry)
         # TODO: allow multiple memory cells (extra geom notion of extra dimensions)
         self._stack_input_buffer = np.zeros(self._geometry.expected_data_shape)
 
diff --git a/src/calng/base_geometry.py b/src/calng/base_geometry.py
index 1b3e052b19fa32e909d687fe32905abd061bb9ef..c2fdb1394a3c6b97cbc798c33470f35f22bf4c80 100644
--- a/src/calng/base_geometry.py
+++ b/src/calng/base_geometry.py
@@ -1,7 +1,5 @@
 import contextlib
-import gzip
 import logging
-import pickle
 
 import matplotlib.pyplot as plt
 import numpy as np
@@ -24,7 +22,6 @@ from karabo.middlelayer import (
     State,
     String,
     Unit,
-    VectorChar,
     VectorHash,
     VectorString,
     get_instance_parent,
@@ -33,7 +30,7 @@ from karabo.middlelayer import (
 from matplotlib.backends.backend_agg import FigureCanvasAgg
 
 from ._version import version as deviceVersion
-from . import scenes
+from . import geom_utils, scenes
 
 
 def make_x_y_coordinate_node(
@@ -199,9 +196,9 @@ class ManualGeometryBase(Device):
         daqPolicy=DaqPolicy.OMIT,
     )
 
-    pickledGeometry = VectorChar(
-        displayedName="Pickled geometry",
-        defaultValue=[],
+    serializedGeometry = String(
+        displayedName="Serialized geometry",
+        defaultValue="",
         accessMode=AccessMode.READONLY,
     )
 
@@ -209,6 +206,7 @@ class ManualGeometryBase(Device):
         ImageData(np.empty(0, dtype=np.uint32)),
         displayedName="Geometry preview",
         encoding=EncodingType.RGBA,
+        daqPolicy=DaqPolicy.OMIT,
     )
 
     geometryFile = Node(
@@ -284,7 +282,7 @@ class ManualGeometryBase(Device):
 
     async def _set_geometry(self, geometry, update_preview=True):
         self.geometry = geometry
-        self.pickledGeometry = gzip.compress(pickle.dumps(self.geometry))
+        self.serializedGeometry = geom_utils.serialize_geometry(geometry)
         if update_preview:
             await self.updatePreview()
 
diff --git a/src/calng/geom_utils.py b/src/calng/geom_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..de8181380195a8df78e02d3696d17f4c131943bb
--- /dev/null
+++ b/src/calng/geom_utils.py
@@ -0,0 +1,11 @@
+import base64
+import gzip
+import pickle
+
+
+def serialize_geometry(geom: "extra_geom.base.DetectorGeometryBase") -> str:
+    return base64.b64encode(gzip.compress(pickle.dumps(geom))).decode(encoding="ASCII")
+
+
+def deserialize_geometry(serialized: str) -> "extra_geom.base.DetectorGeometryBase":
+    return pickle.loads(gzip.decompress(base64.b64decode(serialized.encode())))