Repository: slack-go/slack
Pull request #836 (2020-10-27 05:22:22)

Add MaxSelectedItems field to MultiSelectBlockElement
## Description

This PR just added missing fields to `MultiSelectBlockElement`.
The missing fields spec is here:

```
Field: max_selected_items
Type: Integer
Required?: No
Description:  Specifies the maximum number of items that can be selected in the menu. Minimum number is 1.
```

## Links
https://api.slack.com/reference/block-kit/block-elements#multi_select



Patch:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index f51c60c..0000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-name: Bug Report
-about: Create a report to help us improve
----
-
-### What happend
-
-### Expected behavior
-
-### Steps to reproduce
-
-### Versions
-- Go:
-- slack-go/slack:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 352ca05..0000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-name: Feature Request
-about: Request an enhancement
----
-
-### Description
-### (Optional) Slack's documentation
diff --git a/.golangci.yml b/.golangci.yml
deleted file mode 100644
index c16f538..0000000
--- a/.golangci.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-run:
-  timeout: 6m
-  issues-exit-code: 1
-linters:
-  disable-all: true
-  enable:
-    - goimports
-    - govet
-    - interfacer
-    - misspell
-    - structcheck
-    - unconvert
-issues:
-  new: true
diff --git a/.gometalinter.json b/.gometalinter.json
new file mode 100644
index 0000000..5fa629d
--- /dev/null
+++ b/.gometalinter.json
@@ -0,0 +1,14 @@
+{
+  "DisableAll": true,
+  "Enable": [
+    "structcheck",
+    "vet",
+    "misspell",
+    "unconvert",
+    "interfacer",
+    "goimports"
+  ],
+  "Vendor": true,
+  "Exclude": ["vendor"],
+  "Deadline": "300s"
+}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..f2019d7
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,41 @@
+language: go
+
+env:
+  - GO111MODULE=on
+
+install: true
+
+before_install:
+  - export PATH=$HOME/gopath/bin:$PATH
+  # install gometalinter
+  - curl -L https://git.io/vp6lP | sh
+
+script:
+  - PATH=$PWD/bin:$PATH gometalinter ./...
+  - go test -race -cover ./...
+
+matrix:
+  allow_failures:
+    - go: tip
+  include:
+  - go: "1.7.x"
+    script:  go test -v ./...
+  - go: "1.8.x"
+    script:  go test -v ./...
+  - go: "1.9.x"
+    script:  go test -v ./...
+  - go: "1.10.x"
+    script:  go test -v ./...
+  - go: "1.11.x"
+    script: go test -v -mod=vendor ./...
+  - go: "1.12.x"
+    script: go test -v -mod=vendor ./...
+  - go: "1.13.x"
+    script: go test -v -mod=vendor ./...
+  - go: "1.14.x"
+    script: go test -v -mod=vendor ./...
+  - go: "tip"
+    script: go test -v -mod=vendor ./...
+
+git:
+  depth: 10
diff --git a/apps.go b/apps.go
index d974943..cb26ad8 100644
--- a/apps.go
+++ b/apps.go
@@ -3,7 +3,6 @@ package slack
 import (
 	"context"
 	"encoding/json"
-	"net/url"
 )
 
 type listEventAuthorizationsResponse struct {
@@ -42,20 +41,3 @@ func (api *Client) ListEventAuthorizationsContext(ctx context.Context, eventCont
 
 	return resp.Authorizations, nil
 }
-
-func (api *Client) UninstallApp(clientID, clientSecret string) error {
-	values := url.Values{
-		"token":         {api.token},
-		"client_id":     {clientID},
-		"client_secret": {clientSecret},
-	}
-
-	response := SlackResponse{}
-
-	err := api.getMethod(context.Background(), "apps.uninstall", values, &response)
-	if err != nil {
-		return err
-	}
-
-	return response.Err()
-}
diff --git a/attachments.go b/attachments.go
index b5b79f9..5f388e9 100644
--- a/attachments.go
+++ b/attachments.go
@@ -75,7 +75,7 @@ type Attachment struct {
 	Title     string `json:"title,omitempty"`
 	TitleLink string `json:"title_link,omitempty"`
 	Pretext   string `json:"pretext,omitempty"`
-	Text      string `json:"text,omitempty"`
+	Text      string `json:"text"` // Required
 
 	ImageURL string `json:"image_url,omitempty"`
 	ThumbURL string `json:"thumb_url,omitempty"`
diff --git a/internal/backoff/backoff.go b/backoff.go
similarity index 82%
rename from internal/backoff/backoff.go
rename to backoff.go
index df210f8..2ba697e 100644
--- a/internal/backoff/backoff.go
+++ b/backoff.go
@@ -1,4 +1,4 @@
-package backoff
+package slack
 
 import (
 	"math/rand"
@@ -11,7 +11,7 @@ import (
 // call to Duration() it is multiplied by Factor.  It is capped at
 // Max. It returns to Min on every call to Reset().  Used in
 // conjunction with the time package.
-type Backoff struct {
+type backoff struct {
 	attempts int
 	// Initial value to scale out
 	Initial time.Duration
@@ -23,7 +23,7 @@ type Backoff struct {
 
 // Returns the current value of the counter and then multiplies it
 // Factor
-func (b *Backoff) Duration() (dur time.Duration) {
+func (b *backoff) Duration() (dur time.Duration) {
 	// Zero-values are nonsensical, so we use
 	// them to apply defaults
 	if b.Max == 0 {
@@ -52,11 +52,6 @@ func (b *Backoff) Duration() (dur time.Duration) {
 }
 
 //Resets the current value of the counter back to Min
-func (b *Backoff) Reset() {
+func (b *backoff) Reset() {
 	b.attempts = 0
 }
-
-// Attempts returns the number of attempts that we had done so far
-func (b *Backoff) Attempts() int {
-	return b.attempts
-}
diff --git a/block.go b/block.go
index 9946a29..dd4b871 100644
--- a/block.go
+++ b/block.go
@@ -48,13 +48,11 @@ type BlockAction struct {
 	SelectedConversation  string              `json:"selected_conversation"`
 	SelectedConversations []string            `json:"selected_conversations"`
 	SelectedDate          string              `json:"selected_date"`
-	SelectedTime          string              `json:"selected_time"`
 	InitialOption         OptionBlockObject   `json:"initial_option"`
 	InitialUser           string              `json:"initial_user"`
 	InitialChannel        string              `json:"initial_channel"`
 	InitialConversation   string              `json:"initial_conversation"`
 	InitialDate           string              `json:"initial_date"`
-	InitialTime           string              `json:"initial_time"`
 }
 
 // actionType returns the type of the action
diff --git a/block_action.go b/block_action.go
index c15e4a3..fe46a95 100644
--- a/block_action.go
+++ b/block_action.go
@@ -6,7 +6,7 @@ package slack
 type ActionBlock struct {
 	Type     MessageBlockType `json:"type"`
 	BlockID  string           `json:"block_id,omitempty"`
-	Elements *BlockElements   `json:"elements"`
+	Elements BlockElements    `json:"elements"`
 }
 
 // BlockType returns the type of the block
@@ -19,7 +19,7 @@ func NewActionBlock(blockID string, elements ...BlockElement) *ActionBlock {
 	return &ActionBlock{
 		Type:    MBTAction,
 		BlockID: blockID,
-		Elements: &BlockElements{
+		Elements: BlockElements{
 			ElementSet: elements,
 		},
 	}
diff --git a/block_conv.go b/block_conv.go
index f2d744c..656a9ab 100644
--- a/block_conv.go
+++ b/block_conv.go
@@ -59,8 +59,6 @@ func (b *Blocks) UnmarshalJSON(data []byte) error {
 			block = &DividerBlock{}
 		case "file":
 			block = &FileBlock{}
-		case "header":
-			block = &HeaderBlock{}
 		case "image":
 			block = &ImageBlock{}
 		case "input":
@@ -107,8 +105,6 @@ func (b *InputBlock) UnmarshalJSON(data []byte) error {
 	switch s.TypeVal {
 	case "datepicker":
 		e = &DatePickerBlockElement{}
-	case "timepicker":
-		e = &TimePickerBlockElement{}
 	case "plain_text_input":
 		e = &PlainTextInputBlockElement{}
 	case "static_select", "external_select", "users_select", "conversations_select", "channels_select":
@@ -266,12 +262,6 @@ func (a *Accessory) UnmarshalJSON(data []byte) error {
 			return err
 		}
 		a.DatePickerElement = element.(*DatePickerBlockElement)
-	case "timepicker":
-		element, err := unmarshalBlockElement(r, &TimePickerBlockElement{})
-		if err != nil {
-			return err
-		}
-		a.TimePickerElement = element.(*TimePickerBlockElement)
 	case "plain_text_input":
 		element, err := unmarshalBlockElement(r, &PlainTextInputBlockElement{})
 		if err != nil {
@@ -334,9 +324,6 @@ func toBlockElement(element *Accessory) BlockElement {
 	if element.DatePickerElement != nil {
 		return element.DatePickerElement
 	}
-	if element.TimePickerElement != nil {
-		return element.TimePickerElement
-	}
 	if element.PlainTextInputElement != nil {
 		return element.PlainTextInputElement
 	}
diff --git a/block_element.go b/block_element.go
index 4157016..7e56d2b 100644
--- a/block_element.go
+++ b/block_element.go
@@ -8,7 +8,6 @@ const (
 	METButton         MessageElementType = "button"
 	METOverflow       MessageElementType = "overflow"
 	METDatepicker     MessageElementType = "datepicker"
-	METTimepicker     MessageElementType = "timepicker"
 	METPlainTextInput MessageElementType = "plain_text_input"
 	METRadioButtons   MessageElementType = "radio_buttons"
 
@@ -45,7 +44,6 @@ type Accessory struct {
 	ButtonElement              *ButtonBlockElement
 	OverflowElement            *OverflowBlockElement
 	DatePickerElement          *DatePickerBlockElement
-	TimePickerElement          *TimePickerBlockElement
 	PlainTextInputElement      *PlainTextInputBlockElement
 	RadioButtonsElement        *RadioButtonsBlockElement
 	SelectElement              *SelectBlockElement
@@ -65,8 +63,6 @@ func NewAccessory(element BlockElement) *Accessory {
 		return &Accessory{OverflowElement: element.(*OverflowBlockElement)}
 	case *DatePickerBlockElement:
 		return &Accessory{DatePickerElement: element.(*DatePickerBlockElement)}
-	case *TimePickerBlockElement:
-		return &Accessory{TimePickerElement: element.(*TimePickerBlockElement)}
 	case *PlainTextInputBlockElement:
 		return &Accessory{PlainTextInputElement: element.(*PlainTextInputBlockElement)}
 	case *RadioButtonsBlockElement:
@@ -131,12 +127,10 @@ func NewImageBlockElement(imageURL, altText string) *ImageBlockElement {
 	}
 }
 
-// Style is a style of Button element
-// https://api.slack.com/reference/block-kit/block-elements#button__fields
 type Style string
 
 const (
-	StyleDefault Style = ""
+	StyleDefault Style = "default"
 	StylePrimary Style = "primary"
 	StyleDanger  Style = "danger"
 )
@@ -161,7 +155,7 @@ func (s ButtonBlockElement) ElementType() MessageElementType {
 	return s.Type
 }
 
-// WithStyle adds styling to the button object and returns the modified ButtonBlockElement
+// WithStyling adds styling to the button object and returns the modified ButtonBlockElement
 func (s *ButtonBlockElement) WithStyle(style Style) *ButtonBlockElement {
 	s.Style = style
 	return s
@@ -268,6 +262,7 @@ type MultiSelectBlockElement struct {
 	InitialConversations []string                  `json:"initial_conversations,omitempty"`
 	InitialChannels      []string                  `json:"initial_channels,omitempty"`
 	MinQueryLength       *int                      `json:"min_query_length,omitempty"`
+	MaxSelectedItems     *int                      `json:"max_selected_items,omitempty"`
 	Confirm              *ConfirmationBlockObject  `json:"confirm,omitempty"`
 }
 
@@ -356,32 +351,6 @@ func NewDatePickerBlockElement(actionID string) *DatePickerBlockElement {
 	}
 }
 
-// TimePickerBlockElement defines an element which lets users easily select a
-// time from nice UI. Time picker elements can be used inside of
-// section and actions blocks.
-//
-// More Information: https://api.slack.com/reference/messaging/block-elements#timepicker
-type TimePickerBlockElement struct {
-	Type        MessageElementType       `json:"type"`
-	ActionID    string                   `json:"action_id,omitempty"`
-	Placeholder *TextBlockObject         `json:"placeholder,omitempty"`
-	InitialTime string                   `json:"initial_time,omitempty"`
-	Confirm     *ConfirmationBlockObject `json:"confirm,omitempty"`
-}
-
-// ElementType returns the type of the Element
-func (s TimePickerBlockElement) ElementType() MessageElementType {
-	return s.Type
-}
-
-// NewTimePickerBlockElement returns an instance of a date picker element
-func NewTimePickerBlockElement(actionID string) *TimePickerBlockElement {
-	return &TimePickerBlockElement{
-		Type:     METTimepicker,
-		ActionID: actionID,
-	}
-}
-
 // PlainTextInputBlockElement creates a field where a user can enter freeform
 // data.
 // Plain-text input elements are currently only available in modals.
diff --git a/block_object.go b/block_object.go
index d17806c..cc510b2 100644
--- a/block_object.go
+++ b/block_object.go
@@ -171,7 +171,7 @@ func (s ConfirmationBlockObject) validateType() MessageObjectType {
 	return motConfirmation
 }
 
-// WithStyle add styling to confirmation object
+// add styling to confirmation object
 func (s *ConfirmationBlockObject) WithStyle(style Style) {
 	s.Style = style
 }
diff --git a/channels.go b/channels.go
index c05521d..a90d238 100644
--- a/channels.go
+++ b/channels.go
@@ -19,12 +19,6 @@ type channelResponseFull struct {
 }
 
 // Channel contains information about the channel
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 type Channel struct {
 	GroupConversation
 	IsChannel bool   `json:"is_channel"`
@@ -44,21 +38,9 @@ func (api *Client) channelRequest(ctx context.Context, path string, values url.V
 }
 
 // GetChannelsOption option provided when getting channels.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 type GetChannelsOption func(*ChannelPagination) error
 
 // GetChannelsOptionExcludeMembers excludes the members collection from each channel.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func GetChannelsOptionExcludeMembers() GetChannelsOption {
 	return func(p *ChannelPagination) error {
 		p.excludeMembers = true
@@ -67,12 +49,6 @@ func GetChannelsOptionExcludeMembers() GetChannelsOption {
 }
 
 // GetChannelsOptionExcludeArchived excludes archived channels from results.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func GetChannelsOptionExcludeArchived() GetChannelsOption {
 	return func(p *ChannelPagination) error {
 		p.excludeArchived = true
@@ -82,24 +58,12 @@ func GetChannelsOptionExcludeArchived() GetChannelsOption {
 
 // ArchiveChannel archives the given channel
 // see https://api.slack.com/methods/channels.archive
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) ArchiveChannel(channelID string) error {
 	return api.ArchiveChannelContext(context.Background(), channelID)
 }
 
 // ArchiveChannelContext archives the given channel with a custom context
 // see https://api.slack.com/methods/channels.archive
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) ArchiveChannelContext(ctx context.Context, channelID string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -112,24 +76,12 @@ func (api *Client) ArchiveChannelContext(ctx context.Context, channelID string)
 
 // UnarchiveChannel unarchives the given channel
 // see https://api.slack.com/methods/channels.unarchive
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) UnarchiveChannel(channelID string) error {
 	return api.UnarchiveChannelContext(context.Background(), channelID)
 }
 
 // UnarchiveChannelContext unarchives the given channel with a custom context
 // see https://api.slack.com/methods/channels.unarchive
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) UnarchiveChannelContext(ctx context.Context, channelID string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -142,24 +94,12 @@ func (api *Client) UnarchiveChannelContext(ctx context.Context, channelID string
 
 // CreateChannel creates a channel with the given name and returns a *Channel
 // see https://api.slack.com/methods/channels.create
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateChannel(channelName string) (*Channel, error) {
 	return api.CreateChannelContext(context.Background(), channelName)
 }
 
 // CreateChannelContext creates a channel with the given name and returns a *Channel with a custom context
 // see https://api.slack.com/methods/channels.create
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateChannelContext(ctx context.Context, channelName string) (*Channel, error) {
 	values := url.Values{
 		"token": {api.token},
@@ -175,24 +115,12 @@ func (api *Client) CreateChannelContext(ctx context.Context, channelName string)
 
 // GetChannelHistory retrieves the channel history
 // see https://api.slack.com/methods/channels.history
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelHistory(channelID string, params HistoryParameters) (*History, error) {
 	return api.GetChannelHistoryContext(context.Background(), channelID, params)
 }
 
 // GetChannelHistoryContext retrieves the channel history with a custom context
 // see https://api.slack.com/methods/channels.history
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelHistoryContext(ctx context.Context, channelID string, params HistoryParameters) (*History, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -232,24 +160,12 @@ func (api *Client) GetChannelHistoryContext(ctx context.Context, channelID strin
 
 // GetChannelInfo retrieves the given channel
 // see https://api.slack.com/methods/channels.info
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelInfo(channelID string) (*Channel, error) {
 	return api.GetChannelInfoContext(context.Background(), channelID)
 }
 
 // GetChannelInfoContext retrieves the given channel with a custom context
 // see https://api.slack.com/methods/channels.info
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelInfoContext(ctx context.Context, channelID string) (*Channel, error) {
 	values := url.Values{
 		"token":          {api.token},
@@ -266,24 +182,12 @@ func (api *Client) GetChannelInfoContext(ctx context.Context, channelID string)
 
 // InviteUserToChannel invites a user to a given channel and returns a *Channel
 // see https://api.slack.com/methods/channels.invite
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) InviteUserToChannel(channelID, user string) (*Channel, error) {
 	return api.InviteUserToChannelContext(context.Background(), channelID, user)
 }
 
 // InviteUserToChannelContext invites a user to a given channel and returns a *Channel with a custom context
 // see https://api.slack.com/methods/channels.invite
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) InviteUserToChannelContext(ctx context.Context, channelID, user string) (*Channel, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -300,24 +204,12 @@ func (api *Client) InviteUserToChannelContext(ctx context.Context, channelID, us
 
 // JoinChannel joins the currently authenticated user to a channel
 // see https://api.slack.com/methods/channels.join
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) JoinChannel(channelName string) (*Channel, error) {
 	return api.JoinChannelContext(context.Background(), channelName)
 }
 
 // JoinChannelContext joins the currently authenticated user to a channel with a custom context
 // see https://api.slack.com/methods/channels.join
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) JoinChannelContext(ctx context.Context, channelName string) (*Channel, error) {
 	values := url.Values{
 		"token": {api.token},
@@ -333,24 +225,12 @@ func (api *Client) JoinChannelContext(ctx context.Context, channelName string) (
 
 // LeaveChannel makes the authenticated user leave the given channel
 // see https://api.slack.com/methods/channels.leave
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) LeaveChannel(channelID string) (bool, error) {
 	return api.LeaveChannelContext(context.Background(), channelID)
 }
 
 // LeaveChannelContext makes the authenticated user leave the given channel with a custom context
 // see https://api.slack.com/methods/channels.leave
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) LeaveChannelContext(ctx context.Context, channelID string) (bool, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -367,24 +247,12 @@ func (api *Client) LeaveChannelContext(ctx context.Context, channelID string) (b
 
 // KickUserFromChannel kicks a user from a given channel
 // see https://api.slack.com/methods/channels.kick
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) KickUserFromChannel(channelID, user string) error {
 	return api.KickUserFromChannelContext(context.Background(), channelID, user)
 }
 
 // KickUserFromChannelContext kicks a user from a given channel with a custom context
 // see https://api.slack.com/methods/channels.kick
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) KickUserFromChannelContext(ctx context.Context, channelID, user string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -410,12 +278,6 @@ func newChannelPagination(c *Client, options ...GetChannelsOption) (cp ChannelPa
 }
 
 // ChannelPagination allows for paginating over the channels
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 type ChannelPagination struct {
 	Channels        []Channel
 	limit           int
@@ -426,23 +288,11 @@ type ChannelPagination struct {
 }
 
 // Done checks if the pagination has completed
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (ChannelPagination) Done(err error) bool {
 	return err == errPaginationComplete
 }
 
 // Failure checks if pagination failed.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (t ChannelPagination) Failure(err error) error {
 	if t.Done(err) {
 		return nil
@@ -451,11 +301,6 @@ func (t ChannelPagination) Failure(err error) error {
 	return err
 }
 
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (t ChannelPagination) Next(ctx context.Context) (_ ChannelPagination, err error) {
 	var (
 		resp *channelResponseFull
@@ -487,36 +332,18 @@ func (t ChannelPagination) Next(ctx context.Context) (_ ChannelPagination, err e
 }
 
 // GetChannelsPaginated fetches channels in a paginated fashion, see GetChannelsContext for usage.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelsPaginated(options ...GetChannelsOption) ChannelPagination {
 	return newChannelPagination(api, options...)
 }
 
 // GetChannels retrieves all the channels
 // see https://api.slack.com/methods/channels.list
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannels(excludeArchived bool, options ...GetChannelsOption) ([]Channel, error) {
 	return api.GetChannelsContext(context.Background(), excludeArchived, options...)
 }
 
 // GetChannelsContext retrieves all the channels with a custom context
 // see https://api.slack.com/methods/channels.list
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelsContext(ctx context.Context, excludeArchived bool, options ...GetChannelsOption) (results []Channel, err error) {
 	if excludeArchived {
 		options = append(options, GetChannelsOptionExcludeArchived())
@@ -546,12 +373,6 @@ func (api *Client) GetChannelsContext(ctx context.Context, excludeArchived bool,
 // (just one per channel). This is useful for when reading scroll-back history, or following a busy live channel. A
 // timeout of 5 seconds is a good starting point. Be sure to flush these calls on shutdown/logout.
 // see https://api.slack.com/methods/channels.mark
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelReadMark(channelID, ts string) error {
 	return api.SetChannelReadMarkContext(context.Background(), channelID, ts)
 }
@@ -559,12 +380,6 @@ func (api *Client) SetChannelReadMark(channelID, ts string) error {
 // SetChannelReadMarkContext sets the read mark of a given channel to a specific point with a custom context
 // For more details see SetChannelReadMark documentation
 // see https://api.slack.com/methods/channels.mark
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelReadMarkContext(ctx context.Context, channelID, ts string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -578,24 +393,12 @@ func (api *Client) SetChannelReadMarkContext(ctx context.Context, channelID, ts
 
 // RenameChannel renames a given channel
 // see https://api.slack.com/methods/channels.rename
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) RenameChannel(channelID, name string) (*Channel, error) {
 	return api.RenameChannelContext(context.Background(), channelID, name)
 }
 
 // RenameChannelContext renames a given channel with a custom context
 // see https://api.slack.com/methods/channels.rename
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) RenameChannelContext(ctx context.Context, channelID, name string) (*Channel, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -614,24 +417,12 @@ func (api *Client) RenameChannelContext(ctx context.Context, channelID, name str
 
 // SetChannelPurpose sets the channel purpose and returns the purpose that was successfully set
 // see https://api.slack.com/methods/channels.setPurpose
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelPurpose(channelID, purpose string) (string, error) {
 	return api.SetChannelPurposeContext(context.Background(), channelID, purpose)
 }
 
 // SetChannelPurposeContext sets the channel purpose and returns the purpose that was successfully set with a custom context
 // see https://api.slack.com/methods/channels.setPurpose
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelPurposeContext(ctx context.Context, channelID, purpose string) (string, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -648,24 +439,12 @@ func (api *Client) SetChannelPurposeContext(ctx context.Context, channelID, purp
 
 // SetChannelTopic sets the channel topic and returns the topic that was successfully set
 // see https://api.slack.com/methods/channels.setTopic
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelTopic(channelID, topic string) (string, error) {
 	return api.SetChannelTopicContext(context.Background(), channelID, topic)
 }
 
 // SetChannelTopicContext sets the channel topic and returns the topic that was successfully set with a custom context
 // see https://api.slack.com/methods/channels.setTopic
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetChannelTopicContext(ctx context.Context, channelID, topic string) (string, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -682,24 +461,12 @@ func (api *Client) SetChannelTopicContext(ctx context.Context, channelID, topic
 
 // GetChannelReplies gets an entire thread (a message plus all the messages in reply to it).
 // see https://api.slack.com/methods/channels.replies
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelReplies(channelID, thread_ts string) ([]Message, error) {
 	return api.GetChannelRepliesContext(context.Background(), channelID, thread_ts)
 }
 
 // GetChannelRepliesContext gets an entire thread (a message plus all the messages in reply to it) with a custom context
 // see https://api.slack.com/methods/channels.replies
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetChannelRepliesContext(ctx context.Context, channelID, thread_ts string) ([]Message, error) {
 	values := url.Values{
 		"token":     {api.token},
diff --git a/chat.go b/chat.go
index f5b8034..439f937 100644
--- a/chat.go
+++ b/chat.go
@@ -191,22 +191,6 @@ func (api *Client) UnfurlMessage(channelID, timestamp string, unfurls map[string
 	return api.SendMessageContext(context.Background(), channelID, MsgOptionUnfurl(timestamp, unfurls), MsgOptionCompose(options...))
 }
 
-// UnfurlMessageWithAuthURL sends an unfurl request containing an
-// authentication URL.
-// For more details see:
-// https://api.slack.com/reference/messaging/link-unfurling#authenticated_unfurls
-func (api *Client) UnfurlMessageWithAuthURL(channelID, timestamp string, userAuthURL string, options ...MsgOption) (string, string, string, error) {
-	return api.UnfurlMessageWithAuthURLContext(context.Background(), channelID, timestamp, userAuthURL, options...)
-}
-
-// UnfurlMessageWithAuthURLContext sends an unfurl request containing an
-// authentication URL.
-// For more details see:
-// https://api.slack.com/reference/messaging/link-unfurling#authenticated_unfurls
-func (api *Client) UnfurlMessageWithAuthURLContext(ctx context.Context, channelID, timestamp string, userAuthURL string, options ...MsgOption) (string, string, string, error) {
-	return api.SendMessageContext(ctx, channelID, MsgOptionUnfurlAuthURL(timestamp, userAuthURL), MsgOptionCompose(options...))
-}
-
 // SendMessage more flexible method for configuring messages.
 func (api *Client) SendMessage(channel string, options ...MsgOption) (string, string, string, error) {
 	return api.SendMessageContext(context.Background(), channel, options...)
@@ -429,38 +413,6 @@ func MsgOptionUnfurl(timestamp string, unfurls map[string]Attachment) MsgOption
 	}
 }
 
-// MsgOptionUnfurlAuthURL unfurls a message using an auth url based on the timestamp.
-func MsgOptionUnfurlAuthURL(timestamp string, userAuthURL string) MsgOption {
-	return func(config *sendConfig) error {
-		config.endpoint = config.apiurl + string(chatUnfurl)
-		config.values.Add("ts", timestamp)
-		config.values.Add("user_auth_url", userAuthURL)
-		return nil
-	}
-}
-
-// MsgOptionUnfurlAuthRequired requests that the user installs the
-// Slack app for unfurling.
-func MsgOptionUnfurlAuthRequired(timestamp string) MsgOption {
-	return func(config *sendConfig) error {
-		config.endpoint = config.apiurl + string(chatUnfurl)
-		config.values.Add("ts", timestamp)
-		config.values.Add("user_auth_required", "true")
-		return nil
-	}
-}
-
-// MsgOptionUnfurlAuthMessage attaches a message inviting the user to
-// authenticate.
-func MsgOptionUnfurlAuthMessage(timestamp string, msg string) MsgOption {
-	return func(config *sendConfig) error {
-		config.endpoint = config.apiurl + string(chatUnfurl)
-		config.values.Add("ts", timestamp)
-		config.values.Add("user_auth_message", msg)
-		return nil
-	}
-}
-
 // MsgOptionResponseURL supplies a url to use as the endpoint.
 func MsgOptionResponseURL(url string, responseType string) MsgOption {
 	return func(config *sendConfig) error {
diff --git a/conversation.go b/conversation.go
index 6fc4a08..60c50fc 100644
--- a/conversation.go
+++ b/conversation.go
@@ -621,25 +621,3 @@ func (api *Client) GetConversationHistoryContext(ctx context.Context, params *Ge
 
 	return &response, response.Err()
 }
-
-// MarkConversation sets the read mark of a conversation to a specific point
-func (api *Client) MarkConversation(channel, ts string) (err error) {
-	return api.MarkConversationContext(context.Background(), channel, ts)
-}
-
-// MarkConversationContext sets the read mark of a conversation to a specific point with a custom context
-func (api *Client) MarkConversationContext(ctx context.Context, channel, ts string) error {
-	values := url.Values{
-		"token":   {api.token},
-		"channel": {channel},
-		"ts":      {ts},
-	}
-
-	response := &SlackResponse{}
-
-	err := api.postMethod(ctx, "conversations.mark", values, response)
-	if err != nil {
-		return err
-	}
-	return response.Err()
-}
diff --git a/examples/blocks/blocks.go b/examples/blocks/blocks.go
index 28d54d1..d085123 100644
--- a/examples/blocks/blocks.go
+++ b/examples/blocks/blocks.go
@@ -510,9 +510,6 @@ func unmarshalExample() {
 				case slack.METDatepicker:
 					datepickerElem := elem.(*slack.DatePickerBlockElement)
 					fmt.Printf("do something with datepicker block element: %v\n", datepickerElem)
-				case slack.METTimepicker:
-					timepickerElem := elem.(*slack.TimePickerBlockElement)
-					fmt.Printf("do something with timepicker block element: %v\n", timepickerElem)
 				}
 			}
 			respBlocks = append(respBlocks, block)
diff --git a/examples/eventsapi/events.go b/examples/eventsapi/events.go
index 25049ad..9bf1850 100644
--- a/examples/eventsapi/events.go
+++ b/examples/eventsapi/events.go
@@ -1,11 +1,10 @@
 package main
 
 import (
+	"bytes"
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
 	"net/http"
-	"os"
 
 	"github.com/slack-go/slack"
 	"github.com/slack-go/slack/slackevents"
@@ -15,29 +14,12 @@ import (
 var api = slack.New("TOKEN")
 
 func main() {
-	signingSecret := os.Getenv("SLACK_SIGNING_SECRET")
-
 	http.HandleFunc("/events-endpoint", func(w http.ResponseWriter, r *http.Request) {
-		body, err := ioutil.ReadAll(r.Body)
-		if err != nil {
-			w.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		sv, err := slack.NewSecretsVerifier(r.Header, signingSecret)
-		if err != nil {
-			w.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		if _, err := sv.Write(body); err != nil {
-			w.WriteHeader(http.StatusInternalServerError)
-			return
-		}
-		if err := sv.Ensure(); err != nil {
-			w.WriteHeader(http.StatusUnauthorized)
-			return
-		}
-		eventsAPIEvent, err := slackevents.ParseEvent(json.RawMessage(body), slackevents.OptionNoVerifyToken())
-		if err != nil {
+		buf := new(bytes.Buffer)
+		buf.ReadFrom(r.Body)
+		body := buf.String()
+		eventsAPIEvent, e := slackevents.ParseEvent(json.RawMessage(body), slackevents.OptionVerifyToken(&slackevents.TokenComparator{VerificationToken: "VERIFICATION_TOKEN"}))
+		if e != nil {
 			w.WriteHeader(http.StatusInternalServerError)
 			return
 		}
diff --git a/examples/socketmode/socketmode.go b/examples/socketmode/socketmode.go
deleted file mode 100644
index 69e34c2..0000000
--- a/examples/socketmode/socketmode.go
+++ /dev/null
@@ -1,149 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"log"
-	"os"
-	"strings"
-
-	"github.com/slack-go/slack/socketmode"
-
-	"github.com/slack-go/slack"
-	"github.com/slack-go/slack/slackevents"
-)
-
-func main() {
-	appToken := os.Getenv("SLACK_APP_TOKEN")
-	if appToken == "" {
-
-	}
-
-	if !strings.HasPrefix(appToken, "xapp-") {
-		fmt.Fprintf(os.Stderr, "SLACK_APP_TOKEN must have the prefix \"xapp-\".")
-	}
-
-	botToken := os.Getenv("SLACK_BOT_TOKEN")
-	if botToken == "" {
-		fmt.Fprintf(os.Stderr, "SLACK_BOT_TOKEN must be set.\n")
-		os.Exit(1)
-	}
-
-	if !strings.HasPrefix(botToken, "xoxb-") {
-		fmt.Fprintf(os.Stderr, "SLACK_BOT_TOKEN must have the prefix \"xoxb-\".")
-	}
-
-	api := slack.New(
-		botToken,
-		slack.OptionDebug(true),
-		slack.OptionLog(log.New(os.Stdout, "api: ", log.Lshortfile|log.LstdFlags)),
-		slack.OptionAppLevelToken(appToken),
-	)
-
-	client := socketmode.New(
-		api,
-		socketmode.OptionDebug(true),
-		socketmode.OptionLog(log.New(os.Stdout, "socketmode: ", log.Lshortfile|log.LstdFlags)),
-	)
-
-	go func() {
-		for evt := range client.Events {
-			switch evt.Type {
-			case socketmode.EventTypeConnecting:
-				fmt.Println("Connecting to Slack with Socket Mode...")
-			case socketmode.EventTypeConnectionError:
-				fmt.Println("Connection failed. Retrying later...")
-			case socketmode.EventTypeConnected:
-				fmt.Println("Connected to Slack with Socket Mode.")
-			case socketmode.EventTypeEventsAPI:
-				eventsAPIEvent, ok := evt.Data.(slackevents.EventsAPIEvent)
-				if !ok {
-					fmt.Printf("Ignored %+v\n", evt)
-
-					continue
-				}
-
-				fmt.Printf("Event received: %+v\n", eventsAPIEvent)
-
-				client.Ack(*evt.Request)
-
-				switch eventsAPIEvent.Type {
-				case slackevents.CallbackEvent:
-					innerEvent := eventsAPIEvent.InnerEvent
-					switch ev := innerEvent.Data.(type) {
-					case *slackevents.AppMentionEvent:
-						_, _, err := api.PostMessage(ev.Channel, slack.MsgOptionText("Yes, hello.", false))
-						if err != nil {
-							fmt.Printf("failed posting message: %v", err)
-						}
-					case *slackevents.MemberJoinedChannelEvent:
-						fmt.Printf("user %q joined to channel %q", ev.User, ev.Channel)
-					}
-				default:
-					client.Debugf("unsupported Events API event received")
-				}
-			case socketmode.EventTypeInteractive:
-				callback, ok := evt.Data.(slack.InteractionCallback)
-				if !ok {
-					fmt.Printf("Ignored %+v\n", evt)
-
-					continue
-				}
-
-				fmt.Printf("Interaction received: %+v\n", callback)
-
-				var payload interface{}
-
-				switch callback.Type {
-				case slack.InteractionTypeBlockActions:
-					// See https://api.slack.com/apis/connections/socket-implement#button
-
-					client.Debugf("button clicked!")
-				case slack.InteractionTypeShortcut:
-				case slack.InteractionTypeViewSubmission:
-					// See https://api.slack.com/apis/connections/socket-implement#modal
-				case slack.InteractionTypeDialogSubmission:
-				default:
-
-				}
-
-				client.Ack(*evt.Request, payload)
-			case socketmode.EventTypeSlashCommand:
-				cmd, ok := evt.Data.(slack.SlashCommand)
-				if !ok {
-					fmt.Printf("Ignored %+v\n", evt)
-
-					continue
-				}
-
-				client.Debugf("Slash command received: %+v", cmd)
-
-				payload := map[string]interface{}{
-					"blocks": []slack.Block{
-						slack.NewSectionBlock(
-							&slack.TextBlockObject{
-								Type: slack.MarkdownType,
-								Text: "foo",
-							},
-							nil,
-							slack.NewAccessory(
-								slack.NewButtonBlockElement(
-									"",
-									"somevalue",
-									&slack.TextBlockObject{
-										Type: slack.PlainTextType,
-										Text: "bar",
-									},
-								),
-							),
-						),
-					}}
-
-				client.Ack(*evt.Request, payload)
-			default:
-				fmt.Fprintf(os.Stderr, "Unexpected event type received: %s\n", evt.Type)
-			}
-		}
-	}()
-
-	client.Run()
-}
diff --git a/files.go b/files.go
index 713038f..3a7363d 100644
--- a/files.go
+++ b/files.go
@@ -11,14 +11,13 @@ import (
 
 const (
 	// Add here the defaults in the siten
-	DEFAULT_FILES_USER        = ""
-	DEFAULT_FILES_CHANNEL     = ""
-	DEFAULT_FILES_TS_FROM     = 0
-	DEFAULT_FILES_TS_TO       = -1
-	DEFAULT_FILES_TYPES       = "all"
-	DEFAULT_FILES_COUNT       = 100
-	DEFAULT_FILES_PAGE        = 1
-	DEFAULT_FILES_SHOW_HIDDEN = false
+	DEFAULT_FILES_USER    = ""
+	DEFAULT_FILES_CHANNEL = ""
+	DEFAULT_FILES_TS_FROM = 0
+	DEFAULT_FILES_TS_TO   = -1
+	DEFAULT_FILES_TYPES   = "all"
+	DEFAULT_FILES_COUNT   = 100
+	DEFAULT_FILES_PAGE    = 1
 )
 
 // File contains all the information for a file
@@ -133,7 +132,6 @@ type GetFilesParameters struct {
 	Types         string
 	Count         int
 	Page          int
-	ShowHidden    bool
 }
 
 // ListFilesParameters contains all the parameters necessary (including the optional ones) for a ListFiles() request
@@ -165,7 +163,6 @@ func NewGetFilesParameters() GetFilesParameters {
 		Types:         DEFAULT_FILES_TYPES,
 		Count:         DEFAULT_FILES_COUNT,
 		Page:          DEFAULT_FILES_PAGE,
-		ShowHidden:    DEFAULT_FILES_SHOW_HIDDEN,
 	}
 }
 
@@ -270,9 +267,6 @@ func (api *Client) GetFilesContext(ctx context.Context, params GetFilesParameter
 	if params.Page != DEFAULT_FILES_PAGE {
 		values.Add("page", strconv.Itoa(params.Page))
 	}
-	if params.ShowHidden != DEFAULT_FILES_SHOW_HIDDEN {
-		values.Add("show_files_hidden_by_limit", strconv.FormatBool(params.ShowHidden))
-	}
 
 	response, err := api.fileRequest(ctx, "files.list", values)
 	if err != nil {
diff --git a/groups.go b/groups.go
index 4c5793d..6ea1b13 100644
--- a/groups.go
+++ b/groups.go
@@ -7,12 +7,6 @@ import (
 )
 
 // Group contains all the information for a group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 type Group struct {
 	GroupConversation
 	IsGroup bool `json:"is_group"`
@@ -44,23 +38,11 @@ func (api *Client) groupRequest(ctx context.Context, path string, values url.Val
 }
 
 // ArchiveGroup archives a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) ArchiveGroup(group string) error {
 	return api.ArchiveGroupContext(context.Background(), group)
 }
 
 // ArchiveGroupContext archives a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) ArchiveGroupContext(ctx context.Context, group string) error {
 	values := url.Values{
 		"token":   {api.token},
@@ -72,23 +54,11 @@ func (api *Client) ArchiveGroupContext(ctx context.Context, group string) error
 }
 
 // UnarchiveGroup unarchives a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) UnarchiveGroup(group string) error {
 	return api.UnarchiveGroupContext(context.Background(), group)
 }
 
 // UnarchiveGroupContext unarchives a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) UnarchiveGroupContext(ctx context.Context, group string) error {
 	values := url.Values{
 		"token":   {api.token},
@@ -100,23 +70,11 @@ func (api *Client) UnarchiveGroupContext(ctx context.Context, group string) erro
 }
 
 // CreateGroup creates a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateGroup(group string) (*Group, error) {
 	return api.CreateGroupContext(context.Background(), group)
 }
 
 // CreateGroupContext creates a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateGroupContext(ctx context.Context, group string) (*Group, error) {
 	values := url.Values{
 		"token": {api.token},
@@ -136,24 +94,12 @@ func (api *Client) CreateGroupContext(ctx context.Context, group string) (*Group
 //   2. Archives the existing group.
 //   3. Creates a new group with the name of the existing group.
 //   4. Adds all members of the existing group to the new group.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateChildGroup(group string) (*Group, error) {
 	return api.CreateChildGroupContext(context.Background(), group)
 }
 
 // CreateChildGroupContext creates a new private group archiving the old one with a custom context
 // For more information see CreateChildGroup
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CreateChildGroupContext(ctx context.Context, group string) (*Group, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -168,23 +114,11 @@ func (api *Client) CreateChildGroupContext(ctx context.Context, group string) (*
 }
 
 // GetGroupHistory fetches all the history for a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupHistory(group string, params HistoryParameters) (*History, error) {
 	return api.GetGroupHistoryContext(context.Background(), group, params)
 }
 
 // GetGroupHistoryContext fetches all the history for a private group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupHistoryContext(ctx context.Context, group string, params HistoryParameters) (*History, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -222,23 +156,11 @@ func (api *Client) GetGroupHistoryContext(ctx context.Context, group string, par
 }
 
 // InviteUserToGroup invites a specific user to a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) InviteUserToGroup(group, user string) (*Group, bool, error) {
 	return api.InviteUserToGroupContext(context.Background(), group, user)
 }
 
 // InviteUserToGroupContext invites a specific user to a private group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) InviteUserToGroupContext(ctx context.Context, group, user string) (*Group, bool, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -254,23 +176,11 @@ func (api *Client) InviteUserToGroupContext(ctx context.Context, group, user str
 }
 
 // LeaveGroup makes authenticated user leave the group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) LeaveGroup(group string) error {
 	return api.LeaveGroupContext(context.Background(), group)
 }
 
 // LeaveGroupContext makes authenticated user leave the group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) LeaveGroupContext(ctx context.Context, group string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -282,23 +192,11 @@ func (api *Client) LeaveGroupContext(ctx context.Context, group string) (err err
 }
 
 // KickUserFromGroup kicks a user from a group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) KickUserFromGroup(group, user string) error {
 	return api.KickUserFromGroupContext(context.Background(), group, user)
 }
 
 // KickUserFromGroupContext kicks a user from a group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) KickUserFromGroupContext(ctx context.Context, group, user string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -311,23 +209,11 @@ func (api *Client) KickUserFromGroupContext(ctx context.Context, group, user str
 }
 
 // GetGroups retrieves all groups
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroups(excludeArchived bool) ([]Group, error) {
 	return api.GetGroupsContext(context.Background(), excludeArchived)
 }
 
 // GetGroupsContext retrieves all groups with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupsContext(ctx context.Context, excludeArchived bool) ([]Group, error) {
 	values := url.Values{
 		"token": {api.token},
@@ -344,23 +230,11 @@ func (api *Client) GetGroupsContext(ctx context.Context, excludeArchived bool) (
 }
 
 // GetGroupInfo retrieves the given group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupInfo(group string) (*Group, error) {
 	return api.GetGroupInfoContext(context.Background(), group)
 }
 
 // GetGroupInfoContext retrieves the given group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupInfoContext(ctx context.Context, group string) (*Group, error) {
 	values := url.Values{
 		"token":          {api.token},
@@ -380,24 +254,12 @@ func (api *Client) GetGroupInfoContext(ctx context.Context, group string) (*Grou
 // timer before making the call. In this way, any further updates needed during the timeout will not generate extra
 // calls (just one per channel). This is useful for when reading scroll-back history, or following a busy live
 // channel. A timeout of 5 seconds is a good starting point. Be sure to flush these calls on shutdown/logout.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupReadMark(group, ts string) error {
 	return api.SetGroupReadMarkContext(context.Background(), group, ts)
 }
 
 // SetGroupReadMarkContext sets the read mark on a private group with a custom context
 // For more details see SetGroupReadMark
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupReadMarkContext(ctx context.Context, group, ts string) (err error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -410,23 +272,11 @@ func (api *Client) SetGroupReadMarkContext(ctx context.Context, group, ts string
 }
 
 // OpenGroup opens a private group
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) OpenGroup(group string) (bool, bool, error) {
 	return api.OpenGroupContext(context.Background(), group)
 }
 
 // OpenGroupContext opens a private group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) OpenGroupContext(ctx context.Context, group string) (bool, bool, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -443,23 +293,11 @@ func (api *Client) OpenGroupContext(ctx context.Context, group string) (bool, bo
 // RenameGroup renames a group
 // XXX: They return a channel, not a group. What is this crap? :(
 // Inconsistent api it seems.
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) RenameGroup(group, name string) (*Channel, error) {
 	return api.RenameGroupContext(context.Background(), group, name)
 }
 
 // RenameGroupContext renames a group with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) RenameGroupContext(ctx context.Context, group, name string) (*Channel, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -477,23 +315,11 @@ func (api *Client) RenameGroupContext(ctx context.Context, group, name string) (
 }
 
 // SetGroupPurpose sets the group purpose
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupPurpose(group, purpose string) (string, error) {
 	return api.SetGroupPurposeContext(context.Background(), group, purpose)
 }
 
 // SetGroupPurposeContext sets the group purpose with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupPurposeContext(ctx context.Context, group, purpose string) (string, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -509,23 +335,11 @@ func (api *Client) SetGroupPurposeContext(ctx context.Context, group, purpose st
 }
 
 // SetGroupTopic sets the group topic
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupTopic(group, topic string) (string, error) {
 	return api.SetGroupTopicContext(context.Background(), group, topic)
 }
 
 // SetGroupTopicContext sets the group topic with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) SetGroupTopicContext(ctx context.Context, group, topic string) (string, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -542,24 +356,12 @@ func (api *Client) SetGroupTopicContext(ctx context.Context, group, topic string
 
 // GetGroupReplies gets an entire thread (a message plus all the messages in reply to it).
 // see https://api.slack.com/methods/groups.replies
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupReplies(channelID, thread_ts string) ([]Message, error) {
 	return api.GetGroupRepliesContext(context.Background(), channelID, thread_ts)
 }
 
 // GetGroupRepliesContext gets an entire thread (a message plus all the messages in reply to it) with a custom context
 // see https://api.slack.com/methods/groups.replies
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetGroupRepliesContext(ctx context.Context, channelID, thread_ts string) ([]Message, error) {
 	values := url.Values{
 		"token":     {api.token},
diff --git a/im.go b/im.go
index a884b29..ee784fe 100644
--- a/im.go
+++ b/im.go
@@ -21,12 +21,6 @@ type imResponseFull struct {
 }
 
 // IM contains information related to the Direct Message channel
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 type IM struct {
 	Conversation
 	IsUserDeleted bool `json:"is_user_deleted"`
@@ -43,23 +37,11 @@ func (api *Client) imRequest(ctx context.Context, path string, values url.Values
 }
 
 // CloseIMChannel closes the direct message channel
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CloseIMChannel(channel string) (bool, bool, error) {
 	return api.CloseIMChannelContext(context.Background(), channel)
 }
 
 // CloseIMChannelContext closes the direct message channel with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) CloseIMChannelContext(ctx context.Context, channel string) (bool, bool, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -75,24 +57,12 @@ func (api *Client) CloseIMChannelContext(ctx context.Context, channel string) (b
 
 // OpenIMChannel opens a direct message channel to the user provided as argument
 // Returns some status and the channel ID
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) OpenIMChannel(user string) (bool, bool, string, error) {
 	return api.OpenIMChannelContext(context.Background(), user)
 }
 
 // OpenIMChannelContext opens a direct message channel to the user provided as argument with a custom context
 // Returns some status and the channel ID
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) OpenIMChannelContext(ctx context.Context, user string) (bool, bool, string, error) {
 	values := url.Values{
 		"token": {api.token},
@@ -107,23 +77,11 @@ func (api *Client) OpenIMChannelContext(ctx context.Context, user string) (bool,
 }
 
 // MarkIMChannel sets the read mark of a direct message channel to a specific point
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) MarkIMChannel(channel, ts string) (err error) {
 	return api.MarkIMChannelContext(context.Background(), channel, ts)
 }
 
 // MarkIMChannelContext sets the read mark of a direct message channel to a specific point with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) MarkIMChannelContext(ctx context.Context, channel, ts string) error {
 	values := url.Values{
 		"token":   {api.token},
@@ -136,23 +94,11 @@ func (api *Client) MarkIMChannelContext(ctx context.Context, channel, ts string)
 }
 
 // GetIMHistory retrieves the direct message channel history
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetIMHistory(channel string, params HistoryParameters) (*History, error) {
 	return api.GetIMHistoryContext(context.Background(), channel, params)
 }
 
 // GetIMHistoryContext retrieves the direct message channel history with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetIMHistoryContext(ctx context.Context, channel string, params HistoryParameters) (*History, error) {
 	values := url.Values{
 		"token":   {api.token},
@@ -190,23 +136,11 @@ func (api *Client) GetIMHistoryContext(ctx context.Context, channel string, para
 }
 
 // GetIMChannels returns the list of direct message channels
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetIMChannels() ([]IM, error) {
 	return api.GetIMChannelsContext(context.Background())
 }
 
 // GetIMChannelsContext returns the list of direct message channels with a custom context
-//
-// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
-// In Slack, these API are no longer available for  newly Apps created after June 10th, 2020.
-// Also, existing applications will not be able to use these APIs after February 24th, 2021.
-//
-// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
 func (api *Client) GetIMChannelsContext(ctx context.Context) ([]IM, error) {
 	values := url.Values{
 		"token": {api.token},
diff --git a/internal/errorsx/errorsx.go b/internal/errorsx/errorsx.go
index 0182ec6..cb85057 100644
--- a/internal/errorsx/errorsx.go
+++ b/internal/errorsx/errorsx.go
@@ -6,12 +6,3 @@ type String string
 func (t String) Error() string {
 	return string(t)
 }
-
-// Is reports whether String matches with the target error
-func (t String) Is(target error) bool {
-	if target == nil {
-		return false
-	}
-
-	return t.Error() == target.Error()
-}
diff --git a/internal/misc/misc.go b/internal/misc/misc.go
deleted file mode 100644
index eab8cdd..0000000
--- a/internal/misc/misc.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package misc
-
-import (
-	"fmt"
-	"net/http"
-)
-
-// StatusCodeError represents an http response error.
-// type httpStatusCode interface { HTTPStatusCode() int } to handle it.
-type StatusCodeError struct {
-	Code   int
-	Status string
-}
-
-func (t StatusCodeError) Error() string {
-	return fmt.Sprintf("slack server error: %s", t.Status)
-}
-
-func (t StatusCodeError) HTTPStatusCode() int {
-	return t.Code
-}
-
-func (t StatusCodeError) Retryable() bool {
-	if t.Code >= 500 || t.Code == http.StatusTooManyRequests {
-		return true
-	}
-	return false
-}
diff --git a/logger.go b/logger.go
index 90cb3ca..6a3533a 100644
--- a/logger.go
+++ b/logger.go
@@ -18,7 +18,7 @@ type ilogger interface {
 	Println(...interface{})
 }
 
-type Debug interface {
+type debug interface {
 	Debug() bool
 
 	// Debugf print a formatted debug line.
diff --git a/misc.go b/misc.go
index 821bda8..a5ca51b 100644
--- a/misc.go
+++ b/misc.go
@@ -18,8 +18,6 @@ import (
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/slack-go/slack/internal/misc"
 )
 
 // SlackResponse handles parsing out errors from the web api.
@@ -44,6 +42,28 @@ func (t SlackResponse) Err() error {
 	return errors.New(t.Error)
 }
 
+// StatusCodeError represents an http response error.
+// type httpStatusCode interface { HTTPStatusCode() int } to handle it.
+type statusCodeError struct {
+	Code   int
+	Status string
+}
+
+func (t statusCodeError) Error() string {
+	return fmt.Sprintf("slack server error: %s", t.Status)
+}
+
+func (t statusCodeError) HTTPStatusCode() int {
+	return t.Code
+}
+
+func (t statusCodeError) Retryable() bool {
+	if t.Code >= 500 || t.Code == http.StatusTooManyRequests {
+		return true
+	}
+	return false
+}
+
 // RateLimitedError represents the rate limit respond from slack
 type RateLimitedError struct {
 	RetryAfter time.Duration
@@ -68,7 +88,7 @@ func fileUploadReq(ctx context.Context, path string, values url.Values, r io.Rea
 	return req, nil
 }
 
-func downloadFile(client httpClient, token string, downloadURL string, writer io.Writer, d Debug) error {
+func downloadFile(client httpClient, token string, downloadURL string, writer io.Writer, d debug) error {
 	if downloadURL == "" {
 		return fmt.Errorf("received empty download URL")
 	}
@@ -122,7 +142,7 @@ func jsonReq(endpoint string, body interface{}) (req *http.Request, err error) {
 	return req, nil
 }
 
-func parseResponseBody(body io.ReadCloser, intf interface{}, d Debug) error {
+func parseResponseBody(body io.ReadCloser, intf interface{}, d debug) error {
 	response, err := ioutil.ReadAll(body)
 	if err != nil {
 		return err
@@ -135,7 +155,7 @@ func parseResponseBody(body io.ReadCloser, intf interface{}, d Debug) error {
 	return json.Unmarshal(response, intf)
 }
 
-func postLocalWithMultipartResponse(ctx context.Context, client httpClient, method, fpath, fieldname string, values url.Values, intf interface{}, d Debug) error {
+func postLocalWithMultipartResponse(ctx context.Context, client httpClient, method, fpath, fieldname string, values url.Values, intf interface{}, d debug) error {
 	fullpath, err := filepath.Abs(fpath)
 	if err != nil {
 		return err
@@ -149,7 +169,7 @@ func postLocalWithMultipartResponse(ctx context.Context, client httpClient, meth
 	return postWithMultipartResponse(ctx, client, method, filepath.Base(fpath), fieldname, values, file, intf, d)
 }
 
-func postWithMultipartResponse(ctx context.Context, client httpClient, path, name, fieldname string, values url.Values, r io.Reader, intf interface{}, d Debug) error {
+func postWithMultipartResponse(ctx context.Context, client httpClient, path, name, fieldname string, values url.Values, r io.Reader, intf interface{}, d debug) error {
 	pipeReader, pipeWriter := io.Pipe()
 	wr := multipart.NewWriter(pipeWriter)
 	errc := make(chan error)
@@ -196,7 +216,7 @@ func postWithMultipartResponse(ctx context.Context, client httpClient, path, nam
 	}
 }
 
-func doPost(ctx context.Context, client httpClient, req *http.Request, parser responseParser, d Debug) error {
+func doPost(ctx context.Context, client httpClient, req *http.Request, parser responseParser, d debug) error {
 	req = req.WithContext(ctx)
 	resp, err := client.Do(req)
 	if err != nil {
@@ -213,7 +233,7 @@ func doPost(ctx context.Context, client httpClient, req *http.Request, parser re
 }
 
 // post JSON.
-func postJSON(ctx context.Context, client httpClient, endpoint, token string, json []byte, intf interface{}, d Debug) error {
+func postJSON(ctx context.Context, client httpClient, endpoint, token string, json []byte, intf interface{}, d debug) error {
 	reqBody := bytes.NewBuffer(json)
 	req, err := http.NewRequest("POST", endpoint, reqBody)
 	if err != nil {
@@ -226,7 +246,7 @@ func postJSON(ctx context.Context, client httpClient, endpoint, token string, js
 }
 
 // post a url encoded form.
-func postForm(ctx context.Context, client httpClient, endpoint string, values url.Values, intf interface{}, d Debug) error {
+func postForm(ctx context.Context, client httpClient, endpoint string, values url.Values, intf interface{}, d debug) error {
 	reqBody := strings.NewReader(values.Encode())
 	req, err := http.NewRequest("POST", endpoint, reqBody)
 	if err != nil {
@@ -236,7 +256,7 @@ func postForm(ctx context.Context, client httpClient, endpoint string, values ur
 	return doPost(ctx, client, req, newJSONParser(intf), d)
 }
 
-func getResource(ctx context.Context, client httpClient, endpoint string, values url.Values, intf interface{}, d Debug) error {
+func getResource(ctx context.Context, client httpClient, endpoint string, values url.Values, intf interface{}, d debug) error {
 	req, err := http.NewRequest("GET", endpoint, nil)
 	if err != nil {
 		return err
@@ -247,12 +267,12 @@ func getResource(ctx context.Context, client httpClient, endpoint string, values
 	return doPost(ctx, client, req, newJSONParser(intf), d)
 }
 
-func parseAdminResponse(ctx context.Context, client httpClient, method string, teamName string, values url.Values, intf interface{}, d Debug) error {
+func parseAdminResponse(ctx context.Context, client httpClient, method string, teamName string, values url.Values, intf interface{}, d debug) error {
 	endpoint := fmt.Sprintf(WEBAPIURLFormat, teamName, method, time.Now().Unix())
 	return postForm(ctx, client, endpoint, values, intf, d)
 }
 
-func logResponse(resp *http.Response, d Debug) error {
+func logResponse(resp *http.Response, d debug) error {
 	if d.Debug() {
 		text, err := httputil.DumpResponse(resp, true)
 		if err != nil {
@@ -280,7 +300,7 @@ func timerReset(t *time.Timer, d time.Duration) {
 	t.Reset(d)
 }
 
-func checkStatusCode(resp *http.Response, d Debug) error {
+func checkStatusCode(resp *http.Response, d debug) error {
 	if resp.StatusCode == http.StatusTooManyRequests {
 		retry, err := strconv.ParseInt(resp.Header.Get("Retry-After"), 10, 64)
 		if err != nil {
@@ -292,7 +312,7 @@ func checkStatusCode(resp *http.Response, d Debug) error {
 	// Slack seems to send an HTML body along with 5xx error codes. Don't parse it.
 	if resp.StatusCode != http.StatusOK {
 		logResponse(resp, d)
-		return misc.StatusCodeError{Code: resp.StatusCode, Status: resp.Status}
+		return statusCodeError{Code: resp.StatusCode, Status: resp.Status}
 	}
 
 	return nil
diff --git a/reminders.go b/reminders.go
index ae1da86..de1170a 100644
--- a/reminders.go
+++ b/reminders.go
@@ -3,16 +3,17 @@ package slack
 import (
 	"context"
 	"net/url"
+	"time"
 )
 
 type Reminder struct {
-	ID         string `json:"id"`
-	Creator    string `json:"creator"`
-	User       string `json:"user"`
-	Text       string `json:"text"`
-	Recurring  bool   `json:"recurring"`
-	Time       int    `json:"time"`
-	CompleteTS int    `json:"complete_ts"`
+	ID         string    `json:"id"`
+	Creator    string    `json:"creator"`
+	User       string    `json:"user"`
+	Text       string    `json:"text"`
+	Recurring  bool      `json:"recurring"`
+	Time       time.Time `json:"time"`
+	CompleteTS int       `json:"complete_ts"`
 }
 
 type reminderResp struct {
@@ -22,7 +23,7 @@ type reminderResp struct {
 
 type remindersResp struct {
 	SlackResponse
-	Reminders []*Reminder `json:"reminders"`
+	Reminders []Reminder `json:"reminders"`
 }
 
 func (api *Client) doReminder(ctx context.Context, path string, values url.Values) (*Reminder, error) {
@@ -42,7 +43,7 @@ func (api *Client) doReminders(ctx context.Context, path string, values url.Valu
 	// create an array of pointers to reminders
 	var reminders = make([]*Reminder, 0, len(response.Reminders))
 	for _, reminder := range response.Reminders {
-		reminders = append(reminders, reminder)
+		reminders = append(reminders, &reminder)
 	}
 
 	return reminders, response.Err()
diff --git a/security.go b/security.go
index 4510352..dbe8fb2 100644
--- a/security.go
+++ b/security.go
@@ -20,7 +20,6 @@ const (
 
 // SecretsVerifier contains the information needed to verify that the request comes from Slack
 type SecretsVerifier struct {
-	d         Debug
 	signature []byte
 	hmac      hash.Hash
 }
@@ -76,11 +75,6 @@ func NewSecretsVerifier(header http.Header, secret string) (sv SecretsVerifier,
 	return sv, err
 }
 
-func (v *SecretsVerifier) WithDebug(d Debug) *SecretsVerifier {
-	v.d = d
-	return v
-}
-
 func (v *SecretsVerifier) Write(body []byte) (n int, err error) {
 	return v.hmac.Write(body)
 }
@@ -92,10 +86,8 @@ func (v SecretsVerifier) Ensure() error {
 	if hmac.Equal(computed, v.signature) {
 		return nil
 	}
-	if v.d != nil && v.d.Debug() {
-		v.d.Debugln(fmt.Sprintf("Expected signing signature: %s, but computed: %s", hex.EncodeToString(v.signature), hex.EncodeToString(computed)))
-	}
-	return fmt.Errorf("Computed unexpected signature of: %s", hex.EncodeToString(computed))
+
+	return fmt.Errorf("Expected signing signature: %s, but computed: %s", hex.EncodeToString(v.signature), hex.EncodeToString(computed))
 }
 
 func abs64(n int64) int64 {
diff --git a/socket_mode.go b/socket_mode.go
deleted file mode 100644
index 69e40d9..0000000
--- a/socket_mode.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package slack
-
-import (
-	"context"
-)
-
-// SocketModeConnection contains various details about the SocketMode connection.
-// It is returned by an "apps.connections.open" API call.
-type SocketModeConnection struct {
-	URL  string                 `json:"url,omitempty"`
-	Data map[string]interface{} `json:"-"`
-}
-
-type openResponseFull struct {
-	SlackResponse
-	SocketModeConnection
-}
-
-// StartSocketModeContext calls the "apps.connections.open" endpoint and returns the provided URL and the full Info block with a custom context.
-//
-// To have a fully managed Socket Mode connection, use `socketmode.New()`, and call `Run()` on it.
-func (api *Client) StartSocketModeContext(ctx context.Context) (info *SocketModeConnection, websocketURL string, err error) {
-	response := &openResponseFull{}
-	err = postJSON(ctx, api.httpclient, api.endpoint+"apps.connections.open", api.appLevelToken, nil, response, api)
-	if err != nil {
-		return nil, "", err
-	}
-
-	if response.Err() == nil {
-		api.Debugln("Using URL:", response.SocketModeConnection.URL)
-	}
-
-	return &response.SocketModeConnection, response.SocketModeConnection.URL, response.Err()
-}
diff --git a/socketmode/client.go b/socketmode/client.go
deleted file mode 100644
index cce8a70..0000000
--- a/socketmode/client.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package socketmode
-
-import (
-	"encoding/json"
-	"time"
-
-	"github.com/slack-go/slack"
-
-	"github.com/gorilla/websocket"
-)
-
-type ConnectedEvent struct {
-	ConnectionCount int // 1 = first time, 2 = second time
-	Info            *slack.SocketModeConnection
-}
-
-type DebugInfo struct {
-	// Host is the name of the host name on the Slack end, that can be something like `applink-7fc4fdbb64-4x5xq`
-	Host string `json:"host"`
-
-	// `hello` type only
-	BuildNumber               int `json:"build_number"`
-	ApproximateConnectionTime int `json:"approximate_connection_time"`
-}
-
-type ConnectionInfo struct {
-	AppID string `json:"app_id"`
-}
-
-type SocketModeMessagePayload struct {
-	Event json.RawMessage `json:"´event"`
-}
-
-// Client is a Socket Mode client that allows programs to use [Events API](https://api.slack.com/events-api)
-// and [interactive components](https://api.slack.com/interactivity) over WebSocket.
-// Please see [Intro to Socket Mode](https://api.slack.com/apis/connections/socket) for more information
-// on Socket Mode.
-//
-// The implementation is highly inspired by https://www.npmjs.com/package/@slack/socket-mode,
-// but the structure and the design has been adapted as much as possible to that of our RTM client for consistency
-// within the library.
-//
-// You can instantiate the socket mode client with
-// Client's New() and call Run() to start it. Please see examples/socketmode for the usage.
-type Client struct {
-	// Client is the main API, embedded
-	apiClient slack.Client
-
-	// maxPingInterval is the maximum duration elapsed after the last WebSocket PING sent from Slack
-	// until Client considers the WebSocket connection is dead and needs to be reopened.
-	maxPingInterval time.Duration
-
-	// Connection life-cycle
-	Events              chan Event
-	socketModeResponses chan *Response
-
-	// dialer is a gorilla/websocket Dialer. If nil, use the default
-	// Dialer.
-	dialer *websocket.Dialer
-
-	debug bool
-	log   ilogger
-}
diff --git a/socketmode/deadman.go b/socketmode/deadman.go
deleted file mode 100644
index 7aeea76..0000000
--- a/socketmode/deadman.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package socketmode
-
-import "time"
-
-type deadmanTimer struct {
-	timeout time.Duration
-	timer   *time.Timer
-}
-
-func newDeadmanTimer(timeout time.Duration) *deadmanTimer {
-	return &deadmanTimer{
-		timeout: timeout,
-		timer:   time.NewTimer(timeout),
-	}
-}
-
-func (smc *deadmanTimer) Elapsed() <-chan time.Time {
-	return smc.timer.C
-}
-
-func (smc *deadmanTimer) Reset() {
-	// Note that this is the correct way to Reset a non-expired timer
-	if !smc.timer.Stop() {
-		select {
-		case <-smc.timer.C:
-		default:
-		}
-	}
-
-	smc.timer.Reset(smc.timeout)
-}
diff --git a/socketmode/event.go b/socketmode/event.go
deleted file mode 100644
index 5ae434a..0000000
--- a/socketmode/event.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package socketmode
-
-import "encoding/json"
-
-// Event is the event sent to the consumer of Client
-type Event struct {
-	Type EventType
-	Data interface{}
-
-	// Request is the json-decoded raw WebSocket message that is received via the Slack Socket Mode
-	// WebSocket connection.
-	Request *Request
-}
-
-type ErrorBadMessage struct {
-	Cause   error
-	Message json.RawMessage
-}
-
-type ErrorWriteFailed struct {
-	Cause    error
-	Response *Response
-}
-
-type errorRequestedDisconnect struct {
-}
-
-func (e errorRequestedDisconnect) Error() string {
-	return "disconnection requested: Slack requested us to disconnect"
-}
diff --git a/socketmode/log.go b/socketmode/log.go
deleted file mode 100644
index 9f3b7f6..0000000
--- a/socketmode/log.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package socketmode
-
-import "fmt"
-
-// TODO merge logger, ilogger, and internalLogger with the top-level package's equivalents
-
-// logger is a logger interface compatible with both stdlib and some
-// 3rd party loggers.
-type logger interface {
-	Output(int, string) error
-}
-
-// ilogger represents the internal logging api we use.
-type ilogger interface {
-	logger
-	Print(...interface{})
-	Printf(string, ...interface{})
-	Println(...interface{})
-}
-
-// internalLog implements the additional methods used by our internal logging.
-type internalLog struct {
-	logger
-}
-
-// Println replicates the behaviour of the standard logger.
-func (t internalLog) Println(v ...interface{}) {
-	t.Output(2, fmt.Sprintln(v...))
-}
-
-// Printf replicates the behaviour of the standard logger.
-func (t internalLog) Printf(format string, v ...interface{}) {
-	t.Output(2, fmt.Sprintf(format, v...))
-}
-
-// Print replicates the behaviour of the standard logger.
-func (t internalLog) Print(v ...interface{}) {
-	t.Output(2, fmt.Sprint(v...))
-}
-
-func (smc *Client) Debugf(format string, v ...interface{}) {
-	if smc.debug {
-		smc.log.Output(2, fmt.Sprintf(format, v...))
-	}
-}
-
-func (smc *Client) Debugln(v ...interface{}) {
-	if smc.debug {
-		smc.log.Output(2, fmt.Sprintln(v...))
-	}
-}
diff --git a/socketmode/request.go b/socketmode/request.go
deleted file mode 100644
index 078003a..0000000
--- a/socketmode/request.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package socketmode
-
-import "encoding/json"
-
-// Request maps to the content of each WebSocket message received via a Socket Mode WebSocket connection
-//
-// We call this a "request" rather than e.g. a WebSocket message or an Socket Mode "event" following python-slack-sdk:
-//
-//   https://github.com/slackapi/python-slack-sdk/blob/3f1c4c6e27bf7ee8af57699b2543e6eb7848bcf9/slack_sdk/socket_mode/request.py#L6
-//
-// We know that node-slack-sdk calls it an "event", that makes it hard for us to distinguish our client's own event
-// that wraps both internal events and Socket Mode "events", vs node-slack-sdk's is for the latter only.
-//
-// https://github.com/slackapi/node-slack-sdk/blob/main/packages/socket-mode/src/SocketModeClient.ts#L537
-type Request struct {
-	Type string `json:"type"`
-
-	// `hello` type only
-	NumConnections int            `json:"num_connections"`
-	ConnectionInfo ConnectionInfo `json:"connection_info"`
-
-	// `disconnect` type only
-
-	// Reason can be "warning" or else
-	Reason string `json:"reason"`
-
-	// `hello` and `disconnect` types only
-	DebugInfo DebugInfo `json:"debug_info"`
-
-	// `events_api` type only
-	EnvelopeID string `json:"envelope_id"`
-	// TODO Can it really be a non-object type?
-	// See https://github.com/slackapi/python-slack-sdk/blob/3f1c4c6e27bf7ee8af57699b2543e6eb7848bcf9/slack_sdk/socket_mode/request.py#L26-L31
-	Payload                json.RawMessage `json:"payload"`
-	AcceptsResponsePayload bool            `json:"accepts_response_payload"`
-	RetryAttempt           int             `json:"retry_attempt"`
-	RetryReason            string          `json:"retry_reason"`
-}
diff --git a/socketmode/response.go b/socketmode/response.go
deleted file mode 100644
index 5c7bfab..0000000
--- a/socketmode/response.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package socketmode
-
-type Response struct {
-	EnvelopeID string      `json:"envelope_id"`
-	Payload    interface{} `json:"payload,omitempty"`
-}
diff --git a/socketmode/socket_mode_managed_conn.go b/socketmode/socket_mode_managed_conn.go
deleted file mode 100644
index 4cd649c..0000000
--- a/socketmode/socket_mode_managed_conn.go
+++ /dev/null
@@ -1,550 +0,0 @@
-package socketmode
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"net/http"
-	"sync"
-	"time"
-
-	"github.com/slack-go/slack"
-	"github.com/slack-go/slack/internal/backoff"
-	"github.com/slack-go/slack/internal/misc"
-	"github.com/slack-go/slack/slackevents"
-
-	"github.com/gorilla/websocket"
-	"github.com/slack-go/slack/internal/timex"
-)
-
-// Run is a blocking function that connects the Slack Socket Mode API and handles all incoming
-// requests and outgoing responses.
-//
-// The consumer of the Client and this function should read the Client.Events channel to receive
-// `socketmode.Event`s that includes the client-specific events that may or may not wrap Socket Mode requests.
-//
-// Note that this function automatically reconnect on requested by Slack through a `disconnect` message.
-// This function exists with an error only when a reconnection is failued due to some reason.
-// If you want to retry even on reconnection failure, you'd need to write your own wrapper for this function
-// to do so.
-func (smc *Client) Run() error {
-	ctx := context.TODO()
-
-	for connectionCount := 0; ; connectionCount++ {
-		if err := smc.run(ctx, connectionCount); err != nil {
-			return err
-		}
-
-		// Continue and run the loop again to reconnect
-	}
-}
-
-func (smc *Client) run(ctx context.Context, connectionCount int) error {
-	messages := make(chan json.RawMessage)
-
-	deadmanTimer := newDeadmanTimer(smc.maxPingInterval)
-
-	pingHandler := func(_ string) error {
-		deadmanTimer.Reset()
-
-		return nil
-	}
-
-	// Start trying to connect
-	// the returned err is already passed onto the Events channel
-	//
-	// We also configures an additional ping handler for the deadmanTimer that triggers a timeout when
-	// Slack did not send us WebSocket PING for more than Client.maxPingInterval.
-	// We can use `<-smc.pingTimeout.C` to wait for the timeout.
-	info, conn, err := smc.connect(ctx, connectionCount, pingHandler)
-	if err != nil {
-		// when the connection is unsuccessful its fatal, and we need to bail out.
-		smc.Debugf("Failed to connect with Socket Mode on try %d: %s", connectionCount, err)
-
-		return err
-	}
-
-	ctx, cancel := context.WithCancel(ctx)
-	defer cancel()
-
-	smc.Events <- newEvent(EventTypeConnected, &ConnectedEvent{
-		ConnectionCount: connectionCount,
-		Info:            info,
-	})
-
-	smc.Debugf("WebSocket connection succeeded on try %d", connectionCount)
-
-	// We're now connected so we can set up listeners
-
-	var (
-		wg           sync.WaitGroup
-		firstErr     error
-		firstErrOnce sync.Once
-	)
-
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
-		defer cancel()
-
-		// The response sender sends Socket Mode responses over the WebSocket conn
-		if err := smc.runResponseSender(ctx, conn); err != nil {
-			firstErrOnce.Do(func() {
-				firstErr = err
-			})
-		}
-	}()
-
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
-		defer cancel()
-
-		// The handler reads Socket Mode requests, and enqueues responses for sending by the response sender
-		if err := smc.runRequestHandler(ctx, messages); err != nil {
-			firstErrOnce.Do(func() {
-				firstErr = err
-			})
-		}
-	}()
-
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
-		defer cancel()
-
-		// The receiver reads WebSocket messages, and enqueues parsed Socket Mode requests to be handled by
-		// the request handler
-		if err := smc.runMessageReceiver(ctx, conn, messages); err != nil {
-			firstErrOnce.Do(func() {
-				firstErr = err
-			})
-		}
-	}()
-
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
-
-		select {
-		case <-ctx.Done():
-		// Detect when the connection is dead.
-		case <-deadmanTimer.Elapsed():
-			firstErrOnce.Do(func() {
-				firstErr = errors.New("ping timeout: Slack did not send us WebSocket PING for more than Client.maxInterval")
-			})
-
-			cancel()
-		}
-	}()
-
-	wg.Wait()
-
-	// wg.Wait() finishes only after any of the above go routines finishes.
-	// Also, we can expect firstErr to be not nil, as goroutines can finish only on error.
-	smc.Debugf("Reconnecting due to %v", firstErr)
-
-	if err = conn.Close(); err != nil {
-		smc.Debugf("Failed to close connection: %v", err)
-	}
-
-	return nil
-}
-
-// connect attempts to connect to the slack websocket API. It handles any
-// errors that occur while connecting and will return once a connection
-// has been successfully opened.
-func (smc *Client) connect(ctx context.Context, connectionCount int, additionalPingHandler func(string) error) (*slack.SocketModeConnection, *websocket.Conn, error) {
-	const (
-		errInvalidAuth      = "invalid_auth"
-		errInactiveAccount  = "account_inactive"
-		errMissingAuthToken = "not_authed"
-	)
-
-	// used to provide exponential backoff wait time with jitter before trying
-	// to connect to slack again
-	boff := &backoff.Backoff{
-		Max: 5 * time.Minute,
-	}
-
-	for {
-		var (
-			backoff time.Duration
-		)
-
-		// send connecting event
-		smc.Events <- newEvent(EventTypeConnecting, &slack.ConnectingEvent{
-			Attempt:         boff.Attempts() + 1,
-			ConnectionCount: connectionCount,
-		})
-
-		// attempt to start the connection
-		info, conn, err := smc.openAndDial(additionalPingHandler)
-		if err == nil {
-			return info, conn, nil
-		}
-
-		// check for fatal errors
-		switch err.Error() {
-		case errInvalidAuth, errInactiveAccount, errMissingAuthToken:
-			smc.Debugf("invalid auth when connecting with SocketMode: %s", err)
-			return nil, nil, err
-		default:
-		}
-
-		switch actual := err.(type) {
-		case misc.StatusCodeError:
-			if actual.Code == http.StatusNotFound {
-				smc.Debugf("invalid auth when connecting with Socket Mode: %s", err)
-				smc.Events <- newEvent(EventTypeInvalidAuth, &slack.InvalidAuthEvent{})
-				return nil, nil, err
-			}
-		case *slack.RateLimitedError:
-			backoff = actual.RetryAfter
-		default:
-		}
-
-		backoff = timex.Max(backoff, boff.Duration())
-		// any other errors are treated as recoverable and we try again after
-		// sending the event along the Events channel
-		smc.Events <- newEvent(EventTypeConnectionError, &slack.ConnectionErrorEvent{
-			Attempt:  boff.Attempts(),
-			Backoff:  backoff,
-			ErrorObj: err,
-		})
-
-		// get time we should wait before attempting to connect again
-		smc.Debugf("reconnection %d failed: %s reconnecting in %v\n", boff.Attempts(), err, backoff)
-
-		// wait for one of the following to occur,
-		// backoff duration has elapsed, disconnectCh is signalled, or
-		// the smc finishes disconnecting.
-		select {
-		case <-time.After(backoff): // retry after the backoff.
-		case <-ctx.Done():
-			return nil, nil, ctx.Err()
-		}
-	}
-}
-
-// openAndDial attempts to open a Socket Mode connection and dial to the connection endpoint using WebSocket.
-// It returns the  full information returned by the "apps.connections.open" method on the
-// Slack API.
-func (smc *Client) openAndDial(additionalPingHandler func(string) error) (info *slack.SocketModeConnection, _ *websocket.Conn, err error) {
-	var (
-		url string
-	)
-
-	smc.Debugf("Starting SocketMode")
-	info, url, err = smc.Open()
-
-	if err != nil {
-		smc.Debugf("Failed to start or connect with SocketMode: %s", err)
-		return nil, nil, err
-	}
-
-	smc.Debugf("Dialing to websocket on url %s", url)
-	// Only use HTTPS for connections to prevent MITM attacks on the connection.
-	upgradeHeader := http.Header{}
-	upgradeHeader.Add("Origin", "https://api.slack.com")
-	dialer := websocket.DefaultDialer
-	if smc.dialer != nil {
-		dialer = smc.dialer
-	}
-	conn, _, err := dialer.Dial(url, upgradeHeader)
-	if err != nil {
-		smc.Debugf("Failed to dial to the websocket: %s", err)
-		return nil, nil, err
-	}
-
-	conn.SetPingHandler(func(appData string) error {
-		if additionalPingHandler != nil {
-			if err := additionalPingHandler(appData); err != nil {
-				return err
-			}
-		}
-
-		smc.handlePing(conn, appData)
-
-		return nil
-	})
-
-	// We don't need to conn.SetCloseHandler because the default handler is effective enough that
-	// it sends back the CLOSE message to the server and let conn.ReadJSON() fail with CloseError.
-	// The CloseError must be handled normally in our receiveMessagesInto function.
-	//conn.SetCloseHandler(func(code int, text string) error {
-	//  ...
-	// })
-
-	return info, conn, err
-}
-
-// runResponseSender runs the handler that reads Socket Mode responses enqueued onto Client.socketModeResponses channel
-// and sends them one by one over the WebSocket connection.
-// Gorilla WebSocket is not goroutine safe hence this needs to be the single place you write to the WebSocket connection.
-func (smc *Client) runResponseSender(ctx context.Context, conn *websocket.Conn) error {
-	for {
-		select {
-		case <-ctx.Done():
-			return ctx.Err()
-		// 3. listen for messages that need to be sent
-		case res := <-smc.socketModeResponses:
-			smc.Debugf("Sending Socket Mode response with envelope ID %q: %v", res.EnvelopeID, res)
-
-			if err := unsafeWriteSocketModeResponse(conn, res); err != nil {
-				smc.Events <- newEvent(EventTypeErrorWriteFailed, &ErrorWriteFailed{
-					Cause:    err,
-					Response: res,
-				})
-			}
-
-			smc.Debugf("Finished sending Socket Mode response with envelope ID %q", res.EnvelopeID)
-		}
-	}
-}
-
-// runRequestHandler is a blocking function that runs the Socket Mode request receiver.
-//
-// It reads WebSocket messages sent from Slack's Socket Mode WebSocket connection,
-// parses them as Socket Mode requests, and processes them and optionally emit our own events into Client.Events channel.
-func (smc *Client) runRequestHandler(ctx context.Context, websocket chan json.RawMessage) error {
-	for {
-		select {
-		case <-ctx.Done():
-			return ctx.Err()
-		case message := <-websocket:
-			smc.Debugf("Received WebSocket message: %s", message)
-
-			// listen for incoming messages that need to be parsed
-			evt, err := smc.parseEvent(message)
-			if err != nil {
-				smc.Events <- newEvent(EventTypeErrorBadMessage, &ErrorBadMessage{
-					Cause:   err,
-					Message: message,
-				})
-			} else if evt != nil {
-				if evt.Type == EventTypeDisconnect {
-					// We treat the `disconnect` request from Slack as an error internally,
-					// so that we can tell the consumer of this function to reopen the connection on it.
-					return errorRequestedDisconnect{}
-				}
-
-				smc.Events <- *evt
-			}
-		}
-	}
-}
-
-// runMessageReceiver monitors the Socket Mode opened WebSocket connection for any incoming
-// messages. It pushes the raw events into the channel.
-// The receiver runs until the context is closed.
-func (smc *Client) runMessageReceiver(ctx context.Context, conn *websocket.Conn, sink chan json.RawMessage) error {
-	for {
-		if err := smc.receiveMessagesInto(ctx, conn, sink); err != nil {
-			return err
-		}
-	}
-}
-
-// unsafeWriteSocketModeResponse sends a WebSocket message back to Slack.
-// WARNING: Call to this function must be serialized!
-//
-// Here's why - Gorilla WebSocket's Writes functions are not concurrency-safe.
-// That is, we must serialize all the writes to it with e.g. a goroutine or mutex.
-// We intentionally chose to use goroutine, which makes it harder to propagate write errors to the caller,
-// but is more computationally efficient.
-//
-// See the below for more information on this topic:
-// https://stackoverflow.com/questions/43225340/how-to-ensure-concurrency-in-golang-gorilla-websocket-package
-func unsafeWriteSocketModeResponse(conn *websocket.Conn, res *Response) error {
-	// set a write deadline on the connection
-	if err := conn.SetWriteDeadline(time.Now().Add(10 * time.Second)); err != nil {
-		return err
-	}
-
-	// Remove write deadline regardless of WriteJSON succeeds or not
-	defer conn.SetWriteDeadline(time.Time{})
-
-	if err := conn.WriteJSON(res); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func newEvent(tpe EventType, data interface{}, req ...*Request) Event {
-	evt := Event{Type: tpe, Data: data}
-
-	if len(req) > 0 {
-		evt.Request = req[0]
-	}
-
-	return evt
-}
-
-// Ack acknowledges the Socket Mode request with the payload.
-//
-// This tells Slack that the we have received the request denoted by the envelope ID,
-// by sending back the envelope ID over the WebSocket connection.
-func (smc *Client) Ack(req Request, payload ...interface{}) {
-	res := Response{
-		EnvelopeID: req.EnvelopeID,
-	}
-
-	if len(payload) > 0 {
-		res.Payload = payload[0]
-	}
-
-	smc.Send(res)
-}
-
-// Send sends the Socket Mode response over a WebSocket connection.
-// This is usually used for acknowledging requests, but if you need more control over Client.Ack().
-// It's normally recommended to use Client.Ack() instead of this.
-func (smc *Client) Send(res Response) {
-	js, err := json.Marshal(res)
-	if err != nil {
-		panic(err)
-	}
-
-	smc.Debugf("Scheduling Socket Mode response for envelope ID %s: %s", res.EnvelopeID, js)
-
-	smc.socketModeResponses <- &res
-}
-
-// receiveMessagesInto attempts to receive an event from the WebSocket connection for Socket Mode.
-// This will block until a frame is available from the WebSocket.
-// If the read from the WebSocket results in a fatal error, this function will return non-nil.
-func (smc *Client) receiveMessagesInto(ctx context.Context, conn *websocket.Conn, sink chan json.RawMessage) error {
-	smc.Debugf("Starting to receive message")
-	defer smc.Debugf("Finished to receive message")
-
-	event := json.RawMessage{}
-	err := conn.ReadJSON(&event)
-
-	// check if the connection was closed.
-	if websocket.IsUnexpectedCloseError(err) {
-		return err
-	}
-
-	switch {
-	case err == io.ErrUnexpectedEOF:
-		// EOF's don't seem to signify a failed connection so instead we ignore
-		// them here and detect a failed connection upon attempting to send a
-		// 'PING' message
-
-		// Unlike RTM, we don't ping from the our end as there seem to have no client ping.
-		// We just continue to the next loop so that we `smc.disconnected` should be received if
-		// this EOF error was actually due to disconnection.
-
-		return nil
-	case err != nil:
-		// All other errors from ReadJSON come from NextReader, and should
-		// kill the read loop and force a reconnect.
-		smc.Events <- newEvent(EventTypeIncomingError, &slack.IncomingEventError{
-			ErrorObj: err,
-		})
-
-		return err
-	case len(event) == 0:
-		smc.Debugln("Received empty event")
-	default:
-		if smc.debug {
-			buf := &bytes.Buffer{}
-			d := json.NewEncoder(buf)
-			d.SetIndent("", "  ")
-			if err := d.Encode(event); err != nil {
-				smc.Debugln("Failed encoding decoded json:", err)
-			}
-			reencoded := buf.String()
-
-			smc.Debugln("Incoming WebSocket message:", reencoded)
-		}
-
-		select {
-		case sink <- event:
-		case <-ctx.Done():
-			smc.Debugln("cancelled while attempting to send raw event")
-
-			return ctx.Err()
-		}
-	}
-
-	return nil
-}
-
-// parseEvent takes a raw JSON message received from the slack websocket
-// and handles the encoded event.
-// returns the our own event that wraps the socket mode request.
-func (smc *Client) parseEvent(wsMsg json.RawMessage) (*Event, error) {
-	req := &Request{}
-	err := json.Unmarshal(wsMsg, req)
-	if err != nil {
-		return nil, fmt.Errorf("unmarshalling WebSocket message: %v", err)
-	}
-
-	var evt Event
-
-	// See below two links for all the available message types.
-	// - https://github.com/slackapi/node-slack-sdk/blob/c3f4d7109062a0356fb765d53794b7b5f6b3b5ae/packages/socket-mode/src/SocketModeClient.ts#L533
-	// - https://api.slack.com/apis/connections/socket-implement
-	switch req.Type {
-	case RequestTypeHello:
-		evt = newEvent(EventTypeHello, nil, req)
-	case RequestTypeEventsAPI:
-		payloadEvent := req.Payload
-
-		eventsAPIEvent, err := slackevents.ParseEvent(payloadEvent, slackevents.OptionNoVerifyToken())
-		if err != nil {
-			return nil, fmt.Errorf("parsing Events API event: %v", err)
-		}
-
-		evt = newEvent(EventTypeEventsAPI, eventsAPIEvent, req)
-	case RequestTypeDisconnect:
-		// See https://api.slack.com/apis/connections/socket-implement#disconnect
-
-		evt = newEvent(EventTypeDisconnect, nil, req)
-	case RequestTypeSlashCommands:
-		// See https://api.slack.com/apis/connections/socket-implement#command
-		var cmd slack.SlashCommand
-
-		if err := json.Unmarshal(req.Payload, &cmd); err != nil {
-			return nil, fmt.Errorf("parsing slash command: %v", err)
-		}
-
-		evt = newEvent(EventTypeSlashCommand, cmd, req)
-	case RequestTypeInteractive:
-		// See belows:
-		// - https://api.slack.com/apis/connections/socket-implement#button
-		// - https://api.slack.com/apis/connections/socket-implement#home
-		// - https://api.slack.com/apis/connections/socket-implement#modal
-		// - https://api.slack.com/apis/connections/socket-implement#menu
-
-		var callback slack.InteractionCallback
-
-		if err := json.Unmarshal(req.Payload, &callback); err != nil {
-			return nil, fmt.Errorf("parsing interaction callback: %v", err)
-		}
-
-		evt = newEvent(EventTypeInteractive, callback, req)
-	default:
-		return nil, fmt.Errorf("processing WebSocket message: encountered unsupported type %q", req.Type)
-	}
-
-	return &evt, nil
-}
-
-// handlePing handles an incoming 'PONG' message which should be in response to
-// a previously sent 'PING' message. This is then used to compute the
-// connection's latency.
-func (smc *Client) handlePing(conn *websocket.Conn, event string) {
-	smc.Debugf("WebSocket ping message received: %s", event)
-
-	// In WebSocket, we need to respond a PING from the server with a PONG with the same payload as the PING.
-	if err := conn.WriteControl(websocket.PongMessage, []byte(event), time.Now().Add(10*time.Second)); err != nil {
-		smc.Debugf("Failed writing WebSocket PONG message: %v", err)
-	}
-}
diff --git a/socketmode/socketmode.go b/socketmode/socketmode.go
deleted file mode 100644
index 635e818..0000000
--- a/socketmode/socketmode.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package socketmode
-
-import (
-	"context"
-	"log"
-	"os"
-	"time"
-
-	"github.com/slack-go/slack"
-
-	"github.com/gorilla/websocket"
-)
-
-// EventType is the type of events that are emitted by scoketmode.Client.
-// You receive and handle those events from a socketmode.Client.Events channel.
-// Those event types does not necessarily match 1:1 to those of Slack Events API events.
-type EventType string
-
-const (
-	// The following request types are the types of requests sent from Slack via Socket Mode WebSocket connection
-	// and handled internally by the socketmode.Client.
-	// The consumer of socketmode.Client will never see it.
-
-	RequestTypeHello         = "hello"
-	RequestTypeEventsAPI     = "events_api"
-	RequestTypeDisconnect    = "disconnect"
-	RequestTypeSlashCommands = "slash_commands"
-	RequestTypeInteractive   = "interactive"
-
-	// The following event types are for events emitted by socketmode.Client itself and
-	// does not originate from Slack.
-	EventTypeConnecting       = EventType("connecting")
-	EventTypeInvalidAuth      = EventType("invalid_auth")
-	EventTypeConnectionError  = EventType("connection_error")
-	EventTypeConnected        = EventType("connected")
-	EventTypeIncomingError    = EventType("incoming_error")
-	EventTypeErrorWriteFailed = EventType("write_error")
-	EventTypeErrorBadMessage  = EventType("error_bad_message")
-
-	//
-	// The following event types are guaranteed to not change unless Slack changes
-	//
-
-	EventTypeHello        = EventType("hello")
-	EventTypeDisconnect   = EventType("disconnect")
-	EventTypeEventsAPI    = EventType("events_api")
-	EventTypeInteractive  = EventType("interactive")
-	EventTypeSlashCommand = EventType("slash_commands")
-
-	websocketDefaultTimeout = 10 * time.Second
-	defaultMaxPingInterval  = 30 * time.Second
-)
-
-// Open calls the "apps.connections.open" endpoint and returns the provided URL and the full Info block.
-//
-// To have a fully managed Websocket connection, use `New`, and call `Run()` on it.
-func (smc *Client) Open() (info *slack.SocketModeConnection, websocketURL string, err error) {
-	ctx, cancel := context.WithTimeout(context.Background(), websocketDefaultTimeout)
-	defer cancel()
-
-	return smc.apiClient.StartSocketModeContext(ctx)
-}
-
-// Option options for the managed Client.
-type Option func(client *Client)
-
-// OptionDialer takes a gorilla websocket Dialer and uses it as the
-// Dialer when opening the websocket for the Socket Mode connection.
-func OptionDialer(d *websocket.Dialer) Option {
-	return func(smc *Client) {
-		smc.dialer = d
-	}
-}
-
-// OptionPingInterval determines how often we expect Slack to deliver WebSocket ping to us.
-// If no ping is delivered to us within this interval after the last ping, we assumes the WebSocket connection
-// is dead and needs to be reconnected.
-func OptionPingInterval(d time.Duration) Option {
-	return func(smc *Client) {
-		smc.maxPingInterval = d
-	}
-}
-
-// OptionDebug enable debugging for the client
-func OptionDebug(b bool) func(*Client) {
-	return func(c *Client) {
-		c.debug = b
-	}
-}
-
-// OptionLog set logging for client.
-func OptionLog(l logger) func(*Client) {
-	return func(c *Client) {
-		c.log = internalLog{logger: l}
-	}
-}
-
-// New returns a Socket Mode client which provides a fully managed connection to
-// Slack's Websocket-based Socket Mode.
-func New(api *slack.Client, options ...Option) *Client {
-	result := &Client{
-		apiClient:           *api,
-		Events:              make(chan Event, 50),
-		socketModeResponses: make(chan *Response, 20),
-		maxPingInterval:     defaultMaxPingInterval,
-		log:                 log.New(os.Stderr, "slack-go/slack/socketmode", log.LstdFlags|log.Lshortfile),
-	}
-
-	for _, opt := range options {
-		opt(result)
-	}
-
-	return result
-}
diff --git a/users.go b/users.go
index 5d8cb35..cdef424 100644
--- a/users.go
+++ b/users.go
@@ -31,7 +31,6 @@ type UserProfile struct {
 	Image48               string                  `json:"image_48"`
 	Image72               string                  `json:"image_72"`
 	Image192              string                  `json:"image_192"`
-	Image512              string                  `json:"image_512"`
 	ImageOriginal         string                  `json:"image_original"`
 	Title                 string                  `json:"title"`
 	BotID                 string                  `json:"bot_id,omitempty"`
@@ -514,7 +513,7 @@ func (api *Client) DeleteUserPhotoContext(ctx context.Context) (err error) {
 //
 // For more information see SetUserRealNameContextWithUser
 func (api *Client) SetUserRealName(realName string) error {
-	return api.SetUserRealNameContextWithUser(context.Background(), "", realName)
+	return api.SetUserRealNameContextWithUser(context.Background(), realName, realName)
 }
 
 // SetUserRealNameContextWithUser will set a real name for the provided user with a custom context
@@ -532,15 +531,11 @@ func (api *Client) SetUserRealNameContextWithUser(ctx context.Context, user, rea
 	}
 
 	values := url.Values{
+		"user":    {user},
 		"token":   {api.token},
 		"profile": {string(profile)},
 	}
 
-	// optional field. It should not be set if empty
-	if user != "" {
-		values["user"] = []string{user}
-	}
-
 	response := &userResponseFull{}
 	if err = api.postMethod(ctx, "users.profile.set", values, response); err != nil {
 		return err
@@ -562,7 +557,7 @@ func (api *Client) SetUserCustomStatus(statusText, statusEmoji string, statusExp
 //
 // For more information see SetUserCustomStatus
 func (api *Client) SetUserCustomStatusContext(ctx context.Context, statusText, statusEmoji string, statusExpiration int64) error {
-	return api.SetUserCustomStatusContextWithUser(ctx, "", statusText, statusEmoji, statusExpiration)
+	return api.SetUserCustomStatusContextWithUser(context.Background(), "", statusText, statusEmoji, statusExpiration)
 }
 
 // SetUserCustomStatusWithUser will set a custom status and emoji for the provided user.
@@ -603,15 +598,11 @@ func (api *Client) SetUserCustomStatusContextWithUser(ctx context.Context, user,
 	}
 
 	values := url.Values{
+		"user":    {user},
 		"token":   {api.token},
 		"profile": {string(profile)},
 	}
 
-	// optional field. It should not be set if empty
-	if user != "" {
-		values["user"] = []string{user}
-	}
-
 	response := &userResponseFull{}
 	if err = api.postMethod(ctx, "users.profile.set", values, response); err != nil {
 		return err
diff --git a/websocket_managed_conn.go b/websocket_managed_conn.go
index fe6802e..8607b3a 100644
--- a/websocket_managed_conn.go
+++ b/websocket_managed_conn.go
@@ -9,9 +9,6 @@ import (
 	"reflect"
 	"time"
 
-	"github.com/slack-go/slack/internal/backoff"
-	"github.com/slack-go/slack/internal/misc"
-
 	"github.com/gorilla/websocket"
 	"github.com/slack-go/slack/internal/errorsx"
 	"github.com/slack-go/slack/internal/timex"
@@ -95,7 +92,7 @@ func (rtm *RTM) connect(connectionCount int, useRTMStart bool) (*Info, *websocke
 
 	// used to provide exponential backoff wait time with jitter before trying
 	// to connect to slack again
-	boff := &backoff.Backoff{
+	boff := &backoff{
 		Max: 5 * time.Minute,
 	}
 
@@ -106,7 +103,7 @@ func (rtm *RTM) connect(connectionCount int, useRTMStart bool) (*Info, *websocke
 
 		// send connecting event
 		rtm.IncomingEvents <- RTMEvent{"connecting", &ConnectingEvent{
-			Attempt:         boff.Attempts() + 1,
+			Attempt:         boff.attempts + 1,
 			ConnectionCount: connectionCount,
 		}}
 
@@ -126,7 +123,7 @@ func (rtm *RTM) connect(connectionCount int, useRTMStart bool) (*Info, *websocke
 		}
 
 		switch actual := err.(type) {
-		case misc.StatusCodeError:
+		case statusCodeError:
 			if actual.Code == http.StatusNotFound {
 				rtm.Debugf("invalid auth when connecting with RTM: %s", err)
 				rtm.IncomingEvents <- RTMEvent{"invalid_auth", &InvalidAuthEvent{}}
@@ -141,13 +138,13 @@ func (rtm *RTM) connect(connectionCount int, useRTMStart bool) (*Info, *websocke
 		// any other errors are treated as recoverable and we try again after
 		// sending the event along the IncomingEvents channel
 		rtm.IncomingEvents <- RTMEvent{"connection_error", &ConnectionErrorEvent{
-			Attempt:  boff.Attempts(),
+			Attempt:  boff.attempts,
 			Backoff:  backoff,
 			ErrorObj: err,
 		}}
 
 		// get time we should wait before attempting to connect again
-		rtm.Debugf("reconnection %d failed: %s reconnecting in %v\n", boff.Attempts(), err, backoff)
+		rtm.Debugf("reconnection %d failed: %s reconnecting in %v\n", boff.attempts, err, backoff)
 
 		// wait for one of the following to occur,
 		// backoff duration has elapsed, killChannel is signalled, or


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index f82ae69..0000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: Test
-
-on:
-  push:
-    branches:
-      - master
-  pull_request:
-
-jobs:
-  ci:
-    runs-on: ubuntu-latest
-    name: lint
-    steps:
-      - uses: actions/checkout@v2
-      - name: golangci-lint
-        uses: golangci/golangci-lint-action@v2
-        with:
-          version: v1.32
-  test:
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        go:
-          - '1.12'
-          - '1.13'
-          - '1.14'
-          - '1.15'
-    name: test go-${{ matrix.go }}
-    steps:
-      - uses: actions/checkout@v2
-      - uses: actions/setup-go@v2
-        with:
-          go-version: ${{ matrix.go }}
-      - name: run test
-        run: go test -v -race ./...
-        env:
-          GO111MODULE: on
diff --git a/apps_test.go b/apps_test.go
index 6d5f621..a6cd2bc 100644
--- a/apps_test.go
+++ b/apps_test.go
@@ -36,22 +36,3 @@ func testListEventAuthorizationsHandler(w http.ResponseWriter, r *http.Request)
 	})
 	w.Write(response)
 }
-
-func TestUninstallApp(t *testing.T) {
-	http.HandleFunc("/apps.uninstall", testUninstallAppHandler)
-	once.Do(startServer)
-
-	api := New("test-token", OptionAPIURL("http://"+serverAddr+"/"))
-
-	err := api.UninstallApp("", "")
-
-	if err != nil {
-		t.Errorf("Failed, but should have succeeded")
-	}
-}
-
-func testUninstallAppHandler(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	response, _ := json.Marshal(SlackResponse{Ok: true})
-	w.Write(response)
-}
diff --git a/attachments_test.go b/attachments_test.go
index 4b951f1..24e2254 100644
--- a/attachments_test.go
+++ b/attachments_test.go
@@ -12,6 +12,7 @@ func TestAttachment_UnmarshalMarshalJSON_WithBlocks(t *testing.T) {
 
 	originalAttachmentJson := `{
     "id": 1,
+    "text":"",
     "blocks": [
       {
         "type": "section",
diff --git a/block_element_test.go b/block_element_test.go
index 7da816e..68c1dfd 100644
--- a/block_element_test.go
+++ b/block_element_test.go
@@ -28,21 +28,6 @@ func TestNewButtonBlockElement(t *testing.T) {
 
 }
 
-func TestWithStyleForButtonElement(t *testing.T) {
-
-	// these values are irrelevant in this test
-	btnTxt := NewTextBlockObject("plain_text", "Next 2 Results", false, false)
-	btnElement := NewButtonBlockElement("test", "click_me_123", btnTxt)
-
-	btnElement.WithStyle(StyleDefault)
-	assert.Equal(t, btnElement.Style, Style(""))
-	btnElement.WithStyle(StylePrimary)
-	assert.Equal(t, btnElement.Style, Style("primary"))
-	btnElement.WithStyle(StyleDanger)
-	assert.Equal(t, btnElement.Style, Style("danger"))
-
-}
-
 func TestNewOptionsSelectBlockElement(t *testing.T) {
 
 	testOptionText := NewTextBlockObject("plain_text", "Option One", false, false)
@@ -127,12 +112,6 @@ func TestNewDatePickerBlockElement(t *testing.T) {
 
 }
 
-func TestNewTimePickerBlockElement(t *testing.T) {
-	timepickerElement := NewTimePickerBlockElement("test")
-	assert.Equal(t, string(timepickerElement.Type), "timepicker")
-	assert.Equal(t, timepickerElement.ActionID, "test")
-}
-
 func TestNewPlainTextInputBlockElement(t *testing.T) {
 
 	plainTextInputElement := NewPlainTextInputBlockElement(nil, "test")
diff --git a/block_header_test.go b/block_header_test.go
index d8ed332..f1cfb5d 100644
--- a/block_header_test.go
+++ b/block_header_test.go
@@ -12,7 +12,7 @@ func TestNewHeaderBlock(t *testing.T) {
 
 	headerBlock := NewHeaderBlock(textInfo, HeaderBlockOptionBlockID("test_block"))
 	assert.Equal(t, string(headerBlock.Type), "header")
-	assert.Equal(t, headerBlock.BlockID, "test_block")
+	assert.Equal(t, string(headerBlock.BlockID), "test_block")
 	assert.Equal(t, headerBlock.Text.Type, "plain_text")
 	assert.Contains(t, headerBlock.Text.Text, "quite the header")
 }
diff --git a/block_object_test.go b/block_object_test.go
index ea4e045..8a86904 100644
--- a/block_object_test.go
+++ b/block_object_test.go
@@ -42,23 +42,6 @@ func TestNewConfirmationBlockObject(t *testing.T) {
 
 }
 
-func TestWithStyleForConfirmation(t *testing.T) {
-
-	// these values are irrelevant in this test
-	titleObj := NewTextBlockObject("plain_text", "testTitle", false, false)
-	textObj := NewTextBlockObject("plain_text", "testText", false, false)
-	confirmObj := NewTextBlockObject("plain_text", "testConfirm", false, false)
-	confirmation := NewConfirmationBlockObject(titleObj, textObj, confirmObj, nil)
-
-	confirmation.WithStyle(StyleDefault)
-	assert.Equal(t, confirmation.Style, Style(""))
-	confirmation.WithStyle(StylePrimary)
-	assert.Equal(t, confirmation.Style, Style("primary"))
-	confirmation.WithStyle(StyleDanger)
-	assert.Equal(t, confirmation.Style, Style("danger"))
-
-}
-
 func TestNewOptionBlockObject(t *testing.T) {
 
 	valTextObj := NewTextBlockObject("plain_text", "testText", false, false)
diff --git a/block_section_test.go b/block_section_test.go
index 6832967..3f9f452 100644
--- a/block_section_test.go
+++ b/block_section_test.go
@@ -12,7 +12,7 @@ func TestNewSectionBlock(t *testing.T) {
 
 	sectionBlock := NewSectionBlock(textInfo, nil, nil, SectionBlockOptionBlockID("test_block"))
 	assert.Equal(t, string(sectionBlock.Type), "section")
-	assert.Equal(t, sectionBlock.BlockID, "test_block")
+	assert.Equal(t, string(sectionBlock.BlockID), "test_block")
 	assert.Equal(t, len(sectionBlock.Fields), 0)
 	assert.Nil(t, sectionBlock.Accessory)
 	assert.Equal(t, sectionBlock.Text.Type, "mrkdwn")
diff --git a/bots_test.go b/bots_test.go
index ce7f668..cdcbb5e 100644
--- a/bots_test.go
+++ b/bots_test.go
@@ -41,9 +41,6 @@ func TestGetBotInfo(t *testing.T) {
 	if bot.Name != "github" {
 		t.Fatal("Incorrect Name")
 	}
-	if bot.Deleted {
-		t.Fatal("Incorrect Deleted flag")
-	}
 	if bot.AppID != "A161CLERW" {
 		t.Fatal("Incorrect App ID")
 	}
diff --git a/chat_test.go b/chat_test.go
index 40cea90..a038728 100644
--- a/chat_test.go
+++ b/chat_test.go
@@ -73,7 +73,6 @@ func TestGetPermalink(t *testing.T) {
 
 func TestPostMessage(t *testing.T) {
 	type messageTest struct {
-		endpoint string
 		opt      []MsgOption
 		expected url.Values
 	}
@@ -83,7 +82,6 @@ func TestPostMessage(t *testing.T) {
 
 	tests := map[string]messageTest{
 		"Blocks": {
-			endpoint: "/chat.postMessage",
 			opt: []MsgOption{
 				MsgOptionBlocks(blocks...),
 				MsgOptionText("text", false),
@@ -96,7 +94,6 @@ func TestPostMessage(t *testing.T) {
 			},
 		},
 		"Attachment": {
-			endpoint: "/chat.postMessage",
 			opt: []MsgOption{
 				MsgOptionAttachments(
 					Attachment{
@@ -104,59 +101,11 @@ func TestPostMessage(t *testing.T) {
 					}),
 			},
 			expected: url.Values{
-				"attachments": []string{`[{"blocks":` + blockStr + `}]`},
+				"attachments": []string{`[{"text":"","blocks":` + blockStr + `}]`},
 				"channel":     []string{"CXXX"},
 				"token":       []string{"testing-token"},
 			},
 		},
-		"Unfurl": {
-			endpoint: "/chat.unfurl",
-			opt: []MsgOption{
-				MsgOptionUnfurl("123", map[string]Attachment{"something": {Text: "attachment-test"}}),
-			},
-			expected: url.Values{
-				"channel": []string{"CXXX"},
-				"token":   []string{"testing-token"},
-				"ts":      []string{"123"},
-				"unfurls": []string{`{"something":{"text":"attachment-test","blocks":null}}`},
-			},
-		},
-		"UnfurlAuthURL": {
-			endpoint: "/chat.unfurl",
-			opt: []MsgOption{
-				MsgOptionUnfurlAuthURL("123", "https://auth-url.com"),
-			},
-			expected: url.Values{
-				"channel":       []string{"CXXX"},
-				"token":         []string{"testing-token"},
-				"ts":            []string{"123"},
-				"user_auth_url": []string{"https://auth-url.com"},
-			},
-		},
-		"UnfurlAuthRequired": {
-			endpoint: "/chat.unfurl",
-			opt: []MsgOption{
-				MsgOptionUnfurlAuthRequired("123"),
-			},
-			expected: url.Values{
-				"channel":            []string{"CXXX"},
-				"token":              []string{"testing-token"},
-				"ts":                 []string{"123"},
-				"user_auth_required": []string{"true"},
-			},
-		},
-		"UnfurlAuthMessage": {
-			endpoint: "/chat.unfurl",
-			opt: []MsgOption{
-				MsgOptionUnfurlAuthMessage("123", "Please!"),
-			},
-			expected: url.Values{
-				"channel":           []string{"CXXX"},
-				"token":             []string{"testing-token"},
-				"ts":                []string{"123"},
-				"user_auth_message": []string{"Please!"},
-			},
-		},
 	}
 
 	once.Do(startServer)
@@ -165,7 +114,7 @@ func TestPostMessage(t *testing.T) {
 	for name, test := range tests {
 		t.Run(name, func(t *testing.T) {
 			http.DefaultServeMux = new(http.ServeMux)
-			http.HandleFunc(test.endpoint, func(rw http.ResponseWriter, r *http.Request) {
+			http.HandleFunc("/chat.postMessage", func(rw http.ResponseWriter, r *http.Request) {
 				body, err := ioutil.ReadAll(r.Body)
 				if err != nil {
 					t.Errorf("unexpected error: %v", err)
diff --git a/conversation_test.go b/conversation_test.go
index 61a4e92..3f00374 100644
--- a/conversation_test.go
+++ b/conversation_test.go
@@ -555,21 +555,3 @@ func TestGetConversationHistory(t *testing.T) {
 		return
 	}
 }
-
-func markConversationHandler(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	response, _ := json.Marshal(GetConversationHistoryResponse{
-		SlackResponse: SlackResponse{Ok: true}})
-	w.Write(response)
-}
-
-func TestMarkConversation(t *testing.T) {
-	http.HandleFunc("/conversations.mark", markConversationHandler)
-	once.Do(startServer)
-	api := New("testing-token", OptionAPIURL("http://"+serverAddr+"/"))
-	err := api.MarkConversation("CXXXXXXXX", "1401383885.000061")
-	if err != nil {
-		t.Errorf("Unexpected error: %s", err)
-		return
-	}
-}
diff --git a/internal/errorsx/errrorsx_test.go b/internal/errorsx/errrorsx_test.go
deleted file mode 100644
index 32aba08..0000000
--- a/internal/errorsx/errrorsx_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package errorsx
-
-import (
-	"errors"
-	"testing"
-)
-
-func TestIs(t *testing.T) {
-	test := func(receiver String, target error, expected bool) {
-		if result := receiver.Is(target); result != expected {
-			t.Errorf(`expected "%s Is %s" should be %t , got: %t`, receiver, target, expected, result)
-		}
-	}
-
-	test(String("test error"), errors.New("test error"), true)
-	test(String("test error"), errors.New("different error"), false)
-	test(String("test error"), nil, false)
-}
diff --git a/misc_test.go b/misc_test.go
index 4dd2a63..808572b 100644
--- a/misc_test.go
+++ b/misc_test.go
@@ -8,8 +8,6 @@ import (
 	"sync"
 	"testing"
 
-	"github.com/slack-go/slack/internal/misc"
-
 	"github.com/slack-go/slack/slackutilsx"
 )
 
@@ -94,8 +92,8 @@ func TestParseResponseInvalidToken(t *testing.T) {
 func TestRetryable(t *testing.T) {
 	for _, e := range []error{
 		&RateLimitedError{},
-		misc.StatusCodeError{Code: http.StatusInternalServerError},
-		misc.StatusCodeError{Code: http.StatusTooManyRequests},
+		statusCodeError{Code: http.StatusInternalServerError},
+		statusCodeError{Code: http.StatusTooManyRequests},
 	} {
 		r, ok := e.(slackutilsx.Retryable)
 		if !ok {
diff --git a/reminders_test.go b/reminders_test.go
index 25291b5..bed7589 100644
--- a/reminders_test.go
+++ b/reminders_test.go
@@ -1,8 +1,6 @@
 package slack
 
 import (
-	"bytes"
-	"io/ioutil"
 	"net/http"
 	"reflect"
 	"testing"
@@ -10,6 +8,7 @@ import (
 
 type remindersHandler struct {
 	gotParams map[string]string
+	response  string
 }
 
 func newRemindersHandler() *remindersHandler {
@@ -158,54 +157,17 @@ func TestSlack_DeleteReminder(t *testing.T) {
 	}
 }
 
-type mockRemindersListHTTPClient struct{}
-
-func (m *mockRemindersListHTTPClient) Do(*http.Request) (*http.Response, error) {
-	responseString := `{
-		"ok": true,
-		"reminders": [
-	        {
-				"id": "Rm12345678",
-				"creator": "U18888888",
-				"user": "U18888888",
-				"text": "eat a banana",
-				"recurring": false,
-				"time": 1458678068,
-				"complete_ts": 0
-			},
-			{
-				"id": "Gm12345678",
-				"creator": "U18888888",
-				"user": "U18888888",
-				"text": "drink some water",
-				"recurring": false,
-				"time": 1458678090,
-				"complete_ts": 0
-			}
-		]
-	}`
-
-	return &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewBufferString(responseString))}, nil
-}
-
 func TestSlack_ListReminders(t *testing.T) {
-	expectedIDs := []string{"Rm12345678", "Gm12345678"}
-
+	// as the ListReminders takes only token parameter
+	// we just test if the call doesn't return an error
 	once.Do(startServer)
-	api := &Client{
-		endpoint:   "http://" + serverAddr + "/",
-		token:      "testing-token",
-		httpclient: &mockRemindersListHTTPClient{},
-	}
+	api := New("testing-token", OptionAPIURL("http://"+serverAddr+"/"))
+	var rh *remindersHandler
+	http.HandleFunc("/reminders.list", func(w http.ResponseWriter, r *http.Request) { rh.handler(w, r) })
+	rh = newRemindersHandler()
 
-	reminders, err := api.ListReminders()
+	_, err := api.ListReminders()
 	if err != nil {
 		t.Fatalf("Unexpected error: %s", err)
 	}
-
-	for i := range reminders {
-		if reminders[i].ID != expectedIDs[i] {
-			t.Fatalf("List Reminders data wasn't correctly populated: wanted %v, got %v", expectedIDs[i], reminders[i].ID)
-		}
-	}
 }
diff --git a/slacktest/handlers.go b/slacktest/handlers.go
index 85eec58..ebf10c0 100644
--- a/slacktest/handlers.go
+++ b/slacktest/handlers.go
@@ -62,7 +62,7 @@ func (sts *Server) conversationsInfoHandler(w http.ResponseWriter, r *http.Reque
 	ch := values.Get("channel")
 
 	response := GroupConversationResponse{
-		Ok: true,
+		Ok:      true,
 		Channel: slack.GroupConversation{
 			Conversation: slack.Conversation{
 				ID: ch,
@@ -72,8 +72,8 @@ func (sts *Server) conversationsInfoHandler(w http.ResponseWriter, r *http.Reque
 		},
 	}
 	encoded, err := json.Marshal(&response)
-	if err != nil {
-		msg := fmt.Sprintf("Unable to encode response: %s", err.Error())
+	if vErr != nil {
+		msg := fmt.Sprintf("Unable to encode response: %s", vErr.Error())
 		log.Printf(msg)
 		http.Error(w, msg, http.StatusInternalServerError)
 		return
@@ -82,7 +82,7 @@ func (sts *Server) conversationsInfoHandler(w http.ResponseWriter, r *http.Reque
 	_, _ = w.Write(encoded)
 }
 
-// handle channels.list and conversations.list
+// handle channels.list
 func listChannelsHandler(w http.ResponseWriter, _ *http.Request) {
 	_, _ = w.Write([]byte(defaultChannelsListJSON))
 }
diff --git a/slacktest/server.go b/slacktest/server.go
index aae2499..8187ac6 100644
--- a/slacktest/server.go
+++ b/slacktest/server.go
@@ -51,7 +51,6 @@ func NewTestServer(custom ...binder) *Server {
 	s.Handle("/rtm.connect", RTMConnectHandler)
 	s.Handle("/chat.postMessage", s.postMessageHandler)
 	s.Handle("/channels.list", listChannelsHandler)
-	s.Handle("/conversations.list", listChannelsHandler)
 	s.Handle("/conversations.create", createConversationHandler)
 	s.Handle("/conversations.setTopic", setConversationTopicHandler)
 	s.Handle("/conversations.setPurpose", setConversationPurposeHandler)
diff --git a/slackutilsx/slackutilsx_test.go b/slackutilsx/slackutilsx_test.go
index dcebb4a..296f7ae 100644
--- a/slackutilsx/slackutilsx_test.go
+++ b/slackutilsx/slackutilsx_test.go
@@ -17,14 +17,3 @@ func TestDetectChannelType(t *testing.T) {
 	test("", CTypeUnknown)
 	test("X11111111", CTypeUnknown)
 }
-
-func TestEscapeMessage(t *testing.T) {
-	test := func(message string, expected string) {
-		if computed := EscapeMessage(message); computed != expected {
-			t.Errorf("expected message %s to be converted to %s, got: %s", message, expected, computed)
-		}
-	}
-	test("A & B", "A &amp; B")
-	test("A < B", "A &lt; B")
-	test("A > B", "A &gt; B")
-}
diff --git a/socketmode/socketmode_test.go b/socketmode/socketmode_test.go
deleted file mode 100644
index b9ce776..0000000
--- a/socketmode/socketmode_test.go
+++ /dev/null
@@ -1,293 +0,0 @@
-package socketmode
-
-import (
-	"bytes"
-	"encoding/json"
-	"reflect"
-	"testing"
-
-	"github.com/slack-go/slack/slackevents"
-
-	"github.com/pkg/errors"
-)
-
-const (
-	EventDisconnect = `{
-  "type": "disconnect",
-  "reason": "warning",
-  "debug_info": {
-    "host": "applink-7fc4fdbb64-4x5xq"
-  }
-}
-`
-	EventHello = `{
-  "type": "hello",
-  "num_connections": 4,
-  "debug_info": {
-    "host": "applink-7fc4fdbb64-4x5xq",
-    "build_number": 10,
-    "approximate_connection_time": 18060
-  },
-  "connection_info": {
-    "app_id": "A01K58AR4RF"
-  }
-}
-`
-
-	EventAppMention = `{
-  "envelope_id": "c67a03d0-4094-4744-90ca-d286e00a3ab1",
-  "payload": {
-    "token": "redacted",
-    "team_id": "redacted",
-    "api_app_id": "redacted",
-    "event": {
-      "client_msg_id": "c714568f-67df-42d7-a343-0a8e4d9c6030",
-      "type": "app_mention",
-      "text": "\u003c@U01JKSB8T7Y\u003e test",
-      "user": "redacted",
-      "ts": "1610927831.000200",
-      "team": "redacted",
-      "blocks": [
-        {
-          "type": "rich_text",
-          "block_id": "2Le",
-          "elements": [
-            {
-              "type": "rich_text_section",
-              "elements": [
-                {
-                  "type": "user",
-                  "user_id": "redacted"
-                },
-                {
-                  "type": "text",
-                  "text": " test39"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "channel": "redacted",
-      "event_ts": "1610927831.000200"
-    },
-    "type": "event_callback",
-    "event_id": "Ev01JZ2T7S3U",
-    "event_time": 1610927831,
-    "authorizations": [
-      {
-        "enterprise_id": null,
-        "team_id": "redacted",
-        "user_id": "redacted",
-        "is_bot": true,
-        "is_enterprise_install": false
-      }
-    ],
-    "is_ext_shared_channel": false,
-    "event_context": "1-app_mention-redacted-redacted"
-  },
-  "type": "events_api",
-  "accepts_response_payload": false,
-  "retry_attempt": 0,
-  "retry_reason": ""
-}`
-)
-
-func TestEventParsing(t *testing.T) {
-	testParsing(t,
-		EventHello,
-		&Event{
-			Type: EventTypeHello,
-			Request: &Request{
-				Type:           RequestTypeHello,
-				NumConnections: 4,
-				DebugInfo: DebugInfo{
-					Host:                      "applink-7fc4fdbb64-4x5xq",
-					BuildNumber:               10,
-					ApproximateConnectionTime: 18060,
-				},
-				ConnectionInfo: ConnectionInfo{
-					AppID: "A01K58AR4RF",
-				},
-			},
-		})
-
-	testParsing(t,
-		EventDisconnect,
-		&Event{
-			Type: EventTypeDisconnect,
-			Request: &Request{
-				Type:   RequestTypeDisconnect,
-				Reason: "warning",
-				DebugInfo: DebugInfo{
-					Host: "applink-7fc4fdbb64-4x5xq",
-				},
-			},
-		})
-
-	rawAppMention := json.RawMessage(`{
-      "client_msg_id": "c714568f-67df-42d7-a343-0a8e4d9c6030",
-      "type": "app_mention",
-      "text": "\u003c@U01JKSB8T7Y\u003e test",
-      "user": "redacted",
-      "ts": "1610927831.000200",
-      "team": "redacted",
-      "blocks": [
-        {
-          "type": "rich_text",
-          "block_id": "2Le",
-          "elements": [
-            {
-              "type": "rich_text_section",
-              "elements": [
-                {
-                  "type": "user",
-                  "user_id": "redacted"
-                },
-                {
-                  "type": "text",
-                  "text": " test39"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "channel": "redacted",
-      "event_ts": "1610927831.000200"
-    }`)
-
-	rawAppMentionReqPayload := json.RawMessage(`{
-    "token": "redacted",
-    "team_id": "redacted",
-    "api_app_id": "redacted",
-    "event": {
-      "client_msg_id": "c714568f-67df-42d7-a343-0a8e4d9c6030",
-      "type": "app_mention",
-      "text": "\u003c@U01JKSB8T7Y\u003e test",
-      "user": "redacted",
-      "ts": "1610927831.000200",
-      "team": "redacted",
-      "blocks": [
-        {
-          "type": "rich_text",
-          "block_id": "2Le",
-          "elements": [
-            {
-              "type": "rich_text_section",
-              "elements": [
-                {
-                  "type": "user",
-                  "user_id": "redacted"
-                },
-                {
-                  "type": "text",
-                  "text": " test39"
-                }
-              ]
-            }
-          ]
-        }
-      ],
-      "channel": "redacted",
-      "event_ts": "1610927831.000200"
-    },
-    "type": "event_callback",
-    "event_id": "Ev01JZ2T7S3U",
-    "event_time": 1610927831,
-    "authorizations": [
-      {
-        "enterprise_id": null,
-        "team_id": "redacted",
-        "user_id": "redacted",
-        "is_bot": true,
-        "is_enterprise_install": false
-      }
-    ],
-    "is_ext_shared_channel": false,
-    "event_context": "1-app_mention-redacted-redacted"
-  }`)
-	testParsing(t,
-		EventAppMention,
-		&Event{
-			Type: EventTypeEventsAPI,
-			Data: slackevents.EventsAPIEvent{
-				Token:    "redacted",
-				TeamID:   "redacted",
-				Type:     "event_callback",
-				APIAppID: "redacted",
-				Data: &slackevents.EventsAPICallbackEvent{
-					Type:         "event_callback",
-					Token:        "redacted",
-					TeamID:       "redacted",
-					APIAppID:     "redacted",
-					InnerEvent:   &rawAppMention,
-					AuthedUsers:  nil,
-					AuthedTeams:  nil,
-					EventID:      "Ev01JZ2T7S3U",
-					EventTime:    1610927831,
-					EventContext: "1-app_mention-redacted-redacted",
-				},
-				InnerEvent: slackevents.EventsAPIInnerEvent{
-					Type: slackevents.AppMention,
-					Data: &slackevents.AppMentionEvent{
-						Type:            slackevents.AppMention,
-						User:            "redacted",
-						Text:            "<@U01JKSB8T7Y> test",
-						TimeStamp:       "1610927831.000200",
-						ThreadTimeStamp: "",
-						Channel:         "redacted",
-						EventTimeStamp:  json.Number("1610927831.000200"),
-					},
-				},
-			},
-			Request: &Request{
-				Type:                   RequestTypeEventsAPI,
-				EnvelopeID:             "c67a03d0-4094-4744-90ca-d286e00a3ab1",
-				Payload:                rawAppMentionReqPayload,
-				AcceptsResponsePayload: false,
-				RetryAttempt:           0,
-				RetryReason:            "",
-			},
-		})
-}
-
-func testParsing(t *testing.T, raw string, want interface{}) {
-	t.Helper()
-
-	got, err := parse(raw)
-	if err != nil {
-		t.Fatalf("unexpected error parsing event %q: %v", raw, err)
-	}
-
-	if !reflect.DeepEqual(want, got) {
-		t.Fatalf("unexpected parse result: want %s, got %s", dump(t, want), dump(t, got))
-	}
-}
-
-func dump(t *testing.T, data interface{}) string {
-	t.Helper()
-
-	var buf bytes.Buffer
-
-	e := json.NewEncoder(&buf)
-	e.SetIndent("", "  ")
-
-	if err := e.Encode(data); err != nil {
-		t.Fatalf("encoding data to json: %v", err)
-	}
-
-	return buf.String()
-}
-
-func parse(raw string) (*Event, error) {
-	c := &Client{}
-
-	evt, err := c.parseEvent(json.RawMessage([]byte(raw)))
-
-	if evt == nil {
-		return nil, errors.New("failed handling raw event: event was empty")
-	}
-
-	return evt, err
-}
diff --git a/users_test.go b/users_test.go
index a492089..34502a3 100644
--- a/users_test.go
+++ b/users_test.go
@@ -46,7 +46,6 @@ func getTestUserProfile() UserProfile {
 		Image48:               "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2016-10-18/92962080834_ef14c1469fc0741caea1_48.jpg",
 		Image72:               "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2016-10-18/92962080834_ef14c1469fc0741caea1_72.jpg",
 		Image192:              "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2016-10-18/92962080834_ef14c1469fc0741caea1_192.jpg",
-		Image512:              "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2016-10-18/92962080834_ef14c1469fc0741caea1_512.jpg",
 		Fields:                getTestUserProfileCustomFields(),
 	}
 }
@@ -182,11 +181,13 @@ func newProfileHandler(up *UserProfile) (setter func(http.ResponseWriter, *http.
 
 		values := r.Form
 
-		if v, ok := values["user"]; ok {
-			if len(v) == 0 || v[0] == "" {
-				httpTestErrReply(w, true, `POST data must not include an empty in a "user" field`)
-				return
-			}
+		if len(values["user"]) == 0 {
+			httpTestErrReply(w, true, `POST data must include a "user" field`)
+			return
+		}
+		if up.RealName != "" && values["user"][0] != up.RealName {
+			httpTestErrReply(w, true, fmt.Sprintf(`POST data field "user" expected to be %q but got %q`, up.RealName, values["user"][0]))
+			return
 		}
 
 		if len(values["profile"]) == 0 {
diff --git a/websocket_managed_conn_test.go b/websocket_managed_conn_test.go
index bb4e3e4..e8bbaf2 100644
--- a/websocket_managed_conn_test.go
+++ b/websocket_managed_conn_test.go
@@ -101,7 +101,7 @@ func TestRTMGoodbye(t *testing.T) {
 
 	select {
 	case <-done:
-		// magic numbers from empirical testing.
+		// magic numbers from emperical testing.
 		assert.Equal(t, connected <= 7, true)
 		assert.Equal(t, disconnected <= 12, true)
 	case <-time.After(5 * time.Second):
@@ -158,7 +158,7 @@ func TestRTMDeadConnection(t *testing.T) {
 
 	select {
 	case <-done:
-		// magic numbers from empirical testing.
+		// magic numbers from emperical testing.
 		assert.Equal(t, connected <= 7, true)
 		assert.Equal(t, disconnected <= 7, true)
 	case <-time.After(5 * time.Second):