diff --git a/src/gql.ts b/src/gql.ts
--- a/src/gql.ts
+++ b/src/gql.ts
@@ -4,13 +4,21 @@ import {
   Document,
 } from 'graphql';
 
+const cache: {[queryString: string]: Document} = {};
+
 function parseDocument(doc: string): Document {
+  if (cache[doc]) {
+    return cache[doc];
+  }
+
   const parsed = parse(doc);
 
   if (!parsed || parsed.kind !== 'Document') {
     throw new Error('Not a valid GraphQL document.');
   }
 
+  cache[doc] = parsed;
+
   return parsed as Document;
 }
 

diff --git a/test/gql.ts b/test/gql.ts
new file mode 100644
--- /dev/null
+++ b/test/gql.ts
@@ -0,0 +1,13 @@
+import { assert } from 'chai';
+
+import gql from '../src/gql';
+
+describe('gql', () => {
+  it('parses queries', () => {
+    assert.equal(gql`{ testQuery }`.kind, 'Document');
+  });
+
+  it('returns the same object for the same query', () => {
+    assert.isTrue(gql`{ sameQuery }` === gql`{ sameQuery }`);
+  });
+});
diff --git a/test/tests.ts b/test/tests.ts
--- a/test/tests.ts
+++ b/test/tests.ts
@@ -17,3 +17,4 @@ import './QueryManager';
 import './client';
 import './middleware';
 import './store';
+import './gql';

Memoize gql
Since `gql` now creates a new object every time it parses, that breaks `react-apollo` change detection. We should make the same queries `===` each other, like the original strings do.

