diff --git a/api/Scanner.h b/api/Scanner.h
new file mode 100644
index 0000000..593ff49
--- /dev/null
+++ b/api/Scanner.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#ifndef ANDROID_RS_API_GENERATOR_SCANNER_H
+#define ANDROID_RS_API_GENERATOR_SCANNER_H
+
+#include <fstream>
+#include <string>
+
+class ParameterEntry;
+
+class Scanner {
+private:
+    std::string mFileName;
+    // The file being parsed
+    FILE* mFile;
+    // The line number of the current entry.
+    int mLineNumber;
+    // The tag of the current entry to be processed.  See FindTag().
+    std::string mTag;
+    // The value of this entry.  See FindTag().
+    std::string mValue;
+    // Was the current tag processed?
+    bool mTagConsumed;
+    // Number of errors encountered.
+    int mErrorCount;
+
+    /* Returns the next character from the file, incrementing the line count
+     * if \n is found.
+     */
+    int getChar();
+    /* Reads from the file, adding the characters to "segment" until
+     * the delimiter is found, a new line, or the eof.  The delimiter is added.
+     */
+    void readUpTo(char delimiter, std::string* segment);
+    /* Reads from the file, adding the characters to "segment" until
+     * the end of the line.
+     */
+    void readRestOfLine(std::string* segment);
+
+    /* Finds the next line that's not a comment (a line that starts with #).
+     * This line is parsed into a tag and a value.
+     * A line that starts with a space (or is empty) is considered to have
+     * a null tag and all but the first character are the value.
+     * Lines that start with a non-space charcter should have a ": " to
+     * separate the tag from the value.
+     * Returns false if no more entries.
+     */
+    bool getNextEntry();
+
+public:
+    Scanner(const std::string& fileName, FILE* file);
+    bool atEnd();
+    std::string getValue() { return mValue; }
+    std::string getNextTag() {
+        mTagConsumed = true;
+        return mTag;
+    }
+
+    // Skips over blank entries, reporting errors that start with a space.
+    void skipBlankEntries();
+    /* Finds the next unprocessed tag.  This entry should start with the specified tag.
+     * Returns false if the tag is not found and prints an error.
+     */
+    bool findTag(const char* tag);
+    // Same as findTag but does not print an error if the tag is not found.
+    bool findOptionalTag(const char* tag);
+    // Verifies there's no value.
+    void checkNoValue();
+
+    std::ostream& error();
+    std::ostream& error(int lineNumber);
+
+    /* Removes an optional double quoted "documentation" found at the end of a line.
+     * Erases that documention from the input string.
+     */
+    void parseDocumentation(std::string* s, std::string* documentation);
+    /* Parse an arg: definition.  It's of the form:
+     *    type[*] name [, test_option] [, "documentation"]
+     * The type and name are required.  The * indicates it's an output parameter.
+     * The test_option specifiies restrictions on values used when generating the test cases.
+     * It's one of range(), compatible(), conditional(), above().
+     * The documentation is enclosed in double quotes.
+     */
+    ParameterEntry* parseArgString(bool isReturn);
+    bool getErrorCount() const { return mErrorCount; }
+};
+
+#endif  // ANDROID_RS_API_GENERATOR_SCANNER_H
