diff --git a/extensions/b2g/viewer.js b/extensions/b2g/viewer.js
index 94bb77caa..e93d503b5 100644
--- a/extensions/b2g/viewer.js
+++ b/extensions/b2g/viewer.js
@@ -88,7 +88,7 @@ var PDFViewerApplication = {
 
   setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
     this.url = url;
-    var title = PDFJS.getFileName(url) || url;
+    var title = PDFJS.getFilenameFromUrl(url) || url;
     try {
       title = decodeURIComponent(title);
     } catch (e) {
diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js
index 7eef28360..f64c438cf 100644
--- a/src/display/annotation_layer.js
+++ b/src/display/annotation_layer.js
@@ -32,6 +32,7 @@ var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType;
 var AnnotationType = sharedUtil.AnnotationType;
 var Util = sharedUtil.Util;
 var addLinkAttributes = sharedUtil.addLinkAttributes;
+var getFilenameFromUrl = sharedUtil.getFilenameFromUrl;
 var warn = sharedUtil.warn;
 var CustomStyle = displayDOMUtils.CustomStyle;
 
@@ -731,7 +732,7 @@ var FileAttachmentAnnotationElement = (
   function FileAttachmentAnnotationElement(parameters) {
     AnnotationElement.call(this, parameters, true);
 
-    this.filename = parameters.data.file.filename;
+    this.filename = getFilenameFromUrl(parameters.data.file.filename);
     this.content = parameters.data.file.content;
   }
 
diff --git a/src/shared/util.js b/src/shared/util.js
index 3a6b4f2c6..2c5f96ea3 100644
--- a/src/shared/util.js
+++ b/src/shared/util.js
@@ -284,6 +284,17 @@ var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
   font: 'font'
 };
 
+// Gets the file name from a given URL.
+function getFilenameFromUrl(url) {
+  var anchor = url.indexOf('#');
+  var query = url.indexOf('?');
+  var end = Math.min(
+    anchor > 0 ? anchor : url.length,
+    query > 0 ? query : url.length);
+  return url.substring(url.lastIndexOf('/', end) + 1, end);
+}
+PDFJS.getFilenameFromUrl = getFilenameFromUrl;
+
 // Combines two URLs. The baseUrl shall be absolute URL. If the url is an
 // absolute URL, it will be returned as is.
 function combineUrl(baseUrl, url) {
@@ -2367,6 +2378,7 @@ exports.combineUrl = combineUrl;
 exports.createPromiseCapability = createPromiseCapability;
 exports.deprecated = deprecated;
 exports.error = error;
+exports.getFilenameFromUrl = getFilenameFromUrl;
 exports.getLookupTableFactory = getLookupTableFactory;
 exports.info = info;
 exports.isArray = isArray;
diff --git a/test/unit/util_spec.js b/test/unit/util_spec.js
index bf9cedf93..bd4a0f2a4 100644
--- a/test/unit/util_spec.js
+++ b/test/unit/util_spec.js
@@ -1,10 +1,25 @@
 /* globals expect, it, describe, combineUrl, Dict, isDict, Name, PDFJS,
            stringToPDFString, isExternalLinkTargetSet, LinkTarget,
-           removeNullCharacters */
+           removeNullCharacters, getFilenameFromUrl */
 
 'use strict';
 
 describe('util', function() {
+  describe('getFilenameFromUrl', function() {
+    it('should get the filename from an absolute URL', function() {
+      var url = 'http://server.org/filename.pdf';
+      var result = getFilenameFromUrl(url);
+      var expected = 'filename.pdf';
+      expect(result).toEqual(expected);
+    });
+
+    it('should get the filename from a relative URL', function() {
+      var url = '../../filename.pdf';
+      var result = getFilenameFromUrl(url);
+      var expected = 'filename.pdf';
+      expect(result).toEqual(expected);
+    });
+  });
 
   describe('combineUrl', function() {
     it('absolute url with protocol stays as is', function() {
diff --git a/web/pdf_attachment_view.js b/web/pdf_attachment_view.js
index 9ac37d441..a2757c637 100644
--- a/web/pdf_attachment_view.js
+++ b/web/pdf_attachment_view.js
@@ -12,7 +12,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/* globals getFileName, PDFJS */
+/* globals PDFJS */
 
 'use strict';
 
@@ -84,7 +84,7 @@ var PDFAttachmentView = (function PDFAttachmentViewClosure() {
 
       for (var i = 0; i < attachmentsCount; i++) {
         var item = attachments[names[i]];
-        var filename = getFileName(item.filename);
+        var filename = PDFJS.getFilenameFromUrl(item.filename);
         var div = document.createElement('div');
         div.className = 'attachmentsItem';
         var button = document.createElement('button');
diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js
index 9980b7ebf..22af0e5f7 100644
--- a/web/pdf_viewer.component.js
+++ b/web/pdf_viewer.component.js
@@ -15,8 +15,7 @@
 /*jshint globalstrict: false */
 /* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService,
            DefaultTextLayerFactory, AnnotationLayerBuilder, PDFHistory,
-           DefaultAnnotationLayerFactory, getFileName, DownloadManager,
-           ProgressBar */
+           DefaultAnnotationLayerFactory, DownloadManager, ProgressBar */
 
 // Initializing PDFJS global object (if still undefined)
 if (typeof PDFJS === 'undefined') {
@@ -41,7 +40,6 @@ if (typeof PDFJS === 'undefined') {
   PDFJS.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
   PDFJS.PDFHistory = PDFHistory;
 
-  PDFJS.getFileName = getFileName;
   PDFJS.DownloadManager = DownloadManager;
   PDFJS.ProgressBar = ProgressBar;
 }).call((typeof window === 'undefined') ? this : window);
diff --git a/web/ui_utils.js b/web/ui_utils.js
index 9b681ba9f..5bb0592ad 100644
--- a/web/ui_utils.js
+++ b/web/ui_utils.js
@@ -23,15 +23,6 @@ var MAX_AUTO_SCALE = 1.25;
 var SCROLLBAR_PADDING = 40;
 var VERTICAL_PADDING = 5;
 
-function getFileName(url) {
-  var anchor = url.indexOf('#');
-  var query = url.indexOf('?');
-  var end = Math.min(
-    anchor > 0 ? anchor : url.length,
-    query > 0 ? query : url.length);
-  return url.substring(url.lastIndexOf('/', end) + 1, end);
-}
-
 /**
  * Returns scale factor for the canvas. It makes sense for the HiDPI displays.
  * @return {Object} The object with horizontal (sx) and vertical (sy)
diff --git a/web/viewer.js b/web/viewer.js
index 8e4441f2e..764c0af09 100644
--- a/web/viewer.js
+++ b/web/viewer.js
@@ -12,15 +12,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar,
-           DownloadManager, getFileName, getPDFFileNameFromURL,
-           PDFHistory, Preferences, SidebarView, ViewHistory, Stats,
-           PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
-           PasswordPrompt, PDFPresentationMode, PDFDocumentProperties, HandTool,
-           Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView,
-           OverlayManager, PDFFindController, PDFFindBar, PDFViewer,
-           PDFRenderingQueue, PresentationModeState, parseQueryString,
-           RenderingStates, UNKNOWN_SCALE, DEFAULT_SCALE_VALUE,
+/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar, DownloadManager,
+           getPDFFileNameFromURL, PDFHistory, Preferences, SidebarView,
+           ViewHistory, Stats, PDFThumbnailViewer, URL, noContextMenuHandler,
+           SecondaryToolbar, PasswordPrompt, PDFPresentationMode,
+           PDFDocumentProperties, HandTool, Promise, PDFLinkService,
+           PDFOutlineView, PDFAttachmentView, OverlayManager,
+           PDFFindController, PDFFindBar, PDFViewer, PDFRenderingQueue,
+           PresentationModeState, parseQueryString, RenderingStates,
+           UNKNOWN_SCALE, DEFAULT_SCALE_VALUE,
            IGNORE_CURRENT_POSITION_ON_ZOOM: true */
 
 'use strict';
@@ -486,7 +486,7 @@ var PDFViewerApplication = {
   setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
     this.url = url;
     try {
-      this.setTitle(decodeURIComponent(getFileName(url)) || url);
+      this.setTitle(decodeURIComponent(PDFJS.getFilenameFromUrl(url)) || url);
     } catch (e) {
       // decodeURIComponent may throw URIError,
       // fall back to using the unprocessed url in that case