diff --git a/MemoryType.cpp b/MemoryType.cpp
new file mode 100644
index 0000000..e85fc87
--- /dev/null
+++ b/MemoryType.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MemoryType.h"
+
+#include <hidl-util/Formatter.h>
+#include <android-base/logging.h>
+
+namespace android {
+
+MemoryType::MemoryType() {}
+
+void MemoryType::addNamedTypesToSet(std::set<const FQName> &) const {
+    // do nothing
+}
+
+std::string MemoryType::getCppType(StorageMode mode,
+                                   bool specifyNamespaces) const {
+    const std::string base =
+          std::string(specifyNamespaces ? "::android::hardware::" : "")
+        + "hidl_memory";
+
+    switch (mode) {
+        case StorageMode_Stack:
+            return base;
+
+        case StorageMode_Argument:
+            return "const " + base + "&";
+
+        case StorageMode_Result:
+            return "const " + base + "*";
+    }
+}
+
+std::string MemoryType::getVtsType() const {
+    return "TYPE_MEMORY";
+}
+
+void MemoryType::emitReaderWriter(
+        Formatter &out,
+        const std::string &name,
+        const std::string &parcelObj,
+        bool parcelObjIsPointer,
+        bool isReader,
+        ErrorMode mode) const {
+    const std::string parentName = "_hidl_" + name + "_parent";
+    out << "size_t " << parentName << ";\n\n";
+
+    const std::string parcelObjDeref =
+        parcelObj + (parcelObjIsPointer ? "->" : ".");
+
+    if (isReader) {
+        out << name
+            << " = (const ::android::hardware::hidl_memory *)"
+            << parcelObjDeref
+            << "readBuffer("
+            << "&"
+            << parentName
+            << ");\n";
+
+        out << "if ("
+            << name
+            << " == nullptr) {\n";
+
+        out.indent();
+
+        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
+        handleError2(out, mode);
+
+        out.unindent();
+        out << "}\n\n";
+    } else {
+        out << "_hidl_err = "
+            << parcelObjDeref
+            << "writeBuffer(&"
+            << name
+            << ", sizeof("
+            << name
+            << "), &"
+            << parentName
+            << ");\n";
+
+        handleError(out, mode);
+    }
+
+    emitReaderWriterEmbedded(
+            out,
+            0 /* depth */,
+            name,
+            name /* sanitizedName */,
+            isReader /* nameIsPointer */,
+            parcelObj,
+            parcelObjIsPointer,
+            isReader,
+            mode,
+            parentName,
+            "0 /* parentOffset */");
+}
+
+void MemoryType::emitReaderWriterEmbedded(
+        Formatter &out,
+        size_t /* depth */,
+        const std::string &name,
+        const std::string & /*sanitizedName*/,
+        bool nameIsPointer,
+        const std::string &parcelObj,
+        bool parcelObjIsPointer,
+        bool isReader,
+        ErrorMode mode,
+        const std::string &parentName,
+        const std::string &offsetText) const {
+    emitReaderWriterEmbeddedForTypeName(
+            out,
+            name,
+            nameIsPointer,
+            parcelObj,
+            parcelObjIsPointer,
+            isReader,
+            mode,
+            parentName,
+            offsetText,
+            "::android::hardware::hidl_memory",
+            "" /* childName */,
+            "::android::hardware");
+}
+
+bool MemoryType::needsEmbeddedReadWrite() const {
+    return true;
+}
+
+bool MemoryType::resultNeedsDeref() const {
+    return true;
+}
+
+bool MemoryType::isJavaCompatible() const {
+    return false;
+}
+
+void MemoryType::getAlignmentAndSize(size_t *align, size_t *size) const {
+    *align = *size = 8;
+}
+
+status_t MemoryType::emitVtsTypeDeclarations(Formatter &out) const {
+    out << "type: " << getVtsType() << "\n";
+    return OK;
+}
+
+}  // namespace android
+
