diff --git a/.gitignore b/.gitignore
index 2eea525d885d5148108f6f3a9a8613863f783d36..50888c086fb33538c9f18b6b76e4103d6bf6e512 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-.env
\ No newline at end of file
+.env
+*.egg-info
+*.pyc
\ No newline at end of file
diff --git a/README.md b/README.md
index 0c5e160e1199428023afc615cb65e274bc7bfb12..670d61a7253ce7ea2a885566b97f2599cf48b1c2 100644
--- a/README.md
+++ b/README.md
@@ -5,16 +5,8 @@ Generates csv input files for the `atdb_load_tasks_from_table` script.
 
 ### Installation
 ```bash
-# Using pipenv (update python version if necessary)
-cd atdb_csv_gen
-pipenv install 
-
-# or using pip (optional, use a virtual env)
-cd atdb_csv_gen
-pip install -r requirements.txt
-
-# or using docker
-docker-build -t ldv-atdb-csv-gen csv_gen/
+# Using pip install (requires valid ssh key, until the repo is set to public)
+pip install pip install -e "git+https://git.astron.nl/ldv/ldv_utils.git#egg=atdb-csv-gen&subdirectory=atdb_csv_gen"
 ```
 
 ### Running
@@ -22,21 +14,12 @@ docker-build -t ldv-atdb-csv-gen csv_gen/
 # copy .env.example to .env and fill in the environment vars (DB credentials)
 cp ./atdb_csv_gen/.env.example ./atdb_csv_gen/.env
 
-# run using pipenv
-cd atdb_csv_gen
-pipenv shell    # this will use the .env file to set environment variables
-./csv_gen.py -v -o out.csv 650273
-
-# run using python (note)
-cd atdb_csv_gen
+# run using python
 export $(cat .env | xargs)  # or export env vars elsewhere
-./csv_gen.py -v -o out.csv 650273
-
-# run in docker (creates out.csv in outdir)
-docker run -it --rm --env-file atdb_csv_gen/.env -v $PWD/outdir:/outdir ldv-atdb-csv-gen /app/csv_gen.py -v -o /outdir/out.csv 650273
+atdb_csv_gen -v -o out.csv 650273
 
-# more info and flags
-docker run -it --rm ldv-atdb-csv-gen
+# More info and flags
+atdb_csv_gen -h
 ```
 
 ### Caveats
diff --git a/atdb_csv_gen/.env.example b/atdb_csv_gen/.env.example
index 194c3b2227682891ced96414df30291f65ecb33d..6563cfa65afa3f3178a04bb4933678a661e20a26 100644
--- a/atdb_csv_gen/.env.example
+++ b/atdb_csv_gen/.env.example
@@ -1,4 +1,4 @@
 DB_USERNAME=
 DB_PASSWORD=
 DB_DATABASE=
-DB_HOST=sdc-db.astron.nl
\ No newline at end of file
+DB_HOST=
\ No newline at end of file
diff --git a/atdb_csv_gen/Dockerfile b/atdb_csv_gen/Dockerfile
deleted file mode 100644
index 5a2351b03643c9562ec69e0067bee1281188a27b..0000000000000000000000000000000000000000
--- a/atdb_csv_gen/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM python:3.10-slim
-
-RUN pip --no-cache-dir install pipenv
-
-WORKDIR /app
-COPY Pipfile* /app/
-RUN pipenv lock -r > requirements.txt &&  pip install -r requirements.txt
-
-COPY csv_gen.py /app/
-CMD [ "/app/csv_gen.py", "-h" ]
\ No newline at end of file
diff --git a/atdb_csv_gen/Pipfile b/atdb_csv_gen/Pipfile
deleted file mode 100644
index fdcc203c34d6efb3c1c3e9cadc7960146269bf81..0000000000000000000000000000000000000000
--- a/atdb_csv_gen/Pipfile
+++ /dev/null
@@ -1,18 +0,0 @@
-[[source]]
-url = "https://pypi.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-psycopg2-binary = "*"
-sqlalchemy = "*"
-
-[dev-packages]
-flake8 = "*"
-black = "*"
-
-[requires]
-python_version = "3.10"
-
-[pipenv]
-allow_prereleases = true
diff --git a/atdb_csv_gen/Pipfile.lock b/atdb_csv_gen/Pipfile.lock
deleted file mode 100644
index 98a2927925f5dd99b70e1769907f15b56ca46f5e..0000000000000000000000000000000000000000
--- a/atdb_csv_gen/Pipfile.lock
+++ /dev/null
@@ -1,286 +0,0 @@
-{
-    "_meta": {
-        "hash": {
-            "sha256": "6f0f652bc369fdd2d56890d91ca935b9973a50f4d398ca19d1d456010eb804f8"
-        },
-        "pipfile-spec": 6,
-        "requires": {
-            "python_version": "3.10"
-        },
-        "sources": [
-            {
-                "name": "pypi",
-                "url": "https://pypi.org/simple",
-                "verify_ssl": true
-            }
-        ]
-    },
-    "default": {
-        "greenlet": {
-            "hashes": [
-                "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711",
-                "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd",
-                "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073",
-                "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708",
-                "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67",
-                "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23",
-                "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1",
-                "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08",
-                "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd",
-                "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa",
-                "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8",
-                "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40",
-                "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab",
-                "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6",
-                "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc",
-                "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b",
-                "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e",
-                "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963",
-                "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3",
-                "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d",
-                "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d",
-                "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28",
-                "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3",
-                "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e",
-                "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c",
-                "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d",
-                "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0",
-                "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497",
-                "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee",
-                "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713",
-                "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58",
-                "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a",
-                "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06",
-                "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88",
-                "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4",
-                "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5",
-                "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c",
-                "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a",
-                "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1",
-                "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43",
-                "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627",
-                "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b",
-                "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168",
-                "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d",
-                "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5",
-                "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478",
-                "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf",
-                "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce",
-                "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c",
-                "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==1.1.2"
-        },
-        "psycopg2-binary": {
-            "hashes": [
-                "sha256:0b7dae87f0b729922e06f85f667de7bf16455d411971b2043bbd9577af9d1975",
-                "sha256:0f2e04bd2a2ab54fa44ee67fe2d002bb90cee1c0f1cc0ebc3148af7b02034cbd",
-                "sha256:123c3fb684e9abfc47218d3784c7b4c47c8587951ea4dd5bc38b6636ac57f616",
-                "sha256:1473c0215b0613dd938db54a653f68251a45a78b05f6fc21af4326f40e8360a2",
-                "sha256:14db1752acdd2187d99cb2ca0a1a6dfe57fc65c3281e0f20e597aac8d2a5bd90",
-                "sha256:1e3a362790edc0a365385b1ac4cc0acc429a0c0d662d829a50b6ce743ae61b5a",
-                "sha256:1e85b74cbbb3056e3656f1cc4781294df03383127a8114cbc6531e8b8367bf1e",
-                "sha256:20f1ab44d8c352074e2d7ca67dc00843067788791be373e67a0911998787ce7d",
-                "sha256:24b0b6688b9f31a911f2361fe818492650795c9e5d3a1bc647acbd7440142a4f",
-                "sha256:2f62c207d1740b0bde5c4e949f857b044818f734a3d57f1d0d0edc65050532ed",
-                "sha256:3242b9619de955ab44581a03a64bdd7d5e470cc4183e8fcadd85ab9d3756ce7a",
-                "sha256:35c4310f8febe41f442d3c65066ca93cccefd75013df3d8c736c5b93ec288140",
-                "sha256:4235f9d5ddcab0b8dbd723dca56ea2922b485ea00e1dafacf33b0c7e840b3d32",
-                "sha256:542875f62bc56e91c6eac05a0deadeae20e1730be4c6334d8f04c944fcd99759",
-                "sha256:5ced67f1e34e1a450cdb48eb53ca73b60aa0af21c46b9b35ac3e581cf9f00e31",
-                "sha256:661509f51531ec125e52357a489ea3806640d0ca37d9dada461ffc69ee1e7b6e",
-                "sha256:7360647ea04db2e7dff1648d1da825c8cf68dc5fbd80b8fb5b3ee9f068dcd21a",
-                "sha256:736b8797b58febabb85494142c627bd182b50d2a7ec65322983e71065ad3034c",
-                "sha256:8c13d72ed6af7fd2c8acbd95661cf9477f94e381fce0792c04981a8283b52917",
-                "sha256:988b47ac70d204aed01589ed342303da7c4d84b56c2f4c4b8b00deda123372bf",
-                "sha256:995fc41ebda5a7a663a254a1dcac52638c3e847f48307b5416ee373da15075d7",
-                "sha256:a36c7eb6152ba5467fb264d73844877be8b0847874d4822b7cf2d3c0cb8cdcb0",
-                "sha256:aed4a9a7e3221b3e252c39d0bf794c438dc5453bc2963e8befe9d4cd324dff72",
-                "sha256:aef9aee84ec78af51107181d02fe8773b100b01c5dfde351184ad9223eab3698",
-                "sha256:b0221ca5a9837e040ebf61f48899926b5783668b7807419e4adae8175a31f773",
-                "sha256:b4d7679a08fea64573c969f6994a2631908bb2c0e69a7235648642f3d2e39a68",
-                "sha256:c250a7ec489b652c892e4f0a5d122cc14c3780f9f643e1a326754aedf82d9a76",
-                "sha256:ca86db5b561b894f9e5f115d6a159fff2a2570a652e07889d8a383b5fae66eb4",
-                "sha256:cfc523edecddaef56f6740d7de1ce24a2fdf94fd5e704091856a201872e37f9f",
-                "sha256:d92272c7c16e105788efe2cfa5d680f07e34e0c29b03c1908f8636f55d5f915a",
-                "sha256:da113b70f6ec40e7d81b43d1b139b9db6a05727ab8be1ee559f3a69854a69d34",
-                "sha256:f6fac64a38f6768e7bc7b035b9e10d8a538a9fadce06b983fb3e6fa55ac5f5ce",
-                "sha256:f8559617b1fcf59a9aedba2c9838b5b6aa211ffedecabca412b92a1ff75aac1a",
-                "sha256:fbb42a541b1093385a2d8c7eec94d26d30437d0e77c1d25dae1dcc46741a385e"
-            ],
-            "index": "pypi",
-            "version": "==2.9.1"
-        },
-        "sqlalchemy": {
-            "hashes": [
-                "sha256:07ac4461a1116b317519ddf6f34bcb00b011b5c1370ebeaaf56595504ffc7e84",
-                "sha256:090536fd23bf49077ee94ff97142bc5ee8bad24294c3d7c8d5284267c885dde7",
-                "sha256:1dee515578d04bc80c4f9a8c8cfe93f455db725059e885f1b1da174d91c4d077",
-                "sha256:1ef37c9ec2015ce2f0dc1084514e197f2f199d3dc3514190db7620b78e6004c8",
-                "sha256:295b90efef1278f27fe27d94a45460ae3c17f5c5c2b32c163e29c359740a1599",
-                "sha256:2ce42ad1f59eb85c55c44fb505f8854081ee23748f76b62a7f569cfa9b6d0604",
-                "sha256:2feb028dc75e13ba93456a42ac042b255bf94dbd692bf80b47b22653bb25ccf8",
-                "sha256:31f4426cfad19b5a50d07153146b2bcb372a279975d5fa39f98883c0ef0f3313",
-                "sha256:3c0c5f54560a92691d54b0768d67b4d3159e514b426cfcb1258af8c195577e8f",
-                "sha256:463ef692259ff8189be42223e433542347ae17e33f91c1013e9c5c64e2798088",
-                "sha256:4a882dedb9dfa6f33524953c3e3d72bcf518a5defd6d5863150a821928b19ad3",
-                "sha256:4c185c928e2638af9bae13acc3f70e0096eac76471a1101a10f96b80666b8270",
-                "sha256:5039faa365e7522a8eb4736a54afd24a7e75dcc33b81ab2f0e6c456140f1ad64",
-                "sha256:5c6774b34782116ad9bdec61c2dbce9faaca4b166a0bc8e7b03c2b870b121d94",
-                "sha256:6bc7f9d7d90ef55e8c6db1308a8619cd8f40e24a34f759119b95e7284dca351a",
-                "sha256:7e8ef103eaa72a857746fd57dda5b8b5961e8e82a528a3f8b7e2884d8506f0b7",
-                "sha256:7ef421c3887b39c6f352e5022a53ac18de8387de331130481cb956b2d029cad6",
-                "sha256:908fad32c53b17aad12d722379150c3c5317c422437e44032256a77df1746292",
-                "sha256:91efbda4e6d311812f23996242bad7665c1392209554f8a31ec6db757456db5c",
-                "sha256:a6506c17b0b6016656783232d0bdd03fd333f1f654d51a14d93223f953903646",
-                "sha256:a95bf9c725012dcd7ea3cac16bf647054e0d62b31d67467d228338e6a163e4ff",
-                "sha256:ad7e403fc1e3cb76e802872694e30d6ca6129b9bc6ad4e7caa48ca35f8a144f8",
-                "sha256:b86f762cee3709722ab4691981958cbec475ea43406a6916a7ec375db9cbd9e9",
-                "sha256:ba84026e84379326bbf2f0c50792f2ae56ab9c01937df5597b6893810b8ca369",
-                "sha256:bca660b76672e15d70a7dba5e703e1ce451a0257b6bd2028e62b0487885e8ae9",
-                "sha256:c24c01dcd03426a5fe5ee7af735906bec6084977b9027a3605d11d949a565c01",
-                "sha256:c2f2114b0968a280f94deeeaa31cfbac9175e6ac7bd3058b3ce6e054ecd762b3",
-                "sha256:c46f013ff31b80cbe36410281675e1fb4eaf3e25c284fd8a69981c73f6fa4cb4",
-                "sha256:c757ba1279b85b3460e72e8b92239dae6f8b060a75fb24b3d9be984dd78cfa55",
-                "sha256:cc6b21f19bc9d4cd77cbcba5f3b260436ce033f1053cea225b6efea2603d201e",
-                "sha256:dbf588ab09e522ac2cbd010919a592c6aae2f15ccc3cd9a96d01c42fbc13f63e",
-                "sha256:de996756d894a2d52c132742e3b6d64ecd37e0919ddadf4dc3981818777c7e67",
-                "sha256:e700d48056475d077f867e6a36e58546de71bdb6fdc3d34b879e3240827fefab",
-                "sha256:f1e97c5f36b94542f72917b62f3a2f92be914b2cf33b80fa69cede7529241d2a",
-                "sha256:fb2aa74a6e3c2cebea38dd21633671841fbe70ea486053cba33d68e3e22ccc0a",
-                "sha256:ff8f91a7b1c4a1c7772caa9efe640f2768828897044748f2458b708f1026e2d4"
-            ],
-            "index": "pypi",
-            "version": "==1.4.26"
-        }
-    },
-    "develop": {
-        "black": {
-            "hashes": [
-                "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115",
-                "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"
-            ],
-            "index": "pypi",
-            "version": "==21.9b0"
-        },
-        "click": {
-            "hashes": [
-                "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
-                "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==8.0.3"
-        },
-        "flake8": {
-            "hashes": [
-                "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d",
-                "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"
-            ],
-            "index": "pypi",
-            "version": "==4.0.1"
-        },
-        "mccabe": {
-            "hashes": [
-                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
-                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
-            ],
-            "version": "==0.6.1"
-        },
-        "mypy-extensions": {
-            "hashes": [
-                "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
-                "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
-            ],
-            "version": "==0.4.3"
-        },
-        "pathspec": {
-            "hashes": [
-                "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
-                "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
-            ],
-            "version": "==0.9.0"
-        },
-        "platformdirs": {
-            "hashes": [
-                "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2",
-                "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==2.4.0"
-        },
-        "pycodestyle": {
-            "hashes": [
-                "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20",
-                "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==2.8.0"
-        },
-        "pyflakes": {
-            "hashes": [
-                "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c",
-                "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.4.0"
-        },
-        "regex": {
-            "hashes": [
-                "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a",
-                "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84",
-                "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e",
-                "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710",
-                "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e",
-                "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65",
-                "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c",
-                "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79",
-                "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455",
-                "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234",
-                "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e",
-                "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395",
-                "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6",
-                "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7",
-                "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7",
-                "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f",
-                "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c",
-                "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e",
-                "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f",
-                "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88",
-                "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623",
-                "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1",
-                "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464",
-                "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666",
-                "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae",
-                "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0",
-                "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452",
-                "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019",
-                "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952",
-                "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509",
-                "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570",
-                "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa",
-                "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6",
-                "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f",
-                "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29",
-                "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"
-            ],
-            "version": "==2021.10.23"
-        },
-        "tomli": {
-            "hashes": [
-                "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee",
-                "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==1.2.2"
-        },
-        "typing-extensions": {
-            "hashes": [
-                "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e",
-                "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7",
-                "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"
-            ],
-            "version": "==3.10.0.2"
-        }
-    }
-}
diff --git a/atdb_csv_gen/atdb_csv_gen/__init__.py b/atdb_csv_gen/atdb_csv_gen/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..81aab313eddd2f4cfe046e7c331f1968a8f8e2c7
--- /dev/null
+++ b/atdb_csv_gen/atdb_csv_gen/__init__.py
@@ -0,0 +1 @@
+from .csv_gen import gen_csv, main
\ No newline at end of file
diff --git a/atdb_csv_gen/atdb_csv_gen.py b/atdb_csv_gen/atdb_csv_gen/csv_gen.py
similarity index 71%
rename from atdb_csv_gen/atdb_csv_gen.py
rename to atdb_csv_gen/atdb_csv_gen/csv_gen.py
index 627ad3a109d7b453b1676c505f2ff3f8065a297e..8a1ad36c252e2301dfd48c0c21d0c7f125b7727b 100755
--- a/atdb_csv_gen/atdb_csv_gen.py
+++ b/atdb_csv_gen/atdb_csv_gen/csv_gen.py
@@ -3,6 +3,7 @@
 
 import logging
 import os
+import sys
 from argparse import ArgumentParser, Namespace
 from sys import version
 from typing import Iterator, List, Optional, Tuple
@@ -22,10 +23,15 @@ logger = logging.getLogger(__name__)
 
 def parse_args() -> Namespace:
     """ Parse CLI arguments """
-    parser = ArgumentParser(description="Generates CSV for atdb_load_tasks_from_table")
-    parser.add_argument("obs_id", help="Observation ID (SAS ID)")
-    parser.add_argument("-o", help="Output file")
-    parser.add_argument("--save-missing", help="Directory to store csc with missing files")
+
+    parser = ArgumentParser(description="Generates CSV for atdb_load_tasks_from_table\n"
+        "Requires the following env vars:\n"
+        "\tDB_USERNAME, DB_PASSWORD, DB_DATABASE and optionally:\n"
+        "\tDB_HOST (localhost by default) and DB_PORT (5432, postgres default)"
+    )
+    parser.add_argument("obs_id", type=str, help="Observation ID (SAS ID)")
+    parser.add_argument("-o", type=str, help="Output file")
+    parser.add_argument("--save-missing", type=str, help="Directory to store csv with missing files")
     parser.add_argument("-v", action="store_true", help="Verbose logging")
     parser.add_argument("-q", action="store_true", help="Quiet logging (only errors)")
     return parser.parse_args()
@@ -64,7 +70,23 @@ def write_output(csv_data: str, output: Optional[str]):
     else:
         print(csv_data)
 
-def main(obs_id: str, o_file: Optional[str]):
+def gen_csv(obs_id: str, o_file: Optional[str] = None, save_missing:Optional[str] = None):
+    """ Generate CSV file for ATDB
+
+    Parameters
+    ----------
+    obs_id : string
+        observation id
+    o_file : string, optional
+        File to write the output to (by default to stdout)
+    save_missing : string, optional
+        Directory to write missing files output to (by default only shows warnings!)
+    """
+
+    if not all([USER, PASSWORD, DATABASE, HOST, PORT]):
+        raise RuntimeError("Missing DB credentials in env vars.\n"
+                           "Did you export the .env file?")
+
     engine = create_engine(f"postgresql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}")
     logger.debug("Connected to %s:%s", HOST, PORT)
 
@@ -86,6 +108,8 @@ def main(obs_id: str, o_file: Optional[str]):
         logger.warning("Observation contains %i registered files which are not present on disk",  len(reg_no_file))
         for row in reg_no_file:
             logger.warning(row)
+        if save_missing:
+            write_output("\n".join(reg_no_file), os.path.join(save_missing, "reg_no_file.csv"))
 
     # File found, not registered
     file_no_reg = cra_data.difference(reg_data)
@@ -93,6 +117,8 @@ def main(obs_id: str, o_file: Optional[str]):
         logger.warning("Observation contains %i files on disk which are not registered in the LTA", len(file_no_reg))
         for row in file_no_reg:
             logger.warning(row)
+        if save_missing:
+            write_output("\n".join(file_no_reg), os.path.join(save_missing, "file_no_reg.csv"))
 
 
     inter = reg_data.intersection(cra_data)
@@ -102,7 +128,7 @@ def main(obs_id: str, o_file: Optional[str]):
     logger.info("Done")
 
 
-if __name__ == "__main__":
+def main():
     args = parse_args()
 
     if args.v:
@@ -112,4 +138,7 @@ if __name__ == "__main__":
     else:    
         logging.basicConfig(level=logging.INFO)
 
-    main(obs_id=args.obs_id,o_file=args.o)
+    gen_csv(obs_id=args.obs_id,o_file=args.o, save_missing=args.save_missing)
+
+if __name__ == "__main__":
+    main()
diff --git a/atdb_csv_gen/bin/atdb_csv_gen b/atdb_csv_gen/bin/atdb_csv_gen
new file mode 100644
index 0000000000000000000000000000000000000000..3d2351126093b50220d348354a42249817526087
--- /dev/null
+++ b/atdb_csv_gen/bin/atdb_csv_gen
@@ -0,0 +1,4 @@
+#!/usr/bin/env python3
+
+import atdb_csv_gen
+atdb_csv_gen.main()
\ No newline at end of file
diff --git a/atdb_csv_gen/requirements.txt b/atdb_csv_gen/requirements.txt
index 4e812e590066faf3b9840aeb6bae5701f48a065d..41d60dfb716af2546848fa88f99d90c4a543682e 100644
--- a/atdb_csv_gen/requirements.txt
+++ b/atdb_csv_gen/requirements.txt
@@ -1,11 +1,2 @@
-#
-# These requirements were autogenerated by pipenv
-# To regenerate from the project's Pipfile, run:
-#
-#    pipenv lock --requirements
-#
-
--i https://pypi.org/simple
-greenlet==1.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
-psycopg2-binary==2.9.1
-sqlalchemy==1.4.26
+psycopg2-binary>=2.9.1
+sqlalchemy>=1.4.26
diff --git a/atdb_csv_gen/setup.py b/atdb_csv_gen/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..07cc9eb3fa5f9f718ea953707cd5cf407e532ce0
--- /dev/null
+++ b/atdb_csv_gen/setup.py
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: Apache-2.0
+
+from setuptools import setup
+
+
+def get_requirements() -> str:
+    with open("requirements.txt") as reqs:
+        return reqs.read().split("\n")
+
+setup(
+    name="atdb-csv-gen",
+    version="1.0.0",
+    description="Tool to generate csv files for ATDB",
+    author="ASTRON",
+    packages=["atdb_csv_gen"],
+    install_requires=get_requirements(),
+    scripts=["bin/atdb_csv_gen"],
+    license="Apache License, Version 2.0",
+    zip=False,
+    python_requires=">=3.7"
+)