diff --git a/Android.bp b/Android.bp
index 947077e..408e904 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4,7 +4,6 @@
     export_include_dirs: [
         "gralloc",
         "include",
-        "libdisplayconfig",
         "libqdmetadata",
         "services",
     ],
diff --git a/libdisplayconfig/Android.bp b/libdisplayconfig/Android.bp
deleted file mode 100644
index c1cc51c..0000000
--- a/libdisplayconfig/Android.bp
+++ /dev/null
@@ -1,20 +0,0 @@
-cc_library_shared {
-    name: "libdisplayconfig",
-    vendor_available: true,
-    cflags: [
-        "-Wno-sign-conversion",
-        "-DLOG_TAG=\"libdisplayconfig\"",
-        "-DDISPLAY_CONFIG_1_4"
-    ],
-    shared_libs: [
-        "libhidlbase",
-        "libhidltransport",
-        "libutils",
-        "vendor.display.config@1.0",
-        "vendor.display.config@1.4"
-    ],
-    header_libs: ["libhardware_headers", "display_intf_headers"],
-    srcs: ["DisplayConfig.cpp"],
-    export_header_lib_headers: ["display_intf_headers"],
-}
-
diff --git a/libdisplayconfig/DisplayConfig.cpp b/libdisplayconfig/DisplayConfig.cpp
deleted file mode 100644
index 59d466a..0000000
--- a/libdisplayconfig/DisplayConfig.cpp
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
-* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*    * Redistributions of source code must retain the above copyright
-*      notice, this list of conditions and the following disclaimer.
-*    * Redistributions in binary form must reproduce the above
-*      copyright notice, this list of conditions and the following
-*      disclaimer in the documentation and/or other materials provided
-*      with the distribution.
-*    * Neither the name of The Linux Foundation. nor the names of its
-*      contributors may be used to endorse or promote products derived
-*      from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef DISPLAY_CONFIG_1_4
-#include <vendor/display/config/1.4/IDisplayConfig.h>
-#else
-#include <vendor/display/config/1.0/IDisplayConfig.h>
-#endif
-
-
-#include "DisplayConfig.h"
-
-namespace display {
-#ifdef DISPLAY_CONFIG_1_4
-using vendor::display::config::V1_4::IDisplayConfig;
-#else
-using vendor::display::config::V1_0::IDisplayConfig;
-#endif
-
-//=============================================================================
-// The functions below run in the client process and wherever necessary
-// do a binder call to HWC to get/set data.
-
-IDisplayConfig::DisplayType MapDisplayType(int dpy) {
-    switch (dpy) {
-        case DISPLAY_PRIMARY:
-            return IDisplayConfig::DisplayType::DISPLAY_PRIMARY;
-
-        case DISPLAY_EXTERNAL:
-            return IDisplayConfig::DisplayType::DISPLAY_EXTERNAL;
-
-        case DISPLAY_VIRTUAL:
-            return IDisplayConfig::DisplayType::DISPLAY_VIRTUAL;
-
-        default:
-            break;
-    }
-
-    return IDisplayConfig::DisplayType::INVALID;
-}
-
-IDisplayConfig::DisplayExternalStatus MapExternalStatus(uint32_t status) {
-    switch (status) {
-        case EXTERNAL_OFFLINE:
-            return IDisplayConfig::DisplayExternalStatus::EXTERNAL_OFFLINE;
-
-        case EXTERNAL_ONLINE:
-            return IDisplayConfig::DisplayExternalStatus::EXTERNAL_ONLINE;
-
-        case EXTERNAL_PAUSE:
-            return IDisplayConfig::DisplayExternalStatus::EXTERNAL_PAUSE;
-
-        case EXTERNAL_RESUME:
-            return IDisplayConfig::DisplayExternalStatus::EXTERNAL_RESUME;
-
-        default:
-            break;
-    }
-
-    return IDisplayConfig::DisplayExternalStatus::INVALID;
-}
-
-IDisplayConfig::DisplayDynRefreshRateOp MapDynRefreshRateOp(uint32_t op) {
-    switch (op) {
-        case DISABLE_METADATA_DYN_REFRESH_RATE:
-            return IDisplayConfig::DisplayDynRefreshRateOp::DISABLE_METADATA_DYN_REFRESH_RATE;
-
-        case ENABLE_METADATA_DYN_REFRESH_RATE:
-            return IDisplayConfig::DisplayDynRefreshRateOp::ENABLE_METADATA_DYN_REFRESH_RATE;
-
-        case SET_BINDER_DYN_REFRESH_RATE:
-            return IDisplayConfig::DisplayDynRefreshRateOp::SET_BINDER_DYN_REFRESH_RATE;
-
-        default:
-            break;
-    }
-
-    return IDisplayConfig::DisplayDynRefreshRateOp::INVALID;
-}
-
-int MapDisplayPortType(IDisplayConfig::DisplayPortType panelType) {
-    switch (panelType) {
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DEFAULT:
-            return DISPLAY_PORT_DEFAULT;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DSI:
-            return DISPLAY_PORT_DSI;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DTV:
-            return DISPLAY_PORT_DTV;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_WRITEBACK:
-            return DISPLAY_PORT_WRITEBACK;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_LVDS:
-            return DISPLAY_PORT_LVDS;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_EDP:
-            return DISPLAY_PORT_EDP;
-
-        case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DP:
-            return DISPLAY_PORT_DP;
-
-        default:
-            break;
-    }
-
-    return -1;
-}
-
-int isExternalConnected() {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return 0;
-    }
-
-    int connected = 0;
-    intf->isDisplayConnected(IDisplayConfig::DisplayType::DISPLAY_EXTERNAL,
-        [&](const auto &tmpError, const auto &tmpStatus) {
-            if (tmpError) {
-                return;
-            }
-
-            connected = tmpStatus;
-        });
-
-    return connected;
-}
-
-int setSecondayDisplayStatus(int dpy, uint32_t status) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->setSecondayDisplayStatus(MapDisplayType(dpy), MapExternalStatus(status));
-}
-
-int configureDynRefeshRate(uint32_t op, uint32_t refreshRate) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->configureDynRefeshRate(MapDynRefreshRateOp(op), refreshRate);
-}
-
-int getConfigCount(int dpy) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    int count = 0;
-    intf->getConfigCount(MapDisplayType(dpy),
-        [&](const auto &tmpError, const auto &tmpCount) {
-            if (tmpError) {
-                return;
-            }
-
-            count = tmpCount;
-        });
-
-    return count;
-}
-
-int getActiveConfig(int dpy) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    int config = 0;
-    intf->getActiveConfig(MapDisplayType(dpy),
-        [&](const auto &tmpError, const auto &tmpConfig) {
-            if (tmpError) {
-                return;
-            }
-
-            config = tmpConfig;
-        });
-
-    return config;
-}
-
-int setActiveConfig(int dpy, uint32_t config) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->setActiveConfig(MapDisplayType(dpy), config);
-}
-
-DisplayAttributes getDisplayAttributes(uint32_t configIndex, int dpy) {
-    DisplayAttributes attributes;
-
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return attributes;
-    }
-
-    intf->getDisplayAttributes(configIndex, MapDisplayType(dpy),
-        [&](const auto &tmpError, const auto &tmpAttributes) {
-            if (tmpError) {
-                return;
-            }
-
-            attributes.vsync_period = tmpAttributes.vsyncPeriod;
-            attributes.xres = tmpAttributes.xRes;
-            attributes.yres = tmpAttributes.yRes;
-            attributes.xdpi = tmpAttributes.xDpi;
-            attributes.ydpi = tmpAttributes.yDpi;
-            attributes.panel_type = MapDisplayPortType(tmpAttributes.panelType);
-            attributes.is_yuv = tmpAttributes.isYuv;
-        });
-
-    return attributes;
-}
-
-int setPanelBrightness(uint32_t level) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->setPanelBrightness(level);
-}
-
-uint32_t getPanelBrightness() {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return 0;
-    }
-
-    int level = 0;
-    intf->getPanelBrightness(
-        [&](const auto &tmpError, const auto &tmpLevel) {
-            if (tmpError) {
-                return;
-            }
-
-            level = tmpLevel;
-        });
-
-    return level;
-}
-
-int minHdcpEncryptionLevelChanged(int dpy, uint32_t min_enc_level) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->minHdcpEncryptionLevelChanged(MapDisplayType(dpy), min_enc_level);
-}
-
-int refreshScreen() {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->refreshScreen();
-}
-
-int controlPartialUpdate(int dpy, bool enable) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->controlPartialUpdate(MapDisplayType(dpy), enable);
-}
-
-int toggleScreenUpdate(uint32_t on) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->toggleScreenUpdate(on == 1);
-}
-
-int setIdleTimeout(uint32_t value) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->setIdleTimeout(value);
-}
-
-int getHDRCapabilities(int dpy, DisplayHDRCapabilities *caps) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL || caps == NULL) {
-        return -1;
-    }
-
-    int error = -1;
-    intf->getHDRCapabilities(MapDisplayType(dpy),
-        [&](const auto &tmpError, const auto &tmpCaps) {
-            error = tmpError;
-            if (error) {
-                return;
-            }
-
-            caps->supported_hdr_types = tmpCaps.supportedHdrTypes;
-            caps->max_luminance = tmpCaps.maxLuminance;
-            caps->max_avg_luminance = tmpCaps.maxAvgLuminance;
-            caps->min_luminance = tmpCaps.minLuminance;
-        });
-
-    return error;
-}
-
-#ifdef DISPLAY_CONFIG_1_4
-int32_t getWriteBackCapabilities( WriteBackCapabilities *caps) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL || caps == NULL) {
-        return -1;
-    }
-
-    int error = -1;
-    intf->getWriteBackCapabilities(
-        [&](const auto &tmpError, const auto &tmpCaps) {
-            error = tmpError;
-            if (error) {
-                return;
-            }
-            caps->isWbUbwcSupported = tmpCaps.isWbUbwcSupported;
-        });
-
-    return error;
-}
-#endif
-
-int setCameraLaunchStatus(uint32_t on) {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return -1;
-    }
-
-    return intf->setCameraLaunchStatus(on);
-}
-
-bool displayBWTransactionPending() {
-    android::sp<IDisplayConfig> intf = IDisplayConfig::getService();
-    if (intf == NULL) {
-        return 0;
-    }
-
-    int status = 0;
-    intf->displayBWTransactionPending(
-        [&](const auto &tmpError, const auto &tmpStatus) {
-            if (tmpError) {
-                return;
-            }
-
-            status = tmpStatus;
-        });
-
-    return status;
-}
-
-} // namespace display
diff --git a/libdisplayconfig/DisplayConfig.h b/libdisplayconfig/DisplayConfig.h
deleted file mode 100644
index 5d54d3f..0000000
--- a/libdisplayconfig/DisplayConfig.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*    * Redistributions of source code must retain the above copyright
-*      notice, this list of conditions and the following disclaimer.
-*    * Redistributions in binary form must reproduce the above
-*      copyright notice, this list of conditions and the following
-*      disclaimer in the documentation and/or other materials provided
-*      with the distribution.
-*    * Neither the name of The Linux Foundation. nor the names of its
-*      contributors may be used to endorse or promote products derived
-*      from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef __DISPLAY_CONFIG_H__
-#define __DISPLAY_CONFIG_H__
-
-#include <stdint.h>
-#include <vector>
-
-// This header is for clients to use to set/get global display configuration.
-
-namespace display {
-
-enum {
-    DISPLAY_PRIMARY = 0,
-    DISPLAY_EXTERNAL,
-    DISPLAY_VIRTUAL,
-};
-
-enum {
-    EXTERNAL_OFFLINE = 0,
-    EXTERNAL_ONLINE,
-    EXTERNAL_PAUSE,
-    EXTERNAL_RESUME,
-};
-
-enum {
-    DISABLE_METADATA_DYN_REFRESH_RATE = 0,
-    ENABLE_METADATA_DYN_REFRESH_RATE,
-    SET_BINDER_DYN_REFRESH_RATE,
-};
-
-enum {
-    DISPLAY_PORT_DEFAULT = 0,
-    DISPLAY_PORT_DSI,
-    DISPLAY_PORT_DTV,
-    DISPLAY_PORT_WRITEBACK,
-    DISPLAY_PORT_LVDS,
-    DISPLAY_PORT_EDP,
-    DISPLAY_PORT_DP,
-};
-
-struct DisplayAttributes {
-    uint32_t vsync_period = 0; //nanoseconds
-    uint32_t xres = 0;
-    uint32_t yres = 0;
-    float xdpi = 0.0f;
-    float ydpi = 0.0f;
-    int panel_type = DISPLAY_PORT_DEFAULT;
-    bool is_yuv = false;
-};
-
-struct DisplayHDRCapabilities {
-    std::vector<int32_t> supported_hdr_types;
-    float max_luminance = 0.0f;
-    float max_avg_luminance = 0.0f;
-    float min_luminance = 0.0f;
-};
-
-struct WriteBackCapabilities {
-    bool isWbUbwcSupported;
-};
-
-//=============================================================================
-// The functions below run in the client pocess and wherever necessary
-// do a binder call to HWC to get/set data.
-
-int isExternalConnected();
-int setSecondayDisplayStatus(int dpy, uint32_t status);
-int configureDynRefeshRate(uint32_t op, uint32_t refreshRate);
-int getConfigCount(int dpy);
-int getActiveConfig(int dpy);
-int setActiveConfig(int dpy, uint32_t config);
-DisplayAttributes getDisplayAttributes(uint32_t configIndex, int dpy);
-int setPanelBrightness(uint32_t level);
-uint32_t getPanelBrightness();
-int minHdcpEncryptionLevelChanged(int dpy, uint32_t min_enc_level);
-int refreshScreen();
-int controlPartialUpdate(int dpy, bool enable);
-int toggleScreenUpdate(uint32_t on);
-int setIdleTimeout(uint32_t value);
-int getHDRCapabilities(int dpy, DisplayHDRCapabilities *caps);
-int setCameraLaunchStatus(uint32_t on);
-bool displayBWTransactionPending();
-int32_t getWriteBackCapabilities(WriteBackCapabilities *caps);
-
-} // namespace display
-
-#endif  // __DISPLAY_CONFIG_H__
