diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6fdcc99f4d3119fc3244604c18e85fc5e10caf36
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+# NoSQL Datenbank für My-Aktion
+
+Relationale-Datenbank (H2) ersetzen durch NoSQL-Datenbank (MongoDB). Anpassen von My-Aktion an die neue Datenbank.
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cde1dbc5c10327f8c691c8e438e44c8081e2a9a7
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,57 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.dpunkt</groupId>
+	<artifactId>my-aktion</artifactId>
+	<version>0.0.1</version>
+	<packaging>war</packaging>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.hibernate.ogm</groupId>
+                <artifactId>hibernate-ogm-bom</artifactId>
+                <version>5.4.1.Final</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+	<dependencies>
+		<dependency>
+			<groupId>jakarta.platform</groupId>
+			<artifactId>jakarta.jakartaee-api</artifactId>
+			<version>8.0.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.primefaces</groupId>
+			<artifactId>primefaces</artifactId>
+			<version>8.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate.ogm</groupId>
+			<artifactId>hibernate-ogm-mongodb</artifactId>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<finalName>my-aktion</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.wildfly.plugins</groupId>
+				<artifactId>wildfly-maven-plugin</artifactId>
+				<version>2.0.2.Final</version>
+			</plugin>
+		</plugins>
+	</build>
+	
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<failOnMissingWebXml>false</failOnMissingWebXml>
+	</properties>
+</project>
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java b/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java
new file mode 100644
index 0000000000000000000000000000000000000000..6151b3524ce4675e2507fff26039a4d9ca566cb2
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java
@@ -0,0 +1,113 @@
+package de.dpunkt.myaktion.controller;
+
+import java.io.Serializable;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.annotation.PostConstruct;
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.model.Donation.Status;
+import de.dpunkt.myaktion.services.DonationService;
+import de.dpunkt.myaktion.util.Log.FachLog;
+
+/**
+ * @author Julian
+ */
+@ViewScoped
+@Named
+public class DonateMoneyController implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = 5493038842003809106L;
+
+    //==============================================================================================
+
+    private String textColor = "000000";
+    
+    private String bgColor = "ffffff";
+    
+    private Long campaignId;
+    
+    private Donation donation;
+
+    //----------------------------------------------------------------------------------------------
+
+    @Inject
+    private FacesContext facesContext;
+    
+    @Inject @FachLog
+    private Logger logger;
+    
+    @Inject
+    private DonationService donationService;
+    
+    //----------------------------------------------------------------------------------------------
+
+    @PostConstruct
+    public void init() {
+        this.donation = new Donation();
+    }
+    
+    //----------------------------------------------------------------------------------------------
+
+    public Long getCampaignId() {
+        return campaignId;
+    }
+
+    public void setCampaignId(Long campaignId) {
+        this.campaignId = campaignId;
+    }
+
+    public Donation getDonation() {
+        return donation;
+    }
+
+    public void setDonation(Donation donation) {
+        this.donation = donation;
+    }
+
+    public String getTextColor() {
+        return textColor;
+    }
+
+    public void setTextColor(String textColor) {
+        this.textColor = textColor;
+    }
+
+    public String getBgColor() {
+        return bgColor;
+    }
+
+    public void setBgColor(String bgColor) {
+        this.bgColor = bgColor;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public String doDonation() {       
+        getDonation().setStatus(Status.IN_PROCESS);
+        donationService.addDonation(getCampaignId(), getDonation());
+        
+        final ResourceBundle resourceBundle =
+                facesContext.getApplication().getResourceBundle(facesContext, "msg");
+        
+        final String msg = resourceBundle.getString("donateMoney.thank_you");
+        facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null));
+        
+        init();
+        
+        logger.log(Level.INFO, "log.donateMoney.thank_you", new 
+                Object[]{getDonation().getDonorName(), getDonation().getAmount()});
+        
+        return Pages.DONATE_MONEY;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java b/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java
new file mode 100644
index 0000000000000000000000000000000000000000..84f09544a8ee70b7ccb6ec34fcd48cb3354819c7
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java
@@ -0,0 +1,53 @@
+package de.dpunkt.myaktion.controller;
+
+import java.io.Serializable;
+
+import javax.enterprise.event.Event;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import de.dpunkt.myaktion.data.CampaignProducer;
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.util.Events.Added;
+import de.dpunkt.myaktion.util.Events.Updated;
+
+/**
+ * @author Julian
+ */
+@ViewScoped
+@Named
+public class EditCampaignController implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = 2815796004558360299L;
+
+    //==============================================================================================
+
+    @Inject
+    private CampaignProducer campaignProducer;
+
+    @Inject @Added
+    private Event<Campaign> campaignAddEvent;
+
+    @Inject @Updated
+    private Event<Campaign> campaignUpdatedEvent;
+
+    //----------------------------------------------------------------------------------------------
+
+    public String doSave() {
+        if (campaignProducer.isAddMode()) {
+            campaignAddEvent.fire(campaignProducer.getSelectedCampaign());
+        } else {
+            campaignUpdatedEvent.fire(campaignProducer.getSelectedCampaign());
+        }
+
+        return Pages.LIST_CAMPAIGNS;
+    }
+
+    public String doCancel() {
+        return Pages.LIST_CAMPAIGNS;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java b/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad4942527109803a828768f1fa5a7f549b4bdd9d
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java
@@ -0,0 +1,75 @@
+package de.dpunkt.myaktion.controller;
+
+import java.io.Serializable;
+
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.servlet.http.HttpServletRequest;
+
+import de.dpunkt.myaktion.data.CampaignProducer;
+
+/**
+ * @author Julian
+ */
+@ViewScoped
+@Named
+public class EditDonationFormController implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = -4210085664588144340L;
+
+    //==============================================================================================
+
+    private String textColor = "000000";
+
+    private String bgColor = "ffffff";
+
+    @Inject
+    private CampaignProducer campaignProducer;
+
+    @Inject
+    private HttpServletRequest req;
+
+    //----------------------------------------------------------------------------------------------
+
+    public String getTextColor() {
+        return textColor;
+    }
+
+    public void setTextColor(String textColor) {
+        this.textColor = textColor;
+    }
+
+    public String getBgColor() {
+        return bgColor;
+    }
+
+    public void setBgColor(String bgColor) {
+        this.bgColor = bgColor;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public String doOk() {
+        return Pages.LIST_CAMPAIGNS;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public String getUrl() {
+        return getAppUrl() + "/" + Pages.DONATE_MONEY + ".jsf" + "?bgColor=" + bgColor
+                + "&textColor=" + textColor + "&campaignId="
+                + campaignProducer.getSelectedCampaign().getId();
+    }
+
+    private String getAppUrl() {
+        String scheme = req.getScheme();
+        String serverName = req.getServerName();
+        int serverPort = req.getServerPort();
+        String contextPath = req.getContextPath();
+        return scheme + "://" + serverName + ":" + serverPort + contextPath;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java b/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8c390c40303a2c31bd4b7eac073683c146aeccb
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java
@@ -0,0 +1,73 @@
+package de.dpunkt.myaktion.controller;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.enterprise.event.Event;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import de.dpunkt.myaktion.data.CampaignProducer;
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.services.DonationService;
+import de.dpunkt.myaktion.util.Events.Deleted;
+
+@ViewScoped
+@Named
+public class ListCampaignsController implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = 8693277383648025822L;
+
+    //==============================================================================================
+
+    @Inject
+    private CampaignProducer campaignProducer;
+
+    private Campaign campaignToDelete;
+
+    @Inject
+    @Deleted
+    private Event<Campaign> campaignDeleteEvent;
+
+    @Inject
+    private DonationService donationService;
+
+    //----------------------------------------------------------------------------------------------
+
+    public String doAddCampaign() {
+        campaignProducer.prepareAddCampaign();
+        return Pages.EDIT_CAMPAIGN;
+    }
+
+    public String doEditCampaign(Campaign campaign) {
+        campaignProducer.prepareEditCampaign(campaign);
+        return Pages.EDIT_CAMPAIGN;
+    }
+
+    public String doEditDonationForm(Campaign campaign) {
+        campaignProducer.setSelectedCampaign(campaign);
+        return Pages.EDIT_DONATION_FORM;
+    }
+
+    public String doListDonations(Campaign campaign) {
+        final List<Donation> donations = donationService.getDonationList(campaign.getId());
+        campaign.setDonations(donations);
+        
+        campaignProducer.setSelectedCampaign(campaign);
+        return Pages.LIST_DONATIONS;
+    }
+
+    public void doDeleteCampaign(Campaign campaign) {
+        this.campaignToDelete = campaign;
+        System.out.println("Aktion zum löschen vorgemerkt");
+    }
+
+    public void commitDeleteCampaign() {
+        campaignDeleteEvent.fire(campaignToDelete);
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java b/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..da4c0a1465122e1775b48d800fb6fd095480717c
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java
@@ -0,0 +1,25 @@
+package de.dpunkt.myaktion.controller;
+
+import java.io.Serializable;
+
+import javax.faces.view.ViewScoped;
+import javax.inject.Named;
+
+/**
+ * @author Julian
+ */
+@ViewScoped
+@Named
+public class ListDonationsController implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = 437878972432L;
+
+    //==============================================================================================
+
+    public String doOk() {
+        return Pages.LIST_CAMPAIGNS;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/controller/Pages.java b/src/main/java/de/dpunkt/myaktion/controller/Pages.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ee13f283664dd6e6e13acf42473dc3f4f88b346
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/controller/Pages.java
@@ -0,0 +1,20 @@
+package de.dpunkt.myaktion.controller;
+
+/**
+ * @author Julian
+ */
+public class Pages {
+    //----------------------------------------------------------------------------------------------
+
+    public static final String LIST_CAMPAIGNS = "/organizer/listCampaigns";
+    
+    public static final String EDIT_CAMPAIGN = "/organizer/editCampaign";
+    
+    public static final String EDIT_DONATION_FORM = "/organizer/editDonationForm";
+    
+    public static final String LIST_DONATIONS = "/organizer/listDonations";
+    
+    public static final String DONATE_MONEY = "donateMoney";
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java b/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java
new file mode 100644
index 0000000000000000000000000000000000000000..362c05be3e822650aee7eeadd8bb032152002905
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java
@@ -0,0 +1,72 @@
+package de.dpunkt.myaktion.data;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.services.CampaignService;
+import de.dpunkt.myaktion.util.Events.Added;
+import de.dpunkt.myaktion.util.Events.Deleted;
+import de.dpunkt.myaktion.util.Events.Updated;
+import de.dpunkt.myaktion.util.Log.TecLog;
+
+/**
+ * @author Julian
+ */
+@RequestScoped
+public class CampaignListProducer {
+    //----------------------------------------------------------------------------------------------
+
+    private List<Campaign> campaigns;
+
+    @Inject
+    @TecLog
+    private Logger logger;
+
+    //----------------------------------------------------------------------------------------------
+
+    @Inject
+    private CampaignService campaignService;
+
+    @PostConstruct
+    public void init() {
+        campaigns = campaignService.getAllCampaigns();
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @Produces
+    @Named
+    public List<Campaign> getCampaigns() {
+        return campaigns;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public void onCampaignAdded(@Observes @Added Campaign campaign) {
+        campaignService.addCampaign(campaign);
+        init();
+    }
+
+    public void onCampaignDeleted(@Observes @Deleted Campaign campaign) {
+        campaignService.deleteCampaign(campaign);
+        init();
+    }
+
+    public void onCampaignUpdated(@Observes @Updated Campaign campaign) {
+        campaignService.updateCampaign(campaign);
+        init();
+
+        logger.log(Level.INFO, "Updated campaign with id " + campaign.getId());
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java b/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e980ab5880764a1d0f0097db88af94e4141d58e
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java
@@ -0,0 +1,63 @@
+package de.dpunkt.myaktion.data;
+
+import java.io.Serializable;
+
+import javax.enterprise.context.SessionScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+
+import de.dpunkt.myaktion.model.Campaign;
+
+/**
+ * @author Julian
+ */
+@SessionScoped
+public class CampaignProducer implements Serializable {
+    //----------------------------------------------------------------------------------------------
+
+    private static final long serialVersionUID = -1828660647917534556L;
+
+    //==============================================================================================
+
+    private enum Mode {
+        EDIT, ADD
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    private Campaign campaign;
+    
+    private Mode mode;
+
+    //----------------------------------------------------------------------------------------------
+
+    @Produces
+    @Named
+    public Campaign getSelectedCampaign() {
+        return campaign;
+    }
+
+    public void setSelectedCampaign(Campaign campaign) {
+        this.campaign = campaign;
+    }
+
+    //----------------------------------------------------------------------------------------------
+    
+    @Produces
+    @Named
+    public boolean isAddMode() {
+        return mode == Mode.ADD;
+    }
+    
+    public void prepareAddCampaign() {
+        this.campaign = new Campaign();
+        this.mode = Mode.ADD;
+    }
+
+    public void prepareEditCampaign(Campaign campaign) {
+        this.campaign = campaign;
+        this.mode = Mode.EDIT;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/model/Account.java b/src/main/java/de/dpunkt/myaktion/model/Account.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f41d80139b0116953c59c3af88a57f24498ef9b
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/Account.java
@@ -0,0 +1,68 @@
+package de.dpunkt.myaktion.model;
+
+import javax.persistence.Embeddable;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * @author Julian
+ */
+@Embeddable
+public class Account extends DateEntity {
+    //----------------------------------------------------------------------------------------------
+
+    @NotNull
+    @Size(min = 5, max = 60, message = "{account.name.size}")
+    private String name;
+    
+    @NotNull
+    @Size(min = 4, max = 40, message = "{account.nameOfBank.size}")
+    private String nameOfBank;
+    
+    @NotNull
+    @Pattern(regexp = "[A-Z]{2}[0-9]{2}[A-Z0-9]{12,30}", message = "{account.iban.pattern}")
+    private String iban;    
+    
+    //----------------------------------------------------------------------------------------------
+
+    public Account() {
+        this(null, null, null);
+    }
+
+    public Account(String name, String nameOfBank, String iban) {
+        super();
+        
+        this.name = name;
+        this.nameOfBank = nameOfBank;
+        this.iban = iban;
+    }
+    
+    //----------------------------------------------------------------------------------------------
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNameOfBank() {
+        return nameOfBank;
+    }
+
+    public void setNameOfBank(String nameOfBank) {
+        this.nameOfBank = nameOfBank;
+    }
+
+    public String getIban() {
+        return iban;
+    }
+
+    public void setIban(String iban) {
+        this.iban = iban;
+    }
+    
+    //----------------------------------------------------------------------------------------------
+}
diff --git a/src/main/java/de/dpunkt/myaktion/model/Campaign.java b/src/main/java/de/dpunkt/myaktion/model/Campaign.java
new file mode 100644
index 0000000000000000000000000000000000000000..442777b7093fc68000e5de8085ba885938c7ad24
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/Campaign.java
@@ -0,0 +1,151 @@
+package de.dpunkt.myaktion.model;
+
+import java.util.List;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Julian
+ */
+@NamedQueries({
+        @NamedQuery(name = Campaign.findByOrganizer,
+                query = "SELECT c FROM Campaign c WHERE c.organizer = :organizer ORDER BY c.name"),
+        @NamedQuery(name = Campaign.findAll, 
+                query = "SELECT a FROM Campaign a ORDER BY a.name"),
+        @NamedQuery(name = Campaign.getAmountDonatedSoFar,
+                query = "SELECT SUM(d.amount) FROM Donation d WHERE d.campaign = :campaign") })
+@XmlRootElement
+@Entity
+@EntityListeners(EntityCreationListener.class)
+public class Campaign extends DateEntity {
+    //----------------------------------------------------------------------------------------------
+
+    public static final String findByOrganizer = "Campaign.findByOrganizer";
+
+    public static final String findAll = "Campaign.findAll";
+
+    public static final String getAmountDonatedSoFar = "Campaign.getAmountDonatedSoFar";
+
+    //==============================================================================================
+
+    @GeneratedValue
+    @Id
+    private Long id;
+
+    @NotNull
+    @Size(min = 4, max = 30, message = "{campaign.name.size}")
+    private String name;
+
+    @NotNull(message = "{campaign.targetAmount.notNull}")
+    @DecimalMin(value = "10.00", message = "{campaign.targetAmount.decimalMin}")
+    private Double targetAmount;
+
+    @NotNull(message = "{campaign.donationMinimum.notNull}")
+    @DecimalMin(value = "1.00", message = "{campaign.donationMinimum.decimalMin}")
+    private Double donationMinimum;
+
+    @Transient
+    private Double amountDonatedSoFar;
+
+    @Embedded
+    @AttributeOverrides({
+            @AttributeOverride(name = "name", column = @Column(name = "accountName")) })
+    private Account account;
+
+    @OneToMany(mappedBy = "campaign", cascade = CascadeType.REMOVE)
+    private List<Donation> donations;
+
+    @ManyToOne
+    private Organizer organizer;
+
+    //----------------------------------------------------------------------------------------------
+
+    public Campaign() {
+        account = new Account();
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getTargetAmount() {
+        return targetAmount;
+    }
+
+    public void setTargetAmount(Double targetAmount) {
+        this.targetAmount = targetAmount;
+    }
+
+    public Double getDonationMinimum() {
+        return donationMinimum;
+    }
+
+    public void setDonationMinimum(Double donationMinimum) {
+        this.donationMinimum = donationMinimum;
+    }
+
+    public Double getAmountDonatedSoFar() {
+        return amountDonatedSoFar;
+    }
+
+    public void setAmountDonatedSoFar(Double amountDonatedSoFar) {
+        this.amountDonatedSoFar = amountDonatedSoFar;
+    }
+
+    public Account getAccount() {
+        return account;
+    }
+
+    public void setAccount(Account account) {
+        this.account = account;
+    }
+
+    public List<Donation> getDonations() {
+        return donations;
+    }
+
+    public void setDonations(List<Donation> donations) {
+        this.donations = donations;
+    }
+
+    public Organizer getOrganizer() {
+        return organizer;
+    }
+
+    public void setOrganizer(Organizer organizer) {
+        this.organizer = organizer;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
diff --git a/src/main/java/de/dpunkt/myaktion/model/DateEntity.java b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee669af23f1b6700d97d3e2d118fb7ca68783f71
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java
@@ -0,0 +1,21 @@
+package de.dpunkt.myaktion.model;
+
+import java.util.Date;
+
+/**
+ * @author Julian
+ *
+ */
+public class DateEntity {
+
+    private Date createdAt;
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+    
+}
diff --git a/src/main/java/de/dpunkt/myaktion/model/Donation.java b/src/main/java/de/dpunkt/myaktion/model/Donation.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a719131856b4a207a6952298e39dd307b98d701
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/Donation.java
@@ -0,0 +1,124 @@
+package de.dpunkt.myaktion.model;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+/**
+ * @author Julian
+ */
+@Entity
+@NamedQueries({ @NamedQuery(name = Donation.findByStatus,
+        query = "SELECT d FROM Donation d WHERE d.status = :status") })
+public class Donation extends DateEntity {
+    //----------------------------------------------------------------------------------------------
+
+    public static final String findByStatus = "Donation.findByStatus";
+
+    //==============================================================================================
+
+    @GeneratedValue
+    @Id
+    private Long id;
+
+    @NotNull(message = "{donation.amount.notNull}")
+    @DecimalMin(value = "1.00", message = "{donation.amount.decimalMin}")
+    private Double amount;
+
+    @NotNull
+    @Size(min = 5, max = 40, message = "{donation.donorName.size}")
+    private String donorName;
+
+    @NotNull
+    private Boolean receiptRequested;
+
+    @NotNull
+    private Status status;
+
+    @NotNull
+    @Embedded
+    private Account account;
+
+    @NotNull
+    @ManyToOne
+    private Campaign campaign;
+
+    //----------------------------------------------------------------------------------------------
+
+    public enum Status {
+        TRANSFERRED, IN_PROCESS;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public Donation() {
+        this.account = new Account();
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getDonorName() {
+        return donorName;
+    }
+
+    public void setDonorName(String donorName) {
+        this.donorName = donorName;
+    }
+
+    public Boolean getReceiptRequested() {
+        return receiptRequested;
+    }
+
+    public void setReceiptRequested(Boolean receiptRequested) {
+        this.receiptRequested = receiptRequested;
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
+    public Account getAccount() {
+        return account;
+    }
+
+    public void setAccount(Account account) {
+        this.account = account;
+    }
+
+    public Campaign getCampaign() {
+        return campaign;
+    }
+
+    public void setCampaign(Campaign campaign) {
+        this.campaign = campaign;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
diff --git a/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java b/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b97facd59ab3c6903749e597e435a023dc48d27
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java
@@ -0,0 +1,13 @@
+package de.dpunkt.myaktion.model;
+
+import java.util.Date;
+
+import javax.persistence.PrePersist;
+
+public class EntityCreationListener {
+    @PrePersist
+    void onPreUpdate(Object entity) {
+        DateEntity dateEntity = (DateEntity) entity;
+        dateEntity.setCreatedAt(new Date());
+    }
+}
diff --git a/src/main/java/de/dpunkt/myaktion/model/Organizer.java b/src/main/java/de/dpunkt/myaktion/model/Organizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0cbbc664937d0b8abbb5dbb45e5014c38ff8dd2
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/model/Organizer.java
@@ -0,0 +1,86 @@
+package de.dpunkt.myaktion.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * @author Julian
+ */
+@NamedQueries({ @NamedQuery(name = Organizer.findByEmail,
+        query = "SELECT o FROM Organizer o WHERE o.email = :email") })
+@Entity
+public class Organizer extends DateEntity {
+    //----------------------------------------------------------------------------------------------
+
+    public static final String findByEmail = "Organizer.findByEmail";
+
+    //==============================================================================================
+
+    @GeneratedValue
+    @Id
+    private Long id;
+    
+    @NotNull
+    @Size(min = 3, max = 20, message = "{organizer.firstName.size}")
+    private String firstName;
+
+    @NotNull
+    @Size(min = 3, max = 30, message = "{organizer.lastName.size}")
+    private String lastName;
+
+    @Pattern(regexp = ".+@.+", message = "{organizer.email.pattern}")
+    private String email;
+
+    @NotNull
+    private String password;
+
+    //----------------------------------------------------------------------------------------------
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java b/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..e549dcc7e4089d34ffaab126be6e8eb6b5d8e105
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java
@@ -0,0 +1,80 @@
+package de.dpunkt.myaktion.resources;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.services.CampaignService;
+
+@Path("/organizer/campaign")
+public class CampaignResource {
+    //----------------------------------------------------------------------------------------------
+
+    @Inject
+    private CampaignService campaignService;
+
+    //----------------------------------------------------------------------------------------------
+
+    @GET
+    @Path("/list")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    public List<Campaign> getAllCampaigns() {
+        List<Campaign> allCampaigns = campaignService.getAllCampaigns();
+        
+        allCampaigns.forEach(campaign -> {
+            campaign.setDonations(null);
+            campaign.setOrganizer(null);
+        });
+        
+        return allCampaigns;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @DELETE
+    @Path("/{campaignId}")
+    public void deleteAktion(@PathParam(value = "campaignId") Long campaignId) {
+        campaignService.deleteCampaign(campaignId);
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Campaign addCampaign(Campaign campaign) {
+        return campaignService.addCampaign(campaign);
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @PUT
+    @Path("/{campaignId}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Campaign updateCampaign(@PathParam(value = "campaignId") Long campaignId,
+            Campaign newCampaign) {
+        Campaign campaign = campaignService.getCampaign(campaignId);
+        campaign.setName(newCampaign.getName());
+        campaign.setDonationMinimum(newCampaign.getDonationMinimum());
+        campaign.setTargetAmount(newCampaign.getTargetAmount());
+
+        newCampaign = campaignService.updateCampaign(campaign);
+        newCampaign.setDonations(null);
+        newCampaign.setOrganizer(null);
+
+        return newCampaign;
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java b/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..d54a3c724e55679d41ac2001614f3244493777e2
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java
@@ -0,0 +1,84 @@
+package de.dpunkt.myaktion.resources;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import de.dpunkt.myaktion.model.Account;
+import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.model.Donation.Status;
+import de.dpunkt.myaktion.services.DonationService;
+import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException;
+
+@Path("/")
+public class DonationResource {
+    //----------------------------------------------------------------------------------------------
+
+    @Inject
+    private DonationService donationService;
+
+    //----------------------------------------------------------------------------------------------
+
+    @GET
+    @Path("/organizer/donation/list/{campaignId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public List<Donation> getDonationList(@PathParam(value = "campaignId") Long campaignId) {
+        List<Donation> donations = donationService.getDonationList(campaignId);
+        donations.forEach(donation -> donation.setCampaign(null));
+
+        return donations;
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @POST
+    @Path("/donation/{campaignId}")
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public void addDonation(@PathParam(value = "campaignId") Long campaignId,
+            @FormParam(value = "donorName") String donorName,
+            @FormParam(value = "amount") Double amount, @FormParam(value = "iban") String iban,
+            @FormParam(value = "nameOfBank") String nameOfBank,
+            @FormParam(value = "receiptRequested") Boolean receiptRequested) {
+        Donation donation = new Donation();
+        donation.setDonorName(donorName);
+        donation.setAmount(amount);
+
+        Account account = new Account();
+        account.setIban(iban);
+        account.setName(donorName);
+        account.setNameOfBank(nameOfBank);
+
+        donation.setAccount(account);
+        donation.setReceiptRequested(receiptRequested);
+        donation.setStatus(Status.IN_PROCESS);
+
+        donationService.addDonation(campaignId, donation);
+    }
+
+    //----------------------------------------------------------------------------------------------
+
+    @GET
+    @Path("/donation/list/{campaignId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getDonationListPublic(@PathParam(value = "campaignId") Long campaignId) {
+        List<Donation> donations;
+        try {
+            donations = donationService.getDonationListPublic(campaignId);
+            
+            return Response.ok(donations).build();
+        } catch (ObjectNotFoundException e) {
+            return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build();
+        }
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
diff --git a/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6bc8df234a44dd7a84e5c8df36df2597ab5aab7
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java
@@ -0,0 +1,21 @@
+package de.dpunkt.myaktion.scheduler;
+
+import javax.ejb.Schedule;
+import javax.ejb.Singleton;
+import javax.inject.Inject;
+
+import de.dpunkt.myaktion.services.DonationService;
+
+/**
+ * @author Julian
+ */
+@Singleton
+public class SchedulerBean {
+    @Inject
+    private DonationService donationService;
+
+    @Schedule(hour = "*", minute = "*/5", persistent = false)
+    public void doTransferDonations() {
+        donationService.transferDonations();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/CampaignService.java b/src/main/java/de/dpunkt/myaktion/services/CampaignService.java
new file mode 100644
index 0000000000000000000000000000000000000000..69b38e0c865c92afac3e64761ecd5f4ddb6af625
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/services/CampaignService.java
@@ -0,0 +1,26 @@
+package de.dpunkt.myaktion.services;
+
+import java.util.List;
+
+import de.dpunkt.myaktion.model.Campaign;
+
+/**
+ * @author Julian
+ */
+public interface CampaignService {
+    //----------------------------------------------------------------------------------------------
+
+    List<Campaign> getAllCampaigns();
+
+    Campaign addCampaign(Campaign campaign);
+    
+    void deleteCampaign(Campaign campaign);
+
+    void deleteCampaign(Long campaignId);
+    
+    Campaign updateCampaign(Campaign campaign);
+    
+    Campaign getCampaign(Long campaignId);
+    
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6ff8513df08b13c5944061a4ec684242418c240
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java
@@ -0,0 +1,124 @@
+package de.dpunkt.myaktion.services;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.annotation.Resource;
+import javax.annotation.security.RolesAllowed;
+import javax.ejb.SessionContext;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+
+import org.hibernate.ogm.OgmSession;
+
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.model.Organizer;
+import de.dpunkt.myaktion.util.Log.TecLog;
+
+/**
+ * @author Julian
+ */
+@RolesAllowed("Organizer")
+@Stateless
+public class CampaignServiceBean implements CampaignService {
+    // ----------------------------------------------------------------------------------------------
+
+    @Inject
+    @TecLog
+    private Logger logger;
+
+    @Inject
+    EntityManager entityManager;
+
+    @Resource
+    private SessionContext sessionContext;
+
+    // ----------------------------------------------------------------------------------------------
+
+    @Override
+    public List<Campaign> getAllCampaigns() {
+        TypedQuery<Campaign> query =
+                entityManager.createNamedQuery(Campaign.findByOrganizer, Campaign.class);
+        query.setParameter("organizer", getLoggedinOrganizer());
+
+        List<Campaign> campaigns = query.getResultList();
+
+        for (Campaign campaign : campaigns) {
+            campaign.setAmountDonatedSoFar(getAmountDonatedSoFar(campaign));
+        }
+
+        logger.log(Level.INFO,
+                "Loaded all campaign entities with query " + Campaign.findByOrganizer);
+
+        return campaigns;
+    }
+
+    // ----------------------------------------------------------------------------------------------
+
+    @Override
+    public Campaign addCampaign(Campaign campaign) {
+        Organizer organizer = getLoggedinOrganizer();
+
+        campaign.setOrganizer(organizer);
+        entityManager.persist(campaign);
+
+        return campaign;
+    }
+
+    // ----------------------------------------------------------------------------------------------
+
+    @Override
+    public Campaign updateCampaign(Campaign campaign) {
+        return entityManager.merge(campaign);
+    }
+
+    // ----------------------------------------------------------------------------------------------
+
+    @Override
+    public void deleteCampaign(Campaign campaign) {
+        Campaign managedCampaign = entityManager.find(Campaign.class, campaign.getId());
+        entityManager.remove(managedCampaign);
+    }
+
+    @Override
+    public void deleteCampaign(Long campaignId) {
+        Campaign managedCampaign = getCampaign(campaignId);
+        entityManager.remove(managedCampaign);
+    }
+
+    @Override
+    public Campaign getCampaign(Long campaignId) {
+        Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
+
+        return managedCampaign;
+    }
+
+    // ----------------------------------------------------------------------------------------------
+
+    private Double getAmountDonatedSoFar(Campaign campaign) {
+        OgmSession session = entityManager.unwrap(OgmSession.class);
+
+        Double result = session.createNamedQuery(Campaign.getAmountDonatedSoFar, Double.class)
+                .setParameter("campaign", campaign).uniqueResult();
+        if (result == null)
+            result = 0d;
+
+        return result;
+    }
+
+    // ----------------------------------------------------------------------------------------------
+
+    private Organizer getLoggedinOrganizer() {
+        String organizerEmail = sessionContext.getCallerPrincipal().getName();        
+        
+        Organizer organizer = entityManager.createNamedQuery(Organizer.findByEmail, Organizer.class)
+                .setParameter("email", organizerEmail).getSingleResult();
+        
+        return organizer;
+    }
+
+    // ----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationService.java b/src/main/java/de/dpunkt/myaktion/services/DonationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3bf753553a1086b39afd174729b72764eef770b0
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/services/DonationService.java
@@ -0,0 +1,23 @@
+package de.dpunkt.myaktion.services;
+
+import java.util.List;
+
+import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException;
+
+/**
+ * @author Julian
+ */
+public interface DonationService {
+    //----------------------------------------------------------------------------------------------
+
+    List<Donation> getDonationList(Long campaignId);
+
+    void addDonation(Long campaignId, Donation donation);
+
+    void transferDonations();
+
+    List<Donation> getDonationListPublic(Long campaignId) throws ObjectNotFoundException;
+
+    //----------------------------------------------------------------------------------------------
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..c86c0e0e5f40e5dcd4ef151f38996e808516b9cb
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java
@@ -0,0 +1,94 @@
+package de.dpunkt.myaktion.services;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import javax.annotation.security.PermitAll;
+import javax.annotation.security.RolesAllowed;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+
+import de.dpunkt.myaktion.model.Campaign;
+import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.model.Donation.Status;
+import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException;
+import de.dpunkt.myaktion.util.Log.TecLog;
+
+/**
+ * @author Julian
+ */
+@Stateless
+public class DonationServiceBean implements DonationService {
+    //----------------------------------------------------------------------------------------------
+
+    @Inject
+    EntityManager entityManager;
+
+    @Inject
+    @TecLog
+    private Logger logger;
+
+    //----------------------------------------------------------------------------------------------
+
+    @RolesAllowed("Organizer")
+    @Override
+    public List<Donation> getDonationList(Long campaignId) {
+        Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
+        List<Donation> donations = managedCampaign.getDonations();
+
+        donations.size(); // To avoid Lazy loading exception
+
+        return donations;
+    }
+
+    @PermitAll
+    @Override
+    public void addDonation(Long campaignId, Donation donation) {
+        Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
+        donation.setCampaign(managedCampaign);
+
+        entityManager.persist(donation);
+    }
+
+    @PermitAll
+    @Override
+    public void transferDonations() {
+        logger.log(Level.INFO, "log.transferDonation.start");
+
+        TypedQuery<Donation> query =
+                entityManager.createNamedQuery(Donation.findByStatus, Donation.class);
+        query.setParameter("status", Status.IN_PROCESS);
+
+        List<Donation> donations = query.getResultList();
+        donations.forEach(donation -> donation.setStatus(Status.TRANSFERRED));
+
+        logger.log(Level.INFO, "log.transferDonation.done", new Object[] { donations.size() });
+    }
+
+    @PermitAll
+    @Override
+    public List<Donation> getDonationListPublic(Long campaignId) throws ObjectNotFoundException {
+        Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
+        if (managedCampaign == null) {
+            throw new ObjectNotFoundException();
+        }
+
+        List<Donation> donations = managedCampaign.getDonations();
+        final Function<Donation, Donation> donationFilter = donation -> {
+            Donation filtered = new Donation();
+            filtered.setAmount(donation.getAmount());
+            filtered.setDonorName(donation.getDonorName());
+
+            return filtered;
+        };
+
+        return donations.stream().map(donationFilter).collect(Collectors.toList());
+    }
+
+    //----------------------------------------------------------------------------------------------
+}
diff --git a/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java b/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java
new file mode 100644
index 0000000000000000000000000000000000000000..31501a27b4d82dbbacec82ddc78fbeff055a5005
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java
@@ -0,0 +1,5 @@
+package de.dpunkt.myaktion.services.exceptions;
+
+public class ObjectNotFoundException extends Exception {
+    private static final long serialVersionUID = 879959260339550219L;
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/util/Events.java b/src/main/java/de/dpunkt/myaktion/util/Events.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e3f2f44570ca24e76d4d4f54f183d6b35ec2021
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/util/Events.java
@@ -0,0 +1,30 @@
+package de.dpunkt.myaktion.util;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ * @author Julian
+ */
+public class Events {
+    @Qualifier
+    @Target({ FIELD, PARAMETER })
+    @Retention(RUNTIME)
+    public @interface Added { }
+
+    @Qualifier
+    @Target({ FIELD, PARAMETER })
+    @Retention(RUNTIME)
+    public @interface Deleted { }
+
+    @Qualifier
+    @Target({ FIELD, PARAMETER })
+    @Retention(RUNTIME)
+    public @interface Updated { }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/util/Log.java b/src/main/java/de/dpunkt/myaktion/util/Log.java
new file mode 100644
index 0000000000000000000000000000000000000000..4853c7089aa7a8a377a6eb469985e1b472b4c847
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/util/Log.java
@@ -0,0 +1,26 @@
+package de.dpunkt.myaktion.util;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ * @author Julian
+ */
+public class Log {
+    @Qualifier
+    @Target({ FIELD, PARAMETER, METHOD })
+    @Retention(RUNTIME)
+    public @interface FachLog { }
+
+    @Qualifier
+    @Target({ FIELD, PARAMETER, METHOD })
+    @Retention(RUNTIME)
+    public @interface TecLog { }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/util/Resources.java b/src/main/java/de/dpunkt/myaktion/util/Resources.java
new file mode 100644
index 0000000000000000000000000000000000000000..bdd90ef498631219d01991c4604d541fa12a94d0
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/util/Resources.java
@@ -0,0 +1,42 @@
+package de.dpunkt.myaktion.util;
+
+import java.util.logging.Logger;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.faces.context.FacesContext;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import de.dpunkt.myaktion.util.Log.FachLog;
+import de.dpunkt.myaktion.util.Log.TecLog;
+
+/**
+ * @author Julian
+ */
+@Dependent
+public class Resources {
+    @Produces
+    @PersistenceContext
+    private EntityManager em;
+    
+    @Produces @FachLog
+    public Logger produceFachLog(InjectionPoint injectionPoint) {
+        return Logger.getLogger(
+                "FachLog: " + injectionPoint.getMember().getDeclaringClass().getName(), "messages");
+    }
+
+    @Produces @TecLog
+    public Logger produceTecLog(InjectionPoint injectionPoint) {
+        return Logger.getLogger(
+                "TecLog: " + injectionPoint.getMember().getDeclaringClass().getName(), "messages");
+    }
+
+    @Produces
+    @RequestScoped
+    public FacesContext produceFacesContext() {
+        return FacesContext.getCurrentInstance();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java b/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb79c7a7490c7b989b1941b37813fc9ece158afc
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java
@@ -0,0 +1,35 @@
+package de.dpunkt.myaktion.util;
+
+import javax.annotation.Resource;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+import javax.transaction.UserTransaction;
+
+/**
+ * @author Julian
+ */
+public class TransactionInterceptor {
+    @Resource
+    private UserTransaction transaction;
+
+    @AroundInvoke
+    public Object doTransaction(InvocationContext ctx) throws Exception {
+        try {
+            transaction.begin();
+            
+            Object ret = ctx.proceed();
+            
+            transaction.commit();
+            
+            return ret;
+        } catch (Exception e) {
+            try {
+                transaction.rollback();
+                System.err.println("addCampaign – Transaktion wurde zurückgerollt.");
+            } catch (Exception e2) {
+                System.err.println("addCampaign – Fehler beim Zurückrollen von Transaktion.");
+            }
+            throw e;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..502f486e102318c514a1bff0296caf7efaa9fd9d
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
+	version="2.1">
+
+	<persistence-unit name="primary"
+		transaction-type="JTA">
+		<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
+
+		<class>de.dpunkt.myaktion.model.Account</class>
+		<class>de.dpunkt.myaktion.model.Campaign</class>
+		<class>de.dpunkt.myaktion.model.Donation</class>
+		<class>de.dpunkt.myaktion.model.Organizer</class>
+		<exclude-unlisted-classes>true</exclude-unlisted-classes>
+
+		<properties>
+			<property name="hibernate.transaction.jta.platform"
+				value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
+			<property name="hibernate.ogm.datastore.database"
+				value="my-aktion" />
+			<property name="hibernate.ogm.datastore.host"
+				value="localhost" />
+			<property name="hibernate.ogm.datastore.provider"
+				value="MONGODB" />
+		</properties>
+	</persistence-unit>
+</persistence>
\ No newline at end of file
diff --git a/src/main/resources/ValidationMessages_de.properties b/src/main/resources/ValidationMessages_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..334b1b301f6ce1fe0fceeeb008bdcceeb80df160
--- /dev/null
+++ b/src/main/resources/ValidationMessages_de.properties
@@ -0,0 +1,22 @@
+# resource file for bean validation
+# campaign model
+campaign.name.size=Der Name einer Aktion muss min. {min} und darf max. {max} Zeichen lang sein.
+campaign.targetAmount.notNull=Bitte ein Spendenziel angeben.
+campaign.targetAmount.decimalMin=Das Spendenziel für die Aktion muss min. {value} Euro sein.
+campaign.donationMinimum.notNull=Bitte einen Spendenbetrag angeben.
+campaign.donationMinimum.decimalMin=Der Spendenbetrag muss min. {value} Euro sein.
+
+# donation model
+donation.amount.notNull=Bitte einen Spendenbetrag angeben.
+donation.amount.decimalMin=Der Spendenbetrag muss min. {value} Euro sein.
+donation.donorName.size=Der Name eines Spenders muss min. {min} und darf max. {max} Zeichen lang sein.
+
+# account model
+account.name.size=Der Name des Besitzers eines Kontos muss min. {min} und darf max. {max} Zeichen lang sein.
+account.nameOfBank.size=Der Name einer Bank muss min. {min} und darf max. {max} Zeichen lang sein.
+account.iban.pattern=Eine IBAN besteht aus zwei Buchstaben, gefolgt von zwei Ziffern und 12 bis 30 alphanumerischen Zeichen.
+
+# organizer model
+organizer.firstName.size=Der Vorname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein.
+organizer.lastName.size=Der Nachname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein.
+organizer.email.pattern=Bitte eine valide E-Mail-Adresse angeben.
\ No newline at end of file
diff --git a/src/main/resources/ValidationMessages_en.properties b/src/main/resources/ValidationMessages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0bd4fe3a4ebb6fa622eb31dac2704ac1cb079f84
--- /dev/null
+++ b/src/main/resources/ValidationMessages_en.properties
@@ -0,0 +1,22 @@
+# resource file for bean validation
+# campaign model
+campaign.name.size=The name of a campaign must be between {min} and {max} characters long.
+campaign.targetAmount.notNull=Please specify a target amount.
+campaign.targetAmount.decimalMin=The target amount for the campaign must be at least {value} Euro.
+campaign.donationMinimum.notNull=Please specify a donation minimum.
+campaign.donationMinimum.decimalMin=The donation minimum must be at least {value} Euro.
+
+# donation model
+donation.amount.notNull=Please specify a donation amount.
+donation.amount.decimalMin=The donation amount must be at least {value} Euro.
+donation.donorName.size=The donor's name must be between {min} and {max} characters long.
+
+# account model
+account.name.size=The name of the account owner must be between {min} and {max} characters long.
+account.nameOfBank.size=The name of a bank must be between {min} and {max} characters long.
+account.iban.pattern=An IBAN contains of two letters, followed by two digits and between 12 and 30 alphanumeric characters.
+
+# organizer model
+organizer.firstName.size=The first name of an organizer must be between {min} and {max} characters long.
+organizer.lastName.size=The last name of an organizer must be between {min} and {max} characters long.
+organizer.email.pattern=Please enter a valid email address.
\ No newline at end of file
diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1059e8d85b74e9ed7f11baa8ba041ae483c80b4f
--- /dev/null
+++ b/src/main/resources/messages_de.properties
@@ -0,0 +1,74 @@
+# index.xhtml
+welcome.title= Workshop Java EE 7
+welcome.text=Java EE 7: Willkommen zu unserem Workshop!
+
+# listCampaigns.xhtml
+listCampaigns.my_campaigns=Meine Aktionen
+listCampaigns.name=Name
+listCampaigns.target_amount=Spendenziel
+listCampaigns.donated_so_far=bisher gespendet
+listCampaigns.edit=Editieren
+listCampaigns.list_donations=Spendenliste
+listCampaigns.form=Formular
+listCampaigns.add_campaign=Aktion hinzufügen
+listCampaigns.ask_delete_campaign=Aktion wirklich löschen?
+listCampaigns.delete_campaign=Aktion löschen
+listCampaigns.yes=Ja
+listCampaigns.no=Nein
+
+# editCampaign.xhtml
+editCampaign.add_new_campaign=Neue Aktion anlegen
+editCampaign.edit_campaign=Aktionsdaten editieren
+editCampaign.general=Allgemein
+editCampaign.name=Name
+editCampaign.name_of_the_campaign=Name der Spendenaktion
+editCampaign.target_amount=Spendenziel
+editCampaign.donation_amount=Spendenbetrag
+editCampaign.bank_account=Bankverbindung
+editCampaign.iban=IBAN
+editCampaign.name_of_bank=Name der Bank
+editCampaign.save=Speichern
+editCampaign.cancel=Abbrechen
+
+# listDonations.xhtml
+listDonations.donation_list=Spenderliste
+listDonations.beneficiary_account=Empfängerkonto
+listDonations.iban=IBAN
+listDonations.name=Name
+listDonations.name_of_bank=Name der Bank
+listDonations.donation_amount=Spendenbetrag
+listDonations.receipt=Quittung
+listDonations.yes=ja
+listDonations.no=nein
+listDonations.status=Status
+listDonations.status.TRANSFERRED=überwiesen
+listDonations.status.IN_PROCESS=in Bearbeitung
+
+# editDonationForm.xhtml
+editDonationForm.edit_donation_form=Spendenformular bearbeiten
+editDonationForm.background_color=Hintergrundfarbe
+editDonationForm.text_color=Textfarbe
+editDonationForm.form_url=URL des Formulars
+editDonationForm.update_url=Aktualisieren der URL
+
+# donateMoney.xhtml
+donateMoney.donate_money=Geld spenden
+donateMoney.name=Name
+donateMoney.iban=IBAN
+donateMoney.name_of_bank=Name der Bank
+donateMoney.donation_amount=Spendenbetrag
+donateMoney.i_want_a_receipt=Ja, ich möchte eine Spendenquittung
+donateMoney.donate=Spenden
+donateMoney.thank_you=Vielen Dank für die Spende!
+
+# logger
+log.donateMoney.thank_you={0} hat {1} Euro gespendet.
+log.transferDonation.start=Zu bearbeitende Spenden werden überwiesen.
+log.transferDonation.done=Es wurden {0} Spenden überwiesen.
+
+# login.xhtml
+login.email=E-Mail
+login.password=Passwort
+login.login=Anmelden
+login.errorMsg=Passwort oder User sind falsch
+
diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7ab66a6ba41d41e7916f892b0d2731a741309a2f
--- /dev/null
+++ b/src/main/resources/messages_en.properties
@@ -0,0 +1,73 @@
+# index.xhtml
+welcome.title=Workshop Java EE 7
+welcome.text=Java EE 7: Welcome to our Workshop!
+
+# listCampaigns.xhtml
+listCampaigns.my_campaigns=My campaigns
+listCampaigns.name=Name
+listCampaigns.target_amount=Target amount
+listCampaigns.donated_so_far=Donated so far
+listCampaigns.edit=Edit
+listCampaigns.list_donations=List donations
+listCampaigns.form=Form
+listCampaigns.add_campaign=Add campaign
+listCampaigns.ask_delete_campaign=Really delete campaign?
+listCampaigns.delete_campaign=Delete campaign
+listCampaigns.yes=Yes
+listCampaigns.no=No
+
+# editCampaign.xhtml
+editCampaign.add_new_campaign=Add a new campaign
+editCampaign.edit_campaign=Edit campaign
+editCampaign.general=General
+editCampaign.name=Name
+editCampaign.name_of_the_campaign=Name of the campaign
+editCampaign.target_amount=Target amount
+editCampaign.donation_amount=Donation amount
+editCampaign.bank_account=Bank account
+editCampaign.iban=IBAN
+editCampaign.name_of_bank=Name of Bank
+editCampaign.save=Save
+editCampaign.cancel=Cancel
+
+# listDonations.xhtml
+listDonations.donation_list=List of donations
+listDonations.beneficiary_account=Beneficiary account
+listDonations.iban=IBAN
+listDonations.name=Name
+listDonations.name_of_bank=Name of Bank
+listDonations.donation_amount=Donation amount
+listDonations.receipt=Receipt
+listDonations.yes=yes
+listDonations.no=no
+listDonations.status=Status
+listDonations.status.TRANSFERRED=transferred
+listDonations.status.IN_PROCESS=in process
+
+# editDonationForm.xhtml
+editDonationForm.edit_donation_form=Edit donation form
+editDonationForm.background_color=Background color
+editDonationForm.text_color=Text color
+editDonationForm.form_url=Form URL
+editDonationForm.update_url=Update URL
+
+# donateMoney.xhtml
+donateMoney.donate_money=Donate money
+donateMoney.name=Name
+donateMoney.iban=IBAN
+donateMoney.name_of_bank=Name of bank
+donateMoney.donation_amount=Donation amount
+donateMoney.i_want_a_receipt=Yes, I would like a donation receipt
+donateMoney.donate=Donate
+donateMoney.thank_you=Thank you for your donation!
+
+# logger
+log.donateMoney.thank_you={0} has donated {1} Euro.
+log.transferDonation.start=Starting transfering donations.
+log.transferDonation.done={0} donations have been transfered.
+
+# login.xhtml
+login.email=Email
+login.password=Password
+login.login=Log in
+login.errorMsg=Password or user are wrong
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/faces-config.xml b/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c5fd52797c166b4e7de1919e28f8e37996ef8453
--- /dev/null
+++ b/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faces-config version="2.3"
+	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+            http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
+	<application>
+		<locale-config>
+			<default-locale>de</default-locale>
+			<supported-locale>en</supported-locale>
+			<supported-locale>de</supported-locale>
+		</locale-config>
+		<resource-bundle>
+			<base-name>messages</base-name>
+			<var>msg</var>
+		</resource-bundle>
+	</application>
+</faces-config>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jboss-web.xml b/src/main/webapp/WEB-INF/jboss-web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..91d6a72f47782c891e8f5180d38bcc5a5d0fa83d
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jboss-web.xml
@@ -0,0 +1,3 @@
+<jboss-web>
+    <security-domain>mongo-auth</security-domain>
+</jboss-web>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ce63a7056615274144fa5dbb14dc896a1da872e2
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
+            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+	version="3.1">
+	<login-config>
+		<auth-method>FORM</auth-method>
+		<form-login-config>
+			<form-login-page>/login.jsf</form-login-page>
+			<form-error-page>/loginError.jsf</form-error-page>
+		</form-login-config>
+	</login-config>
+	<security-constraint>
+		<web-resource-collection>
+			<web-resource-name>organizer</web-resource-name>
+			<url-pattern>/organizer/*</url-pattern>
+		</web-resource-collection>
+		<web-resource-collection>
+			<web-resource-name>organizer access via REST</web-resource-name>
+			<url-pattern>/rest/organizer/*</url-pattern>
+		</web-resource-collection>
+		<auth-constraint>
+			<role-name>Organizer</role-name>
+		</auth-constraint>
+		<user-data-constraint>
+			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
+		</user-data-constraint>
+	</security-constraint>
+	<security-role>
+		<role-name>Organizer</role-name>
+	</security-role>
+	<servlet-mapping>
+		<servlet-name>javax.ws.rs.core.Application</servlet-name>
+		<url-pattern>/rest/*</url-pattern>
+	</servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/src/main/webapp/contracts/de/screen.css b/src/main/webapp/contracts/de/screen.css
new file mode 100644
index 0000000000000000000000000000000000000000..fd7253dd9842d160bd4c35fc55fe499db947d679
--- /dev/null
+++ b/src/main/webapp/contracts/de/screen.css
@@ -0,0 +1,35 @@
+body {
+	margin: 0;
+	padding: 0;
+	background-color: #EAECEE;
+	font-family: Verdana, sans-serif;
+	font-size: 0.9em;
+}
+
+#container {
+	margin: 0 auto;
+	padding: 0 20px 10px 20px;
+	border: 1px solid #666666;
+	width: 865px;
+	padding-top: 10px;
+}
+
+#header {
+	font-size: 1.3em;
+	border: 1px solid #666666;
+	background: #EAECEE;
+	padding: 0 15px 5px 15px;
+	margin-bottom: 50px;
+}
+
+#footer {
+	clear: both;
+	text-align: center;
+	color: #666666;
+	font-size: 0.85em;
+	padding: 3em 0 0 0;
+}
+
+h2 {
+	font-size: 1.2em;
+}
\ No newline at end of file
diff --git a/src/main/webapp/contracts/de/template.xhtml b/src/main/webapp/contracts/de/template.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..17cdc03c4046c20d800b054bf0109c724d7ff40f
--- /dev/null
+++ b/src/main/webapp/contracts/de/template.xhtml
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:h="http://xmlns.jcp.org/jsf/html"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<h:head>
+    <title>My-Aktion</title>
+    <meta charset="utf-8" />
+    <h:outputStylesheet name="/screen.css" />
+</h:head>
+<h:body>
+    <div id="container">
+        <div id="header">
+            <p>
+                Beispielanwendung <b>My-Aktion</b> – Workshop Java EE 7
+            </p>
+        </div>
+        <div id="content">
+            <ui:insert name="content">
+                [Template content will be inserted here]
+            </ui:insert>
+        </div>
+        <div id="footer">
+            <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT Lizenz</p>
+        </div>
+    </div>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/contracts/en/screen.css b/src/main/webapp/contracts/en/screen.css
new file mode 100644
index 0000000000000000000000000000000000000000..fd7253dd9842d160bd4c35fc55fe499db947d679
--- /dev/null
+++ b/src/main/webapp/contracts/en/screen.css
@@ -0,0 +1,35 @@
+body {
+	margin: 0;
+	padding: 0;
+	background-color: #EAECEE;
+	font-family: Verdana, sans-serif;
+	font-size: 0.9em;
+}
+
+#container {
+	margin: 0 auto;
+	padding: 0 20px 10px 20px;
+	border: 1px solid #666666;
+	width: 865px;
+	padding-top: 10px;
+}
+
+#header {
+	font-size: 1.3em;
+	border: 1px solid #666666;
+	background: #EAECEE;
+	padding: 0 15px 5px 15px;
+	margin-bottom: 50px;
+}
+
+#footer {
+	clear: both;
+	text-align: center;
+	color: #666666;
+	font-size: 0.85em;
+	padding: 3em 0 0 0;
+}
+
+h2 {
+	font-size: 1.2em;
+}
\ No newline at end of file
diff --git a/src/main/webapp/contracts/en/template.xhtml b/src/main/webapp/contracts/en/template.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..56e9c61261d8ad66f8fe814fe8ff1da3daed7c8b
--- /dev/null
+++ b/src/main/webapp/contracts/en/template.xhtml
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:h="http://xmlns.jcp.org/jsf/html"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<h:head>
+    <title>My-Aktion</title>
+    <meta charset="utf-8" />
+    <h:outputStylesheet name="/screen.css" />
+</h:head>
+<h:body>
+    <div id="container">
+        <div id="header">
+            <p>
+                Example application <b>My-Aktion</b> – Workshop Java EE 7
+            </p>
+        </div>
+        <div id="content">
+            <ui:insert name="content">
+                [Template content will be inserted here]
+            </ui:insert>
+        </div>
+        <div id="footer">
+            <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT license</p>
+        </div>
+    </div>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/donateMoney.xhtml b/src/main/webapp/donateMoney.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..000c3061c6eaafa8a89c5fc36a5904d6ad110d0d
--- /dev/null
+++ b/src/main/webapp/donateMoney.xhtml
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<h:head>
+    <title>#{msg['donateMoney.donate_money']}</title>
+    <meta charset="utf-8" />
+    <f:metadata>
+        <f:viewParam id="bgColor" name="bgColor"
+            value="#{donateMoneyController.bgColor}">
+            <f:validateRegex pattern="[A-Fa-f0-9]{6}" />
+        </f:viewParam>
+        <f:viewParam id="textColor" name="textColor"
+            value="#{donateMoneyController.textColor}">
+            <f:validateRegex pattern="[A-Fa-f0-9]{6}" />
+        </f:viewParam>
+        <f:viewParam id="campaignId" name="campaignId"
+            converter="javax.faces.Long"
+            value="#{donateMoneyController.campaignId}">
+        </f:viewParam>
+    </f:metadata>
+</h:head>
+<h:body style="margin:0; font-family: Verdana, sans-serif; font-size: 0.9em;
+        background-color: ##{donateMoneyController.bgColor}; 
+        color: ##{donateMoneyController.textColor}">
+    <h1>#{msg['donateMoney.donate_money']}</h1>
+    <p:messages globalOnly="true" />
+    <p:message for="bgColor" style="color: red;" />
+    <p:message for="textColor" style="color: red;" />
+    <p:message for="campaignId" style="color: red;" />
+    <h:form>
+        <h:panelGrid columns="3">
+            <h:outputLabel value="#{msg['donateMoney.name']}:">
+            </h:outputLabel>
+            <p:inputText id="name"
+                    value="#{donateMoneyController.donation.donorName}">
+            </p:inputText>
+            <p:message for="name" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.iban']}:">
+            </h:outputLabel>
+            <p:inputText id="iban"
+                    value="#{donateMoneyController.donation.account.iban}">
+            </p:inputText>
+            <p:message for="iban" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.name_of_bank']}:">
+            </h:outputLabel>
+            <p:inputText id="name_bank"
+                    value="#{donateMoneyController.donation.account.nameOfBank}">
+            </p:inputText>
+            <p:message for="name_bank" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.donation_amount']}:">
+            </h:outputLabel>
+            <h:panelGroup>
+                <p:inputText id="donationAmount"
+                        value="#{donateMoneyController.donation.amount}"
+                        onchange="
+                            if(value !== '') {
+                                if(value.indexOf('.') === -1) {
+                                    document.getElementById('j_idt8:tabView:donationAmount').value = value + '.00';
+                                }
+                            }">
+                </p:inputText> EUR
+            </h:panelGroup>
+            <p:message for="donationAmount" style="color: red;" />
+        </h:panelGrid>
+        <p:selectBooleanCheckbox
+                value="#{donateMoneyController.donation.receiptRequested}" /> 
+            #{msg['donateMoney.i_want_a_receipt']}<br />
+        <p:commandButton value="#{msg['donateMoney.donate']}" ajax="false"
+                action="#{donateMoneyController.doDonation}" />
+    </h:form>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..4189c9066f9d67cf29c65def449764bcc0e91fbd
--- /dev/null
+++ b/src/main/webapp/index.html
@@ -0,0 +1,5 @@
+<html>
+<head>
+    <meta http-equiv="Refresh" content="0; URL=organizer/listCampaigns.jsf">
+</head>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/index.xhtml b/src/main/webapp/index.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..79287a7ebc57a54cc3e2b4366027e227903a4a55
--- /dev/null
+++ b/src/main/webapp/index.xhtml
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<body>
+    <f:view contract="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">            
+                <h1>#{msg['welcome.text']}</h1>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/login.xhtml b/src/main/webapp/login.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..d5d98083e3292915ceb7288ba0892943a9026d3d
--- /dev/null
+++ b/src/main/webapp/login.xhtml
@@ -0,0 +1,22 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <form method="post" action="j_security_check">
+                    <h:panelGrid columns="2">
+                        <h:outputLabel value="#{msg['login.email']}:" />
+                        <input type="text" name="j_username" />
+                        <h:outputLabel value="#{msg['login.password']}:" />
+                        <input type="password" name="j_password" />
+                    </h:panelGrid>
+                    <input type="submit" value="#{msg['login.login']}" />
+                </form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/loginError.xhtml b/src/main/webapp/loginError.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..14b9f994a46b7acd885b136dbcaf8ab243f81f0c
--- /dev/null
+++ b/src/main/webapp/loginError.xhtml
@@ -0,0 +1,23 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <b style="color: red;">#{msg['login.errorMsg']}</b>
+                <form method="post" action="j_security_check">
+                    <h:panelGrid columns="2">
+                        <h:outputLabel value="#{msg['login.email']}:" />
+                        <input type="text" name="j_username" />
+                        <h:outputLabel value="#{msg['login.password']}:" />
+                        <input type="password" name="j_password" />
+                    </h:panelGrid>
+                    <input type="submit" value="#{msg['login.login']}" />
+                </form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/organizer/editCampaign.xhtml b/src/main/webapp/organizer/editCampaign.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..4d0a7f8d76ca30def6f2436d47dc35d6d8fb1e78
--- /dev/null
+++ b/src/main/webapp/organizer/editCampaign.xhtml
@@ -0,0 +1,93 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{addMode ? msg['editCampaign.add_new_campaign'] :
+                    msg['editCampaign.edit_campaign']}</h1>
+                <h:form>
+                    <p:messages closable="true" />
+                    <p:tabView id="tabView">
+                        <p:tab title="#{msg['editCampaign.general']}">
+                            <h:panelGrid columns="3">
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name']}:">
+                                </h:outputLabel>
+                                <p:inputText id="a_name"
+                                    value="#{selectedCampaign.name}">
+                                    <f:passThroughAttribute name="placeholder"
+                                        value="#{msg['editCampaign.name_of_the_campaign']}" />
+                                </p:inputText>
+                                <p:message for="a_name" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.target_amount']}:">
+                                </h:outputLabel>
+                                <h:panelGroup>
+                                    <p:inputText id="a_targetAmount"
+                                        value="#{selectedCampaign.targetAmount}"
+                                        onchange="
+                                        if(value !== '') {
+                                            if(value.indexOf('.') === -1) {
+                                                document.getElementById('j_idt8:tabView:a_targetAmount').value = value + '.00';
+                                            }
+                                        }">
+                                    </p:inputText> EUR
+                                </h:panelGroup>
+                                <p:message for="a_targetAmount" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.donation_amount']}:">
+                                </h:outputLabel>
+                                <h:panelGroup>
+                                    <p:inputText id="a_donationMinimum"
+                                        value="#{selectedCampaign.donationMinimum}"
+                                        onchange="
+                                        if(value !== '') {
+                                            if(value.indexOf('.') === -1) {
+                                                document.getElementById('j_idt8:tabView:a_donationMinimum').value = value + '.00';
+                                            }
+                                        }">
+                                    </p:inputText> EUR
+                                </h:panelGroup>
+                                <p:message for="a_donationMinimum" />
+                            </h:panelGrid>
+                        </p:tab>
+                        <p:tab title="#{msg['editCampaign.bank_account']}">
+                            <h:panelGrid columns="3">
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_name"
+                                    value="#{selectedCampaign.account.name}">
+                                </p:inputText>
+                                <p:message for="b_name" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.iban']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_iban"
+                                    value="#{selectedCampaign.account.iban}">
+                                </p:inputText>
+                                <p:message for="b_iban" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name_of_bank']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_name_bank"
+                                    value="#{selectedCampaign.account.nameOfBank}">
+                                </p:inputText>
+                                <p:message for="b_name_bank" />
+                            </h:panelGrid>
+                        </p:tab>
+                    </p:tabView>
+                    <p:commandButton value="#{msg['editCampaign.save']}"
+                        ajax="false" action="#{editCampaignController.doSave}" />
+                    <p:commandButton value="#{msg['editCampaign.cancel']}"
+                        immediate="true" ajax="false"
+                        action="#{editCampaignController.doCancel}" />
+                </h:form>
+            </ui:define>    
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/organizer/editDonationForm.xhtml b/src/main/webapp/organizer/editDonationForm.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..78107ac48573b1f613b85243eda4fd3756d0584a
--- /dev/null
+++ b/src/main/webapp/organizer/editDonationForm.xhtml
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{msg['editDonationForm.edit_donation_form']}</h1>
+                <h:form>
+                    <h:panelGrid columns="2">
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.background_color']}:">
+                        </h:outputLabel>
+                        <p:colorPicker id="bgColor"
+                            value="#{editDonationFormController.bgColor}"
+                            widgetVar="bgPicker">
+                        </p:colorPicker>
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.text_color']}:">
+                        </h:outputLabel>
+                        <p:colorPicker id="textColor"
+                            value="#{editDonationFormController.textColor}"
+                            widgetVar="textPicker">
+                        </p:colorPicker>
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.form_url']}:">
+                        </h:outputLabel>
+                        <p:inputTextarea id="url" rows="6" cols="30"
+                            readonly="true"
+                            value="#{editDonationFormController.url}" />
+                    </h:panelGrid>
+                    <p:commandButton value="#{msg['editDonationForm.update_url']}" update="url" />
+                    <p:commandButton value="OK"
+                        action="#{editDonationFormController.doOk}" ajax="false" />
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/organizer/listCampaigns.xhtml b/src/main/webapp/organizer/listCampaigns.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..e0132ad516790501fb76e60b2ecb9898e49235f5
--- /dev/null
+++ b/src/main/webapp/organizer/listCampaigns.xhtml
@@ -0,0 +1,78 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">           
+                <h1>#{msg['listCampaigns.my_campaigns']}</h1>
+                <h:form>
+                    <p:dataTable value="#{campaigns}" var="campaign">
+                        <p:column>
+                            <p:commandButton onclick="PF('confirmation').show()"
+                                    actionListener="#{listCampaignsController.doDeleteCampaign(campaign)}"
+                                    icon="ui-icon-close" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.name']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.name}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.target_amount']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.targetAmount}">
+                                <f:convertNumber type="currency"
+                                        currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.donated_so_far']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.amountDonatedSoFar}">
+                                <f:convertNumber type="currency"
+                                        currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <p:commandLink value="#{msg['listCampaigns.edit']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doEditCampaign(campaign)}" />
+                        </p:column>
+                        <p:column>
+                            <p:commandLink
+                                    value="#{msg['listCampaigns.list_donations']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doListDonations(campaign)}" />
+                        </p:column>
+                        <p:column>
+                            <p:commandLink value="#{msg['listCampaigns.form']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doEditDonationForm(campaign)}" />
+                        </p:column>
+                    </p:dataTable>
+                    <p:commandButton
+                            value="#{msg['listCampaigns.add_campaign']}"
+                            ajax="false"
+                            action="#{listCampaignsController.doAddCampaign}" />
+                    <p:confirmDialog
+                            message="#{msg['listCampaigns.ask_delete_campaign']}"
+                            header="#{msg['listCampaigns.delete_campaign']}"
+                            severity="alert" widgetVar="confirmation">
+                        <p:commandButton value="#{msg['listCampaigns.yes']}"
+                                oncomplete="confirmation.hide()" ajax="false"
+                                actionListener="#{listCampaignsController.commitDeleteCampaign}" />
+                        <p:commandButton value="#{msg['listCampaigns.no']}"
+                                onclick="confirmation.hide()" />
+                    </p:confirmDialog>
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/organizer/listDonations.xhtml b/src/main/webapp/organizer/listDonations.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..360c3e899899f96a86d47bb8c4a744942aecdb05
--- /dev/null
+++ b/src/main/webapp/organizer/listDonations.xhtml
@@ -0,0 +1,76 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{msg['listDonations.donation_list']}
+                    '#{selectedCampaign.name}'</h1>
+                <h2>#{msg['listDonations.beneficiary_account']}:
+                    #{selectedCampaign.account.name},
+                    #{msg['listDonations.iban']}:
+                    #{selectedCampaign.account.iban},
+                    #{campaignProducer .selectedCampaign.account.nameOfBank}</h2>
+                <h:form>
+                    <p:dataTable value="#{selectedCampaign.donations}"
+                            var="donation">
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.name']}
+                            </f:facet>
+                            <h:outputText value="#{donation.donorName}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.iban']}
+                            </f:facet>
+                            <h:outputText value="#{donation.account.iban}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.name_of_bank']}
+                            </f:facet>
+                            <h:outputText value="#{donation.account.nameOfBank}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.donation_amount']}
+                            </f:facet>
+                            <h:outputText value="#{donation.amount}">
+                                <f:convertNumber type="currency"
+                                    currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.receipt']}
+                            </f:facet>
+                            <h:outputText
+                                value="#{donation.receiptRequested ? 
+                                    msg['listDonations.yes'] 
+                                    : msg['listDonations.no']}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.status']}
+                            </f:facet>
+                            <h:outputText
+                                value="#{msg['listDonations.status.TRANSFERRED']}"
+                                rendered="#{donation.status == 'TRANSFERRED'}" />
+                            <h:outputText
+                                value="#{msg['listDonations.status.IN_PROCESS']}"
+                                rendered="#{donation.status == 'IN_PROCESS'}" />
+                        </p:column>
+                    </p:dataTable>
+                    <p:commandButton value="OK"
+                            ajax="false"
+                            action="#{listDonationsController.doOk}" />
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/target/classes/.gitignore b/target/classes/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..fd04598cccd1eb791debf5b0edfff26368dbb294
--- /dev/null
+++ b/target/classes/.gitignore
@@ -0,0 +1 @@
+/de/
diff --git a/target/classes/META-INF/persistence.xml b/target/classes/META-INF/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..502f486e102318c514a1bff0296caf7efaa9fd9d
--- /dev/null
+++ b/target/classes/META-INF/persistence.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
+	version="2.1">
+
+	<persistence-unit name="primary"
+		transaction-type="JTA">
+		<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
+
+		<class>de.dpunkt.myaktion.model.Account</class>
+		<class>de.dpunkt.myaktion.model.Campaign</class>
+		<class>de.dpunkt.myaktion.model.Donation</class>
+		<class>de.dpunkt.myaktion.model.Organizer</class>
+		<exclude-unlisted-classes>true</exclude-unlisted-classes>
+
+		<properties>
+			<property name="hibernate.transaction.jta.platform"
+				value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
+			<property name="hibernate.ogm.datastore.database"
+				value="my-aktion" />
+			<property name="hibernate.ogm.datastore.host"
+				value="localhost" />
+			<property name="hibernate.ogm.datastore.provider"
+				value="MONGODB" />
+		</properties>
+	</persistence-unit>
+</persistence>
\ No newline at end of file
diff --git a/target/classes/ValidationMessages_de.properties b/target/classes/ValidationMessages_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..334b1b301f6ce1fe0fceeeb008bdcceeb80df160
--- /dev/null
+++ b/target/classes/ValidationMessages_de.properties
@@ -0,0 +1,22 @@
+# resource file for bean validation
+# campaign model
+campaign.name.size=Der Name einer Aktion muss min. {min} und darf max. {max} Zeichen lang sein.
+campaign.targetAmount.notNull=Bitte ein Spendenziel angeben.
+campaign.targetAmount.decimalMin=Das Spendenziel für die Aktion muss min. {value} Euro sein.
+campaign.donationMinimum.notNull=Bitte einen Spendenbetrag angeben.
+campaign.donationMinimum.decimalMin=Der Spendenbetrag muss min. {value} Euro sein.
+
+# donation model
+donation.amount.notNull=Bitte einen Spendenbetrag angeben.
+donation.amount.decimalMin=Der Spendenbetrag muss min. {value} Euro sein.
+donation.donorName.size=Der Name eines Spenders muss min. {min} und darf max. {max} Zeichen lang sein.
+
+# account model
+account.name.size=Der Name des Besitzers eines Kontos muss min. {min} und darf max. {max} Zeichen lang sein.
+account.nameOfBank.size=Der Name einer Bank muss min. {min} und darf max. {max} Zeichen lang sein.
+account.iban.pattern=Eine IBAN besteht aus zwei Buchstaben, gefolgt von zwei Ziffern und 12 bis 30 alphanumerischen Zeichen.
+
+# organizer model
+organizer.firstName.size=Der Vorname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein.
+organizer.lastName.size=Der Nachname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein.
+organizer.email.pattern=Bitte eine valide E-Mail-Adresse angeben.
\ No newline at end of file
diff --git a/target/classes/ValidationMessages_en.properties b/target/classes/ValidationMessages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0bd4fe3a4ebb6fa622eb31dac2704ac1cb079f84
--- /dev/null
+++ b/target/classes/ValidationMessages_en.properties
@@ -0,0 +1,22 @@
+# resource file for bean validation
+# campaign model
+campaign.name.size=The name of a campaign must be between {min} and {max} characters long.
+campaign.targetAmount.notNull=Please specify a target amount.
+campaign.targetAmount.decimalMin=The target amount for the campaign must be at least {value} Euro.
+campaign.donationMinimum.notNull=Please specify a donation minimum.
+campaign.donationMinimum.decimalMin=The donation minimum must be at least {value} Euro.
+
+# donation model
+donation.amount.notNull=Please specify a donation amount.
+donation.amount.decimalMin=The donation amount must be at least {value} Euro.
+donation.donorName.size=The donor's name must be between {min} and {max} characters long.
+
+# account model
+account.name.size=The name of the account owner must be between {min} and {max} characters long.
+account.nameOfBank.size=The name of a bank must be between {min} and {max} characters long.
+account.iban.pattern=An IBAN contains of two letters, followed by two digits and between 12 and 30 alphanumeric characters.
+
+# organizer model
+organizer.firstName.size=The first name of an organizer must be between {min} and {max} characters long.
+organizer.lastName.size=The last name of an organizer must be between {min} and {max} characters long.
+organizer.email.pattern=Please enter a valid email address.
\ No newline at end of file
diff --git a/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class b/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class
index fc30f7acd62163c14e756b95eb2f3a290fcd71ae..a42ff9d81f8e34df94fae149ec163a6ff10aa450 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class and b/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class differ
diff --git a/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class b/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class
index 161e67b4902f3dae54b23475eba2997013935dba..ab6286a1eea2544958c793a502e3ef51f4cb53f8 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class and b/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class differ
diff --git a/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class b/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class
index bc95b0b4665be3a07c2ee37e1c8452a91b054b66..cddd6c8af9ddf942c595619dd70447f24f50c924 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class and b/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class differ
diff --git a/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class b/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class
index 67b50cba2dfd0e418395ba43c8907c5bca74aa64..19cf3a0bad12568766da125b903f997fdc8c211a 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class and b/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class differ
diff --git a/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class b/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class
index 438e70240ff1a5dc624d864e52379f83acc0cff6..7780ca54afc2308be916c0a20896bd41861e8f93 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class and b/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class differ
diff --git a/target/classes/de/dpunkt/myaktion/controller/Pages.class b/target/classes/de/dpunkt/myaktion/controller/Pages.class
index 21ba9ffc3e0235fdb3c0d2dff1aa69edaa43d3a0..ae8a3a01e1a2f44e80d60326b9d6472b556ef7eb 100644
Binary files a/target/classes/de/dpunkt/myaktion/controller/Pages.class and b/target/classes/de/dpunkt/myaktion/controller/Pages.class differ
diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class b/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class
index d7e714e29f995c3d25b26c531b2beb28cc7f9617..df433cb78e251d6e9156fd8022845bf28c3e90cd 100644
Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class and b/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class differ
diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class b/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class
index 29af38dfd2b2214b81eaf736ceb1f513b461ea6d..5efdb7aaf5c1a59feebc581c2119955a2f6ac1af 100644
Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class and b/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class differ
diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class b/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class
index 51768c658a951c34ba6d64724c8d7195e7311c55..f049f4d20e5a760d7243810933d995d12d239410 100644
Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class and b/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class differ
diff --git a/target/classes/de/dpunkt/myaktion/model/Account.class b/target/classes/de/dpunkt/myaktion/model/Account.class
index f74c3c507f07053f02b3d7f4c0b350186bf07d4f..8ca6d81da454ec1fadbaa5f0290f6e463ddf4c6f 100644
Binary files a/target/classes/de/dpunkt/myaktion/model/Account.class and b/target/classes/de/dpunkt/myaktion/model/Account.class differ
diff --git a/target/classes/de/dpunkt/myaktion/model/Campaign.class b/target/classes/de/dpunkt/myaktion/model/Campaign.class
index 640e513f1f5405bf219c99b9e6b8ea7e4b4ed94a..a78544fcdaedbf0303790ea11d7e81d597682eb7 100644
Binary files a/target/classes/de/dpunkt/myaktion/model/Campaign.class and b/target/classes/de/dpunkt/myaktion/model/Campaign.class differ
diff --git a/target/classes/de/dpunkt/myaktion/model/Donation$Status.class b/target/classes/de/dpunkt/myaktion/model/Donation$Status.class
index d8005ba2d011006ad770985283d86eb495b566fb..33b52a3bbf63715a2c3c0319d4eff497c9a1f878 100644
Binary files a/target/classes/de/dpunkt/myaktion/model/Donation$Status.class and b/target/classes/de/dpunkt/myaktion/model/Donation$Status.class differ
diff --git a/target/classes/de/dpunkt/myaktion/model/Donation.class b/target/classes/de/dpunkt/myaktion/model/Donation.class
index 1383d0b2b0b874243e7e2e4d05bbce0753526019..3ecf73df1d51c6673829250ce21241d9697d475c 100644
Binary files a/target/classes/de/dpunkt/myaktion/model/Donation.class and b/target/classes/de/dpunkt/myaktion/model/Donation.class differ
diff --git a/target/classes/messages_de.properties b/target/classes/messages_de.properties
index 07544ff2deb2fd43d5e72f642c02f19a8e7c5384..1059e8d85b74e9ed7f11baa8ba041ae483c80b4f 100644
--- a/target/classes/messages_de.properties
+++ b/target/classes/messages_de.properties
@@ -11,18 +11,19 @@ listCampaigns.edit=Editieren
 listCampaigns.list_donations=Spendenliste
 listCampaigns.form=Formular
 listCampaigns.add_campaign=Aktion hinzufügen
+listCampaigns.ask_delete_campaign=Aktion wirklich löschen?
+listCampaigns.delete_campaign=Aktion löschen
+listCampaigns.yes=Ja
+listCampaigns.no=Nein
 
 # editCampaign.xhtml
 editCampaign.add_new_campaign=Neue Aktion anlegen
 editCampaign.edit_campaign=Aktionsdaten editieren
 editCampaign.general=Allgemein
 editCampaign.name=Name
-editCampaign.campaign_name_validation=Der Name einer Aktion muss min. 4 und darf max. 30 Zeichen lang sein.
 editCampaign.name_of_the_campaign=Name der Spendenaktion
 editCampaign.target_amount=Spendenziel
-editCampaign.target_amount_validation=Das Spendenziel für die Aktion muss min. 10 Euro sein.
 editCampaign.donation_amount=Spendenbetrag
-editCampaign.donation_amount_validation=Der Spendenbetrag muss min. 1 Euro sein.
 editCampaign.bank_account=Bankverbindung
 editCampaign.iban=IBAN
 editCampaign.name_of_bank=Name der Bank
@@ -60,7 +61,14 @@ donateMoney.i_want_a_receipt=Ja, ich m
 donateMoney.donate=Spenden
 donateMoney.thank_you=Vielen Dank für die Spende!
 
-listCampaigns.ask_delete_campaign=Aktion wirklich löschen?
-listCampaigns.delete_campaign=Aktion löschen
-listCampaigns.yes=Ja
-listCampaigns.no=Nein
\ No newline at end of file
+# logger
+log.donateMoney.thank_you={0} hat {1} Euro gespendet.
+log.transferDonation.start=Zu bearbeitende Spenden werden überwiesen.
+log.transferDonation.done=Es wurden {0} Spenden überwiesen.
+
+# login.xhtml
+login.email=E-Mail
+login.password=Passwort
+login.login=Anmelden
+login.errorMsg=Passwort oder User sind falsch
+
diff --git a/target/classes/messages_en.properties b/target/classes/messages_en.properties
index 5df0b5aed6b0df2809e2ae1ef2f080db8dc8f6ad..7ab66a6ba41d41e7916f892b0d2731a741309a2f 100644
--- a/target/classes/messages_en.properties
+++ b/target/classes/messages_en.properties
@@ -11,18 +11,19 @@ listCampaigns.edit=Edit
 listCampaigns.list_donations=List donations
 listCampaigns.form=Form
 listCampaigns.add_campaign=Add campaign
+listCampaigns.ask_delete_campaign=Really delete campaign?
+listCampaigns.delete_campaign=Delete campaign
+listCampaigns.yes=Yes
+listCampaigns.no=No
 
 # editCampaign.xhtml
 editCampaign.add_new_campaign=Add a new campaign
 editCampaign.edit_campaign=Edit campaign
 editCampaign.general=General
 editCampaign.name=Name
-editCampaign.campaign_name_validation=The name of a campaign must be at least 4 and max. 30 characters long.
 editCampaign.name_of_the_campaign=Name of the campaign
 editCampaign.target_amount=Target amount
-editCampaign.target_amount_validation=The target amount for the campaign must be at least 10 Euro.
 editCampaign.donation_amount=Donation amount
-editCampaign.donation_amount_validation=The donation amount must be at least 1 Euro.
 editCampaign.bank_account=Bank account
 editCampaign.iban=IBAN
 editCampaign.name_of_bank=Name of Bank
@@ -60,7 +61,13 @@ donateMoney.i_want_a_receipt=Yes, I would like a donation receipt
 donateMoney.donate=Donate
 donateMoney.thank_you=Thank you for your donation!
 
-listCampaigns.ask_delete_campaign=Really delete campaign?
-listCampaigns.delete_campaign=Delete campaign
-listCampaigns.yes=Yes
-listCampaigns.no=No
\ No newline at end of file
+# logger
+log.donateMoney.thank_you={0} has donated {1} Euro.
+log.transferDonation.start=Starting transfering donations.
+log.transferDonation.done={0} donations have been transfered.
+
+# login.xhtml
+login.email=Email
+login.password=Password
+login.login=Log in
+login.errorMsg=Password or user are wrong
\ No newline at end of file
diff --git a/target/m2e-wtp/web-resources/.gitignore b/target/m2e-wtp/web-resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3385916da52dc526118c7c76899e628cdde10ca1
--- /dev/null
+++ b/target/m2e-wtp/web-resources/.gitignore
@@ -0,0 +1 @@
+/META-INF/
diff --git a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties
index 6ff87473c383f8b33b19325f351ecd4e6cf0b820..9748c86141a30dafadf69a8eca18910c53defaf5 100644
--- a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties
+++ b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties
@@ -1,5 +1,5 @@
 #Generated by Maven Integration for Eclipse
-#Thu Jul 23 17:39:07 CEST 2020
+#Fri Jul 24 11:18:02 CEST 2020
 version=0.0.1
 groupId=de.dpunkt
 m2e.projectName=my-aktion
diff --git a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml
index 0cb5aa5a9b663e37fc79f1add8d84121e5dc185e..cde1dbc5c10327f8c691c8e438e44c8081e2a9a7 100644
--- a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml
+++ b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml
@@ -7,6 +7,18 @@
 	<version>0.0.1</version>
 	<packaging>war</packaging>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.hibernate.ogm</groupId>
+                <artifactId>hibernate-ogm-bom</artifactId>
+                <version>5.4.1.Final</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
 	<dependencies>
 		<dependency>
 			<groupId>jakarta.platform</groupId>
@@ -14,18 +26,15 @@
 			<version>8.0.0</version>
 			<scope>provided</scope>
 		</dependency>
-		<dependency>
-			<groupId>org.eclipse.microprofile</groupId>
-			<artifactId>microprofile</artifactId>
-			<version>3.0</version>
-			<type>pom</type>
-			<scope>provided</scope>
-		</dependency>
 		<dependency>
 			<groupId>org.primefaces</groupId>
 			<artifactId>primefaces</artifactId>
 			<version>8.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.hibernate.ogm</groupId>
+			<artifactId>hibernate-ogm-mongodb</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>
@@ -38,7 +47,7 @@
 			</plugin>
 		</plugins>
 	</build>
-
+	
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.compiler.source>1.8</maven.compiler.source>