diff --git a/Marlin/BlinkM.cpp b/Marlin/BlinkM.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7b8a7867c2cc6d1994b0d919de41d2df5aa804b5
--- /dev/null
+++ b/Marlin/BlinkM.cpp
@@ -0,0 +1,24 @@
+/*
+ BlinkM.cpp - Library for controlling a BlinkM over i2c
+ Created by Tim Koster, August 21 2013.
+*/
+#if (ARDUINO >= 100)
+ # include "Arduino.h"
+#else
+ # include "WProgram.h"
+#endif
+
+#include "BlinkM.h"
+
+void SendColors(byte red, byte grn, byte blu)
+{
+ Wire.begin();
+ Wire.beginTransmission(0x09);
+ Wire.write('o'); //to disable ongoing script, only needs to be used once
+ Wire.write('n');
+ Wire.write(red);
+ Wire.write(grn);
+ Wire.write(blu);
+ Wire.endTransmission();
+}
+
diff --git a/Marlin/BlinkM.h b/Marlin/BlinkM.h
new file mode 100644
index 0000000000000000000000000000000000000000..5136828782dfd8a450e3b52db0a99b8930c1cf2b
--- /dev/null
+++ b/Marlin/BlinkM.h
@@ -0,0 +1,14 @@
+/*
+ BlinkM.h
+ Library header file for BlinkM library
+ */
+#if (ARDUINO >= 100)
+ # include "Arduino.h"
+#else
+ # include "WProgram.h"
+#endif
+
+#include "Wire.h"
+
+void SendColors(byte red, byte grn, byte blu);
+
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 459640fbc340d3fe636076e7b37cee03ed3e1221..974709ff447a7514f0527fd6cacff51ce3737b7b 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -561,6 +561,9 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Support for the BariCUDA Paste Extruder.
//#define BARICUDA
+//define BlinkM/CyzRgb Support
+//#define BLINKM
+
/*********************************************************************\
* R/C SERVO support
* Sponsored by TrinityLabs, Reworked by codexmas
diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 2a3534221e5281e7054f801e337b48aa8b55c60d..d62c2f6b90dfb24b987fd70dba2e095584e9d8d5 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -44,6 +44,9 @@
#include "language.h"
#include "pins_arduino.h"
+#include "BlinkM.h"
+#include "Wire.h"
+
#if NUM_SERVOS > 0
#include "Servo.h"
#endif
@@ -115,6 +118,7 @@
// M128 - EtoP Open (BariCUDA EtoP = electricity to air pressure transducer by jmil)
// M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)
// M140 - Set bed target temp
+// M150 - Set BlinkM Colour Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.
// M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating
// Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling
// M200 - Set filament diameter
@@ -1935,6 +1939,21 @@ void process_commands()
#endif
break;
//TODO: update for all axis, use for loop
+ #ifdef BLINKM
+ case 150: // M150
+ {
+ byte red;
+ byte grn;
+ byte blu;
+
+ if(code_seen('R')) red = code_value();
+ if(code_seen('U')) grn = code_value();
+ if(code_seen('B')) blu = code_value();
+
+ SendColors(red,grn,blu);
+ }
+ break;
+ #endif //BLINKM
case 201: // M201
for(int8_t i=0; i < NUM_AXIS; i++)
{