diff --git a/go.mod b/go.mod
index 0003a829ea2b9b6f4f4fc4c8b85f54b34f73a15a..599112837d6333e1c49ae70b91f66b385ffeec7a 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,13 @@ 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
+	gorm.io/gorm v1.25.1
 )
 
-require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
+require (
+	github.com/go-sql-driver/mysql v1.7.1 // 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
+)
diff --git a/go.sum b/go.sum
index 656e662af702e4a5983da10a62dbb3adda6130ce..0a1684a5e2d71694c2e2900e196a03e64b69a5cb 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,15 @@
 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/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/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+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/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=
@@ -15,3 +22,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 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.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=
+gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64=
+gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
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/db/db.go b/src/myaktion/db/db.go
new file mode 100644
index 0000000000000000000000000000000000000000..df53923affbf82a9f6fd2338a160a9ad9c1bf8a2
--- /dev/null
+++ b/src/myaktion/db/db.go
@@ -0,0 +1,34 @@
+package db
+
+import (
+	"fmt"
+	"os"
+
+	log "github.com/sirupsen/logrus"
+	"gitlab.reutlingen-university.de/albrecht/myaktion-go/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)
+	var err error
+	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
+
+	if err != nil {
+		panic("Connection to Database failed")
+	}
+
+	log.Info("Starting migrations")
+	if err := DB.Debug().AutoMigrate(&model.Campaign{}); err != nil {
+		panic(err)
+	}
+	if err := DB.Debug().AutoMigrate(&model.Donation{}); err != nil {
+		panic(err)
+	}
+	log.Info("Migration finished")
+}
diff --git a/src/myaktion/model/account.go b/src/myaktion/model/account.go
index d2e74b4cdd30b686069fcdf3bb5de02e6c677189..07aa05eabb042731b63e56a86ac6b3725dd88a57 100644
--- a/src/myaktion/model/account.go
+++ b/src/myaktion/model/account.go
@@ -1,7 +1,7 @@
 package model
 
 type Account struct {
-	Name     string
-	BankName string
-	Number   string
+	Name     string `gorm:"notNull:seize:40"`
+	BankName string `gorm:"notNull:seize:20"`
+	Number   string `gorm:"notNull:seize:10"`
 }
diff --git a/src/myaktion/model/campaign.go b/src/myaktion/model/campaign.go
index 9fb581918dccfb6439fe2b276700060d13d6c517..e90118da47b8c3dd5a8d32a4b2a54365e2a0f525 100644
--- a/src/myaktion/model/campaign.go
+++ b/src/myaktion/model/campaign.go
@@ -1,12 +1,14 @@
 package model
 
+import "gorm.io/gorm"
+
 type Campaign struct {
-	ID                 uint
-	Name               string
-	OrganizerName      string
-	TargetAmount       float64
-	DonationMinimum    float64
-	AmountDonatedSoFar float64
-	Donations          []Donation
-	Account            Account
+	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"`
+	AmountDonatedSoFar float64    `gorm:"-"`
+	Account            Account    `gorm:"embedded;embeddedPrefix:account_"`
 }
diff --git a/src/myaktion/model/donation.go b/src/myaktion/model/donation.go
index e452f9660ca77d5a1107136ee53cdd2c320c173b..52d4922e0c965788297da2aa884e5c866b6709b5 100644
--- a/src/myaktion/model/donation.go
+++ b/src/myaktion/model/donation.go
@@ -1,16 +1,20 @@
 package model
 
+import "gorm.io/gorm"
+
 type Donation struct {
-	Amount           float64
-	DonorName        string
-	ReceiptRequested bool
-	Account          Account
-	Status           Status
+	gorm.Model
+	CampaignID       uint
+	Amount           float64 `gorm:"notNull;check:amount >= 1.0"`
+	DonorName        string  `gorm:"notNull;size:40"`
+	ReceiptRequested bool    `gorm:"notNull"`
+	Account          Account `gorm:"embedded;embeddedPrefix:account_"`
+	Status           Status  `gorm:"notNull;type:ENUM('TRANSFERRED','IN_PROCESS')"`
 }
 
 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 04115b69197748b1ebf29a6326b23b308e8269a5..901d8588d3dcaa4f4bb8bb25ec74d9585e968ace 100644
--- a/src/myaktion/service/campaign.go
+++ b/src/myaktion/service/campaign.go
@@ -5,6 +5,7 @@ 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"
 )
 
@@ -18,9 +19,10 @@ func init() {
 }
 
 func CreateCampaign(campaign *model.Campaign) error {
-	campaign.ID = actCampaignId
-	campaignStore[actCampaignId] = campaign
-	actCampaignId += 1
+	result := db.DB.Create(campaign)
+	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)
 	return nil
@@ -28,9 +30,12 @@ func CreateCampaign(campaign *model.Campaign) error {
 
 func GetCampaigns() ([]model.Campaign, error) {
 	var campaigns []model.Campaign
-	for _, campaign := range campaignStore {
-		campaigns = append(campaigns, *campaign)
+	result := db.DB.Preload("Donations").Find(&campaigns)
+	if result.Error != nil {
+		return nil, result.Error
 	}
+
+	log.Tracef("Retrieved: %v Campaigns", campaigns)
 	return campaigns, nil
 }
 
diff --git a/tests.txt b/tests.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a2985c2068df9f178f6049560f3fbf1840fa77a8
--- /dev/null
+++ b/tests.txt
@@ -0,0 +1,18 @@
+# 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
+
+
+# Get (all) campaigns
+curl localhost:8000/campaigns
+
+# Get (specified) campaign
+curl localhost:8000/campaigns/2
+
+# DeleteCampaign
+curl -X DELETE localhost:8000/campaigns/1
+
+# UpdateCampaign
+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
+curs -H "Content-Type: application/json" -d '{"amount": 12.23,"DonorName":"Stefan","ReceiptRequested":false}'
\ No newline at end of file