diff --git a/commands/add.go b/commands/add.go
index 081c99f13b4aa1fc2c1f3c647fb2ec70eb956bf7..ecc2381ea0141354827e92bff78a79f2da5f5111 100644
--- a/commands/add.go
+++ b/commands/add.go
@@ -17,20 +17,20 @@ var (
 func runAddBug(cmd *cobra.Command, args []string) error {
 	var err error
 
-	if addMessageFile != "" && addMessage == "" {
-		addMessage, err = input.FromFile(addMessageFile)
-		if err != nil {
-			return err
-		}
-	}
-
 	backend, err := cache.NewRepoCache(repo)
 	if err != nil {
 		return err
 	}
 	defer backend.Close()
 
-	if addMessage == "" || addTitle == "" {
+	if addMessageFile != "" && addMessage == "" {
+		addTitle, addMessage, err = input.BugCreateFileInput(addMessageFile)
+		if err != nil {
+			return err
+		}
+	}
+
+	if addMessageFile == "" && (addMessage == "" || addTitle == "") {
 		addTitle, addMessage, err = input.BugCreateEditorInput(backend, addTitle, addMessage)
 
 		if err == input.ErrEmptyTitle {
diff --git a/commands/comment_add.go b/commands/comment_add.go
index 5a7cd6a85579bdbfcac532b487e4a14f6125b67c..d09128448ad5e73eb2fe21105dcb38cdc9fa512e 100644
--- a/commands/comment_add.go
+++ b/commands/comment_add.go
@@ -27,13 +27,13 @@ func runCommentAdd(cmd *cobra.Command, args []string) error {
 	}
 
 	if commentAddMessageFile != "" && commentAddMessage == "" {
-		commentAddMessage, err = input.FromFile(commentAddMessageFile)
+		commentAddMessage, err = input.BugCommentFileInput(commentAddMessageFile)
 		if err != nil {
 			return err
 		}
 	}
 
-	if commentAddMessage == "" {
+	if commentAddMessageFile == "" && commentAddMessage == "" {
 		commentAddMessage, err = input.BugCommentEditorInput(backend, "")
 		if err == input.ErrEmptyMessage {
 			fmt.Println("Empty message, aborting.")
diff --git a/input/input.go b/input/input.go
index 07148acc8f1e4e2c3e6369adbfb0e61c12a0ba08..c36b9046db15192717b920f0f5c73dc8491827e0 100644
--- a/input/input.go
+++ b/input/input.go
@@ -48,6 +48,21 @@ func BugCreateEditorInput(repo repository.RepoCommon, preTitle string, preMessag
 		return "", "", err
 	}
 
+	return processCreate(raw)
+}
+
+// BugCreateFileInput read from either from a file or from the standard input
+// and extract a title and a message
+func BugCreateFileInput(fileName string) (string, string, error) {
+	raw, err := fromFile(fileName)
+	if err != nil {
+		return "", "", err
+	}
+
+	return processCreate(raw)
+}
+
+func processCreate(raw string) (string, string, error) {
 	lines := strings.Split(raw, "\n")
 
 	var title string
@@ -94,6 +109,21 @@ func BugCommentEditorInput(repo repository.RepoCommon, preMessage string) (strin
 		return "", err
 	}
 
+	return processComment(raw)
+}
+
+// BugCommentFileInput read from either from a file or from the standard input
+// and extract a message
+func BugCommentFileInput(fileName string) (string, error) {
+	raw, err := fromFile(fileName)
+	if err != nil {
+		return "", err
+	}
+
+	return processComment(raw)
+}
+
+func processComment(raw string) (string, error) {
 	lines := strings.Split(raw, "\n")
 
 	var buffer bytes.Buffer
@@ -266,11 +296,11 @@ func launchEditor(repo repository.RepoCommon, fileName string) (string, error) {
 	return string(output), err
 }
 
-// FromFile loads and returns the contents of a given file. If - is passed
+// fromFile loads and returns the contents of a given file. If - is passed
 // through, much like git, it will read from stdin. This can be piped data,
 // unless there is a tty in which case the user will be prompted to enter a
 // message.
-func FromFile(fileName string) (string, error) {
+func fromFile(fileName string) (string, error) {
 	if fileName == "-" {
 		stat, err := os.Stdin.Stat()
 		if err != nil {