diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c
index e79ff5f..d712108 100644
--- a/ntoskrnl/mm/section.c
+++ b/ntoskrnl/mm/section.c
@@ -928,12 +928,16 @@ MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT Section,
             {
                 NTSTATUS Status;
                 SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
-                IsDirectMapped = TRUE;
-#ifndef NEWCC
-                Status = CcRosUnmapVacb(SharedCacheMap, FileOffset.QuadPart, Dirty);
-#else
-                Status = STATUS_SUCCESS;
-#endif
+                if (SharedCacheMap != NULL)
+                {
+                    IsDirectMapped = TRUE;
+                    Status = CcRosUnmapVacb(SharedCacheMap, FileOffset.QuadPart, Dirty);
+                }
+                else
+                {
+                    Status = STATUS_SUCCESS;
+                }
+
                 if (!NT_SUCCESS(Status))
                 {
                     DPRINT1("CcRosUnmapVacb failed, status = %x\n", Status);
@@ -1091,7 +1095,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
     FileOffset = SegOffset + MemoryArea->Data.SectionData.Segment->Image.FileOffset;
     IsImageSection = MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE;
 
-    ASSERT(SharedCacheMap);
+    //ASSERT(SharedCacheMap);
 
     DPRINT("%S %I64x\n", FileObject->FileName.Buffer, FileOffset);
 
@@ -1100,7 +1104,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
      * memory area was mapped at an offset in the file which is page aligned
      * then get the related VACB.
      */
-    if (((FileOffset % PAGE_SIZE) == 0) &&
+    if (SharedCacheMap != NULL && ((FileOffset % PAGE_SIZE) == 0) &&
             ((SegOffset + PAGE_SIZE <= RawLength) || !IsImageSection) &&
             !(MemoryArea->Data.SectionData.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED))
     {
@@ -1151,6 +1155,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
         KIRQL Irql;
         PVOID PageAddr;
         LONGLONG VacbOffset;
+        PMDL Mdl;
 
         /*
          * Allocate a page, this is rather complicated by the possibility
@@ -1163,49 +1168,11 @@ MiReadPage(PMEMORY_AREA MemoryArea,
         {
             return(Status);
         }
-        Status = CcRosGetVacb(SharedCacheMap,
-                              FileOffset,
-                              &BaseOffset,
-                              &BaseAddress,
-                              &UptoDate,
-                              &Vacb);
-        if (!NT_SUCCESS(Status))
-        {
-            return(Status);
-        }
-        if (!UptoDate)
-        {
-            /*
-             * If the VACB isn't up to date then call the file
-             * system to read in the data.
-             */
-            Status = CcReadVirtualAddress(Vacb);
-            if (!NT_SUCCESS(Status))
-            {
-                CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE);
-                return Status;
-            }
-        }
 
-        Process = PsGetCurrentProcess();
-        PageAddr = MiMapPageInHyperSpace(Process, *Page, &Irql);
-        VacbOffset = BaseOffset + VACB_MAPPING_GRANULARITY - FileOffset;
-        Length = RawLength - SegOffset;
-        if (Length <= VacbOffset && Length <= PAGE_SIZE)
-        {
-            memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, Length);
-        }
-        else if (VacbOffset >= PAGE_SIZE)
-        {
-            memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, PAGE_SIZE);
-        }
-        else
+        if (SharedCacheMap != NULL)
         {
-            memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, VacbOffset);
-            MiUnmapPageInHyperSpace(Process, PageAddr, Irql);
-            CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE);
             Status = CcRosGetVacb(SharedCacheMap,
-                                  FileOffset + VacbOffset,
+                                  FileOffset,
                                   &BaseOffset,
                                   &BaseAddress,
                                   &UptoDate,
@@ -1227,18 +1194,102 @@ MiReadPage(PMEMORY_AREA MemoryArea,
                     return Status;
                 }
             }
-            PageAddr = MiMapPageInHyperSpace(Process, *Page, &Irql);
-            if (Length < PAGE_SIZE)
+        }
+        else
+        {
+            KEVENT Event;
+            IO_STATUS_BLOCK IoStatus;
+
+            Mdl = IoAllocateMdl(NULL, PAGE_SIZE, FALSE, FALSE, NULL);
+            if (Mdl == NULL)
             {
-                memcpy((char*)PageAddr + VacbOffset, BaseAddress, Length - VacbOffset);
+                return STATUS_INSUFFICIENT_RESOURCES;
+            }
+
+            MmBuildMdlFromPages(Mdl, Page);
+            Mdl->MdlFlags |= MDL_PAGES_LOCKED;
+
+            KeInitializeEvent(&Event, NotificationEvent, FALSE);
+            Status = IoPageRead(FileObject, Mdl, (PLARGE_INTEGER)&FileOffset, &Event, &IoStatus);
+            if (Status == STATUS_PENDING)
+            {
+                KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+                Status = IoStatus.Status;
+            }
+            if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
+            {
+                MmUnmapLockedPages (Mdl->MappedSystemVa, Mdl);
+            }
+        }
+
+        Process = PsGetCurrentProcess();
+        PageAddr = MiMapPageInHyperSpace(Process, *Page, &Irql);
+
+        if (SharedCacheMap != NULL)
+        {
+            VacbOffset = BaseOffset + VACB_MAPPING_GRANULARITY - FileOffset;
+            Length = RawLength - SegOffset;
+            if (Length <= VacbOffset && Length <= PAGE_SIZE)
+            {
+                memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, Length);
+            }
+            else if (VacbOffset >= PAGE_SIZE)
+            {
+                memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, PAGE_SIZE);
             }
             else
             {
-                memcpy((char*)PageAddr + VacbOffset, BaseAddress, PAGE_SIZE - VacbOffset);
+                memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, VacbOffset);
+                MiUnmapPageInHyperSpace(Process, PageAddr, Irql);
+                CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE);
+                Status = CcRosGetVacb(SharedCacheMap,
+                                      FileOffset + VacbOffset,
+                                      &BaseOffset,
+                                      &BaseAddress,
+                                      &UptoDate,
+                                      &Vacb);
+                if (!NT_SUCCESS(Status))
+                {
+                    return(Status);
+                }
+                if (!UptoDate)
+                {
+                    /*
+                     * If the VACB isn't up to date then call the file
+                     * system to read in the data.
+                     */
+                    Status = CcReadVirtualAddress(Vacb);
+                    if (!NT_SUCCESS(Status))
+                    {
+                        CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE);
+                        return Status;
+                    }
+                }
+                PageAddr = MiMapPageInHyperSpace(Process, *Page, &Irql);
+                if (Length < PAGE_SIZE)
+                {
+                    memcpy((char*)PageAddr + VacbOffset, BaseAddress, Length - VacbOffset);
+                }
+                else
+                {
+                    memcpy((char*)PageAddr + VacbOffset, BaseAddress, PAGE_SIZE - VacbOffset);
+                }
             }
         }
+
         MiUnmapPageInHyperSpace(Process, PageAddr, Irql);
-        CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE);
+
+        if (SharedCacheMap != NULL)
+        {
+            CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE);
+        }
+        else
+        {
+            ASSERT(Mdl != NULL);
+            IoFreeMdl(Mdl);
+
+            return Status;
+        }
     }
     return(STATUS_SUCCESS);
 }
@@ -2711,9 +2762,11 @@ MmpDeleteSection(PVOID ObjectBody)
     }
     if (Section->FileObject != NULL)
     {
+#if 0
 #ifndef NEWCC
         CcRosDereferenceCache(Section->FileObject);
 #endif
+#endif
         ObDereferenceObject(Section->FileObject);
         Section->FileObject = NULL;
     }
@@ -2986,8 +3039,7 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
         }
     }
 
-    if (FileObject->SectionObjectPointer == NULL ||
-            FileObject->SectionObjectPointer->SharedCacheMap == NULL)
+    if (FileObject->SectionObjectPointer == NULL)
     {
         ObDereferenceObject(Section);
         ObDereferenceObject(FileObject);
@@ -3070,9 +3122,11 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
     MmUnlockSectionSegment(Segment);
     Section->FileObject = FileObject;
     Section->MaximumSize = MaximumSize;
+#if 0
 #ifndef NEWCC
     CcRosReferenceCache(FileObject);
 #endif
+#endif
     //KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE);
     *SectionObject = Section;
     return(STATUS_SUCCESS);
@@ -3721,6 +3775,7 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject,
     if (FileObject == NULL)
         return STATUS_INVALID_FILE_FOR_SECTION;
 
+#if 0
 #ifndef NEWCC
     if (FileObject->SectionObjectPointer->SharedCacheMap == NULL)
     {
@@ -3728,6 +3783,7 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject,
         return STATUS_INVALID_FILE_FOR_SECTION;
     }
 #endif
+#endif
 
     /*
      * Create the section
@@ -3856,9 +3912,11 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject,
         Status = STATUS_SUCCESS;
     }
     Section->FileObject = FileObject;
+#if 0
 #ifndef NEWCC
     CcRosReferenceCache(FileObject);
 #endif
+#endif
     //KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE);
     *SectionObject = Section;
     return(Status);
@@ -3994,7 +4052,10 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
 #ifndef NEWCC
             FileObject = MemoryArea->Data.SectionData.Section->FileObject;
             SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
-            CcRosMarkDirtyFile(SharedCacheMap, Offset.QuadPart + Segment->Image.FileOffset);
+            if (SharedCacheMap != NULL)
+            {
+                CcRosMarkDirtyFile(SharedCacheMap, Offset.QuadPart + Segment->Image.FileOffset);
+            }
 #endif
             ASSERT(SwapEntry == 0);
         }
@@ -5029,7 +5090,7 @@ MmCreateSection (OUT PVOID  * Section,
 
 #ifndef NEWCC // A hack for initializing caching.
     // This is needed only in the old case.
-    if (FileHandle)
+    if (FileHandle && FALSE)
     {
         IO_STATUS_BLOCK Iosb;
         NTSTATUS Status;
