diff --git a/CMakeLists.txt b/CMakeLists.txt
index e04c823e952aa672af5441ab28cd4bfba272dd9a..0a671faaf9cd81a87a9aba0b0035f387b5bf5505 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
-cmake_minimum_required(VERSION 3.15...3.22)
+cmake_minimum_required(VERSION 3.22)
 
-project(eisgeneratorpy VERSION "1.0")
+project(eisgenerator VERSION "1.0")
 
 if(SKBUILD)
   # Scikit-Build does not add your site-packages to the search path
diff --git a/example/example.py b/example/example.py
index ca9096b6fe3f170e68fa03f73c4f0c39b05c986c..0e4212ec33a6ed444e686dcda6388d5cbb6279a1 100755
--- a/example/example.py
+++ b/example/example.py
@@ -1,35 +1,27 @@
 #!/bin/python
 
-import eisgeneratorpy as eis
+import eisgenerator as eis
 
-def printData(data):
-	print('Omega, Re, Im')
-	for i in data:
-		print(f'{i.omega},{i.im.real},{i.im.imag}')
+model = eis.Model("c{1e-6}r{1e3}")
+print(f"model: {model}")
 
-model = eis.Model("C{1e-6}R{1e3}")
-
-eis.Log.level = eis.Log.level.DEBUG
+eis.Log.level = eis.Log.level.WARN
 print(f'set log level: {eis.Log.level}')
 
 with eis.ostream_redirect(stdout=True, stderr=True):
 	data = model.execute(1e6)
-print(data.im)
+print(f"data for omega={data.omega}: {data}")
 
-ranges = list([])
-neededParameters = model.getFlatParametersCount()
-for i in range(neededParameters):
-	ranges.append(eis.Range(1, 1000, 1000, True))
+model = eis.Model("c{1e-6~1e-5}r{1e3~1e4}")
 
 omegaRange = eis.Range(1, 1000, 25, True)
 
-print('Ranges:')
-for eisRange in ranges:
-	print(f'{eisRange.start} {eisRange.end} {eisRange.count}')
-
-neededIterations = model.getRequiredStepsForSweeps(list(ranges))
+neededIterations = model.getRequiredStepsForSweeps()
 print(f'will need {neededIterations} iterations')
-for i in range(neededIterations):
-	#print(f'Spectra {i}:')
-	sweep = model.executeParamByIndex(ranges, omegaRange, i)
-	#printData(sweep)
+sweeps = model.executeAllSweeps(omegaRange)
+
+spectra = eis.EisSpectra()
+spectra.data = sweeps[200]
+spectra.model = model.getModelStrWithParam(200)
+
+print(spectra)
diff --git a/setup.py b/setup.py
index a7480648d6ce9667e430ae2658257d0ca7c58492..dd602f6eeb8ab97da64b59f7d0d7e9a5233c9c51 100644
--- a/setup.py
+++ b/setup.py
@@ -13,14 +13,14 @@ except ImportError:
 from setuptools import find_packages
 
 setup(
-    name="eisgeneratorpy",
-    version="0.0.1",
-    description="a minimal example package (with pybind11)",
-    author="Henry Schreiner",
-    license="MIT",
+    name="eisgenerator",
+    version="1.0.0",
+    description="",
+    author="Carl Philipp Klemm",
+    license="LGPL-3.0",
     packages=find_packages(where="src"),
     package_dir={"": "src"},
-    cmake_install_dir="src/eisgeneratorpy",
+    cmake_install_dir="src/eisgenerator",
     include_package_data=True,
-    python_requires=">=3.6",
+    python_requires=">=3.8",
 )
diff --git a/src/eisgenerator/__init__.py b/src/eisgenerator/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2186174b276d5bfae753aee4f1f8683fd241aabd
--- /dev/null
+++ b/src/eisgenerator/__init__.py
@@ -0,0 +1 @@
+from ._core import __doc__, __version__, Model, DataPoint, Range, Log, ParseError, FileError, eisDistance, EisSpectra, eisNyquistDistance, ostream_redirect
diff --git a/src/eisgeneratorpy/__init__.py b/src/eisgeneratorpy/__init__.py
deleted file mode 100644
index 1255adf9b0df6a52086f95db4b5e70ce31394c48..0000000000000000000000000000000000000000
--- a/src/eisgeneratorpy/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from ._core import __doc__, __version__, Model, DataPoint, Range, Log, ostream_redirect
diff --git a/src/main.cpp b/src/main.cpp
index a65f0fc70c01b916b945b042ba36f2c86f9d7431..1edfbc1c7df244f70ec20093927364a57bc45ded 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -8,23 +8,58 @@
 #include <eisgenerator/eistype.h>
 #include <eisgenerator/log.h>
 #include <vector>
+#include <sstream>
 
 namespace py = pybind11;
 
 using namespace eis;
 
+std::string reprEisSpectra(const EisSpectra& spectra)
+{
+	std::stringstream ss;
+	spectra.saveToStream(ss);
+	return ss.str();
+}
+
+std::string reprDataPoint(const DataPoint& dp)
+{
+	std::stringstream ss;
+	ss<<std::scientific;
+	ss<<'('<<dp.im.real()<<'+'<<dp.im.imag()<<"j)";
+	return ss.str();
+}
+
 PYBIND11_MODULE(_core, m)
 {
 	py::class_<Model>(m, "Model")
-		.def(py::init<const std::string&>())
-		.def("execute", &Model::execute)
-		.def("executeSweep", &Model::executeSweep)
-		.def("executeParamByIndex", &Model::executeParamByIndex)
-		.def_static("getRequiredStepsForSweeps", &Model::getRequiredStepsForSweeps)
-		.def("getFlatParametersCount", &Model::getFlatParametersCount);
+		.def(py::init<const std::string&, size_t, bool>(),
+			 py::arg("str"), py::arg("paramSweepCount") = 100, py::arg("defaultToRange") = false)
+		.def("execute", &Model::execute, py::arg("omaga"), py::arg("omaga") = 0)
+		.def("executeSweep", static_cast<std::vector<DataPoint> (Model::*)(const std::vector<fvalue>&, size_t)>(&Model::executeSweep),
+			 py::arg("omega"), py::arg("index") = 0)
+		.def("executeAllSweeps", &Model::executeAllSweeps)
+		.def("getModelStr", &Model::getModelStr)
+		.def("getModelStrWithParam", static_cast<std::string (Model::*)(size_t)>(&Model::getModelStrWithParam),
+			 py::arg("index") = 0)
+		.def("getUuid", &Model::getUuid)
+		.def("compile", &Model::compile)
+		.def("isReady", &Model::isReady)
+		.def("resolveSteps", &Model::resolveSteps)
+		.def("getRequiredStepsForSweeps", &Model::getRequiredStepsForSweeps)
+		.def("getCppCode", &Model::getCode)
+		.def("getTorchScript", &Model::getTorchScript)
+		.def("getCompiledFunctionName", &Model::getCompiledFunctionName)
+		.def("__repr__", &Model::getModelStr);
 	py::class_<DataPoint>(m, "DataPoint")
+		.def(py::init<std::complex<fvalue>, fvalue>(), py::arg("im") = std::complex<fvalue>(0, 0), py::arg("omega") = 100)
 		.def_readwrite("omega", &DataPoint::omega)
-		.def_readwrite("im", &DataPoint::im);
+		.def_readwrite("im", &DataPoint::im)
+		.def("__gt__", &DataPoint::operator>)
+		.def("__lt__", &DataPoint::operator<)
+		.def("__eq__", &DataPoint::operator==)
+		.def("__add__", &DataPoint::operator+)
+		.def("complexVectorLength", &DataPoint::complexVectorLength)
+		.def("__repr__", &reprDataPoint);
 	py::class_<Range>(m, "Range")
 		.def(py::init<fvalue, fvalue, size_t, bool>(),
 			py::arg("startI"),
@@ -34,7 +69,31 @@ PYBIND11_MODULE(_core, m)
 		.def_readwrite("start", &Range::start)
 		.def_readwrite("end", &Range::end)
 		.def_readwrite("count", &Range::count)
-		.def_readwrite("log", &Range::log);
+		.def_readwrite("log", &Range::log)
+		.def("stepSize", &Range::stepSize)
+		.def("stepValue", &Range::stepValue)
+		.def("center", &Range::center)
+		.def("at", &Range::at)
+		.def("__getitem__", &Range::at)
+		.def("getString", &Range::getString)
+		.def("getRangeVector", &Range::getRangeVector)
+		.def("fromString", &Range::fromString)
+		.def_static("rangesFromParamString", &Range::rangesFromParamString);
+	py::class_<EisSpectra>(m, "EisSpectra")
+		.def(py::init<>())
+		.def_readwrite("data", &EisSpectra::data)
+		.def_readwrite("model", &EisSpectra::model)
+		.def_readwrite("header", &EisSpectra::header)
+		.def_readwrite("labels", &EisSpectra::labels)
+		.def_readwrite("labelNames", &EisSpectra::labelNames)
+		.def_static("loadFromDisk", &EisSpectra::loadFromDisk)
+		.def("setLabel", &EisSpectra::setLabel)
+		.def("setSzLabels", &EisSpectra::setSzLabels)
+		.def("setLabels", static_cast<void (EisSpectra::*)(const std::vector<double>&)>(&EisSpectra::setLabels))
+		.def("getSzLabels", &EisSpectra::getSzLabels)
+		.def("getFvalueLabels", &EisSpectra::getFvalueLabels)
+		.def("saveToDisk", &EisSpectra::saveToDisk)
+		.def("__repr__", &reprEisSpectra);
 	py::class_<Log>(m, "Log")
 		.def_readwrite_static("level", &Log::level);
 	py::enum_<Log::Level>(m, "Level")
@@ -42,6 +101,10 @@ PYBIND11_MODULE(_core, m)
 		.value("INFO", Log::INFO)
 		.value("WARN", Log::WARN)
 		.value("ERROR", Log::ERROR);
+	py::register_exception<parse_errror>(m, "ParseError");
+	py::register_exception<file_error>(m, "FileError");
 	py::add_ostream_redirect(m, "ostream_redirect");
+	m.def("eisDistance", &eisDistance);
+	m.def("eisNyquistDistance", &eisNyquistDistance);
 	m.attr("__version__") = "1.0";
 }