diff --git a/include/clang/Analysis/LocalCheckers.h b/include/clang/Analysis/LocalCheckers.h
index cd2d6b3ec70d7433bb933887546ad07ead4820ee..5182d63b0dd3a9f614227c2da15a1cfd1540e9ff 100644
--- a/include/clang/Analysis/LocalCheckers.h
+++ b/include/clang/Analysis/LocalCheckers.h
@@ -50,6 +50,7 @@ void CheckObjCInstMethSignature(const ObjCImplementationDecl *ID,
 void CheckObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter& BR);
 
 void RegisterAppleChecks(GRExprEngine& Eng, const Decl &D);
+void RegisterExperimentalChecks(GRExprEngine &Eng);
 
 void CheckSecuritySyntaxOnly(const Decl *D, BugReporter &BR);
 
diff --git a/include/clang/Frontend/AnalysisConsumer.h b/include/clang/Frontend/AnalysisConsumer.h
index d8fe9f33a9f3a7d67d91419e377d5e91ccf87809..fb0baff0052317623a4a1d05a74f3cd62df24bdf 100644
--- a/include/clang/Frontend/AnalysisConsumer.h
+++ b/include/clang/Frontend/AnalysisConsumer.h
@@ -67,6 +67,7 @@ public:
   unsigned TrimGraph : 1;
   unsigned VisualizeEGDot : 1;
   unsigned VisualizeEGUbi : 1;
+  unsigned EnableExperimentalChecks : 1;
 
 public:
   AnalyzerOptions() {
@@ -77,6 +78,7 @@ public:
     TrimGraph = 0;
     VisualizeEGDot = 0;
     VisualizeEGUbi = 0;
+    EnableExperimentalChecks = 0;
   }
 };
 
diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt
index 3638b831a7fe4f018661f6c2059eda2088a4a891..8e8c1e7b25ed20e56323e2d0774dd6350dec4126 100644
--- a/lib/Analysis/CMakeLists.txt
+++ b/lib/Analysis/CMakeLists.txt
@@ -30,6 +30,7 @@ add_clang_library(clangAnalysis
   GRBlockCounter.cpp
   GRCoreEngine.cpp
   GRExprEngine.cpp
+  GRExprEngineExperimentalChecks.cpp
   GRExprEngineInternalChecks.cpp
   GRState.cpp
   LiveVariables.cpp
diff --git a/lib/Analysis/GRExprEngineExperimentalChecks.cpp b/lib/Analysis/GRExprEngineExperimentalChecks.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e50dbeba68875e2534e0ac3b007bc65efa34d66f
--- /dev/null
+++ b/lib/Analysis/GRExprEngineExperimentalChecks.cpp
@@ -0,0 +1,23 @@
+//=-- GRExprEngineExperimentalChecks.h ------------------------------*- C++ -*-=
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines functions to instantiate and register experimental
+//  checks in GRExprEngine.
+//
+//===----------------------------------------------------------------------===//
+
+#include "GRExprEngineExperimentalChecks.h"
+#include "clang/Analysis/LocalCheckers.h"
+
+using namespace clang;
+
+void clang::RegisterExperimentalChecks(GRExprEngine &Eng) {
+  RegisterPthreadLockChecker(Eng);  
+}
+
diff --git a/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp
index d51730c20f2e91c207353065dd82b8234cf231f1..e8bd920d412a4e2a9eafa9fa28efae67f060cfa5 100644
--- a/lib/Frontend/AnalysisConsumer.cpp
+++ b/lib/Frontend/AnalysisConsumer.cpp
@@ -332,7 +332,9 @@ static void ActionGRExprEngine(AnalysisConsumer &C, AnalysisManager& mgr, Decl *
   Eng.RegisterInternalChecks(); // FIXME: Internal checks should just
                                 // automatically register.
   RegisterAppleChecks(Eng, *D);
-
+  
+  if (C.Opts.EnableExperimentalChecks)
+    RegisterExperimentalChecks(Eng);
 
   // Set the graph auditor.
   llvm::OwningPtr<ExplodedNode::Auditor> Auditor;
diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp
index 5d01e03a9ca8b3955c78ca881044f4e4f2220f6f..5b3800f3f20f16437211ea1d1752c84d5376b928 100644
--- a/tools/clang-cc/Options.cpp
+++ b/tools/clang-cc/Options.cpp
@@ -78,11 +78,15 @@ static llvm::cl::opt<bool>
 AnalyzeAll("analyzer-opt-analyze-headers",
     llvm::cl::desc("Force the static analyzer to analyze "
                    "functions defined in header files"));
-
+  
 static llvm::cl::opt<bool>
 AnalyzerDisplayProgress("analyzer-display-progress",
-          llvm::cl::desc("Emit verbose output about the analyzer's progress."));
+          llvm::cl::desc("Emit verbose output about the analyzer's progress"));
 
+static llvm::cl::opt<bool>
+AnalyzerExperimentalChecks("analyzer-experimental-checks",
+          llvm::cl::desc("Use experimental path-sensitive checks"));
+  
 static llvm::cl::opt<std::string>
 AnalyzeSpecificFunction("analyze-function",
                llvm::cl::desc("Run analysis on specific function"));
@@ -91,13 +95,13 @@ static llvm::cl::opt<bool>
 EagerlyAssume("analyzer-eagerly-assume",
           llvm::cl::init(false),
               llvm::cl::desc("Eagerly assume the truth/falseness of some "
-                             "symbolic constraints."));
+                             "symbolic constraints"));
 
 static llvm::cl::opt<bool>
 PurgeDead("analyzer-purge-dead",
           llvm::cl::init(true),
           llvm::cl::desc("Remove dead symbols, bindings, and constraints before"
-                         " processing a statement."));
+                         " processing a statement"));
 
 static llvm::cl::opt<bool>
 TrimGraph("trim-egraph",
@@ -126,6 +130,7 @@ void clang::InitializeAnalyzerOptions(AnalyzerOptions &Opts) {
   Opts.PurgeDead = PurgeDead;
   Opts.EagerlyAssume = EagerlyAssume;
   Opts.AnalyzeSpecificFunction = AnalyzeSpecificFunction;
+  Opts.EnableExperimentalChecks = AnalyzerExperimentalChecks;
   Opts.TrimGraph = TrimGraph;
 }