diff --git a/testcases/kernel/device-drivers/LtpAcpiCmds.c b/testcases/kernel/device-drivers/LtpAcpiCmds.c
new file mode 100644
index 0000000..262d2c5
--- /dev/null
+++ b/testcases/kernel/device-drivers/LtpAcpiCmds.c
@@ -0,0 +1,517 @@
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/fs.h>    
+#include <linux/ioctl.h>
+#include <linux/pm.h>    
+#include <linux/acpi.h>
+#include <linux/genhd.h>
+#include <asm/uaccess.h>
+#include "LtpAcpi.h"
+
+static int     ltpdev_open( struct inode *inode, struct file *pfile);
+static int     ltpdev_release( struct inode *inode, struct file *pfile);
+static int     ltpdev_ioctl ( struct inode *pinode, struct file *pfile, unsigned int cmd, unsigned long arg );
+static void acpi_bus_notify (acpi_handle             handle, u32 type, void *data);
+static void acpi_ec_gpe_handler (void			*data);
+static acpi_status ltp_get_dev_callback (acpi_handle obj, u32 depth, void *context, void **ret);
+static acpi_status acpi_ec_io_ports (struct acpi_resource	*resource,   void			*context);
+static acpi_status acpi_ec_space_setup (acpi_handle		region_handle,
+	                                    u32			    function,
+	                                    void			*handler_context,
+	                                    void			**return_context);
+static acpi_status acpi_ec_space_handler (u32			function,
+                                          acpi_physical_address	address,
+	                                      u32			bit_width,
+	                                      acpi_integer		*value,
+	                                      void			*handler_context,
+	                                      void			*region_context);
+
+static struct block_device_operations blkops = {
+open:       ltpdev_open,
+release:    ltpdev_release,
+ioctl:      ltpdev_ioctl,
+};
+
+int ltp_acpi_major = LTPMAJOR;
+int test_iteration = 0;
+
+static char genhd_flags = 0;   
+static struct gendisk * gd_ptr;
+
+struct acpi_ec {
+	acpi_handle			handle;
+	unsigned long			uid;
+	unsigned long			gpe_bit;
+	struct acpi_generic_address	status_addr;
+	struct acpi_generic_address	command_addr;
+	struct acpi_generic_address	data_addr;
+	unsigned long			global_lock;
+	spinlock_t			lock;
+};
+
+MODULE_AUTHOR("Martin Ridgeway <mridge@us.ibm.com>");
+MODULE_DESCRIPTION(ACPI_LTP_TEST_DRIVER_NAME);
+MODULE_LICENSE("GPL");
+
+/*
+ * Device operations for the virtual ACPI devices
+ */
+
+
+static struct pm_dev *ltp_pm_dev = NULL;
+
+extern struct acpi_device		*acpi_root;
+
+
+static int ltpdev_open (struct inode *pinode, struct file *pfile)
+{
+    printk(KERN_ALERT "ltpdev_open \n");
+    return 0;
+}
+
+static int ltpdev_release (struct inode *pinode, struct file *pfile)
+{
+
+    printk(KERN_ALERT "ltpdev_release \n");
+    return 0;
+}
+
+static int ltpdev_ioctl ( struct inode *pinode, struct file *pfile, unsigned int cmd, unsigned long arg )
+{
+    acpi_status        status;
+//	acpi_handle        sys_bus_handle;
+    acpi_handle        start_handle = 0;
+    acpi_handle        parent_handle;
+    acpi_handle        child_handle;
+    acpi_handle        next_child_handle;
+    acpi_handle        tmp_handle;
+    acpi_status        level;
+	struct acpi_buffer	dsdt = {ACPI_ALLOCATE_BUFFER, NULL};
+	struct acpi_table_ecdt 	*ecdt_ptr;
+	struct acpi_ec		*ec;
+    struct acpi_device  *device;
+	struct acpi_buffer	buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+	struct acpi_buffer	batt_buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+	struct acpi_buffer	format = {sizeof(ACPI_BATTERY_FORMAT_BIF),
+						ACPI_BATTERY_FORMAT_BIF};
+	struct acpi_buffer	data = {0, NULL};
+	union acpi_object	*package = NULL;
+
+    u32                 start_ticks, stop_ticks, total_ticks, i, bm_status;
+    u8                  type_a, type_b;
+
+    /*****************************************************************************/
+
+
+
+
+    printk(KERN_ALERT "ltpdev_ioctl \n");
+    switch (cmd) {
+    case LTPDEV_CMD:
+
+        parent_handle = start_handle;
+        child_handle = 0;
+        level        = 1;
+        test_iteration++;
+
+        printk(KERN_ALERT "-- IOCTL called to start ACPI tests -- Iteration:%d\n",test_iteration);
+
+        printk(KERN_ALERT "TEST -- acpi_get_handle \n");
+
+        status = acpi_get_handle (0, ACPI_NS_SYSTEM_BUS, &parent_handle);
+
+        printk(KERN_ALERT "TEST -- acpi_get_next_object \n");
+
+        status = acpi_get_next_object (ACPI_TYPE_ANY, parent_handle,
+                  child_handle, &next_child_handle);
+
+        printk(KERN_ALERT "TEST -- acpi_get_parent \n");
+
+        status = acpi_get_parent(parent_handle, &parent_handle);
+
+        printk(KERN_ALERT "TEST -- acpi_evaluate_object \n");
+
+        status = acpi_evaluate_object(parent_handle, "_ON", NULL, NULL);
+
+        printk(KERN_ALERT "TEST -- acpi_get_table \n");
+
+        status = acpi_get_table(ACPI_TABLE_RSDP, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_FADT, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_FACS, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_PSDT, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_SSDT, 1, &dsdt);
+        status = acpi_get_table(ACPI_TABLE_XSDT, 1, &dsdt);
+
+        printk(KERN_ALERT "TEST -- acpi_get_firmware_table \n");
+
+        status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING, 
+            (struct acpi_table_header **) &ecdt_ptr);
+
+        printk(KERN_ALERT "TEST -- acpi_install_notify_handler \n");
+
+        status = acpi_install_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, &acpi_bus_notify, NULL);
+
+        printk(KERN_ALERT "TEST -- acpi_remove_notify_handler \n");
+
+        status = acpi_remove_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, &acpi_bus_notify);
+
+        printk(KERN_ALERT "TEST -- acpi_bus_get_device \n");
+
+        status = acpi_bus_get_device(next_child_handle, &device);
+
+        printk(KERN_ALERT "TEST -- acpi_driver_data \n");
+
+        ec = acpi_driver_data(device);
+
+        if (!ec){
+            printk(KERN_ALERT "Failure getting device data \n");
+        }
+        else {
+
+            printk(KERN_ALERT "TEST -- acpi_install_gpe_handler \n");
+            ec->status_addr = ec->command_addr;
+            status = acpi_install_gpe_handler(ec->gpe_bit, ACPI_EVENT_EDGE_TRIGGERED, &acpi_ec_gpe_handler, ec);
+/*
+            status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT,
+                    ACPI_ADR_SPACE_EC, &acpi_ec_space_handler,
+                    &acpi_ec_space_setup, ec);
+
+            if (status) {
+                printk(KERN_ALERT "Failed installing address space handler \n");
+            }
+
+            acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
+                ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
+*/
+            printk(KERN_ALERT "TEST -- acpi_remove_gpe_handler \n");
+            acpi_remove_gpe_handler(ec->gpe_bit, &acpi_ec_gpe_handler);
+        }
+     
+        printk(KERN_ALERT "TEST -- acpi_get_current_resources \n");
+        status = acpi_get_current_resources (next_child_handle, &buffer);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_current_resources %d\n",status);
+        }
+
+        printk(KERN_ALERT "TEST -- acpi_get_possible_resources \n");
+        status = acpi_get_possible_resources (next_child_handle, &buffer);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_possible_resources %d\n",status);
+        }
+
+
+        printk(KERN_ALERT "TEST -- acpi_walk_resources \n");
+        status = acpi_walk_resources(ec->handle, METHOD_NAME__CRS,
+            acpi_ec_io_ports, ec);
+
+        if (status) {
+            printk(KERN_ALERT "Failed walk_resources %d\n",status);
+        }
+
+        printk(KERN_ALERT "TEST -- acpi_get_timer \n");
+        status = acpi_get_timer(&total_ticks);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_timer %d\n",status);
+        }
+        else {
+            printk(KERN_ALERT "get_timer -- total_ticks %d\n",total_ticks);
+        }
+
+        start_ticks = 20;
+        stop_ticks  = 30;
+
+        printk(KERN_ALERT "TEST -- acpi_get_timer_duration \n");
+        status = acpi_get_timer_duration(start_ticks, stop_ticks, &total_ticks);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_timer_duration %d\n",status);
+        }
+        else {
+            printk(KERN_ALERT "get_timer_duration total_ticks %d\n",total_ticks);
+        }
+
+        for (i = 0; i < ACPI_S_STATE_COUNT; i++) {
+            printk(KERN_ALERT "TEST -- acpi_get_sleep_type_data \n");
+		    status = acpi_get_sleep_type_data(i, &type_a, &type_b);
+
+            if (status) {
+                printk(KERN_ALERT "Failed get_sleep_type_data %d\n",status);
+            }
+            else {
+                printk(KERN_ALERT "get_sleep_type_data [%d] type_a:%d type_b:%d\n",i, type_a,type_b);
+            }
+        }
+
+        printk(KERN_ALERT "TEST -- acpi_get_register \n");
+		acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, 
+			&bm_status, ACPI_MTX_DO_NOT_LOCK);
+
+        if (!bm_status) {
+            printk(KERN_ALERT "Failed get_register [%d]\n",bm_status);
+        }
+        else {
+            printk(KERN_ALERT "get_register [%d] \n",bm_status);
+        }
+
+//        Puts system to sleep, permenately !!!
+//        status = acpi_enter_sleep_state(ACPI_STATE_S1);
+
+        printk(KERN_ALERT "TEST -- acpi_get_system_info \n");
+        status = acpi_get_system_info(&buffer);
+        
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_system_info %d\n",status);
+        }
+        else {
+            printk(KERN_ALERT "get_system_info buffer.length:%d buffer.pointer:%p\n",buffer.length, buffer.pointer);
+
+            acpi_os_printf("os_printf OK %d\n",status);
+
+            if (buffer.pointer) {
+                acpi_os_free(buffer.pointer);
+            }
+        }
+
+        printk(KERN_ALERT "TEST -- acpi_get_devices \n");
+        status = acpi_get_devices(NULL, ltp_get_dev_callback, "LTP0001", NULL);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_devices %d\n",status);
+        }
+
+
+//        status = acpi_os_create_semaphore(1, 1, &tmp_handle);
+
+        if (status) {
+            printk(KERN_ALERT "Failed os_create_semaphore %d\n",status);
+        }
+        else {
+            printk(KERN_ALERT "os_create_semaphore OK, no deleteing %d\n",status);
+//            acpi_os_delete_semaphore(tmp_handle);
+
+        }
+
+        printk(KERN_ALERT "TEST -- acpi_get_system_info \n");
+        status = acpi_get_system_info(&batt_buffer);
+
+        if (status) {
+            printk(KERN_ALERT "Failed get_system_info %d\n",status);
+        }
+        else {
+            printk(KERN_ALERT "get_system_info buffer.length:%d buffer.pointer:%p\n",buffer.length, buffer.pointer);
+
+            package = (union acpi_object *) batt_buffer.pointer;
+
+            /* Extract Package Data */
+
+            printk(KERN_ALERT "TEST -- acpi_extract_package \n");
+            status = acpi_extract_package(package, &format, &data);
+
+            data.pointer = kmalloc(data.length, GFP_KERNEL);
+
+            if (!data.pointer) {
+                printk(KERN_ALERT "Failed getting memory kalloc \n");
+            }
+            else {
+                memset(data.pointer, 0, data.length);
+
+                printk(KERN_ALERT "TEST -- acpi_extract_package \n");
+                status = acpi_extract_package(package, &format, &data);
+
+                kfree(data.pointer);
+            }
+
+//            acpi_os_free(buffer.pointer);
+        }
+
+        printk(KERN_ALERT "-- IOCTL ACPI tests Complete -- Iteration:%d\n",test_iteration);
+
+        break;
+    }
+
+
+    return 0;
+}
+
+static acpi_status ltp_get_dev_callback (acpi_handle obj, u32 depth, void *context, void **ret)
+{
+	acpi_status status;
+	char *name = context;
+	char fullname[20];
+
+	/*
+	 * Only SBA shows up in ACPI namespace, so its CSR space
+	 * includes both SBA and IOC.  Make SBA and IOC show up
+	 * separately in PCI space.
+	 */
+	sprintf(fullname, "%s SBA", name);
+    printk(KERN_ALERT "get_dev_callback SBA name %s \n", fullname);
+	sprintf(fullname, "%s IOC", name);
+    printk(KERN_ALERT "get_dev_callback IOC name %s \n", fullname);
+
+	return 0;
+}
+
+static int ltp_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
+{
+    return 0;
+}
+
+/**
+ * acpi_bus_notify
+ * ---------------
+ * Callback for all 'system-level' device notifications (values 0x00-0x7F).
+ */
+static void acpi_bus_notify (acpi_handle             handle,
+	                         u32                     type,
+                             void                    *data)
+{
+
+    printk(KERN_ALERT "Register ACPI Bus Notify callback function \n");
+
+}
+
+static void acpi_ec_gpe_handler (void			*data)
+{
+    printk(KERN_ALERT "Register ACPI ec_gpe_handler callback function \n");
+}
+
+static acpi_status acpi_ec_io_ports (struct acpi_resource	*resource,   void			*context)
+{
+  return 0;
+}
+
+static acpi_status acpi_ec_space_handler (u32			function,
+	acpi_physical_address	address,
+	u32			bit_width,
+	acpi_integer		*value,
+	void			*handler_context,
+	void			*region_context)
+{
+	int			result = 0;
+	struct acpi_ec		*ec = NULL;
+	u32			temp = 0;
+
+	ACPI_FUNCTION_TRACE("acpi_ec_space_handler");
+
+	if ((address > 0xFF) || (bit_width != 8) || !value || !handler_context)
+		return_VALUE(AE_BAD_PARAMETER);
+
+	ec = (struct acpi_ec *) handler_context;
+
+	switch (function) {
+	case ACPI_READ:
+		result = 0;
+		*value = (acpi_integer) temp;
+		break;
+	case ACPI_WRITE:
+		result = 0;
+		break;
+	default:
+		result = -EINVAL;
+		break;
+	}
+
+	switch (result) {
+	case -EINVAL:
+		return_VALUE(AE_BAD_PARAMETER);
+		break;
+	case -ENODEV:
+		return_VALUE(AE_NOT_FOUND);
+		break;
+	case -ETIME:
+		return_VALUE(AE_TIME);
+		break;
+	default:
+		return_VALUE(AE_OK);
+	}
+
+}
+static acpi_status acpi_ec_space_setup (
+	acpi_handle		region_handle,
+	u32			function,
+	void			*handler_context,
+	void			**return_context)
+{
+	/*
+	 * The EC object is in the handler context and is needed
+	 * when calling the acpi_ec_space_handler.
+	 */
+	*return_context = handler_context;
+
+	return AE_OK;
+}
+
+int init_module(void)
+{
+    int                result;
+
+
+
+    printk(KERN_ALERT "ltpdev_init_module \n");
+
+	ltp_pm_dev = pm_register(PM_UNKNOWN_DEV, 0, ltp_pm_callback);
+
+
+    result = register_blkdev(ltp_acpi_major, LTP_ACPI_DEV_NAME); 
+
+    printk(KERN_ALERT "LTP ACPI: register_blkdev result=%d major %d\n",result, ltp_acpi_major);
+
+    if (result < 0) {
+        printk(KERN_ALERT "LTP ACPI: can't get major %d\n",ltp_acpi_major);
+        return result;
+    }
+//    if (ltp_acpi_major == 0)
+//      ltp_acpi_major = result; /* dynamic */
+
+	gd_ptr = kmalloc(sizeof(struct gendisk *), GFP_KERNEL);
+
+    if (!gd_ptr) {
+        printk(KERN_ALERT "ERROR getting memory !!!\n");
+        return 0;
+    }
+
+    gd_ptr = alloc_disk(1);
+
+    printk(KERN_ALERT "gd_ptr after alloc = %p \n",gd_ptr);
+
+    gd_ptr->major = ltp_acpi_major;
+    gd_ptr->first_minor = 0;
+    gd_ptr->fops = &blkops;
+    gd_ptr->minor_shift = MINOR_SHIFT_BITS;
+    gd_ptr->driverfs_dev = NULL;
+    gd_ptr->capacity = MAX_NUM_DISKS;
+    gd_ptr->disk_de = NULL;
+    gd_ptr->flags = genhd_flags;
+
+
+    sprintf(gd_ptr->disk_name, LTP_ACPI_DEV_NAME);
+
+    add_disk(gd_ptr);
+
+    return 0;
+}
+
+void cleanup_module(void) 
+{ 
+
+    printk(KERN_ALERT "Exiting module and cleaning up \n");
+
+    pm_unregister(ltp_pm_dev); 
+
+    put_disk(gd_ptr);
+
+    del_gendisk(gd_ptr);
+
+    unregister_blkdev(ltp_acpi_major, LTP_ACPI_DEV_NAME);
+
+}
+
diff --git a/testcases/kernel/device-drivers/LtpAcpiMain.c b/testcases/kernel/device-drivers/LtpAcpiMain.c
new file mode 100644
index 0000000..e6d360c
--- /dev/null
+++ b/testcases/kernel/device-drivers/LtpAcpiMain.c
@@ -0,0 +1,123 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/kd.h>
+#include <linux/errno.h>
+
+#include "LtpAcpi.h"
+
+int LTP_acpi_open_block_device(void);
+
+int ltp_block_dev_handle = 0;      /* handle to LTP Test block device */
+
+int main(int argc, char **argv)
+{
+
+    ltpdev_cmd_t  cmd = {0,0};
+    int rc;
+
+    printf("[%s] - Running test program\n", argv[0]);
+
+    rc = LTP_acpi_open_block_device();
+
+    if (!rc) {
+
+        ltp_block_dev_handle = open(LTP_ACPI_DEVICE_NAME, O_RDWR);
+
+        if (ltp_block_dev_handle < 0) {
+            printf("ERROR: Open of device %s failed %d errno = %d\n", LTP_ACPI_DEVICE_NAME,ltp_block_dev_handle, errno);
+        }
+        else {
+            rc = ioctl (ltp_block_dev_handle, LTPDEV_CMD, &cmd);
+
+            printf("return from ioctl %d \n", rc);
+        }
+
+    } else {
+        printf("ERROR: Create/open block device failed\n");
+    }
+
+    return 0;
+}
+
+int LTP_acpi_open_block_device()
+{
+    dev_t devt;
+    struct stat statbuf;
+    int rc;
+
+
+    if (ltp_block_dev_handle == 0) {
+
+        /* check for the /dev/LTPACPITest subdir, and create if it does not exist.
+         *
+         * If devfs is running and mounted on /dev, these checks will all pass,
+         * so a new node will not be created.
+         */
+        devt = makedev(LTPMAJOR, 0);
+
+        rc = stat(LTP_ACPI_DEV_NODE_PATH, &statbuf);
+
+        if (rc) {
+            if (errno == ENOENT) {
+                /* dev node does not exist. */
+                rc = mkdir(LTP_ACPI_DEV_NODE_PATH, (S_IFDIR | S_IRWXU |
+                                                    S_IRGRP | S_IXGRP |
+                                                    S_IROTH | S_IXOTH));
+            } else {
+                printf("ERROR: Problem with LTP ACPI dev directory.  Error code from stat() is %d\n\n", errno);
+            }
+
+        } else {
+            if (!(statbuf.st_mode & S_IFDIR)) {
+                rc = unlink(LTP_ACPI_DEV_NODE_PATH);
+                if (!rc) {
+                    rc = mkdir(LTP_ACPI_DEV_NODE_PATH, (S_IFDIR | S_IRWXU |
+                                                    S_IRGRP | S_IXGRP |
+                                                    S_IROTH | S_IXOTH));
+                }
+            }
+        }
+
+
+        /*
+         * Check for the /dev/ltp-acpi/block_device node, and create if it does not
+         * exist.
+         */
+        rc = stat(LTP_ACPI_DEVICE_NAME, &statbuf);
+        if (rc) {
+            if (errno == ENOENT) {
+                /* dev node does not exist */
+                rc = mknod(LTP_ACPI_DEVICE_NAME, (S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP), devt);
+            } else {
+                printf("ERROR:Problem with LTP ACPI block device node directory.  Error code form stat() is %d\n\n", errno);
+            }
+
+        } else {
+            /*
+             * /dev/ltp-acpi/block_device exists.  Check to make sure it is for a
+             * block device and that it has the right major and minor.
+             */
+            if ((!(statbuf.st_mode & S_IFBLK)) ||
+                 (statbuf.st_rdev != devt)) {
+
+                /* Recreate the dev node. */
+                rc = unlink(LTP_ACPI_DEVICE_NAME);
+                if (!rc) {
+                    rc = mknod(LTP_ACPI_DEVICE_NAME, (S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP), devt);
+                }
+            }
+        }
+
+    }
+
+    return rc;
+}
diff --git a/testcases/kernel/device-drivers/Makefile b/testcases/kernel/device-drivers/Makefile
new file mode 100644
index 0000000..b1be1a8
--- /dev/null
+++ b/testcases/kernel/device-drivers/Makefile
@@ -0,0 +1,24 @@
+#
+# Makefile for GCOV profiling kernel module
+#
+
+#KERNELDIR := /usr/src/linux-2.5.64-gcov
+CFLAGS := $(CFLAGS) -Wall -g
+
+ifneq ($(KERNELRELEASE),)
+
+obj-m	:= LtpAcpiCmds.o
+obj-p   := Test
+else
+KDIR	:= /lib/modules/$(shell uname -r)/build
+PWD	:= $(shell pwd)
+
+default:
+	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
+	gcc  $(CFLAGS) -o LtpAcpiMain  LtpAcpiMain.c
+#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
+endif
+
+clean:
+	rm -f LtpAcpiCmds.o 2>/dev/null || true
+
diff --git a/testcases/kernel/device-drivers/ltpacpi.sh b/testcases/kernel/device-drivers/ltpacpi.sh
new file mode 100755
index 0000000..da56341
--- /dev/null
+++ b/testcases/kernel/device-drivers/ltpacpi.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# This script should be run to execute the ACPI (Avanced Control Power & Integration) tests.
+# One word of warning, since ACPI will control devices and possibly put them to sleep,
+# it's not recommended that any other tests be run concurrently with these tests. You may
+# get unexpected results.
+# 06/10/03 mridge@us.ibm.com initial script created
+
+cd `dirname $0`
+export LTPROOT=${PWD}
+export TMPBASE="/tmp"
+run=$run
+ltproot=$TPROOT
+tmpdir=$TMPBASE
+
+
+usage() 
+{
+	cat <<-END >&2
+	usage: ${0##*/} [ -r run ] 
+                
+
+	example: ${0##*/} -r run
+
+        ACPI must be enabled in the kernel. Since ACPI will control devices and possibly put them to sleep,
+        it's not recommended that any other tests be run concurrently with these tests since you may
+        get unexpected results. 
+        These tests are currently ONLY supported on the 2.5 kernels. 2.4 kernels probably won't even build much 
+        less run.
+
+	END
+exit
+}
+
+while getopts :r: arg
+do      case $arg in
+		          r)	   run=$OPTARG;;
+			
+                \?)     echo "************** Help Info: ********************"
+                        usage;;
+        esac
+done
+
+if [ ! -n "$run"  ]; then
+  usage;
+  exit
+fi
+
+echo "****** Loading ACPI test module ******"
+
+/sbin/insmod ${LTPROOT}/LtpAcpiCmds.o
+/sbin/lsmod
+${LTPROOT}/LtpAcpiMain
+/sbin/rmmod LtpAcpiCmds
+  
