diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index 9ef9683cbd68c4fc92e6af99a16d02dd238c6047..ae8265e10f16ea181551d87ac3bc29509496bccb 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -176,8 +176,9 @@ std::vector<std::string> Frame::availableTrafos() const
     return result;
 }
 
-Frame* Frame::transformedFrame(const FrameTrafo& trafo) const
+Frame* Frame::transformedFrame(const std::string& key) const
 {
+    const FrameTrafo& trafo = findTrafo(key);
     ASSERT(trafo.coords.size() == rank());
     std::vector<const Scale*> outaxes;
     for (size_t k = 0; k < rank(); ++k) {
diff --git a/Base/Axis/Frame.h b/Base/Axis/Frame.h
index 00097aa80f63b9412cd00ce698d1d9469513d312..59ff5be4658b561fc0247663ee95e236417be222 100644
--- a/Base/Axis/Frame.h
+++ b/Base/Axis/Frame.h
@@ -89,7 +89,7 @@ public:
 #endif // SWIG
 
     Frame* plottableFrame(std::vector<std::string> labels = {}) const;
-    Frame* transformedFrame(const FrameTrafo& trafo) const;
+    Frame* transformedFrame(const std::string& key) const;
     Frame* flat() const;
 
     std::vector<std::string> availableTrafos() const;
diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp
index 1ae24939216f765928cc691b9eb2d72024ee7c23..f45fb21826be77026f22abc64f5a236cbc6d46b7 100644
--- a/Device/Data/Datafield.cpp
+++ b/Device/Data/Datafield.cpp
@@ -377,10 +377,9 @@ Datafield Datafield::plottableField(std::vector<std::string> labels) const
     return {title(), frame().plottableFrame(labels), m_values, m_errSigmas};
 }
 
-Datafield Datafield::transformedField(std::string label) const
+Datafield Datafield::transformedField(const std::string& key) const
 {
-    const FrameTrafo& trafo = frame().findTrafo(label);
-    return {title(), frame().transformedFrame(trafo), m_values, m_errSigmas};
+    return {title(), frame().transformedFrame(key), m_values, m_errSigmas};
 }
 
 Datafield Datafield::flat() const
diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h
index 2bd979b59cf4dc39db7df6efde4d39962f476a5e..f48316dee424f02a9044beba5d11da413a4b666e 100644
--- a/Device/Data/Datafield.h
+++ b/Device/Data/Datafield.h
@@ -90,7 +90,7 @@ public:
     //... modifiers
 
     Datafield plottableField(std::vector<std::string> labels = {}) const;
-    Datafield transformedField(std::string label) const;
+    Datafield transformedField(const std::string& label) const;
     Datafield flat() const;
     Datafield noisy(double prefactor, double minimum) const;
 
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index 1b2002a8d72e6abd898302673f25e5da92be248d..a34e9ea7b3ce05efc48f5be6effd35fc723164a1 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -2063,9 +2063,9 @@ class Frame(object):
         r"""plottableFrame(Frame self, vector_string_t labels={}) -> Frame"""
         return _libBornAgainBase.Frame_plottableFrame(self, *args)
 
-    def transformedFrame(self, trafo):
-        r"""transformedFrame(Frame self, FrameTrafo const & trafo) -> Frame"""
-        return _libBornAgainBase.Frame_transformedFrame(self, trafo)
+    def transformedFrame(self, key):
+        r"""transformedFrame(Frame self, std::string const & key) -> Frame"""
+        return _libBornAgainBase.Frame_transformedFrame(self, key)
 
     def flat(self):
         r"""flat(Frame self) -> Frame"""
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index 66ebcebaef87cab42df95e99c83ce2163ff143a9..5e64eaa6c4f41c3ffbcfd97613ad64d027c8aa76 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -28309,11 +28309,10 @@ fail:
 SWIGINTERN PyObject *_wrap_Frame_transformedFrame(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   Frame *arg1 = (Frame *) 0 ;
-  FrameTrafo *arg2 = 0 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
   Frame *result = 0 ;
   
@@ -28323,17 +28322,20 @@ SWIGINTERN PyObject *_wrap_Frame_transformedFrame(PyObject *self, PyObject *args
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Frame_transformedFrame" "', argument " "1"" of type '" "Frame const *""'"); 
   }
   arg1 = reinterpret_cast< Frame * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_FrameTrafo,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Frame_transformedFrame" "', argument " "2"" of type '" "FrameTrafo const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Frame_transformedFrame" "', argument " "2"" of type '" "FrameTrafo const &""'"); 
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Frame_transformedFrame" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Frame_transformedFrame" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
   }
-  arg2 = reinterpret_cast< FrameTrafo * >(argp2);
   {
     try {
-      result = (Frame *)((Frame const *)arg1)->transformedFrame((FrameTrafo const &)*arg2);
+      result = (Frame *)((Frame const *)arg1)->transformedFrame((std::string const &)*arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -28343,8 +28345,10 @@ SWIGINTERN PyObject *_wrap_Frame_transformedFrame(PyObject *self, PyObject *args
     }
   }
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Frame, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
@@ -30978,7 +30982,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "Frame_hasSameSizes", _wrap_Frame_hasSameSizes, METH_VARARGS, "Frame_hasSameSizes(Frame self, Frame arg2) -> bool"},
 	 { "Frame___eq__", _wrap_Frame___eq__, METH_VARARGS, "Frame___eq__(Frame self, Frame arg2) -> bool"},
 	 { "Frame_plottableFrame", _wrap_Frame_plottableFrame, METH_VARARGS, "Frame_plottableFrame(Frame self, vector_string_t labels={}) -> Frame"},
-	 { "Frame_transformedFrame", _wrap_Frame_transformedFrame, METH_VARARGS, "Frame_transformedFrame(Frame self, FrameTrafo const & trafo) -> Frame"},
+	 { "Frame_transformedFrame", _wrap_Frame_transformedFrame, METH_VARARGS, "Frame_transformedFrame(Frame self, std::string const & key) -> Frame"},
 	 { "Frame_flat", _wrap_Frame_flat, METH_O, "Frame_flat(Frame self) -> Frame"},
 	 { "Frame_availableTrafos", _wrap_Frame_availableTrafos, METH_O, "Frame_availableTrafos(Frame self) -> vector_string_t"},
 	 { "Frame_swigregister", Frame_swigregister, METH_O, NULL},
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index db817c2a261d1716bde1652dfd545fcc7b0a4ecb..4f8d3f0bff7e812991137f92102d0e58c07d0a43 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -2179,7 +2179,7 @@ class Datafield(object):
         return _libBornAgainDevice.Datafield_plottableField(self, *args)
 
     def transformedField(self, label):
-        r"""transformedField(Datafield self, std::string label) -> Datafield"""
+        r"""transformedField(Datafield self, std::string const & label) -> Datafield"""
         return _libBornAgainDevice.Datafield_transformedField(self, label)
 
     def flat(self):
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index cbdfd7dd17f1fa922abfca9d30ba2e7c16b464f8..816d800183c84d9fecac2ae7855ec100432affc1 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -30584,9 +30584,10 @@ fail:
 SWIGINTERN PyObject *_wrap_Datafield_transformedField(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   Datafield *arg1 = (Datafield *) 0 ;
-  std::string arg2 ;
+  std::string *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Datafield > result;
   
@@ -30598,16 +30599,18 @@ SWIGINTERN PyObject *_wrap_Datafield_transformedField(PyObject *self, PyObject *
   arg1 = reinterpret_cast< Datafield * >(argp1);
   {
     std::string *ptr = (std::string *)0;
-    int res = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Datafield_transformedField" "', argument " "2"" of type '" "std::string""'"); 
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Datafield_transformedField" "', argument " "2"" of type '" "std::string const &""'"); 
     }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Datafield_transformedField" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
   }
   {
     try {
-      result = ((Datafield const *)arg1)->transformedField(arg2);
+      result = ((Datafield const *)arg1)->transformedField((std::string const &)*arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -30617,8 +30620,10 @@ SWIGINTERN PyObject *_wrap_Datafield_transformedField(PyObject *self, PyObject *
     }
   }
   resultobj = SWIG_NewPointerObj((new Datafield(result)), SWIGTYPE_p_Datafield, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
 fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
   return NULL;
 }
 
@@ -44136,7 +44141,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "Datafield_maxVal", _wrap_Datafield_maxVal, METH_O, "Datafield_maxVal(Datafield self) -> double"},
 	 { "Datafield_minVal", _wrap_Datafield_minVal, METH_O, "Datafield_minVal(Datafield self) -> double"},
 	 { "Datafield_plottableField", _wrap_Datafield_plottableField, METH_VARARGS, "Datafield_plottableField(Datafield self, vector_string_t labels={}) -> Datafield"},
-	 { "Datafield_transformedField", _wrap_Datafield_transformedField, METH_VARARGS, "Datafield_transformedField(Datafield self, std::string label) -> Datafield"},
+	 { "Datafield_transformedField", _wrap_Datafield_transformedField, METH_VARARGS, "Datafield_transformedField(Datafield self, std::string const & label) -> Datafield"},
 	 { "Datafield_flat", _wrap_Datafield_flat, METH_O, "Datafield_flat(Datafield self) -> Datafield"},
 	 { "Datafield_noisy", _wrap_Datafield_noisy, METH_VARARGS, "Datafield_noisy(Datafield self, double prefactor, double minimum) -> Datafield"},
 	 { "Datafield_scale", _wrap_Datafield_scale, METH_VARARGS, "Datafield_scale(Datafield self, double factor)"},