diff --git a/gui/sessionviewer/inc/TProofProgressLog.h b/gui/sessionviewer/inc/TProofProgressLog.h
index dd99a1ca9143e4fdc569a53f6b72aa065f49f22c..464ec226ef531d5fe581fa389b1bd301f0884d04 100644
--- a/gui/sessionviewer/inc/TProofProgressLog.h
+++ b/gui/sessionviewer/inc/TProofProgressLog.h
@@ -43,6 +43,7 @@ private:
    TGCheckButton        *fAllLines;  // display all lines button
    TGSplitButton        *fAllWorkers; // display all workers button
 
+   Bool_t               fFullText;    // 0 - when grep was called
 public:
    TProofProgressLog(TProofProgressDialog *d, Int_t w = 700, Int_t h = 300);
    virtual ~TProofProgressLog();
diff --git a/gui/sessionviewer/src/TProofProgressDialog.cxx b/gui/sessionviewer/src/TProofProgressDialog.cxx
index 0c25ad50c95a912a226829be6c9dfedf5f46d193..3898f6f24565a2405aef7d0489e5f8edc5cc7647 100644
--- a/gui/sessionviewer/src/TProofProgressDialog.cxx
+++ b/gui/sessionviewer/src/TProofProgressDialog.cxx
@@ -419,8 +419,11 @@ void TProofProgressDialog::Progress(Long64_t total, Long64_t processed)
       fStop->SetState(kButtonDisabled);
       fAbort->SetState(kButtonDisabled);
       fClose->SetState(kButtonUp);
-      if (!fKeep)
-         DoClose();
+      if (!fKeep) DoClose();
+
+      // Set the status to done
+      fStatus = kDone;
+
    } else {
       // A negative value for process indicates that we are finished,
       // no matter whether the processing was complete
@@ -460,6 +463,9 @@ void TProofProgressDialog::Progress(Long64_t total, Long64_t processed)
          fStop->SetState(kButtonDisabled);
          fAbort->SetState(kButtonDisabled);
          fClose->SetState(kButtonUp);
+
+         // Set the status to done
+         fStatus = kDone;
       }
    }
    fPrevProcessed = evproc;
@@ -595,8 +601,11 @@ void TProofProgressDialog::Progress(Long64_t total, Long64_t processed,
       fStop->SetState(kButtonDisabled);
       fAbort->SetState(kButtonDisabled);
       fClose->SetState(kButtonUp);
-      if (!fKeep)
-         DoClose();
+      if (!fKeep) DoClose();
+
+      // Set the status to done
+      fStatus = kDone;
+
    } else {
       // A negative value for process indicates that we are finished,
       // no matter whether the processing was complete
diff --git a/gui/sessionviewer/src/TProofProgressLog.cxx b/gui/sessionviewer/src/TProofProgressLog.cxx
index 1b89017610539f83014dc4972a0bf938edfe027b..05b48404138e2a9f6179e6c2e8beb5caa9248cf0 100644
--- a/gui/sessionviewer/src/TProofProgressLog.cxx
+++ b/gui/sessionviewer/src/TProofProgressLog.cxx
@@ -38,7 +38,8 @@ TProofProgressLog::TProofProgressLog(TProofProgressDialog *d, Int_t w, Int_t h)
    // Create a window frame for log messages.
 
    fDialog = d;
-
+   fProofLog = 0;
+   fFullText = kTRUE;
    // use hierarchical cleaning
    SetCleanup(kDeepCleanup);
 
@@ -273,9 +274,13 @@ void TProofProgressLog::DoLog(Bool_t grep)
       to = fLinesTo->GetIntNumber();
    }
    if (!grep) {
-      fProofLog = TProof::Mgr(fDialog->fSessionUrl.Data())->GetSessionLogs();
+      if (!fProofLog || !fFullText || fDialog->fStatus==TProofProgressDialog::kRunning){
+         fProofLog = TProof::Mgr(fDialog->fSessionUrl.Data())->GetSessionLogs();
+         fFullText = kTRUE;
+      }
    } else {
       fProofLog = TProof::Mgr(fDialog->fSessionUrl.Data())->GetSessionLogs(0, 0, greptext.Data());
+      fFullText = kFALSE;
    }
    TList *selected = new TList;
    fLogList->GetSelectedEntries(selected);