From 4a60c5550b77c32ebdfc8bb30cbe617c5ee82563 Mon Sep 17 00:00:00 2001
From: Gregor Riegler <gregor.riegler@gmail.com>
Date: Fri, 7 Jun 2013 14:02:46 +0200
Subject: [PATCH] [XVSM] Delivery in progress, Delivery done updates in UIs,
 Delivery logic

---
 .../tuwien/sbc/valesriegler/common/Util.java  |  35 +++---
 .../sbc/valesriegler/group/GroupAgent.java    |  18 +--
 .../group/gui/DeliveryOverviewModel.java      |  22 ++++
 .../group/gui/GroupCreationHandler.java       |   1 +
 .../group/gui/GroupOverviewModel.java         |  13 +-
 .../valesriegler/pizzeria/PizzeriaAgent.java  |  28 ++---
 .../gui/tablemodels/AbstractOrdersModel.java  |   1 -
 .../gui/tablemodels/DeliveryOrdersModel.java  |  20 +++-
 .../gui/tablemodels/OrdersOverviewModel.java  |  21 ++--
 .../valesriegler/types/DeliveryStatus.java    |   2 +-
 .../xvsm/AbstractXVSMConnector.java           |   5 +-
 .../sbc/valesriegler/xvsm/CookXVSM.java       |  35 ++++--
 .../sbc/valesriegler/xvsm/DriverXVSM.java     |  74 ++++++++++++
 .../sbc/valesriegler/xvsm/GroupAgentXVSM.java |  51 +++++++-
 .../valesriegler/xvsm/PizzeriaAgentXVSM.java  | 111 +++++++-----------
 .../sbc/valesriegler/xvsm/WaiterXVSM.java     |  38 +++---
 .../sbc/valesriegler/xvsm/driver/Driver.java  |   2 +-
 17 files changed, 305 insertions(+), 172 deletions(-)

diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
index 33ac9e2..a853cd2 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
@@ -1,31 +1,20 @@
 package at.ac.tuwien.sbc.valesriegler.common;
 
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.net.URI;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.border.TitledBorder;
-
+import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
+import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
-import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import java.awt.*;
+import java.net.URI;
+import java.util.*;
+import java.util.List;
 
 public abstract class Util {
 	private static final Logger log = LoggerFactory.getLogger(Util.class);
-	public static boolean useJMS = true;
+	public static boolean useJMS = false;
 
 	public static final String TABLE_ASSIGNED = "tables";
 	public static final String ASSIGN_TABLE = "assignTable";
@@ -48,6 +37,12 @@ public abstract class Util {
 	public static final String PIZZERIA_GROUP = "pizzeriaGroupContainer";
 	public static final String PIZZERIA_TABLE = "pizzeriaTableContainer";
 	public static final String PIZZERIA_DELIVERY = "pizzeriaDeliveryContainer";
+	public static final String DELIVERY_PROGRESS = "deliveryInProgress";
+	public static final String DELIVERY_DONE = "deliveryDone";
+	public static final String BILL_PAID = "billPaid";
+
+
+    public static final String NUMBER_DISPLAY_FORMAT = String.format("%%0%dd", 3);
 
 	private static Random random = new Random();
 
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
index 8b57589..30ac826 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
@@ -1,16 +1,5 @@
 package at.ac.tuwien.sbc.valesriegler.group;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.swing.SwingUtilities;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.group.gui.DeliveryOverviewModel;
 import at.ac.tuwien.sbc.valesriegler.group.gui.GroupOverviewModel;
@@ -18,6 +7,11 @@ import at.ac.tuwien.sbc.valesriegler.group.jms.JMSGroupConnector;
 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
 import at.ac.tuwien.sbc.valesriegler.xvsm.GroupAgentXVSM;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.util.*;
 
 /**
  * The Main class of the Group component.
@@ -51,7 +45,7 @@ public class GroupAgent {
 			// throw new IllegalArgumentException(USAGE);
 		}
 
-		String mw = "JMS";// args[0];
+		String mw = "XVSM";// args[0];
 		log.info("Middleware: " + mw);
 
 		if ("JMS".equalsIgnoreCase(mw)) {
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/DeliveryOverviewModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/DeliveryOverviewModel.java
index 95431a9..1f99e75 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/DeliveryOverviewModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/DeliveryOverviewModel.java
@@ -4,6 +4,8 @@ package at.ac.tuwien.sbc.valesriegler.group.gui;
 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
 import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.group.DeliveryGroup;
+import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
+import at.ac.tuwien.sbc.valesriegler.types.DeliveryStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,4 +51,24 @@ public class DeliveryOverviewModel extends TableModel<DeliveryGroup> {
                 throw new RuntimeException(UNHANDLEDCOLUMN);
         }
     }
+
+    public void setOrdersTaken(List<DeliveryGroupData> groups) {
+        for (DeliveryGroupData group : groups) {
+            changeStateOfGroup(group.getId(), DeliveryStatus.ORDERED);
+        }
+
+        fireTableDataChanged();
+    }
+
+    private void changeStateOfGroup(int groupId, DeliveryStatus state) {
+        items.get(groupId).getDeliveryGroupData().setDeliveryStatus(state);
+    }
+
+    public void setOrdersDelivered(List<DeliveryGroupData> groups) {
+        for (DeliveryGroupData group : groups) {
+            changeStateOfGroup(group.getId(), group.getDeliveryStatus());
+        }
+
+        fireTableDataChanged();
+    }
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupCreationHandler.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupCreationHandler.java
index 02e08dd..4267186 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupCreationHandler.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupCreationHandler.java
@@ -55,6 +55,7 @@ class GroupCreationHandler {
                 final Order order = createOrder(group, gc);
                 group.getDeliveryGroupData().setOrder(order);
                 group.getDeliveryGroupData().setPizzeriaId(gc.pizzeria);
+                group.getDeliveryGroupData().setAddress(gc.address);
                 newDeliveryGroups.add(group);
             } else {
                 Group group = new Group();
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupOverviewModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupOverviewModel.java
index e750ef4..b64abb7 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupOverviewModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupOverviewModel.java
@@ -1,17 +1,16 @@
 package at.ac.tuwien.sbc.valesriegler.group.gui;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
 import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.group.Group;
 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
 import at.ac.tuwien.sbc.valesriegler.types.Table;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Might not the nicest way to store global data, but this is an elemental
@@ -53,7 +52,7 @@ public class GroupOverviewModel extends TableModel<Group> {
 		switch (wantedColumn) {
 		case ID:
 			int groupId = group.getGroupData().getId();
-			return groupId;
+			return String.format(Util.NUMBER_DISPLAY_FORMAT, groupId);
 		case SIZE:
 			int groupSize = group.getGroupData().getSize();
 			return groupSize;
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
index 4f9687c..ef04134 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
@@ -1,25 +1,17 @@
 package at.ac.tuwien.sbc.valesriegler.pizzeria;
 
-import java.util.List;
-
-import javax.swing.SwingUtilities;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.actions.TableNew;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzeriaFrame;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.DeliveryDetailsModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.DeliveryOrdersModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
-import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.*;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.jms.JMSPizzeriaConnector;
 import at.ac.tuwien.sbc.valesriegler.types.Table;
 import at.ac.tuwien.sbc.valesriegler.xvsm.PizzeriaAgentXVSM;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.util.List;
 
 /**
  * The Main class of the Pizzeria compoment.
@@ -88,13 +80,15 @@ public class PizzeriaAgent {
 
 		// xvsm.listenForFreeTables();
 		// xvsm.listenForTakenOrders();
-		xvsm.listenForTakenDeliveryOrders();
+		xvsm.listenForDeliveryUpdates();
 		// xvsm.listenForWaitingGroups();
 		xvsm.listenForPizzasInPreparation();
 		// xvsm.listenForDeliveredOrders();
 		xvsm.listenForPreparedPizzas();
-		xvsm.listenForTables();
-		xvsm.listenForGroups();
+		xvsm.listenForPreparedDeliveryPizzas();
+		xvsm.listenForTablesUpdates();
+		xvsm.listenForGroupUpdates();
+//        xvsm.listenForDeliveriesInProgress();
 		// xvsm.listenForPayment();
 		// xvsm.listenForOccupiedTables();
 	}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/AbstractOrdersModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/AbstractOrdersModel.java
index a26f78c..134bf5d 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/AbstractOrdersModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/AbstractOrdersModel.java
@@ -56,7 +56,6 @@ public abstract class AbstractOrdersModel<T extends HasOrder> extends TableModel
         synchronized (items) {
             for (Pizza pizza : pizzas) {
                 int orderId = pizza.getOrderId();
-                log.info("pizza was done: {}", pizza.toString());
                 Order order = getOrderById(orderId);
                 if(order == null) {
                     return;
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/DeliveryOrdersModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/DeliveryOrdersModel.java
index 3c2f3a3..ff7e840 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/DeliveryOrdersModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/DeliveryOrdersModel.java
@@ -1,8 +1,6 @@
 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels;
 
-import at.ac.tuwien.sbc.valesriegler.common.TableModel;
 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
-import at.ac.tuwien.sbc.valesriegler.types.GroupData;
 import at.ac.tuwien.sbc.valesriegler.types.Order;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,4 +54,22 @@ public class DeliveryOrdersModel extends AbstractOrdersModel<DeliveryGroupData>
             return new ArrayList<>(items.values()).get(rowIndex);
         }
     }
+
+//    public void updateInProgress(List<DeliveryGroupData> groupsInProgress) {
+//        synchronized (items) {
+//            for (DeliveryGroupData group : groupsInProgress) {
+//                Order order = group.getOrder();
+//                List<DeliveryGroupData> groups = new ArrayList<DeliveryGroupData>(items.values());
+//                for (DeliveryGroupData groupData : groups) {
+//                    Order orderOfGroup = groupData.getOrder();
+//                    if (order.getId() == orderOfGroup.getId()) {
+//                        orderOfGroup.setStatus(OrderStatus.DELIVERED);
+//                        groupData.setServingWaiter(group.getServingWaiter());
+//                    }
+//                }
+//            }
+//        }
+//
+//        fireTableDataChanged();
+//    }
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
index 7ebf765..7ec570e 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
@@ -1,16 +1,15 @@
 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import at.ac.tuwien.sbc.valesriegler.types.*;
+import at.ac.tuwien.sbc.valesriegler.common.Util;
+import at.ac.tuwien.sbc.valesriegler.types.GroupData;
+import at.ac.tuwien.sbc.valesriegler.types.Order;
+import at.ac.tuwien.sbc.valesriegler.types.OrderStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import at.ac.tuwien.sbc.valesriegler.common.TableModel;
-import at.ac.tuwien.sbc.valesriegler.common.Util;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class OrdersOverviewModel extends AbstractOrdersModel<GroupData> {
 	private static final Logger log = LoggerFactory.getLogger(OrdersOverviewModel.class);
@@ -30,11 +29,11 @@ public class OrdersOverviewModel extends AbstractOrdersModel<GroupData> {
 		String wantedColumn = COLUMNS[columnIndex];
 		switch (wantedColumn) {
 		case ID:
-			return order.getId();
+			return String.format(Util.NUMBER_DISPLAY_FORMAT, order.getId());
 		case TABLE_ID:
-			return group.getTable().getId();
+			return String.format(Util.NUMBER_DISPLAY_FORMAT, group.getTable().getId());
 		case GROUP_ID:
-			return order.getGroupId();
+			return String.format(Util.NUMBER_DISPLAY_FORMAT, order.getGroupId());
 		case STATUS:
 			return order.getStatus();
 		default:
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/types/DeliveryStatus.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/types/DeliveryStatus.java
index 5348feb..1d7225a 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/types/DeliveryStatus.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/types/DeliveryStatus.java
@@ -4,5 +4,5 @@ package at.ac.tuwien.sbc.valesriegler.types;
 import java.io.Serializable;
 
 public enum DeliveryStatus implements Serializable {
-   ORDERED, IS_DELIVERED, DELIVERED, PAID, DELIVERY_FAILED, START;
+   ORDERED, IN_PROGRESS, IS_DELIVERED, DELIVERED, PAID, DELIVERY_FAILED, START;
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/AbstractXVSMConnector.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/AbstractXVSMConnector.java
index 5b9f376..270c73f 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/AbstractXVSMConnector.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/AbstractXVSMConnector.java
@@ -46,6 +46,9 @@ public abstract class AbstractXVSMConnector {
     protected ContainerReference pizzeriaGroupContainer;
     protected ContainerReference pizzeriaDeliveryContainer;
     protected ContainerReference pizzeriaTableContainer;
+    protected ContainerReference deliveryInProgress;
+    protected ContainerReference deliveryDone;
+    protected ContainerReference billPaid;
 
     protected Capi capi;
     protected NotificationManager notificationMgr;
@@ -89,7 +92,7 @@ public abstract class AbstractXVSMConnector {
             Util.handleSpaceErrorAndTerminate(e);
         }
 
-        throw new RuntimeException("Could not Create container " + containerName);
+        throw new RuntimeException("Could not lookup or create container " + containerName);
     }
 
     protected List<Coordinator> createCoordinators(Coordinator... coordinator) {
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/CookXVSM.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/CookXVSM.java
index acaae9c..cc712c8 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/CookXVSM.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/CookXVSM.java
@@ -4,7 +4,6 @@ import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.types.*;
 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
-import org.mozartspaces.core.ContainerReference;
 import org.mozartspaces.core.MzsConstants.RequestTimeout;
 import org.mozartspaces.core.MzsCoreException;
 import org.mozartspaces.core.TransactionReference;
@@ -34,10 +33,11 @@ public class CookXVSM extends AbstractXVSMConnector {
         pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS);
         preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
         pizzeriaGroupContainer = useContainer(Util.PIZZERIA_GROUP);
+        pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
     }
 
     public void listenForPizzas() {
-        SpaceListener pizzasListener = getDefaultBuilder().setCref(preparePizzasContainer).setTimeout(15000).setSpaceAction(new SpaceAction() {
+        SpaceListener pizzasListener = getDefaultBuilder().setLookaround(true).setCref(preparePizzasContainer).setTimeout(15000).setSpaceAction(new SpaceAction() {
 
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries)
@@ -72,9 +72,8 @@ public class CookXVSM extends AbstractXVSMConnector {
 
                         PizzaOrder pizza = createPizza(order);
 
-                        final ContainerReference container = preparedPizzasContainer;
-                        sendItemsToContainer(Arrays.asList(pizza), container, RequestTimeout.DEFAULT, tx);
-                        final GroupData group  = new GroupData();
+                        sendItemsToContainer(Arrays.asList(pizza), preparedPizzasContainer, RequestTimeout.DEFAULT, tx);
+                        final GroupData group = new GroupData();
                         final Order groupOrder = new Order();
                         groupOrder.setId(pizza.getOrderId());
                         group.setOrder(groupOrder);
@@ -107,19 +106,21 @@ public class CookXVSM extends AbstractXVSMConnector {
      * in preparation!
      */
     private boolean mayPreparePizza(PizzaOrder pizzaOrder, TransactionReference tx) throws MzsCoreException {
-        List<PizzaOrder> deliveryPizzas = readMatchingEntities(new PizzaOrder(), prepareDeliveryPizzasContainer, tx, RequestTimeout.ZERO, "BBBBBB");
+        List<PizzaOrder> deliveryPizzas = readMatchingEntities(new PizzaOrder(), prepareDeliveryPizzasContainer, tx, RequestTimeout.ZERO, "MAYPREPAREPIZZA: Cannot access prepareDeliveryPizzasContainer");
         if (!deliveryPizzas.isEmpty()) {
             final PizzaOrder template = new PizzaOrder();
             template.setOrderId(pizzaOrder.getOrderId());
-            final List<PizzaOrder> pizzasOfOrderInProgress = readMatchingEntities(template, pizzaInProgressContainer, tx, RequestTimeout.ZERO, "ASDF");
+            final List<PizzaOrder> pizzasOfOrderInProgress = readMatchingEntities(template, pizzaInProgressContainer, tx, RequestTimeout.ZERO, "MAYPREPAREPIZZA:: Cannot access pizzaInProgressContainer");
             if (pizzasOfOrderInProgress.isEmpty()) return false;
+            final List<PizzaOrder> pizzasAlreadyDone = readMatchingEntities(template, preparedPizzasContainer, tx, RequestTimeout.ZERO, "MAYPREPAREPIZZA: Cannot access preparedPizzasContainer");
+            if(pizzasAlreadyDone.isEmpty()) return false;
         }
         return true;
     }
 
 
     public void listenForDeliveryPizzas() {
-        SpaceListener pizzasListener = getDefaultBuilder().setCref(prepareDeliveryPizzasContainer).setTimeout(15000).setSpaceAction(new SpaceAction() {
+        SpaceListener pizzasListener = getDefaultBuilder().setLookaround(true).setCref(prepareDeliveryPizzasContainer).setTimeout(15000).setSpaceAction(new SpaceAction() {
 
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries)
@@ -148,8 +149,22 @@ public class CookXVSM extends AbstractXVSMConnector {
 
                         PizzaOrder pizza = createPizza(order);
 
-                        final ContainerReference container = preparedDeliveryPizzasContainer;
-                        sendItemsToContainer(Arrays.asList(pizza), container, RequestTimeout.DEFAULT, tx);
+                        sendItemsToContainer(Arrays.asList(pizza), preparedDeliveryPizzasContainer, RequestTimeout.DEFAULT, tx);
+
+                        final DeliveryGroupData group = new DeliveryGroupData();
+                        final Order groupOrder = new Order();
+                        groupOrder.setId(pizza.getOrderId());
+                        group.setOrder(groupOrder);
+                        group.setDeliveryStatus(null);
+                        DeliveryGroupData groupData = takeMatchingEntity(group, pizzeriaDeliveryContainer, tx, RequestTimeout.DEFAULT, "Cannot take the delivery order from pizzeriaDeliveryContainer");
+                        final List<PizzaOrder> orderedPizzas = groupData.getOrder().getOrderedPizzas();
+                        for (PizzaOrder orderedPizza : orderedPizzas) {
+                            if (orderedPizza.getId() == pizza.getId()) {
+                                orderedPizza.setStatus(PizzaOrderStatus.DONE);
+                                orderedPizza.setCookId(pizza.getCookId());
+                            }
+                        }
+                        sendItemsToContainer(Arrays.asList(groupData), pizzeriaDeliveryContainer, RequestTimeout.DEFAULT, tx);
 
                         capi.commitTransaction(tx);
                         log.info("I have completed preparing a delivery pizza for order {}!", pizza.getOrderId());
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
index 4a2c38e..302d0a3 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
@@ -2,9 +2,21 @@ package at.ac.tuwien.sbc.valesriegler.xvsm;
 
 
 import at.ac.tuwien.sbc.valesriegler.common.Util;
+import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
+import at.ac.tuwien.sbc.valesriegler.types.DeliveryStatus;
+import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
+import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
+import org.mozartspaces.core.ContainerReference;
+import org.mozartspaces.core.MzsConstants;
+import org.mozartspaces.core.TransactionReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+
 public class DriverXVSM extends AbstractXVSMConnector {
     private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
 
@@ -18,7 +30,69 @@ public class DriverXVSM extends AbstractXVSMConnector {
         this.preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
         this.deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
         this.deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
+        pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
+        deliveryDone = useContainer(Util.DELIVERY_DONE);
+        deliveryInProgress = useContainer(Util.DELIVERY_PROGRESS);
     }
 
 
+    public void listenForPreparedDeliveryOrders() {
+        SpaceListener orderListener = getDefaultBuilder().setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
+
+            @Override
+            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
+                final List<DeliveryGroupData> deliveries = castEntries(entries);
+
+                for (DeliveryGroupData delivery : deliveries) {
+                    DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
+                    template.setDeliveryStatus(DeliveryStatus.ORDERED);
+
+                    final TransactionReference tx = capi.createTransaction(
+                           7000,
+                            URI.create(String.format(Util.SERVER_ADDR, port)));
+                    final String error = "Another driver wants to deliver this order!";
+
+                    try {
+                        // Get lock for delivering this delivery order
+                        takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.DEFAULT, error);
+                        final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, MzsConstants.RequestTimeout.DEFAULT, "Cannot get the delivery order!");
+                        group.setDriverId(driverId);
+                        group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
+
+                        final List<DeliveryGroupData> groups = Arrays.asList(group);
+                        sendItemsToContainer(groups,
+                                deliveryInProgress, MzsConstants.RequestTimeout.ZERO, null);
+                        sendItemsToContainer(groups,
+                                pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
+
+                        Thread.sleep(3000);
+
+                        final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
+                        ContainerReference cref;
+                        try {
+                            cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
+                            log.debug("Looked up container {} successfully!", address);
+
+                            group.setDeliveryStatus(DeliveryStatus.DELIVERED);
+
+                        } catch (Exception ex) {
+                            log.info("Could not find container {}", address);
+
+                            group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
+                        }
+                        sendItemsToContainer(groups, deliveryDone, MzsConstants.RequestTimeout.DEFAULT, tx);
+                        sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.DEFAULT, tx);
+                        capi.commitTransaction(tx);
+
+
+                    } catch (Exception e) {
+                        log.info("DRiverXVSM exception");
+                        log.info(e.getMessage());
+                        e.printStackTrace();
+                    }
+                }
+
+            }
+        }).createSpaceListenerImpl();
+    }
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
index b5abdeb..8230aa7 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
@@ -38,7 +38,7 @@ public class GroupAgentXVSM extends AbstractXVSMConnector {
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
                 GroupData groupData = getSingleGroup(entries);
-                final int groupId = groupData.getOrder().getId();
+                final int groupId = groupData.getId();
 
                 SwingUtilities.invokeLater(new Runnable() {
                     @Override
@@ -123,6 +123,42 @@ public class GroupAgentXVSM extends AbstractXVSMConnector {
         }).createSpaceListenerImpl();
 	}
 
+    public void listenForDeliveryOrdersTaken(int port) {
+        getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_ORDER_TAKEN, port)).setSpaceAction(new SpaceAction() {
+            @Override
+            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
+                final List<DeliveryGroupData> groups = castEntries(entries);
+
+                SwingUtilities.invokeLater(new Runnable() {
+
+                    @Override
+                    public void run() {
+                        GroupAgent.getInstance().getDeliveryModel().setOrdersTaken(groups);
+                    }
+                });
+            }
+        }).createSpaceListenerImpl();
+    }
+
+    private void listenForDeliveredDeliveryOrders(int port) {
+        getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_DONE, port)).setSpaceAction(new SpaceAction() {
+            @Override
+            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
+                final List<DeliveryGroupData> groups = castEntries(entries);
+
+                log.info("DElivered orders!");
+
+                SwingUtilities.invokeLater(new Runnable() {
+
+                    @Override
+                    public void run() {
+                        GroupAgent.getInstance().getDeliveryModel().setOrdersDelivered(groups);
+                    }
+                });
+            }
+        }).createSpaceListenerImpl();
+    }
+
     public void listenForNewPizzerias() {
         SpaceListener newPizzeriaListener = getDefaultBuilder().setCref(groupAgentInfoContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
 
@@ -160,6 +196,8 @@ public class GroupAgentXVSM extends AbstractXVSMConnector {
         listenForPaymentRequest(port);
         listenForTableAssigned(port);
         listenForOrdersTaken(port);
+        listenForDeliveryOrdersTaken(port);
+        listenForDeliveredDeliveryOrders(port);
     }
 
     public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
@@ -176,6 +214,15 @@ public class GroupAgentXVSM extends AbstractXVSMConnector {
     }
 
     public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
-        sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
+        try {
+            TransactionReference tx = capi.createTransaction(
+                    Util.SPACE_TRANSACTION_TIMEOUT,
+                    URI.create(format(Util.SERVER_ADDR, pizzeriaSpacePort)));
+            sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
+            sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_DELIVERY, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
+            capi.commitTransaction(tx);
+        } catch (MzsCoreException e) {
+            Util.handleSpaceErrorAndTerminate(e);
+        }
     }
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
index c100f3c..947b870 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
@@ -33,6 +33,9 @@ public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
         pizzeriaTableContainer = useContainer(Util.PIZZERIA_TABLE);
         pizzeriaGroupContainer = useContainer(Util.PIZZERIA_GROUP);
+        preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
+        pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
+
     }
 
 	public void listenForOccupiedTables() {
@@ -55,7 +58,7 @@ public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
         }).createSpaceListenerImpl();
 	}
 
-    public void listenForTables() {
+    public void listenForTablesUpdates() {
         SpaceListener tablesListener = getDefaultBuilder().setCref(pizzeriaTableContainer).setSpaceAction(new SpaceAction() {
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
@@ -80,13 +83,11 @@ public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
         }).createSpaceListenerImpl();
     }
 
-    public void listenForGroups() {
+    public void listenForGroupUpdates() {
 
         SpaceListener groupsListener = getDefaultBuilder().setCref(pizzeriaGroupContainer).setSpaceAction(new SpaceAction() {
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
-                log.info("listenForGroups!!!!!");
-
                 final List<GroupData> groups = castEntries(entries);
                 final List<GroupData> waitingGroups = getWaitingGroups(groups);
                 final List<GroupData> orderedGroups = getOrderedGroups(groups);
@@ -126,53 +127,8 @@ public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
         return waitingGroups;
     }
 
-    public void listenForFreeTables() {
-		SpaceListener tablesListener = getDefaultBuilder().setCref(freeTablesContainer).setSpaceAction(new SpaceAction() {
-
-            @Override
-            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
-                log.info("A table has become free");
-
-                final List<Table> tables = castEntries(entries);
-
-                log.info("freetables: " + tables.toString());
-//                final TransactionReference tx = getDefaultTransaction();
-//                for (Table table : tables) {
-//                    log.info("remove assigned table {}", table.getId());
-//                    takeMatchingEntities(new Table(table.getId()), tableAssignedContainer, tx, RequestTimeout.DEFAULT, "Could not remove assigned tables");
-//                }
-//                capi.commitTransaction(tx);
-
-                SwingUtilities.invokeLater(new Runnable() {
-                    @Override
-                    public void run() {
-                        PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
-                    }
-                });
-            }
-        }).createSpaceListenerImpl();
-	}
-
-	public void listenForWaitingGroups() {
-		
-        SpaceListener groupsListener = getDefaultBuilder().setCref(assignTableContainer).setSpaceAction(new SpaceAction() {
-            @Override
-            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
-                final List<GroupData> groups = castEntries(entries);
-
-                SwingUtilities.invokeLater(new Runnable() {
-                    @Override
-                    public void run() {
-                        PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
-                    }
-                });
-
-            }
-        }).createSpaceListenerImpl();
-	}
-
-    public void listenForTakenDeliveryOrders() {
-        SpaceListener orderTakenListener = getDefaultBuilder().setCref(deliveryOrderTakenContainer).setSpaceAction(new SpaceAction() {
+    public void listenForDeliveryUpdates() {//deliveryOrderTakenContainer
+        SpaceListener orderTakenListener = getDefaultBuilder().setCref(pizzeriaDeliveryContainer).setSpaceAction(new SpaceAction() {
             @Override
             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
                 final List<DeliveryGroupData> groups = castEntries(entries);
@@ -188,23 +144,24 @@ public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
         }).createSpaceListenerImpl();
     }
 
-public void listenForTakenOrders() {
-
-        SpaceListener orderTakenListener = getDefaultBuilder().setCref(orderTakenContainer).setSpaceAction(new SpaceAction() {
-            @Override
-            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
-                final List<GroupData> groups = castEntries(entries);
-
-                SwingUtilities.invokeLater(new Runnable() {
-                    @Override
-                    public void run() {
-                        PizzeriaAgent.getInstance().getOrdersModel().addItems(groups);
-                    }
-                });
 
-            }
-        }).createSpaceListenerImpl();
-	}
+//    public void listenForDeliveriesInProgress() {
+//        SpaceListener pizzasInProgress = getDefaultBuilder().setCref(deliveryInProgress).setSpaceAction(new SpaceAction() {
+//
+//            @Override
+//            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
+//                final List<DeliveryGroupData> groups = castEntries(entries);
+//
+//                SwingUtilities.invokeLater(new Runnable() {
+//                    @Override
+//                    public void run() {
+//                        PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
+//                    }
+//                });
+//
+//            }
+//        }).createSpaceListenerImpl();
+//    }
 
 	public void listenForPizzasInPreparation() {
 		SpaceListener pizzasInProgress = getDefaultBuilder().setCref(pizzaInProgressContainer).setSpaceAction(new SpaceAction() {
@@ -258,7 +215,6 @@ public void listenForTakenOrders() {
                     @Override
                     public void run() {
                         PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizzas);
-                        PizzeriaAgent.getInstance().getDeliveryOrdersModel().updateStatusOfPizzasDone(pizzas);
                     }
                 });
 
@@ -266,6 +222,24 @@ public void listenForTakenOrders() {
         }).createSpaceListenerImpl();
 	}
 
+    public void listenForPreparedDeliveryPizzas() {
+        SpaceListener preparedPizzasListener = getDefaultBuilder().setCref(preparedDeliveryPizzasContainer).setSpaceAction(new SpaceAction() {
+            @Override
+            public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
+                final List<Pizza> pizzas = castEntries(entries);
+
+                SwingUtilities.invokeLater(new Runnable() {
+                    @Override
+                    public void run() {
+                        PizzeriaAgent.getInstance().getDeliveryOrdersModel().updateStatusOfPizzasDone(pizzas);
+                    }
+                });
+
+            }
+        }).createSpaceListenerImpl();
+    }
+
+
 	public void listenForPayment() {
 		SpaceListener isGoneListener = getDefaultBuilder().setCref(paymentDoneContainer).setSpaceAction(new SpaceAction() {
             @Override
@@ -292,7 +266,6 @@ public void listenForTakenOrders() {
         }).createSpaceListenerImpl();
 	}
 
-
     public void sendFreeTablesToContainer(List<Table> tables) {
 		sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
 		sendItemsToContainer(tables, pizzeriaTableContainer, RequestTimeout.DEFAULT, null);
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/WaiterXVSM.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/WaiterXVSM.java
index 38ee3c1..e957d93 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/WaiterXVSM.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/WaiterXVSM.java
@@ -42,6 +42,7 @@ public class WaiterXVSM extends AbstractXVSMConnector {
         deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
         pizzeriaGroupContainer = useContainer(Util.PIZZERIA_GROUP);
         pizzeriaTableContainer = useContainer(Util.PIZZERIA_TABLE);
+        pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
     }
 
     public void listenForPhoneOrders() {
@@ -53,22 +54,26 @@ public class WaiterXVSM extends AbstractXVSMConnector {
                 for (DeliveryGroupData phoneOrder : phoneOrders) {
                     final int id = phoneOrder.getId();
                     final DeliveryGroupData template = new DeliveryGroupData(id);
-                    final String errorMsg = String.format("There was phone call with id %d", id);
+                    final String errorMsg = String.format("There was phone call with id %d. Another waiter already responded!", id);
 
                     final TransactionReference tx = getDefaultTransaction();
                     try {
-                        final DeliveryGroupData groupFromSpace = takeMatchingEntity(template, phoneCallsContainer, tx, RequestTimeout.DEFAULT, errorMsg);
-                        groupFromSpace.setWaiterIdOfOrder(WaiterXVSM.this.waiterId);
-                        final Order order = groupFromSpace.getOrder();
-                        groupFromSpace.setDeliveryStatus(DeliveryStatus.ORDERED);
+                        // Get the the delete lock so that only one waiter can answer this particular phone call
+                        takeMatchingEntity(template, phoneCallsContainer, tx, RequestTimeout.DEFAULT, errorMsg);
 
-                        updatePizzeriaOrderNumber(order, tx);
+                        final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, RequestTimeout.DEFAULT, errorMsg);
+                        group.setWaiterIdOfOrder(WaiterXVSM.this.waiterId);
+                        final Order order = group.getOrder();
+                        group.setDeliveryStatus(DeliveryStatus.ORDERED);
 
+                        updatePizzeriaOrderNumber(order, tx);
 
                         // send the order as a whole to the space
-                        final List<DeliveryGroupData> groupsWhoHaveOrdered = Arrays.asList(groupFromSpace);
+                        final List<DeliveryGroupData> groupsWhoHaveOrdered = Arrays.asList(group);
                         sendItemsToContainer(groupsWhoHaveOrdered,
                                 deliveryOrderTakenContainer, RequestTimeout.ZERO, tx);
+                        sendItemsToContainer(groupsWhoHaveOrdered,
+                                pizzeriaDeliveryContainer, RequestTimeout.ZERO, tx);
                         sendItemsToContainer(order.getOrderedPizzas(),
                                 prepareDeliveryPizzasContainer, RequestTimeout.ZERO, tx);
                         capi.commitTransaction(tx);
@@ -286,7 +291,6 @@ public class WaiterXVSM extends AbstractXVSMConnector {
                     order.setId(orderId);
 
                     TransactionReference tx = getDefaultTransaction();
-                    final boolean isDeliveryPizza = pizza.isDeliveryPizza();
 
                     try {
                         GroupData entity = new GroupData();
@@ -311,9 +315,6 @@ public class WaiterXVSM extends AbstractXVSMConnector {
 
                         final List<GroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
                         if (pizzasOfOrder.size() == numberOfPizzas) {
-                            for (PizzaOrder pizza1 : groupData.getOrder().getOrderedPizzas()) {
-                                log.info("STAtus of pizza: {}", pizza1.getStatus());
-                            }
                             groupData.setServingWaiter(waiterId);
                             groupData.setState(GroupState.EATING);
                             groupData.getOrder().setStatus(OrderStatus.DELIVERED);
@@ -371,9 +372,12 @@ public class WaiterXVSM extends AbstractXVSMConnector {
                         entity.setDeliveryStatus(null);
                         entity.setOrder(order);
 
-                        DeliveryGroupData groupData = takeMatchingEntity(entity,
+                        takeMatchingEntity(entity,
                                 deliveryOrderTakenContainer, tx, RequestTimeout.DEFAULT,
                                 "Another driver just checks if the delivery order is complete");
+                        DeliveryGroupData groupData = takeMatchingEntity(entity,
+                                pizzeriaDeliveryContainer, tx, RequestTimeout.DEFAULT,
+                                "Waiter cannot take the delivery order from Space!");
                         int groupId = groupData.getId();
                         int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
 
@@ -386,15 +390,13 @@ public class WaiterXVSM extends AbstractXVSMConnector {
                                 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
 
                         if (pizzasOfOrder.size() == numberOfPizzas) {
-                            DeliveryGroupData group = new DeliveryGroupData();
-                            Order completeOrder = new Order();
-                            completeOrder.setId(orderId);
-                            completeOrder.setGroupId(groupId);
-                            group.setOrder(completeOrder);
-                            final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(group);
+                            final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
                             sendItemsToContainer(groupsWithCompleteOrder,
                                     deliverDeliveryOrderContainer, RequestTimeout.DEFAULT,
                                     tx);
+                            sendItemsToContainer(groupsWithCompleteOrder,
+                                    pizzeriaDeliveryContainer, RequestTimeout.DEFAULT,
+                                    tx);
 
                             capi.commitTransaction(tx);
                         } else {
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/driver/Driver.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/driver/Driver.java
index c58a300..37de548 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/driver/Driver.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/driver/Driver.java
@@ -24,7 +24,7 @@ public class Driver {
 
     private void start() {
         xvsm = new DriverXVSM(id, port);
-//        xvsm.listenForPreparedPizzas();
+        xvsm.listenForPreparedDeliveryOrders();
     }
 
     public Driver(int id, int port) {
-- 
2.43.0