diff --git a/.eslintrc.js b/.eslintrc.js
index e7c9b46..a099d6b 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -30,7 +30,6 @@ module.exports = {
     'indent': [ERROR, 2, {SwitchCase: 1}],
     'jsx-quotes': [ERROR, 'prefer-double'],
     'no-bitwise': OFF,
-    'no-dupe-class-members': ERROR,
     'no-multi-spaces': ERROR,
     'no-restricted-syntax': [ERROR, 'WithStatement'],
     'no-shadow': ERROR,
@@ -39,6 +38,7 @@ module.exports = {
     'quotes': [ERROR, 'single', 'avoid-escape'],
     'space-after-keywords': ERROR,
     'space-before-blocks': ERROR,
+    'space-before-function-paren': [ERROR, {anonymous: 'never', named: 'never'}],
     'space-before-keywords': ERROR,
     'strict': [ERROR, 'global'],
 
@@ -57,7 +57,7 @@ module.exports = {
     'react/no-did-update-set-state': OFF,
     // We define multiple components in test files
     'react/no-multi-comp': OFF,
-    'react/no-unknown-property': ERROR,
+    'react/no-unknown-property': OFF,
     // This isn't useful in our test code
     'react/prop-types': OFF,
     'react/react-in-jsx-scope': ERROR,
diff --git a/package.json b/package.json
index 54234a3..f0c1fc9 100644
--- a/package.json
+++ b/package.json
@@ -32,8 +32,8 @@
     "del": "^2.0.2",
     "derequire": "^2.0.3",
     "envify": "^3.0.0",
-    "eslint": "1.9.0",
-    "eslint-plugin-react": "3.8.0",
+    "eslint": "1.10.3",
+    "eslint-plugin-react": "4.1.0",
     "eslint-plugin-react-internal": "file:eslint-rules",
     "fbjs": "^0.6.1",
     "fbjs-scripts": "0.6.0-alpha.2",
diff --git a/src/renderers/dom/client/syntheticEvents/__tests__/SyntheticEvent-test.js b/src/renderers/dom/client/syntheticEvents/__tests__/SyntheticEvent-test.js
index 68ac8ab..d05ebdf 100644
--- a/src/renderers/dom/client/syntheticEvents/__tests__/SyntheticEvent-test.js
+++ b/src/renderers/dom/client/syntheticEvents/__tests__/SyntheticEvent-test.js
@@ -86,11 +86,14 @@ describe('SyntheticEvent', function() {
     expect(syntheticEvent.type).toBe(null);
     expect(syntheticEvent.nativeEvent).toBe(null);
     expect(syntheticEvent.target).toBe(null);
-    expect(console.error.calls.length).toBe(3); // once for each property accessed
-    expect(console.error.argsForCall[0][0]).toBe( // assert the first warning for accessing `type`
-      'Warning: This synthetic event is reused for performance reasons. If you\'re seeing this, ' +
-      'you\'re accessing the property `type` on a released/nullified synthetic event. This is set to null. ' +
-      'If you must keep the original synthetic event around, use event.persist(). ' +
+    // once for each property accessed
+    expect(console.error.calls.length).toBe(3);
+    // assert the first warning for accessing `type`
+    expect(console.error.argsForCall[0][0]).toBe(
+      'Warning: This synthetic event is reused for performance reasons. If ' +
+      'you\'re seeing this, you\'re accessing the property `type` on a ' +
+      'released/nullified synthetic event. This is set to null. If you must ' +
+      'keep the original synthetic event around, use event.persist(). ' +
       'See https://fb.me/react-event-pooling for more information.'
     );
   });
@@ -103,10 +106,11 @@ describe('SyntheticEvent', function() {
     expect(syntheticEvent.type = 'MouseEvent').toBe('MouseEvent');
     expect(console.error.calls.length).toBe(1);
     expect(console.error.argsForCall[0][0]).toBe(
-      'Warning: This synthetic event is reused for performance reasons. If you\'re seeing this, ' +
-      'you\'re setting the property `type` on a released/nullified synthetic event. This is ' +
-      'effectively a no-op. If you must keep the original synthetic event around, use ' +
-      'event.persist(). See https://fb.me/react-event-pooling for more information.'
+      'Warning: This synthetic event is reused for performance reasons. If ' +
+      'you\'re seeing this, you\'re setting the property `type` on a ' +
+      'released/nullified synthetic event. This is effectively a no-op. If you must ' +
+      'keep the original synthetic event around, use event.persist(). ' +
+      'See https://fb.me/react-event-pooling for more information.'
     );
   });
 
@@ -117,10 +121,11 @@ describe('SyntheticEvent', function() {
     syntheticEvent.preventDefault();
     expect(console.error.calls.length).toBe(1);
     expect(console.error.argsForCall[0][0]).toBe(
-      'Warning: This synthetic event is reused for performance reasons. If you\'re seeing this, ' +
-      'you\'re accessing the method `preventDefault` on a released/nullified synthetic event. ' +
-      'This is a no-op function. If you must keep the original synthetic event around, ' +
-      'use event.persist(). See https://fb.me/react-event-pooling for more information.'
+      'Warning: This synthetic event is reused for performance reasons. If ' +
+      'you\'re seeing this, you\'re accessing the method `preventDefault` on a ' +
+      'released/nullified synthetic event. This is a no-op function. If you must ' +
+      'keep the original synthetic event around, use event.persist(). ' +
+      'See https://fb.me/react-event-pooling for more information.'
     );
   });
 
@@ -131,10 +136,11 @@ describe('SyntheticEvent', function() {
     syntheticEvent.stopPropagation();
     expect(console.error.calls.length).toBe(1);
     expect(console.error.argsForCall[0][0]).toBe(
-      'Warning: This synthetic event is reused for performance reasons. If you\'re seeing this, ' +
-      'you\'re accessing the method `stopPropagation` on a released/nullified synthetic event. ' +
-      'This is a no-op function. If you must keep the original synthetic event around, ' +
-      'use event.persist(). See https://fb.me/react-event-pooling for more information.'
+      'Warning: This synthetic event is reused for performance reasons. If ' +
+      'you\'re seeing this, you\'re accessing the method `stopPropagation` on a ' +
+      'released/nullified synthetic event. This is a no-op function. If you must ' +
+      'keep the original synthetic event around, use event.persist(). ' +
+      'See https://fb.me/react-event-pooling for more information.'
     );
   });
 
@@ -154,9 +160,10 @@ describe('SyntheticEvent', function() {
 
     expect(console.error.calls.length).toBe(1);
     expect(console.error.argsForCall[0][0]).toBe(
-      'Warning: This synthetic event is reused for performance reasons. If you\'re seeing this, ' +
-      'you\'re accessing the property `nativeEvent` on a released/nullified synthetic event. ' +
-      'This is set to null. If you must keep the original synthetic event around, use event.persist(). ' +
+      'Warning: This synthetic event is reused for performance reasons. If ' +
+      'you\'re seeing this, you\'re accessing the property `nativeEvent` on a ' +
+      'released/nullified synthetic event. This is set to null. If you must ' +
+      'keep the original synthetic event around, use event.persist(). ' +
       'See https://fb.me/react-event-pooling for more information.'
     );
   });
@@ -170,9 +177,10 @@ describe('SyntheticEvent', function() {
     if (typeof Proxy === 'function') {
       expect(console.error.calls.length).toBe(1);
       expect(console.error.argsForCall[0][0]).toBe(
-        'Warning: This synthetic event is reused for performance reasons. If you\'re ' +
-        'seeing this, you\'re adding a new property in the synthetic event object. ' +
-        'The property is never released. See https://fb.me/react-event-pooling for more information.'
+        'Warning: This synthetic event is reused for performance reasons. If ' +
+        'you\'re seeing this, you\'re adding a new property in the synthetic ' +
+        'event object. The property is never released. ' +
+        'See https://fb.me/react-event-pooling for more information.'
       );
     } else {
       expect(console.error.calls.length).toBe(0);
diff --git a/src/renderers/dom/shared/DOMPropertyOperations.js b/src/renderers/dom/shared/DOMPropertyOperations.js
index 90858f0..dc0c3fb 100644
--- a/src/renderers/dom/shared/DOMPropertyOperations.js
+++ b/src/renderers/dom/shared/DOMPropertyOperations.js
@@ -18,8 +18,9 @@ var ReactPerf = require('ReactPerf');
 var quoteAttributeValueForBrowser = require('quoteAttributeValueForBrowser');
 var warning = require('warning');
 
-var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR +
-  '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');
+var VALID_ATTRIBUTE_NAME_REGEX = new RegExp(
+  '^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$'
+);
 var illegalAttributeNameCache = {};
 var validatedAttributeNameCache = {};
 
diff --git a/src/test/__tests__/ReactTestUtils-test.js b/src/test/__tests__/ReactTestUtils-test.js
index dbe421e..a7cf4ab 100644
--- a/src/test/__tests__/ReactTestUtils-test.js
+++ b/src/test/__tests__/ReactTestUtils-test.js
@@ -206,8 +206,7 @@ describe('ReactTestUtils', function() {
             ref={() => {}}
             onClick={this.handleUserClick}
             className={this.state.clicked ? 'clicked' : ''}
-          >
-          </div>
+          />
         );
       },
     });
