diff --git a/meshblu/meshblu-tests.ts b/meshblu/meshblu-tests.ts
new file mode 100644
index 0000000000..1c4bc0fb02
--- /dev/null
+++ b/meshblu/meshblu-tests.ts
@@ -0,0 +1,123 @@
+///
+
+import Meshblu = require('meshblu');
+
+var UUID = "26de691f-8068-4cdc-907a-4cb5961a1aba";
+var TOKEN = "4cb5961a1aba26de691f80684cdc907a";
+
+var meshblu = Meshblu.createConnection({
+ uuid: UUID,
+ token: TOKEN
+});
+
+meshblu.data({
+ uuid: UUID,
+ online: true,
+ x: -53,
+ y: 234
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.device({
+ uuid: UUID
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.devices({
+ color: "green"
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.generateAndStoreToken({
+ uuid: UUID
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.getdata({
+ uuid: UUID,
+ start: "2015-04-23T18:25:43.511Z",
+ finish: "2015-04-24T18:25:43.511Z",
+ limit: 10
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.identify();
+
+meshblu.message({
+ devices: [UUID],
+ topic: "status",
+ payload: {
+ online: true
+ }
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.register({
+ type: "drone"
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.revokeToken({
+ uuid: UUID,
+ token: TOKEN
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.subscribe({
+ uuid: UUID
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.subscribe({
+ uuid: UUID,
+ types: ["sent", "received"]
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.subscribe({
+ uuid: UUID,
+ types: ["sent", "received"],
+ topics: ["device*", "-*status"]
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.unsubscribe({
+ uuid: UUID
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.unsubscribe({
+ uuid: UUID,
+ types: ["sent", "broadcast"]
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.update({
+ uuid: UUID,
+ color: "blue"
+}, function(result) {
+ console.log(result);
+});
+
+meshblu.whoami({}, function(result) {
+ console.log(result);
+});
+
+meshblu.unregister({
+ uuid: UUID
+}, function(result) {
+ console.log(result);
+});
\ No newline at end of file
diff --git a/meshblu/meshblu.d.ts b/meshblu/meshblu.d.ts
new file mode 100644
index 0000000000..f3b9684f23
--- /dev/null
+++ b/meshblu/meshblu.d.ts
@@ -0,0 +1,281 @@
+// Type definitions for meshblu.js 1.30.1
+// Project: https://github.com/octoblu/meshblu-npm
+// Definitions by: Felipe Nipo
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module 'meshblu' {
+ var Meshblu: MeshbluStatic;
+
+ export = Meshblu;
+}
+
+interface MeshbluStatic {
+
+ /**
+ * Establish a secure socket.io connection to Meshblu.
+ * @param opt
+ * @returns A Meshblu Connection.
+ */
+ createConnection(opt: Meshblu.ConnectionOptions): Meshblu.Connection;
+
+}
+
+declare module Meshblu {
+
+ interface Connection {
+
+ /**
+ * Authenticate with Meshblu.
+ * @returns This Connection.
+ */
+ identify(): Connection;
+
+ /**
+ * @param data {string|number|object|array|Buffer} - data for signing.
+ */
+ sign(data: any): string;
+
+ /**
+ * @param message {string|number|object|array|Buffer} - signed data.
+ * @param signature
+ * @returns {*}
+ */
+ verify(message: any, signature: any): any;
+
+ /**
+ * @param uuid
+ * @param message {string|number|object|array|Buffer} - data for encrypting.
+ * @param options
+ * @param fn The callback to be called. It should take one parameter, result,
+ * which is an object containing a property "error".
+ * @returns This Connection.
+ */
+ encryptMessage(uuid: string, message: any, options: Meshblu.ConnectionOptions, fn:(result: any) => void): Connection;
+
+ /**
+ * Send a meshblu message.
+ * @param payload An array of devices UUIDs.
+ * @param fn The callback to be called. It should take one parameter, result,
+ * which is an object containing a property "error".
+ * @returns This Connection.
+ */
+ message(payload: MessagePayload, fn:(result: any) => void): Connection;
+
+ /**
+ * Update a device record.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ update(data: UpdateData, fn:(result: UpdateSuccess) => void): Connection;
+
+ /**
+ * Register a new device record.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ register(data: RegisterData, fn:(result: RegisterResponse) => void): Connection;
+
+ /**
+ * Removes a device record.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ unregister(data: Device, fn:(result: Device) => void): Connection;
+
+ /**
+ * Get my device info.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ whoami(data: any, fn:(result: DeviceResponse) => void): Connection;
+
+ /**
+ * Find a Meshblu device.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ device(data: Device, fn:(result: DeviceResponse) => void): Connection
+
+ /**
+ * Find Meshblu devices.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ devices(data: Color, fn:(result: DeviceResponse[]) => void): Connection
+
+ /**
+ * Returns device messages as they are sent and received.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ subscribe(data: SubscribeData, fn:(result: any) => void): Connection
+
+ /**
+ * Cancels device subscription.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ unsubscribe(data: UnsubscribeData, fn:(result: any) => void): Connection
+
+ /**
+ * Send a meshblu data message.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ data(data: DataInput, fn:(result: any) => void): Connection
+
+ /**
+ * Get a meshblu data for a device.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ * @returns This Connection.
+ */
+ getdata(data: GetDataInput, fn:(result: any) => void): Connection
+
+ /**
+ * Generate a new session token for a device.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ */
+ generateAndStoreToken(data: Device, fn:(result: ConnectionOptions) => void): void
+
+ /**
+ * Remove a session token from a device.
+ * @param data
+ * @param fn The callback to be called. It should take one parameter, result.
+ */
+ revokeToken(data: ConnectionOptions, fn:(result: Device) => void): void
+
+ /**
+ *
+ * @param uuid
+ * @param fn The callback to be called. It should take one parameter, err,
+ * which will be null if there was no problem, and one parameter, publicKey,
+ * of type NodeRSA.
+ */
+ getPublicKey(uuid: string, fn:(err: Error, publicKey: any) => void): void;
+
+ /*
+ * Lack of documentation about these api functions.
+ */
+ send(text: string): Connection;
+ bufferedSocketEmit(): void;
+ parseUrl(serverUrl: string, port: string): string;
+ generateKeyPair(): KeyPair;
+ setPrivateKey(privateKey: string): void;
+ setup(): Connection;
+ connect(): void;
+ reconnect(): void;
+ claimdevice(data: Device, fn:(result: Device) => void): Connection;
+ mydevices(data: any, fn:(result: any) => void): Connection
+ status(data: any): Connection
+ authenticate(data: any, fn:(result: any) => void): Connection
+ events(data: any, fn:(result: any) => void): Connection
+ localdevices(fn:(result: any) => void): Connection
+ unclaimeddevices(data: any, fn:(result: any) => void): Connection
+ textBroadcast(data: any): Connection
+ directText(data: any): Connection
+ subscribeText(data: any, fn:(result: any) => void): Connection
+ unsubscribeText(data: any, fn:(result: any) => void): Connection
+ close(fn:(result: any) => void): Connection
+ resetToken(data: any, fn:(result: any) => void): void
+ }
+
+ /**
+ * Contains the primary means of identifying a device.
+ */
+ interface ConnectionOptions {
+ uuid: string;
+ token: string;
+ }
+
+ interface KeyPair {
+ privateKey: string;
+ publicKey: string;
+ }
+
+ interface MessagePayload {
+ devices: string[];
+ topic: string;
+ payload: any;
+ qos?: number;
+ }
+
+ interface UpdateData {
+ uuid: string;
+ color: string;
+ }
+
+ interface UpdateSuccess {
+ uuid: string;
+ token: string;
+ status: string;
+ }
+
+ interface RegisterData {
+ type: string;
+ }
+
+ interface RegisterResponse {
+ uuid: string;
+ token: string;
+ type: string;
+ }
+
+ interface Device {
+ uuid: string;
+ }
+
+ interface DeviceResponse {
+ uuid: string;
+ online: boolean;
+ color: string;
+ }
+
+ interface Color {
+ color: string;
+ }
+
+ interface SubscribeData {
+ uuid: string;
+ types?: string[];
+ topics?: string[];
+ }
+
+ interface UnsubscribeData {
+ uuid: string;
+ types?: string[];
+ }
+
+ interface DataInput {
+ uuid: string;
+ online: boolean;
+ x: number;
+ y: number;
+ }
+
+ interface GetDataInput {
+ uuid: string;
+ start: string;
+ finish: string;
+ limit: number;
+ }
+
+ interface IdentifySuccess {
+ uuid: string;
+ token: string;
+ status: string;
+ }
+
+}