diff --git a/BoardConfig.mk b/BoardConfig.mk
index a5ee146..d29cd01 100644
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -129,6 +129,9 @@
 # SPL
 VENDOR_SECURITY_PATCH := 2022-05-05
 
+# Vibrator
+TARGET_VIBRATOR_SUPPORTS_EFFECTS := true
+
 # Wi-Fi
 BOARD_HOSTAPD_DRIVER := NL80211
 WIFI_HIDL_FEATURE_DUAL_INTERFACE := true
diff --git a/aidl/vibrator/Android.bp b/aidl/vibrator/Android.bp
deleted file mode 100644
index a9160d6..0000000
--- a/aidl/vibrator/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (C) 2022 The LineageOS Project
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-
-cc_binary {
-    name: "android.hardware.vibrator-service.RM6785",
-    relative_install_path: "hw",
-    init_rc: ["android.hardware.vibrator-service.RM6785.rc"],
-    vintf_fragments: ["android.hardware.vibrator-service.RM6785.xml"],
-    srcs: [
-        "Vibrator.cpp",
-        "service.cpp",
-    ],
-    shared_libs: [
-        "libbase",
-        "libbinder_ndk",
-        "android.hardware.vibrator-V2-ndk",
-    ],
-    vendor: true,
-}
diff --git a/aidl/vibrator/Vibrator.cpp b/aidl/vibrator/Vibrator.cpp
deleted file mode 100644
index 8200522..0000000
--- a/aidl/vibrator/Vibrator.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2022-2023 The LineageOS Project
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-#include <fstream>
-#include <thread>
-#include <android-base/logging.h>
-
-#include "Vibrator.h"
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace vibrator {
-
-/*
- * Write value to path and close file.
- */
-template <typename T>
-static void write(const std::string& path, const T& value) {
-    std::ofstream file(path);
-    file << value << std::endl;
-}
-
-static bool fileExists(const std::string& path) {
-    std::ifstream file(path);
-    return (file.good());
-}
-
-Vibrator::Vibrator() {
-    mAmplitudeControl = fileExists(VIBRATOR_INTENSITY);
-    write(VIBRATOR_STATE, 1);
-}
-
-ndk::ScopedAStatus Vibrator::activate(int32_t timeoutMs) {
-    write(VIBRATOR_DURATION, timeoutMs);
-    write(VIBRATOR_ACTIVATE, 1);
-
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus Vibrator::getCapabilities(int32_t* _aidl_return) {
-    *_aidl_return = IVibrator::CAP_ON_CALLBACK | IVibrator::CAP_PERFORM_CALLBACK;
-
-    if (mAmplitudeControl)
-        *_aidl_return |= IVibrator::CAP_AMPLITUDE_CONTROL;
-
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus Vibrator::off() {
-    write(VIBRATOR_ACTIVATE, 0);
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus Vibrator::on(int32_t timeoutMs, const std::shared_ptr<IVibratorCallback>& callback) {
-    ndk::ScopedAStatus status = activate(timeoutMs);
-
-    if (callback != nullptr) {
-        std::thread([=] {
-            LOG(DEBUG) << "Starting on on another thread";
-            usleep(timeoutMs * 1000);
-            LOG(DEBUG) << "Notifying on complete";
-            if (!callback->onComplete().isOk()) {
-                LOG(ERROR) << "Failed to call onComplete";
-            }
-        }).detach();
-    }
-
-    return status;
-}
-
-ndk::ScopedAStatus Vibrator::perform(Effect effect, EffectStrength strength, const std::shared_ptr<IVibratorCallback>& callback, int32_t* _aidl_return) {
-    ndk::ScopedAStatus status;
-    int32_t timeoutMs;
-    float amplitude;
-
-    switch (strength) {
-        case EffectStrength::LIGHT:
-            amplitude = AMPLITUDE_LIGHT;
-            break;
-        case EffectStrength::MEDIUM:
-            amplitude = AMPLITUDE_MEDIUM;
-            break;
-        case EffectStrength::STRONG:
-            amplitude = AMPLITUDE_STRONG;
-            break;
-        default:
-            return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-    }
-
-    setAmplitude(amplitude);
-
-    switch (effect) {
-        case Effect::CLICK:
-            timeoutMs = 70;
-            break;
-        case Effect::TEXTURE_TICK:
-            timeoutMs = 40;
-            break;
-        case Effect::TICK:
-            timeoutMs = 80;
-            break;
-        default:
-            return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-    }
-
-    status = activate(timeoutMs);
-
-    if (callback != nullptr) {
-        std::thread([=] {
-            LOG(DEBUG) << "Starting perform on another thread";
-            usleep(timeoutMs * 1000);
-            LOG(DEBUG) << "Notifying perform complete";
-            callback->onComplete();
-        }).detach();
-    }
-
-    *_aidl_return = timeoutMs;
-    return status;
-}
-
-ndk::ScopedAStatus Vibrator::getSupportedEffects(std::vector<Effect>* _aidl_return) {
-    *_aidl_return = {Effect::CLICK, Effect::TEXTURE_TICK, Effect::TICK};
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus Vibrator::setAmplitude(float amplitude) {
-    int32_t intensity;
-
-    if (amplitude <= 0.0f || amplitude > 1.0f)
-        return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_ARGUMENT));
-
-    LOG(DEBUG) << "Setting amplitude: " << amplitude;
-
-    intensity = amplitude * INTENSITY_MAX;
-
-    LOG(DEBUG) << "Setting intensity: " << intensity;
-
-    if (mAmplitudeControl)
-        write(VIBRATOR_INTENSITY, intensity);
-
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus Vibrator::setExternalControl(bool /*enabled*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getCompositionDelayMax(int32_t* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getCompositionSizeMax(int32_t* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getSupportedPrimitives(std::vector<CompositePrimitive>* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getPrimitiveDuration(CompositePrimitive /*primitive*/, int32_t* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect>& /*composite*/, const std::shared_ptr<IVibratorCallback>& /*callback*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getSupportedAlwaysOnEffects(std::vector<Effect>* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::alwaysOnEnable(int32_t /*id*/, Effect /*effect*/, EffectStrength /*strength*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::alwaysOnDisable(int32_t /*id*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getResonantFrequency(float* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getQFactor(float* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getFrequencyResolution(float* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getFrequencyMinimum(float* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getBandwidthAmplitudeMap(std::vector<float>* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getPwlePrimitiveDurationMax(int32_t* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getPwleCompositionSizeMax(int32_t* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::getSupportedBraking(std::vector<Braking>* /*_aidl_return*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-ndk::ScopedAStatus Vibrator::composePwle(const std::vector<PrimitivePwle>& /*composite*/, const std::shared_ptr<IVibratorCallback>& /*callback*/) {
-    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
-}
-
-} // namespace vibrator
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/aidl/vibrator/Vibrator.h b/aidl/vibrator/Vibrator.h
deleted file mode 100644
index 7872a4f..0000000
--- a/aidl/vibrator/Vibrator.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2022-2023 The LineageOS Project
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-#pragma once
-
-#include <aidl/android/hardware/vibrator/BnVibrator.h>
-
-#define VIBRATOR_STATE "/sys/class/leds/vibrator/state"
-#define VIBRATOR_DURATION "/sys/class/leds/vibrator/duration"
-#define VIBRATOR_ACTIVATE "/sys/class/leds/vibrator/activate"
-#define VIBRATOR_INTENSITY "/sys/kernel/thunderquake_engine/level"
-#define INTENSITY_MIN 0
-#define INTENSITY_MAX 9
-
-#define AMPLITUDE_LIGHT 0.3
-#define AMPLITUDE_MEDIUM 0.6
-#define AMPLITUDE_STRONG 1
-
-using ::aidl::android::hardware::vibrator::IVibratorCallback;
-using ::aidl::android::hardware::vibrator::Braking;
-using ::aidl::android::hardware::vibrator::Effect;
-using ::aidl::android::hardware::vibrator::EffectStrength;
-using ::aidl::android::hardware::vibrator::CompositeEffect;
-using ::aidl::android::hardware::vibrator::CompositePrimitive;
-using ::aidl::android::hardware::vibrator::PrimitivePwle;
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace vibrator {
-
-class Vibrator : public BnVibrator {
-public:
-    Vibrator();
-    ndk::ScopedAStatus getCapabilities(int32_t* _aidl_return) override;
-    ndk::ScopedAStatus off() override;
-    ndk::ScopedAStatus on(int32_t timeoutMs, const std::shared_ptr<IVibratorCallback>& callback) override;
-    ndk::ScopedAStatus perform(Effect effect, EffectStrength strength, const std::shared_ptr<IVibratorCallback>& callback, int32_t* _aidl_return) override;
-    ndk::ScopedAStatus getSupportedEffects(std::vector<Effect>* _aidl_return) override;
-    ndk::ScopedAStatus setAmplitude(float amplitude) override;
-    ndk::ScopedAStatus setExternalControl(bool enabled) override;
-    ndk::ScopedAStatus getCompositionDelayMax(int32_t* _aidl_return) override;
-    ndk::ScopedAStatus getCompositionSizeMax(int32_t* _aidl_return) override;
-    ndk::ScopedAStatus getSupportedPrimitives(std::vector<CompositePrimitive>* _aidl_return) override;
-    ndk::ScopedAStatus getPrimitiveDuration(CompositePrimitive primitive, int32_t* _aidl_return) override;
-    ndk::ScopedAStatus compose(const std::vector<CompositeEffect>& composite, const std::shared_ptr<IVibratorCallback>& callback) override;
-    ndk::ScopedAStatus getSupportedAlwaysOnEffects(std::vector<Effect>* _aidl_return) override;
-    ndk::ScopedAStatus alwaysOnEnable(int32_t id, Effect effect, EffectStrength strength) override;
-    ndk::ScopedAStatus alwaysOnDisable(int32_t id) override;
-    ndk::ScopedAStatus getResonantFrequency(float* _aidl_return) override;
-    ndk::ScopedAStatus getQFactor(float* _aidl_return) override;
-    ndk::ScopedAStatus getFrequencyResolution(float* _aidl_return) override;
-    ndk::ScopedAStatus getFrequencyMinimum(float* _aidl_return) override;
-    ndk::ScopedAStatus getBandwidthAmplitudeMap(std::vector<float>* _aidl_return) override;
-    ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t* _aidl_return) override;
-    ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t* _aidl_return) override;
-    ndk::ScopedAStatus getSupportedBraking(std::vector<Braking>* _aidl_return) override;
-    ndk::ScopedAStatus composePwle(const std::vector<PrimitivePwle>& composite, const std::shared_ptr<IVibratorCallback>& callback) override;
-private:
-    ndk::ScopedAStatus activate(int32_t timeoutMs);
-    bool mAmplitudeControl;
-};
-
-} // namespace vibrator
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/aidl/vibrator/android.hardware.vibrator-service.RM6785.rc b/aidl/vibrator/android.hardware.vibrator-service.RM6785.rc
deleted file mode 100644
index 8fce4bc..0000000
--- a/aidl/vibrator/android.hardware.vibrator-service.RM6785.rc
+++ /dev/null
@@ -1,8 +0,0 @@
-on init
-    chown system system /sys/kernel/thunderquake_engine/level
-
-service vendor.vibrator-default /vendor/bin/hw/android.hardware.vibrator-service.RM6785
-    class hal
-    user system
-    group system
-    shutdown critical
diff --git a/aidl/vibrator/android.hardware.vibrator-service.RM6785.xml b/aidl/vibrator/android.hardware.vibrator-service.RM6785.xml
deleted file mode 100644
index 49b11ec..0000000
--- a/aidl/vibrator/android.hardware.vibrator-service.RM6785.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<manifest version="1.0" type="device">
-    <hal format="aidl">
-        <name>android.hardware.vibrator</name>
-        <fqname>IVibrator/default</fqname>
-    </hal>
-</manifest>
diff --git a/aidl/vibrator/service.cpp b/aidl/vibrator/service.cpp
deleted file mode 100644
index c345b6e..0000000
--- a/aidl/vibrator/service.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2022 The LineageOS Project
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-#include "Vibrator.h"
-
-#include <android/binder_manager.h>
-#include <android/binder_process.h>
-#include <android-base/logging.h>
-
-using ::aidl::android::hardware::vibrator::Vibrator;
-
-int main() {
-    ABinderProcess_setThreadPoolMaxThreadCount(0);
-    std::shared_ptr<Vibrator> vibrator = ndk::SharedRefBase::make<Vibrator>();
-
-    const std::string instance = std::string() + Vibrator::descriptor + "/default";
-    binder_status_t status = AServiceManager_addService(vibrator->asBinder().get(), instance.c_str());
-    CHECK(status == STATUS_OK);
-
-    ABinderProcess_joinThreadPool();
-    return EXIT_FAILURE; // should not reach
-}
diff --git a/device.mk b/device.mk
index 340b054..1c2c44c 100644
--- a/device.mk
+++ b/device.mk
@@ -313,7 +313,7 @@
 
 # Vibrator
 PRODUCT_PACKAGES += \
-    android.hardware.vibrator-service.RM6785
+    android.hardware.vibrator-service.mediatek
 
 # VNDK
 PRODUCT_PACKAGES += \
diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts
index c381d06..92c3065 100644
--- a/sepolicy/vendor/file_contexts
+++ b/sepolicy/vendor/file_contexts
@@ -5,7 +5,7 @@
 /(vendor|system/vendor)/bin/hw/android\.hardware\.light-service.RM6785                                    u:object_r:hal_light_default_exec:s0
 /(vendor|system/vendor)/bin/hw/android\.hardware\.memtrack-service\.RM6785                                u:object_r:hal_memtrack_default_exec:s0
 /(vendor|system/vendor)/bin/hw/android\.hardware\.power-service\.RM6785-libperfmgr                        u:object_r:hal_power_default_exec:s0
-/(vendor|system/vendor)/bin/hw/android\.hardware\.vibrator-service\.RM6785                                u:object_r:hal_vibrator_default_exec:s0
+/(vendor|system/vendor)/bin/hw/android\.hardware\.vibrator-service\.mediatek                               u:object_r:hal_vibrator_default_exec:s0
 /(vendor|system/vendor)/bin/hw/android\.hardware\.wifi@[0-9]\.[0-9]-service\.RM6785                       u:object_r:hal_wifi_default_exec:s0
 /(vendor|system/vendor)/bin/hw/vendor\.lineage\.touch@[0-9]\.[0-9]-service\.RM6785                        u:object_r:hal_lineage_touch_default_exec:s0
 /(vendor|system/vendor)/bin/hw/vendor\.mediatek\.hardware\.mtkpower@1\.2-service\.stub                    u:object_r:mtk_hal_power_exec:s0
diff --git a/vendor.prop b/vendor.prop
index e0e07eb..dbb11c4 100644
--- a/vendor.prop
+++ b/vendor.prop
@@ -182,6 +182,11 @@
 ro.hardware.kmsetkey=trustonic
 ro.vendor.mtk_trustonic_tee_support=1
 
+# Vibrator
+ro.vendor.vibrator.hal.click.duration=70
+ro.vendor.vibrator.hal.tick.duration=60
+ro.vendor.vibrator.hal.texture_tick.duration=40
+
 # VM
 dalvik.vm.heapgrowthlimit=256m
 dalvik.vm.heapmaxfree=8m
