diff --git a/core.py b/core.py
index 82e90c98ada07a7f1e0f55be899546058e2edb4f..d1a49056f801ea3506280019f64d0510653d0f8c 100644
--- a/core.py
+++ b/core.py
@@ -82,12 +82,12 @@ def runner(meta, flagger, data, flags=None, nodata=np.nan):
             # create a flag column if this is explicitly stated
             # or if a variable is checked but no corresponding
             # flag column exists
-            if (flag_params.get(FlagParams.ASSIGN) or
-                ((varname in data) and (varname not in flags))):
+            if flag_params.get(FlagParams.ASSIGN) or \
+                    (varname in data and varname not in flags):
                 dummy = pd.DataFrame(index=data.index, columns=[varname])
                 flags = flags.join(flagger.initFlags(dummy))
 
-            if varname not in data:
+            elif varname not in data and varname not in flags:
                 continue
 
             dchunk = data.loc[start_date:end_date]
diff --git a/dsl/evaluator.py b/dsl/evaluator.py
index 1f6dee7687e52d4a29bdc30dbee37a551cb26ae1..f91586190f43cacd88deb8a683ef5545e4678fb3 100644
--- a/dsl/evaluator.py
+++ b/dsl/evaluator.py
@@ -103,15 +103,41 @@ def evalExpression(expr: str, flagger: BaseFlagger,
                 # name is not referring to an DataFrame field
                 return field
 
-            try:
-                flagcol = namespace["flags"][field]
-                if namespace.get("target") == "flags":
-                    out = flagcol
-                else:
+            fidx = namespace["flags"].columns
+            if isinstance(fidx, pd.MultiIndex):
+                fcols = fidx.get_level_values(0).unique()
+            else:
+                fcols = fidx.values
+            dcols = namespace["data"].columns.values
+
+            if namespace.get("target") == "flags":
+                # We are forced to work on flags
+                if field in fcols:
+                    out = namespace["flags"][field]
+                elif field in dcols:
+                    # Up to now there are no flagging information on the requested
+                    # field, so return a fresh new unflagged vector
                     datacol = namespace["data"][field]
-                    out = np.ma.masked_array(datacol,
-                                             mask=flagger.isFlagged(flagcol))
-            except KeyError:
+                    dummy = pd.DataFrame(index=datacol.index, columns=[field])
+                    out = flagger.initFlags(dummy)
+                else:
+                    _raiseNameError(field, expr)
+
+            elif field in dcols and field in fcols:
+                # Return all unflagged (original) data
+                datacol = namespace["data"][field]
+                flagcol = namespace["flags"][field]
+                out = np.ma.masked_array(datacol, mask=flagger.isFlagged(flagcol))
+
+            elif field in dcols and field not in fcols:
+                # Return all data, because we have no flagging information
+                out = namespace["data"][field].values
+
+            elif field not in dcols and field in fcols:
+                # Return only flag information, because we have no data
+                out = namespace["flags"][field].values
+
+            else:
                 _raiseNameError(field, expr)
 
             return out
diff --git a/funcs/functions.py b/funcs/functions.py
index 94a65119db47de057a81b3d3c5f6a979cbf4135e..a2c872cc035ce262fa889d34a0aec3ff6e8970dd 100644
--- a/funcs/functions.py
+++ b/funcs/functions.py
@@ -29,6 +29,8 @@ def flagGeneric(data, flags, field, flagger, nodata=np.nan, **flag_params):
                             data, flags, field,
                             nodata=nodata)
 
+    result = result.squeeze()
+
     if np.isscalar(result):
         raise TypeError(f"expression '{expression}' does not return an array")