diff --git a/tests/api/__init__.py b/tests/api/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4
--- /dev/null
+++ b/tests/api/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python
diff --git a/tests/core/test_creation.py b/tests/api/test_creation.py
similarity index 100%
rename from tests/core/test_creation.py
rename to tests/api/test_creation.py
diff --git a/tests/integration/__init__.py b/tests/cli/__init__.py
similarity index 100%
rename from tests/integration/__init__.py
rename to tests/cli/__init__.py
diff --git a/tests/integration/test_integration.py b/tests/cli/test_integration.py
similarity index 100%
rename from tests/integration/test_integration.py
rename to tests/cli/test_integration.py
diff --git a/tests/common.py b/tests/common.py
index e4c3bf9220266ba2e5f95df45ea9336411cdb008..3c4ce5ffac3607a5ccb3d424866958db7338b42e 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -23,8 +23,17 @@ def flagAll(data, field, flags, **kwargs):
     return data, flags
 
 
+def dataDios(columns, start_date="2017-01-01", freq='1d', rows=10):
+    di = dios.DictOfSeries(itype=dios.DtItype)
+    dates = pd.date_range(start=start_date, end=None, freq=freq, periods=rows)
+    dummy = np.arange(len(dates))
+    for i, col in enumerate(columns):
+        di[col] = pd.Series(data=dummy * (i+1), index=dates)
+    return di
+
+
 def initData(
-    cols=2, start_date="2017-01-01", end_date="2017-12-31", freq=None, rows=None
+        cols=2, start_date="2017-01-01", end_date="2017-12-31", freq=None, rows=None
 ):
     if rows is None:
         freq = freq or "1h"
diff --git a/tests/core/test_core.py b/tests/core/test_core.py
index 297f211c15c6e2271b8a77e3a4d7a677fb6974aa..aad2edddcf0b35b1bc889f1ea68067b7e5030a72 100644
--- a/tests/core/test_core.py
+++ b/tests/core/test_core.py
@@ -13,13 +13,13 @@ import pandas as pd
 import saqc
 from saqc.core import initFlagsLike, SaQC, register
 from saqc.core.flags import Flags
-from saqc.core.register import processing
+from saqc.core.register import processing, flagging
+import copy
 
 from tests.common import initData, flagAll
 
 OPTIONAL = [False, True]
 
-
 register(mask=["field"], demask=["field"], squeeze=["field"])(flagAll)
 
 
@@ -40,22 +40,10 @@ def test_errorHandling(data):
         raise TypeError
 
     var1 = data.columns[0]
+    qc = SaQC(data)
 
     with pytest.raises(TypeError):
-        SaQC(data).raisingFunc(var1)
-
-
-def test_duplicatedVariable():
-    data = initData(1)
-    var1 = data.columns[0]
-
-    pflags = SaQC(data).flagDummy(var1).result.flags
-
-    if isinstance(pflags.columns, pd.MultiIndex):
-        cols = pflags.columns.get_level_values(0).drop_duplicates()
-        assert np.all(cols == [var1])
-    else:
-        assert (pflags.columns == [var1]).all()
+        qc.raisingFunc(var1)
 
 
 @pytest.mark.parametrize("optional", OPTIONAL)
@@ -191,3 +179,62 @@ def test_sourceTargetMulti():
         return data, flags
 
     SaQC(data, flags).flagMulti(field=fields, target=targets)
+
+
+def test_unknown_attribute():
+    qc = SaQC()
+    with pytest.raises(AttributeError):
+        qc._construct(_spam="eggs")
+
+
+def test_validation(data):
+    """Test if validation detects different columns in data and flags."""
+    df = pd.DataFrame(
+        data=np.arange(8).reshape(4, 2),
+        index=pd.date_range("2020", None, 4, "1d"),
+        columns=list("ab"),
+    )
+    qc = SaQC(df)
+
+    @flagging()
+    def flagFoo(data, field, flags, **kwargs):
+        data["spam"] = data[field]
+        return data, flags
+
+    with pytest.raises(RuntimeError):
+        qc.flagFoo("a")
+
+
+@pytest.mark.skip(reason="bug in register, see #GL 342")
+def test_validation_flags(data):
+    """Test if validation detects different columns in data and flags."""
+    df = pd.DataFrame(
+        data=np.arange(8).reshape(4, 2),
+        index=pd.date_range("2020", None, 4, "1d"),
+        columns=list("ab"),
+    )
+    qc = SaQC(df)
+
+    @flagging()
+    def flagFoo(data, field, flags, **kwargs):
+        flags["spam"] = flags[field]
+        return data, flags
+
+    with pytest.raises(RuntimeError):
+        qc.flagFoo("a")
+
+
+def test__copy__():
+    orig = SaQC()
+    orig.attrs["spam"] = []  # a higher object
+    shallow = copy.copy(orig)
+    assert shallow is not orig
+    assert shallow.attrs["spam"] is orig.attrs["spam"]
+
+
+def test__deepcopy__():
+    orig = SaQC()
+    orig.attrs["spam"] = []  # a higher object
+    shallow = copy.deepcopy(orig)
+    assert shallow is not orig
+    assert shallow.attrs["spam"] is not orig.attrs["spam"]
diff --git a/tests/core/test_register.py b/tests/core/test_register.py
new file mode 100644
index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4
--- /dev/null
+++ b/tests/core/test_register.py
@@ -0,0 +1 @@
+#!/usr/bin/env python
diff --git a/tests/deprecated/__init__.py b/tests/deprecated/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4
--- /dev/null
+++ b/tests/deprecated/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python
diff --git a/tests/deprecated/test_deprecated.py b/tests/deprecated/test_deprecated.py
new file mode 100644
index 0000000000000000000000000000000000000000..905a5ca6feb8afdc9acb32b9ad2a7468fa25ef38
--- /dev/null
+++ b/tests/deprecated/test_deprecated.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+import pytest
+from tests.common import initData
+from saqc import SaQC
+import pandas as pd
+import numpy as np
+
+
+# this tests seems to do nothing with duplicates
+@pytest.mark.parametrize("data", [initData(1)])
+def test_duplicatedVariable(data):
+    var1 = data.columns[0]
+
+    pflags = SaQC(data).flagDummy(var1).result.flags
+
+    if isinstance(pflags.columns, pd.MultiIndex):
+        cols = pflags.columns.get_level_values(0).drop_duplicates()
+        assert np.all(cols == [var1])
+    else:
+        assert (pflags.columns == [var1]).all()