The advent of non-volatile memory (NVM) technologies is expected to transform how software systems are structured fundamentally, making the task of \emph{correct} programming significantly harder. This is because ensuring that memory stores persist in the correct order is challenging, and requires low-level programming to flush the cache at appropriate points. This has in turn resulted in a noticeable \emph{verification gap}. %causing a significant verification burden.
To address this, we study the verification of NVM programs, and present \emph{Persistent Owicki-Gries} (POG), the first program logic for reasoning about such programs. We prove the soundness of POG over the recent Intel-x86 model, which formalises the out-of-order persistence of memory stores and the semantics of the Intel cache line flush instructions. We then use POG to verify several programs that interact with NVM.