diff --git a/src/display/api.js b/src/display/api.js
index e1ece26c3..8701191af 100644
--- a/src/display/api.js
+++ b/src/display/api.js
@@ -409,6 +409,15 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
  *                      rendering call the function that is the first argument
  *                      to the callback.
  */
+ 
+/**
+ * PDF page operator list.
+ *
+ * @typedef {Object} PDFOperatorList
+ * @property {Array} fnArray - Array containing the operator functions.
+ * @property {Array} argsArray - Array containing the arguments of the
+ *                               functions.
+ */
 
 /**
  * Proxy to a PDFPage in the worker thread.
@@ -569,6 +578,45 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
 
       return renderTask;
     },
+
+    /**
+     * @return {Promise} A promise resolved with an {@link PDFOperatorList}
+     * object that represents page's operator list.
+     */
+    getOperatorList: function PDFPageProxy_getOperatorList() {
+      function operatorListChanged() {
+        if (intentState.operatorList.lastChunk) {
+          intentState.opListReadCapability.resolve(intentState.operatorList);
+        }
+      }
+
+      var renderingIntent = 'oplist';
+      if (!this.intentStates[renderingIntent]) {
+        this.intentStates[renderingIntent] = {};
+      }
+      var intentState = this.intentStates[renderingIntent];
+
+      if (!intentState.opListReadCapability) {
+        var opListTask = {};
+        opListTask.operatorListChanged = operatorListChanged;
+        intentState.receivingOperatorList = true;
+        intentState.opListReadCapability = createPromiseCapability();
+        intentState.renderTasks = [];
+        intentState.renderTasks.push(opListTask);
+        intentState.operatorList = {
+          fnArray: [],
+          argsArray: [],
+          lastChunk: false
+        };
+
+        this.transport.messageHandler.send('RenderPageRequest', {
+          pageIndex: this.pageIndex,
+          intent: renderingIntent
+        });
+      }
+      return intentState.opListReadCapability.promise;
+    },
+
     /**
      * @return {Promise} That is resolved a {@link TextContent}
      * object that represent the page text content.
@@ -614,7 +662,11 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
     _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
                                                             intent) {
       var intentState = this.intentStates[intent];
-      intentState.displayReadyCapability.resolve(transparency);
+      // TODO Refactor RenderPageRequest to separate rendering
+      // and operator list logic
+      if (intentState.displayReadyCapability) {
+        intentState.displayReadyCapability.resolve(transparency);
+      }
     },
     /**
      * For internal use only.
diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js
index dfdb010a6..8908e6b0e 100644
--- a/test/unit/api_spec.js
+++ b/test/unit/api_spec.js
@@ -130,10 +130,18 @@ describe('api', function() {
     it('gets ref', function() {
       expect(page.ref).toEqual({num: 15, gen: 0});
     });
+
+    it('gets operator list', function() {
+      var promise = page.getOperatorList();
+      waitsForPromise(promise, function (oplist) {
+        expect(!!oplist.fnArray).toEqual(true);
+        expect(!!oplist.argsArray).toEqual(true);
+        expect(oplist.lastChunk).toEqual(true);
+      });
+    });
     // TODO rotate
     // TODO viewport
     // TODO annotaions
     // TOOD text content
-    // TODO operation list
   });
 });