diff --git a/portal-impl/src/com/liferay/portlet/documentlibrary/util/DLImpl.java b/portal-impl/src/com/liferay/portlet/documentlibrary/util/DLImpl.java
index aaed7021bef9e1c9e63be723cce3316059d2594a..0c60d39b006f9515c63d66605b273f1a7f14d635 100644
--- a/portal-impl/src/com/liferay/portlet/documentlibrary/util/DLImpl.java
+++ b/portal-impl/src/com/liferay/portlet/documentlibrary/util/DLImpl.java
@@ -911,7 +911,7 @@ public class DLImpl implements DL {
 			boolean manualCheckInRequired, boolean openDocumentUrl)
 		throws PortalException {
 
-		StringBundler webDavURLSB = new StringBundler(7);
+		StringBundler webDavURLSB = new StringBundler(8);
 
 		boolean secure = false;
 
@@ -933,9 +933,25 @@ public class DLImpl implements DL {
 			webDavURLSB.append(MANUAL_CHECK_IN_REQUIRED_PATH);
 		}
 
+		String fileEntryTitle = null;
 		Group group = null;
+		boolean isOfficeFile = false;
 
 		if (fileEntry != null) {
+			String extension = fileEntry.getExtension();
+
+			fileEntryTitle = HtmlUtil.unescape(fileEntry.getTitle());
+
+			if (openDocumentUrl && isOfficeExtension(extension) &&
+				!fileEntryTitle.endsWith(StringPool.PERIOD + extension)) {
+
+				isOfficeFile = true;
+
+				webDavURLSB.append(OFFICE_EXTENSION_PATH);
+
+				fileEntryTitle += StringPool.PERIOD + extension;
+			}
+
 			group = GroupLocalServiceUtil.getGroup(fileEntry.getGroupId());
 		}
 		else {
@@ -970,7 +986,13 @@ public class DLImpl implements DL {
 
 		if (fileEntry != null) {
 			sb.append(StringPool.SLASH);
-			sb.append(DLWebDAVUtil.escapeURLTitle(fileEntry.getTitle()));
+
+			if (isOfficeFile) {
+				sb.append(URLCodec.encodeURL(fileEntryTitle, true));
+			}
+			else {
+				sb.append(DLWebDAVUtil.escapeURLTitle(fileEntry.getTitle()));
+			}
 		}
 
 		webDavURLSB.append(sb.toString());