diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go
index 6205e87afc7b0f73b52d0fc9f7f1ab8e7571199e..f743696c15818c709b3d53910f3e11bd4935a3f7 100644
--- a/src/myaktion/service/campaign.go
+++ b/src/myaktion/service/campaign.go
@@ -1,23 +1,15 @@
 package service
 
 import (
-	"fmt"
+	"errors"
 
 	log "github.com/sirupsen/logrus"
+	"gorm.io/gorm"
 
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/db"
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/model"
 )
 
-var (
-	campaignStore map[uint]*model.Campaign
-	actCampaignId uint = 1
-)
-
-func init() {
-	campaignStore = make(map[uint]*model.Campaign)
-}
-
 func CreateCampaign(campaign *model.Campaign) error {
 	result := db.DB.Create(campaign)
 	if result.Error != nil {
@@ -39,9 +31,13 @@ func GetCampaigns() ([]model.Campaign, error) {
 }
 
 func GetCampaign(id uint) (*model.Campaign, error) {
-	campaign := campaignStore[id]
-	if campaign == nil {
-		return nil, fmt.Errorf("no campaign with ID %d", 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
@@ -49,25 +45,33 @@ func GetCampaign(id uint) (*model.Campaign, error) {
 
 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
+	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
 	}
-	delete(campaignStore, 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 ccd22a6b8b7ae2488f2602e2f05a70d0bd23afda..6f3c26e704d8647d4a76d61500914618e7d4e89e 100644
--- a/src/myaktion/service/donation.go
+++ b/src/myaktion/service/donation.go
@@ -3,17 +3,18 @@ package service
 import (
 	log "github.com/sirupsen/logrus"
 
+	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/db"
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/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)
 	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
 }