diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h
new file mode 100644
index 0000000..eb15373
--- /dev/null
+++ b/include/llvm/Analysis/LoopPass.h
@@ -0,0 +1,86 @@
+//===- LoopPass.h - LoopPass class ----------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Devang Patel and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines LoopPass class. All loop optimization
+// and transformation passes are derived from LoopPass.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LOOP_PASS_H
+#define LLVM_LOOP_PASS_H
+
+#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Pass.h"
+#include "llvm/PassManagers.h"
+#include "llvm/Function.h"
+
+namespace llvm {
+
+class LPPassManager;
+class Loop;
+class Function;
+
+class LoopPass : public Pass {
+
+ public:
+  // runOnLoop - THis method should be implemented by the subclass to perform
+  // whatever action is necessary for the specfied Loop. 
+  virtual bool runOnLoop (Loop &L, LPPassManager &LPM) = 0;
+  virtual bool runOnFunctionBody (Function &F, LPPassManager &LPM) { 
+    return false; 
+  }
+
+};
+
+class LPPassManager : public FunctionPass, public PMDataManager {
+
+public:
+  LPPassManager(int Depth) : PMDataManager(Depth) { }
+
+  /// run - Execute all of the passes scheduled for execution.  Keep track of
+  /// whether any of the passes modifies the module, and if so, return true.
+  bool runOnFunction(Function &F);
+
+  /// Pass Manager itself does not invalidate any analysis info.
+  void getAnalysisUsage(AnalysisUsage &Info) const {
+    // LPPassManager needs LoopInfo. In the long term LoopInfo class will 
+    // be consumed by LPPassManager.
+    Info.addRequired<LoopInfo>();
+    Info.setPreservesAll();
+  }
+  
+  virtual const char *getPassName() const {
+    return "Loop Pass Manager";
+  }
+  
+  // Print passes managed by this manager
+  void dumpPassStructure(unsigned Offset) {
+    llvm::cerr << std::string(Offset*2, ' ') << "Loop Pass Manager\n";
+    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
+      Pass *P = getContainedPass(Index);
+      P->dumpPassStructure(Offset + 1);
+      dumpLastUses(P, Offset+1);
+    }
+  }
+  
+  Pass *getContainedPass(unsigned N) {
+    assert ( N < PassVector.size() && "Pass number out of range!");
+    Pass *FP = static_cast<Pass *>(PassVector[N]);
+    return FP;
+  }
+
+  virtual PassManagerType getPassManagerType() { 
+    return PMT_LoopPassManager; 
+  }
+
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp
new file mode 100644
index 0000000..ee18ed5
--- /dev/null
+++ b/lib/Analysis/LoopPass.cpp
@@ -0,0 +1,69 @@
+//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Devang Patel and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements LoopPass and LPPassManager. All loop optimization
+// and transformation passes are derived from LoopPass. LPPassManager is
+// responsible for managing LoopPasses.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/LoopPass.h"
+using namespace llvm;
+
+//===----------------------------------------------------------------------===//
+// LPPassManager
+//
+/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses.
+
+/// run - Execute all of the passes scheduled for execution.  Keep track of
+/// whether any of the passes modifies the function, and if so, return true.
+bool LPPassManager::runOnFunction(Function &F) {
+  LoopInfo &LI = getAnalysis<LoopInfo>();
+  bool Changed = false;
+
+  std::string Msg1 = "Executing Pass '";
+  std::string Msg3 = "' Made Modification '";
+
+  // Walk Loops
+  for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) {
+
+    Loop *L  = *I;
+    // Run all passes on current SCC
+    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
+
+      Pass *P = getContainedPass(Index);
+      AnalysisUsage AnUsage;
+      P->getAnalysisUsage(AnUsage);
+
+      std::string Msg2 = "' on Loop ...\n'";
+      dumpPassInfo(P, Msg1, Msg2);
+      dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
+
+      initializeAnalysisImpl(P);
+
+      StartPassTimer(P);
+      LoopPass *LP = dynamic_cast<LoopPass *>(P);
+      assert (LP && "Invalid LPPassManager member");
+      LP->runOnLoop(*L, *this);
+      StopPassTimer(P);
+
+      if (Changed)
+	dumpPassInfo(P, Msg3, Msg2);
+      dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
+      
+      removeNotPreservedAnalysis(P);
+      recordAvailableAnalysis(P);
+      removeDeadPasses(P, Msg2);
+    }
+  }
+
+  return Changed;
+}
+
+
