diff --git a/README.md b/README.md
index a5545d9aeb26ec75535a87f84c19b726878ca836..de9d6d9d9b0dab5ce4b9499458b09d2e6b430aa7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Add Campaign
-curl -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaign
+curl -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaigns
 
 
 # Get (all) campaigns
@@ -15,4 +15,4 @@ curl -X DELETE localhost:8000/campaigns/1
 curl -X PUT -H "Content-Type: application/json" -d '{"name":"new Name","organizerName":"Thomas","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaigns/1 
 
 # AddDonation
-curl -H "Content-Type: application/json" -d '{"CampaignID":1,"amount":12.23,"DonorName":"Stefan","ReceiptRequested":false,"Status":"TRANSFERRED"}'
\ No newline at end of file
+curl -H "Content-Type: application/json" -d '{"CampaignID":1,"amount":12.23,"DonorName":"Stefan","ReceiptRequested":false,"Status":"TRANSFERRED"}' localhost:8000/campaigns/1/donation
\ No newline at end of file
diff --git a/go.work b/go.work
new file mode 100644
index 0000000000000000000000000000000000000000..b8c8690d95eb733e44c62cb0ee1c9adc2346cf24
--- /dev/null
+++ b/go.work
@@ -0,0 +1,3 @@
+go 1.20
+
+use ./src/myaktion
\ No newline at end of file
diff --git a/scripts/start-mariadb.sh b/scripts/start-mariadb.sh
new file mode 100644
index 0000000000000000000000000000000000000000..04ad7c12bc65846ebed508eadaedf817ae9226ab
--- /dev/null
+++ b/scripts/start-mariadb.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+docker run -d -p 3306:3306 --name database -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=myaktion mariadb:10.5
\ No newline at end of file
diff --git a/scripts/stop-mariadb.sh b/scripts/stop-mariadb.sh
new file mode 100644
index 0000000000000000000000000000000000000000..da085ee5c924515aa600dec763a0b0e1b2d3341c
--- /dev/null
+++ b/scripts/stop-mariadb.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+docker kill database && docker rm database
\ No newline at end of file
diff --git a/src/myaktion/Dockerfile b/src/myaktion/Dockerfile
index 4a881c7c8177a90b4a5ea67482c9928e502407fa..d8022da86249db01e38769a8580b650fc25de8f5 100644
--- a/src/myaktion/Dockerfile
+++ b/src/myaktion/Dockerfile
@@ -6,4 +6,4 @@ RUN go install
 RUN chmod +x ./wait-for-it.sh ./docker-entrypoint.sh
 ENTRYPOINT ["./docker-entrypoint.sh"]
 CMD ["myaktion"]
-EXPOSE 8000
\ No newline at end of file
+EXPOSE 8000
diff --git a/src/myaktion/db/db.go b/src/myaktion/db/db.go
index df53923affbf82a9f6fd2338a160a9ad9c1bf8a2..53f7729356f125f2e0452052f43196a307314820 100644
--- a/src/myaktion/db/db.go
+++ b/src/myaktion/db/db.go
@@ -1,34 +1,42 @@
 package db
 
 import (
+	"errors"
 	"fmt"
 	"os"
 
 	log "github.com/sirupsen/logrus"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
 
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
 	"gorm.io/driver/mysql"
 	"gorm.io/gorm"
 )
 
 var DB *gorm.DB
 
-func init() {
-	dsn := fmt.Sprintf("root:root@tcp(%s)/myaktion?charset=utf8&parseTime=True&loc=Local", os.Getenv("DB_CONNECT"))
-	log.Info("UsingDSN forDB:", dsn)
+func Init() {
+	err := Connect(os.Getenv("DB_CONNECT"))
+	if err != nil {
+		panic(err)
+	}
+}
+
+func Connect(connect string) error {
+	// init DB
 	var err error
+	dsn := fmt.Sprintf("root:root@tcp(%s)/myaktion?charset=utf8&parseTime=True&loc=Local", connect)
+	log.Info("Using DSN for DB:", dsn)
 	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
-
 	if err != nil {
-		panic("Connection to Database failed")
+		return errors.New("failed to connect to database")
 	}
-
-	log.Info("Starting migrations")
+	log.Info("Starting automatic migrations")
 	if err := DB.Debug().AutoMigrate(&model.Campaign{}); err != nil {
-		panic(err)
+		return err
 	}
 	if err := DB.Debug().AutoMigrate(&model.Donation{}); err != nil {
-		panic(err)
+		return err
 	}
-	log.Info("Migration finished")
+	log.Info("Automatic migrations finished")
+	return nil
 }
diff --git a/src/myaktion/db/setuptest.go b/src/myaktion/db/setuptest.go
new file mode 100644
index 0000000000000000000000000000000000000000..df4ee06aa39bca011001b2924948ca6a8488682c
--- /dev/null
+++ b/src/myaktion/db/setuptest.go
@@ -0,0 +1,46 @@
+package db
+
+import (
+	"testing"
+
+	"github.com/ory/dockertest/v3"
+	"github.com/ory/dockertest/v3/docker"
+)
+
+func SetupTestDB(t *testing.T) func() {
+	pool, err := dockertest.NewPool("")
+	if err != nil {
+		t.Fatalf("Could not connect to docker: %s", err)
+	}
+
+	runDockerOpt := &dockertest.RunOptions{
+		Repository: "mariadb",
+		Tag:        "10.5",
+		Env:        []string{"MYSQL_ROOT_PASSWORD=root", "MYSQL_DATABASE=myaktion"},
+		PortBindings: map[docker.Port][]docker.PortBinding{
+			"3306/tcp": {{HostIP: "localhost", HostPort: "3306/tcp"}},
+		},
+	}
+
+	fnConfig := func(config *docker.HostConfig) {
+		config.AutoRemove = true                     // set AutoRemove to true so that stopped container goes away by itself
+		config.RestartPolicy = docker.NeverRestart() // don't restart container
+	}
+
+	resource, err := pool.RunWithOptions(runDockerOpt, fnConfig)
+	if err != nil {
+		t.Fatalf("Could not start test DB: %s", err)
+	}
+
+	// retry until db server is ready
+	err = pool.Retry(func() error {
+		return Connect("localhost:3306")
+	})
+	if err != nil {
+		t.Fatalf("Could not connect to test DB: %s", err)
+	}
+
+	return func() {
+		resource.Close()
+	}
+}
diff --git a/src/myaktion/docker-entrypoint.sh b/src/myaktion/docker-entrypoint.sh
index ddca64b3c408a7b62612b505797dcdcefe397995..4fcb749ffa0bddfcb9c1ef607320164660dc1f26 100644
--- a/src/myaktion/docker-entrypoint.sh
+++ b/src/myaktion/docker-entrypoint.sh
@@ -5,8 +5,8 @@ set -e
 
 # Wait for DB
 if [ -n "$DB_CONNECT" ]; then
-	/go/src/app/wait-for-it.sh "$DB_CONNECT" -t 40
+    /go/src/app/wait-for-it.sh "$DB_CONNECT" -t 40
 fi
 
 # Run the main container command.
-exec "$@"
+exec "$@"
\ No newline at end of file
diff --git a/src/myaktion/go.mod b/src/myaktion/go.mod
index f4e5cb0df0da3b6a2ce5fe306eb7ecd9f9d19044..8bbd03b05efd64a98d82d2b8cac59c321fe239db 100644
--- a/src/myaktion/go.mod
+++ b/src/myaktion/go.mod
@@ -1,17 +1,42 @@
-module gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion
+module gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion
 
 go 1.20
 
 require (
 	github.com/gorilla/mux v1.8.0
-	github.com/sirupsen/logrus v1.9.0
-	gorm.io/driver/mysql v1.5.0
+	github.com/ory/dockertest/v3 v3.10.0
+	github.com/sirupsen/logrus v1.9.2
+	gorm.io/driver/mysql v1.5.1
 	gorm.io/gorm v1.25.1
 )
 
 require (
+	github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
+	github.com/Microsoft/go-winio v0.6.0 // indirect
+	github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
+	github.com/cenkalti/backoff/v4 v4.1.3 // indirect
+	github.com/containerd/continuity v0.3.0 // indirect
+	github.com/docker/cli v20.10.17+incompatible // indirect
+	github.com/docker/docker v20.10.7+incompatible // indirect
+	github.com/docker/go-connections v0.4.0 // indirect
+	github.com/docker/go-units v0.4.0 // indirect
 	github.com/go-sql-driver/mysql v1.7.1 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
+	github.com/imdario/mergo v0.3.12 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
-	golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
+	github.com/mitchellh/mapstructure v1.4.1 // indirect
+	github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect
+	github.com/opencontainers/go-digest v1.0.0 // indirect
+	github.com/opencontainers/image-spec v1.0.2 // indirect
+	github.com/opencontainers/runc v1.1.5 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
+	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
+	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
+	golang.org/x/mod v0.9.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
+	golang.org/x/tools v0.7.0 // indirect
+	gopkg.in/yaml.v2 v2.3.0 // indirect
 )
diff --git a/src/myaktion/go.sum b/src/myaktion/go.sum
index 0a1684a5e2d71694c2e2900e196a03e64b69a5cb..c0123193f8b6f749f856777a3ad3dfc244771bee 100644
--- a/src/myaktion/go.sum
+++ b/src/myaktion/go.sum
@@ -1,29 +1,167 @@
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
+github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
+github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
+github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
+github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
+github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
+github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M=
+github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ=
+github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
+github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
+github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
+github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
 github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2 h1:hRGSmZu7j271trc9sneMrpOW7GN5ngLm8YUZIPzf394=
+github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
+github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
+github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=
+github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
+github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
+github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
+github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
+github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs=
+github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
+github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
+github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4=
+github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
+github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
+github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
+github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
+golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gorm.io/driver/mysql v1.5.0 h1:6hSAT5QcyIaty0jfnff0z0CLDjyRgZ8mlMHLqSt7uXM=
-gorm.io/driver/mysql v1.5.0/go.mod h1:FFla/fJuCvyTi7rJQd27qlNX2v3L6deTR1GgTjSOLPo=
-gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
+gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
 gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64=
 gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
+gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo=
diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go
index 936d94963f2ae0d4ac998a858d3948fe11c39f8e..ceae604ecbc24d85d8ae0db1cb2b710a9472f665 100644
--- a/src/myaktion/handler/campaign.go
+++ b/src/myaktion/handler/campaign.go
@@ -6,8 +6,8 @@ import (
 
 	log "github.com/sirupsen/logrus"
 
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/service"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/service"
 )
 
 func CreateCampaign(w http.ResponseWriter, r *http.Request) {
diff --git a/src/myaktion/handler/campaign_test.go b/src/myaktion/handler/campaign_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..cedd7ee44c20fa81fbe8b7262e6bf1cb44e879c2
--- /dev/null
+++ b/src/myaktion/handler/campaign_test.go
@@ -0,0 +1,52 @@
+package handler_test
+
+import (
+	"bytes"
+	"encoding/json"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/handler"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
+)
+
+func TestCreateCampaignBadRequest(t *testing.T) {
+	rr := httptest.NewRecorder()
+	//No campaign in the body of the request -> nil
+	req := httptest.NewRequest(http.MethodPost, "/campaigns", nil)
+	handler := http.HandlerFunc(handler.CreateCampaign)
+	handler.ServeHTTP(rr, req)
+
+	if status := rr.Code; status != http.StatusBadRequest {
+		t.Errorf("handler did not recognize bad request")
+	}
+}
+
+func TestCreateCampaign(t *testing.T) {
+	cleanUpDB := db.SetupTestDB(t)
+	defer cleanUpDB()
+	rr := httptest.NewRecorder()
+	jsonData := `{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}`
+	req := httptest.NewRequest(http.MethodPost, "/dummy-url", bytes.NewBufferString(jsonData))
+	req.Header.Set("Content-Type", "application/json")
+
+	handler := http.HandlerFunc(handler.CreateCampaign)
+	handler.ServeHTTP(rr, req)
+
+	if status := rr.Code; status != http.StatusOK {
+		t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
+		return
+	}
+
+	var campaign model.Campaign
+	err := json.NewDecoder(rr.Body).Decode(&campaign)
+	if err != nil {
+		t.Errorf("handler returned unexpected response: %v", err)
+		return
+	}
+	if campaign.ID != 1 {
+		t.Errorf("handler returned unexpected ID: got %v want %v", campaign.ID, 1)
+	}
+}
diff --git a/src/myaktion/handler/donation.go b/src/myaktion/handler/donation.go
index b7c4a6faa60f007690f52b627335b99a7a9acc57..4a2604d97e7caf3d53ad6d8ebf703dc0d9441ba5 100644
--- a/src/myaktion/handler/donation.go
+++ b/src/myaktion/handler/donation.go
@@ -6,8 +6,8 @@ import (
 
 	log "github.com/sirupsen/logrus"
 
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/service"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/service"
 )
 
 func AddDonation(w http.ResponseWriter, r *http.Request) {
diff --git a/src/myaktion/handler/health_test.go b/src/myaktion/handler/health_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..11c3d31ab97ef677353e14a2f3c310e365ca6b4f
--- /dev/null
+++ b/src/myaktion/handler/health_test.go
@@ -0,0 +1,23 @@
+package handler
+
+import (
+	"net/http"
+	"net/http/httptest"
+	"testing"
+)
+
+func TestHealth(t *testing.T) {
+	rr := httptest.NewRecorder()
+	req := httptest.NewRequest("GET", "/health", nil)
+	handler := http.HandlerFunc(Health)
+	handler.ServeHTTP(rr, req)
+
+	if status := rr.Code; status != http.StatusOK {
+		t.Errorf("handler returned wrong status code: got %v wand %v", status, http.StatusOK)
+	}
+
+	expected := `{"alive": true}`
+	if rr.Body.String() != expected {
+		t.Errorf("handler returned unexpected body: got %v want %v", rr.Body.String(), expected)
+	}
+}
diff --git a/src/myaktion/main.go b/src/myaktion/main.go
index d134b2b81a47e18a46fd18048b839053afddd00b..fae02b76984c789801290fb9b17bc300e375f315 100644
--- a/src/myaktion/main.go
+++ b/src/myaktion/main.go
@@ -4,16 +4,14 @@ import (
 	"net/http"
 	"os"
 
-	log "github.com/sirupsen/logrus"
-
 	"github.com/gorilla/mux"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/handler"
+	log "github.com/sirupsen/logrus"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/handler"
 )
 
-//"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
-
 func init() {
-	// init logger
+	defer db.Init()
 	log.SetFormatter(&log.TextFormatter{})
 	log.SetReportCaller(true)
 	level, err := log.ParseLevel(os.Getenv("LOG_LEVEL"))
@@ -28,13 +26,15 @@ func init() {
 func main() {
 	log.Println("Starting My-Aktion API server")
 	router := mux.NewRouter()
+
 	router.HandleFunc("/health", handler.Health).Methods("GET")
-	router.HandleFunc("/campaign", handler.CreateCampaign).Methods("POST")
+	router.HandleFunc("/campaigns", handler.CreateCampaign).Methods("POST")
 	router.HandleFunc("/campaigns", handler.GetCampaigns).Methods("GET")
 	router.HandleFunc("/campaigns/{id}", handler.GetCampaign).Methods("GET")
-	router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE")
 	router.HandleFunc("/campaigns/{id}", handler.UpdateCampaign).Methods("PUT")
+	router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE")
 	router.HandleFunc("/campaigns/{id}/donation", handler.AddDonation).Methods("POST")
+
 	if err := http.ListenAndServe(":8000", router); err != nil {
 		log.Fatal(err)
 	}
diff --git a/src/myaktion/model/account.go b/src/myaktion/model/account.go
index 07aa05eabb042731b63e56a86ac6b3725dd88a57..9d02bf4bf7c1b2d55394ea88d7545571e8435ace 100644
--- a/src/myaktion/model/account.go
+++ b/src/myaktion/model/account.go
@@ -1,7 +1,7 @@
 package model
 
 type Account struct {
-	Name     string `gorm:"notNull:seize:40"`
-	BankName string `gorm:"notNull:seize:20"`
-	Number   string `gorm:"notNull:seize:10"`
+	Name     string `gorm:"notNull;size:60"`
+	BankName string `gorm:"notNull;size:60"`
+	Number   string `gorm:"notNull;size:60"`
 }
diff --git a/src/myaktion/model/campaign.go b/src/myaktion/model/campaign.go
index 7ddacc0528e872df7b635ad0663a804756bb51a4..d6a4cb707173197d60741497dc7d53da1fadc4f7 100644
--- a/src/myaktion/model/campaign.go
+++ b/src/myaktion/model/campaign.go
@@ -6,11 +6,19 @@ type Campaign struct {
 	gorm.Model
 	Name               string     `gorm:"notNull;size:30"`
 	OrganizerName      string     `gorm:"notNull"`
-	TargetAmount       float64    `gorm:"notNull;check:target_amount>= 10.0"`
-	DonationMinimum    float64    `gorm:"notNull;check:donation_minimum>= 1.0"`
-	Donations          []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
+	TargetAmount       float64    `gorm:"notNull;check:target_amount >= 10.0"`
+	DonationMinimum    float64    `gorm:"notNull;check:target_amount >= 1.0"`
 	AmountDonatedSoFar float64    `gorm:"-"`
+	Donations          []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
 	Account            Account    `gorm:"embedded;embeddedPrefix:account_"`
 }
 
-//func (c *Campaign) AfterFind(tx *gorm.DB)
+func (c *Campaign) AfterFind(tx *gorm.DB) (err error) {
+	var sum float64
+	result := tx.Model(&Donation{}).Select("ifnull(sum(amount),0)").Where("campaign_id = ?", c.ID).Scan(&sum)
+	if result.Error != nil {
+		return result.Error
+	}
+	c.AmountDonatedSoFar = sum
+	return nil
+}
diff --git a/src/myaktion/model/donation.go b/src/myaktion/model/donation.go
index 52d4922e0c965788297da2aa884e5c866b6709b5..fca92ae133d203f0ffaeefb850cab7a33ea3325f 100644
--- a/src/myaktion/model/donation.go
+++ b/src/myaktion/model/donation.go
@@ -15,6 +15,6 @@ type Donation struct {
 type Status string
 
 const (
-	Transferred Status = "TRANSFERRED"
-	In_Process  Status = "IN_PROCESS"
+	TRANSFERRED Status = "TRANSFERRED"
+	IN_PROCESS  Status = "IN_PROCESS"
 )
diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go
index 58234e3117333060ac34bdc1d5a3b94c23789316..9c6ee0ddcdd2ca80567a3451e6b22efff598c7b7 100644
--- a/src/myaktion/service/campaign.go
+++ b/src/myaktion/service/campaign.go
@@ -1,10 +1,13 @@
 package service
 
 import (
+	"errors"
+
 	log "github.com/sirupsen/logrus"
+	"gorm.io/gorm"
 
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/db"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
 )
 
 func CreateCampaign(campaign *model.Campaign) error {
@@ -12,8 +15,8 @@ func CreateCampaign(campaign *model.Campaign) error {
 	if result.Error != nil {
 		return result.Error
 	}
-	log.Printf("Successfully stored new campaign with ID %v in database.", campaign.ID)
-	log.Printf("Stored: %v", campaign)
+	log.Infof("Successfully stored new campaign with ID %v in database.", campaign.ID)
+	log.Tracef("Stored: %v", campaign)
 	return nil
 }
 
@@ -23,44 +26,52 @@ func GetCampaigns() ([]model.Campaign, error) {
 	if result.Error != nil {
 		return nil, result.Error
 	}
-
-	log.Tracef("Retrieved: %v Campaigns", campaigns)
+	log.Tracef("Retrieved: %v", campaigns)
 	return campaigns, nil
 }
 
 func GetCampaign(id uint) (*model.Campaign, error) {
-	var campaign model.Campaign
-	result := db.DB.Preload("Donations").First(&campaign, id)
+	campaign := new(model.Campaign)
+	result := db.DB.Preload("Donations").First(campaign, id)
+	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
+		return nil, nil
+	}
 	if result.Error != nil {
 		return nil, result.Error
 	}
 	log.Tracef("Retrieved: %v", campaign)
-	return &campaign, nil
+	return campaign, nil
 }
 
 func UpdateCampaign(id uint, campaign *model.Campaign) (*model.Campaign, error) {
 	existingCampaign, err := GetCampaign(id)
-	if err != nil {
+	if existingCampaign == nil || err != nil {
 		return existingCampaign, err
 	}
 	existingCampaign.Name = campaign.Name
 	existingCampaign.OrganizerName = campaign.OrganizerName
 	existingCampaign.TargetAmount = campaign.TargetAmount
 	existingCampaign.DonationMinimum = campaign.DonationMinimum
-	db.DB.Save(&existingCampaign)
+	existingCampaign.Account = campaign.Account
+	result := db.DB.Save(existingCampaign)
+	if result.Error != nil {
+		return nil, result.Error
+	}
 	entry := log.WithField("ID", id)
 	entry.Info("Successfully updated campaign.")
-	entry.Tracef("Updated: %v", campaign)
+	entry.Tracef("Updated: %v", existingCampaign)
 	return existingCampaign, nil
 }
 
 func DeleteCampaign(id uint) (*model.Campaign, error) {
 	campaign, err := GetCampaign(id)
-	if err != nil {
+	if campaign == nil || err != nil {
 		return campaign, err
 	}
-	db.DB.Delete(&campaign, id)
-
+	result := db.DB.Delete(campaign)
+	if result.Error != nil {
+		return nil, result.Error
+	}
 	entry := log.WithField("ID", id)
 	entry.Info("Successfully deleted campaign.")
 	entry.Tracef("Deleted: %v", campaign)
diff --git a/src/myaktion/service/donation.go b/src/myaktion/service/donation.go
index 1bcbfee486ad145d264cb794188220fb56c7ceca..7cac10f3853dfcac375727178398e5429f99869c 100644
--- a/src/myaktion/service/donation.go
+++ b/src/myaktion/service/donation.go
@@ -3,19 +3,18 @@ package service
 import (
 	log "github.com/sirupsen/logrus"
 
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/db"
-	"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db"
+	"gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model"
 )
 
 func AddDonation(campaignId uint, donation *model.Donation) error {
-	campaign, err := GetCampaign(campaignId)
-	if err != nil {
-		return err
+	donation.CampaignID = campaignId
+	result := db.DB.Create(donation)
+	if result.Error != nil {
+		return result.Error
 	}
-	campaign.Donations = append(campaign.Donations, *donation)
-	db.DB.Save(&campaign)
 	entry := log.WithField("ID", campaignId)
-	entry.Info("Successfully added new donation to campaign.")
+	entry.Info("Successfully added new donation to campaign in database.")
 	entry.Tracef("Stored: %v", donation)
 	return nil
 }