diff --git a/Wrap/Swig/ignoreBase.i b/Wrap/Swig/ignoreBase.i
deleted file mode 100644
index 168b1e00ef4fd5f2a49b441917028b3096718f91..0000000000000000000000000000000000000000
--- a/Wrap/Swig/ignoreBase.i
+++ /dev/null
@@ -1,19 +0,0 @@
-%ignore Vec3<std::complex<double>>::complex() const;
-%ignore Vec3<std::complex<double>>::angle(const Vec3<std::complex<double>>&) const;
-%ignore Vec3<std::complex<double>>::perp2(const Vec3<std::complex<double>>&) const;
-%ignore Vec3<std::complex<double>>::sin2Theta() const;
-%ignore Vec3<std::complex<double>>::cosTheta() const;
-%ignore Vec3<std::complex<double>>::theta() const;
-%ignore Vec3<std::complex<double>>::phi() const;
-%ignore Vec3<std::complex<double>>::rotated(double, const Vec3<std::complex<double>>&) const;
-%ignore Vec3<std::complex<double>>::rotatedX(double) const;
-%ignore Vec3<std::complex<double>>::rotatedY(double) const;
-%ignore Vec3<std::complex<double>>::rotatedZ(double) const;
-
-%ignore Vec3<std::complex<double>>::cross(const Vec3<std::complex<double>>&) const;
-%ignore Vec3<std::complex<double>>::perp(const Vec3<std::complex<double>>&) const;
-
-%ignore Vec3<double>::rotated(double, const Vec3<double>&) const;
-%ignore Vec3<double>::rotatedX(double) const;
-%ignore Vec3<double>::rotatedY(double) const;
-%ignore Vec3<double>::rotatedZ(double) const;
diff --git a/Wrap/Swig/libBornAgainBase.i b/Wrap/Swig/libBornAgainBase.i
index ca056395c8c92e3fe1dc78295cb99c4d810c9b8a..b0d5ffa47435d9a19c31cf72e170c2b9d63b55e0 100644
--- a/Wrap/Swig/libBornAgainBase.i
+++ b/Wrap/Swig/libBornAgainBase.i
@@ -18,7 +18,6 @@
 
 %include "../../auto/Wrap/doxygenBase.i"
 
-%include "ignoreBase.i"
 
 %{
 #include <heinz/Complex.h>
diff --git a/Wrap/Swig/libBornAgainDevice.i b/Wrap/Swig/libBornAgainDevice.i
index 4932d9afc79fa67aa5cbd5c242d195246fa4694e..90fcabd39ac8cf780669a2f35d309198f9428d79 100644
--- a/Wrap/Swig/libBornAgainDevice.i
+++ b/Wrap/Swig/libBornAgainDevice.i
@@ -20,7 +20,6 @@
 
 %include "../../auto/Wrap/doxygenDevice.i"
 
-%include "ignoreBase.i"
 
 %{
 #include "Base/Element/PolMatrices.h"
diff --git a/Wrap/Swig/libBornAgainParam.i b/Wrap/Swig/libBornAgainParam.i
index 754b2f3b5a8c5176cc6e3f3c22334ed717e7c2df..d5b6b374ce6877d82a3fdb159e6021b91e9594c2 100644
--- a/Wrap/Swig/libBornAgainParam.i
+++ b/Wrap/Swig/libBornAgainParam.i
@@ -20,7 +20,6 @@
 
 %include "../../auto/Wrap/doxygenParam.i"
 
-%include "ignoreBase.i"
 
 %{
 #include "Param/Distrib/Distributions.h"
diff --git a/Wrap/Swig/libBornAgainResample.i b/Wrap/Swig/libBornAgainResample.i
index a070df775fab872fab1b36afae4b6ffe0d5bb7dc..f77d3eb5c686a9862f1c7ac649310c856794cd5e 100644
--- a/Wrap/Swig/libBornAgainResample.i
+++ b/Wrap/Swig/libBornAgainResample.i
@@ -26,7 +26,6 @@
 
 %include "Resample/Options/SimulationOptions.h"
 
-%include "ignoreBase.i"
 %include "ignoreSample.i"
 
 // Propagate python exceptions (from https://stackoverflow.com/questions/4811492)
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 69ceefd87b0359f0f4a749cd5ce807ddcf122f6a..761c235943196a4b88de8ad89d29f94c7e596840 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -20,7 +20,6 @@
 
 %include "../../auto/Wrap/doxygenSample.i"
 
-%include "ignoreBase.i"
 %include "ignoreSample.i"
 
 // force swig to use move ctor instead of copy ctor
diff --git a/Wrap/Swig/libBornAgainSim.i b/Wrap/Swig/libBornAgainSim.i
index 4416f68be95751015dcb64e07d52d82cdd937bd3..73199e55f24133136520c8557b7490bf305feb28 100644
--- a/Wrap/Swig/libBornAgainSim.i
+++ b/Wrap/Swig/libBornAgainSim.i
@@ -20,7 +20,6 @@
 
 %include "../../auto/Wrap/doxygenSim.i"
 
-%include "ignoreBase.i"
 %include "ignoreSample.i"
 
 %ignore ISpecularScan;
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index a7ca53ce84752a075da187dc5b9ef38ca469470b..ecf86449068167921cefa6c2e43331b59720420f 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -2886,6 +2886,14 @@ class R3(object):
     def __ne__(self, other):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainBase.R3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(R3 self, double a) -> R3"""
+        return _libBornAgainBase.R3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(R3 self, double a) -> R3"""
+        return _libBornAgainBase.R3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainBase.delete_R3
 
 # Register R3 in _libBornAgainBase:
@@ -2960,6 +2968,10 @@ class C3(object):
         r"""unit(C3 self) -> C3"""
         return _libBornAgainBase.C3_unit(self)
 
+    def complex(self):
+        r"""complex(C3 self) -> C3"""
+        return _libBornAgainBase.C3_complex(self)
+
     def real(self):
         r"""real(C3 self) -> R3"""
         return _libBornAgainBase.C3_real(self)
@@ -2971,6 +2983,14 @@ class C3(object):
     def __ne__(self, other):
         r"""__ne__(C3 self, C3 other) -> bool"""
         return _libBornAgainBase.C3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(C3 self, double a) -> C3"""
+        return _libBornAgainBase.C3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(C3 self, double a) -> C3"""
+        return _libBornAgainBase.C3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainBase.delete_C3
 
 # Register C3 in _libBornAgainBase:
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index 9f85fbada9c53dec9a8576cb55873b6d7036d75d..0a19122abb28df1dfe071c3fb6c7a680514ab8ab 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -27936,6 +27936,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_R3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedY" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_R3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedZ" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_R3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -28428,6 +28488,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  C3 result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_complex" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  result = ((Vec3< std::complex< double > > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new C3(static_cast< const C3& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_C3_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -28521,6 +28604,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedY" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_C3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedZ" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_C3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -29813,6 +29956,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
+	 { "R3_rotatedY", _wrap_R3_rotatedY, METH_VARARGS, "R3_rotatedY(R3 self, double a) -> R3"},
+	 { "R3_rotatedZ", _wrap_R3_rotatedZ, METH_VARARGS, "R3_rotatedZ(R3 self, double a) -> R3"},
 	 { "delete_R3", _wrap_delete_R3, METH_O, "delete_R3(R3 self)"},
 	 { "R3_swigregister", R3_swigregister, METH_O, NULL},
 	 { "R3_swiginit", R3_swiginit, METH_VARARGS, NULL},
@@ -29834,9 +29979,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "C3_magxy2", _wrap_C3_magxy2, METH_O, "C3_magxy2(C3 self) -> double"},
 	 { "C3_magxy", _wrap_C3_magxy, METH_O, "C3_magxy(C3 self) -> double"},
 	 { "C3_unit", _wrap_C3_unit, METH_O, "C3_unit(C3 self) -> C3"},
+	 { "C3_complex", _wrap_C3_complex, METH_O, "C3_complex(C3 self) -> C3"},
 	 { "C3_real", _wrap_C3_real, METH_O, "C3_real(C3 self) -> R3"},
 	 { "C3___eq__", _wrap_C3___eq__, METH_VARARGS, "C3___eq__(C3 self, C3 other) -> bool"},
 	 { "C3___ne__", _wrap_C3___ne__, METH_VARARGS, "C3___ne__(C3 self, C3 other) -> bool"},
+	 { "C3_rotatedY", _wrap_C3_rotatedY, METH_VARARGS, "C3_rotatedY(C3 self, double a) -> C3"},
+	 { "C3_rotatedZ", _wrap_C3_rotatedZ, METH_VARARGS, "C3_rotatedZ(C3 self, double a) -> C3"},
 	 { "delete_C3", _wrap_delete_C3, METH_O, "delete_C3(C3 self)"},
 	 { "C3_swigregister", C3_swigregister, METH_O, NULL},
 	 { "C3_swiginit", C3_swiginit, METH_VARARGS, NULL},
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index febf9953e28f0dbb2d6ba2688834b796b6c250c4..c960400478c16eeca6cc133d1a70428fb99611f4 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -1764,6 +1764,14 @@ class R3(object):
     def __ne__(self, other):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainDevice.R3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(R3 self, double a) -> R3"""
+        return _libBornAgainDevice.R3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(R3 self, double a) -> R3"""
+        return _libBornAgainDevice.R3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainDevice.delete_R3
 
 # Register R3 in _libBornAgainDevice:
@@ -1838,6 +1846,10 @@ class C3(object):
         r"""unit(C3 self) -> C3"""
         return _libBornAgainDevice.C3_unit(self)
 
+    def complex(self):
+        r"""complex(C3 self) -> C3"""
+        return _libBornAgainDevice.C3_complex(self)
+
     def real(self):
         r"""real(C3 self) -> R3"""
         return _libBornAgainDevice.C3_real(self)
@@ -1849,6 +1861,14 @@ class C3(object):
     def __ne__(self, other):
         r"""__ne__(C3 self, C3 other) -> bool"""
         return _libBornAgainDevice.C3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(C3 self, double a) -> C3"""
+        return _libBornAgainDevice.C3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(C3 self, double a) -> C3"""
+        return _libBornAgainDevice.C3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainDevice.delete_C3
 
 # Register C3 in _libBornAgainDevice:
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index 30e92ff7b44da1e3d866c2b647a140d3d97320d0..c7af9cde68f0f8fabd83af8a9b965ab0863ccf78 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -24426,6 +24426,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_R3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedY" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_R3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedZ" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_R3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -24918,6 +24978,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  C3 result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_complex" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  result = ((Vec3< std::complex< double > > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new C3(static_cast< const C3& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_C3_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -25011,6 +25094,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedY" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_C3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedZ" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_C3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -42558,6 +42701,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
+	 { "R3_rotatedY", _wrap_R3_rotatedY, METH_VARARGS, "R3_rotatedY(R3 self, double a) -> R3"},
+	 { "R3_rotatedZ", _wrap_R3_rotatedZ, METH_VARARGS, "R3_rotatedZ(R3 self, double a) -> R3"},
 	 { "delete_R3", _wrap_delete_R3, METH_O, "delete_R3(R3 self)"},
 	 { "R3_swigregister", R3_swigregister, METH_O, NULL},
 	 { "R3_swiginit", R3_swiginit, METH_VARARGS, NULL},
@@ -42579,9 +42724,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "C3_magxy2", _wrap_C3_magxy2, METH_O, "C3_magxy2(C3 self) -> double"},
 	 { "C3_magxy", _wrap_C3_magxy, METH_O, "C3_magxy(C3 self) -> double"},
 	 { "C3_unit", _wrap_C3_unit, METH_O, "C3_unit(C3 self) -> C3"},
+	 { "C3_complex", _wrap_C3_complex, METH_O, "C3_complex(C3 self) -> C3"},
 	 { "C3_real", _wrap_C3_real, METH_O, "C3_real(C3 self) -> R3"},
 	 { "C3___eq__", _wrap_C3___eq__, METH_VARARGS, "C3___eq__(C3 self, C3 other) -> bool"},
 	 { "C3___ne__", _wrap_C3___ne__, METH_VARARGS, "C3___ne__(C3 self, C3 other) -> bool"},
+	 { "C3_rotatedY", _wrap_C3_rotatedY, METH_VARARGS, "C3_rotatedY(C3 self, double a) -> C3"},
+	 { "C3_rotatedZ", _wrap_C3_rotatedZ, METH_VARARGS, "C3_rotatedZ(C3 self, double a) -> C3"},
 	 { "delete_C3", _wrap_delete_C3, METH_O, "delete_C3(C3 self)"},
 	 { "C3_swigregister", C3_swigregister, METH_O, NULL},
 	 { "C3_swiginit", C3_swiginit, METH_VARARGS, NULL},
diff --git a/auto/Wrap/libBornAgainResample.py b/auto/Wrap/libBornAgainResample.py
index edc24e2bc59b2203c79cf93a8248cd3ace9f2d79..2234c83531170a32eb6f6b1404bae708676374f1 100644
--- a/auto/Wrap/libBornAgainResample.py
+++ b/auto/Wrap/libBornAgainResample.py
@@ -1920,6 +1920,14 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainResample.R3___ne__(self, other)
 
+    def rotatedY(self, a):
+        r"""rotatedY(R3 self, double a) -> R3"""
+        return _libBornAgainResample.R3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(R3 self, double a) -> R3"""
+        return _libBornAgainResample.R3_rotatedZ(self, a)
+
     def __add__(self, rhs):
         r"""__add__(R3 self, R3 rhs) -> R3"""
         return _libBornAgainResample.R3___add__(self, rhs)
@@ -2009,6 +2017,10 @@ class C3(object):
         r"""unit(C3 self) -> C3"""
         return _libBornAgainResample.C3_unit(self)
 
+    def complex(self):
+        r"""complex(C3 self) -> C3"""
+        return _libBornAgainResample.C3_complex(self)
+
     def real(self):
         r"""real(C3 self) -> R3"""
         return _libBornAgainResample.C3_real(self)
@@ -2020,6 +2032,14 @@ class C3(object):
     def __ne__(self, other):
         r"""__ne__(C3 self, C3 other) -> bool"""
         return _libBornAgainResample.C3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(C3 self, double a) -> C3"""
+        return _libBornAgainResample.C3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(C3 self, double a) -> C3"""
+        return _libBornAgainResample.C3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainResample.delete_C3
 
 # Register C3 in _libBornAgainResample:
diff --git a/auto/Wrap/libBornAgainResample_wrap.cpp b/auto/Wrap/libBornAgainResample_wrap.cpp
index a419f5e95f321f07ea9a406cb6819d6af897a799..b925818aacfa2dc3d460562069041e53bf7d8904 100644
--- a/auto/Wrap/libBornAgainResample_wrap.cpp
+++ b/auto/Wrap/libBornAgainResample_wrap.cpp
@@ -24877,6 +24877,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_R3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedY" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_R3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedZ" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_R3___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -25493,6 +25553,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  C3 result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_complex" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  result = ((Vec3< std::complex< double > > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new C3(static_cast< const C3& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_C3_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -25586,6 +25669,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedY" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_C3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedZ" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_C3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -28353,6 +28496,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
+	 { "R3_rotatedY", _wrap_R3_rotatedY, METH_VARARGS, "R3_rotatedY(R3 self, double a) -> R3"},
+	 { "R3_rotatedZ", _wrap_R3_rotatedZ, METH_VARARGS, "R3_rotatedZ(R3 self, double a) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},
 	 { "R3___rmul__", _wrap_R3___rmul__, METH_VARARGS, "R3___rmul__(R3 self, double c) -> R3"},
@@ -28378,9 +28523,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "C3_magxy2", _wrap_C3_magxy2, METH_O, "C3_magxy2(C3 self) -> double"},
 	 { "C3_magxy", _wrap_C3_magxy, METH_O, "C3_magxy(C3 self) -> double"},
 	 { "C3_unit", _wrap_C3_unit, METH_O, "C3_unit(C3 self) -> C3"},
+	 { "C3_complex", _wrap_C3_complex, METH_O, "C3_complex(C3 self) -> C3"},
 	 { "C3_real", _wrap_C3_real, METH_O, "C3_real(C3 self) -> R3"},
 	 { "C3___eq__", _wrap_C3___eq__, METH_VARARGS, "C3___eq__(C3 self, C3 other) -> bool"},
 	 { "C3___ne__", _wrap_C3___ne__, METH_VARARGS, "C3___ne__(C3 self, C3 other) -> bool"},
+	 { "C3_rotatedY", _wrap_C3_rotatedY, METH_VARARGS, "C3_rotatedY(C3 self, double a) -> C3"},
+	 { "C3_rotatedZ", _wrap_C3_rotatedZ, METH_VARARGS, "C3_rotatedZ(C3 self, double a) -> C3"},
 	 { "delete_C3", _wrap_delete_C3, METH_O, "delete_C3(C3 self)"},
 	 { "C3_swigregister", C3_swigregister, METH_O, NULL},
 	 { "C3_swiginit", C3_swiginit, METH_VARARGS, NULL},
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index e18aea5bd8474b1a1f4e3ec29bad56336899ff54..a2c2412be3aa32443c04831e7c6278de6a71ed8c 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -1764,6 +1764,14 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainSample.R3___ne__(self, other)
 
+    def rotatedY(self, a):
+        r"""rotatedY(R3 self, double a) -> R3"""
+        return _libBornAgainSample.R3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(R3 self, double a) -> R3"""
+        return _libBornAgainSample.R3_rotatedZ(self, a)
+
     def __add__(self, rhs):
         r"""__add__(R3 self, R3 rhs) -> R3"""
         return _libBornAgainSample.R3___add__(self, rhs)
@@ -1853,6 +1861,10 @@ class C3(object):
         r"""unit(C3 self) -> C3"""
         return _libBornAgainSample.C3_unit(self)
 
+    def complex(self):
+        r"""complex(C3 self) -> C3"""
+        return _libBornAgainSample.C3_complex(self)
+
     def real(self):
         r"""real(C3 self) -> R3"""
         return _libBornAgainSample.C3_real(self)
@@ -1864,6 +1876,14 @@ class C3(object):
     def __ne__(self, other):
         r"""__ne__(C3 self, C3 other) -> bool"""
         return _libBornAgainSample.C3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(C3 self, double a) -> C3"""
+        return _libBornAgainSample.C3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(C3 self, double a) -> C3"""
+        return _libBornAgainSample.C3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainSample.delete_C3
 
 # Register C3 in _libBornAgainSample:
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index 2e84871a392358196e527dfeb8b96f6e5f3c98f3..a66af808aac88740a601102662a2b4e762a521fc 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -25460,6 +25460,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_R3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedY" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_R3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedZ" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_R3___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -26076,6 +26136,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  C3 result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_complex" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  result = ((Vec3< std::complex< double > > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new C3(static_cast< const C3& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_C3_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -26169,6 +26252,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedY" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_C3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedZ" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_C3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -60616,6 +60759,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
+	 { "R3_rotatedY", _wrap_R3_rotatedY, METH_VARARGS, "R3_rotatedY(R3 self, double a) -> R3"},
+	 { "R3_rotatedZ", _wrap_R3_rotatedZ, METH_VARARGS, "R3_rotatedZ(R3 self, double a) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},
 	 { "R3___rmul__", _wrap_R3___rmul__, METH_VARARGS, "R3___rmul__(R3 self, double c) -> R3"},
@@ -60641,9 +60786,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "C3_magxy2", _wrap_C3_magxy2, METH_O, "C3_magxy2(C3 self) -> double"},
 	 { "C3_magxy", _wrap_C3_magxy, METH_O, "C3_magxy(C3 self) -> double"},
 	 { "C3_unit", _wrap_C3_unit, METH_O, "C3_unit(C3 self) -> C3"},
+	 { "C3_complex", _wrap_C3_complex, METH_O, "C3_complex(C3 self) -> C3"},
 	 { "C3_real", _wrap_C3_real, METH_O, "C3_real(C3 self) -> R3"},
 	 { "C3___eq__", _wrap_C3___eq__, METH_VARARGS, "C3___eq__(C3 self, C3 other) -> bool"},
 	 { "C3___ne__", _wrap_C3___ne__, METH_VARARGS, "C3___ne__(C3 self, C3 other) -> bool"},
+	 { "C3_rotatedY", _wrap_C3_rotatedY, METH_VARARGS, "C3_rotatedY(C3 self, double a) -> C3"},
+	 { "C3_rotatedZ", _wrap_C3_rotatedZ, METH_VARARGS, "C3_rotatedZ(C3 self, double a) -> C3"},
 	 { "delete_C3", _wrap_delete_C3, METH_O, "delete_C3(C3 self)"},
 	 { "C3_swigregister", C3_swigregister, METH_O, NULL},
 	 { "C3_swiginit", C3_swiginit, METH_VARARGS, NULL},
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index e49fc85499249b66a2c755607d0057554ecca9eb..e48ac4517ee616242190a22efa24ca83ab3cb75c 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -1765,6 +1765,14 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainSim.R3___ne__(self, other)
 
+    def rotatedY(self, a):
+        r"""rotatedY(R3 self, double a) -> R3"""
+        return _libBornAgainSim.R3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(R3 self, double a) -> R3"""
+        return _libBornAgainSim.R3_rotatedZ(self, a)
+
     def __add__(self, rhs):
         r"""__add__(R3 self, R3 rhs) -> R3"""
         return _libBornAgainSim.R3___add__(self, rhs)
@@ -1854,6 +1862,10 @@ class C3(object):
         r"""unit(C3 self) -> C3"""
         return _libBornAgainSim.C3_unit(self)
 
+    def complex(self):
+        r"""complex(C3 self) -> C3"""
+        return _libBornAgainSim.C3_complex(self)
+
     def real(self):
         r"""real(C3 self) -> R3"""
         return _libBornAgainSim.C3_real(self)
@@ -1865,6 +1877,14 @@ class C3(object):
     def __ne__(self, other):
         r"""__ne__(C3 self, C3 other) -> bool"""
         return _libBornAgainSim.C3___ne__(self, other)
+
+    def rotatedY(self, a):
+        r"""rotatedY(C3 self, double a) -> C3"""
+        return _libBornAgainSim.C3_rotatedY(self, a)
+
+    def rotatedZ(self, a):
+        r"""rotatedZ(C3 self, double a) -> C3"""
+        return _libBornAgainSim.C3_rotatedZ(self, a)
     __swig_destroy__ = _libBornAgainSim.delete_C3
 
 # Register C3 in _libBornAgainSim:
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index b73ca3db8ac08a81e52fdfb3b3a1659a793659df..61e3521dde4d83907e4bdae13c16133b0563074e 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -24914,6 +24914,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_R3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedY" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_R3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< double > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "R3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_rotatedZ" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "R3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< double > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< double >(static_cast< const Vec3< double >& >(result))), SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_R3___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -25530,6 +25590,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  C3 result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_complex" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  result = ((Vec3< std::complex< double > > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new C3(static_cast< const C3& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_C3_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -25623,6 +25706,66 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_C3_rotatedY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedY", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedY" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedY(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_C3_rotatedZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Vec3< std::complex< double > > result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "C3_rotatedZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "C3_rotatedZ" "', argument " "1"" of type '" "Vec3< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< Vec3< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "C3_rotatedZ" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((Vec3< std::complex< double > > const *)arg1)->rotatedZ(arg2);
+  resultobj = SWIG_NewPointerObj((new Vec3< std::complex< double > >(static_cast< const Vec3< std::complex< double > >& >(result))), SWIGTYPE_p_Vec3T_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_C3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< std::complex< double > > *arg1 = (Vec3< std::complex< double > > *) 0 ;
@@ -41134,6 +41277,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
+	 { "R3_rotatedY", _wrap_R3_rotatedY, METH_VARARGS, "R3_rotatedY(R3 self, double a) -> R3"},
+	 { "R3_rotatedZ", _wrap_R3_rotatedZ, METH_VARARGS, "R3_rotatedZ(R3 self, double a) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},
 	 { "R3___rmul__", _wrap_R3___rmul__, METH_VARARGS, "R3___rmul__(R3 self, double c) -> R3"},
@@ -41159,9 +41304,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "C3_magxy2", _wrap_C3_magxy2, METH_O, "C3_magxy2(C3 self) -> double"},
 	 { "C3_magxy", _wrap_C3_magxy, METH_O, "C3_magxy(C3 self) -> double"},
 	 { "C3_unit", _wrap_C3_unit, METH_O, "C3_unit(C3 self) -> C3"},
+	 { "C3_complex", _wrap_C3_complex, METH_O, "C3_complex(C3 self) -> C3"},
 	 { "C3_real", _wrap_C3_real, METH_O, "C3_real(C3 self) -> R3"},
 	 { "C3___eq__", _wrap_C3___eq__, METH_VARARGS, "C3___eq__(C3 self, C3 other) -> bool"},
 	 { "C3___ne__", _wrap_C3___ne__, METH_VARARGS, "C3___ne__(C3 self, C3 other) -> bool"},
+	 { "C3_rotatedY", _wrap_C3_rotatedY, METH_VARARGS, "C3_rotatedY(C3 self, double a) -> C3"},
+	 { "C3_rotatedZ", _wrap_C3_rotatedZ, METH_VARARGS, "C3_rotatedZ(C3 self, double a) -> C3"},
 	 { "delete_C3", _wrap_delete_C3, METH_O, "delete_C3(C3 self)"},
 	 { "C3_swigregister", C3_swigregister, METH_O, NULL},
 	 { "C3_swiginit", C3_swiginit, METH_VARARGS, NULL},
diff --git a/cmake/BornAgain/SwigLib.cmake b/cmake/BornAgain/SwigLib.cmake
index 95cf787d619094115d7106321eb13b5b218c0f84..f505bc1c2924bd3b70ca8620d683c027548f1653 100644
--- a/cmake/BornAgain/SwigLib.cmake
+++ b/cmake/BornAgain/SwigLib.cmake
@@ -18,7 +18,6 @@ function(SwigLib name lib tmpdir)
             ${SWIG_DIR}/lib${lib}.i
             ${SWIG_DIR}/deprecation.i
             ${SWIG_DIR}/warnings.i
-            ${SWIG_DIR}/ignoreBase.i
             ${SWIG_DIR}/ignoreSample.i
             )
         foreach(FNAM ${swig_dependencies})