diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java
index b2bfde8f896a306a0e798af1fe782c2fed9cf2c6..e3d05118efee46a35a8ec43290335a5ba3835128 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java
@@ -1,151 +1,9 @@
 package net.ihe.gazelle.proxy.dao;
 
-import java.util.Date;
-
-import net.ihe.gazelle.proxy.enums.ChannelType;
-import net.ihe.gazelle.proxy.enums.ProxySide;
-
-import org.apache.commons.lang.StringUtils;
 import org.hibernate.Criteria;
-import org.hibernate.criterion.Restrictions;
-
-public class MessageFilter {
-
-	private ChannelType messageType = ChannelType.HTTP;
-
-	private String initiatorIP;
-	private Integer initiatorPort;
-
-	private String responderIP;
-	private Integer responderPort;
-
-	private Integer proxyPort;
-
-	private Date dateFrom;
-	private Date dateTo;
-
-	private Integer connectionId;
-
-	private ProxySide proxySide = null;
-
-	public String getInitiatorIP() {
-		return initiatorIP;
-	}
-
-	public void setInitiatorIP(String initiatorIP) {
-		this.initiatorIP = initiatorIP;
-	}
-
-	public Integer getInitiatorPort() {
-		return initiatorPort;
-	}
-
-	public void setInitiatorPort(Integer initiatorPort) {
-		this.initiatorPort = initiatorPort;
-	}
-
-	public String getResponderIP() {
-		return responderIP;
-	}
-
-	public void setResponderIP(String responderIP) {
-		this.responderIP = responderIP;
-	}
-
-	public Integer getResponderPort() {
-		return responderPort;
-	}
-
-	public void setResponderPort(Integer responderPort) {
-		this.responderPort = responderPort;
-	}
-
-	public Integer getProxyPort() {
-		return proxyPort;
-	}
-
-	public void setProxyPort(Integer proxyPort) {
-		this.proxyPort = proxyPort;
-	}
-
-	public ProxySide getProxySide() {
-		return proxySide;
-	}
-
-	public void setProxySide(ProxySide proxySide) {
-		this.proxySide = proxySide;
-	}
-
-	public Date getDateFrom() {
-		return dateFrom;
-	}
-
-	public void setDateFrom(Date dateFrom) {
-		this.dateFrom = dateFrom;
-	}
-
-	public Date getDateTo() {
-		return dateTo;
-	}
-
-	public void setDateTo(Date dateTo) {
-		this.dateTo = dateTo;
-	}
-
-	public ChannelType getMessageType() {
-		return messageType;
-	}
-
-	public void setMessageType(ChannelType messageType) {
-		this.messageType = messageType;
-	}
-
-
-	public Integer getConnectionId() {
-		return connectionId;
-	}
-
-	public void setConnectionId(Integer connectionId) {
-		this.connectionId = connectionId;
-	}
-
-	public void reset() {
-		messageType = ChannelType.HTTP;
-		initiatorIP = null;
-		initiatorPort = null;
-		responderIP = null;
-		responderPort = null;
-		proxyPort = null;
-		dateFrom = null;
-		dateTo = null;
-		connectionId = null;
-		proxySide = null;
-	}
-
-	public void appendFilters(Criteria criteria) {
-		addEq(criteria, "fromIP", StringUtils.trimToNull(initiatorIP));
-		addEq(criteria, "localPort", initiatorPort);
-
-		addEq(criteria, "proxyPort", proxyPort);
-
-		addEq(criteria, "toIP", StringUtils.trimToNull(responderIP));
-		addEq(criteria, "remotePort", responderPort);
-
-		addEq(criteria, "connectionId", connectionId);
-		addEq(criteria, "proxySide", proxySide);
 
-		if (dateFrom != null) {
-			criteria.add(Restrictions.ge("dateReceived", dateFrom));
-		}
-		if (dateTo != null) {
-			criteria.add(Restrictions.le("dateReceived", dateTo));
-		}
-	}
+public interface MessageFilter {
 
-	private void addEq(Criteria criteria, String parameterName, Object value) {
-		if (value != null) {
-			criteria.add(Restrictions.eq(parameterName, value));
-		}
-	}
+	void appendFilters(Criteria criteria);
 
 }
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java
new file mode 100644
index 0000000000000000000000000000000000000000..9eead7671c317f45726bae03760fd8a095ed96d6
--- /dev/null
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java
@@ -0,0 +1,152 @@
+package net.ihe.gazelle.proxy.dao;
+
+import java.util.Date;
+
+import net.ihe.gazelle.proxy.enums.ChannelType;
+import net.ihe.gazelle.proxy.enums.ProxySide;
+
+import org.apache.commons.lang.StringUtils;
+import org.hibernate.Criteria;
+import org.hibernate.criterion.Restrictions;
+
+public class MessageFilterStandard implements MessageFilter {
+
+	private ChannelType messageType = ChannelType.HTTP;
+
+	private String initiatorIP;
+	private Integer initiatorPort;
+
+	private String responderIP;
+	private Integer responderPort;
+
+	private Integer proxyPort;
+
+	private Date dateFrom;
+	private Date dateTo;
+
+	private Integer connectionId;
+
+	private ProxySide proxySide = null;
+
+	public String getInitiatorIP() {
+		return initiatorIP;
+	}
+
+	public void setInitiatorIP(String initiatorIP) {
+		this.initiatorIP = initiatorIP;
+	}
+
+	public Integer getInitiatorPort() {
+		return initiatorPort;
+	}
+
+	public void setInitiatorPort(Integer initiatorPort) {
+		this.initiatorPort = initiatorPort;
+	}
+
+	public String getResponderIP() {
+		return responderIP;
+	}
+
+	public void setResponderIP(String responderIP) {
+		this.responderIP = responderIP;
+	}
+
+	public Integer getResponderPort() {
+		return responderPort;
+	}
+
+	public void setResponderPort(Integer responderPort) {
+		this.responderPort = responderPort;
+	}
+
+	public Integer getProxyPort() {
+		return proxyPort;
+	}
+
+	public void setProxyPort(Integer proxyPort) {
+		this.proxyPort = proxyPort;
+	}
+
+	public ProxySide getProxySide() {
+		return proxySide;
+	}
+
+	public void setProxySide(ProxySide proxySide) {
+		this.proxySide = proxySide;
+	}
+
+	public Date getDateFrom() {
+		return dateFrom;
+	}
+
+	public void setDateFrom(Date dateFrom) {
+		this.dateFrom = dateFrom;
+	}
+
+	public Date getDateTo() {
+		return dateTo;
+	}
+
+	public void setDateTo(Date dateTo) {
+		this.dateTo = dateTo;
+	}
+
+	public ChannelType getMessageType() {
+		return messageType;
+	}
+
+	public void setMessageType(ChannelType messageType) {
+		this.messageType = messageType;
+	}
+
+	public Integer getConnectionId() {
+		return connectionId;
+	}
+
+	public void setConnectionId(Integer connectionId) {
+		this.connectionId = connectionId;
+	}
+
+	public void reset() {
+		messageType = ChannelType.HTTP;
+		initiatorIP = null;
+		initiatorPort = null;
+		responderIP = null;
+		responderPort = null;
+		proxyPort = null;
+		dateFrom = null;
+		dateTo = null;
+		connectionId = null;
+		proxySide = null;
+	}
+
+	public void appendFilters(Criteria criteria) {
+		criteria.add(Restrictions.eq("class", getMessageType().getDiscriminator()));
+
+		addEq(criteria, "fromIP", StringUtils.trimToNull(initiatorIP));
+		addEq(criteria, "localPort", initiatorPort);
+
+		addEq(criteria, "proxyPort", proxyPort);
+
+		addEq(criteria, "toIP", StringUtils.trimToNull(responderIP));
+		addEq(criteria, "remotePort", responderPort);
+
+		addEq(criteria, "connectionId", connectionId);
+		addEq(criteria, "proxySide", proxySide);
+
+		if (dateFrom != null) {
+			criteria.add(Restrictions.ge("dateReceived", dateFrom));
+		}
+		if (dateTo != null) {
+			criteria.add(Restrictions.le("dateReceived", dateTo));
+		}
+	}
+
+	private void addEq(Criteria criteria, String parameterName, Object value) {
+		if (value != null) {
+			criteria.add(Restrictions.eq(parameterName, value));
+		}
+	}
+
+}
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java
new file mode 100644
index 0000000000000000000000000000000000000000..30f4ca2a334d9a3e1533cacdb2ea0046d343b31c
--- /dev/null
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java
@@ -0,0 +1,113 @@
+package net.ihe.gazelle.proxy.dao;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import net.ihe.gazelle.proxy.model.tm.Configuration;
+import net.ihe.gazelle.proxy.model.tm.Step;
+import net.ihe.gazelle.proxy.model.tm.TestInstance;
+
+import org.hibernate.Criteria;
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.LogicalExpression;
+import org.hibernate.criterion.Restrictions;
+
+public class MessageFilterStep implements MessageFilter {
+
+	private Step step;
+	private boolean filterPath = true;
+	private boolean filterPathFrom = true;
+	private boolean filterDates = true;
+
+	public MessageFilterStep(Step step) {
+		super();
+		this.step = step;
+	}
+
+	public void appendFilters(Criteria criteria) {
+		TestInstance testInstance = step.getTestInstance();
+
+		if (filterPath) {
+			List<Criterion> critSenders = new ArrayList<Criterion>();
+			List<Criterion> critReceivers = new ArrayList<Criterion>();
+
+			List<Configuration> senders = step.getSenders();
+			for (Configuration configuration : senders) {
+				critSenders.add(Restrictions.eq("fromIP", configuration.getHost()));
+			}
+			List<Configuration> receivers = step.getReceivers();
+			for (Configuration configuration : receivers) {
+				critReceivers.add(Restrictions.eq("proxyPort", configuration.getProxyPort()));
+			}
+
+			List<Criterion> paths = new ArrayList<Criterion>();
+			if (filterPathFrom) {
+				for (Criterion critSender : critSenders) {
+					for (Criterion critReceiver : critReceivers) {
+						LogicalExpression path = Restrictions.and(critSender, critReceiver);
+						paths.add(path);
+					}
+				}
+			} else {
+				paths = critReceivers;
+			}
+
+			Criterion oneOfPath = null;
+			for (Criterion path : paths) {
+				if (oneOfPath == null) {
+					oneOfPath = path;
+				} else {
+					oneOfPath = Restrictions.or(oneOfPath, path);
+				}
+			}
+
+			criteria.add(oneOfPath);
+		}
+
+		if (filterDates) {
+			Date startDate = getStartDate(testInstance);
+			Date endDate = step.getDate();
+
+			criteria.add(Restrictions.ge("dateReceived", startDate));
+			criteria.add(Restrictions.le("dateReceived", endDate));
+		}
+	}
+
+	private Date getStartDate(TestInstance testInstance) {
+		Date startDate;
+		List<Step> steps = testInstance.getSteps();
+		int indexOf = steps.indexOf(step);
+		if (indexOf == 0) {
+			startDate = testInstance.getDate();
+		} else {
+			startDate = steps.get(indexOf - 1).getDate();
+		}
+		return startDate;
+	}
+
+	public boolean isFilterPath() {
+		return filterPath;
+	}
+
+	public void setFilterPath(boolean filterPath) {
+		this.filterPath = filterPath;
+	}
+
+	public boolean isFilterPathFrom() {
+		return filterPathFrom;
+	}
+
+	public void setFilterPathFrom(boolean filterPathFrom) {
+		this.filterPathFrom = filterPathFrom;
+	}
+
+	public boolean isFilterDates() {
+		return filterDates;
+	}
+
+	public void setFilterDates(boolean filterDates) {
+		this.filterDates = filterDates;
+	}
+
+}
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java
index 7ad981c9d92e0fdaf11f37bc609a350ec5a5d0ac..9641fbe26034217b630e562296f056cdf9cf421f 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java
@@ -34,22 +34,28 @@ import net.ihe.gazelle.proxy.model.message.SyslogMessage;
 
 public enum ChannelType {
 
-	DICOM(DicomMessage.class),
+	DICOM(DicomMessage.class, "dicomMessage"),
 
-	HL7(HL7Message.class),
+	HL7(HL7Message.class, "hl7Message"),
 
-	SYSLOG(SyslogMessage.class),
+	SYSLOG(SyslogMessage.class, "syslogMessage"),
 
-	HTTP(HTTPMessage.class);
+	HTTP(HTTPMessage.class, "httpMessage");
 
 	private Class<? extends AbstractMessage> messageClass;
+	private String discriminator;
 
-	ChannelType(Class<? extends AbstractMessage> messageClass) {
+	ChannelType(Class<? extends AbstractMessage> messageClass, String discriminator) {
 		this.messageClass = messageClass;
+		this.discriminator = discriminator;
 	}
 
 	public Class<? extends AbstractMessage> getMessageClass() {
 		return messageClass;
 	}
 
+	public String getDiscriminator() {
+		return discriminator;
+	}
+
 }
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java
index 08dcd4b7295be353a8092e501b2481bf6f4e5623..c65726bf5d5387e543f92172571e9cdc51390d75 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java
@@ -1,10 +1,14 @@
 package net.ihe.gazelle.proxy.model.tm;
 
 import java.util.Date;
+import java.util.List;
 
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import javax.persistence.Transient;
@@ -26,29 +30,29 @@ public class Step {
 	@XmlElement(name = "id")
 	private int tmId;
 
-	@ManyToOne
+	@ManyToOne(fetch = FetchType.EAGER)
 	private TestInstance testInstance;
 
-	private Date dateStart;
-
-	private Date dateEnd;
-
 	@ManyToOne
 	private AbstractMessage message;
 
-	@ManyToOne
-	private Configuration sender;
+	@ManyToMany
+	@JoinTable(name="tm_step_sender")
+	private List<Configuration> senders;
 
 	@Transient
 	@XmlElement
-	private int senderId;
+	private List<Integer> senderIds;
 
-	@ManyToOne
-	private Configuration receiver;
+	@ManyToMany
+	@JoinTable(name="tm_step_receiver")
+	private List<Configuration> receivers;
 
 	@Transient
 	@XmlElement
-	private int receiverId;
+	private List<Integer> receiverIds;
+
+	private Date date;
 
 	public int getId() {
 		return id;
@@ -74,20 +78,12 @@ public class Step {
 		this.testInstance = testInstance;
 	}
 
-	public Date getDateStart() {
-		return dateStart;
-	}
-
-	public void setDateStart(Date dateStart) {
-		this.dateStart = dateStart;
-	}
-
-	public Date getDateEnd() {
-		return dateEnd;
+	public Date getDate() {
+		return date;
 	}
 
-	public void setDateEnd(Date dateEnd) {
-		this.dateEnd = dateEnd;
+	public void setDate(Date date) {
+		this.date = date;
 	}
 
 	public AbstractMessage getMessage() {
@@ -98,36 +94,36 @@ public class Step {
 		this.message = message;
 	}
 
-	public Configuration getSender() {
-		return sender;
+	public List<Configuration> getSenders() {
+		return senders;
 	}
 
-	public void setSender(Configuration sender) {
-		this.sender = sender;
+	public void setSenders(List<Configuration> senders) {
+		this.senders = senders;
 	}
 
-	public Configuration getReceiver() {
-		return receiver;
+	public List<Integer> getSenderIds() {
+		return senderIds;
 	}
 
-	public void setReceiver(Configuration receiver) {
-		this.receiver = receiver;
+	public void setSenderIds(List<Integer> senderIds) {
+		this.senderIds = senderIds;
 	}
 
-	public int getSenderId() {
-		return senderId;
+	public List<Configuration> getReceivers() {
+		return receivers;
 	}
 
-	public void setSenderId(int senderId) {
-		this.senderId = senderId;
+	public void setReceivers(List<Configuration> receivers) {
+		this.receivers = receivers;
 	}
 
-	public int getReceiverId() {
-		return receiverId;
+	public List<Integer> getReceiverIds() {
+		return receiverIds;
 	}
 
-	public void setReceiverId(int receiverId) {
-		this.receiverId = receiverId;
+	public void setReceiverIds(List<Integer> receiverIds) {
+		this.receiverIds = receiverIds;
 	}
 
 	@Override
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java
index bcf33e2fec8864b95b0576606c53bcc3948ff570..5588da0faae84ac648c86ceb8a2ebf1ee9b179c9 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java
@@ -1,8 +1,11 @@
 package net.ihe.gazelle.proxy.model.tm;
 
+import java.util.Date;
 import java.util.List;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
@@ -11,6 +14,8 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 
+import org.hibernate.annotations.Fetch;
+
 @Entity
 @Table(name = "tm_testInstance", schema = "public")
 @XmlAccessorType(XmlAccessType.NONE)
@@ -23,14 +28,16 @@ public class TestInstance {
 	@XmlElement(name = "id")
 	private int tmId;
 
-	@OneToMany(mappedBy = "testInstance")
+	@OneToMany(mappedBy = "testInstance", cascade = CascadeType.ALL)
 	@XmlElement
 	private List<Configuration> configurations;
 
-	@OneToMany(mappedBy = "testInstance")
+	@OneToMany(mappedBy = "testInstance", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
 	@XmlElement
 	private List<Step> steps;
 
+	private Date date;
+
 	public TestInstance() {
 		super();
 	}
@@ -67,6 +74,14 @@ public class TestInstance {
 		this.steps = steps;
 	}
 
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
 	@Override
 	public int hashCode() {
 		final int prime = 31;
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java
index 1a2d524ad04fb59a4ef6405a268ccbf5030525b4..d07c601e9c4830e97ffac78417df97a4adc8bff5 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java
@@ -2,17 +2,18 @@ package net.ihe.gazelle.proxy.action;
 
 import javax.faces.context.FacesContext;
 
-import org.hibernate.Criteria;
-
 import net.ihe.gazelle.jsf.datatable.HibernateDataModel;
 import net.ihe.gazelle.proxy.dao.MessageFilter;
+import net.ihe.gazelle.proxy.model.message.AbstractMessage;
+
+import org.hibernate.Criteria;
 
 public class HibernateMessageDataModel<T> extends HibernateDataModel<T> {
 
 	private MessageFilter messageFilter;
 
 	public HibernateMessageDataModel(MessageFilter messageFilter) {
-		super(messageFilter.getMessageType().getMessageClass());
+		super(AbstractMessage.class);
 		this.messageFilter = messageFilter;
 	}
 
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java
index 9a92b34ba26fafaf47b6090449a83e1508d9860c..cab4aad59a4f6b08cf82e21f3b965d670729ccfe 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java
@@ -3,12 +3,17 @@ package net.ihe.gazelle.proxy.action;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import javax.ejb.Remove;
-import javax.ejb.Stateful;
+import javax.faces.context.FacesContext;
+import javax.persistence.EntityManager;
 
 import net.ihe.gazelle.jsf.datatable.HibernateDataModel;
+import net.ihe.gazelle.proxy.action.dao.ProxyDAO;
 import net.ihe.gazelle.proxy.dao.MessageFilter;
+import net.ihe.gazelle.proxy.dao.MessageFilterStandard;
+import net.ihe.gazelle.proxy.dao.MessageFilterStep;
 import net.ihe.gazelle.proxy.enums.ChannelType;
 import net.ihe.gazelle.proxy.enums.ProxySide;
 import net.ihe.gazelle.proxy.model.message.AbstractMessage;
@@ -16,10 +21,12 @@ import net.ihe.gazelle.proxy.model.message.DicomMessage;
 import net.ihe.gazelle.proxy.model.message.HL7Message;
 import net.ihe.gazelle.proxy.model.message.HTTPMessage;
 import net.ihe.gazelle.proxy.model.message.SyslogMessage;
+import net.ihe.gazelle.proxy.model.tm.Step;
 
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.annotations.Create;
 import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.In;
 import org.jboss.seam.annotations.Name;
 import org.jboss.seam.annotations.Scope;
 
@@ -27,17 +34,30 @@ import org.jboss.seam.annotations.Scope;
 @Scope(ScopeType.PAGE)
 public class MessagesBean {
 
+	private static final String TYPE_TEST_STEP = "TEST_STEP";
+	private static final String TYPE_STANDARD = "STANDARD";
+
 	private transient HibernateMessageDataModel<AbstractMessage> messageDataModel;
 	private MessageFilter messageFilter;
+	private MessageFilterStandard messageFilterStandard;
+	private MessageFilterStep messageFilterStep;
+
+	@In
+	private EntityManager entityManager;
+
+	private String listType = null;
+	private Step step;
 
 	public void clearFilter() {
-		messageFilter.reset();
+		messageFilterStandard.reset();
 		rebuildDataModel();
 	}
 
 	@Create
 	public void createModel() {
-		messageFilter = new MessageFilter();
+		messageFilterStandard = new MessageFilterStandard();
+		messageFilter = messageFilterStandard;
+		messageFilterStep = null;
 		rebuildDataModel();
 	}
 
@@ -47,23 +67,27 @@ public class MessagesBean {
 	}
 
 	public Integer getConnectionId() {
-		return messageFilter.getConnectionId();
+		return messageFilterStandard.getConnectionId();
 	}
 
 	public Date getDateFrom() {
-		return messageFilter.getDateFrom();
+		return messageFilterStandard.getDateFrom();
 	}
 
 	public Date getDateTo() {
-		return messageFilter.getDateTo();
+		return messageFilterStandard.getDateTo();
 	}
 
 	public String getInitiatorIP() {
-		return messageFilter.getInitiatorIP();
+		return messageFilterStandard.getInitiatorIP();
 	}
 
 	public Integer getInitiatorPort() {
-		return messageFilter.getInitiatorPort();
+		return messageFilterStandard.getInitiatorPort();
+	}
+
+	public String getListType() {
+		return listType;
 	}
 
 	public HibernateDataModel<?> getMessageDataModel() {
@@ -71,7 +95,7 @@ public class MessagesBean {
 	}
 
 	public ChannelType getMessageType() {
-		return messageFilter.getMessageType();
+		return messageFilterStandard.getMessageType();
 	}
 
 	public List<ChannelType> getMessageTypes() {
@@ -79,11 +103,11 @@ public class MessagesBean {
 	}
 
 	public Integer getProxyPort() {
-		return messageFilter.getProxyPort();
+		return messageFilterStandard.getProxyPort();
 	}
 
 	public ProxySide getProxySide() {
-		return messageFilter.getProxySide();
+		return messageFilterStandard.getProxySide();
 	}
 
 	public List<ProxySide> getProxySides() {
@@ -91,11 +115,23 @@ public class MessagesBean {
 	}
 
 	public String getResponderIP() {
-		return messageFilter.getResponderIP();
+		return messageFilterStandard.getResponderIP();
 	}
 
 	public Integer getResponderPort() {
-		return messageFilter.getResponderPort();
+		return messageFilterStandard.getResponderPort();
+	}
+
+	public boolean isFilterDates() {
+		return messageFilterStep.isFilterDates();
+	}
+
+	public boolean isFilterPath() {
+		return messageFilterStep.isFilterPath();
+	}
+
+	public boolean isFilterPathFrom() {
+		return messageFilterStep.isFilterPathFrom();
 	}
 
 	public String linkedLabel(AbstractMessage message) {
@@ -160,44 +196,74 @@ public class MessagesBean {
 	}
 
 	public void setConnectionId(Integer connectionId) {
-		messageFilter.setConnectionId(connectionId);
+		messageFilterStandard.setConnectionId(connectionId);
 	}
 
 	public void setDateFrom(Date dateFrom) {
-		messageFilter.setDateFrom(dateFrom);
+		messageFilterStandard.setDateFrom(dateFrom);
 	}
 
 	public void setDateTo(Date dateTo) {
-		messageFilter.setDateTo(dateTo);
+		messageFilterStandard.setDateTo(dateTo);
+	}
+
+	public void setFilterDates(boolean filterDates) {
+		messageFilterStep.setFilterDates(filterDates);
+	}
+
+	public void setFilterPath(boolean filterPath) {
+		messageFilterStep.setFilterPath(filterPath);
+	}
+
+	public void setFilterPathFrom(boolean filterPathFrom) {
+		messageFilterStep.setFilterPathFrom(filterPathFrom);
 	}
 
 	public void setInitiatorIP(String initiatorIP) {
-		messageFilter.setInitiatorIP(initiatorIP);
+		messageFilterStandard.setInitiatorIP(initiatorIP);
 	}
 
 	public void setInitiatorPort(Integer initiatorPort) {
-		messageFilter.setInitiatorPort(initiatorPort);
+		messageFilterStandard.setInitiatorPort(initiatorPort);
+	}
+
+	public void setListType(String listType) {
+		this.listType = listType;
+		if (listType.equals(TYPE_TEST_STEP)) {
+			Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext()
+					.getRequestParameterMap();
+			String testStepId = params.get("id");
+			List<Step> steps = ProxyDAO.getStepsByTMId(Integer.parseInt(testStepId), entityManager);
+			if (steps.size() > 0) {
+				step = steps.get(0);
+			}
+			messageFilterStep = new MessageFilterStep(step);
+			messageFilter = messageFilterStep;
+			messageFilterStandard = null;
+
+			rebuildDataModel();
+		}
 	}
 
 	public void setMessageType(ChannelType messageType) {
-		messageFilter.setMessageType(messageType);
+		messageFilterStandard.setMessageType(messageType);
 		rebuildDataModel();
 	}
 
 	public void setProxyPort(Integer proxyPort) {
-		messageFilter.setProxyPort(proxyPort);
+		messageFilterStandard.setProxyPort(proxyPort);
 	}
 
 	public void setProxySide(ProxySide proxySide) {
-		messageFilter.setProxySide(proxySide);
+		messageFilterStandard.setProxySide(proxySide);
 	}
 
 	public void setResponderIP(String responderIP) {
-		messageFilter.setResponderIP(responderIP);
+		messageFilterStandard.setResponderIP(responderIP);
 	}
 
 	public void setResponderPort(Integer responderPort) {
-		messageFilter.setResponderPort(responderPort);
+		messageFilterStandard.setResponderPort(responderPort);
 	}
 
 }
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java
index deb92098eb29789f0455caf3a8dbeb1ca856620b..4f5d07aaba0b2e4d01cd94bc8bb7e88fc2fec612 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java
@@ -195,4 +195,9 @@ public class ProxyBean implements ProxyLocal {
 		return ips;
 	}
 
+	public boolean channelExists(int localPort) {
+		ProxyChannel findProxyWithLocalPort = findProxyWithLocalPort(localPort);
+		return findProxyWithLocalPort != null;
+	}
+
 }
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java
index ae637e9516aa59bb24fd50dc87829662c4aecc46..ca390824559e6f1a6063111aa3a06e9b879f14c2 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java
@@ -13,4 +13,6 @@ public interface ProxyLocal {
 
 	public void stopChannel(Integer localPort);
 
+	public boolean channelExists(int localPort);
+
 }
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java
index 47cc80f1ce802f3adb9318ff489f16491a8d06c4..e28a09ef035d4fa21037821da33d5deb16858f2e 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java
@@ -1,12 +1,18 @@
 package net.ihe.gazelle.proxy.action.dao;
 
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.criterion.Restrictions;
+
 import net.ihe.gazelle.proxy.dao.ChannelDAO;
 import net.ihe.gazelle.proxy.model.Channel;
+import net.ihe.gazelle.proxy.model.tm.Step;
 import net.ihe.gazelle.proxy.util.HibernateUtilPKI;
 import net.ihe.gazelle.proxy.util.HibernateUtilProxy;
 import net.ihe.gazelle.simulators.tls.CertificateDAO;
@@ -49,4 +55,22 @@ public class ProxyDAO {
 		return certificate;
 	}
 
+	public static void updateStepDate(int testStepId) {
+		EntityManager entityManager = HibernateUtilProxy.buildEntityManager();
+		List<Step> steps = getStepsByTMId(testStepId, entityManager);
+		for (Step step : steps) {
+			step.setDate(new Date());
+			entityManager.merge(step);
+		}
+		HibernateUtilProxy.releaseEntityManager(entityManager);
+	}
+
+	public static List<Step> getStepsByTMId(int testStepId, EntityManager entityManager) {
+		Session session = HibernateUtilProxy.getSession(entityManager);
+		Criteria criteria = session.createCriteria(Step.class);
+		criteria.add(Restrictions.eq("tmId", new Integer(testStepId)));
+		List<Step> steps = criteria.list();
+		return steps;
+	}
+
 }
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java
index 6bb35a8c5685c5a8b3fddc29bc3e267395e2b915..e0aad96649d29a935e8e20a9d2e6859cf1835d5c 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java
@@ -52,8 +52,7 @@ public class HibernateUtilProxy {
 		}
 	}
 
-	public static Session getSession() {
-		EntityManager entityManager = buildEntityManager();
+	public static Session getSession(EntityManager entityManager) {
 		if (entityManager != null) {
 			Object delegate = entityManager.getDelegate();
 			if (delegate instanceof Session) {
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java
index 6142fe6832a76c0692ffe51938bb2385422ca685..669173c2d10d0d1b77839a76053cb832819d668f 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java
@@ -1,14 +1,29 @@
 package net.ihe.gazelle.proxy.ws;
 
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
 import javax.ejb.Stateless;
+import javax.jws.HandlerChain;
 import javax.jws.WebMethod;
 import javax.jws.WebService;
+import javax.persistence.EntityManager;
 
+import net.ihe.gazelle.proxy.action.ProxyLocal;
+import net.ihe.gazelle.proxy.action.dao.ProxyDAO;
+import net.ihe.gazelle.proxy.enums.ChannelType;
+import net.ihe.gazelle.proxy.model.tm.Configuration;
+import net.ihe.gazelle.proxy.model.tm.Step;
 import net.ihe.gazelle.proxy.model.tm.TestInstance;
-import net.ihe.gazelle.proxy.ws.IProxyForTM;
+import net.ihe.gazelle.proxy.util.HibernateUtilProxy;
+
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.In;
 
 @WebService
 @Stateless
+@HandlerChain(file = "handlers.xml")
 public class ProxyForTM implements IProxyForTM {
 
 	public ProxyForTM() {
@@ -17,12 +32,83 @@ public class ProxyForTM implements IProxyForTM {
 
 	@WebMethod
 	public void startTestInstance(TestInstance testInstance) {
-		System.out.println("start instance " + testInstance);
+		Calendar endTI = Calendar.getInstance();
+		testInstance.setDate(endTI.getTime());
+
+		endTI.add(Calendar.YEAR, 1);
+
+		List<Step> steps = testInstance.getSteps();
+		List<Configuration> configurations = testInstance.getConfigurations();
+
+		for (Step step : steps) {
+			// never stopped
+			step.setDate(endTI.getTime());
+			step.setTestInstance(testInstance);
+			step.setMessage(null);
+			List<Integer> ids = step.getReceiverIds();
+			List<Configuration> stepConfigurations = new ArrayList<Configuration>();
+			if (ids != null) {
+				stepConfigurations = getStepConfigurations(configurations, ids);
+			}
+			step.setReceivers(stepConfigurations);
+
+			ids = step.getSenderIds();
+			stepConfigurations = new ArrayList<Configuration>();
+			if (ids != null) {
+				stepConfigurations = getStepConfigurations(configurations, ids);
+			}
+			step.setSenders(stepConfigurations);
+		}
+
+		for (Configuration configuration : configurations) {
+			configuration.setTestInstance(testInstance);
+
+			if (configuration.getProxyPort() > 0) {
+				startChannel(configuration);
+			}
+		}
+
+		EntityManager entityManager = HibernateUtilProxy.buildEntityManager();
+		entityManager.persist(testInstance);
+		HibernateUtilProxy.releaseEntityManager(entityManager);
+
+	}
+
+	private List<Configuration> getStepConfigurations(List<Configuration> configurations, List<Integer> ids) {
+		List<Configuration> stepConfigurations = new ArrayList<Configuration>();
+		for (Integer id : ids) {
+			Configuration stepConfiguration = getConfigurationByTmId(id, configurations);
+			if (stepConfiguration != null) {
+				stepConfigurations.add(stepConfiguration);
+			}
+		}
+		return stepConfigurations;
+	}
+
+	private void startChannel(Configuration configuration) {
+		ProxyLocal proxyBean = (ProxyLocal) Component.getInstance("proxyBean");
+		if (!proxyBean.channelExists(configuration.getProxyPort())) {
+			String name = configuration.getName();
+			Integer localPort = configuration.getProxyPort();
+			String remoteAddress = configuration.getHost();
+			Integer remotePort = configuration.getPort();
+			ChannelType channelType = configuration.getType();
+			proxyBean.startChannel(name, localPort, remoteAddress, remotePort, channelType, null);
+		}
+	}
+
+	private Configuration getConfigurationByTmId(int id, List<Configuration> configurations) {
+		for (Configuration configuration : configurations) {
+			if (configuration.getTmId() == id) {
+				return configuration;
+			}
+		}
+		return null;
 	}
 
 	@WebMethod
 	public void markTestStep(int testStepId) {
-		System.out.println("markTestStep " + testStepId);
+		ProxyDAO.updateStepDate(testStepId);
 	}
 
 }
diff --git a/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml b/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c2b91ee705217811fe893cb41d3cf365599bd8e6
--- /dev/null
+++ b/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml
@@ -0,0 +1,11 @@
+<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
+	<handler-chain>
+		<handler>
+			<handler-name>SOAP Request Handler</handler-name>
+			<handler-class>org.jboss.seam.webservice.SOAPRequestHandler
+			</handler-class>
+		</handler>
+	</handler-chain>
+</handler-chains>
\ No newline at end of file
diff --git a/gazelle-proxy-war/src/main/webapp/messageList.xhtml b/gazelle-proxy-war/src/main/webapp/messageList.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..b30329afc23ecb78c974ac69a744427609c9d745
--- /dev/null
+++ b/gazelle-proxy-war/src/main/webapp/messageList.xhtml
@@ -0,0 +1,120 @@
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:s="http://jboss.com/products/seam/taglib"
+	xmlns:ui="http://java.sun.com/jsf/facelets"
+	xmlns:f="http://java.sun.com/jsf/core"
+	xmlns:h="http://java.sun.com/jsf/html"
+	xmlns:rich="http://richfaces.org/rich"
+	xmlns:a4j="http://richfaces.org/a4j">
+
+	<rich:dataTable id="messagesList"
+		value="#{messagesBean.messageDataModel}" var="message" rows="20"
+		rowKeyConverter="org.jboss.seam.ui.EntityConverter">
+
+		<f:facet name="header">
+			<rich:datascroller id="datascrollerHead" />
+		</f:facet>
+
+		<rich:column width="10%" sortBy="#{'id'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['id']}">
+			<f:facet name="header">
+				<h:outputText value="Id" />
+			</f:facet>
+
+			<a4j:htmlCommandLink
+				action="#{messagesBean.redirectToMessage(message)}"
+				value="#{message.id}" target="_blank" />
+			<h:outputText value=" ("
+				rendered="#{messagesBean.linkedRendered(message)}" />
+			<a4j:htmlCommandLink
+				rendered="#{messagesBean.linkedRendered(message)}"
+				action="#{messagesBean.redirectToLinked(message)}"
+				value="#{messagesBean.linkedLabel(message)}" target="_blank" />
+			<h:outputText value=")"
+				rendered="#{messagesBean.linkedRendered(message)}" />
+
+		</rich:column>
+
+		<rich:column width="15%" sortBy="#{'dateReceived'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['dateReceived']}">
+			<f:facet name="header">
+				<h:outputText value="Date" />
+			</f:facet>
+			<h:outputText value="#{message.dateReceived}">
+				<f:convertDateTime dateStyle="short" type="both" timeZone="GMT+1" />
+			</h:outputText>
+		</rich:column>
+
+		<rich:column width="15%" filterEvent="onkeyup" sortBy="#{'fromIP'}"
+			filterBy="#{'fromIP'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['fromIP']}"
+			filterValue="#{dataTableStateHolder.columnFilterValues['fromIP']}">
+			<f:facet name="header">
+				<h:outputText value="From" />
+			</f:facet>
+
+			<a4j:htmlCommandLink
+				action="#{messagesBean.setInitiatorIP(message.fromIP)}"
+				value="#{message.fromIP}" />:<a4j:htmlCommandLink
+				action="#{messagesBean.setInitiatorPort(message.localPort)}"
+				value="#{message.localPort}" />
+
+		</rich:column>
+		<rich:column width="15%" filterEvent="onkeyup" sortBy="#{'toIP'}"
+			filterBy="#{'toIP'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['toIP']}"
+			filterValue="#{dataTableStateHolder.columnFilterValues['toIP']}">
+			<f:facet name="header">
+				<h:outputText value="To" />
+			</f:facet>
+
+			<a4j:htmlCommandLink
+				action="#{messagesBean.setResponderIP(message.toIP)}"
+				value="#{message.toIP}" />:<a4j:htmlCommandLink
+				action="#{messagesBean.setResponderPort(message.remotePort)}"
+				value="#{message.remotePort}" />
+
+		</rich:column>
+
+		<rich:column width="10%" sortBy="#{'proxyPort'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['proxyPort']}">
+			<f:facet name="header">
+				<h:outputText value="Proxy" />
+			</f:facet>
+			<a4j:htmlCommandLink
+				action="#{messagesBean.setProxyPort(message.proxyPort)}"
+				value="#{message.proxyPort}" />
+		</rich:column>
+
+		<rich:column width="10%" sortBy="#{'connectionId'}"
+			sortOrder="#{dataTableStateHolder.sortOrders['connectionId']}">
+			<f:facet name="header">
+				<h:outputText value="Connection Id" />
+			</f:facet>
+			<a4j:htmlCommandLink
+				action="#{messagesBean.setConnectionId(message.connectionId)}"
+				value="#{message.connectionId}" />
+		</rich:column>
+
+		<rich:column width="10%">
+			<f:facet name="header">
+				<h:outputText value="Type" />
+			</f:facet>
+			<h:graphicImage value="/img/request.png"
+				rendered="#{message.proxySide.isRequest()}" />
+			<h:graphicImage value="/img/response.png"
+				rendered="#{not message.proxySide.isRequest()}" />
+		</rich:column>
+
+		<rich:column width="15%">
+			<f:facet name="header">
+				<h:outputText value="Info" />
+			</f:facet>
+			<h:outputText value="#{message.getInfoGUI()}" />
+		</rich:column>
+
+		<f:facet name="footer">
+			<rich:datascroller id="datascroller" />
+		</f:facet>
+	</rich:dataTable>
+
+</ui:composition>
\ No newline at end of file
diff --git a/gazelle-proxy-war/src/main/webapp/messages.xhtml b/gazelle-proxy-war/src/main/webapp/messages.xhtml
index f69f46579328a6a57008b766f07370cb2064ce65..145454250f558bf6e7f816a7c9215000dfe73fb4 100644
--- a/gazelle-proxy-war/src/main/webapp/messages.xhtml
+++ b/gazelle-proxy-war/src/main/webapp/messages.xhtml
@@ -5,6 +5,7 @@
 	xmlns:h="http://java.sun.com/jsf/html"
 	xmlns:rich="http://richfaces.org/rich"
 	xmlns:a4j="http://richfaces.org/a4j" template="layout/template.xhtml">
+	#{messagesBean.setListType("STANDARD")}
 	<ui:define name="body">
 		<a4j:form>
 			<rich:simpleTogglePanel switchType="client" id="search"
@@ -107,118 +108,7 @@
 			<rich:spacer height="5" />
 
 			<s:div id="panelOfMessages">
-
-				<rich:dataTable id="messagesList"
-					value="#{messagesBean.messageDataModel}" var="message" rows="20"
-					rowKeyConverter="org.jboss.seam.ui.EntityConverter">
-
-					<f:facet name="header">
-						<rich:datascroller id="datascrollerHead" />
-					</f:facet>
-
-					<rich:column width="10%" sortBy="#{'id'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['id']}">
-						<f:facet name="header">
-							<h:outputText value="Id" />
-						</f:facet>
-
-						<a4j:htmlCommandLink
-							action="#{messagesBean.redirectToMessage(message)}"
-							value="#{message.id}" target="_blank" />
-						<h:outputText value=" ("
-							rendered="#{messagesBean.linkedRendered(message)}" />
-						<a4j:htmlCommandLink
-							rendered="#{messagesBean.linkedRendered(message)}"
-							action="#{messagesBean.redirectToLinked(message)}"
-							value="#{messagesBean.linkedLabel(message)}" target="_blank" />
-						<h:outputText value=")"
-							rendered="#{messagesBean.linkedRendered(message)}" />
-
-					</rich:column>
-
-					<rich:column width="15%" sortBy="#{'dateReceived'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['dateReceived']}">
-						<f:facet name="header">
-							<h:outputText value="Date" />
-						</f:facet>
-						<h:outputText value="#{message.dateReceived}">
-							<f:convertDateTime dateStyle="short" type="both" timeZone="GMT+1" />
-						</h:outputText>
-					</rich:column>
-
-					<rich:column width="15%" filterEvent="onkeyup" sortBy="#{'fromIP'}"
-						filterBy="#{'fromIP'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['fromIP']}"
-						filterValue="#{dataTableStateHolder.columnFilterValues['fromIP']}">
-						<f:facet name="header">
-							<h:outputText value="From" />
-						</f:facet>
-
-						<a4j:htmlCommandLink
-							action="#{messagesBean.setInitiatorIP(message.fromIP)}"
-							value="#{message.fromIP}" />:<a4j:htmlCommandLink
-							action="#{messagesBean.setInitiatorPort(message.localPort)}"
-							value="#{message.localPort}" />
-
-					</rich:column>
-					<rich:column width="15%" filterEvent="onkeyup" sortBy="#{'toIP'}"
-						filterBy="#{'toIP'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['toIP']}"
-						filterValue="#{dataTableStateHolder.columnFilterValues['toIP']}">
-						<f:facet name="header">
-							<h:outputText value="To" />
-						</f:facet>
-
-						<a4j:htmlCommandLink
-							action="#{messagesBean.setResponderIP(message.toIP)}"
-							value="#{message.toIP}" />:<a4j:htmlCommandLink
-							action="#{messagesBean.setResponderPort(message.remotePort)}"
-							value="#{message.remotePort}" />
-
-					</rich:column>
-
-					<rich:column width="10%" sortBy="#{'proxyPort'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['proxyPort']}">
-						<f:facet name="header">
-							<h:outputText value="Proxy" />
-						</f:facet>
-						<a4j:htmlCommandLink
-							action="#{messagesBean.setProxyPort(message.proxyPort)}"
-							value="#{message.proxyPort}" />
-					</rich:column>
-
-					<rich:column width="10%" sortBy="#{'connectionId'}"
-						sortOrder="#{dataTableStateHolder.sortOrders['connectionId']}">
-						<f:facet name="header">
-							<h:outputText value="Connection Id" />
-						</f:facet>
-						<a4j:htmlCommandLink
-							action="#{messagesBean.setConnectionId(message.connectionId)}"
-							value="#{message.connectionId}" />
-					</rich:column>
-
-					<rich:column width="10%">
-						<f:facet name="header">
-							<h:outputText value="Type" />
-						</f:facet>
-						<h:graphicImage value="/img/request.png"
-							rendered="#{message.proxySide.isRequest()}" />
-						<h:graphicImage value="/img/response.png"
-							rendered="#{not message.proxySide.isRequest()}" />
-					</rich:column>
-
-					<rich:column width="15%">
-						<f:facet name="header">
-							<h:outputText value="Info" />
-						</f:facet>
-						<h:outputText value="#{message.getInfoGUI()}" />
-					</rich:column>
-
-					<f:facet name="footer">
-						<rich:datascroller id="datascroller" />
-					</f:facet>
-				</rich:dataTable>
-
+				<ui:include src="messageList.xhtml" />
 			</s:div>
 
 		</a4j:form>
diff --git a/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml b/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8fa87c5e494420e5cadeba228d4b18bcc691594b
--- /dev/null
+++ b/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml
@@ -0,0 +1,14 @@
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:s="http://jboss.com/products/seam/taglib"
+	xmlns:ui="http://java.sun.com/jsf/facelets"
+	xmlns:f="http://java.sun.com/jsf/core"
+	xmlns:h="http://java.sun.com/jsf/html"
+	xmlns:rich="http://richfaces.org/rich"
+	xmlns:a4j="http://richfaces.org/a4j" template="layout/template.xhtml">
+	#{messagesBean.setListType("TEST_STEP")}
+	<ui:define name="body">
+		<a4j:form>
+			<ui:include src="messageList.xhtml" />
+		</a4j:form>
+	</ui:define>
+</ui:composition>
diff --git a/gazelle-proxy-ws/pom.xml b/gazelle-proxy-ws/pom.xml
index 49d2d4a87ae15d882f59355cf2a42fad82177243..ced546f76adf7926a64ca31d5152d1abc0e1518b 100644
--- a/gazelle-proxy-ws/pom.xml
+++ b/gazelle-proxy-ws/pom.xml
@@ -65,6 +65,11 @@
 						<artifactId>ejb-api</artifactId>
 						<version>3.0</version>
 					</dependency>
+					<dependency>
+						<groupId>org.jboss.seam</groupId>
+						<artifactId>jboss-seam</artifactId>
+						<version>2.2.0.GA</version>
+					</dependency>
 				</dependencies>
 			</plugin>