diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..76420c085f72b23877e6f1d16ab2d9c65466fe4c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,91 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# mypy
+.mypy_cache/
+
+#pycharm
+.idea/
+
+.DS_Store
+
+# pylint
+.pylintrc
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c139d76d52c57c99f7a4fa8a01b11d1c1b48c30e
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,64 @@
+image: python
+
+# Change pip's cache directory to be inside the project directory since we can
+# only cache local items.
+variables:
+  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache"
+
+# Pip's cache doesn't store the python packages
+# https://pip.pypa.io/en/stable/reference/pip_install/#caching
+#
+# If you want to also cache the installed packages, you have to install
+# them in a virtualenv and cache it as well.
+cache:
+  paths:
+    - .cache/pip
+
+stages:
+- Static Analysis and Test
+
+before_script:
+- uname -a
+- apt-get update && apt install -y libgl1-mesa-glx
+- pip install -e .[dev]
+
+flake8:
+  image: python:3.8
+  tags:
+  - passoft
+  stage: Static Analysis and Test
+  script:
+  - flake8 --ignore=E501,W503 lemi2seed
+  - flake8 tests
+
+mypy:
+  image: python:3.8
+  tags:
+  - passoft
+  stage: Static Analysis and Test
+  script:
+  - python -m mypy --config-file ./setup.cfg lemi2seed
+
+python3.7:
+  image: python:3.7
+  tags:
+  - passoft
+  stage: Static Analysis and Test
+  script:
+  - python -m unittest
+
+python3.8:
+  image: python:3.8
+  tags:
+  - passoft
+  stage: Static Analysis and Test
+  script:
+  - python -m unittest
+
+python3.9:
+  image: python:3.9
+  tags:
+  - passoft
+  stage: Static Analysis and Test
+  script:
+  - python -m unittest
diff --git a/AUTHORS.rst b/AUTHORS.rst
new file mode 100644
index 0000000000000000000000000000000000000000..33bb038c8f86aba6651edd7a42119aefb9fc3206
--- /dev/null
+++ b/AUTHORS.rst
@@ -0,0 +1,8 @@
+=======
+Credits
+=======
+
+Development Lead
+----------------
+
+* IRIS PASSCAL <software-support@passcal.nmt.edu>
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
new file mode 100644
index 0000000000000000000000000000000000000000..84ded9f1ecce2d01ebc5a64ce5853ad7e46f412b
--- /dev/null
+++ b/CONTRIBUTING.rst
@@ -0,0 +1,115 @@
+.. highlight:: shell
+
+============
+Contributing
+============
+
+Contributions are welcome, and they are greatly appreciated! Every little bit
+helps, and credit will always be given.
+
+You can contribute in many ways:
+
+Types of Contributions
+----------------------
+
+Report Bugs
+~~~~~~~~~~~
+
+Report bugs at https://git.passcal.nmt.edu/maeva/lemi2seed/issues.
+
+If you are reporting a bug, please include:
+
+* Your operating system name and version.
+* Any details about your local setup that might be helpful in troubleshooting.
+* Detailed steps to reproduce the bug.
+
+Fix Bugs
+~~~~~~~~
+
+Look through the GitHub issues for bugs. Anything tagged with "bug" and "help
+wanted" is open to whoever wants to implement it.
+
+Implement Features
+~~~~~~~~~~~~~~~~~~
+
+Look through the GitLab issues for features. Anything tagged with "enhancement"
+and "help wanted" is open to whoever wants to implement it.
+
+Write Documentation
+~~~~~~~~~~~~~~~~~~~
+
+lemi2seed could always use more documentation, whether as part of the
+official lemi2seed docs, in docstrings, or even on the web in blog posts,
+articles, and such.
+
+Submit Feedback
+~~~~~~~~~~~~~~~
+
+The best way to send feedback is to file an issue at
+https://git.passcal.nmt.edu/maeva/lemi2seed/issues.
+
+If you are proposing a feature:
+
+* Explain in detail how it would work.
+* Keep the scope as narrow as possible, to make it easier to implement.
+* Remember that this is a volunteer-driven project, and that contributions
+  are welcome :)
+
+Get Started!
+------------
+
+Ready to contribute? Here's how to set up `lemi2seed` for local development.
+
+1. Clone the `lemi2seed` repo:
+
+ * $ git clone https://git.passcal.nmt.edu/maeva/lemi2seed.git
+
+2. Install your local copy:
+
+ * $ pip install -e .[dev]
+
+3. Create a branch for local development:
+
+ * $ git checkout -b name-of-your-bugfix-or-feature
+
+ Now you can make your changes locally.
+
+4. When you're done making changes, check that your changes pass the
+   tests:
+
+ * $ python -m unittest
+
+5. Commit your changes and push your branch to GitHub:
+
+ * $ git add .
+ * $ git commit -m "Your detailed description of your changes."
+ * $ git push origin name-of-your-bugfix-or-feature
+
+6. Submit a merge request through the Gitlab website.
+
+Pull Request Guidelines
+-----------------------
+
+Before you submit a merge request, check that it meets these guidelines:
+
+1. The merge request should include tests.
+2. If the merge request adds functionality, the docs should be updated. Put
+   your new functionality into a function with a docstring, and add the
+   feature to the list in README.rst.
+3. The pull request should work for Python 3.[6,7,8]
+
+Tips
+----
+
+To run a subset of tests, for the lemi2seed module for example, run:
+  * $ python -m unittest tests/test_lemi2seed.py
+
+Deploying
+---------
+
+A reminder for the maintainers on how to deploy.
+Make sure all your changes are committed (including an entry in HISTORY.rst).
+Then run:
+
+* $ git push
+* $ git push --tags
diff --git a/HISTORY.rst b/HISTORY.rst
new file mode 100644
index 0000000000000000000000000000000000000000..36c61103c5181af2e139c51d738abd86ae73f0d7
--- /dev/null
+++ b/HISTORY.rst
@@ -0,0 +1,8 @@
+=======
+History
+=======
+
+2021.?
+--------
+
+* First release on new build system.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..bd41136cf89ceada208b2b32591a88e123f10a2d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,32 @@
+GNU GENERAL PUBLIC LICENSE
+                      Version 3, 29 June 2007
+
+    Convert LEMI data and metadata into day-long mseed and StationXML files.
+    Copyright (C) 2018  IRIS PASSCAL
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..a217fea98adb50c2a42b0ad72aa37d71cc4cc0b0
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,10 @@
+include AUTHORS.rst
+include CONTRIBUTING.rst
+include HISTORY.rst
+include LICENSE
+include README.rst
+
+graft lemi2seed
+graft tests
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/README.md b/README.md
deleted file mode 100644
index 8e02c2b1b6b1c54286d4971bd0990489a6f68059..0000000000000000000000000000000000000000
--- a/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# lemi2obspy
-
-Program to convert MT data to mseed
\ No newline at end of file
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..23aeee58c0cd2d5d92273a5f4e3e2b92d10754c8
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,20 @@
+==========
+lemi2seed
+==========
+
+- **Description**:
+    - Convert LEMI data and metadata into day-long mseed and StationXML files.
+
+- **Usage**:
+    - ``lemi2seed -h``
+    - ``lemi2seed -d path2data -qc`` *(run lemi2seed in "quality control" mode)*
+    - ``lemi2seed -d path2data -g`` *(run lemi2seed in "gui only" mode)*
+    - ``lemi2seed -d path2data -m path2metadata`` *(run lemi2seed in "field sheet and gui" mode)*
+
+  The "quality control" mode allows to quickly convert LEMI data to day-long mseed files. The GUI and handling of metadata are bypassed.
+
+  In the "gui only" mode, metadata are entered only using the GUI.
+
+  In the "field sheet and gui" mode, metadata are prepopulated from parsing the provided field sheets.
+
+- **License**: GNU General Public License v3 (GPLv3)
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3cbedadf7611ec67578e979bf653a42814bdf445
--- /dev/null
+++ b/conda.recipe/meta.yaml
@@ -0,0 +1,34 @@
+package:
+  name: lemi2seed
+  version: 2021.239
+
+source:
+  path: ../
+
+build:
+  noarch: python
+  number: 0
+  script: {{ PYTHON }} -m pip install --no-deps -vv .
+
+requirements:
+  build:
+    - python >=3.7
+    - pip
+  run:
+    - python >=3.7
+    - configobj
+    - obspy
+    - openpyxl
+    - PySide2
+
+test:
+  source_files:
+    - tests
+  commands:
+    - python -m unittest
+
+about:
+  home: https://git.passcal.nmt.edu/maeva/lemi2seed
+  license: GPLv3
+  license_file: LICENSE
+  summary: Convert LEMI data and metadata into day-long mseed and StationXML files.
diff --git a/lemi2seed/__init__.py b/lemi2seed/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ecd3cbd56d1bc2833627451fac05626cb52efccc
--- /dev/null
+++ b/lemi2seed/__init__.py
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+
+"""Top-level package for lemi2seed."""
+
+__author__ = """IRIS PASSCAL"""
+__email__ = 'software-support@passcal.nmt.edu'
+__version__ = '2021.239'
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..413492cdf7958e0400083b0fda309e08a8cf2d68
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,18 @@
+[flake8]
+exclude = docs, *_rc.py
+max-line-length = 120
+
+[mypy-*.lemi_gui]
+ignore_errors = True
+
+[mypy-configobj]
+ignore_missing_imports = True
+
+[mypy-numpy]
+ignore_missing_imports = True
+
+[mypy-obspy.*]
+ignore_missing_imports = True
+
+[mypy-openpyxl]
+ignore_missing_imports = True
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7f500ae54865a1e29026e338e32c9a3f8f4f40d
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""The setup script."""
+
+from setuptools import setup, find_packages
+
+with open('README.rst', 'rt') as readme_file:
+    readme = readme_file.read()
+
+with open('HISTORY.rst', 'rt') as history_file:
+    history = history_file.read()
+
+
+setup(
+    author="IRIS PASSCAL",
+    author_email='software-support@passcal.nmt.edu',
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved ::  GNU General Public License v3 (GPLv3)',
+        'Natural Language :: English',
+        'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
+    ],
+    description="Convert LEMI data and metadata into day-long mseed and "
+                "StationXML files.",
+    entry_points={
+        'console_scripts': [
+            'lemi2seed=lemi2seed.lemi2seed:main',
+        ],
+    },
+    install_requires=['configobj',
+                      'obspy',
+                      'openpyxl',
+                      'openpyxl-stubs',
+                      'PySide2'],
+    setup_requires=[],
+    extras_require={
+        'dev': [
+            'flake8',
+            'tox',
+            'mypy',
+        ]
+    },
+    license="GNU General Public License v3",
+    long_description=readme + '\n\n' + history,
+    include_package_data=True,
+    keywords='lemi2seed',
+    name='lemi2seed',
+    packages=find_packages(include=['lemi2seed']),
+    url='https://git.passcal.nmt.edu/maeva/lemi2seed',
+    version='2021.007',
+    zip_safe=False,
+)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6ee1dab48156c2c4173afa6eb5687ac6d7f2e76
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+"""Unit test package for lemi2seed."""
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..642474042b3ee00681933c2cb97b39dac82d261d
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,16 @@
+[tox]
+envlist = py37, py38, py39, flake8, mypy
+
+[testenv:flake8]
+basepython = python
+deps = flake8
+commands = flake8 --ignore=E501,W503 lemi2seed
+           flake8 tests
+
+[testenv:mypy]
+basepython = python
+deps = mypy
+commands = python -m mypy --config-file ./setup.cfg lemi2seed
+
+[testenv]
+commands = python -m unittest