diff --git a/parser/parser-siesta/check.sh b/parser/parser-siesta/check.sh
index d98ff510ab81ea05fd59c63004a074a116ef3895..866138698f44116fe1891777a2645056e698bb19 100755
--- a/parser/parser-siesta/check.sh
+++ b/parser/parser-siesta/check.sh
@@ -1,9 +1,9 @@
 #!/bin/bash
 
-python main.py test/H2O/out --annotate > test/H2O/json 2>&1
-python main.py test/H2O-relax/out --annotate > test/H2O-relax/json 2>&1
-python main.py test/Al-bulk/out --annotate > test/Al-bulk/json 2>&1
-python main.py test/Al-slab/out --annotate > test/Al-slab/json 2>&1
-python main.py test/MgO/out --annotate > test/MgO/json 2>&1
-python main.py test/smeagol-Au-leads/Au.out --annotate > test/smeagol-Au-leads/json 2>&1
-python main.py test/smeagol-Au-scregion/Au.out --annotate > test/smeagol-Au-scregion/json 2>&1
+python main.py test/H2O/out --annotate 2>&1 | tee test/H2O/json
+python main.py test/H2O-relax/out --annotate 2>&1 | tee test/H2O-relax/json
+python main.py test/Al-bulk/out --annotate 2>&1 | tee test/Al-bulk/json
+python main.py test/Al-slab/out --annotate 2>&1 | tee test/Al-slab/json
+python main.py test/MgO/out --annotate 2>&1 | tee test/MgO/json
+python main.py test/smeagol-Au-leads/Au.out --annotate 2>&1 | tee test/smeagol-Au-leads/json
+python main.py test/smeagol-Au-scregion/Au.out --annotate 2>&1 | tee test/smeagol-Au-scregion/json
diff --git a/parser/parser-siesta/main.py b/parser/parser-siesta/main.py
index c949578b42f81c8a0604c012b61afd2007274bcd..32f2d5f998a4cf8edfa74fbea2c81243162487f9 100644
--- a/parser/parser-siesta/main.py
+++ b/parser/parser-siesta/main.py
@@ -3,6 +3,7 @@ import os
 import sys
 import setup_paths
 from glob import glob
+import re
 
 import numpy as np
 from ase.data import chemical_symbols
@@ -30,8 +31,6 @@ def siesta_energy(title, meta, **kwargs):
     return SM(r'siesta:\s*%s\s*=\s*(?P<%s__eV>\S+)' % (title, meta),
               name=meta, **kwargs)
 
-import re
-
 def line_iter(fd, linepattern = re.compile(r'\s*([^#]+)')):
     # Strip off comments and whitespace, return only non-empty strings
     for line in fd:
@@ -89,123 +88,6 @@ def get_input_metadata(inputvars_file, use_new_format):
     return inputvars, blocks
 
 
-def ArraySM(header, row, build, **kwargs):
-
-    class LineBuf:
-        def __init__(self):
-            self.lines = []
-
-        def adhoc_addrow(self, parser):
-            line = parser.fIn.readline()
-            self.lines.append(line)
-
-        def _build_array(self, parser):
-            build(parser.backend.superBackend, self.lines)
-            self.lines = []
-
-    linebuf = LineBuf()
-    sm = SM(header,
-            name=kwargs.pop('name', 'startarray'),
-            required=True,
-            subFlags=SM.SubFlags.Sequenced,
-            subMatchers=[
-                SM(row, name='array', repeats=True,
-                   forwardMatch=True,
-                   adHoc=linebuf.adhoc_addrow, required=True),
-                SM(r'', endReStr='', adHoc=linebuf._build_array, name='endarray',
-                   forwardMatch=True)
-            ],
-            **kwargs)
-    return sm
-
-
-def errprint(func):
-    def wrapper(backend, lines):
-        try:
-            func(backend, lines)
-        except Exception:
-            print('Error in %s: %d lines' % (func.__name__,
-                                             len(lines)))
-            for line in lines:
-                print(line, file=sys.stderr)
-            raise
-    return wrapper
-
-def tokenize(lines):
-    return np.array([line.split() for line in lines], object)
-
-
-#@errprint
-#def build_cell(backend, lines):
-#    cell = tokenize(lines).astype(float)
-#    backend.addArrayValues('simulation_cell', convert_unit(cell, 'angstrom'))
-
-@errprint
-def get_forces(backend, lines):
-    if len(lines) == 0:
-        # Siesta sometimes, stupidly, writes a Forces header.
-        # It then proceeds to not write any forces.
-        # Thus we ignore that silliness
-        return
-    forces = tokenize(lines)[:, 1:].astype(float)
-    assert forces.shape[1] == 3, forces.shape
-    backend.addArrayValues('atom_forces', convert_unit(forces, 'eV/angstrom'))
-
-@errprint
-def get_stress(backend, lines):
-    stress = tokenize(lines)[:, 1:].astype(float)
-    assert stress.shape == (3, 3)
-    backend.addArrayValues('stress_tensor', convert_unit(stress, 'eV/angstrom**3'))
-
-@errprint
-def get_dipole(backend, lines):
-    assert len(lines) == 1
-    dipole = tokenize(lines)[:, -3:].astype(float)
-    # Hmm.  There is no common metadata for dipole moment for some reason.
-    #print('dipole', dipole)
-
-#def get_array(metaname, dtype, istart=0, iend=None, unit=None):
-#    @errprint
-#    def buildarray(backend, lines):
-#        arr = tokenize(lines)
-#        if iend is None:
-#            arr = arr[:, istart:]
-#        else:
-#            arr = arr[:, istart:iend]
-#        arr = arr.astype(dtype)
-#        if unit is not None:
-#            arr = convert_unit(arr, unit)
-#        backend.addArrayValues(metaname, arr)
-#    return buildarray
-def get_array(metaname, dtype=float, istart=0, iend=None, unit=None,
-              storage=None):
-    @errprint
-    def buildarray(backend, lines):
-        arr = tokenize(lines)
-        if iend is None:
-            arr = arr[:, istart:]
-        else:
-            arr = arr[:, istart:iend]
-        arr = arr.astype(dtype)
-        if unit is not None:
-            arr = convert_unit(arr, unit)
-        if storage is not None:
-            storage[metaname] = arr
-        else:
-            backend.addArrayValues(metaname, arr)
-    return buildarray
-
-
-
-@errprint
-def add_positions_and_labels(backend, lines):
-    matrix = tokenize(lines)
-    positions = matrix[:, 1:4].astype(float)
-    labels = np.array([chemical_symbols[i] for i in matrix[:, 5].astype(int)])
-    backend.addArrayValues('atom_positions', convert_unit(positions, 'bohr'))
-    backend.addArrayValues('atom_labels', labels)
-
-
 """
 %block PAO.Basis                 # Define Basis set
 O                     2                    # Species label, number of l-shells
@@ -439,6 +321,9 @@ class SiestaContext(object):
         for key, value in meta.items():
             backend.addArrayValues(key, value)
 
+        backend.addArrayValues('configuration_periodic_dimensions',
+                               np.ones(3, bool))
+
         assert len(self.data) == 0, self.data
 
     def onClose_section_run(self, backend, gindex, section):
@@ -665,9 +550,6 @@ mainFileDescription = SM(
     r'',
     name='root',
     #weak=True,
-    #fixedStartValues={'program_name': 'siesta',
-    #                  'program_basis_set_type': 'numeric AOs',
-    #                  'configuration_periodic_dimensions': np.ones(3, bool)},
     sections=['section_run'],
     subMatchers=[
         get_header_matcher(),