      end
    end
 
-   defp lookup_cell_txn({key, rev}, State[tab: tab, staging_tab: staging]) do
+   defp lookup_cell_txn({key, _} = cell, State[tab: tab] = state) do
      case ETS.lookup(tab, key) do
+       [] -> page = 0
+       [{_, page}] -> :ok
+     end
+     lookup_cell_txn(cell, state, page)
+   end
+   defp lookup_cell_txn({key, rev} = cell, State[tab: tab, staging_tab: staging] = state, page) do
+     case ETS.lookup(tab, {key, page}) do
        [] ->
          {@nil_value, "", ""}
-       [{_key, {value, [{entry_clock, ^rev}|_]}}] ->
+       [{_key, {_, {value, [{entry_clock, ^rev}|_]}}}] ->
          {value, entry_clock, rev}
-       [{_key, {_, history}}] ->
+       [{_key, {_, {_, history}}}] ->
          case Enum.find(history, fn({entry_clock, _}) -> 
                                                          entry_clock == rev or
                                                          ITC.decode(entry_clock) |>

                      State[tab: tab, staging_tab: staging, commit_tab: commit_tab] = state) do
     lc {key, entry_clock} inlist entries do
       case ETS.lookup(tab, key) do
         [] -> history = []; value = @nil_value
         [{^key, {value, history}}] -> :ok
       end
       {MsgPack.Map[map: commit_object_dict], ""} = MsgPack.unpack(commit_object)
       MsgPack.Map[map: log] = commit_object_dict[CO.log]

                       v
                     end
                   end)
       if page_ctr <= @object_page_size do
         ETS.insert(tab, {{key, page}, {page_ctr + 1, {value, [{entry_clock, clock}|history]}}})
       else
         # allocate a new page
         ETS.insert(tab, [{key, page + 1},
                          {{key, page + 1}, {1, {value, [{{entry_clock, clock}}]}}}])
       end
     end
     ETS.insert(commit_tab, {{:C, clock}, {commit_object, [clock]}})
     {:reply, {:ok, ref, state.partition, :ok}, state}
