diff --git a/conftest.py b/conftest.py
index 78164d005760abacfac7f13ab7fab365f8f31c19..272f42303e620cd13fc7f26648bc03d437b1fda6 100644
--- a/conftest.py
+++ b/conftest.py
@@ -1,8 +1,8 @@
 import os
 import runpy
 import sys
-import warnings
 import tempfile
+import warnings
 
 import nbformat
 import pytest
@@ -34,7 +34,7 @@ def add_path_to_ignore(path):
 
 
 collect_ignore = [os.path.join(SCRIPT_FOLDER, "doc", "conf.py"),
-        os.path.join(SCRIPT_FOLDER, "pystencils", "opencl", "opencl.autoinit")]
+                  os.path.join(SCRIPT_FOLDER, "pystencils", "opencl", "opencl.autoinit")]
 add_path_to_ignore('pystencils_tests/benchmark')
 add_path_to_ignore('_local_tmp')
 
@@ -98,8 +98,6 @@ for root, sub_dirs, files in os.walk('.'):
             collect_ignore.append(f)
 
 
-
-
 class IPythonMockup:
     def run_line_magic(self, *args, **kwargs):
         pass
diff --git a/pystencils/__init__.py b/pystencils/__init__.py
index ed08ff1327c68a1a116edb21547a86f8b27a8c81..18679382f0014ba12844c72fa965a3ad4fe6e196 100644
--- a/pystencils/__init__.py
+++ b/pystencils/__init__.py
@@ -5,7 +5,7 @@ from . import stencil as stencil
 from .assignment import Assignment, assignment_from_stencil
 from .data_types import TypedSymbol
 from .datahandling import create_data_handling
-from .display_utils import show_code, to_dot
+from .display_utils import show_code, get_code_obj, get_code_str, to_dot
 from .field import Field, FieldType, fields
 from .kernel_decorator import kernel
 from .kernelcreation import create_indexed_kernel, create_kernel, create_staggered_kernel
@@ -25,7 +25,7 @@ __all__ = ['Field', 'FieldType', 'fields',
            'TypedSymbol',
            'make_slice',
            'create_kernel', 'create_indexed_kernel', 'create_staggered_kernel',
-           'show_code', 'to_dot',
+           'show_code', 'to_dot', 'get_code_obj', 'get_code_str',
            'AssignmentCollection',
            'Assignment',
            'assignment_from_stencil',
diff --git a/pystencils/assignment.py b/pystencils/assignment.py
index 0bf68799491be29886d215d5ff76010c034bd174..92027f7773d2202765ab2ef09c5269654098060e 100644
--- a/pystencils/assignment.py
+++ b/pystencils/assignment.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 import numpy as np
 import sympy as sp
 from sympy.printing.latex import LatexPrinter
@@ -24,9 +23,20 @@ def assignment_str(assignment):
 
 if Assignment:
 
+    _old_new = sp.codegen.ast.Assignment.__new__
+
+    def _Assignment__new__(cls, lhs, rhs, *args, **kwargs):
+        if isinstance(lhs, (list, tuple, sp.Matrix)) and isinstance(rhs, (list, tuple, sp.Matrix)):
+            assert len(lhs) == len(rhs), f'{lhs} and {rhs} must have same length when performing vector assignment!'
+            return tuple(_old_new(cls, a, b, *args, **kwargs) for a, b in zip(lhs, rhs))
+        return _old_new(cls, lhs, rhs, *args, **kwargs)
+
     Assignment.__str__ = assignment_str
+    Assignment.__new__ = _Assignment__new__
     LatexPrinter._print_Assignment = print_assignment_latex
 
+    sp.MutableDenseMatrix.__hash__ = lambda self: hash(tuple(self))
+
 else:
     # back port for older sympy versions that don't have Assignment  yet
 
diff --git a/pystencils/display_utils.py b/pystencils/display_utils.py
index 610c404b709885e7445eba3be412f6811fca0241..0bdad7ac16ba6c600cd66e5c82721c8ac46bb0dd 100644
--- a/pystencils/display_utils.py
+++ b/pystencils/display_utils.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Optional
+from typing import Any, Dict, Optional, Union
 
 import sympy as sp
 
@@ -35,10 +35,10 @@ def highlight_cpp(code: str):
     return HTML(highlight(code, CppLexer(), HtmlFormatter()))
 
 
-def show_code(ast: KernelFunction, custom_backend=None):
+def get_code_obj(ast: Union[KernelFunction, KernelWrapper], custom_backend=None):
     """Returns an object to display generated code (C/C++ or CUDA)
 
-    Can either  be displayed as HTML in Jupyter notebooks or printed as normal string.
+    Can either be displayed as HTML in Jupyter notebooks or printed as normal string.
     """
     from pystencils.backends.cbackend import generate_c
 
@@ -65,3 +65,17 @@ def show_code(ast: KernelFunction, custom_backend=None):
         def __repr__(self):
             return generate_c(self.ast, dialect=dialect, custom_backend=custom_backend)
     return CodeDisplay(ast)
+
+
+def get_code_str(ast, custom_backend=None):
+    return str(get_code_obj(ast, custom_backend))
+
+
+def show_code(ast: Union[KernelFunction, KernelWrapper], custom_backend=None):
+    code = get_code_obj(ast, custom_backend)
+
+    try:
+        from IPython.display import display
+        display(code)
+    except Exception:
+        print(code)
diff --git a/pystencils/kernel_wrapper.py b/pystencils/kernel_wrapper.py
index 0e327711e5a355219cc2664ac9a6c8a02d88bc09..b76ec4e3d79c1b345c9f0a8b2bd8a97b59866b8d 100644
--- a/pystencils/kernel_wrapper.py
+++ b/pystencils/kernel_wrapper.py
@@ -1,11 +1,14 @@
-"""
-Light-weight wrapper around a compiled kernel
-"""
 import pystencils
 
 
 class KernelWrapper:
-    def __init__(self, kernel, parameters, ast_node):
+    """
+    Light-weight wrapper around a compiled kernel.
+
+    Can be called while still providing access to underlying AST.
+    """
+
+    def __init__(self, kernel, parameters, ast_node: pystencils.astnodes.KernelFunction):
         self.kernel = kernel
         self.parameters = parameters
         self.ast = ast_node
@@ -16,4 +19,4 @@ class KernelWrapper:
 
     @property
     def code(self):
-        return str(pystencils.show_code(self.ast))
+        return pystencils.get_code_str(self.ast)
diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py
index 3a8bb2bd3b315e23fb9e11ef6385f264428c7bd5..22968eb72361b15dd24a0ebc72fd284ddeddd2b7 100644
--- a/pystencils/simp/assignment_collection.py
+++ b/pystencils/simp/assignment_collection.py
@@ -1,3 +1,4 @@
+import itertools
 from copy import copy
 from typing import Any, Dict, Iterable, Iterator, List, Optional, Sequence, Set, Union
 
@@ -43,6 +44,11 @@ class AssignmentCollection:
             subexpressions = [Assignment(k, v)
                               for k, v in subexpressions.items()]
 
+        main_assignments = list(itertools.chain.from_iterable(
+            [(a if isinstance(a, Iterable) else [a]) for a in main_assignments]))
+        subexpressions = list(itertools.chain.from_iterable(
+            [(a if isinstance(a, Iterable) else [a]) for a in subexpressions]))
+
         self.main_assignments = main_assignments
         self.subexpressions = subexpressions
 
diff --git a/pystencils/test_type_interference.py b/pystencils/test_type_interference.py
index 0daa6f9d2a36948184d537809457b4aaf8001d29..953b87742304b2d629a1bd564fc23e0982d4f6d9 100644
--- a/pystencils/test_type_interference.py
+++ b/pystencils/test_type_interference.py
@@ -18,8 +18,7 @@ def test_type_interference():
 
     ast = pystencils.create_kernel(assignments)
 
-    code = str(pystencils.show_code(ast))
-    print(code)
+    code = str(pystencils.get_code_str(ast))
     assert 'double a' in code
     assert 'uint16_t b' in code
     assert 'uint16_t f' in code
diff --git a/pystencils_tests/test_address_of.py b/pystencils_tests/test_address_of.py
index b4c46c1c6045520e30826fe84ac91ae76339ad1b..717f6e43720a4ddddfca8c7a3fce3ff9e15982ff 100644
--- a/pystencils_tests/test_address_of.py
+++ b/pystencils_tests/test_address_of.py
@@ -17,16 +17,14 @@ def test_address_of():
     }, {})
 
     ast = pystencils.create_kernel(assignments)
-    code = pystencils.show_code(ast)
-    print(code)
+    pystencils.show_code(ast)
 
     assignments = pystencils.AssignmentCollection({
         y[0, 0]: cast_func(address_of(x[0, 0]), create_type('int64'))
     }, {})
 
     ast = pystencils.create_kernel(assignments)
-    code = pystencils.show_code(ast)
-    print(code)
+    pystencils.show_code(ast)
 
 
 def test_address_of_with_cse():
@@ -39,9 +37,8 @@ def test_address_of_with_cse():
     }, {})
 
     ast = pystencils.create_kernel(assignments)
-    code = pystencils.show_code(ast)
+    pystencils.show_code(ast)
     assignments_cse = sympy_cse(assignments)
 
     ast = pystencils.create_kernel(assignments_cse)
-    code = pystencils.show_code(ast)
-    print(code)
+    pystencils.show_code(ast)
diff --git a/pystencils_tests/test_assignment_collection.py b/pystencils_tests/test_assignment_collection.py
index 42e3791ab331cc111343bfe410bc59e3f52ba80b..a16d51db44bb722ee1a9da9a20ad4192d4f6188e 100644
--- a/pystencils_tests/test_assignment_collection.py
+++ b/pystencils_tests/test_assignment_collection.py
@@ -1,3 +1,4 @@
+import pytest
 import sympy as sp
 
 from pystencils import Assignment, AssignmentCollection
@@ -40,3 +41,39 @@ def test_free_and_defined_symbols():
 
     print(ac)
     print(ac.__repr__)
+
+
+def test_vector_assignments():
+    """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)"""
+
+    import pystencils as ps
+    import sympy as sp
+    a, b, c = sp.symbols("a b c")
+    assignments = ps.Assignment(sp.Matrix([a,b,c]), sp.Matrix([1,2,3]))
+    print(assignments)
+
+
+def test_wrong_vector_assignments():
+    """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)"""
+
+    import pystencils as ps
+    import sympy as sp
+    a, b = sp.symbols("a b")
+    
+    with pytest.raises(AssertionError,
+            match=r'Matrix(.*) and Matrix(.*) must have same length when performing vector assignment!'):
+        ps.Assignment(sp.Matrix([a,b]), sp.Matrix([1,2,3]))
+
+
+def test_vector_assignment_collection():
+    """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)"""
+
+    import pystencils as ps
+    import sympy as sp
+    a, b, c = sp.symbols("a b c")
+    y, x = sp.Matrix([a,b,c]), sp.Matrix([1,2,3])
+    assignments = ps.AssignmentCollection({y: x})
+    print(assignments)
+
+    assignments = ps.AssignmentCollection([ps.Assignment(y,x)])
+    print(assignments)
diff --git a/pystencils_tests/test_complex_numbers.py b/pystencils_tests/test_complex_numbers.py
index b1c0569d05e73a786a780d7f4826eedf8d71b533..41dc76a40411129c4ee68f0ee42028b57875d71e 100644
--- a/pystencils_tests/test_complex_numbers.py
+++ b/pystencils_tests/test_complex_numbers.py
@@ -52,7 +52,7 @@ def test_complex_numbers(assignment, scalar_dtypes, target):
     ast = pystencils.create_kernel(assignment,
                                    target=target,
                                    data_type=scalar_dtypes)
-    code = str(pystencils.show_code(ast))
+    code = pystencils.get_code_str(ast)
 
     print(code)
     assert "Not supported" not in code
@@ -98,7 +98,7 @@ def test_complex_numbers_64(assignment, target):
     ast = pystencils.create_kernel(assignment,
                                    target=target,
                                    data_type='double')
-    code = str(pystencils.show_code(ast))
+    code = pystencils.get_code_str(ast)
 
     print(code)
     assert "Not supported" not in code
diff --git a/pystencils_tests/test_conditional_field_access.py b/pystencils_tests/test_conditional_field_access.py
index f68b34679ae5de0996a09a30921c85ec49bece58..a4bd53228476ea49f977e08f71acfd1d596231fe 100644
--- a/pystencils_tests/test_conditional_field_access.py
+++ b/pystencils_tests/test_conditional_field_access.py
@@ -63,7 +63,7 @@ def test_boundary_check(with_cse):
 
     print(assignments)
     kernel_checked = ps.create_kernel(assignments, ghost_layers=0).compile()
-    print(ps.show_code(kernel_checked))
+    ps.show_code(kernel_checked)
 
     # No SEGFAULT, please!!
     kernel_checked(f=f_arr, g=g_arr)
diff --git a/pystencils_tests/test_cuda_known_functions.py b/pystencils_tests/test_cuda_known_functions.py
index 99810a55af73907b686f342a8dba1f2053cbabe7..dcdabeaef6934e06b289351127b168d77d803be9 100644
--- a/pystencils_tests/test_cuda_known_functions.py
+++ b/pystencils_tests/test_cuda_known_functions.py
@@ -20,8 +20,8 @@ def test_cuda_known_functions():
     })
 
     ast = pystencils.create_kernel(assignments, 'gpu')
-    print(pystencils.show_code(ast))
     pytest.importorskip('pycuda')
+    pystencils.show_code(ast)
     kernel = ast.compile()
     assert(kernel is not None)
 
@@ -35,7 +35,7 @@ def test_cuda_but_not_c():
     })
 
     ast = pystencils.create_kernel(assignments, 'cpu')
-    print(pystencils.show_code(ast))
+    pystencils.show_code(ast)
 
 
 def test_cuda_unknown():
@@ -46,5 +46,4 @@ def test_cuda_unknown():
     })
 
     ast = pystencils.create_kernel(assignments, 'gpu')
-    code = str(pystencils.show_code(ast))
-    print(code)
+    pystencils.show_code(ast)
diff --git a/pystencils_tests/test_custom_backends.py b/pystencils_tests/test_custom_backends.py
index 692f78894e253cb22292555389d9f9c21a5e5ade..6500076ce278bff4fc2a81f65c55553bd9523d78 100644
--- a/pystencils_tests/test_custom_backends.py
+++ b/pystencils_tests/test_custom_backends.py
@@ -3,6 +3,7 @@ from subprocess import CalledProcessError
 import pytest
 import sympy
 
+import pycuda.driver
 import pystencils
 import pystencils.cpu.cpujit
 import pystencils.gpucuda.cudajit
@@ -31,7 +32,7 @@ def test_custom_backends_cpu():
         z[0, 0], x[0, 0] * sympy.log(x[0, 0] * y[0, 0]))], [])
 
     ast = pystencils.create_kernel(normal_assignments, target='cpu')
-    print(pystencils.show_code(ast, ScreamingBackend()))
+    pystencils.show_code(ast, ScreamingBackend())
     with pytest.raises(CalledProcessError):
         pystencils.cpu.cpujit.make_python_function(ast, custom_backend=ScreamingBackend())
 
@@ -46,6 +47,6 @@ def test_custom_backends_gpu():
         z[0, 0], x[0, 0] * sympy.log(x[0, 0] * y[0, 0]))], [])
 
     ast = pystencils.create_kernel(normal_assignments, target='gpu')
-    print(pystencils.show_code(ast, ScreamingGpuBackend()))
+    pystencils.show_code(ast, ScreamingGpuBackend())
     with pytest.raises(pycuda.driver.CompileError):
         pystencils.gpucuda.cudajit.make_python_function(ast, custom_backend=ScreamingGpuBackend())
diff --git a/pystencils_tests/test_fast_approximation.py b/pystencils_tests/test_fast_approximation.py
index 76bef174eb7451234dcf347818fdb2d456ce7005..6c9539f64ee2a911123a8fd9f10845a3c67dcbea 100644
--- a/pystencils_tests/test_fast_approximation.py
+++ b/pystencils_tests/test_fast_approximation.py
@@ -12,7 +12,7 @@ def test_fast_sqrt():
     assert len(insert_fast_sqrts(expr).atoms(fast_sqrt)) == 1
     assert len(insert_fast_sqrts([expr])[0].atoms(fast_sqrt)) == 1
     ast = ps.create_kernel(ps.Assignment(g[0, 0], insert_fast_sqrts(expr)), target='gpu')
-    code_str = str(ps.show_code(ast))
+    code_str = ps.get_code_str(ast)
     assert '__fsqrt_rn' in code_str
 
     expr = ps.Assignment(sp.Symbol("tmp"), 3 / sp.sqrt(f[0, 0] + f[1, 0]))
@@ -21,7 +21,7 @@ def test_fast_sqrt():
     ac = ps.AssignmentCollection([expr], [])
     assert len(insert_fast_sqrts(ac).main_assignments[0].atoms(fast_inv_sqrt)) == 1
     ast = ps.create_kernel(insert_fast_sqrts(ac), target='gpu')
-    code_str = str(ps.show_code(ast))
+    code_str = ps.get_code_str(ast)
     assert '__frsqrt_rn' in code_str
 
 
@@ -34,5 +34,5 @@ def test_fast_divisions():
     assert len(insert_fast_divisions(expr).atoms(fast_division)) == 1
 
     ast = ps.create_kernel(ps.Assignment(g[0, 0], insert_fast_divisions(expr)), target='gpu')
-    code_str = str(ps.show_code(ast))
+    code_str = ps.get_code_str(ast)
     assert '__fdividef' in code_str
diff --git a/pystencils_tests/test_interpolation.py b/pystencils_tests/test_interpolation.py
index 477765bb31289dbfdc48927e3cc55f10d49f16a0..d53b24032d8c8ee5f3a5b862b95cad5311ba5aca 100644
--- a/pystencils_tests/test_interpolation.py
+++ b/pystencils_tests/test_interpolation.py
@@ -49,7 +49,7 @@ def test_interpolation():
     print(assignments)
     ast = pystencils.create_kernel(assignments)
     print(ast)
-    print(pystencils.show_code(ast))
+    pystencils.show_code(ast)
     kernel = ast.compile()
 
     pyconrad.imshow(lenna)
@@ -69,7 +69,7 @@ def test_scale_interpolation():
         print(assignments)
         ast = pystencils.create_kernel(assignments)
         print(ast)
-        print(pystencils.show_code(ast))
+        pystencils.show_code(ast)
         kernel = ast.compile()
 
         out = np.zeros_like(lenna)
@@ -81,9 +81,9 @@ def test_scale_interpolation():
                          ['border',
                           'clamp',
                           pytest.param('warp', marks=pytest.mark.xfail(
-                              reason="requires interpolation-refactoring branch")),
+                              reason="Fails on newer SymPy version due to complex conjugate()")),
                           pytest.param('mirror', marks=pytest.mark.xfail(
-                              reason="requires interpolation-refactoring branch")),
+                              reason="Fails on newer SymPy version due to complex conjugate()")),
                           ])
 def test_rotate_interpolation(address_mode):
     """
@@ -100,7 +100,7 @@ def test_rotate_interpolation(address_mode):
     print(assignments)
     ast = pystencils.create_kernel(assignments)
     print(ast)
-    print(pystencils.show_code(ast))
+    pystencils.show_code(ast)
     kernel = ast.compile()
 
     out = np.zeros_like(lenna)
@@ -108,90 +108,93 @@ def test_rotate_interpolation(address_mode):
     pyconrad.imshow(out, "out " + address_mode)
 
 
-@pytest.mark.parametrize('dtype', (np.int32, np.float32, np.float64))
-@pytest.mark.parametrize('address_mode', ('border', 'wrap', 'clamp', 'mirror'))
-@pytest.mark.parametrize('use_textures', ('use_textures', False))
-def test_rotate_interpolation_gpu(dtype, address_mode, use_textures):
+@pytest.mark.parametrize('address_mode', ['border', 'wrap', 'clamp', 'mirror'])
+def test_rotate_interpolation_gpu(address_mode):
     pytest.importorskip('pycuda')
-
+    import pycuda.autoinit  # NOQA
     import pycuda.gpuarray as gpuarray
-    import pycuda.autoinit  # noqa
+
     rotation_angle = sympy.pi / 5
     scale = 1
 
-    if dtype == np.int32:
-        lenna_gpu = gpuarray.to_gpu(
-            np.ascontiguousarray(lenna * 255, dtype))
-    else:
-        lenna_gpu = gpuarray.to_gpu(
-            np.ascontiguousarray(lenna, dtype))
-    x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0)
-
-    transformed = scale * \
-        sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) - sympy.Matrix([2, 2])
-    assignments = pystencils.AssignmentCollection({
-        y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed)
-    })
-    print(assignments)
-    ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures)
-    print(ast)
-    print(pystencils.show_code(ast))
-    kernel = ast.compile()
-
-    out = gpuarray.zeros_like(lenna_gpu)
-    kernel(x=lenna_gpu, y=out)
-    pyconrad.imshow(out,
-                    f"out {address_mode} texture:{use_textures} {type_map[dtype]}")
-
-
-@pytest.mark.parametrize('address_mode', ['border', 'wrap',
-                                          pytest.param('warp', marks=pytest.mark.xfail(
-                                              reason="% printed as fmod on old sympy")),
-                                          pytest.param('mirror', marks=pytest.mark.xfail(
-                                              reason="% printed as fmod on old sympy")),
-                                          ])
-@pytest.mark.parametrize('dtype', [np.float64, np.float32, np.int32])
-@pytest.mark.parametrize('use_textures', ('use_textures', False,))
-def test_shift_interpolation_gpu(address_mode, dtype, use_textures):
-    sver = sympy.__version__.split(".")
-    if (int(sver[0]) == 1 and int(sver[1]) < 2) and address_mode in ['mirror', 'warp']:
-        pytest.skip()
+    previous_result = None
+    for dtype in [np.int32, np.float32, np.float64]:
+        if dtype == np.int32:
+            lenna_gpu = gpuarray.to_gpu(
+                np.ascontiguousarray(lenna * 255, dtype))
+        else:
+            lenna_gpu = gpuarray.to_gpu(
+                np.ascontiguousarray(lenna, dtype))
+        for use_textures in [True, False]:
+            x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0)
+
+            transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * \
+                sympy.Matrix((x_, y_)) - sympy.Matrix([2, 2])
+            assignments = pystencils.AssignmentCollection({
+                y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed)
+            })
+            print(assignments)
+            ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures)
+            print(ast)
+            pystencils.show_code(ast)
+            kernel = ast.compile()
+
+            out = gpuarray.zeros_like(lenna_gpu)
+            kernel(x=lenna_gpu, y=out)
+            pyconrad.imshow(out,
+                            f"out {address_mode} texture:{use_textures} {type_map[dtype]}")
+            skimage.io.imsave(f"/tmp/out {address_mode} texture:{use_textures} {type_map[dtype]}.tif",
+                              np.ascontiguousarray(out.get(), np.float32))
+            if previous_result is not None:
+                try:
+                    assert np.allclose(previous_result[4:-4, 4:-4], out.get()[4:-4, 4:-4], rtol=100, atol=1e-3)
+                except AssertionError:  # NOQA
+                    print("Max error: %f" % np.max(previous_result - out.get()))
+                    # pyconrad.imshow(previous_result - out.get(), "Difference image")
+                    # raise e
+            previous_result = out.get()
+
+
+@pytest.mark.parametrize('address_mode', ['border', 'wrap', 'clamp', 'mirror'])
+def test_shift_interpolation_gpu(address_mode):
     pytest.importorskip('pycuda')
-
+    import pycuda.autoinit  # NOQA
     import pycuda.gpuarray as gpuarray
-    import pycuda.autoinit  # noqa
 
     rotation_angle = 0  # sympy.pi / 5
     scale = 1
     # shift = - sympy.Matrix([1.5, 1.5])
     shift = sympy.Matrix((0.0, 0.0))
 
-    if dtype == np.int32:
-        lenna_gpu = gpuarray.to_gpu(
-            np.ascontiguousarray(lenna * 255, dtype))
-    else:
-        lenna_gpu = gpuarray.to_gpu(
-            np.ascontiguousarray(lenna, dtype))
-
-    x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0)
-
-    if use_textures:
-        transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift
-    else:
-        transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift
-    assignments = pystencils.AssignmentCollection({
-        y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed)
-    })
-    # print(assignments)
-    ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures)
-    # print(ast)
-    print(pystencils.show_code(ast))
-    kernel = ast.compile()
-
-    out = gpuarray.zeros_like(lenna_gpu)
-    kernel(x=lenna_gpu, y=out)
-    pyconrad.imshow(out,
-                    f"out {address_mode} texture:{use_textures} {type_map[dtype]}")
+    for dtype in [np.float64, np.float32, np.int32]:
+        if dtype == np.int32:
+            lenna_gpu = gpuarray.to_gpu(
+                np.ascontiguousarray(lenna * 255, dtype))
+        else:
+            lenna_gpu = gpuarray.to_gpu(
+                np.ascontiguousarray(lenna, dtype))
+        for use_textures in [True, False]:
+            x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0)
+
+            if use_textures:
+                transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift
+            else:
+                transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift
+            assignments = pystencils.AssignmentCollection({
+                y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed)
+            })
+            # print(assignments)
+            ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures)
+            # print(ast)
+            pystencils.show_code(ast)
+            kernel = ast.compile()
+
+            out = gpuarray.zeros_like(lenna_gpu)
+            kernel(x=lenna_gpu, y=out)
+            pyconrad.imshow(out,
+                            f"out {address_mode} texture:{use_textures} {type_map[dtype]}")
+            skimage.io.imsave(f"/tmp/out {address_mode} texture:{use_textures} {type_map[dtype]}.tif",
+                              np.ascontiguousarray(out.get(), np.float32))
 
 
 @pytest.mark.parametrize('address_mode', ['border', 'clamp'])
@@ -210,7 +213,7 @@ def test_rotate_interpolation_size_change(address_mode):
     print(assignments)
     ast = pystencils.create_kernel(assignments)
     print(ast)
-    print(pystencils.show_code(ast))
+    pystencils.show_code(ast)
     kernel = ast.compile()
 
     out = np.zeros((100, 150), np.float64)
@@ -219,7 +222,7 @@ def test_rotate_interpolation_size_change(address_mode):
 
 
 @pytest.mark.parametrize('address_mode, target',
-                         itertools.product(['border', 'wrap', 'clamp', 'mirror'], ['cpu']))
+                         itertools.product(['border', 'wrap', 'clamp', 'mirror'], ['cpu', 'gpu']))
 def test_field_interpolated(address_mode, target):
     x_f, y_f = pystencils.fields('x,y: float64 [2d]')
 
@@ -227,19 +230,13 @@ def test_field_interpolated(address_mode, target):
         y_f.center(): x_f.interpolated_access([0.5 * x_ + 2.7, 0.25 * y_ + 7.2], address_mode=address_mode)
     })
     print(assignments)
-    ast = pystencils.create_kernel(assignments, target=target)
+    ast = pystencils.create_kernel(assignments)
     print(ast)
-    print(pystencils.show_code(ast))
+    pystencils.show_code(ast)
     kernel = ast.compile()
 
     out = np.zeros_like(lenna)
     kernel(x=lenna, y=out)
     pyconrad.imshow(out, "out " + address_mode)
-
-
-def test_spatial_derivative():
-    x, y = pystencils.fields('x, y:  float32[2d]')
-    tx, ty = pystencils.fields('t_x, t_y: float32[2d]')
-
-    diff = sympy.diff(x.interpolated_access((tx.center, ty.center)), tx.center)
-    print("diff: " + str(diff))
+    kernel(x=lenna, y=out)
+    pyconrad.imshow(out, "out " + address_mode)
diff --git a/pystencils_tests/test_jacobi_cbackend.py b/pystencils_tests/test_jacobi_cbackend.py
index 9206aeedaf4bb035444f9280cf58968c9ca385c9..6d86ecb05f920f7a6c54b018ea5dd3508172b727 100644
--- a/pystencils_tests/test_jacobi_cbackend.py
+++ b/pystencils_tests/test_jacobi_cbackend.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-from pystencils import show_code
+from pystencils import get_code_obj
 from pystencils.astnodes import Block, KernelFunction, SympyAssignment
 from pystencils.cpu import make_python_function
 from pystencils.field import Field
@@ -36,7 +36,7 @@ def test_jacobi_fixed_field_size():
     error = np.sum(np.abs(dst_field_py - dst_field_c))
     np.testing.assert_allclose(error, 0.0, atol=1e-13)
 
-    code_display = show_code(ast_node)
+    code_display = get_code_obj(ast_node)
     assert 'for' in str(code_display)
     assert 'for' in code_display._repr_html_()
 
diff --git a/pystencils_tests/test_jacobi_llvm.py b/pystencils_tests/test_jacobi_llvm.py
index 13b22aa4b0235bb98b4789e3b9266bf672985111..95bd52d2edd706fc3e8b6c595c7ad9855ae5e4f6 100644
--- a/pystencils_tests/test_jacobi_llvm.py
+++ b/pystencils_tests/test_jacobi_llvm.py
@@ -52,7 +52,7 @@ def test_jacobi_fixed_field_size_gpu():
 
     jacobi = Assignment(d[0, 0], (f[1, 0] + f[-1, 0] + f[0, 1] + f[0, -1]) / 4)
     ast = create_kernel([jacobi], target='gpu')
-    print(show_code(ast))
+    show_code(ast)
 
     for x in range(1, size[0] - 1):
         for y in range(1, size[1] - 1):
diff --git a/pystencils_tests/test_opencl.py b/pystencils_tests/test_opencl.py
index af13c51c168cb826ee6499f0d0d09db10a388e4c..830cf60633e4fc651257201379d42a2a630c334d 100644
--- a/pystencils_tests/test_opencl.py
+++ b/pystencils_tests/test_opencl.py
@@ -27,10 +27,9 @@ def test_print_opencl():
 
     print(ast)
 
-    code = pystencils.show_code(ast, custom_backend=CudaBackend())
-    print(code)
+    pystencils.show_code(ast, custom_backend=CudaBackend())
 
-    opencl_code = pystencils.show_code(ast, custom_backend=OpenClBackend())
+    opencl_code = pystencils.get_code_str(ast, custom_backend=OpenClBackend())
     print(opencl_code)
 
     assert "__global double * RESTRICT const _data_x" in str(opencl_code)
@@ -108,10 +107,9 @@ def test_opencl_jit():
 
     print(ast)
 
-    code = pystencils.show_code(ast, custom_backend=CudaBackend())
-    print(code)
-    opencl_code = pystencils.show_code(ast, custom_backend=OpenClBackend())
-    print(opencl_code)
+    pystencils.show_code(ast, custom_backend=CudaBackend())
+
+    pystencils.show_code(ast, custom_backend=OpenClBackend())
 
     cuda_kernel = ast.compile()
     assert cuda_kernel is not None
diff --git a/pystencils_tests/test_source_code_comment.py b/pystencils_tests/test_source_code_comment.py
index 6cc66feb6f7f92174029e274feee22dfc4455b8d..16e6e5a9647843db4483b951aa631b591240dac5 100644
--- a/pystencils_tests/test_source_code_comment.py
+++ b/pystencils_tests/test_source_code_comment.py
@@ -27,4 +27,5 @@ def test_source_code_comment():
     print(ast)
     compiled = ast.compile()
     assert compiled is not None
-    print(pystencils.show_code(ast))
+
+    pystencils.show_code(ast)
diff --git a/pystencils_tests/test_sum_prod.py b/pystencils_tests/test_sum_prod.py
index 4fa5c0618612b013edda4d164dd035dafdd2438a..4b4cd7131ad4b860c754865cd35f3960399e9b5a 100644
--- a/pystencils_tests/test_sum_prod.py
+++ b/pystencils_tests/test_sum_prod.py
@@ -30,7 +30,7 @@ def test_sum():
     })
 
     ast = pystencils.create_kernel(assignments)
-    code = str(pystencils.show_code(ast))
+    code = str(pystencils.get_code_obj(ast))
     kernel = ast.compile()
 
     print(code)
@@ -58,11 +58,11 @@ def test_sum_use_float():
     })
 
     ast = pystencils.create_kernel(assignments, data_type=create_type('float32'))
-    code = str(pystencils.show_code(ast))
+    code = str(pystencils.get_code_obj(ast))
     kernel = ast.compile()
 
     print(code)
-    print(pystencils.show_code(ast))
+    print(pystencils.get_code_obj(ast))
     assert 'float sum' in code
 
     array = np.zeros((10,), np.float32)
@@ -89,7 +89,7 @@ def test_product():
     })
 
     ast = pystencils.create_kernel(assignments)
-    code = str(pystencils.show_code(ast))
+    code = pystencils.get_code_str(ast)
     kernel = ast.compile()
 
     print(code)
@@ -120,11 +120,9 @@ def test_prod_var_limit():
     })
 
     ast = pystencils.create_kernel(assignments)
-    code = str(pystencils.show_code(ast))
+    pystencils.show_code(ast)
     kernel = ast.compile()
 
-    print(code)
-
     array = np.zeros((10,), np.int64)
 
     kernel(x=array, limit=100)
diff --git a/pystencils_tests/test_sympy_optimizations.py b/pystencils_tests/test_sympy_optimizations.py
index 745b936ea7d0e3ce5da6c684dee42c56c09dd835..0899d5b10cd87ff1e6acc630c8c88ea865005be5 100644
--- a/pystencils_tests/test_sympy_optimizations.py
+++ b/pystencils_tests/test_sympy_optimizations.py
@@ -18,7 +18,7 @@ def test_sympy_optimizations():
         assignments = optimize_assignments(assignments, optims_pystencils_cpu)
 
         ast = pystencils.create_kernel(assignments, target=target)
-        code = str(pystencils.show_code(ast))
+        code = pystencils.get_code_str(ast)
         assert 'expm1(' in code
 
 
@@ -35,7 +35,7 @@ def test_evaluate_constant_terms():
         assignments = optimize_assignments(assignments, optims_pystencils_cpu)
 
         ast = pystencils.create_kernel(assignments, target=target)
-        code = str(pystencils.show_code(ast))
+        code = pystencils.get_code_str(ast)
         assert 'cos(' not in code
         print(code)
 
@@ -55,6 +55,6 @@ def test_do_not_evaluate_constant_terms():
         optimize_assignments(assignments, optimizations)
 
         ast = pystencils.create_kernel(assignments, target=target)
-        code = str(pystencils.show_code(ast))
+        code = pystencils.get_code_str(ast)
         assert 'cos(' in code
         print(code)