diff --git a/android/vts_config.go b/android/vts_config.go
new file mode 100644
index 0000000..f468ba8
--- /dev/null
+++ b/android/vts_config.go
@@ -0,0 +1,70 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// 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.
+
+package android
+
+import (
+	"fmt"
+	"io"
+)
+
+// Implements vts_config module
+
+func init() {
+	RegisterModuleType("vts_config", VtsConfigFactory)
+}
+
+type vtsConfigProperties struct {
+	// Test manifest file name if different from AndroidTest.xml.
+	Test_config *string
+}
+
+type VtsConfig struct {
+	ModuleBase
+	properties     vtsConfigProperties
+	OutputFilePath OutputPath
+}
+
+func (me *VtsConfig) GenerateAndroidBuildActions(ctx ModuleContext) {
+	me.OutputFilePath = PathForModuleOut(ctx, me.BaseModuleName()).OutputPath
+}
+
+func (me *VtsConfig) AndroidMk() AndroidMkData {
+	androidMkData := AndroidMkData{
+		Class:      "FAKE",
+		Include:    "$(BUILD_SYSTEM)/android_vts_host_config.mk",
+		OutputFile: OptionalPathForPath(me.OutputFilePath),
+	}
+	if me.properties.Test_config != nil {
+		androidMkData.Extra = []AndroidMkExtraFunc{
+			func(w io.Writer, outputFile Path) {
+				fmt.Fprintf(w, "LOCAL_TEST_CONFIG := %s\n",
+					*me.properties.Test_config)
+			},
+		}
+	}
+	return androidMkData
+}
+
+func InitVtsConfigModule(me *VtsConfig) {
+	me.AddProperties(&me.properties)
+}
+
+// Defines VTS configuration.
+func VtsConfigFactory() Module {
+	module := &VtsConfig{}
+	InitVtsConfigModule(module)
+	InitAndroidArchModule(module /*TODO: or HostAndDeviceSupported? */, HostSupported, MultilibFirst)
+	return module
+}
diff --git a/android/vts_config_test.go b/android/vts_config_test.go
new file mode 100644
index 0000000..7d4c9b1
--- /dev/null
+++ b/android/vts_config_test.go
@@ -0,0 +1,61 @@
+// Copyright 2018 Google Inc. All rights reserved.
+//
+// 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.
+
+package android
+
+import (
+	"io/ioutil"
+	"os"
+	"testing"
+)
+
+func testVtsConfig(test *testing.T, bpFileContents string) *TestContext {
+	buildDir, err := ioutil.TempDir("", "soong_vts_config_test")
+	if err != nil {
+		test.Fatal(err)
+	}
+
+	config := TestArchConfig(buildDir, nil)
+	defer func() { os.RemoveAll(buildDir) }()
+
+	ctx := NewTestArchContext()
+	ctx.RegisterModuleType("vts_config", ModuleFactoryAdaptor(VtsConfigFactory))
+	ctx.Register()
+	mockFiles := map[string][]byte{
+		"Android.bp": []byte(bpFileContents),
+	}
+	ctx.MockFileSystem(mockFiles)
+	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
+	FailIfErrored(test, errs)
+	_, errs = ctx.PrepareBuildActions(config)
+	FailIfErrored(test, errs)
+	return ctx
+}
+
+func TestVtsConfig(t *testing.T) {
+	ctx := testVtsConfig(t, `
+vts_config { name: "plain"}
+vts_config { name: "with_manifest", test_config: "manifest.xml" }
+`)
+
+	variants := ctx.ModuleVariantsForTests("plain")
+	if len(variants) > 1 {
+		t.Errorf("expected 1, got %d", len(variants))
+	}
+	expectedOutputFilename := ctx.ModuleForTests(
+		"plain", variants[0]).Module().(*VtsConfig).OutputFilePath.Base()
+	if expectedOutputFilename != "plain" {
+		t.Errorf("expected plain, got %q", expectedOutputFilename)
+	}
+}
