diff --git a/README.md b/README.md
index 1ad14a26c..f18d6fee0 100755
--- a/README.md
+++ b/README.md
@@ -132,6 +132,7 @@ List of Definitions
* [jQuery.contextMenu](http://medialize.github.com/jQuery-contextMenu/) (by [Natan Vivo](https://github.com/nvivo/))
* [jQuery.Cookie](https://github.com/carhartl/jquery-cookie) (by [Roy Goode](https://github.com/RoyGoode))
* [jQuery.Cycle](http://jquery.malsup.com/cycle/) (by [François Guillot](http://fguillot.developpez.com/))
+* [jQuery.Cycle2](http://jquery.malsup.com/cycle2/) (by [Donny Nadolny](https://github.com/dnadolny))
* [jQuery.dataTables](http://www.datatables.net) (by [Armin Sander](https://github.com/pragmatrix))
* [jQuery.dynatree](http://code.google.com/p/dynatree/) (by [François de Campredon](https://github.com/fdecampredon))
* [jQuery.Flot](http://www.flotcharts.org/) (by [Matt Burland](https://github.com/burlandm))
diff --git a/jquery.cycle2/jquery.cycle2-tests.ts b/jquery.cycle2/jquery.cycle2-tests.ts
new file mode 100644
index 000000000..8a7eedf63
--- /dev/null
+++ b/jquery.cycle2/jquery.cycle2-tests.ts
@@ -0,0 +1,50 @@
+///
+///
+
+// basic
+$('#element').cycle();
+
+
+// code snippets from http://jquery.malsup.com/cycle2/api
+$('.cycle-slideshow').cycle({
+ speed: 600,
+ manualSpeed: 100
+});
+
+var newSlide = '
';
+$('.cycle-slideshow').cycle('add', newSlide);
+
+$('.cycle-slideshow').cycle('destroy');
+
+// goto 3rd slide
+$('.cycle-slideshow').cycle('goto', 2);
+
+$('.cycle-slideshow').cycle('next');
+
+$('.cycle-slideshow').cycle('pause');
+
+$('.cycle-slideshow').cycle('prev');
+
+$('.cycle-slideshow').cycle('reinit');
+
+// remove 2nd slide
+$('.cycle-slideshow').cycle('remove', 1);
+
+$('.cycle-slideshow').cycle('resume');
+
+$('.cycle-slideshow').cycle('stop');
+
+
+// from http://jquery.malsup.com/cycle2/demo/add.php
+var images = [
+ '
',
+ '
',
+ '
'
+];
+
+$('button').one('click', function() {
+ for (var i=0; i < images.length; i++) {
+ $('.cycle-slideshow').cycle('add', images[i]);
+ }
+ $(this).prop('disabled', true)
+})
diff --git a/jquery.cycle2/jquery.cycle2.d.ts b/jquery.cycle2/jquery.cycle2.d.ts
new file mode 100644
index 000000000..699d2aff8
--- /dev/null
+++ b/jquery.cycle2/jquery.cycle2.d.ts
@@ -0,0 +1,143 @@
+// Type definitions for jQuery Cycle2 version 2.1.2 (build 20140216)
+// Project: http://jquery.malsup.com/cycle2/ (also https://github.com/malsup/cycle2)
+// Definitions by: Donny Nadolny
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+
+///
+
+interface JQuery {
+ cycle: JQueryCycle2.Cycle2;
+
+ on(methodName: 'cycle-after', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState, outgoingSlideEl: Element, incomingSlideEl: Element, forwardFlag: boolean) => void): JQuery;
+ on(methodName: 'cycle-before', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState, outgoingSlideEl: Element, incomingSlideEl: Element, forwardFlag: boolean) => void): JQuery;
+ on(methodName: 'cycle-bootstrap', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState, API: JQueryCycle2.API) => void): JQuery;
+ on(methodName: 'cycle-destroyed', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-finished', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-initialized', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-next', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-pager-activated', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-paused', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-post-initialize', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-pre-initialize', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-prev', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-resumed', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-slide-added', callback: (event: JQueryEventObject, jQueryWrappedSlideEl: JQuery) => void): JQuery;
+ on(methodName: 'cycle-slide-removed', callback: (event: JQueryEventObject, indexOfSlideRemoved: number, removedSlideEl: Element) => void): JQuery;
+ on(methodName: 'cycle-stopped', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-transition-stopped', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState) => void): JQuery;
+ on(methodName: 'cycle-update-view', callback: (event: JQueryEventObject, optionHash: JQueryCycle2.OptionsWithState, slideOptionsHash: JQueryCycle2.OptionsWithState, currentSlideEl: Element) => void): JQuery;
+}
+
+
+declare module JQueryCycle2 {
+ interface Cycle2 {
+ (options?: Options): JQuery;
+ (methodName: 'add', newSlide: any): JQuery; // string or JQuery
+ (methodName: 'destroy'): JQuery;
+ (methodName: 'goto', index: number): JQuery;
+ (methodName: 'next'): JQuery;
+ (methodName: 'pause'): JQuery;
+ (methodName: 'prev'): JQuery;
+ (methodName: 'reinit'): JQuery;
+ (methodName: 'remove', index: number): JQuery;
+ (methodName: 'resume'): JQuery;
+ (methodName: 'stop'): JQuery;
+ (methodNameDontCallMe: string, arg1DontCallMe: any, arg2DontCallMe: any): JQuery; // catch-all, shouldn't ever be called though
+ }
+
+ interface Options {
+ allowWrap?: boolean;
+ autoHeight?: any; // number or string
+ autoSelector?: string;
+ caption?: string;
+ captionTemplate?: string;
+ continueAuto?: boolean;
+ delay?: number;
+ disabledClass?: string;
+ easing?: string;
+ fx?: string;
+ hideNonActive?: boolean;
+ loader?: any; // boolean or 'wait'
+ log?: boolean;
+ loop?: number;
+ manualSpeed?: number;
+ manualTrump?: boolean;
+ next?: string;
+ nextEvent?: string;
+ overlay?: string;
+ overlayTemplate?: string;
+ pager?: string;
+ pagerActivateClass?: string;
+ pagerEvent?: string;
+ pagerTemplate?: string;
+ pauseOnHover?: any; // boolean or string
+ paused?: boolean;
+ prev?: string;
+ prevEvent?: string;
+ progressive?: string;
+ random?: boolean;
+ reverse?: boolean;
+ slideActiveClass?: string;
+ slideCss?: any;
+ slideClass?: string;
+ slides?: string;
+ speed?: number;
+ startingSlide?: number;
+ swipe?: boolean;
+ sync?: boolean;
+ timeout?: number;
+ tmplRegex?: string;
+ updateView?: number;
+ }
+
+ interface OptionsWithState extends Options {
+ busy: boolean;
+ currSlide: number;
+ nextSlide: number;
+ paused: boolean;
+ slideNum: number;
+ slideCount: number;
+ }
+
+ interface API {
+ add(slides: any, prepend?: boolean): void; // string or array or JQuery
+ addInitialSlides(): void;
+ advanceSlide(numberOfOpositions: number): boolean; // always false
+ buildPagerLink(slideOptionHash: Options, slide: any /*not sure*/): void;
+ buildSlideOpts(slide: any /*not sure*/): Options;
+ calcFirstSlide(): void;
+ calcNextSlide(): void;
+ calcTx(slideOptions: Options, manual: boolean): Transition;
+ destroy(): void;
+ doTransition(slideOptions: Options, currEl: Element, nextEl: Element, fwdFlag: boolean, callback: Function): void;
+ getComponent(nameOfComponent: string): JQuery;
+ getSlideIndex(slideElement: Element): number;
+ getSlideOpts(slideIndex: number): Options;
+ goto(index: number): void;
+ initSlide(slideOptions: Options, slide: any /*not sure*/, suggestedZindex: number): void;
+ initSlideshow(): void;
+ log(...args: any[]): void;
+ next(): void;
+ page(pagerEl: Element, targetEl: Element): void;
+ pause(): void;
+ postInitSlideshow(): void;
+ preInitSlideshow(): void;
+ prepareTx(manualFlag: boolean, fwdFlag: boolean): void;
+ prev(): void;
+ queueTransition(slideOptions: Options): void;
+ reinit(): void;
+ remove(slideIndexToRemove: number): void;
+ resume(): void;
+ stackSlides(currEl: Element, nextEl: Element, fwdFlag: boolean): void;
+ stop(): void;
+ stopTransition(): void;
+ tmpl(templateString: string, optionHash: Options, slideEl: Element): void;
+ trigger(eventName: String, ...args: any[]): void;
+ updateView(): void;
+ }
+
+ interface Transition {
+ before(opts: Options, curr: Element, next: Element, fwd: boolean): void;
+ }
+}
\ No newline at end of file