diff --git a/.gitignore b/.gitignore
index a6cb8b615eb7a44af58c9563596ab6264ef6dbe6..914589aa5425ac7a0ad3c8863511b26c29288195 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,3 +52,6 @@ TAGS
 
 lib/
 env/
+
+*egg-info
+
diff --git a/parser/wien2kparser/__init__.py b/parser/wien2kparser/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f61e055a7aa01c7cbabf0f73ed07354ba29440de
--- /dev/null
+++ b/parser/wien2kparser/__init__.py
@@ -0,0 +1 @@
+from wien2kparser.wien2k_parser import Wien2kParser
\ No newline at end of file
diff --git a/parser/parser-wien2k/setup_paths.py b/parser/wien2kparser/setup_paths.py
similarity index 100%
rename from parser/parser-wien2k/setup_paths.py
rename to parser/wien2kparser/setup_paths.py
diff --git a/parser/parser-wien2k/wien2k_parser.py b/parser/wien2kparser/wien2k_parser.py
similarity index 92%
rename from parser/parser-wien2k/wien2k_parser.py
rename to parser/wien2kparser/wien2k_parser.py
index ee53b67fa8c9a943bfc281ec1241eb492af93972..640d0ce80eebd832c547261c5307d2441cc0fb77 100644
--- a/parser/parser-wien2k/wien2k_parser.py
+++ b/parser/wien2kparser/wien2k_parser.py
@@ -1,11 +1,11 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 import numpy as np
 from nomadcore.simple_parser import mainFunction, AncillaryParser, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
 import os, sys, json, logging
-import wien2k_parser_struct, wien2k_parser_in0, wien2k_parser_in1c,  wien2k_parser_in2c, wien2k_parser_in1,  wien2k_parser_in2
+from wien2kparser import wien2k_parser_struct, wien2k_parser_in0, wien2k_parser_in1c, wien2k_parser_in2c, wien2k_parser_in1,  wien2k_parser_in2
 
 
 ################################################################
@@ -164,8 +164,8 @@ class Wien2kContext(object):
         atom_labels = section['x_wien2k_atom_name']
         if atom_labels is not None:
            backend.addArrayValues('atom_labels', np.asarray(atom_labels))
-    
-        
+
+
         # atom force
         atom_force = []
         for i in ['x', 'y', 'z']:
@@ -193,7 +193,7 @@ class Wien2kContext(object):
 
     def onClose_section_scf_iteration(self, backend, gIndex, section):
         #Trigger called when section_scf_iteration is closed.
-        
+
         # count number of SCF iterations
         self.scfIterNr += 1
 
@@ -264,7 +264,7 @@ cachingLevelForMetaName = {
 
     "XC_functional_name": CachingLevel.ForwardAndCache,
     "energy_total": CachingLevel.ForwardAndCache
-    
+
  }
 
 # loading metadata from nomad-meta-info/meta_info/nomad_meta_info/fhi_aims.nomadmetainfo.json
@@ -277,6 +277,36 @@ parserInfo = {
 metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../../../nomad-meta-info/meta_info/nomad_meta_info/wien2k.nomadmetainfo.json"))
 metaInfoEnv, warnings = loadJsonFile(filePath = metaInfoPath, dependencyLoader = None, extraArgsHandling = InfoKindEl.ADD_EXTRA_ARGS, uri = None)
 
+class Wien2kParser:
+    """ A proper class envolop for running this parser from within python. """
+    def __init__(self, backend, **kwargs):
+        self.backend_factory = backend
+
+    logging.warn('something is wrong')
+    logger = logging.getLogger(__name__)
+    logger.warn(...)
+
+    def parse(self, mainfile):
+        from unittest.mock import patch
+        # _logging.getLogger('nomadcore').setLevel(_logging.WARNING)
+        backend = self.backend_factory(metaInfoEnv)
+        with patch.object(sys, 'argv', ['<exe>', '--uri', 'nmd://uri', mainfile]):
+            mainFunction(
+                mainFileDescription,
+                metaInfoEnv,
+                parserInfo,
+                superContext=Wien2kContext(),
+                superBackend=backend)
+
+        return backend
+
+
+    def setup_logger(self, new_logger):
+        if hasattr(new_logger, 'bind'):
+            # tell tests about received logger
+            new_logger.debug('received logger')
+
+
 if __name__ == "__main__":
     superContext = Wien2kContext()
     mainFunction(mainFileDescription, metaInfoEnv, parserInfo, superContext = superContext)
diff --git a/parser/parser-wien2k/wien2k_parser_in0.py b/parser/wien2kparser/wien2k_parser_in0.py
similarity index 97%
rename from parser/parser-wien2k/wien2k_parser_in0.py
rename to parser/wien2kparser/wien2k_parser_in0.py
index 7baa25dedbf28dfa0cea3d8c6c93e816216d7cc2..cc0629f41846b4e86c459b520ba5b104940925a2 100644
--- a/parser/parser-wien2k/wien2k_parser_in0.py
+++ b/parser/wien2kparser/wien2k_parser_in0.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
@@ -88,7 +88,7 @@ class Wien2kIn0Context(object):
             'XC_TPSS': ['MGGA_X_TPSS','MGGA_C_TPSS'],
 
             '46':['GGA_X_HTBS'],
-            'XC_HTBS': ['GGA_X_HTBS'], 
+            'XC_HTBS': ['GGA_X_HTBS'],
 
             '47': ['HYB_GGA_XC_B3LYP'],
             'XC_B3LYP': ['HYB_GGA_XC_B3LYP'],
@@ -99,15 +99,15 @@ class Wien2kIn0Context(object):
             #        VX_SLDA:
 
             #        52: ['-'],
-            #        EX_SPBE: 
+            #        EX_SPBE:
             #        VX_SPBE:
 
             #        53: ['-'],
-            #        EX_SWC: 
+            #        EX_SWC:
             #        VX_SWC:
 
             #        54: ['-'],
-            #        EX_SPBESOL: 
+            #        EX_SPBESOL:
             #        VX_SPBESOL:
 
             #        55: ['-'],
@@ -149,7 +149,7 @@ def buildIn0Matchers():
 
 def get_cachingLevelForMetaName(metaInfoEnv, CachingLvl):
     """Sets the caching level for the metadata.
-    
+
     Args:
     metaInfoEnv: metadata which is an object of the class InfoKindEnv in nomadcore.local_meta_info.py.
     CachingLvl: Sets the CachingLevel for the sections k_band, run, and single_configuration_calculation.
diff --git a/parser/parser-wien2k/wien2k_parser_in1.py b/parser/wien2kparser/wien2k_parser_in1.py
similarity index 99%
rename from parser/parser-wien2k/wien2k_parser_in1.py
rename to parser/wien2kparser/wien2k_parser_in1.py
index 05c98fa380a26f184511c1507d6ca7f51d6600d8..3e91f71d7b9faa010be939f8fae9b5f1f7b19ea2 100644
--- a/parser/parser-wien2k/wien2k_parser_in1.py
+++ b/parser/wien2kparser/wien2k_parser_in1.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
diff --git a/parser/parser-wien2k/wien2k_parser_in1c.py b/parser/wien2kparser/wien2k_parser_in1c.py
similarity index 99%
rename from parser/parser-wien2k/wien2k_parser_in1c.py
rename to parser/wien2kparser/wien2k_parser_in1c.py
index c1e4ed7a7ccc9307a50a0b7528be0d47f4533b35..8334289b313205c59bd1f16f2b1d0a3644a0c743 100644
--- a/parser/parser-wien2k/wien2k_parser_in1c.py
+++ b/parser/wien2kparser/wien2k_parser_in1c.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
diff --git a/parser/parser-wien2k/wien2k_parser_in2.py b/parser/wien2kparser/wien2k_parser_in2.py
similarity index 98%
rename from parser/parser-wien2k/wien2k_parser_in2.py
rename to parser/wien2kparser/wien2k_parser_in2.py
index 5ff465943817d3c66485ec292f847bed29bcc270..7174dfcd0aa565238b921bd0433a3a5496ccb9ae 100644
--- a/parser/parser-wien2k/wien2k_parser_in2.py
+++ b/parser/wien2kparser/wien2k_parser_in2.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
diff --git a/parser/parser-wien2k/wien2k_parser_in2c.py b/parser/wien2kparser/wien2k_parser_in2c.py
similarity index 98%
rename from parser/parser-wien2k/wien2k_parser_in2c.py
rename to parser/wien2kparser/wien2k_parser_in2c.py
index 6c5c122b32096c74def9644071bab15778f53b7b..ba090e434f404a6d1fb3991725d1d0a0ca419c64 100644
--- a/parser/parser-wien2k/wien2k_parser_in2c.py
+++ b/parser/wien2kparser/wien2k_parser_in2c.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
diff --git a/parser/parser-wien2k/wien2k_parser_struct.py b/parser/wien2kparser/wien2k_parser_struct.py
similarity index 99%
rename from parser/parser-wien2k/wien2k_parser_struct.py
rename to parser/wien2kparser/wien2k_parser_struct.py
index 1b1586ee74a646ec9e33bc36d423524d34c80710..8d669f2658fbb3a47856a07b7f8ee714343cd296 100644
--- a/parser/parser-wien2k/wien2k_parser_struct.py
+++ b/parser/wien2kparser/wien2k_parser_struct.py
@@ -1,5 +1,5 @@
 from builtins import object
-import setup_paths
+from wien2kparser import setup_paths
 from nomadcore.simple_parser import mainFunction, CachingLevel
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..f8adc8f1c7eeef1b53a60d61be00386d60d87fd1
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,33 @@
+# Copyright 2015-2018 Lorenzo Pardini
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+from setuptools import setup, find_packages
+
+
+def main():
+    setup(
+        name='wien2kparser',
+        version='0.1',
+        description='NOMAD parser implementation for Wien2k.',
+        license='APACHE 2.0',
+        package_dir={'': 'parser'},
+        packages=find_packages('parser'),
+        install_requires=[
+            'nomadcore'
+        ],
+    )
+
+
+if __name__ == '__main__':
+    main()