diff --git a/gazelle-proxy-datamodel/pom.xml b/gazelle-proxy-datamodel/pom.xml
index a32a893fee1ac8be71b468b8da63bcc21ec19cbd..7caa0340dc2873afe71b01eeee5359b5871582a3 100644
--- a/gazelle-proxy-datamodel/pom.xml
+++ b/gazelle-proxy-datamodel/pom.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
 	<parent>
 		<groupId>net.ihe.gazelle.proxy</groupId>
@@ -59,6 +60,12 @@
 			<scope>provided</scope>
 		</dependency>
 
+		<dependency>
+			<groupId>commons-httpclient</groupId>
+			<artifactId>commons-httpclient</artifactId>
+			<version>3.1</version>
+		</dependency>
+
 	</dependencies>
 
 	<build>
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java
index 9b67f4f2469dcaca796dde8f9eeb228aa8caeecc..e395fd73e245bc9b466d9c8edd7364878182b0e6 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java
@@ -15,6 +15,8 @@
  */
 package net.ihe.gazelle.proxy.model.message;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.net.Inet4Address;
 import java.nio.charset.Charset;
 import java.util.Arrays;
@@ -39,6 +41,8 @@ import net.ihe.gazelle.proxy.enums.ChannelType;
 import net.ihe.gazelle.proxy.enums.ProxySide;
 import net.ihe.gazelle.proxy.model.Channel;
 
+import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
+import org.apache.commons.httpclient.methods.multipart.PartSource;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.WordUtils;
 import org.hibernate.validator.NotNull;
@@ -105,14 +109,6 @@ public abstract class AbstractMessage {
 		return new String(messageReceived, UTF_8);
 	}
 
-	public int getMessageLength() {
-		if (messageReceived == null) {
-			return 0;
-		} else {
-			return messageReceived.length;
-		}
-	}
-
 	public abstract ChannelType getChannelType();
 
 	public void setMessageReceivedAsString(String messageReceived) {
@@ -317,4 +313,20 @@ public abstract class AbstractMessage {
 		return true;
 	}
 
+	public int getMessageLength() {
+		if (messageReceived == null) {
+			return 0;
+		} else {
+			return messageReceived.length;
+		}
+	}
+
+	public InputStream getMessageReceivedStream() {
+		return new ByteArrayInputStream(messageReceived);
+	}
+
+	public PartSource getPartSource(String messageType) {
+		return new ByteArrayPartSource(messageType, messageReceived);
+	}
+
 }
diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java
index e3f33be9c4e83714fa43619d2593311927ee20f7..5ad0d16f75ae4ab3d36db41feba7a03e8da4f5ed 100644
--- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java
+++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java
@@ -16,7 +16,11 @@
 package net.ihe.gazelle.proxy.model.message;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,7 +42,10 @@ import net.ihe.gazelle.proxy.model.Channel;
 import net.ihe.gazelle.proxy.model.CommandFieldValues;
 import net.ihe.gazelle.proxy.model.DicomUIDValues;
 import net.ihe.gazelle.proxy.model.LabelKeywordDescriptionClass;
+import net.ihe.gazelle.proxy.util.Preferences;
 
+import org.apache.commons.httpclient.methods.multipart.FilePartSource;
+import org.apache.commons.httpclient.methods.multipart.PartSource;
 import org.hibernate.annotations.CollectionOfElements;
 import org.hibernate.annotations.IndexColumn;
 import org.jboss.seam.annotations.Name;
@@ -100,7 +107,7 @@ public class DicomMessage extends AbstractMessage implements java.io.Serializabl
 	public ChannelType getChannelType() {
 		return ChannelType.DICOM;
 	}
-	
+
 	// Constructors
 
 	private static Map<String, String> getMapOfDicomUID(EntityManager entityManager) {
@@ -354,4 +361,32 @@ public class DicomMessage extends AbstractMessage implements java.io.Serializabl
 		return true;
 	}
 
+	private File getFile() {
+		File storageFolder = new File(Preferences.getProperty("storage.dicom"));
+		return new File(storageFolder, getMessageReceivedAsString());
+	}
+
+	@Override
+	public int getMessageLength() {
+		return (int) getFile().length();
+	}
+
+	@Override
+	public InputStream getMessageReceivedStream() {
+		try {
+			return new FileInputStream(getFile());
+		} catch (FileNotFoundException e) {
+			return null;
+		}
+	}
+
+	@Override
+	public PartSource getPartSource(String messageType) {
+		try {
+			return new FilePartSource(messageType, getFile());
+		} catch (FileNotFoundException e) {
+			return null;
+		}
+	}
+
 }
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java
similarity index 100%
rename from gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java
rename to gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java
diff --git a/gazelle-proxy-ejb/src/main/resources/prefs.properties b/gazelle-proxy-datamodel/src/main/resources/prefs.properties
similarity index 50%
rename from gazelle-proxy-ejb/src/main/resources/prefs.properties
rename to gazelle-proxy-datamodel/src/main/resources/prefs.properties
index 1ee7d86d7620c00839d0de077b1cb1522f10ec66..f1a512f41c08f300cec17100f380520dd5ad3dfe 100644
--- a/gazelle-proxy-ejb/src/main/resources/prefs.properties
+++ b/gazelle-proxy-datamodel/src/main/resources/prefs.properties
@@ -1 +1,2 @@
 evsclient.url=${evsclient.url}
+storage.dicom=${storage.dicom}
diff --git a/gazelle-proxy-ejb/pom.xml b/gazelle-proxy-ejb/pom.xml
index fc70d35e6fd797e3c9c1e39b678a0d52966104ca..9be25705e38e4a8d3bcefa226d209a6327437337 100644
--- a/gazelle-proxy-ejb/pom.xml
+++ b/gazelle-proxy-ejb/pom.xml
@@ -114,10 +114,11 @@
 		</dependency>
 
 		<dependency>
-			<groupId>commons-httpclient</groupId>
-			<artifactId>commons-httpclient</artifactId>
-			<version>3.1</version>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.0.1</version>
+			<type>jar</type>
+			<scope>compile</scope>
 		</dependency>
-
 	</dependencies>
 </project>
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java
index 5cfd97f61fd89f657dedd52e5a17fea46f7b63bd..2ee288e2372ae5cf595edbf9d938910aada7c562 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java
@@ -1,6 +1,7 @@
 package net.ihe.gazelle.proxy.action;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.URLEncoder;
 import java.util.Map;
 
@@ -115,16 +116,31 @@ public class MessageBean {
 	public void downloadFile(boolean inline) {
 		try {
 			HttpServletResponse response = (HttpServletResponse) extCtx.getResponse();
-			byte[] bytes = message.getMessageReceived();
+			InputStream messageStream = message.getMessageReceivedStream();
 			ServletOutputStream servletOutputStream = response.getOutputStream();
 			response.setContentType("text/plain");
-			response.setContentLength(bytes.length);
+			response.setContentLength(message.getMessageLength());
 			if (!inline) {
 				response.setHeader("Content-Disposition", "attachment;filename=\"" + message.getId() + "\"");
 			}
-			servletOutputStream.write(bytes);
-			servletOutputStream.flush();
-			servletOutputStream.close();
+
+			byte[] buf = new byte[8192];
+			while (true) {
+				int length = messageStream.read(buf);
+				if (length < 0)
+					break;
+				servletOutputStream.write(buf, 0, length);
+			}
+
+			try {
+				messageStream.close();
+			} catch (IOException ignore) {
+			}
+			try {
+				servletOutputStream.close();
+			} catch (IOException ignore) {
+			}
+
 			facesContext.responseComplete();
 		} catch (Exception e) {
 			FacesMessages.instance().add(StatusMessage.Severity.ERROR, "Failed to download file", e);
@@ -173,11 +189,11 @@ public class MessageBean {
 		// First send the file to EVSClient
 		HttpClient client = new HttpClient();
 		PostMethod filePost = new PostMethod(Preferences.getProperty("evsclient.url") + "upload");
-		
+
 		// use the type as file name
 		String messageType = message.getChannelType().name();
 
-		PartSource partSource = new ByteArrayPartSource(messageType, message.getMessageReceived());		
+		PartSource partSource = message.getPartSource(messageType);
 		Part[] parts = { new FilePart("message", partSource) };
 		filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
 		int status = -1;
diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java
index 0df7782dd19b9c2b71f3408625830af8963f527f..2396f93f0d07a1fc4611cf323c70a1a687bcccb2 100644
--- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java
+++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java
@@ -4,16 +4,22 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 
 import javax.persistence.EntityManager;
 
+import org.apache.commons.io.FileUtils;
+
 import jp.digitalsensation.ihej.transactionmonitor.dicom.messageexchange.DimseMessage;
 import net.ihe.gazelle.proxy.model.Channel;
 import net.ihe.gazelle.proxy.model.message.DicomMessage;
 import net.ihe.gazelle.proxy.netty.channel.ProxySide;
+import net.ihe.gazelle.proxy.util.Preferences;
 
 public class DicomEventListener extends SameEventListener<DimseMessage> {
 
+	protected static final Charset UTF_8 = Charset.forName("UTF-8");
+
 	public DicomEventListener(Channel channelUsed) {
 		super(channelUsed);
 	}
@@ -56,10 +62,32 @@ public class DicomEventListener extends SameEventListener<DimseMessage> {
 				responderPort, channelId, convertProxySide(side));
 		if (dicom.getDataSet() != null) {
 			try {
-				File file = new File(dicom.getDataSet().getCanonicalPath());
-				byte[] bytes = getBytesFromFile(file);
-				messageToStore.setMessageReceived(bytes);
-				file.delete();
+				String storageDicom = Preferences.getProperty("storage.dicom");
+				File storageDicomFolder = new File(storageDicom);
+
+				String fileName = Long.toHexString(System.nanoTime());
+				if (fileName.length() < 3) {
+					fileName = "000" + fileName;
+				}
+
+				File targetFolder1 = new File(storageDicomFolder, fileName.substring(0, 1));
+				File targetFolder2 = new File(targetFolder1, fileName.substring(1, 2));
+				File targetFolder3 = new File(targetFolder2, fileName.substring(2, 3));
+
+				targetFolder3.mkdirs();
+
+				File targetFile = new File(targetFolder3, fileName);
+
+				File sourceFile = new File(dicom.getDataSet().getCanonicalPath());
+
+				FileUtils.copyFile(sourceFile, targetFile);
+
+				String pathToStore = targetFile.getAbsolutePath();
+				pathToStore = pathToStore.replace(storageDicom, "");
+
+				messageToStore.setMessageReceived(pathToStore.getBytes(UTF_8));
+
+				sourceFile.delete();
 			} catch (IOException e) {
 				e.printStackTrace();
 			}
diff --git a/pom.xml b/pom.xml
index bc579acda5d01131f326c501e3ef0b2f367ff456..277083e21fc5bd71d9615243a2341f72bf9ddcd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -202,6 +202,9 @@
 			<properties>
 				<cas.service>http://127.0.0.1:8080/proxy/</cas.service>
 				<evsclient.url>http://127.0.0.1:8080/EVSClient/</evsclient.url>
+
+				<dicom.storage>/tmp</dicom.storage>
+
 				<!-- development mode (disable in production) -->
 				<seam.debug>true</seam.debug>
 
@@ -247,6 +250,9 @@
 			<properties>
 				<cas.service>http://gazelle.ihe.net/proxy/</cas.service>
 				<evsclient.url>http://jumbo-2.irisa.fr:8080/EVSClient/</evsclient.url>
+
+				<dicom.storage>/opt/proxy/DICOM</dicom.storage>
+
 				<!-- development mode (disable in production) -->
 				<seam.debug>false</seam.debug>
 
@@ -282,50 +288,6 @@
 			</properties>
 		</profile>
 
-		<profile>
-			<id>bento</id>
-
-			<activation>
-				<activeByDefault>false</activeByDefault>
-			</activation>
-
-			<properties>
-				<cas.service>http://bento.irisa.fr:8080/proxy/</cas.service>
-				<!-- development mode (disable in production) -->
-				<seam.debug>false</seam.debug>
-
-				<!-- datasource configuration -->
-				<jdbc.connection.url>jdbc:postgresql://localhost/gazelle-proxy</jdbc.connection.url>
-				<jdbc.driver.class>org.postgresql.Driver</jdbc.driver.class>
-				<jdbc.user>gazelle</jdbc.user>
-				<jdbc.password>gazelle</jdbc.password>
-				<min.pool.size>10</min.pool.size>
-				<max.pool.size>50</max.pool.size>
-
-				<!-- pki datasource configuration -->
-				<jdbc.pki.connection.url>jdbc:postgresql://localhost/gazelle-proxy</jdbc.pki.connection.url>
-				<jdbc.pki.user>gazelle</jdbc.pki.user>
-				<jdbc.pki.password>gazelle</jdbc.pki.password>
-
-				<!-- development mode (exclude in production) -->
-				<exclude.bootstrap>true</exclude.bootstrap>
-
-				<!-- package exploded war file -->
-				<exploded.war.file>false</exploded.war.file>
-
-				<!-- persistence.xml configuration -->
-				<hibernate.dialect>
-					org.hibernate.dialect.PostgreSQLDialect
-				</hibernate.dialect>
-				<hibernate.hbm2ddl.auto>
-					update
-				</hibernate.hbm2ddl.auto>
-				<hibernate.show_sql>
-					false
-				</hibernate.show_sql>
-			</properties>
-		</profile>
-
 		<profile>
 			<id>eucat</id>
 
@@ -336,6 +298,10 @@
 			<properties>
 				<!-- <cas.service>http://131.114.254.7:8080/proxy/</cas.service> -->
 				<cas.service>http://surimi.irisa.fr:8080/proxy/</cas.service>
+
+				<evsclient.url>http://jumbo-2.irisa.fr:8080/EVSClient/</evsclient.url>
+				<storage.dicom>/opt/proxy/DICOM</storage.dicom>
+
 				<!-- development mode (disable in production) -->
 				<seam.debug>false</seam.debug>