diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/Descriptors.c
--- a/Demos/Device/ClassDriver/Joystick/Descriptors.c	Sat Sep 10 23:51:27 2011 +0100
+++ b/Demos/Device/ClassDriver/Joystick/Descriptors.c	Sat Sep 17 17:15:23 2011 +0100
@@ -50,9 +50,9 @@
 	 *   Max X/Y Axis values:  100
 	 *   Min physical X/Y Axis values (used to determine resolution): -1
 	 *   Max physical X/Y Axis values (used to determine resolution):  1
-	 *   Buttons: 2
+	 *   Buttons: 8
 	 */
-	HID_DESCRIPTOR_JOYSTICK(-100, 100, -1, 1, 2)
+	HID_DESCRIPTOR_JOYSTICK(-100, 100, -1, 1, 8)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
@@ -159,9 +159,9 @@
  */
 const USB_Descriptor_String_t PROGMEM ManufacturerString =
 {
-	.Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
+	.Header                 = {.Size = USB_STRING_LEN(18), .Type = DTYPE_String},
 
-	.UnicodeString          = L"Dean Camera"
+	.UnicodeString          = L"lentinj Industries"
 };
 
 /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
@@ -170,9 +170,9 @@
  */
 const USB_Descriptor_String_t PROGMEM ProductString =
 {
-	.Header                 = {.Size = USB_STRING_LEN(18), .Type = DTYPE_String},
+	.Header                 = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
 
-	.UnicodeString          = L"LUFA Joystick Demo"
+	.UnicodeString          = L"LUFA-Powered Arcade Joystick"
 };
 
 /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/Inputs/Buttons.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demos/Device/ClassDriver/Joystick/Inputs/Buttons.h	Sat Sep 17 17:15:23 2011 +0100
@@ -0,0 +1,102 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+              
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this 
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in 
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting 
+  documentation, and that the name of the author not be used in 
+  advertising or publicity pertaining to distribution of the 
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/*
+  Driver for 8 software debounced buttons on PORTB. 
+*/
+
+#ifndef __BUTTONS_H__
+#define __BUTTONS_H__
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 0)
+			#define BUTTONS_BUTTON2      (1 << 1)
+			#define BUTTONS_BUTTON3      (1 << 2)
+			#define BUTTONS_BUTTON4      (1 << 3)
+			#define BUTTONS_BUTTON5      (1 << 4)
+			#define BUTTONS_BUTTON6      (1 << 5)
+			#define BUTTONS_BUTTON7      (1 << 6)
+			#define BUTTONS_BUTTON8      (1 << 7)
+
+			/* Private Interface - For use in library only: */
+			#if !defined(__DOXYGEN__)
+				/* Macros: */
+				#define BUTTON_MASK                 (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4 | BUTTONS_BUTTON5 | BUTTONS_BUTTON6 | BUTTONS_BUTTON7 | BUTTONS_BUTTON8)
+			#endif
+	
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static uint8_t debounceB0,debounceB1,debounceB2,debouncedBState;
+
+			static inline void Buttons_Init(void)
+			{
+				DDRB  &= ~BUTTON_MASK;
+				PORTB |= BUTTON_MASK;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+			    /* Vertical counter: http://www.dattalo.com/technical/software/pic/debounce.html */
+			    /* Set delta to changes from last sample */
+			    uint8_t delta = ~PINB ^ debouncedBState;
+    
+			    /* Increment vertical counter */
+			    debounceB2 = debounceB2 ^ (debounceB1 & debounceB0);
+			    debounceB1 = debounceB1 ^ debounceB0;
+			    debounceB0  = ~debounceB0;
+    
+			    /* reset any unchanged bits */
+			    debounceB0 &= delta;
+			    debounceB1 &= delta;
+			    debounceB2 &= delta;
+    
+			    /* update state & calculate returned change set */
+			    debouncedBState ^= ~(~delta | debounceB0 | debounceB1 | debounceB2);
+
+				return (uint8_t)(debouncedBState & BUTTON_MASK);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+			
+#endif
+
+/** @} */
diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/Inputs/Joystick.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demos/Device/ClassDriver/Joystick/Inputs/Joystick.h	Sat Sep 17 17:15:23 2011 +0100
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/*
+  Driver for a 4-direction joystick on PORTC
+*/
+
+#ifndef __JOYSTICK_H__
+#define __JOYSTICK_H__
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 4)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 5)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1 << 6)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                  (1 << 7)
+
+			/* Private Interface - For use in library only: */
+			#if !defined(__DOXYGEN__)
+				/* Macros: */
+				#define JOY_MASK                 (JOY_LEFT | JOY_UP | JOY_RIGHT | JOY_DOWN)
+			#endif
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRC  &= ~JOY_MASK;
+				PORTC |= JOY_MASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return (uint8_t)(~PINC & JOY_MASK);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/Joystick.c
--- a/Demos/Device/ClassDriver/Joystick/Joystick.c	Sat Sep 10 23:51:27 2011 +0100
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.c	Sat Sep 17 17:15:23 2011 +0100
@@ -148,7 +148,6 @@
 	USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
 
 	uint8_t JoyStatus_LCL    = Joystick_GetStatus();
-	uint8_t ButtonStatus_LCL = Buttons_GetStatus();
 
 	if (JoyStatus_LCL & JOY_UP)
 	  JoystickReport->Y = -100;
@@ -160,11 +159,7 @@
 	else if (JoyStatus_LCL & JOY_RIGHT)
 	  JoystickReport->X =  100;
 
-	if (JoyStatus_LCL & JOY_PRESS)
-	  JoystickReport->Button |= (1 << 1);
-
-	if (ButtonStatus_LCL & BUTTONS_BUTTON1)
-	  JoystickReport->Button |= (1 << 0);
+	JoystickReport->Button = Buttons_GetStatus();
 
 	*ReportSize = sizeof(USB_JoystickReport_Data_t);
 	return false;
diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/Joystick.h
--- a/Demos/Device/ClassDriver/Joystick/Joystick.h	Sat Sep 10 23:51:27 2011 +0100
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.h	Sat Sep 17 17:15:23 2011 +0100
@@ -45,10 +45,10 @@
 
 		#include "Descriptors.h"
 
+		#include "Inputs/Joystick.h"
+		#include "Inputs/Buttons.h"
 		#include <LUFA/Version.h>
-		#include <LUFA/Drivers/Board/Joystick.h>
 		#include <LUFA/Drivers/Board/LEDs.h>
-		#include <LUFA/Drivers/Board/Buttons.h>
 		#include <LUFA/Drivers/USB/USB.h>
 
 	/* Type Defines: */
diff -r e96f80ed36b9 Demos/Device/ClassDriver/Joystick/makefile
--- a/Demos/Device/ClassDriver/Joystick/makefile	Sat Sep 10 23:51:27 2011 +0100
+++ b/Demos/Device/ClassDriver/Joystick/makefile	Sat Sep 17 17:15:23 2011 +0100
@@ -60,7 +60,7 @@
 
 
 # MCU name
-MCU = at90usb1287
+MCU = atmega32u2
 
 
 # Target architecture (see library "Board Types" documentation).
@@ -70,7 +70,7 @@
 # Target board (see library "Board Types" documentation, NONE for projects not requiring
 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
 # "Board" inside the application directory.
-BOARD = USBKEY
+BOARD = MINIMUS
 
 
 # Processor frequency.
@@ -84,7 +84,7 @@
 #     does not *change* the processor frequency - it should merely be updated to
 #     reflect the processor speed set externally so that the code can use accurate
 #     software delays.
-F_CPU = 8000000
+F_CPU = 16000000
 
 
 # Input clock frequency.
