diff --git a/package.json b/package.json
index b4998738..eed47fab 100644
--- a/package.json
+++ b/package.json
@@ -326,6 +326,18 @@
                 "title": "Add repo-like path",
                 "icon": "$(add)"
             },
+            {
+                "command": "svn.repolog.filterAuthor",
+                "category": "SVN",
+                "title": "Set filter by author",
+                "icon": "$(account)"
+            },
+            {
+                "command": "svn.repolog.filterMsg",
+                "category": "SVN",
+                "title": "Set filter by message",
+                "icon": "$(filter)"
+            },
             {
                 "command": "svn.repolog.copymsg",
                 "category": "SVN",
@@ -569,6 +581,14 @@
                     "command": "svn.renameExplorer",
                     "when": "false"
                 },
+                {
+                    "command": "svn.repolog.filterAuthor",
+                    "when": "false"
+                },
+                {
+                    "command": "svn.repolog.filterMsg",
+                    "when": "false"
+                },
                 {
                     "command": "svn.repolog.addrepolike",
                     "when": "false"
@@ -661,6 +681,16 @@
                     "when": "view == repolog",
                     "group": "navigation"
                 },
+                {
+                    "command": "svn.repolog.filterAuthor",
+                    "when": "view == repolog",
+                    "group": "navigation"
+                },
+                {
+                    "command": "svn.repolog.filterMsg",
+                    "when": "view == repolog",
+                    "group": "navigation"
+                },
                 {
                     "command": "svn.repolog.addrepolike",
                     "when": "view == repolog",
diff --git a/src/historyView/repoLogProvider.ts b/src/historyView/repoLogProvider.ts
index 79200aaf..ccde1177 100644
--- a/src/historyView/repoLogProvider.ts
+++ b/src/historyView/repoLogProvider.ts
@@ -73,6 +73,8 @@ export class RepoLogProvider
     ._onDidChangeTreeData.event;
   // TODO on-disk cache?
   private readonly logCache: Map<string, ICachedLog> = new Map();
+  private filterAuthor: string = "";
+  private filterMsg: string = "";
   private _dispose: Disposable[] = [];
 
   private getCached(maybeItem?: ILogTreeItem): ICachedLog {
@@ -118,7 +120,13 @@ export class RepoLogProvider
           return this.refresh();
           // TODO refresh only required repo, need to pass element === getChildren()
         }
-      )
+      ),
+      commands.registerCommand(
+        "svn.repolog.filterAuthor",
+        this.filterAuthorGui,
+        this
+      ),
+      commands.registerCommand("svn.repolog.filterMsg", this.filterMsgGui, this)
     );
   }
 
@@ -126,6 +134,30 @@ export class RepoLogProvider
     dispose(this._dispose);
   }
 
+  public filterAuthorGui() {
+    const box = window.createInputBox();
+    box.prompt = "Set filter for commit authors, empty to reset";
+    box.value = this.filterAuthor;
+    box.onDidAccept(async () => {
+      this.filterAuthor = box.value;
+      box.dispose();
+      this._onDidChangeTreeData.fire(undefined);
+    });
+    box.show();
+  }
+
+  public filterMsgGui() {
+    const box = window.createInputBox();
+    box.prompt = "Set filter for commit message, empty to reset";
+    box.value = this.filterMsg;
+    box.onDidAccept(async () => {
+      this.filterMsg = box.value;
+      box.dispose();
+      this._onDidChangeTreeData.fire(undefined);
+    });
+    box.show();
+  }
+
   public removeRepo(element: ILogTreeItem) {
     this.logCache.delete((element.data as SvnPath).toString());
     this.refresh();
@@ -391,7 +423,17 @@ export class RepoLogProvider
       if (logentries.length === 0) {
         await fetchMore(cached);
       }
-      const result = transform(logentries, LogTreeItemKind.Commit, element);
+      // filter
+      const logFiltered = logentries.filter(
+        ({ author, msg }) =>
+          (this.filterAuthor === "" || author.includes(this.filterAuthor)) &&
+          (this.filterMsg === "" || msg.includes(this.filterMsg))
+      );
+
+      window.showInformationMessage(
+        `Filtered ${logFiltered.length} of ${logentries.length} entries`
+      );
+      const result = transform(logFiltered, LogTreeItemKind.Commit, element);
       insertBaseMarker(cached, logentries, result);
       if (!cached.isComplete) {
         const ti = new TreeItem(`Load another ${limit} revisions`);