diff --git a/src/dex_cache.h b/src/dex_cache.h
index 9e762e1..2f75c86 100644
--- a/src/dex_cache.h
+++ b/src/dex_cache.h
@@ -16,23 +16,43 @@
 class String;
 union JValue;
 
-class DexCache : public ObjectArray<Object> {
+class CodeAndMethods : public IntArray {
  public:
+  Method* GetResolvedCode(uint32_t method_idx) const {
+    return reinterpret_cast<Method*>(Get(method_idx * kMax + kCode));
+  }
+  void* GetResolvedMethod(uint32_t method_idx) const {
+    return reinterpret_cast<byte*>(Get(method_idx * kMax + kMethod));
+  }
 
-  enum ArrayIndex {
-    kLocation = 0,
-    kStrings  = 1,
-    kTypes    = 2,
-    kMethods  = 3,
-    kFields   = 4,
-    kMax      = 5,
+  void SetResolvedMethod(uint32_t method_idx, Method* method) {
+    CHECK(method != NULL);
+    // CHECK(method->GetCode() != NULL);  // TODO enable when all code is compiling
+    Set(method_idx * kMax + kCode,   reinterpret_cast<int32_t>(method->GetCode()));
+    Set(method_idx * kMax + kMethod, reinterpret_cast<int32_t>(method));
+  }
+
+ static size_t LengthAsArray(size_t elements) {
+   return kMax * elements;
+ }
+
+ private:
+  enum TupleIndex {
+    kCode   = 0,
+    kMethod = 1,
+    kMax    = 2,
   };
 
+};
+
+class DexCache : public ObjectArray<Object> {
+ public:
   void Init(String* location,
             ObjectArray<String>* strings,
             ObjectArray<Class>* types,
             ObjectArray<Method>* methods,
-            ObjectArray<Field>* fields);
+            ObjectArray<Field>* fields,
+            CodeAndMethods* code_and_methods);
 
   String* GetLocation() const {
     return Get(kLocation)->AsString();
@@ -69,6 +89,10 @@
     return GetFields()->GetLength();
   }
 
+  size_t NumCodeAndMethods() const {
+    return GetCodeAndMethods()->GetLength();
+  }
+
   String* GetResolvedString(uint32_t string_idx) const {
     return GetStrings()->Get(string_idx);
   }
@@ -113,8 +137,26 @@
   ObjectArray<Field>* GetFields() const {
     return static_cast<ObjectArray<Field>*>(GetNonNull(kFields));
   }
+  CodeAndMethods* GetCodeAndMethods() const {
+    return static_cast<CodeAndMethods*>(GetNonNull(kCodeAndMethods));
+  }
+
+ static size_t LengthAsArray() {
+   return kMax;
+ }
 
  private:
+
+  enum ArrayIndex {
+    kLocation       = 0,
+    kStrings        = 1,
+    kTypes          = 2,
+    kMethods        = 3,
+    kFields         = 4,
+    kCodeAndMethods = 5,
+    kMax            = 6,
+  };
+
   Object* GetNonNull(ArrayIndex array_index) const {
     Object* obj = Get(array_index);
     DCHECK(obj != NULL);
